14a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/*---------------------------------------------------------------------------* 24a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * SR_GrammarImpl.c * 34a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * * 44a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * Copyright 2007, 2008 Nuance Communciations, Inc. * 54a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * * 64a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the 'License'); * 74a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * you may not use this file except in compliance with the License. * 84a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * * 94a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * You may obtain a copy of the License at * 104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 * 114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * * 124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * Unless required by applicable law or agreed to in writing, software * 134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * distributed under the License is distributed on an 'AS IS' BASIS, * 144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * See the License for the specific language governing permissions and * 164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * limitations under the License. * 174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * * 184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *---------------------------------------------------------------------------*/ 194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "ESR_Session.h" 214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "SR_AcousticModels.h" 224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "SR_AcousticModelsImpl.h" 234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "SR_Grammar.h" 244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "SR_GrammarImpl.h" 254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "SR_SemanticGraphImpl.h" 264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "SR_SemanticProcessorImpl.h" 274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "SR_VocabularyImpl.h" 284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "SR_NametagImpl.h" 294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "passert.h" 304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "plog.h" 314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "pmemory.h" 324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define MTAG NULL 344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode SR_Grammar_Create(SR_Grammar** self) 364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project SR_GrammarImpl* impl; 384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ESR_ReturnCode rc; 394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ESR_BOOL exists; 404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project impl = NEW(SR_GrammarImpl, MTAG); 424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (impl == NULL) 434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PLogError(L("ESR_OUT_OF_MEMORY")); 454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ESR_OUT_OF_MEMORY; 464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project impl->Interface.addNametagToSlot = &SR_Grammar_AddNametagToSlot; 494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project impl->Interface.addWordToSlot = &SR_Grammar_AddWordToSlot; 504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project impl->Interface.checkParse = &SR_Grammar_CheckParse; 514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project impl->Interface.compile = &SR_Grammar_Compile; 524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project impl->Interface.destroy = &SR_Grammar_Destroy; 534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project impl->Interface.getParameter = &SR_Grammar_GetParameter; 544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project impl->Interface.getSize_tParameter = &SR_Grammar_GetSize_tParameter; 554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project impl->Interface.resetAllSlots = &SR_Grammar_ResetAllSlots; 564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project impl->Interface.save = &SR_Grammar_Save; 574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project impl->Interface.setDispatchFunction = &SR_Grammar_SetDispatchFunction; 584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project impl->Interface.setParameter = &SR_Grammar_SetParameter; 594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project impl->Interface.setSize_tParameter = &SR_Grammar_SetSize_tParameter; 604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project impl->Interface.setupRecognizer = &SR_Grammar_SetupRecognizer; 614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project impl->Interface.unsetupRecognizer = &SR_Grammar_UnsetupRecognizer; 624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project impl->Interface.setupVocabulary = &SR_Grammar_SetupVocabulary; 634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project impl->syntax = NULL; 644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project impl->recognizer = NULL; 654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project impl->vocabulary = NULL; 664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project impl->eventLog = NULL; 674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project impl->logLevel = 0; 684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project impl->isActivated = ESR_FALSE; 694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CHKLOG(rc, ESR_SessionTypeCreate(&impl->parameters)); 714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /** 734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * Create the Semantic Graph and Processor to support CheckParse function 744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * (Since this function gets called by 'New', a semgraph and semproc are always 754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * created when the grammar is created) 764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project */ 774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rc = SR_SemanticGraphCreate(&impl->semgraph); 784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (rc != ESR_SUCCESS) 794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PLogError(ESR_rc2str(rc)); 814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project goto CLEANUP; 824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rc = SR_SemanticProcessorCreate(&impl->semproc); 854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (rc != ESR_SUCCESS) 864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PLogError(ESR_rc2str(rc)); 884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project goto CLEANUP; 894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CHKLOG(rc, ESR_SessionExists(&exists)); 924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (exists) 934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rc = ESR_SessionGetProperty(L("eventlog"), (void **)&impl->eventLog, TYPES_SR_EVENTLOG); 954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (rc != ESR_NO_MATCH_ERROR && rc != ESR_SUCCESS) 964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PLogError(ESR_rc2str(rc)); 984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project goto CLEANUP; 994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 1004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rc = ESR_SessionGetSize_t(L("SREC.Recognizer.osi_log_level"), &impl->logLevel); 1014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (rc != ESR_NO_MATCH_ERROR && rc != ESR_SUCCESS) 1024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 1034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PLogError(ESR_rc2str(rc)); 1044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project goto CLEANUP; 1054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 1064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 1074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *self = (SR_Grammar*) impl; 1094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ESR_SUCCESS; 1104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectCLEANUP: 1114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project FREE(impl); 1124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return rc; 1134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 1144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode SR_GrammarCreate(SR_Grammar** self) 1164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 1174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ESR_ReturnCode rc; 1184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (self == NULL) 1204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 1214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PLogError(L("ESR_OUT_OF_MEMORY")); 1224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ESR_OUT_OF_MEMORY; 1234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 1244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CHKLOG(rc, SR_Grammar_Create(self)); 1254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ESR_SUCCESS; 1264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectCLEANUP: 1274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return rc; 1284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 1294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode SR_Grammar_Compile(SR_Grammar* self) 1314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 1324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project SR_GrammarImpl* impl = (SR_GrammarImpl*) self; 1334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (!CA_CompileSyntax(impl->syntax)) 1354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ESR_SUCCESS; 1364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PLogError(L("ESR_FATAL_ERROR")); 1374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ESR_FATAL_ERROR; 1384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 1394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/* 1414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * The buffer for the pron is set very large because the real size is lost later on 1424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * and all that is checked is whether a single phoneme will fit in the buffer. There 1434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * is no concept of decrementing the bytes left. Because that code is one big monolithic 1444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * piece of crap, it is very difficult to fix correctly. This kludge is appropriate 1454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * because we don't have time to fix this correctly and there are probably dozens of 1464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * similar problems in other parts of the code. 1474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project */ 1484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode SR_Grammar_AddWordToSlot(SR_Grammar* self, const LCHAR* slot, const LCHAR* word, 1504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project const LCHAR* pronunciation, int weight, const LCHAR* tag) 1514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 1524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project SR_GrammarImpl* impl = (SR_GrammarImpl*) self; 1534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project SR_Vocabulary* vocab; 1544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project LCHAR buffer[4096]; 1554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project const LCHAR* input_pronunciation = pronunciation; 1564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project size_t len = 4096; 1574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ESR_ReturnCode rc = ESR_SUCCESS, logrc; 1584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int ca_rc = -99; 1594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if ( slot != NULL ) 1614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 1624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if ( strlen ( slot ) >= MAX_STRING_LEN ) 1634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 1644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PLogError ( "SR_Grammar_AddWordToSlot slot : %s too long : Max %d", slot, MAX_STRING_LEN - 1 ); 1654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ( ESR_INVALID_ARGUMENT ); 1664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 1674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 1684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if ( word != NULL ) 1694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 1704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if ( strlen ( word ) >= MAX_STRING_LEN ) 1714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 1724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PLogError ( "SR_Grammar_AddWordToSlot word : %s too long : Max %d", word, MAX_STRING_LEN - 1 ); 1734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ( ESR_INVALID_ARGUMENT ); 1744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 1754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 1764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if ( pronunciation != NULL ) 1774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 1784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if ( strlen ( pronunciation ) >= MAX_STRING_LEN ) 1794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 1804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PLogError ( "SR_Grammar_AddWordToSlot pronunciation : %s too long : Max %d", pronunciation, MAX_STRING_LEN - 1 ); 1814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ( ESR_INVALID_ARGUMENT ); 1824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 1834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 1844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if ( tag != NULL ) 1854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 1864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if ( strlen ( tag ) >= MAX_STRING_LEN ) 1874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 1884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PLogError ( "SR_Grammar_AddWordToSlot tag : %s too long : Max %d", tag, MAX_STRING_LEN - 1 ); 1894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ( ESR_INVALID_ARGUMENT ); 1904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 1914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 1924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if 0 1934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* make sure to have the latest arbdata to add words, however since 1944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project the arbdata is known to be constant for all acoustic models we 1954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project have (ie for the different sample rates), then there is no need 1964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project to do this, it slows down addition anyways */ 1974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CA_Arbdata* ca_arbdata; 1984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project SR_AcousticModels* models; 1994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project impl->recognizer->getModels( impl->recognizer, &models); 2004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ca_arbdata = models->GetArbdata(models); 2014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CA_AttachArbdataToSyntax( impl->syntax , ca_arbdata); 2024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif 2034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* yw HACK: Xanavi's application has bug. remove this check to let it work */ 2054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* TODO: add this word to the semantic graph with associated script tag */ 2064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (impl->vocabulary == NULL) 2074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 2084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PLogError(L("ESR_INVALID_STATE")); 2094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ESR_INVALID_STATE; 2104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 2114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* tag may be NULL which means no script (no-op denoted by a simple semi-colon) */ 2134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (!tag || !*tag) 2144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project tag = L(";"); 2154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (!pronunciation || !(*pronunciation) || !LSTRCMP(pronunciation, L("NULL"))) 2174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 2184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project vocab = (SR_Vocabulary*) impl->vocabulary; 2194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CHKLOG(rc, vocab->getPronunciation(vocab, word, buffer, &len)); 2204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project pronunciation = buffer; 2214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 2224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* 2244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * 'buffer' contains a list of null-terminated pronunciations. 2254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * Two consecutive null characters denote the end of the list. 2264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * 2274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * (In theory yes, but right now, only one pron is supported) 2284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project */ 2294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (impl->eventLog != NULL) 2304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 2314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CHKLOG(logrc, SR_EventLogTokenInt_BASIC(impl->eventLog, impl->logLevel, L("igrm"), (int)impl)); 2324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CHKLOG(logrc, SR_EventLogToken_BASIC(impl->eventLog, impl->logLevel, L("SLOT"), slot)); 2334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CHKLOG(logrc, SR_EventLogToken_BASIC(impl->eventLog, impl->logLevel, L("WORD"), word)); 2344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (input_pronunciation) 2354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CHKLOG(logrc, SR_EventLogToken_BASIC(impl->eventLog, impl->logLevel, L("PRON"), pronunciation)); 2364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project else 2374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CHKLOG(logrc, SR_EventLogToken_BASIC(impl->eventLog, impl->logLevel, L("GPRON"), pronunciation)); 2384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CHKLOG(logrc, SR_EventLogTokenInt_BASIC(impl->eventLog, impl->logLevel, L("WEIGHT"), weight)); 2394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CHKLOG(logrc, SR_EventLogToken_BASIC(impl->eventLog, impl->logLevel, L("TAG"), tag)); 2404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 2414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* add word to syntax first */ 2434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* 2444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * 2454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * if word already exists and pron is same (i.e. as if no action) returns FST_SUCCESS 2464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * if word already exists and pron is different (e.g. read-rEd and read-red) returns FST_SUCCESS 2474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * if word does not exist and no duplicate pron exists (homonyms not supported) returns FST_SUCCESS 2484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * else FST_FAILED 2494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project */ 2504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ca_rc = CA_AddWordToSyntax(impl->syntax, slot, word, pronunciation, weight); 2514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project switch (ca_rc) 2524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 2534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project case FST_SUCCESS: 2544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* successful, now add word & tag to semgraph */ 2554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CHKLOG(rc, impl->semgraph->addWordToSlot(impl->semgraph, slot, word, tag, 1)); 2564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project break; 2574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project case FST_SUCCESS_ON_OLD_WORD: 2584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project case FST_FAILED_ON_HOMOGRAPH: 2594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* successful, now add word & tag to semgraph */ 2604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CHKLOG(rc, impl->semgraph->addWordToSlot(impl->semgraph, slot, word, tag, 0)); 2614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project break; 2624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project case FST_FAILED_ON_MEMORY: 2634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rc = ESR_OUT_OF_MEMORY; 2644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PLogError(ESR_rc2str(rc)); 2654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project goto CLEANUP; 2664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project case FST_FAILED_ON_INVALID_ARGS: 2674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rc = ESR_INVALID_ARGUMENT; 2684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PLogError(ESR_rc2str(rc)); 2694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project goto CLEANUP; 2704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project case FST_FAILED_ON_HOMONYM: 2714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rc = ESR_NOT_SUPPORTED; 2724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* remove this message from product */ 2734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if !defined(NDEBUG) || defined(_WIN32) 2744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PLogError(L("%s: Homonym '%s' could not be added"), ESR_rc2str(rc), word); 2754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif 2764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project goto CLEANUP; 2774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project default: 2784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rc = ESR_INVALID_STATE; 2794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PLogError(L("%s|%s|%s|ca_rc=%d"), word, pronunciation, ESR_rc2str(rc), ca_rc); 2804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project goto CLEANUP; 2814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 2824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (impl->eventLog != NULL && (impl->logLevel & OSI_LOG_LEVEL_ADDWD)) 2844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 2854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CHKLOG(logrc, SR_EventLogTokenInt_BASIC(impl->eventLog, impl->logLevel, L("caRC"), (int) ca_rc)); 2864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CHKLOG(logrc, SR_EventLogToken_BASIC(impl->eventLog, impl->logLevel, L("RSLT"), L("ok"))); 2874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CHKLOG(logrc, SR_EventLogEvent_BASIC(impl->eventLog, impl->logLevel, L("ESRaddWd"))); 2884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 2894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return rc; 2904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectCLEANUP: 2914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PLogError(L("failed on |%s|%s|%s|\n"), slot, word, pronunciation); 2924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (impl->eventLog != NULL && (impl->logLevel & OSI_LOG_LEVEL_ADDWD)) 2934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 2944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CHKLOG(logrc, SR_EventLogTokenInt_BASIC(impl->eventLog, impl->logLevel, L("caRC"), (int) ca_rc)); 2954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CHKLOG(logrc, SR_EventLogToken_BASIC(impl->eventLog, impl->logLevel, L("RSLT"), L("err1"))); 2964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CHKLOG(logrc, SR_EventLogEvent_BASIC(impl->eventLog, impl->logLevel, L("ESRaddWd"))); 2974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 2984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return rc; 2994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 3004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode SR_Grammar_ResetAllSlots(SR_Grammar* self) 3024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 3034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ESR_ReturnCode rc, logrc; 3044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int irc; 3054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project SR_GrammarImpl* impl = (SR_GrammarImpl*) self; 3064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rc = impl->semgraph->reset(impl->semgraph); 3084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (rc == ESR_SUCCESS) 3094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 3104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project irc = CA_ResetSyntax(impl->syntax); 3114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rc = irc ? ESR_INVALID_STATE : ESR_SUCCESS; 3124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 3134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (impl->eventLog != NULL) 3154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 3164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CHKLOG(rc, SR_EventLogTokenInt_BASIC(impl->eventLog, impl->logLevel, L("igrm"), (int)impl)); 3174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (rc == ESR_SUCCESS) 3184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CHKLOG(logrc, SR_EventLogToken_BASIC(impl->eventLog, impl->logLevel, L("RSLT"), L("ok"))); 3194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project else 3204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CHKLOG(logrc, SR_EventLogToken_BASIC(impl->eventLog, impl->logLevel, L("RSLT"), L("fail"))); 3214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CHKLOG(logrc, SR_EventLogEvent_BASIC(impl->eventLog, impl->logLevel, L("ESRrstSlot"))); 3224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 3234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ESR_SUCCESS; 3244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectCLEANUP: 3254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return rc; 3264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 3274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode SR_Grammar_AddNametagToSlot(SR_Grammar* self, const LCHAR* slot, 3294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project const SR_Nametag* nametag, int weight, const LCHAR* tag) 3304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 3314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project SR_NametagImpl* nametagImpl = (SR_NametagImpl*) nametag; 3324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ESR_ReturnCode rc; 3334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CHKLOG(rc, self->addWordToSlot(self, slot, nametagImpl->id, nametagImpl->value, weight, tag)); 3354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ESR_SUCCESS; 3364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectCLEANUP: 3374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return rc; 3384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 3394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode SR_Grammar_SetDispatchFunction(SR_Grammar* self, const LCHAR* functionName, void* userData, SR_GrammarDispatchFunction function) 3414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 3424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project SR_GrammarImpl* impl = (SR_GrammarImpl*) self; 3434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ESR_ReturnCode rc; 3444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project SR_SemanticProcessorImpl* semprocImpl = (SR_SemanticProcessorImpl*) impl->semproc; 3454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CHKLOG(rc, EP_RegisterFunction(semprocImpl->parser, functionName, userData, function)); 3474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ESR_SUCCESS; 3484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectCLEANUP: 3494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return rc; 3504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 3514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode SR_GrammarLoad(const LCHAR* grammar, SR_Grammar** self) 3534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 3544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project SR_Grammar* Interface = NULL; 3554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project SR_GrammarImpl* impl; 3564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project LCHAR* tok; 3574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ESR_ReturnCode rc; 3584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project LCHAR filename[P_PATH_MAX]; 3594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int addWords; 3604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (self == NULL) 3634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 3644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PLogError(L("ESR_INVALID_ARGUMENT")); 3654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ESR_INVALID_ARGUMENT; 3664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 3674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CHKLOG(rc, SR_Grammar_Create(&Interface)); 3684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project impl = (SR_GrammarImpl*) Interface; 3694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /** 3714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * Our filename (referring to the grammar to load, may have associated grammar properties 3724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * appended to the end of it. We need to split up the properties from the filename 3734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * example: 3744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * recog_nm/namesnnumsSC_dyn,addWords=2000 becomes 3754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * filename: recog_nm/namesnnumsSC_dyn 3764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * property: addWords=2000 3774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project */ 3784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* init */ 3804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project LSTRCPY(filename, grammar); 3814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project addWords = 0; 3824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project for (tok = strtok(filename, ","); tok; tok = strtok(NULL, ",")) 3844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 3854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (LSTRSTR(tok, "addWords")) 3864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 3874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project addWords = atoi(LSTRCHR(tok, L('=')) + sizeof(LCHAR)); 3884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 3894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project else if (tok != filename) 3904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 3914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PLogError(L("UNKNOWN grammar load property %s"), tok); 3924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rc = ESR_INVALID_STATE; 3934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project goto CLEANUP; 3944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 3954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 3964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /** 3984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * Based on the filename, determine if you are loading from image or loading from text files. 3994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * If from image, then the filename will have extension .g2g. If from file, then only a basename 4004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * will be provided (i.e. without extension) 4014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project */ 4024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 4034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project impl->syntax = CA_AllocateSyntax(); 4044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (impl->syntax == NULL) 4054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 4064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rc = ESR_OUT_OF_MEMORY; 4074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project goto CLEANUP; 4084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 4094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 4104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (LSTRSTR(filename, L(".g2g"))) 4114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 4124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* if the filename ends with .g2g, then we have a binary image */ 4134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (CA_LoadSyntaxFromImage(impl->syntax, (LCHAR*) filename)) 4144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 4154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rc = ESR_READ_ERROR; 4164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PLogError(L("ESR_READ_ERROR: Problem loading syntax from image")); 4174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project goto CLEANUP; 4184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 4194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 4204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project else 4214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 4224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (CA_LoadSyntaxAsExtensible(impl->syntax, (LCHAR*) filename, addWords)) 4234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 4244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rc = ESR_READ_ERROR; 4254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PLogError(L("ESR_READ_ERROR: Problem loading syntax from text")); 4264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project goto CLEANUP; 4274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 4284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 4294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 4304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* 4314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * Semantic Graph Loading 4324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * 4334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * - it was already created in Grammar_Create() 4344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * - reuse the same input labels from the recognition context 4354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * - load knows how to load from base filename or .g2g image 4364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project */ 4374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rc = impl->semgraph->load(impl->semgraph, impl->syntax->synx->olabels, filename, addWords); 4384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (rc != ESR_SUCCESS) 4394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 4404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PLogError(L("%s: loading semgraph from image %s"), ESR_rc2str(rc), filename); 4414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project impl->semgraph = NULL; 4424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project goto CLEANUP; 4434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 4444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 4454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *self = Interface; 4464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (impl->eventLog) 4474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 4484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CHKLOG(rc, SR_EventLogTokenInt_BASIC(impl->eventLog, impl->logLevel, L("igrm"), (int)impl)); 4494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CHKLOG(rc, SR_EventLogToken_BASIC(impl->eventLog, impl->logLevel, L("name"), filename)); 4504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CHKLOG(rc, SR_EventLogEvent_BASIC(impl->eventLog, impl->logLevel, L("ESRldgrm"))); 4514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 4524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 4534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ESR_SUCCESS; 4544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectCLEANUP: 4554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (Interface != NULL) 4564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project Interface->destroy(Interface); 4574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *self = NULL; 4584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return rc; 4594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 4604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 4614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode SR_Grammar_Save(SR_Grammar* self, const LCHAR* filename) 4624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 4634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project SR_GrammarImpl* impl = (SR_GrammarImpl*) self; 4644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int version_number = 2; 4654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 4664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (filename == NULL) 4674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 4684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PLogError(L("ESR_INVALID_ARGUMENT")); 4694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ESR_INVALID_ARGUMENT; 4704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 4714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (CA_DumpSyntaxAsImage(impl->syntax, filename, version_number)) /* returns 1 on failure */ 4724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 4734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PLogError(L("ESR_INVALID_ARGUMENT")); 4744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ESR_INVALID_STATE; 4754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 4764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (SR_SemanticGraph_Save(impl->semgraph, filename, version_number) != ESR_SUCCESS) 4774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 4784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PLogError(L("ESR_INVALID_ARGUMENT")); 4794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ESR_INVALID_STATE; 4804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 4814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 4824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ESR_SUCCESS; 4834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 4844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 4854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode SR_Grammar_SetParameter(SR_Grammar* self, const LCHAR* key, void* value) 4864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 4874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /*TODO: complete with logging*/ 4884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ESR_NOT_IMPLEMENTED; 4894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 4904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 4914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode SR_Grammar_SetSize_tParameter(SR_Grammar* self, const LCHAR* key, size_t value) 4924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 4934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project SR_GrammarImpl* impl = (SR_GrammarImpl*) self; 4944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project size_t temp; 4954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ESR_ReturnCode rc; 4964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 4974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rc = impl->parameters->getSize_t(impl->parameters, key, &temp); 4984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (rc == ESR_SUCCESS) 4994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 5004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (temp == value) 5014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ESR_SUCCESS; 5024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CHKLOG(rc, impl->parameters->removeAndFreeProperty(impl->parameters, key)); 5034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 5044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project else if (rc != ESR_NO_MATCH_ERROR) 5054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return rc; 5064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 5074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CHKLOG(rc, impl->parameters->setSize_t(impl->parameters, key, value)); 5084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ESR_SUCCESS; 5094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectCLEANUP: 5104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return rc; 5114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 5124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 5134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode SR_Grammar_GetParameter(SR_Grammar* self, const LCHAR* key, void** value) 5144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 5154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 5164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /*TODO: complete with logging*/ 5174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ESR_NOT_IMPLEMENTED; 5184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 5194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 5204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode SR_Grammar_GetSize_tParameter(SR_Grammar* self, const LCHAR* key, size_t* value) 5214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 5224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project SR_GrammarImpl* impl = (SR_GrammarImpl*) self; 5234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ESR_ReturnCode rc; 5244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 5254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (!LSTRCMP(key, "locale")) 5264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 5274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ESR_Locale locale; 5284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rc = SR_VocabularyGetLanguage(impl->vocabulary, &locale); 5294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (rc != ESR_SUCCESS) 5304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return rc; 5314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 5324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *value = locale; 5334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ESR_SUCCESS; 5344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 5354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project else 5364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 5374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rc = impl->parameters->getSize_t(impl->parameters, key, value); 5384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (rc == ESR_NO_MATCH_ERROR) 5394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 5404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CHKLOG(rc, ESR_SessionGetSize_t(key, value)); 5414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ESR_SUCCESS; 5424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 5434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (rc != ESR_SUCCESS) 5444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 5454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PLogError(ESR_rc2str(rc)); 5464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return rc; 5474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 5484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ESR_SUCCESS; 5494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 5504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectCLEANUP: 5514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return rc; 5524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 5534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 5544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode SR_Grammar_Destroy(SR_Grammar* self) 5554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 5564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project SR_GrammarImpl* impl = (SR_GrammarImpl*) self; 5574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ESR_ReturnCode rc; 5584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 5594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (impl->parameters != NULL) 5604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 5614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CHKLOG(rc, impl->parameters->destroy(impl->parameters)); 5624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project impl->parameters = NULL; 5634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 5644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 5654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (impl->syntax != NULL) 5664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 5674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CA_FreeSyntax(impl->syntax); 5684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project impl->syntax = NULL; 5694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 5704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 5714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (impl->semgraph != NULL) 5724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 5734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CHKLOG(rc, impl->semgraph->unload(impl->semgraph)); 5744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CHKLOG(rc, impl->semgraph->destroy(impl->semgraph)); 5754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project impl->semgraph = NULL; 5764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 5774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 5784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (impl->semproc != NULL) 5794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 5804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CHKLOG(rc, impl->semproc->destroy(impl->semproc)); 5814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project impl->semproc = NULL; 5824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 5834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 5844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (impl->eventLog) 5854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 5864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CHKLOG(rc, SR_EventLogTokenInt_BASIC(impl->eventLog, impl->logLevel, L("igrm"), (int)impl)); 5874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CHKLOG(rc, SR_EventLogEvent_BASIC(impl->eventLog, impl->logLevel, L("ESRklgrm"))); 5884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 5894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 5904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project FREE(self); 5914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ESR_SUCCESS; 5924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectCLEANUP: 5934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return rc; 5944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 5954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 5964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode SR_Grammar_SetupRecognizer(SR_Grammar* self, SR_Recognizer* recognizer) 5974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 5984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ESR_ReturnCode rc; 5994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project SR_GrammarImpl* impl = (SR_GrammarImpl*) self; 6004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CA_Arbdata* ca_arbdata; 6014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project SR_AcousticModels* models = NULL; 6024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 6034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (impl == NULL || recognizer == NULL) 6044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 6054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PLogError(L("ESR_INVALID_ARGUMENT")); 6064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ESR_INVALID_ARGUMENT; 6074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 6084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project impl->recognizer = recognizer; 6094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project recognizer->setWordAdditionCeiling( recognizer, self); 6104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 6114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rc = recognizer->getModels( recognizer, &models); 6124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if(rc != ESR_SUCCESS || models == NULL) { 6134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project impl->recognizer = NULL; 6144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CA_AttachArbdataToSyntax( impl->syntax, NULL); 6154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ESR_INVALID_STATE; 6164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 6174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ca_arbdata = (CA_Arbdata*)(models->getArbdata( models)); 6184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rc = CA_AttachArbdataToSyntax( impl->syntax, ca_arbdata); 6194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if(rc != 0) 6204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ESR_INVALID_STATE; 6214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ESR_SUCCESS; 6224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 6234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 6244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode SR_Grammar_UnsetupRecognizer(SR_Grammar* self) 6254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 6264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project SR_GrammarImpl* impl = (SR_GrammarImpl*) self; 6274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if(impl == NULL) return ESR_INVALID_ARGUMENT; 6284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project impl->recognizer = NULL; 6294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CA_AttachArbdataToSyntax( impl->syntax, NULL); 6304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ESR_SUCCESS; 6314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 6324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 6334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectSREC_GRAMMAR_API ESR_ReturnCode SR_Grammar_SetupVocabulary(SR_Grammar *self, SR_Vocabulary *vocabulary) 6344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 6354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project SR_GrammarImpl* impl = (SR_GrammarImpl*) self; 6364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 6374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (vocabulary == NULL) 6384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 6394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PLogError(L("ESR_INVALID_ARGUMENT")); 6404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ESR_INVALID_ARGUMENT; 6414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 6424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project impl->vocabulary = vocabulary; 6434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ESR_SUCCESS; 6444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 6454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 6464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode SR_Grammar_CheckParse(SR_Grammar* self, const LCHAR* transcription, SR_SemanticResult** result, size_t* resultCount) 6474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 6484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ESR_ReturnCode rc; 6494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project SR_GrammarImpl* impl = (SR_GrammarImpl*) self; 6504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project size_t resultCountIn = *resultCount; 6514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 6524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (transcription == NULL) 6534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 6544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PLogError(L("ESR_INVALID_ARGUMENT")); 6554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ESR_INVALID_ARGUMENT; 6564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 6574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 6584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* NULL for special implementation when CheckParse is called by application that does not know 6594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project about the hidden data structure SR_SemanticResult */ 6604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (result == NULL) 6614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 6624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (CA_CheckTranscription(impl->syntax, transcription, 0) == 0) 6634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *resultCount = 1; 6644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project else 6654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *resultCount = 0; 6664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ESR_SUCCESS; 6674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 6684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rc = impl->semproc->checkParse(impl->semproc, impl->semgraph, transcription, result, resultCount); 6694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (*resultCount == 0) 6704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 6714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* get the literal that did parse from the text_parser.c code */ 6724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project char copy_of_trans[512]; 6734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project strcpy(copy_of_trans, transcription); 6744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *resultCount = resultCountIn; 6754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (CA_CheckTranscription(impl->syntax, (LCHAR*)copy_of_trans, 0) == 0) 6764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rc = impl->semproc->checkParse(impl->semproc, impl->semgraph, copy_of_trans, result, resultCount); 6774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 6784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return rc; 6794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 6804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 6814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define DISABLEcostdata 8192 6824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 6834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode SR_GrammarAllowOnly(SR_Grammar* self, const char* transcription) 6844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 6854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project char copy_of[512], *word; 6864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int i, j; 6874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project wordID wdids[32], nw = 0; 6884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project SR_GrammarImpl* impl = (SR_GrammarImpl*)self; 6894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CA_Syntax* ca_syntax = impl->syntax; 6904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project srec_context* fst = ca_syntax->synx; 6914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ESR_ReturnCode rc = ESR_SUCCESS; 6924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 6934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project strcpy(copy_of, transcription); 6944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 6954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project for (word = strtok(copy_of, " "); word; nw++, word = strtok(NULL, " ")) 6964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 6974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project wdids[nw] = wordmap_find_index(fst->olabels, word); 6984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (wdids[nw] == MAXwordID) 6994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rc = ESR_NO_MATCH_ERROR; 7004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 7014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 7024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project for (i = 0; i < fst->num_arcs; i++) 7034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 7044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project wordID wdid = fst->FSMarc_list[i].olabel; 7054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (wdid < EPSILON_OFFSET) ; 7064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project else if (wdid == fst->beg_silence_word) ; 7074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project else if (wdid == fst->end_silence_word) ; 7084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project else 7094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 7104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project for (j = nw; --j >= 0;) 7114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (wdid == wdids[j]) break; 7124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (j < 0) 7134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 7144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project fst->FSMarc_list[i].cost |= DISABLEcostdata; /* disable this arc */ 7154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 7164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project else 7174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 7184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* pfprintf(PSTDOUT, "enabling arc %d for %d %s\n", 7194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project i, wdid, transcription); */ 7204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project fst->FSMarc_list[i].cost &= ~(DISABLEcostdata); /* enable this arc */ 7214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 7224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 7234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 7244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* added, this way we prevent more failures due to dead ends */ 7254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project for (; ;) 7264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 7274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project FSMarc* arc; 7284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project arcID j, counter = 0; 7294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project nodeID node; 7304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project costdata mincost; 7314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 7324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project for (i = 0; i < fst->num_arcs; i++) 7334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 7344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (fst->FSMarc_list[i].cost < DISABLEcostdata) 7354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 7364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project node = fst->FSMarc_list[i].to_node; 7374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (node == fst->end_node) continue; 7384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project mincost = DISABLEcostdata; 7394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project for (j = fst->FSMnode_list[node].un_ptr.first_next_arc; j != MAXarcID; j = arc->linkl_next_arc) 7404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 7414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project arc = &fst->FSMarc_list[j]; 7424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (arc->cost < mincost) mincost = arc->cost; 7434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 7444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (mincost >= DISABLEcostdata) 7454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 7464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project fst->FSMarc_list[i].cost |= DISABLEcostdata; 7474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project counter++; 7484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 7494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 7504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 7514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (counter == 0) break; 7524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 7534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 7544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return rc; 7554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 7564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 7574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode SR_GrammarAllowAll(SR_Grammar* self) 7584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 7594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int i; 7604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project SR_GrammarImpl* impl = (SR_GrammarImpl*)self; 7614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CA_Syntax* ca_syntax = impl->syntax; 7624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project srec_context* fst = ca_syntax->synx; 7634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ESR_ReturnCode rc = ESR_SUCCESS; 7644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 7654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project for (i = 0; i < fst->num_arcs; i++) 7664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 7674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project fst->FSMarc_list[i].cost &= ~(DISABLEcostdata); /* enable this arc */ 7684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 7694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return rc; 7704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 7714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 772