14a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
24a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/*---------------------------------------------------------------------------*
34a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  NametagImpl.c  *
44a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *                                                                           *
54a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
64a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *                                                                           *
74a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  Licensed under the Apache License, Version 2.0 (the 'License');          *
84a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  you may not use this file except in compliance with the License.         *
94a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *                                                                           *
104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  You may obtain a copy of the License at                                  *
114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0                           *
124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *                                                                           *
134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  Unless required by applicable law or agreed to in writing, software      *
144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  distributed under the License is distributed on an 'AS IS' BASIS,        *
154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  See the License for the specific language governing permissions and      *
174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  limitations under the License.                                           *
184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *                                                                           *
194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *---------------------------------------------------------------------------*/
204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "SR_Nametag.h"
224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "SR_NametagImpl.h"
234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "SR_RecognizerImpl.h"
244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "SR_VocabularyImpl.h"
254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "plog.h"
264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "pmemory.h"
274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define MTAG NULL
294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define MAX_STRING_LEN P_PATH_MAX
304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode SR_NametagCreate(const SR_RecognizerResult* result, const LCHAR* id, SR_Nametag** self)
324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ESR_Locale locale;
344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ESR_ReturnCode rc;
354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  size_t len;
364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  LCHAR transcription[MAX_STRING_LEN];
374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (self == NULL)
394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PLogError(L("ESR_INVALID_ARGUMENT"));
414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return ESR_INVALID_ARGUMENT;
424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  rc = result->getSize(result, &len);
454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (rc != ESR_SUCCESS)
464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PLogError(ESR_rc2str(rc));
484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    goto CLEANUP;
494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (len < 1)
514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PLogError(L("ESR_INVALID_ARGUMENT (recognition result nbest-list size=0)"));
534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    rc = ESR_INVALID_ARGUMENT;
544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    goto CLEANUP;
554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  rc = result->getLocale(result, &locale);
574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  len = MAX_STRING_LEN;
594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  rc = result->getValue(result, 0, L("meaning"), transcription, &len);
614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (rc != ESR_SUCCESS && rc != ESR_BUFFER_OVERFLOW)
634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PLogError(ESR_rc2str(rc));
654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    goto CLEANUP;
664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if USE_HMM_BASED_ENROLLMENT /* srec_context.h */
694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  len = LSTRLEN(transcription)+1;
704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  rc = SR_NametagCreateFromValue(id, transcription, (int)len, self);
714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if(rc ) goto CLEANUP;
724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#else
734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if(1) {
754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    LCHAR short_pron[MAX_STRING_LEN], *short_pron_ptr;
764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    LCHAR* long_pron = transcription;
774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    LCHAR* multichar;
784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    LCHAR* p;
794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    LCHAR singlechar[2];
804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    *short_pron = 0;
824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    short_pron_ptr = short_pron;
834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    len = LSTRLEN(L("ph_"));
844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    for (multichar = strtok(long_pron, L(" \t\n\r")); multichar; multichar = strtok(NULL, L(" \t\n\r")))
854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      {
864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	p = multichar;
874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	if (LSTRNCMP(p, L("ph_"), len) != 0)
884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	  {
894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	    PLogError(L("Expecting 'ph_' prefix, got=%s"), p);
904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	    rc = ESR_INVALID_STATE;
914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	    goto CLEANUP;
924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	  }
934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	p += len;
944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	multichar = p;
954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	while (*p)
964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	  {
974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	    if (isdigit(*p))
984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	      {
994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		*p = L('\0');
1004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		break;
1014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	      }
1024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	    ++p;
1034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	  }
1044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	if ((rc = SR_Vocabulary_etiinf_conv_from_multichar(locale, multichar, singlechar)) != ESR_SUCCESS)
1054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	  {
1064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	    PLogError(L("Could not convert long to short pron (input=%s, locale=%s)"), multichar, ESR_locale2str(locale));
1074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	    goto CLEANUP;
1084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	  }
1094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	singlechar[1] = 0;
1104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	if((short_pron_ptr - short_pron + 3) >= MAX_STRING_LEN) {
1114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	  PLogError(L("Chopping too long pron in SR_NametagCreate()\n"));
1124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	  break; // just cut if off
1134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	}
1144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	*short_pron_ptr++ = *singlechar;
1154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      }
1164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    *short_pron_ptr++ = 0; // null-term
1174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    *short_pron_ptr++ = 0; // double-null-term!
1184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    /* +2 = +1 for null, +1 for double-null */
1204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    rc = SR_NametagCreateFromValue(id, short_pron, (short_pron_ptr-short_pron), self);
1214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if(rc ) goto CLEANUP;
1224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
1234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
1244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
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_NametagCreateFromValue(const LCHAR* id, const char* value, size_t len, SR_Nametag** self)
1314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
1324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  SR_NametagImpl* impl;
1334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ESR_ReturnCode rc;
1344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  passert(self != NULL);
1364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl = NEW(SR_NametagImpl, MTAG);
1374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (impl == NULL)
1384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
1394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PLogError(L("ESR_OUT_OF_MEMORY"));
1404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return ESR_OUT_OF_MEMORY;
1414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
1424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->Interface.setID = &SR_Nametag_SetID;
1444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->Interface.getID = &SR_Nametag_GetID;
1454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->Interface.getValue = &SR_Nametag_GetValue;
1464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->Interface.clone = &SR_Nametag_Clone;
1474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->Interface.destroy = &SR_Nametag_Destroy;
1484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->id = NULL;
1494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->value = NULL;
1504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->value = (LCHAR*) MALLOC(sizeof(LCHAR) * (len), MTAG);
1514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (impl->value == NULL)
1534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
1544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    rc = ESR_OUT_OF_MEMORY;
1554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PLogError(ESR_rc2str(rc));
1564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    goto CLEANUP;
1574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
1584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->value_len = len;
1594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  // make sure we have a double-null term
1604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  memcpy( (void*)impl->value, value, len);
1614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  LSTRNCPY(impl->value, value, len);
1624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  rc = SR_NametagSetID(&impl->Interface, id);
1644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (rc != ESR_SUCCESS)
1654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
1664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PLogError(ESR_rc2str(rc));
1674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    goto CLEANUP;
1684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
1694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  *self = (SR_Nametag*) impl;
1714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return ESR_SUCCESS;
1724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectCLEANUP:
1734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->Interface.destroy(&impl->Interface);
1744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return rc;
1754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
1764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode SR_Nametag_Destroy(SR_Nametag* self)
1784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
1794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  SR_NametagImpl* impl = (SR_NametagImpl*) self;
1804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (impl->value != NULL)
1814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
1824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    FREE(impl->value);
1834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    impl->value = NULL;
1844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
1854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (impl->id != NULL)
1864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
1874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    FREE(impl->id);
1884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    impl->id = NULL;
1894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
1904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  FREE(impl);
1914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return ESR_SUCCESS;
1924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
1934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode SR_Nametag_GetID(const SR_Nametag* self, LCHAR** id)
1954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
1964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  SR_NametagImpl* impl = (SR_NametagImpl*) self;
1974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  *id = impl->id;
1994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return ESR_SUCCESS;
2004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
2014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode SR_Nametag_GetValue(const SR_Nametag* self, const char** pvalue, size_t* plen)
2034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
2044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  SR_NametagImpl* impl = (SR_NametagImpl*) self;
2054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  *pvalue = (const char*)impl->value;
2074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if(!impl->value)
2084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      return ESR_NO_MATCH_ERROR;
2094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  *plen = impl->value_len;
2104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return ESR_SUCCESS;
2114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
2124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode SR_Nametag_SetID(SR_Nametag* self, const LCHAR* id)
2144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
2154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  SR_NametagImpl* impl = (SR_NametagImpl*) self;
2164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ESR_ReturnCode rc;
2174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  FREE(impl->id);
2194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->id = (LCHAR*) MALLOC(sizeof(LCHAR) * (LSTRLEN(id) + 1), MTAG);
2204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (impl->id == NULL)
2214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
2224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    rc = ESR_OUT_OF_MEMORY;
2234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PLogError(ESR_rc2str(rc));
2244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    goto CLEANUP;
2254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
2264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  LSTRCPY(impl->id, id);
2274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return ESR_SUCCESS;
2294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectCLEANUP:
2304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return rc;
2314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
2324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode SR_Nametag_Clone(const SR_Nametag* self, SR_Nametag** result)
2344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
2354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  SR_NametagImpl* impl = (SR_NametagImpl*) self;
2364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ESR_ReturnCode rc;
2374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, SR_NametagCreateFromValue(impl->id, impl->value, LSTRLEN(impl->value)+1, result));
2394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return ESR_SUCCESS;
2404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectCLEANUP:
2414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return rc;
2424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
243