1 /*---------------------------------------------------------------------------* 2 * ESR_Session.c * 3 * * 4 * Copyright 2007, 2008 Nuance Communciations, Inc. * 5 * * 6 * Licensed under the Apache License, Version 2.0 (the 'License'); * 7 * you may not use this file except in compliance with the License. * 8 * * 9 * You may obtain a copy of the License at * 10 * http://www.apache.org/licenses/LICENSE-2.0 * 11 * * 12 * Unless required by applicable law or agreed to in writing, software * 13 * distributed under the License is distributed on an 'AS IS' BASIS, * 14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 15 * See the License for the specific language governing permissions and * 16 * limitations under the License. * 17 * * 18 *---------------------------------------------------------------------------*/ 19 20 21 #include "ESR_Session.h" 22 #include "ESR_SessionType.h" 23 #include "ESR_SessionTypeImpl.h" 24 #include <string.h> 25 #include "HashMap.h" 26 #include "IntArrayList.h" 27 #include "LCHAR.h" 28 #include "lstring.h" 29 #include "passert.h" 30 #include "plog.h" 31 #include "ptrd.h" 32 #include "pstdio.h" 33 34 static ESR_SessionType* ESR_Session = NULL; 35 #define CHECK_SESSION_OR_RETURN if(!ESR_Session) return ESR_INVALID_ARGUMENT 36 37 ESR_ReturnCode ESR_SessionCreate(const LCHAR* filename) 38 { 39 ESR_ReturnCode rc; 40 41 CHKLOG(rc, ESR_SessionTypeCreate(&ESR_Session)); 42 43 /* Initialize default values here */ 44 CHKLOG(rc, ESR_Session->setLCHAR(ESR_Session, L("cmdline.nametagPath"), L(""))); 45 #ifdef USE_THREAD 46 CHKLOG(rc, ESR_Session->setUint16_t(ESR_Session, L("thread.priority"), PtrdThreadNormalPriority)); 47 #endif 48 49 /* End of default values */ 50 CHKLOG(rc, ESR_Session->importParFile(ESR_Session, filename)); 51 return ESR_SUCCESS; 52 CLEANUP: 53 ESR_SessionDestroy(); 54 return rc; 55 } 56 57 ESR_ReturnCode ESR_SessionGetProperty(const LCHAR* name, void** value, VariableTypes type) 58 { 59 CHECK_SESSION_OR_RETURN; 60 return ESR_Session->getProperty(ESR_Session, name, value, type); 61 } 62 63 ESR_SHARED_API ESR_ReturnCode ESR_SessionGetInt(const LCHAR* name, int* value) 64 { 65 CHECK_SESSION_OR_RETURN; 66 return ESR_Session->getInt(ESR_Session, name, value); 67 } 68 69 ESR_SHARED_API ESR_ReturnCode ESR_SessionGetUint16_t(const LCHAR* name, asr_uint16_t* value) 70 { 71 CHECK_SESSION_OR_RETURN; 72 return ESR_Session->getUint16_t(ESR_Session, name, value); 73 } 74 75 ESR_SHARED_API ESR_ReturnCode ESR_SessionGetSize_t(const LCHAR* name, 76 size_t* value) 77 { 78 CHECK_SESSION_OR_RETURN; 79 return ESR_Session->getSize_t(ESR_Session, name, value); 80 } 81 82 ESR_SHARED_API ESR_ReturnCode ESR_SessionGetFloat(const LCHAR* name, float* value) 83 { 84 CHECK_SESSION_OR_RETURN; 85 return ESR_Session->getFloat(ESR_Session, name, value); 86 } 87 88 ESR_SHARED_API ESR_ReturnCode ESR_SessionGetBool(const LCHAR* name, ESR_BOOL* value) 89 { 90 CHECK_SESSION_OR_RETURN; 91 return ESR_Session->getBool(ESR_Session, name, value); 92 } 93 94 ESR_SHARED_API ESR_ReturnCode ESR_SessionGetLCHAR(const LCHAR* name, LCHAR* value, size_t* len) 95 { 96 CHECK_SESSION_OR_RETURN; 97 return ESR_Session->getLCHAR(ESR_Session, name, value, len); 98 } 99 100 ESR_ReturnCode ESR_SessionContains(const LCHAR* name, ESR_BOOL* exists) 101 { 102 CHECK_SESSION_OR_RETURN; 103 return ESR_Session->contains(ESR_Session, name, exists); 104 } 105 106 ESR_ReturnCode ESR_SessionSetProperty(const LCHAR* name, void* value, VariableTypes type) 107 { 108 CHECK_SESSION_OR_RETURN; 109 return ESR_Session->setProperty(ESR_Session, name, value, type); 110 } 111 112 ESR_ReturnCode ESR_SessionSetInt(const LCHAR* name, int value) 113 { 114 CHECK_SESSION_OR_RETURN; 115 return ESR_Session->setInt(ESR_Session, name, value); 116 } 117 118 ESR_ReturnCode ESR_SessionSetUint16_t(const LCHAR* name, asr_uint16_t value) 119 { 120 CHECK_SESSION_OR_RETURN; 121 return ESR_Session->setUint16_t(ESR_Session, name, value); 122 } 123 124 ESR_ReturnCode ESR_SessionSetSize_t(const LCHAR* name, size_t value) 125 { 126 CHECK_SESSION_OR_RETURN; 127 return ESR_Session->setSize_t(ESR_Session, name, value); 128 } 129 130 ESR_ReturnCode ESR_SessionSetFloat(const LCHAR* name, float value) 131 { 132 CHECK_SESSION_OR_RETURN; 133 return ESR_Session->setFloat(ESR_Session, name, value); 134 } 135 136 ESR_ReturnCode ESR_SessionSetBool(const LCHAR* name, ESR_BOOL value) 137 { 138 CHECK_SESSION_OR_RETURN; 139 return ESR_Session->setBool(ESR_Session, name, value); 140 } 141 142 ESR_ReturnCode ESR_SessionSetLCHAR(const LCHAR* name, LCHAR* value) 143 { 144 CHECK_SESSION_OR_RETURN; 145 return ESR_Session->setLCHAR(ESR_Session, name, value); 146 } 147 148 ESR_ReturnCode ESR_SessionSetIntIfEmpty(const LCHAR* name, int value) 149 { 150 CHECK_SESSION_OR_RETURN; 151 return ESR_Session->setIntIfEmpty(ESR_Session, name, value); 152 } 153 154 ESR_ReturnCode ESR_SessionSetUint16_tIfEmpty(const LCHAR* name, asr_uint16_t value) 155 { 156 CHECK_SESSION_OR_RETURN; 157 return ESR_Session->setUint16_tIfEmpty(ESR_Session, name, value); 158 } 159 160 ESR_ReturnCode ESR_SessionSetSize_tIfEmpty(const LCHAR* name, size_t value) 161 { 162 CHECK_SESSION_OR_RETURN; 163 return ESR_Session->setSize_tIfEmpty(ESR_Session, name, value); 164 } 165 166 ESR_ReturnCode ESR_SessionSetFloatIfEmpty(const LCHAR* name, float value) 167 { 168 CHECK_SESSION_OR_RETURN; 169 return ESR_Session->setFloatIfEmpty(ESR_Session, name, value); 170 } 171 172 ESR_ReturnCode ESR_SessionSetBoolIfEmpty(const LCHAR* name, ESR_BOOL value) 173 { 174 CHECK_SESSION_OR_RETURN; 175 return ESR_Session->setBoolIfEmpty(ESR_Session, name, value); 176 } 177 178 ESR_ReturnCode ESR_SessionSetLCHARIfEmpty(const LCHAR* name, LCHAR* value) 179 { 180 CHECK_SESSION_OR_RETURN; 181 return ESR_Session->setLCHARIfEmpty(ESR_Session, name, value); 182 } 183 184 ESR_ReturnCode ESR_SessionRemoveProperty(const LCHAR* name) 185 { 186 CHECK_SESSION_OR_RETURN; 187 return ESR_Session->removeProperty(ESR_Session, name); 188 } 189 190 ESR_ReturnCode ESR_SessionRemoveAndFreeProperty(const LCHAR* name) 191 { 192 CHECK_SESSION_OR_RETURN; 193 return ESR_Session->removeAndFreeProperty(ESR_Session, name); 194 } 195 196 ESR_ReturnCode ESR_SessionImportCommandLine(int argc, LCHAR* argv[]) 197 { 198 CHECK_SESSION_OR_RETURN; 199 return ESR_Session->importCommandLine(ESR_Session, argc, argv); 200 } 201 202 ESR_ReturnCode ESR_SessionGetSize(size_t* size) 203 { 204 CHECK_SESSION_OR_RETURN; 205 return ESR_Session->getSize(ESR_Session, size); 206 } 207 208 ESR_ReturnCode ESR_SessionGetKeyAtIndex(size_t index, LCHAR** key) 209 { 210 CHECK_SESSION_OR_RETURN; 211 return ESR_Session->getKeyAtIndex(ESR_Session, index, key); 212 } 213 214 ESR_ReturnCode ESR_SessionConvertToInt(const LCHAR* key) 215 { 216 CHECK_SESSION_OR_RETURN; 217 return ESR_Session->convertToInt(ESR_Session, key); 218 } 219 220 ESR_ReturnCode ESR_SessionConvertToUint16_t(const LCHAR* key) 221 { 222 CHECK_SESSION_OR_RETURN; 223 return ESR_Session->convertToUint16_t(ESR_Session, key); 224 } 225 226 ESR_ReturnCode ESR_SessionConvertToSize_t(const LCHAR* key) 227 { 228 CHECK_SESSION_OR_RETURN; 229 return ESR_Session->convertToSize_t(ESR_Session, key); 230 } 231 232 ESR_ReturnCode ESR_SessionConvertToFloat(const LCHAR* key) 233 { 234 CHECK_SESSION_OR_RETURN; 235 return ESR_Session->convertToFloat(ESR_Session, key); 236 } 237 238 ESR_ReturnCode ESR_SessionConvertToBool(const LCHAR* key) 239 { 240 CHECK_SESSION_OR_RETURN; 241 return ESR_Session->convertToBool(ESR_Session, key); 242 } 243 244 ESR_ReturnCode ESR_SessionGetPropertyType(const LCHAR* name, VariableTypes* type) 245 { 246 CHECK_SESSION_OR_RETURN; 247 return ESR_Session->getPropertyType(ESR_Session, name, type); 248 } 249 250 ESR_ReturnCode ESR_SessionImportParFile(const LCHAR* filename) 251 { 252 CHECK_SESSION_OR_RETURN; 253 return ESR_Session->importParFile(ESR_Session, filename); 254 } 255 256 ESR_ReturnCode ESR_SessionDestroy() 257 { 258 ESR_ReturnCode rc; 259 260 if (ESR_Session != NULL) 261 { 262 CHKLOG(rc, ESR_Session->destroy(ESR_Session)); 263 ESR_Session = NULL; 264 } 265 return ESR_SUCCESS; 266 CLEANUP: 267 return rc; 268 } 269 270 ESR_ReturnCode ESR_SessionExists(ESR_BOOL* val) 271 { 272 *val = (ESR_Session != NULL); 273 return ESR_SUCCESS; 274 } 275 276 ESR_ReturnCode ESR_SessionPrefixWithBaseDirectory(LCHAR* path, size_t* len) 277 { 278 ESR_ReturnCode rc; 279 LCHAR baseDirectory[P_PATH_MAX]; 280 ESR_BOOL isAbsolute; 281 size_t len2 = P_PATH_MAX; 282 283 /* Skip absolute paths. */ 284 CHKLOG(rc, pf_convert_backslashes_to_forwardslashes (path)); 285 CHKLOG(rc, pf_is_path_absolute (path, &isAbsolute)); 286 if (isAbsolute) 287 return ESR_SUCCESS; 288 289 CHKLOG(rc, ESR_SessionGetLCHAR(L("parFile.baseDirectory"), baseDirectory, &len2)); 290 CHKLOG(rc, lstrinsert(baseDirectory, path, 0, len)); 291 return ESR_SUCCESS; 292 CLEANUP: 293 return rc; 294 } 295 296 ESR_SHARED_API ESR_ReturnCode ESR_SessionAddListener(ESR_SessionType* self, ESR_SessionTypeListenerPair* listener) 297 { 298 CHECK_SESSION_OR_RETURN; 299 return ESR_Session->addListener(ESR_Session, listener); 300 } 301 302 ESR_SHARED_API ESR_ReturnCode ESR_SessionRemoveListener(ESR_SessionType* self, ESR_SessionTypeListenerPair* listener) 303 { 304 CHECK_SESSION_OR_RETURN; 305 return ESR_Session->removeListener(ESR_Session, listener); 306 } 307