/*---------------------------------------------------------------------------*
* ESR_Session.h *
* *
* 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. *
* *
*---------------------------------------------------------------------------*/
#ifndef __ESR_SESSION_H
#define __ESR_SESSION_H
#include "ESR_ReturnCode.h"
#include "ESR_SharedPrefix.h"
#include "pstdio.h"
#include "ptypes.h"
#include "ESR_SessionType.h"
/**
* @addtogroup ESR_SessionModule ESR_Session API functions
* Manages ESR session information.
*
* @{
*/
/**
* Hashmap with helper functions for adding primitives and add-if-empty.
*/
typedef struct ESR_SessionSingleton_t
{
/**
* Returns session property value.
*
* @param name Property name
* @param value Property value
* @param type Expected variable type (for strong-typing purposes)
*/
ESR_ReturnCode(*getProperty)(const LCHAR* name, void** value, VariableTypes type);
/**
* Returns the type of a property value.
*
* @param name Property name
* @param type [out] Value type
*/
ESR_ReturnCode(*getPropertyType)(const LCHAR* name, VariableTypes* type);
/**
* Returns copy of session property value.
*
* @param name Property name
* @param value Property value
*/
ESR_ReturnCode(*getInt)(const LCHAR* name, int* value);
/**
* Returns copy of session property value.
*
* @param name Property name
* @param value Property value
*/
ESR_ReturnCode(*getUint16_t)(const LCHAR* name, asr_uint16_t* value);
/**
* Returns copy of session property value.
*
* @param name Property name
* @param value Property value
*/
ESR_ReturnCode(*getSize_t)(const LCHAR* name, size_t* value);
/**
* Returns copy of session property value.
*
* @param name Property name
* @param value Property value
*/
ESR_ReturnCode(*getFloat)(const LCHAR* name, float* value);
/**
* Returns copy of session property value.
*
* @param name Property name
* @param value Property value
*/
ESR_ReturnCode(*getBool)(const LCHAR* name, ESR_BOOL* value);
/**
* Returns copy of session property value.
*
* @param name Property name
* @param value Property value
* @param len Length of value argument. If the return code is ESR_BUFFER_OVERFLOW,
* the required length is returned in this variable.
*/
ESR_ReturnCode(*getLCHAR)(const LCHAR* name, LCHAR* value, size_t* len);
/**
* Indicates if key exists in the session.
*
* @param name Property name
* @param exists True if key exists, false otherwise
*/
ESR_ReturnCode(*contains)(const LCHAR* name, ESR_BOOL* exists);
/**
* Sets session property value.
*
* @param name Property name
* @param value Property value
* @param type Type of value being set
*/
ESR_ReturnCode(*setProperty)(const LCHAR* name, void* value, VariableTypes type);
/**
* Sets session property value, storing a copy of the value.
*
* @param name Property name
* @param value Property value
*/
ESR_ReturnCode(*setInt)(const LCHAR* name, int value);
/**
* Sets session property value, storing a copy of the value.
*
* @param name Property name
* @param value Property value
*/
ESR_ReturnCode(*setUint16_t)(const LCHAR* name, asr_uint16_t value);
/**
* Sets session property value, storing a copy of the value.
*
* @param name Property name
* @param value Property value
*/
ESR_ReturnCode(*setSize_t)(const LCHAR* name, size_t value);
/**
* Sets session property value, storing a copy of the value.
*
* @param name Property name
* @param value Property value
*/
ESR_ReturnCode(*setFloat)(const LCHAR* name, float value);
/**
* Sets session property value, storing a copy of the value.
*
* @param name Property name
* @param value Property value
*/
ESR_ReturnCode(*setBool)(const LCHAR* name, ESR_BOOL value);
/**
* Sets session property value, storing a copy of the value.
*
* @param name Property name
* @param value Property value
*/
ESR_ReturnCode(*setLCHAR)(const LCHAR* name, LCHAR* value);
/**
* If the key does not exist in the session, calls SessionSetInt().
*
* This helper function aids implementation of "default values", overwriting
* session values only if they have not been set already.
*
* @param name Property name
* @param value Property value
*/
ESR_ReturnCode(*setIntIfEmpty)(const LCHAR* name, int value);
/**
* If the key does not exist in the session, calls SessionSetUint16_t().
*
* This helper function aids implementation of "default values", overwriting
* session values only if they have not been set already.
*
* @param name Property name
* @param value Property value
*/
ESR_ReturnCode(*setUint16_tIfEmpty)(const LCHAR* name, asr_uint16_t value);
/**
* If the key does not exist in the session, calls SessionSetSize_t().
*
* This helper function aids implementation of "default values", overwriting
* session values only if they have not been set already.
*
* @param name Property name
* @param value Property value
*/
ESR_ReturnCode(*setSize_tIfEmpty)(const LCHAR* name, size_t value);
/**
* If the key does not exist in the session, calls SessionSetFloat().
*
* This helper function aids implementation of "default values", overwriting
* session values only if they have not been set already.
*
* @param name Property name
* @param value Property value
*/
ESR_ReturnCode(*setFloatIfEmpty)(const LCHAR* name, float value);
/**
* If the key does not exist in the session, calls SessionSetBool().
*
* This helper function aids implementation of "default values", overwriting
* session values only if they have not been set already.
*
* @param name Property name
* @param value Property value
*/
ESR_ReturnCode(*setBoolIfEmpty)(const LCHAR* name, ESR_BOOL value);
/**
* If the key does not exist in the session, calls SessionSetLCHAR().
*
* This helper function aids implementation of "default values", overwriting
* session values only if they have not been set already.
*
* @param name Property name
* @param value Property value
*/
ESR_ReturnCode(*setLCHARIfEmpty)(const LCHAR* name, LCHAR* value);
/**
* Removes property from session.
*
* @param name Property name
*/
ESR_ReturnCode(*removeProperty)(const LCHAR* name);
/**
* Removes and deallocates property from session.
*
* @param name Property name
*/
ESR_ReturnCode(*removeAndFreeProperty)(const LCHAR* name);
/**
* Imports commandline arguments into the system session.
*
* Keys are imported as "cmdline.[name]" where [name] is the name of the command-line argument
* Values are set in char* format.
*
* For example, given the argument "-timer=5", the following key will be added to the session:
* ["cmdline.timer", "5"]
*
* Validation is left up to the application.
*
* If the session contains a key that is clobbered by the parser, the old [key, value]
* pair will be deallocated. For example, if the session contained
* ["cmdline.timer", "value"] before the aforementioned example occured, then the old
* [key, value] pair will be allocated by the parser.
*
* @param argc Number of arguments
* @param argv Argument values
*/
ESR_ReturnCode(*importCommandLine)(int argc, char* argv[]);
/**
* Returns the number of elements in the session.
*
* @param size [out] Session size
*/
ESR_ReturnCode(*getSize)(size_t* size);
/**
* Returns the key associated with the specified index.
*
* @param index Element index
* @param key [out] Key name
*/
ESR_ReturnCode(*getKeyAtIndex)(size_t index, LCHAR** key);
/**
* Convert the specified argument to int.
*
* @param key Property name
*/
ESR_ReturnCode(*convertToInt)(const LCHAR* key);
/**
* Convert the specified argument to asr_uint16_t.
*
* @param key Property name
*/
ESR_ReturnCode(*convertToUint16_t)(const LCHAR* key);
/**
* Convert the specified argument to size_t.
*
* @param key Property name
*/
ESR_ReturnCode(*convertToSize_t)(const LCHAR* key);
/**
* Convert the specified argument to float.
*
* @param key Property name
*/
ESR_ReturnCode(*convertToFloat)(const LCHAR* key);
/**
* Convert the specified argument to bool.
*
* @param key Property name
*/
ESR_ReturnCode(*convertToBool)(const LCHAR* key);
/**
* Destroys the system session.
*/
ESR_ReturnCode(*destroy)(void);
/**
* Import PAR file into session.
*
* @param file File to read session from
*/
ESR_ReturnCode(*importParFile)(const LCHAR* filename);
/**
* Import ARG file into session.
*
* @param file File to read arguments from
*/
ESR_ReturnCode(*importArgFile)(const LCHAR* filename);
/**
* Pointer to session data.
*/
void* data;
}
ESR_SessionSingleton;
/**
* Initializes the system session.
*
* @param filename File to read session information from
* @return ESR_OPEN_ERROR if file cannot be opened; ESR_READ_ERROR if file cannot be read;
* ESR_OUT_OF_MEMORY if system is out of memory
*/
ESR_SHARED_API ESR_ReturnCode ESR_SessionCreate(const LCHAR* filename);
/**
* Returns session property value.
*
* @param name Property name
* @param value Property value
* @param type Expected variable type (for strong-typing purposes)
* @return ESR_INVALID_RESULT_TYPE if the property is not of the specified type
*/
ESR_SHARED_API ESR_ReturnCode ESR_SessionGetProperty(const LCHAR* name, void** value,
VariableTypes type);
/**
* Returns copy of session property value.
*
* @param name Property name
* @param value Property value
* @return ESR_INVALID_RESULT_TYPE if the property is not an int
*/
ESR_SHARED_API ESR_ReturnCode ESR_SessionGetInt(const LCHAR* name, int* value);
/**
* Returns copy of session property value.
*
* @param name Property name
* @param value Property value
* @return ESR_INVALID_RESULT_TYPE if the property is not a asr_uint16_t
*/
ESR_SHARED_API ESR_ReturnCode ESR_SessionGetUint16_t(const LCHAR* name, asr_uint16_t* value);
/**
* Returns copy of session property value.
*
* @param name Property name
* @param value Property value
* @return ESR_INVALID_RESULT_TYPE if the property is not a size_t
*/
ESR_SHARED_API ESR_ReturnCode ESR_SessionGetSize_t(const LCHAR* name, size_t* value);
/**
* Returns copy of session property value.
*
* @param name Property name
* @param value Property value
* @return ESR_INVALID_RESULT_TYPE if the property is not a float
*/
ESR_SHARED_API ESR_ReturnCode ESR_SessionGetFloat(const LCHAR* name, float* value);
/**
* Returns copy of session property value.
*
* @param name Property name
* @param value Property value
* @return ESR_INVALID_RESULT_TYPE if the property is not a bool
*/
ESR_SHARED_API ESR_ReturnCode ESR_SessionGetBool(const LCHAR* name, ESR_BOOL* value);
/**
* Returns copy of session property value.
*
* @param name Property name
* @param value Property value
* @param len Length of value argument. If the return code is ESR_BUFFER_OVERFLOW,
* the required length is returned in this variable.
* @return ESR_INVALID_RESULT_TYPE if the property is not a LCHAR*
*/
ESR_SHARED_API ESR_ReturnCode ESR_SessionGetLCHAR(const LCHAR* name, LCHAR* value, size_t* len);
/**
* Indicates if key exists in the session.
*
* @param name Property name
* @param exists True if key exists, false otherwise
* @return ESR_SUCCESS
*/
ESR_SHARED_API ESR_ReturnCode ESR_SessionContains(const LCHAR* name, ESR_BOOL* exists);
/**
* Sets session property value.
*
* @param name Property name
* @param value Property value
* @param type Type of value being set
* @return ESR_OUT_OF_MEMORY if system is out of memory
*/
ESR_SHARED_API ESR_ReturnCode ESR_SessionSetProperty(const LCHAR* name, void* value,
VariableTypes type);
/**
* Sets session property value, storing a copy of the value.
*
* @param name Property name
* @param value Property value
* @return ESR_OUT_OF_MEMORY if system is out of memory
*/
ESR_SHARED_API ESR_ReturnCode ESR_SessionSetInt(const LCHAR* name, int value);
/**
* Sets session property value, storing a copy of the value.
*
* @param name Property name
* @param value Property value
* @return ESR_OUT_OF_MEMORY if system is out of memory
*/
ESR_SHARED_API ESR_ReturnCode ESR_SessionSetUint16_t(const LCHAR* name, asr_uint16_t value);
/**
* Sets session property value, storing a copy of the value.
*
* @param name Property name
* @param value Property value
* @return ESR_OUT_OF_MEMORY if system is out of memory
*/
ESR_SHARED_API ESR_ReturnCode ESR_SessionSetSize_t(const LCHAR* name, size_t value);
/**
* Sets session property value, storing a copy of the value.
*
* @param name Property name
* @param value Property value
* @return ESR_OUT_OF_MEMORY if system is out of memory
*/
ESR_SHARED_API ESR_ReturnCode ESR_SessionSetFloat(const LCHAR* name, float value);
/**
* Sets session property value, storing a copy of the value.
*
* @param name Property name
* @param value Property value
* @return ESR_OUT_OF_MEMORY if system is out of memory
*/
ESR_SHARED_API ESR_ReturnCode ESR_SessionSetBool(const LCHAR* name, ESR_BOOL value);
/**
* Sets session property value, storing a copy of the value.
*
* @param name Property name
* @param value Property value
* @return ESR_OUT_OF_MEMORY if system is out of memory
*/
ESR_SHARED_API ESR_ReturnCode ESR_SessionSetLCHAR(const LCHAR* name, LCHAR* value);
/**
* If the key does not exist in the session, calls SessionSetInt().
*
* @param name Property name
* @param value Property value
* @return ESR_OUT_OF_MEMORY if system is out of memory
*/
ESR_SHARED_API ESR_ReturnCode ESR_SessionSetIntIfEmpty(const LCHAR* name, int value);
/**
* If the key does not exist in the session, calls SessionSetSize_t().
*
* @param name Property name
* @param value Property value
* @return ESR_OUT_OF_MEMORY if system is out of memory
*/
ESR_SHARED_API ESR_ReturnCode ESR_SessionSetUint16_tIfEmpty(const LCHAR* name, asr_uint16_t value);
/**
* If the key does not exist in the session, calls SessionSetSize_t().
*
* @param name Property name
* @param value Property value
* @return ESR_OUT_OF_MEMORY if system is out of memory
*/
ESR_SHARED_API ESR_ReturnCode ESR_SessionSetSize_tIfEmpty(const LCHAR* name, size_t value);
/**
* If the key does not exist in the session, calls SessionSetFloat().
*
* @param name Property name
* @param value Property value
* @return ESR_OUT_OF_MEMORY if system is out of memory
*/
ESR_SHARED_API ESR_ReturnCode ESR_SessionSetFloatIfEmpty(const LCHAR* name, float value);
/**
* If the key does not exist in the session, calls SessionSetBool().
*
* @param name Property name
* @param value Property value
* @return ESR_OUT_OF_MEMORY if system is out of memory
*/
ESR_SHARED_API ESR_ReturnCode ESR_SessionSetBoolIfEmpty(const LCHAR* name, ESR_BOOL value);
/**
* If the key does not exist in the session, calls SessionSetLCHAR().
*
* @param name Property name
* @param value Property value
* @return ESR_OUT_OF_MEMORY if system is out of memory
*/
ESR_SHARED_API ESR_ReturnCode ESR_SessionSetLCHARIfEmpty(const LCHAR* name, LCHAR* value);
/**
* Removes property from session.
*
* @param name Property name
* @return ESR_OUT_OF_MEMORY if system is out of memory
*/
ESR_SHARED_API ESR_ReturnCode ESR_SessionRemoveProperty(const LCHAR* name);
/**
* Removes and deallocates property from session.
*
* @param name Property name
* @return ESR_OUT_OF_MEMORY if system is out of memory
*/
ESR_SHARED_API ESR_ReturnCode ESR_SessionRemoveAndFreeProperty(const LCHAR* name);
/**
* Destroys the system session.
*
* @return ESR_SUCCESS
*/
ESR_SHARED_API ESR_ReturnCode ESR_SessionDestroy(void);
/**
* Imports commandline arguments into the system session.
*
* Keys are imported as "cmdline.[name]" where [name] is the name of the command-line argument
* Values are set in char* format.
*
* For example, given the argument "-timer=5", the following key will be added to the session:
* ["cmdline.timer", "5"]
*
* Validation is left up to the application.
*
* If the session contains a key that is clobbered by the parser, the old [key, value]
* pair will be deallocated. For example, if the session contained
* ["cmdline.timer", "value"] before the aforementioned example occured, then the old
* [key, value] pair will be allocated by the parser.
*
* @param argc Number of arguments
* @param argv Argument values
* @return ESR_OUT_OF_MEMORY if the system is out of memory
*/
ESR_SHARED_API ESR_ReturnCode ESR_SessionImportCommandLine(int argc, LCHAR* argv[]);
/**
* Returns the number of elements in the session.
*
* @param size [out] Session size
* @return ESR_SUCCESS
*/
ESR_SHARED_API ESR_ReturnCode ESR_SessionGetSize(size_t* size);
/**
* Returns the key associated with the specified index.
*
* @param index Element index
* @param key [out] Key name
* @return ESR_ARGUMENT_OUT_OF_BOUNDS if index is out of bounds
*/
ESR_SHARED_API ESR_ReturnCode ESR_SessionGetKeyAtIndex(size_t index, LCHAR** key);
/**
* Convert the specified argument to int.
*
* @param key Property name
* @return ESR_INVALID_RESULT_TYPE if the property is not a LCHAR*; ESR_OUT_OF_MEMORY if system is out of memory;
* ESR_INVALID_ARGUMENT if property cannot be converted to int
*/
ESR_SHARED_API ESR_ReturnCode ESR_SessionConvertToInt(const LCHAR* key);
/**
* Convert the specified argument to int.
*
* @param key Property name
* @return ESR_INVALID_RESULT_TYPE if the property is not a LCHAR*; ESR_OUT_OF_MEMORY if system is out of memory;
* ESR_INVALID_ARGUMENT if property cannot be converted to asr_uint16_t
*/
ESR_SHARED_API ESR_ReturnCode ESR_SessionConvertToUint16_t(const LCHAR* key);
/**
* Convert the specified argument to size_t.
*
* @param key Property name
* @return ESR_INVALID_RESULT_TYPE if the property is not a LCHAR*; ESR_OUT_OF_MEMORY if system is out of memory;
* ESR_INVALID_ARGUMENT if property cannot be converted to size_t
*/
ESR_SHARED_API ESR_ReturnCode ESR_SessionConvertToSize_t(const LCHAR* key);
/**
* Convert the specified argument to float.
*
* @param key Property name
* @return ESR_INVALID_RESULT_TYPE if the property is not a LCHAR*; ESR_OUT_OF_MEMORY if system is out of memory;
* ESR_INVALID_ARGUMENT if property cannot be converted to float
*/
ESR_SHARED_API ESR_ReturnCode ESR_SessionConvertToFloat(const LCHAR* key);
/**
* Convert the specified argument to bool.
*
* @param key Property name
* @return ESR_INVALID_RESULT_TYPE if the property is not a LCHAR*; ESR_OUT_OF_MEMORY if system is out of memory;
* ESR_INVALID_ARGUMENT if property cannot be converted to bool
*/
ESR_SHARED_API ESR_ReturnCode ESR_SessionConvertToBool(const LCHAR* key);
/**
* Returns the type of a property value.
*
* @param name Property name
* @param type [out] Value type
* @return ESR_INVALID_ARGUMENT if property cannot be found
*/
ESR_SHARED_API ESR_ReturnCode ESR_SessionGetPropertyType(const LCHAR* name, VariableTypes* type);
/**
* Import PAR file into session.
*
* @param filename File to read session from
* @return ESR_OPEN_ERROR if file cannot be opened; ESR_READ_ERROR if file cannot be read;
* ESR_OUT_OF_MEMORY if system is out of memory
*/
ESR_SHARED_API ESR_ReturnCode ESR_SessionImportParFile(const LCHAR* filename);
/**
* Sets val to true if a session object exists (non-null), FALSE otherwise.
*
* @param val True if session is non-null, false otherwise
* @return ESR_SUCCESS
*/
ESR_SHARED_API ESR_ReturnCode ESR_SessionExists(ESR_BOOL* val);
/**
* Prefixes relative paths with the PAR-file base directory. If the path is not relative,
* it is not changed.
*
* @param path Path to be prefixed
* @param len Length of path argument. If the return code is ESR_BUFFER_OVERFLOW,
* the required length is returned in this variable.
* @return ESR_INVALID_ARGUMENT if path is null;
* ESR_NO_MATCH_ERROR if session property "parFile.baseDirectory" is undefined
*/
ESR_SHARED_API ESR_ReturnCode ESR_SessionPrefixWithBaseDirectory(LCHAR* path, size_t* len);
/**
* Adds an event-listener.
*
* @param self ESR_SessionType handle
* @param listener The event-listener to add
* @return ESR_OUT_OF_MEMORY if system is out of memory
*/
ESR_SHARED_API ESR_ReturnCode ESR_SessionAddListener(ESR_SessionType* self, ESR_SessionTypeListenerPair* listener);
/**
* Removes an event-listener.
*
* @param self ESR_SessionType handle
* @param listener The event-listener to remove
* @return ESR_SUCCESS
*/
ESR_SHARED_API ESR_ReturnCode ESR_SessionRemoveListener(ESR_SessionType* self, ESR_SessionTypeListenerPair* listener);
/**
* @}
*/
#endif /* __ESR_SESSION_H */