blob: 94035b41067bf889a7193b40f223336cf743f53b [file] [log] [blame]
/*---------------------------------------------------------------------------*
* SessionTypeImpl.c *
* *
* Copyright 2007, 2008 Nuance Communciations, Inc. *
* *
* Licensed under the Apache License, Version 2.0 (the 'License'); *
* you may not use this file except in compliance with the License. *
* *
* You may obtain a copy of the License at *
* http://www.apache.org/licenses/LICENSE-2.0 *
* *
* Unless required by applicable law or agreed to in writing, software *
* distributed under the License is distributed on an 'AS IS' BASIS, *
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
* See the License for the specific language governing permissions and *
* limitations under the License. *
* *
*---------------------------------------------------------------------------*/
#include "ESR_SessionType.h"
#include "ESR_SessionTypeImpl.h"
#include "HashMap.h"
#include "IntArrayList.h"
#include "LCHAR.h"
#include "lstring.h"
#include "passert.h"
#include "pendian.h"
#include "PFile.h"
#include "PFileSystem.h"
#include "plog.h"
#include "pmemory.h"
#include "pstdio.h"
#include "string.h"
#include "ESR_SessionTypeListener.h"
#define MTAG NULL
ESR_ReturnCode ESR_SessionTypeCreate(ESR_SessionType** self)
{
ESR_SessionType* Interface;
ESR_SessionTypeData* data;
ESR_ReturnCode rc;
if (self == NULL)
{
PLogError(L("ESR_OUT_OF_MEMORY"));
return ESR_OUT_OF_MEMORY;
}
Interface = NEW(ESR_SessionType, MTAG);
if (Interface == NULL)
{
PLogError(L("ESR_OUT_OF_MEMORY"));
return ESR_OUT_OF_MEMORY;
}
data = NEW(ESR_SessionTypeData, MTAG);
if (data == NULL)
{
rc = ESR_OUT_OF_MEMORY;
goto CLEANUP;
}
Interface->addListener = &ESR_SessionTypeAddListenerImpl;
Interface->contains = &ESR_SessionTypeContainsImpl;
Interface->convertToBool = &ESR_SessionTypeConvertToBoolImpl;
Interface->convertToFloat = &ESR_SessionTypeConvertToFloatImpl;
Interface->convertToInt = &ESR_SessionTypeConvertToIntImpl;
Interface->convertToUint16_t = &ESR_SessionTypeConvertToUint16_tImpl;
Interface->convertToSize_t = &ESR_SessionTypeConvertToSize_tImpl;
Interface->destroy = &ESR_SessionTypeDestroyImpl;
Interface->getBool = &ESR_SessionTypeGetBoolImpl;
Interface->getFloat = &ESR_SessionTypeGetFloatImpl;
Interface->getInt = &ESR_SessionTypeGetIntImpl;
Interface->getUint16_t = &ESR_SessionTypeGetUint16_tImpl;
Interface->getKeyAtIndex = &ESR_SessionTypeGetKeyAtIndexImpl;
Interface->getLCHAR = &ESR_SessionTypeGetLCHARImpl;
Interface->getProperty = &ESR_SessionTypeGetPropertyImpl;
Interface->getPropertyType = &ESR_SessionTypeGetPropertyTypeImpl;
Interface->getSize = &ESR_SessionTypeGetSizeImpl;
Interface->getSize_t = &ESR_SessionTypeGetSize_tImpl;
Interface->importCommandLine = &ESR_SessionTypeImportCommandLineImpl;
Interface->importParFile = &ESR_SessionTypeImportParFileImpl;
Interface->removeProperty = &ESR_SessionTypeRemovePropertyImpl;
Interface->removeAndFreeProperty = &ESR_SessionTypeRemoveAndFreePropertyImpl;
Interface->setBool = &ESR_SessionTypeSetBoolImpl;
Interface->setBoolIfEmpty = &ESR_SessionTypeSetBoolIfEmptyImpl;
Interface->setFloat = &ESR_SessionTypeSetFloatImpl;
Interface->setFloatIfEmpty = &ESR_SessionTypeSetFloatIfEmptyImpl;
Interface->setInt = &ESR_SessionTypeSetIntImpl;
Interface->setIntIfEmpty = &ESR_SessionTypeSetIntIfEmptyImpl;
Interface->setUint16_t = &ESR_SessionTypeSetUint16_tImpl;
Interface->setUint16_tIfEmpty = &ESR_SessionTypeSetUint16_tIfEmptyImpl;
Interface->setLCHAR = &ESR_SessionTypeSetLCHARImpl;
Interface->setLCHARIfEmpty = &ESR_SessionTypeSetLCHARIfEmptyImpl;
Interface->setProperty = &ESR_SessionTypeSetPropertyImpl;
Interface->setSize_t = &ESR_SessionTypeSetSize_tImpl;
Interface->setSize_tIfEmpty = &ESR_SessionTypeSetSize_tIfEmptyImpl;
Interface->removeListener = &ESR_SessionTypeRemoveListenerImpl;
Interface->data = data;
data->value = NULL;
data->listeners = NULL;
CHK(rc, HashMapCreate(&data->value));
CHK(rc, ArrayListCreate(&data->listeners));
*self = Interface;
return ESR_SUCCESS;
CLEANUP:
Interface->destroy(Interface);
return rc;
}
/*
* Because there are no functions to set and get int size_t parameters and because most if not
* all int parameters should be size_t anyway, I am adding code to allow size_t and int parameters
* to be considered equal. Besides, this check is kind of overkill anyway. SteveR
*/
ESR_ReturnCode ESR_SessionTypeGetPropertyImpl(ESR_SessionType* self,
const LCHAR* name, void** value,
VariableTypes type)
{
ESR_SessionTypeData* data = self->data;
ESR_SessionPair* pair;
ESR_ReturnCode rc;
CHK(rc, HashMapGet(data->value, name, (void **)&pair));
if ( ( pair->type != type) && ( ( ( pair->type != TYPES_INT ) && ( type != TYPES_SIZE_T ) ) ||
( ( type != TYPES_INT ) && ( pair->type != TYPES_SIZE_T ) ) ) )
{
PLogError(L("ESR_INVALID_RESULT_TYPE: [got=%d, expected=%d]"), type, pair->type);
return ESR_INVALID_RESULT_TYPE;
}
*value = pair->value;
return ESR_SUCCESS;
CLEANUP:
return rc;
}
ESR_ReturnCode ESR_SessionTypeGetIntImpl(ESR_SessionType* self,
const LCHAR* name, int* value)
{
ESR_ReturnCode rc;
ESR_SessionTypeData* data;
ESR_SessionPair* pair;
data = self->data;
CHK(rc, HashMapGet(data->value, name, (void **)&pair));
if ( ( pair->type != TYPES_INT ) && ( pair->type != TYPES_SIZE_T ) )
{
PLogError(L("ESR_INVALID_RESULT_TYPE: [got=%d, expected=%d]"), TYPES_INT, pair->type);
return ESR_INVALID_RESULT_TYPE;
}
*value = *((int*) pair->value);
return ESR_SUCCESS;
CLEANUP:
return rc;
}
ESR_ReturnCode ESR_SessionTypeGetUint16_tImpl(ESR_SessionType* self,
const LCHAR* name, asr_uint16_t* value)
{
ESR_ReturnCode rc;
ESR_SessionTypeData* data;
ESR_SessionPair* pair;
data = self->data;
CHK(rc, HashMapGet(data->value, name, (void **)&pair));
if (pair->type != TYPES_UINT16_T)
{
PLogError(L("ESR_INVALID_RESULT_TYPE: [got=%d, expected=%d]"), TYPES_UINT16_T, pair->type);
return ESR_INVALID_RESULT_TYPE;
}
*value = *((asr_uint16_t*) pair->value);
return ESR_SUCCESS;
CLEANUP:
return rc;
}
ESR_ReturnCode ESR_SessionTypeGetSize_tImpl(ESR_SessionType* self,
const LCHAR* name,
size_t* value)
{
ESR_ReturnCode rc;
ESR_SessionTypeData* data;
ESR_SessionPair* pair;
data = self->data;
CHKLOG(rc, HashMapGet(data->value, name, (void **)&pair));
if ( ( pair->type != TYPES_INT ) && ( pair->type != TYPES_SIZE_T ) )
{
PLogError(L("ESR_INVALID_RESULT_TYPE: [got=%d, expected=%d]"), TYPES_SIZE_T, pair->type);
return ESR_INVALID_RESULT_TYPE;
}
*value = *((size_t*) pair->value);
return ESR_SUCCESS;
CLEANUP:
return rc;
}
ESR_ReturnCode ESR_SessionTypeGetFloatImpl(ESR_SessionType* self,
const LCHAR* name, float* value)
{
ESR_ReturnCode rc;
ESR_SessionTypeData* data;
ESR_SessionPair* pair;
data = self->data;
CHK(rc, HashMapGet(data->value, name, (void **)&pair));
if (pair->type != TYPES_FLOAT)
{
PLogError(L("ESR_INVALID_RESULT_TYPE: [got=%d, expected=%d]"), TYPES_FLOAT, pair->type);
return ESR_INVALID_RESULT_TYPE;
}
*value = *((float*) pair->value);
return ESR_SUCCESS;
CLEANUP:
return rc;
}
ESR_ReturnCode ESR_SessionTypeGetBoolImpl(ESR_SessionType* self,
const LCHAR* name, ESR_BOOL* value)
{
ESR_ReturnCode rc;
ESR_SessionTypeData* data;
ESR_SessionPair* pair;
data = self->data;
CHK(rc, HashMapGet(data->value, name, (void **)&pair));
if (pair->type != TYPES_BOOL)
{
PLogError(L("ESR_INVALID_RESULT_TYPE: [got=%d, expected=%d]"), TYPES_BOOL, pair->type);
return ESR_INVALID_RESULT_TYPE;
}
*value = *((ESR_BOOL*) pair->value);
return ESR_SUCCESS;
CLEANUP:
return rc;
}
ESR_ReturnCode ESR_SessionTypeGetLCHARImpl(ESR_SessionType* self,
const LCHAR* name,
LCHAR* value, size_t* len)
{
LCHAR* lValue;
ESR_ReturnCode rc;
ESR_SessionTypeData* data;
ESR_SessionPair* pair;
if (name == NULL || value == NULL || len == NULL)
return ESR_INVALID_ARGUMENT;
data = self->data;
CHK(rc, HashMapGet(data->value, name, (void **)&pair));
if (pair->type != TYPES_PLCHAR)
{
PLogError(L("ESR_INVALID_RESULT_TYPE: [got=%d, expected=%d]"), TYPES_PLCHAR, pair->type);
return ESR_INVALID_RESULT_TYPE;
}
lValue = (LCHAR*) pair->value;
if (LSTRLEN(pair->value) + 1 > *len)
{
*len = LSTRLEN(lValue) + 1;
return ESR_BUFFER_OVERFLOW;
}
LSTRCPY(value, lValue);
return ESR_SUCCESS;
CLEANUP:
return rc;
}
ESR_ReturnCode ESR_SessionTypeContainsImpl(ESR_SessionType* self,
const LCHAR* name, ESR_BOOL* exists)
{
ESR_SessionTypeData* data = self->data;
return HashMapContainsKey(data->value, name, exists);
}
static ESR_ReturnCode firePropertyChanged(ESR_SessionType* self, const LCHAR* name,
const void* oldValue, const void* newValue,
enum VariableTypes_t type)
{
ESR_SessionTypeData* data = self->data;
ArrayList* list = data->listeners;
size_t size, i;
ESR_SessionTypeListenerPair* listener;
ESR_ReturnCode rc;
CHKLOG(rc, list->getSize(list, &size));
for (i = 0; i < size; ++i)
{
CHKLOG(rc, list->get(list, i, (void **)&listener));
CHKLOG(rc, listener->listener->propertyChanged(listener->listener, name, oldValue, newValue, type, listener->data));
}
return ESR_SUCCESS;
CLEANUP:
return rc;
}
ESR_ReturnCode ESR_SessionTypeSetPropertyImpl(ESR_SessionType* self,
const LCHAR* name, void* value,
VariableTypes type)
{
ESR_SessionTypeData* data = self->data;
ESR_SessionPair* pair = NULL;
ESR_BOOL exists;
ESR_ReturnCode rc;
CHKLOG(rc, HashMapContainsKey(data->value, name, &exists));
if ( exists )
{
/* We allow change of parameters through the recognizer and we rely on the recognizer to do
* all of the needed validation. SteveR
*/
/* Deleting the old entry seems stupid, but it's the only way to prevent a memory leak,
* since the old data is not returned when you add the new data. SteveR
*/
CHKLOG ( rc, ESR_SessionTypeRemoveAndFreePropertyImpl ( self, name ) );
}
pair = NEW(ESR_SessionPair, MTAG);
if (pair == NULL)
{
PLogError(L("ESR_OUT_OF_MEMORY"));
return ESR_OUT_OF_MEMORY;
}
pair->value = value;
pair->type = type;
CHKLOG(rc, firePropertyChanged(self, name, NULL, value, type));
CHKLOG(rc, HashMapPut(data->value, name, pair));
return ESR_SUCCESS;
CLEANUP:
/* The cleanup potentially leaks memory which could be cleard up with FREE ( pair->value );
* but you can't guarantee that the value was allocated. A leak is better than a crash. SteveR
*/
FREE(pair);
return rc;
}
ESR_ReturnCode ESR_SessionTypeSetIntImpl(ESR_SessionType* self,
const LCHAR* name, int value)
{
ESR_SessionTypeData* data;
int* clone;
data = self->data;
clone = MALLOC(sizeof(int), MTAG);
if (clone == NULL)
{
PLogError(L("ESR_OUT_OF_MEMORY"));
return ESR_OUT_OF_MEMORY;
}
*clone = value;
return self->setProperty(self, name, clone, TYPES_INT);
}
ESR_ReturnCode ESR_SessionTypeSetUint16_tImpl(ESR_SessionType* self,
const LCHAR* name, asr_uint16_t value)
{
ESR_SessionTypeData* data;
asr_uint16_t* clone;
data = self->data;
clone = MALLOC(sizeof(asr_uint16_t), MTAG);
if (clone == NULL)
{
PLogError(L("ESR_OUT_OF_MEMORY"));
return ESR_OUT_OF_MEMORY;
}
*clone = value;
return self->setProperty(self, name, clone, TYPES_UINT16_T);
}
ESR_ReturnCode ESR_SessionTypeSetSize_tImpl(ESR_SessionType* self,
const LCHAR* name, size_t value)
{
ESR_SessionTypeData* data;
int* clone;
data = self->data;
clone = MALLOC(sizeof(size_t), MTAG);
if (clone == NULL)
{
PLogError(L("ESR_OUT_OF_MEMORY"));
return ESR_OUT_OF_MEMORY;
}
*clone = value;
return self->setProperty(self, name, clone, TYPES_SIZE_T);
}
ESR_ReturnCode ESR_SessionTypeSetFloatImpl(ESR_SessionType* self,
const LCHAR* name, float value)
{
ESR_SessionTypeData* data;
float* clone;
data = self->data;
clone = MALLOC(sizeof(float), MTAG);
if (clone == NULL)
{
PLogError(L("ESR_OUT_OF_MEMORY"));
return ESR_OUT_OF_MEMORY;
}
*clone = value;
return self->setProperty(self, name, clone, TYPES_FLOAT);
}
ESR_ReturnCode ESR_SessionTypeSetBoolImpl(ESR_SessionType* self,
const LCHAR* name, ESR_BOOL value)
{
ESR_SessionTypeData* data;
ESR_BOOL* clone;
data = self->data;
clone = MALLOC(sizeof(ESR_BOOL), MTAG);
if (clone == NULL)
{
PLogError(L("ESR_OUT_OF_MEMORY"));
return ESR_OUT_OF_MEMORY;
}
*clone = value;
return self->setProperty(self, name, clone, TYPES_BOOL);
}
ESR_ReturnCode ESR_SessionTypeSetLCHARImpl(ESR_SessionType* self,
const LCHAR* name, LCHAR* value)
{
ESR_SessionTypeData* data;
LCHAR* clone;
data = self->data;
clone = MALLOC(sizeof(LCHAR) * (LSTRLEN(value) + 1), MTAG);
if (clone == NULL)
{
PLogError(L("ESR_OUT_OF_MEMORY"));
return ESR_OUT_OF_MEMORY;
}
LSTRCPY(clone, value);
return self->setProperty(self, name, clone, TYPES_PLCHAR);
}
ESR_ReturnCode ESR_SessionTypeSetIntIfEmptyImpl(ESR_SessionType* self,
const LCHAR* name, int value)
{
ESR_BOOL exists;
ESR_ReturnCode rc;
CHK(rc, self->contains(self, name, &exists));
if (exists)
return ESR_SUCCESS;
return self->setInt(self, name, value);
CLEANUP:
return rc;
}
ESR_ReturnCode ESR_SessionTypeSetUint16_tIfEmptyImpl(ESR_SessionType* self,
const LCHAR* name, asr_uint16_t value)
{
ESR_BOOL exists;
ESR_ReturnCode rc;
CHK(rc, self->contains(self, name, &exists));
if (exists)
return ESR_SUCCESS;
return self->setInt(self, name, value);
CLEANUP:
return rc;
}
ESR_ReturnCode ESR_SessionTypeSetSize_tIfEmptyImpl(ESR_SessionType* self,
const LCHAR* name, size_t value)
{
ESR_BOOL exists;
ESR_ReturnCode rc;
CHK(rc, self->contains(self, name, &exists));
if (exists)
return ESR_SUCCESS;
return self->setSize_t(self, name, value);
CLEANUP:
return rc;
}
ESR_ReturnCode ESR_SessionTypeSetFloatIfEmptyImpl(ESR_SessionType* self,
const LCHAR* name, float value)
{
ESR_BOOL exists;
ESR_ReturnCode rc;
CHK(rc, self->contains(self, name, &exists));
if (exists)
return ESR_SUCCESS;
return self->setFloat(self, name, value);
CLEANUP:
return rc;
}
ESR_ReturnCode ESR_SessionTypeSetBoolIfEmptyImpl(ESR_SessionType* self,
const LCHAR* name, ESR_BOOL value)
{
ESR_BOOL exists;
ESR_ReturnCode rc;
CHK(rc, self->contains(self, name, &exists));
if (exists)
return ESR_SUCCESS;
return self->setBool(self, name, value);
CLEANUP:
return rc;
}
ESR_ReturnCode ESR_SessionTypeSetLCHARIfEmptyImpl(ESR_SessionType* self,
const LCHAR* name, LCHAR* value)
{
ESR_BOOL exists;
ESR_ReturnCode rc;
CHK(rc, self->contains(self, name, &exists));
if (exists)
return ESR_SUCCESS;
return self->setLCHAR(self, name, value);
CLEANUP:
return rc;
}
ESR_ReturnCode ESR_SessionTypeRemovePropertyImpl(ESR_SessionType* self,
const LCHAR* name)
{
ESR_ReturnCode rc;
ESR_SessionTypeData* data = self->data;
ESR_SessionPair* pair;
CHK(rc, HashMapGet(data->value, name, (void **)&pair));
CHKLOG(rc, firePropertyChanged(self, name, pair->value, NULL, pair->type));
CHK(rc, HashMapRemove(data->value, name));
FREE(pair);
return ESR_SUCCESS;
CLEANUP:
return rc;
}
ESR_ReturnCode ESR_SessionTypeRemoveAndFreePropertyImpl(ESR_SessionType* self,
const LCHAR* name)
{
ESR_ReturnCode rc;
ESR_SessionTypeData* data = self->data;
ESR_SessionPair* pair;
ESR_SessionPair temp;
IntArrayList* intList;
CHK(rc, data->value->get(data->value, name, (void **)&pair));
temp = *pair;
CHK(rc, self->removeProperty(self, name));
if (temp.value)
{
if (temp.type == TYPES_INTARRAYLIST)
{
intList = temp.value;
intList->destroy(intList);
}
else
FREE(temp.value);
}
return ESR_SUCCESS;
CLEANUP:
return rc;
}
ESR_ReturnCode ESR_SessionTypeImportCommandLineImpl(ESR_SessionType* self,
int argc, LCHAR* argv[])
{
char* key = NULL;
char* value = NULL;
VariableTypes type;
ESR_ReturnCode rc;
while (--argc > 0 && **++argv)
{
if (**argv != '-')
{
/* got value */
if (key == NULL)
{
/* but we don't have any key to associate it with */
pfprintf(PSTDERR, "Options must be prefixed by '-'%s\n", *argv);
}
else
{
rc = self->getPropertyType(self, key, &type);
if (rc == ESR_SUCCESS)
{
CHKLOG(rc, self->getProperty(self, key, (void **)&value, type));
CHKLOG(rc, self->removeProperty(self, key));
FREE(value);
value = NULL;
}
else if (rc != ESR_NO_MATCH_ERROR)
{
PLogError(ESR_rc2str(rc));
goto CLEANUP;
}
value = MALLOC(sizeof(LCHAR) * (strlen(*argv) + 1), MTAG);
if (value == NULL)
{
rc = ESR_OUT_OF_MEMORY;
PLogError(L("ESR_OUT_OF_MEMORY"));
goto CLEANUP;
}
LSTRCPY(value, *argv);
CHKLOG(rc, self->setProperty(self, key, value, TYPES_PLCHAR));
FREE(key);
key = NULL;
value = NULL;
}
}
else
{
/* got key */
if (key != NULL)
{
/* But we already have a key without a value, so set the old key's value to "" */
rc = self->getPropertyType(self, key, &type);
if (rc == ESR_SUCCESS)
{
CHKLOG(rc, self->getProperty(self, key, (void **)&value, type));
CHKLOG(rc, self->removeProperty(self, key));
FREE(value);
value = NULL;
}
else if (rc != ESR_NO_MATCH_ERROR)
{
PLogError(ESR_rc2str(rc));
goto CLEANUP;
}
value = MALLOC(sizeof(LCHAR) + 1, MTAG);
strcpy(value, "");
CHKLOG(rc, self->setProperty(self, key, value, TYPES_PLCHAR));
FREE(key);
value = NULL;
}
key = MALLOC(sizeof(LCHAR) * (LSTRLEN("cmdline.") + LSTRLEN(*argv) + 1), MTAG);
if (key == NULL)
{
rc = ESR_OUT_OF_MEMORY;
PLogError(L("ESR_OUT_OF_MEMORY"));
goto CLEANUP;
}
LSTRCPY(key, "cmdline.");
LSTRCAT(key, *argv + 1);
}
}
return ESR_SUCCESS;
CLEANUP:
if (key != NULL)
FREE(key);
if (value != NULL)
FREE(value);
return rc;
}
ESR_ReturnCode ESR_SessionTypeGetSizeImpl(ESR_SessionType* self, size_t* size)
{
ESR_SessionTypeData* data = self->data;
ESR_ReturnCode rc;
CHK(rc, HashMapGetSize(data->value, size));
return ESR_SUCCESS;
CLEANUP:
return rc;
}
ESR_ReturnCode ESR_SessionTypeGetKeyAtIndexImpl(ESR_SessionType* self,
size_t index, LCHAR** key)
{
ESR_SessionTypeData* data = self->data;
ESR_ReturnCode rc;
CHK(rc, HashMapGetKeyAtIndex(data->value, index, key));
return ESR_SUCCESS;
CLEANUP:
return rc;
}
ESR_ReturnCode ESR_SessionTypeConvertToIntImpl(ESR_SessionType* self,
const LCHAR* key)
{
LCHAR* value;
int *newValue = NULL;
ESR_ReturnCode rc;
CHK(rc, self->getProperty(self, key, (void **)&value, TYPES_PLCHAR));
if (value == NULL)
return ESR_SUCCESS;
newValue = MALLOC(sizeof(long), MTAG);
if (newValue == NULL)
{
rc = ESR_OUT_OF_MEMORY;
goto CLEANUP;
}
CHKLOG(rc, lstrtoi(value, newValue, 10));
CHKLOG(rc, self->setProperty(self, key, newValue, TYPES_INT));
FREE(value);
return ESR_SUCCESS;
CLEANUP:
if (newValue != NULL)
FREE(newValue);
return rc;
}
ESR_ReturnCode ESR_SessionTypeConvertToUint16_tImpl(ESR_SessionType* self,
const LCHAR* key)
{
LCHAR* value;
int *newValue = NULL;
ESR_ReturnCode rc;
CHK(rc, self->getProperty(self, key, (void **)&value, TYPES_PLCHAR));
if (value == NULL)
return ESR_SUCCESS;
newValue = MALLOC(sizeof(long), MTAG);
if (newValue == NULL)
{
rc = ESR_OUT_OF_MEMORY;
goto CLEANUP;
}
CHKLOG(rc, lstrtoi(value, newValue, 10));
CHKLOG(rc, self->setProperty(self, key, newValue, TYPES_UINT16_T));
FREE(value);
return ESR_SUCCESS;
CLEANUP:
if (newValue != NULL)
FREE(newValue);
return rc;
}
ESR_ReturnCode ESR_SessionTypeConvertToSize_tImpl(ESR_SessionType* self,
const LCHAR* key)
{
LCHAR* value;
size_t* newValue = NULL;
ESR_ReturnCode rc;
CHK(rc, self->getProperty(self, key, (void **)&value, TYPES_PLCHAR));
if (value == NULL)
return ESR_SUCCESS;
newValue = MALLOC(sizeof(size_t), MTAG);
if (newValue == NULL)
{
rc = ESR_OUT_OF_MEMORY;
goto CLEANUP;
}
CHKLOG(rc, lstrtosize_t(value, newValue, 10));
CHKLOG(rc, self->setProperty(self, key, newValue, TYPES_SIZE_T));
FREE(value);
return ESR_SUCCESS;
CLEANUP:
if (newValue != NULL)
FREE(newValue);
return rc;
}
ESR_ReturnCode ESR_SessionTypeConvertToFloatImpl(ESR_SessionType* self,
const LCHAR* key)
{
LCHAR* value;
float *newValue = NULL;
ESR_ReturnCode rc;
CHK(rc, self->getProperty(self, key, (void **)&value, TYPES_PLCHAR));
if (value == NULL)
return ESR_SUCCESS;
newValue = MALLOC(sizeof(double), MTAG);
if (newValue == NULL)
{
rc = ESR_OUT_OF_MEMORY;
goto CLEANUP;
}
CHKLOG(rc, lstrtof(value, newValue));
CHKLOG(rc, self->setProperty(self, key, newValue, TYPES_FLOAT));
FREE(value);
return ESR_SUCCESS;
CLEANUP:
if (newValue != NULL)
FREE(newValue);
return rc;
}
ESR_ReturnCode ESR_SessionTypeConvertToBoolImpl(ESR_SessionType* self,
const LCHAR* key)
{
LCHAR* value;
ESR_BOOL *newValue = NULL;
ESR_ReturnCode rc;
CHK(rc, self->getProperty(self, key, (void **)&value, TYPES_PLCHAR));
if (value == NULL)
return ESR_SUCCESS;
newValue = MALLOC(sizeof(ESR_BOOL), MTAG);
if (newValue == NULL)
{
rc = ESR_OUT_OF_MEMORY;
goto CLEANUP;
}
rc = lstrtob(value, newValue);
if (rc != ESR_SUCCESS)
{
FREE(newValue);
return rc;
}
rc = self->setProperty(self, key, newValue, TYPES_BOOL);
if (rc != ESR_SUCCESS)
{
FREE(newValue);
return rc;
}
FREE(value);
return ESR_SUCCESS;
CLEANUP:
if (newValue != NULL)
FREE(newValue);
return rc;
}
/**
* Imports file containing [key, value] pairs into session.
*
* @param self ESR_SessionType handle
* @param filename File to read session from
* @param addMapping Function used to map keys to their type and add them to the session
* @param data Data used by the mapping function
*/
static ESR_ReturnCode importKeyValueFile(ESR_SessionType* self,
const LCHAR* filename,
ESR_ReturnCode(*addMapping)(ESR_SessionType* self, const LCHAR* key, LCHAR* value, void* data),
void* data)
{
const size_t LINE_SIZE = 512;
LCHAR key[512];
LCHAR buffer[512];
LCHAR* value;
LCHAR* ending;
LCHAR* line;
PFile* file = NULL;
ESR_BOOL lineSpan = ESR_FALSE;
LString* valueBuffer = NULL;
ESR_ReturnCode rc = ESR_SUCCESS;
if (filename == NULL)
return ESR_INVALID_ARGUMENT;
file = pfopen ( filename, L("r") );
/* CHKLOG(rc, PFileSystemCreatePFile(filename, ESR_TRUE, &file));
CHKLOG(rc, PFileOpen(file, L("r")));*/
if (file == NULL)
{
LCHAR msg[P_PATH_MAX + 30];
LCHAR cwd[P_PATH_MAX];
size_t len;
len = P_PATH_MAX;
CHKLOG(rc, pf_get_cwd (cwd, &len));
psprintf(msg, L("ESR_OPEN_FILE_ERROR(filename=%s, cwd=%s)"), filename, cwd);
rc = ESR_OPEN_ERROR;
PLogError(msg);
goto CLEANUP;
}
rc = LStringCreate(&valueBuffer);
if (rc != ESR_SUCCESS)
goto CLEANUP;
line = buffer;
while (ESR_TRUE)
{
line = pfgets(line, LINE_SIZE, file);
if (line == NULL)
{
if (pfeof(file))
break;
rc = ESR_READ_ERROR;
PLogError(ESR_rc2str(rc));
goto CLEANUP;
}
if (LSTRLEN(line) == LINE_SIZE)
{
PLogError(L("%s: line surpasses %d character limit: '%s'"), filename, line);
continue;
}
lstrtrim(line);
if (LSTRLEN(line) == 0 || line[0] == '#')
continue;
if (!lineSpan)
{
if (rc != ESR_SUCCESS) goto CLEANUP;
/* locate the key and value pair */
ending = LSTRCHR(line, '=');
if (ending == NULL)
{
fprintf(stderr, "Missing equal sign on line '%s'\n", line);
continue;
}
*ending = L('\0');
value = ending + 1;
}
else
value = line;
/* Optionally use ';' to denote end of value */
ending = LSTRCHR(value, L(';'));
if (ending != NULL)
*ending = L('\0');
else
{
ending = LSTRCHR(value, L('\n'));
if (ending != NULL)
*ending = L('\0');
}
if (!lineSpan)
{
LSTRCPY(key, line);
lstrtrim(key);
}
if (LSTRLEN(value) == 0)
{
pfprintf(PSTDERR, L("Missing value for '%s'\n"), key);
continue;
}
lstrtrim(value);
if ((ending = LSTRCHR(value, '\\')) == (value + LSTRLEN(value) - 1))
{
/* found '\\' at end of line which means data will span to the next line */
lineSpan = ESR_TRUE;
*ending = L('\0');
}
else
lineSpan = ESR_FALSE;
rc = LStringAppend(valueBuffer, value);
if (rc != ESR_SUCCESS)
{
PLogError(ESR_rc2str(rc));
goto CLEANUP;
}
if (!lineSpan)
{
rc = LStringToLCHAR(valueBuffer, &value);
valueBuffer = NULL;
if (rc != ESR_SUCCESS)
{
PLogError(ESR_rc2str(rc));
goto CLEANUP;
}
rc = addMapping(self, key, value, data);
if (value != NULL)
{
FREE(value);
value = NULL;
}
if (rc != ESR_SUCCESS)
{
PLogError(ESR_rc2str(rc));
goto CLEANUP;
}
rc = LStringCreate(&valueBuffer);
if (rc != ESR_SUCCESS)
{
PLogError(ESR_rc2str(rc));
goto CLEANUP;
}
}
}
if (pferror(file))
{
rc = ESR_READ_ERROR;
PLogError(ESR_rc2str(rc));
goto CLEANUP;
}
if (pfclose(file) != 0)
{
rc = ESR_CLOSE_ERROR;
PLogError(ESR_rc2str(rc));
goto CLEANUP;
}
if (valueBuffer != NULL)
LStringDestroy(valueBuffer);
return ESR_SUCCESS;
CLEANUP:
if (file != NULL)
pfclose(file);
if (valueBuffer != NULL)
LStringDestroy(valueBuffer);
return rc;
}
/**
* Appends a collection of integers stored in string format to an IntArrayList.
*
* @param self ESR_SessionType handle
* @param text Text containing integers
* @param list List to be populated
*/
static ESR_ReturnCode parseIntList(ESR_SessionType* self,
LCHAR* text, IntArrayList* list)
{
size_t size, pos, beginning;
int value;
ESR_ReturnCode rc;
size = LSTRLEN(text);
pos = 0;
while (ESR_TRUE)
{
/* Scan for beginning of next token */
for (; pos < size && LISSPACE(text[pos]); ++pos);
if (pos >= size)
{
/* Reached end of string while looking for beginning of next token */
break;
}
beginning = pos;
/* Scan for ending of current token */
for (; pos < size && !LISSPACE(text[pos]); ++pos);
text[pos] = L('\0');
CHKLOG(rc, lstrtoi(text + beginning, &value, 10));
CHKLOG(rc, IntArrayListAdd(list, value));
++pos;
}
return ESR_SUCCESS;
CLEANUP:
return rc;
}
ESR_ReturnCode ESR_SessionTypeGetPropertyTypeImpl(ESR_SessionType* self,
const LCHAR* name, VariableTypes* type)
{
ESR_SessionTypeData* data = self->data;
ESR_SessionPair* pair;
ESR_ReturnCode rc;
CHK(rc, HashMapGet(data->value, name, (void **)&pair));
*type = pair->type;
return ESR_SUCCESS;
CLEANUP:
return rc;
}
/**
* Maps key -> type for PAR files.
*
* @param self ESR_Session handle
* @param key Key name
* @param value The value
*/
static ESR_ReturnCode addParMapping(ESR_SessionType* self,
const LCHAR* key, LCHAR* value, void* data)
{
IntArrayList* iList;
ESR_ReturnCode rc;
HashMap* map;
VariableTypes* type;
int iValue;
size_t size_tValue;
float fValue;
ESR_BOOL bValue;
ESR_BOOL exists;
map = (HashMap*) data;
rc = HashMapGet(data, key, (void **)&type);
if (rc == ESR_NO_MATCH_ERROR)
{
/* If type is unknown, assume LCHAR* */
PLogMessage(L("Unknown parfile key '%s'"), key);
CHKLOG(rc, self->setLCHAR(self, key, value));
}
else if (rc == ESR_SUCCESS)
{
switch (*type)
{
case TYPES_INT:
CHKLOG(rc, lstrtoi(value, &iValue, 10));
CHKLOG(rc, self->contains(self, key, &exists));
if (exists)
CHKLOG(rc, self->removeAndFreeProperty(self, key));
CHKLOG(rc, self->setInt(self, key, iValue));
break;
case TYPES_UINT16_T:
CHKLOG(rc, lstrtosize_t(value, &size_tValue, 10));
passert(size_tValue >= UINT16_TMIN && size_tValue <= UINT16_TMAX);
CHKLOG(rc, self->contains(self, key, &exists));
if (exists)
CHKLOG(rc, self->removeAndFreeProperty(self, key));
CHKLOG(rc, self->setUint16_t(self, key, (asr_uint16_t) size_tValue));
break;
case TYPES_SIZE_T:
CHKLOG(rc, lstrtosize_t(value, &size_tValue, 10));
CHKLOG(rc, self->contains(self, key, &exists));
if (exists)
CHKLOG(rc, self->removeAndFreeProperty(self, key));
CHKLOG(rc, self->setSize_t(self, key, size_tValue));
break;
case TYPES_FLOAT:
CHKLOG(rc, lstrtof(value, &fValue));
CHKLOG(rc, self->contains(self, key, &exists));
if (exists)
CHKLOG(rc, self->removeAndFreeProperty(self, key));
CHKLOG(rc, self->setFloat(self, key, fValue));
break;
case TYPES_BOOL:
CHKLOG(rc, lstrtob(value, &bValue));
CHKLOG(rc, self->contains(self, key, &exists));
if (exists)
CHKLOG(rc, self->removeAndFreeProperty(self, key));
CHKLOG(rc, self->setBool(self, key, bValue));
break;
case TYPES_INTARRAYLIST:
CHKLOG(rc, self->contains(self, key, &exists));
if (exists)
{
CHKLOG(rc, self->getProperty(self, key, (void **)&iList, TYPES_INTARRAYLIST));
CHKLOG(rc, self->removeProperty(self, key));
CHKLOG(rc, iList->destroy(iList));
}
CHKLOG(rc, IntArrayListCreate(&iList));
CHKLOG(rc, parseIntList(self, value, iList));
CHKLOG(rc, self->setProperty(self, key, iList, TYPES_INTARRAYLIST));
break;
default:
passert(0); /* Unknown variable type. Assuming LCHAR* */
case TYPES_PLCHAR:
CHKLOG(rc, self->contains(self, key, &exists));
if (exists)
CHKLOG(rc, self->removeAndFreeProperty(self, key));
CHKLOG(rc, self->setLCHAR(self, key, value));
break;
}
}
return rc;
CLEANUP:
return rc;
}
ESR_ReturnCode ESR_SessionTypeImportParFileImpl(ESR_SessionType* self,
const LCHAR* filename)
{
ESR_ReturnCode rc;
HashMap* parameterList;
VariableTypes Int = TYPES_INT;
VariableTypes UInt16_t = TYPES_UINT16_T;
VariableTypes Float = TYPES_FLOAT;
VariableTypes Bool = TYPES_BOOL;
VariableTypes IntArrayList = TYPES_INTARRAYLIST;
VariableTypes PLChar = TYPES_PLCHAR;
VariableTypes Size_t = TYPES_SIZE_T;
/* Create [key, type] lookup table */
CHKLOG(rc, HashMapCreate(&parameterList));
CHKLOG(rc, parameterList->put(parameterList, "cmdline.arbfile", &PLChar));
CHKLOG(rc, parameterList->put(parameterList, "cmdline.bgsniff", &Size_t));
CHKLOG(rc, parameterList->put(parameterList, "cmdline.channel", &PLChar));
CHKLOG(rc, parameterList->put(parameterList, "cmdline.datapath", &PLChar));
CHKLOG(rc, parameterList->put(parameterList, "cmdline.DataCaptureDirectory", &PLChar));
CHKLOG(rc, parameterList->put(parameterList, "cmdline.detail_res", &PLChar));
CHKLOG(rc, parameterList->put(parameterList, "cmdline.lda", &PLChar));
CHKLOG(rc, parameterList->put(parameterList, "cmdline.modelfiles", &PLChar));
CHKLOG(rc, parameterList->put(parameterList, "cmdline.modelfiles11", &PLChar));
CHKLOG(rc, parameterList->put(parameterList, "cmdline.modelfiles8", &PLChar));
CHKLOG(rc, parameterList->put(parameterList, "cmdline.lda11", &PLChar));
CHKLOG(rc, parameterList->put(parameterList, "cmdline.lda8", &PLChar));
CHKLOG(rc, parameterList->put(parameterList, "cmdline.results", &PLChar));
CHKLOG(rc, parameterList->put(parameterList, "cmdline.rules", &PLChar));
CHKLOG(rc, parameterList->put(parameterList, "cmdline.tcp", &PLChar));
CHKLOG(rc, parameterList->put(parameterList, "cmdline.multable", &PLChar));
CHKLOG(rc, parameterList->put(parameterList, "cmdline.parfile", &PLChar));
CHKLOG(rc, parameterList->put(parameterList, "cmdline.vocabulary", &PLChar));
CHKLOG(rc, parameterList->put(parameterList, "cmdline.use_image", &Int));
CHKLOG(rc, parameterList->put(parameterList, "cmdline.semproc_verbose", &Bool));
CHKLOG(rc, parameterList->put(parameterList, "cmdline.nametagPath", &PLChar));
/* Beginning of speech detection stuff */
CHKLOG(rc, parameterList->put(parameterList, "cmdline.bgsniff_min", &Size_t));
CHKLOG(rc, parameterList->put(parameterList, "cmdline.silence_duration_in_frames", &Size_t));
CHKLOG(rc, parameterList->put(parameterList, "cmdline.end_of_utterance_hold_off_in_frames", &Size_t));
CHKLOG(rc, parameterList->put(parameterList, "cmdline.gatedmode", &Bool));
/* new param from SREC that did not exist in CREC */
CHKLOG(rc, parameterList->put(parameterList, "SREC.Recognizer.utterance_timeout", &Size_t));
CHKLOG(rc, parameterList->put(parameterList, "SREC.Recognizer.osi_log_level", &Size_t));
CHKLOG(rc, parameterList->put(parameterList, "SREC.voice_enroll.bufsz_kB", &Size_t));
CHKLOG(rc, parameterList->put(parameterList, "SREC.voice_enroll.eos_comfort_frames", &Size_t));
CHKLOG(rc, parameterList->put(parameterList, "SREC.voice_enroll.bos_comfort_frames", &Size_t));
CHKLOG(rc, parameterList->put(parameterList, "SREC.Confidence.sigmoid_param.gdiff.one_nbest", &PLChar));
CHKLOG(rc, parameterList->put(parameterList, "SREC.Confidence.sigmoid_param.gdiff.many_nbest", &PLChar));
CHKLOG(rc, parameterList->put(parameterList, "SREC.Confidence.sigmoid_param.sd.one_nbest", &PLChar));
CHKLOG(rc, parameterList->put(parameterList, "SREC.Confidence.sigmoid_param.sd.many_nbest", &PLChar));
CHKLOG(rc, parameterList->put(parameterList, "SREC.Confidence.sigmoid_param.sd13.one_nbest", &PLChar));
CHKLOG(rc, parameterList->put(parameterList, "SREC.Confidence.sigmoid_param.sd13.many_nbest", &PLChar));
CHKLOG(rc, parameterList->put(parameterList, "SREC.Confidence.sigmoid_param.spf.one_nbest", &PLChar));
CHKLOG(rc, parameterList->put(parameterList, "SREC.Confidence.sigmoid_param.spf.many_nbest", &PLChar));
CHKLOG(rc, parameterList->put(parameterList, "SREC.Confidence.sigmoid_param.abs.one_nbest", &PLChar));
CHKLOG(rc, parameterList->put(parameterList, "SREC.Confidence.sigmoid_param.abs.many_nbest", &PLChar));
CHKLOG(rc, parameterList->put(parameterList, "SREC.Confidence.sigmoid_param.gdiffpf.one_nbest", &PLChar));
CHKLOG(rc, parameterList->put(parameterList, "SREC.Confidence.sigmoid_param.gdiffpf.many_nbest", &PLChar));
CHKLOG(rc, parameterList->put(parameterList, "CREC.ParVersion", &Float));
CHKLOG(rc, parameterList->put(parameterList, "CREC.useCREClogger", &Int));
CHKLOG(rc, parameterList->put(parameterList, "CREC.Acoustic.dimen", &Int));
CHKLOG(rc, parameterList->put(parameterList, "CREC.Acoustic.skip", &Int));
CHKLOG(rc, parameterList->put(parameterList, "CREC.Acoustic.stay", &Int));
CHKLOG(rc, parameterList->put(parameterList, "CREC.Acoustic.durscale", &Int));
CHKLOG(rc, parameterList->put(parameterList, "CREC.Acoustic.minvar", &Int));
CHKLOG(rc, parameterList->put(parameterList, "CREC.Acoustic.maxvar", &Int));
CHKLOG(rc, parameterList->put(parameterList, "CREC.Acoustic.frame_period", &Int));
CHKLOG(rc, parameterList->put(parameterList, "CREC.Acoustic.load_models", &PLChar));
CHKLOG(rc, parameterList->put(parameterList, "CREC.Frontend.mel_dim", &Int));
CHKLOG(rc, parameterList->put(parameterList, "CREC.Frontend.samplerate", &Size_t));
CHKLOG(rc, parameterList->put(parameterList, "CREC.Frontend.premel", &Float));
CHKLOG(rc, parameterList->put(parameterList, "CREC.Frontend.lowcut", &Int));
CHKLOG(rc, parameterList->put(parameterList, "CREC.Frontend.highcut", &Int));
CHKLOG(rc, parameterList->put(parameterList, "CREC.Frontend.window_factor", &Float));
CHKLOG(rc, parameterList->put(parameterList, "CREC.Frontend.offset", &Float));
CHKLOG(rc, parameterList->put(parameterList, "CREC.Frontend.ddmel", &Bool));
CHKLOG(rc, parameterList->put(parameterList, "CREC.Frontend.peakdecayup", &Float));
CHKLOG(rc, parameterList->put(parameterList, "CREC.Frontend.peakdecaydown", &Float));
CHKLOG(rc, parameterList->put(parameterList, "CREC.Frontend.do_skip_even_frames", &Bool));
CHKLOG(rc, parameterList->put(parameterList, "CREC.Frontend.do_smooth_c0", &Bool));
CHKLOG(rc, parameterList->put(parameterList, "CREC.Frontend.melA", &IntArrayList));
CHKLOG(rc, parameterList->put(parameterList, "CREC.Frontend.melB", &IntArrayList));
CHKLOG(rc, parameterList->put(parameterList, "CREC.Frontend.dmelA", &IntArrayList));
CHKLOG(rc, parameterList->put(parameterList, "CREC.Frontend.dmelB", &IntArrayList));
CHKLOG(rc, parameterList->put(parameterList, "CREC.Frontend.ddmelA", &IntArrayList));
CHKLOG(rc, parameterList->put(parameterList, "CREC.Frontend.ddmelB", &IntArrayList));
/* new for S2G 3 (read from parfile instead of hardcoding) */
CHKLOG(rc, parameterList->put(parameterList, "CREC.Frontend.swicms.cmn", &IntArrayList));
CHKLOG(rc, parameterList->put(parameterList, "CREC.Frontend.swicms.cmn8", &IntArrayList));
CHKLOG(rc, parameterList->put(parameterList, "CREC.Frontend.swicms.cmn11", &IntArrayList));
CHKLOG(rc, parameterList->put(parameterList, "CREC.Frontend.swicms.tmn", &IntArrayList));
CHKLOG(rc, parameterList->put(parameterList, "CREC.Frontend.swicms.adjust", &IntArrayList));
CHKLOG(rc, parameterList->put(parameterList, "CREC.Frontend.swicms.debug", &Bool));
CHKLOG(rc, parameterList->put(parameterList, "CREC.Frontend.swicms.sbindex", &IntArrayList));
CHKLOG(rc, parameterList->put(parameterList, "CREC.Frontend.swicms.forget_factor", &IntArrayList));
CHKLOG(rc, parameterList->put(parameterList, "CREC.Frontend.swicms.cache_resolution", &IntArrayList));
CHKLOG(rc, parameterList->put(parameterList, "CREC.Frontend.swicms.inutt.forget_factor2", &IntArrayList));
CHKLOG(rc, parameterList->put(parameterList, "CREC.Frontend.swicms.inutt.disable_after", &IntArrayList));
CHKLOG(rc, parameterList->put(parameterList, "CREC.Frontend.swicms.inutt.enable_after", &IntArrayList));
/* zwz */
CHKLOG(rc, parameterList->put(parameterList, "CREC.Frontend.swicms.do_VN", &Bool));
CHKLOG(rc, parameterList->put(parameterList, "CREC.Frontend.speech_detect", &Int));
CHKLOG(rc, parameterList->put(parameterList, "CREC.Frontend.ambient_within", &Int));
CHKLOG(rc, parameterList->put(parameterList, "CREC.Frontend.speech_above", &Int));
CHKLOG(rc, parameterList->put(parameterList, "CREC.Frontend.start_windback", &Int));
CHKLOG(rc, parameterList->put(parameterList, "CREC.Frontend.utterance_allowance", &Int));
CHKLOG(rc, parameterList->put(parameterList, "CREC.Pattern.dimen", &Int));
CHKLOG(rc, parameterList->put(parameterList, "CREC.Pattern.whole_dimen", &Int));
CHKLOG(rc, parameterList->put(parameterList, "CREC.Pattern.mix_score_scale", &Float));
CHKLOG(rc, parameterList->put(parameterList, "CREC.Pattern.start", &Int));
CHKLOG(rc, parameterList->put(parameterList, "CREC.Pattern.chelt_imelda", &Bool));
CHKLOG(rc, parameterList->put(parameterList, "CREC.Pattern.vfrlimit", &Bool));
CHKLOG(rc, parameterList->put(parameterList, "CREC.Pattern.vfrthresh", &Bool));
CHKLOG(rc, parameterList->put(parameterList, "CREC.Pattern.mix_score_scale", &Float));
CHKLOG(rc, parameterList->put(parameterList, "CREC.Pattern.imelda_scale", &Float));
CHKLOG(rc, parameterList->put(parameterList, "CREC.Pattern.uni_score_scale", &Float));
CHKLOG(rc, parameterList->put(parameterList, "CREC.Pattern.uni_score_offset", &Float));
CHKLOG(rc, parameterList->put(parameterList, "CREC.Pattern.forget_speech", &Int));
CHKLOG(rc, parameterList->put(parameterList, "CREC.Pattern.forget_background", &Int));
CHKLOG(rc, parameterList->put(parameterList, "CREC.Pattern.rel_low", &Int));
CHKLOG(rc, parameterList->put(parameterList, "CREC.Pattern.rel_high", &Int));
CHKLOG(rc, parameterList->put(parameterList, "CREC.Pattern.gap_period", &Int));
CHKLOG(rc, parameterList->put(parameterList, "CREC.Pattern.click_period", &Int));
CHKLOG(rc, parameterList->put(parameterList, "CREC.Pattern.breath_period", &Int));
CHKLOG(rc, parameterList->put(parameterList, "CREC.Pattern.extend_annotation", &Int));
CHKLOG(rc, parameterList->put(parameterList, "CREC.Pattern.min_initial_quiet_frames", &Int));
CHKLOG(rc, parameterList->put(parameterList, "CREC.Pattern.min_annotation_frames", &Int));
CHKLOG(rc, parameterList->put(parameterList, "CREC.Pattern.min_initial_quiet_frames", &Int));
CHKLOG(rc, parameterList->put(parameterList, "CREC.Pattern.max_annotation_frames", &Int));
CHKLOG(rc, parameterList->put(parameterList, "CREC.Pattern.delete_leading_segments", &Int));
CHKLOG(rc, parameterList->put(parameterList, "CREC.Pattern.leading_segment_min_frames", &Int));
CHKLOG(rc, parameterList->put(parameterList, "CREC.Pattern.leading_segment_max_frames", &Int));
CHKLOG(rc, parameterList->put(parameterList, "CREC.Pattern.leading_segment_min_silence_gap_frames", &Int));
CHKLOG(rc, parameterList->put(parameterList, "CREC.Pattern.leading_segment_accept_if_not_found", &Int));
CHKLOG(rc, parameterList->put(parameterList, "CREC.Pattern.snr_holdoff", &Int));
CHKLOG(rc, parameterList->put(parameterList, "CREC.Pattern.min_acceptable_snr", &Int));
CHKLOG(rc, parameterList->put(parameterList, "CREC.Pattern.param", &Int));
CHKLOG(rc, parameterList->put(parameterList, "CREC.Pattern.beep_size", &Int));
CHKLOG(rc, parameterList->put(parameterList, "CREC.Pattern.beep_threshold", &Int));
CHKLOG(rc, parameterList->put(parameterList, "CREC.Pattern.partial_distance_dim", &Int));
CHKLOG(rc, parameterList->put(parameterList, "CREC.Pattern.partial_distance_threshold", &Int));
CHKLOG(rc, parameterList->put(parameterList, "CREC.Pattern.partial_distance_offset", &Int));
CHKLOG(rc, parameterList->put(parameterList, "CREC.Pattern.global_model_means", &IntArrayList));
CHKLOG(rc, parameterList->put(parameterList, "CREC.Recognizer.NBest", &Int));
CHKLOG(rc, parameterList->put(parameterList, "CREC.Recognizer.reject", &Int));
CHKLOG(rc, parameterList->put(parameterList, "CREC.Recognizer.often", &Int));
CHKLOG(rc, parameterList->put(parameterList, "CREC.Recognizer.partial_results", &Bool));
CHKLOG(rc, parameterList->put(parameterList, "CREC.Recognizer.wordpen", &Int));
CHKLOG(rc, parameterList->put(parameterList, "CREC.Recognizer.viterbi_prune_thresh", &Int));
CHKLOG(rc, parameterList->put(parameterList, "CREC.Recognizer.max_hmm_tokens", &Int));
CHKLOG(rc, parameterList->put(parameterList, "CREC.Recognizer.max_fsmnode_tokens", &Int));
CHKLOG(rc, parameterList->put(parameterList, "CREC.Recognizer.max_word_tokens", &Int));
CHKLOG(rc, parameterList->put(parameterList, "CREC.Recognizer.max_altword_tokens", &Int));
CHKLOG(rc, parameterList->put(parameterList, "CREC.Recognizer.num_wordends_per_frame", &Int));
CHKLOG(rc, parameterList->put(parameterList, "CREC.Recognizer.max_fsm_nodes", &Int));
CHKLOG(rc, parameterList->put(parameterList, "CREC.Recognizer.max_fsm_arcs", &Int));
CHKLOG(rc, parameterList->put(parameterList, "CREC.Recognizer.max_searches", &Int));
CHKLOG(rc, parameterList->put(parameterList, "CREC.Recognizer.terminal_timeout", &Int));
CHKLOG(rc, parameterList->put(parameterList, "CREC.Recognizer.optional_terminal_timeout", &Int));
CHKLOG(rc, parameterList->put(parameterList, "CREC.Recognizer.non_terminal_timeout", &Int));
CHKLOG(rc, parameterList->put(parameterList, "CREC.Recognizer.eou_threshold", &Int));
CHKLOG(rc, parameterList->put(parameterList, "CREC.Recognizer.max_frames", &Int));
CHKLOG(rc, parameterList->put(parameterList, "CREC.Recognizer.max_model_states", &Int));
CHKLOG(rc, parameterList->put(parameterList, "thread.priority", &UInt16_t));
/* for G2P */
CHKLOG(rc, parameterList->put(parameterList, "G2P.Available", &Bool));
CHKLOG(rc, parameterList->put(parameterList, "G2P.Data", &PLChar));
CHKLOG(rc, parameterList->put(parameterList, "G2P.Dictionary", &PLChar));
/* Enable Get Waveform */
CHKLOG(rc, parameterList->put(parameterList, "enableGetWaveform", &Bool));
rc = importKeyValueFile(self, filename, addParMapping, parameterList);
if (rc != ESR_SUCCESS)
goto CLEANUP;
CHKLOG(rc, HashMapDestroy(parameterList));
return ESR_SUCCESS;
CLEANUP:
HashMapDestroy(parameterList);
return rc;
}
ESR_ReturnCode ESR_SessionTypeAddListenerImpl(ESR_SessionType* self, ESR_SessionTypeListenerPair* listener)
{
ESR_SessionTypeData* data = self->data;
ArrayList* listeners = data->listeners;
ESR_ReturnCode rc;
CHKLOG(rc, listeners->add(listeners, listener));
return ESR_SUCCESS;
CLEANUP:
return rc;
}
ESR_ReturnCode ESR_SessionTypeRemoveListenerImpl(ESR_SessionType* self, ESR_SessionTypeListenerPair* listener)
{
ESR_SessionTypeData* data = self->data;
ArrayList* listeners = data->listeners;
ESR_ReturnCode rc;
CHKLOG(rc, listeners->remove(listeners, listener));
return ESR_SUCCESS;
CLEANUP:
return rc;
}
ESR_ReturnCode ESR_SessionTypeDestroyImpl(ESR_SessionType* self)
{
ESR_SessionTypeData* data = self->data;
size_t hashSize;
ESR_SessionPair* pair;
ESR_ReturnCode rc;
if (data != NULL)
{
if (data->value != NULL)
{
CHKLOG(rc, HashMapGetSize(data->value, &hashSize));
while (hashSize > 0)
{
CHKLOG(rc, HashMapGetValueAtIndex(data->value, 0, (void **)&pair));
if (pair->value)
{
if (pair->type == TYPES_INTARRAYLIST)
CHKLOG(rc, IntArrayListDestroy((IntArrayList*) pair->value));
else
FREE(pair->value);
}
CHKLOG(rc, HashMapRemoveAtIndex(data->value, 0));
--hashSize;
FREE(pair);
}
CHKLOG(rc, HashMapDestroy(data->value));
data->value = NULL;
}
if (data->listeners != NULL)
{
CHKLOG(rc, data->listeners->destroy(data->listeners));
data->listeners = NULL;
}
FREE(data);
}
FREE(self);
return ESR_SUCCESS;
CLEANUP:
return rc;
}