14a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/*---------------------------------------------------------------------------* 24a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * RecognizerResultImpl.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 "SR_RecognizerResult.h" 214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "SR_RecognizerResultImpl.h" 224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "SR_SemanticResult.h" 234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "SR_SemanticResultImpl.h" 244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "SR_SemprocDefinitions.h" 254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "plog.h" 264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "pmemory.h" 274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "ESR_Locale.h" 284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define MTAG NULL 304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode SR_RecognizerResult_Create(SR_RecognizerResult** self, SR_RecognizerImpl* recogImpl) 324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project SR_RecognizerResultImpl* impl; 344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (self == NULL || recogImpl == NULL) 364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PLogError(L("ESR_INVALID_ARGUMENT")); 384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ESR_INVALID_ARGUMENT; 394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project impl = NEW(SR_RecognizerResultImpl, MTAG); 414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (impl == NULL) 424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PLogError(L("ESR_OUT_OF_MEMORY")); 444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ESR_OUT_OF_MEMORY; 454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project impl->Interface.getWaveform = &SR_RecognizerResult_GetWaveform; 474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project impl->Interface.getSize = &SR_RecognizerResult_GetSize; 484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project impl->Interface.getKeyCount = &SR_RecognizerResult_GetKeyCount; 494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project impl->Interface.getKeyList = &SR_RecognizerResult_GetKeyList; 504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project impl->Interface.getValue = &SR_RecognizerResult_GetValue; 514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project impl->Interface.getLocale = &SR_RecognizerResult_GetLocale; 524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project impl->nbestList = NULL; 544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project impl->nbestListSize = 0; 554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project impl->results = NULL; 564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project impl->recogImpl = recogImpl; 574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *self = (SR_RecognizerResult*) impl; 584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ESR_SUCCESS; 594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode SR_RecognizerResult_GetWaveform(const SR_RecognizerResult* self, 624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project const asr_int16_t** waveform, size_t* size) 634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project SR_RecognizerResultImpl* impl = (SR_RecognizerResultImpl*) self; 654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (waveform == NULL) 674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PLogError(L("ESR_INVALID_ARGUMENT")); 694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ESR_INVALID_ARGUMENT; 704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project // just point to the circular buffer read start point 734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (impl->recogImpl->waveformBuffer->overflow_count == 0) 744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *waveform = (asr_int16_t*)(((unsigned char *) impl->recogImpl->waveformBuffer->cbuffer) + 764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project sizeof(CircularBuffer) + impl->recogImpl->waveformBuffer->cbuffer->readIdx); 774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *size = impl->recogImpl->waveformBuffer->read_size; 794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ESR_SUCCESS; 804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project else 824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PLogMessage(L("Warning: Voice Enrollment audio buffer overflow (spoke too much, over by %d bytes)\n"), 844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project impl->recogImpl->waveformBuffer->overflow_count); 854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *waveform = (asr_int16_t*)(((unsigned char *) impl->recogImpl->waveformBuffer->cbuffer) + sizeof(CircularBuffer) + impl->recogImpl->waveformBuffer->cbuffer->readIdx); 874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *size = impl->recogImpl->waveformBuffer->read_size; 884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ESR_SUCCESS; 894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode SR_RecognizerResult_GetSize(const SR_RecognizerResult* self, size_t* count) 934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project SR_RecognizerResultImpl* impl = (SR_RecognizerResultImpl*) self; 954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ESR_ReturnCode rc; 964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CHKLOG(rc, ArrayListGetSize(impl->results, count)); 984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ESR_SUCCESS; 994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectCLEANUP: 1004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return rc; 1014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 1024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode SR_RecognizerResult_GetKeyCount(const SR_RecognizerResult* self, 1044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project const size_t nbest, size_t* count) 1054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 1064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project SR_RecognizerResultImpl* impl = (SR_RecognizerResultImpl*) self; 1074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ESR_ReturnCode rc; 1084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ArrayList* results; 1094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project SR_SemanticResult* result; 1104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* Choose nbest-list entry */ 1124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CHKLOG(rc, impl->results->get(impl->results, nbest, (void **)&results)); 1134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* 1144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * Currently we only support one semantic result per nbestlist entry, 1154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * so we grab the first available one. 1164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project */ 1174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CHKLOG(rc, results->get(results, 0, (void **)&result)); 1184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CHKLOG(rc, result->getKeyCount(result , count)); 1194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ESR_SUCCESS; 1204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectCLEANUP: 1214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return rc; 1224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 1234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode SR_RecognizerResult_GetKeyList(const SR_RecognizerResult* self, 1254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project const size_t nbest, LCHAR** list, size_t* listSize) 1264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 1274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project SR_RecognizerResultImpl* impl = (SR_RecognizerResultImpl*) self; 1284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ArrayList* results; 1294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project SR_SemanticResult* result; 1304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ESR_ReturnCode rc; 1314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* Choose nbest-list entry */ 1334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CHKLOG(rc, impl->results->get(impl->results, nbest, (void **)&results)); 1344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* 1364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * Currently we only support one semantic result per nbestlist entry, 1374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * so we grab the first available one. 1384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project */ 1394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CHKLOG(rc, results->get(results, 0, (void **)&result)); 1404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CHKLOG(rc, result->getKeyList(result, list, listSize)); 1414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ESR_SUCCESS; 1434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectCLEANUP: 1444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return rc; 1454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 1464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode SR_RecognizerResult_GetValue(const SR_RecognizerResult* self, const size_t nbest, 1484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project const LCHAR* key, LCHAR* value, size_t* len) 1494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 1504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project SR_RecognizerResultImpl* impl = (SR_RecognizerResultImpl*) self; 1514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ArrayList* results; 1524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project SR_SemanticResult* result; 1534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project SR_SemanticResultImpl* resultImpl; 1544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project LCHAR* lValue; 1554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project size_t actualLen = 0, i, resultCount; 1564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ESR_ReturnCode rc; 1574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ESR_BOOL noMatch = ESR_TRUE; 1584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* Choose nbest-list entry */ 1604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CHKLOG(rc, impl->results->get(impl->results, nbest, (void **)&results)); 1614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* Get the number of semantic results for the entry */ 1624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CHKLOG(rc, results->getSize(results, &resultCount)); 1634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project for (i = 0; i < resultCount; ++i) 1654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 1664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* Choose semantic result */ 1674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CHKLOG(rc, results->get(results, i, (void **)&result)); 1684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project resultImpl = (SR_SemanticResultImpl*) result; 1694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rc = resultImpl->results->get(resultImpl->results, key, (void**) & lValue); 1704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (rc == ESR_SUCCESS) 1714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 1724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project noMatch = ESR_FALSE; 1734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project actualLen += LSTRLEN(lValue); 1744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 1754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project else if (rc != ESR_NO_MATCH_ERROR) 1764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return rc; 1774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 1784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (noMatch) 1794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ESR_NO_MATCH_ERROR; 1804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ++actualLen; 1814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* Check for overflow */ 1834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (actualLen + 1 > *len) 1844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 1854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/* Unfortunately some people are using get value functions to get the size of the value by 1864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * passing a zero length buffer which causes errors to be logged. I am adding code so 1874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * that the error is not logged when the length is zero, thus preventing lots of logs from 1884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * flooding the system. SteveR 1894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project */ 1904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if ( ( *len ) != 0 ) 1914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PLogError(L("Buffer Overflow while fetching value for %s of choice %d Len %d"), 1924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project key, nbest, *len ); 1934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *len = actualLen + 1; 1944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ESR_BUFFER_OVERFLOW; 1954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 1964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *len = actualLen; 1974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project LSTRCPY(value, L("")); 1994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project for (i = 0; i < resultCount; ++i) 2004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 2014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* Choose semantic result */ 2024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CHKLOG(rc, results->get(results, i, (void **)&result)); 2034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project resultImpl = (SR_SemanticResultImpl*) result; 2044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rc = resultImpl->results->get(resultImpl->results, key, (void **) & lValue); 2054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (rc == ESR_SUCCESS) 2064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project LSTRCAT(value, lValue); 2074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project else if (rc != ESR_NO_MATCH_ERROR) 2084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return rc; 2094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* Separate semantic results with '#' token */ 2114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (i < resultCount - 1) { 2124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int len = LSTRLEN(value); 2134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project value[len] = MULTIPLE_MEANING_JOIN_CHAR; 2144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project value[len+1] = 0; 2154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 2164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 2174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ESR_SUCCESS; 2184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectCLEANUP: 2194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return rc; 2204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 2214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode SR_RecognizerResult_Destroy(SR_RecognizerResult* self) 2234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 2244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project SR_RecognizerResultImpl* impl = (SR_RecognizerResultImpl*) self; 2254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ArrayList* semanticList; 2264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project SR_SemanticResult* semanticResult; 2274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project size_t nbest, i, j, num_semanticResults; 2284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ESR_ReturnCode rc; 2294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* each nbest list entry has an ArrayList of Semantic Results... need to destroy them too */ 2314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (impl->results != NULL) 2324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 2334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CHKLOG(rc, impl->results->getSize(impl->results, &nbest)); 2344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project for (i = 0; i < nbest; ++i) 2354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 2364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CHKLOG(rc, impl->results->get(impl->results, 0, (void **)&semanticList)); 2374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (semanticList == NULL) 2384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project continue; 2394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CHKLOG(rc, semanticList->getSize(semanticList, &num_semanticResults)); 2414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project for (j = 0; j < num_semanticResults; ++j) 2424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 2434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project LCHAR literal[256]; 2444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project size_t len; 2454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CHKLOG(rc, semanticList->get(semanticList, 0, (void **)&semanticResult)); 2474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CHKLOG(rc, semanticList->remove(semanticList, semanticResult)); 2484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project len = sizeof(literal) / sizeof(LCHAR); 2494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CHKLOG(rc, semanticResult->getValue(semanticResult, "literal", (LCHAR*) &literal, &len)); 2504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CHKLOG(rc, semanticResult->destroy(semanticResult)); 2514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 2524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CHKLOG(rc, impl->results->remove(impl->results, semanticList)); 2534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CHKLOG(rc, semanticList->destroy(semanticList)); 2544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 2554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CHKLOG(rc, impl->results->destroy(impl->results)); 2564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project impl->results = NULL; 2574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 2584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (impl->nbestList != NULL) 2604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 2614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CA_DeleteNBestList(impl->nbestList); 2624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project impl->nbestList = NULL; 2634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 2644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project FREE(impl); 2654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ESR_SUCCESS; 2664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectCLEANUP: 2674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project passert(rc != ESR_BUFFER_OVERFLOW); 2684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return rc; 2694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 2704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode SR_RecognizerResult_GetLocale(const SR_RecognizerResult* self, ESR_Locale* locale) 2724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 2734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project SR_RecognizerResultImpl* impl = (SR_RecognizerResultImpl*) self; 2744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *locale = impl->locale; 2754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ESR_SUCCESS; 2764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 277