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