NametagsImpl.c revision 4a68b3365c8c50aa93505e99ead2565ab73dcdb0
15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)/*---------------------------------------------------------------------------*
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *  NametagsImpl.c  *
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *                                                                           *
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
55d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) *                                                                           *
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *  Licensed under the Apache License, Version 2.0 (the 'License');          *
7868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) *  you may not use this file except in compliance with the License.         *
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *                                                                           *
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *  You may obtain a copy of the License at                                  *
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *      http://www.apache.org/licenses/LICENSE-2.0                           *
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *                                                                           *
12effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch *  Unless required by applicable law or agreed to in writing, software      *
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *  distributed under the License is distributed on an 'AS IS' BASIS,        *
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *  See the License for the specific language governing permissions and      *
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *  limitations under the License.                                           *
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *                                                                           *
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *---------------------------------------------------------------------------*/
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ESR_Session.h"
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "HashMap.h"
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "LCHAR.h"
234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "plog.h"
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "pmemory.h"
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "SR_NametagImpl.h"
264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "SR_NametagsImpl.h"
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MTAG NULL
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ESR_ReturnCode SR_NametagsCreate(SR_Nametags** self)
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles){
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SR_NametagsImpl* impl;
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ESR_ReturnCode rc;
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (self == NULL)
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    PLogError(L("ESR_INVALID_ARGUMENT"));
385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return ESR_INVALID_ARGUMENT;
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
40effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  impl = NEW(SR_NametagsImpl, MTAG);
41effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  if (impl == NULL)
42effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  {
434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    PLogError(L("ESR_OUT_OF_MEMORY"));
444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return ESR_OUT_OF_MEMORY;
454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  impl->Interface.load = &SR_NametagsLoadImpl;
485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  impl->Interface.save = &SR_NametagsSaveImpl;
495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  impl->Interface.add = &SR_NametagsAddImpl;
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  impl->Interface.remove = &SR_NametagsRemoveImpl;
515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  impl->Interface.getSize = &SR_NametagsGetSizeImpl;
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  impl->Interface.get = &SR_NametagsGetImpl;
5323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  impl->Interface.getAtIndex = &SR_NametagsGetAtIndexImpl;
54effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  impl->Interface.contains = &SR_NametagsContainsImpl;
55a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  impl->Interface.destroy = &SR_NametagsDestroyImpl;
56effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  impl->value = NULL;
575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  impl->eventLog = NULL;
585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  CHKLOG(rc, HashMapCreate(&impl->value));
605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  CHKLOG(rc, ESR_SessionGetSize_t(L("SREC.Recognizer.osi_log_level"), &impl->logLevel));
6123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  if (impl->logLevel > 0)
62effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    CHKLOG(rc, ESR_SessionGetProperty(L("eventlog"), (void **)&impl->eventLog, TYPES_SR_EVENTLOG));
63a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  CHKLOG(rc, SR_EventLogTokenInt_BASIC(impl->eventLog, impl->logLevel, L("pointer"), (int) self));
64effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  CHKLOG(rc, SR_EventLogEvent_BASIC(impl->eventLog, impl->logLevel, L("SR_NametagsCreate")));
654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  *self = (SR_Nametags*) impl;
665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return ESR_SUCCESS;
674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)CLEANUP:
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  impl->Interface.destroy(&impl->Interface);
69effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  return rc;
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)ESR_ReturnCode SR_NametagsLoadImpl(SR_Nametags* self, const LCHAR* filename)
735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles){
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SR_NametagsImpl* impl = (SR_NametagsImpl*) self;
755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ESR_ReturnCode rc;
765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  PFile* file = NULL;
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LCHAR line[256];
785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  LCHAR* result = NULL;
795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  LCHAR* id;
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LCHAR* value;
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SR_Nametag* newNametag = NULL;
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SR_Nametag* oldNametag;
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  HashMap* nametags = impl->value;
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  size_t size, len, i;
855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  LCHAR devicePath[P_PATH_MAX];
865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  LCHAR number[MAX_UINT_DIGITS+1];
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define NAMETAGID_LENGTH 20
885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  /* strlen("token\0") == 6 */
895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#define TOKEN_LENGTH 6 + NAMETAGID_LENGTH
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LCHAR tokenName[TOKEN_LENGTH];
915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (filename == NULL)
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    rc = ESR_INVALID_STATE;
955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    PLogError(ESR_rc2str(rc));
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    goto CLEANUP;
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  size = P_PATH_MAX;
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CHKLOG(rc, ESR_SessionGetLCHAR(L("cmdline.nametagPath"), devicePath, &size));
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  /* check if the filename has the path */
1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (LSTRNCMP(filename, devicePath, LSTRLEN(devicePath)) != 0)
1025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    LSTRCAT(devicePath, filename);
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  else
1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    LSTRCPY(devicePath, filename);
1055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  file = pfopen ( devicePath, L("r"));
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/*  CHKLOG(rc, PFileSystemCreatePFile(devicePath, ESR_TRUE, &file));
1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  CHKLOG(rc, file->open(file, L("r")));*/
1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if ( file == NULL )
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    goto CLEANUP;
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  /* Flush collection */
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CHKLOG(rc, nametags->getSize(nametags, &size));
1145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  for (i = 0; i < size; ++i)
1155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  {
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CHKLOG(rc, nametags->getValueAtIndex(nametags, 0, (void **)&oldNametag));
1175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    CHKLOG(rc, nametags->removeAtIndex(nametags, 0));
1185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    CHKLOG(rc, oldNametag->destroy(oldNametag));
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  len = MAX_UINT_DIGITS + 1;
1215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  CHKLOG(rc, lultostr(size, number, &len, 10));
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CHKLOG(rc, SR_EventLogToken_BASIC(impl->eventLog, impl->logLevel, L("removeCount"), number));
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  while (ESR_TRUE)
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    result = pfgets ( line, 256, file );
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (result == NULL)
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      break;
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (LSTRLEN(line) == 255)
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
1315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      rc = ESR_BUFFER_OVERFLOW;
132effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      PLogError(ESR_rc2str(rc));
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      goto CLEANUP;
1345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
1355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    lstrtrim(line);
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    /* Get the Nametag ID */
1385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    id = line;
1395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
140effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    /* Find next whitespace */
141effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    for (value = id + 1; *value != L('\0') && !LISSPACE(*value); ++value);
142effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    if (*value == L('\0'))
143effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    {
144effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      rc = ESR_INVALID_STATE;
145effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      PLogError(L("%s: Cannot find end of Nametag id"), ESR_rc2str(rc));
146effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      goto CLEANUP;
147effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    }
148effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    /* Delimit end of nametag ID */
149effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    *value = L('\0');
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    /* Find next non-whitespace */
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    for (++value; *value != L('\0') && LISSPACE(*value); ++value);
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (*value == L('\0'))
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      rc = ESR_INVALID_STATE;
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      PLogError(L("%s: Cannot find Nametag value"), ESR_rc2str(rc));
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      goto CLEANUP;
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    /* We now have both the Nametag ID and value */
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	len = (LSTRLEN(value)+1) * sizeof(LCHAR) ;
162effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    CHKLOG(rc, SR_NametagCreateFromValue(id, (const char*)value, len, &newNametag));
163effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    /* Add Nametag to collection */
164effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    CHKLOG(rc, impl->value->put(impl->value, id, newNametag));
165effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (LSTRLEN(id) > NAMETAGID_LENGTH)
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
1685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      rc = ESR_BUFFER_OVERFLOW;
16923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      PLogError(ESR_rc2str(rc));
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      goto CLEANUP;
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
1724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    psprintf(tokenName, L("nametag[%s]"), id);
173a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    CHKLOG(rc, SR_EventLogToken_BASIC(impl->eventLog, impl->logLevel, tokenName, value));
1745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    newNametag = NULL;
1755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
1765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  CHKLOG(rc, SR_EventLogToken_BASIC(impl->eventLog, impl->logLevel, L("filename"), filename));
1775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  CHKLOG(rc, nametags->getSize(nametags, &size));
178a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  len = MAX_UINT_DIGITS + 1;
1794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  CHKLOG(rc, lultostr(size, number, &len, 10));
1804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  CHKLOG(rc, SR_EventLogToken_BASIC(impl->eventLog, impl->logLevel, L("addCount"), number));
1814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  CHKLOG(rc, SR_EventLogEvent_BASIC(impl->eventLog, impl->logLevel, L("SR_NametagsLoad")));
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  pfclose (file);
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return ESR_SUCCESS;
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)CLEANUP:
18523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  if (file != NULL)
18623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    pfclose (file);
1875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (newNametag != NULL)
188ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    newNametag->destroy(newNametag);
189ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  return rc;
19023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}
1915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)ESR_ReturnCode SR_NametagsSaveImpl(SR_Nametags* self, const LCHAR* filename)
193ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch{
194ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  SR_NametagsImpl* impl = (SR_NametagsImpl*) self;
195ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  ESR_ReturnCode rc;
1964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  PFile* file = NULL;
1974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  size_t size, i;
198ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  HashMap* nametags = impl->value;
199ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  SR_NametagImpl* nametag;
200ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  LCHAR* id;
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  size_t len;
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LCHAR devicePath[P_PATH_MAX];
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define NAMETAG_LENGTH 200
204effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  LCHAR nametagBuffer[NAMETAG_LENGTH];
205effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  LCHAR number[MAX_UINT_DIGITS+1];
2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define NAMETAGID_LENGTH 20
20723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  /* "token\0" == 6 */
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define TOKEN_LENGTH 6 + NAMETAGID_LENGTH
2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LCHAR tokenName[TOKEN_LENGTH];
2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  size_t num_written;
2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (filename == NULL)
213f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  {
2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    rc = ESR_INVALID_STATE;
215f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    PLogError(ESR_rc2str(rc));
216f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    goto CLEANUP;
217f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
218f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  size = P_PATH_MAX;
219f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  CHKLOG(rc, ESR_SessionGetLCHAR(L("cmdline.nametagPath"), devicePath, &size));
220f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
221f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (LSTRNCMP(filename, devicePath, LSTRLEN(devicePath)) != 0)
222f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    LSTRCAT(devicePath, filename);
223f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  else
224f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    LSTRCPY(devicePath, filename);
225f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  file = pfopen ( devicePath, L("w"));
2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/*  CHKLOG(rc, PFileSystemCreatePFile(devicePath, ESR_TRUE, &file));
2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CHKLOG(rc, file->open(file, L("w")));*/
2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CHKLOG(rc, nametags->getSize(nametags, &size));
2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if ( file == NULL )
2325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    goto CLEANUP;
2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (i = 0; i < size; ++i)
2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CHKLOG(rc, nametags->getValueAtIndex(nametags, i, (void **)&nametag));
2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    CHKLOG(rc, nametag->Interface.getID(&nametag->Interface, &id));
23923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (LSTRLEN(id) + 1 + LSTRLEN(nametag->value) + 2 >= NAMETAG_LENGTH)
24123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    {
2425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      rc = ESR_BUFFER_OVERFLOW;
2435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      PLogError(ESR_rc2str(rc));
2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      goto CLEANUP;
2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
2465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    psprintf(nametagBuffer, L("%s %s\n"), id, nametag->value);
247effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    len = LSTRLEN(nametagBuffer);
2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/*    CHKLOG(rc, file->write(file, nametagBuffer, sizeof(LCHAR), &len));*/
2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    num_written = pfwrite ( nametagBuffer, sizeof ( LCHAR ), len, file );
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if ( num_written != len )
2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        goto CLEANUP;
2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (LSTRLEN(id) > NAMETAGID_LENGTH)
2555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    {
2565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      rc = ESR_BUFFER_OVERFLOW;
2575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      PLogError(ESR_rc2str(rc));
2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      goto CLEANUP;
25923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    }
26023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    psprintf(tokenName, L("nametag[%s]"), id);
2615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    CHKLOG(rc, SR_EventLogToken_BASIC(impl->eventLog, impl->logLevel, tokenName, nametag->value));
2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CHKLOG(rc, SR_EventLogToken_BASIC(impl->eventLog, impl->logLevel, L("filename"), filename));
2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  len = MAX_UINT_DIGITS + 1;
2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CHKLOG(rc, lultostr(size, (LCHAR*) &number, &len, 10));
2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CHKLOG(rc, SR_EventLogToken_BASIC(impl->eventLog, impl->logLevel, L("saveCount"), number));
2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CHKLOG(rc, SR_EventLogEvent_BASIC(impl->eventLog, impl->logLevel, L("SR_NametagsSave")));
2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  pfclose (file);
2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return ESR_SUCCESS;
2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)CLEANUP:
2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (file != NULL)
2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    pfclose (file);
2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return rc;
2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
27623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)ESR_ReturnCode SR_NametagsAddImpl(SR_Nametags* self, SR_Nametag* nametag)
2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles){
2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SR_NametagsImpl* impl = (SR_NametagsImpl*) self;
2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  HashMap* nametags = impl->value;
2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LCHAR* id;
2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ESR_BOOL exists;
2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ESR_ReturnCode rc;
2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CHKLOG(rc, nametag->getID(nametag, &id));
2855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  CHKLOG(rc, nametags->containsKey(nametags, id, &exists));
2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (exists)
2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CHKLOG(rc, SR_EventLogToken_BASIC(impl->eventLog, impl->logLevel, L("id"), id));
2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    rc = ESR_IDENTIFIER_COLLISION;
2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CHKLOG(rc, SR_EventLogToken_BASIC(impl->eventLog, impl->logLevel, L("rc"), ESR_rc2str(rc)));
2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CHKLOG(rc, SR_EventLogEvent_BASIC(impl->eventLog, impl->logLevel, L("SR_NametagsAdd")));
2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    rc = ESR_IDENTIFIER_COLLISION;
2935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    PLogError(ESR_rc2str(rc));
294effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    goto CLEANUP;
2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CHKLOG(rc, nametags->put(nametags, id, nametag));
2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CHKLOG(rc, SR_EventLogToken_BASIC(impl->eventLog, impl->logLevel, L("id"), id));
2995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  CHKLOG(rc, SR_EventLogEvent_BASIC(impl->eventLog, impl->logLevel, L("SR_NametagsAdd")));
3005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return ESR_SUCCESS;
3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)CLEANUP:
3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return rc;
3035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
3045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ESR_ReturnCode SR_NametagsRemoveImpl(SR_Nametags* self, const LCHAR* id)
3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles){
3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SR_NametagsImpl* impl = (SR_NametagsImpl*) self;
3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  HashMap* nametags = impl->value;
3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ESR_ReturnCode rc;
3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CHKLOG(rc, nametags->remove(nametags, id));
312a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CHKLOG(rc, SR_EventLogToken_BASIC(impl->eventLog, impl->logLevel, L("id"), id));
3145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  CHKLOG(rc, SR_EventLogEvent_BASIC(impl->eventLog, impl->logLevel, L("SR_NametagsRemove")));
3155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return ESR_SUCCESS;
3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)CLEANUP:
3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return rc;
3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ESR_ReturnCode SR_NametagsGetSizeImpl(SR_Nametags* self, size_t* result)
3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles){
3225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  SR_NametagsImpl* impl = (SR_NametagsImpl*) self;
3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  HashMap* nametags = impl->value;
3245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ESR_ReturnCode rc;
32523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
326effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  CHKLOG(rc, nametags->getSize(nametags, result));
3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return ESR_SUCCESS;
3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)CLEANUP:
3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return rc;
3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ESR_ReturnCode SR_NametagsGetImpl(SR_Nametags* self, const LCHAR* id, SR_Nametag** nametag)
3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles){
3345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  SR_NametagsImpl* impl = (SR_NametagsImpl*) self;
3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  HashMap* nametags = impl->value;
3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ESR_ReturnCode rc;
3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CHKLOG(rc, nametags->get(nametags, id, (void **)nametag));
3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CHKLOG(rc, SR_EventLogToken_BASIC(impl->eventLog, impl->logLevel, L("id"), id));
3415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  CHKLOG(rc, SR_EventLogEvent_BASIC(impl->eventLog, impl->logLevel, L("SR_NametagsGet")));
34223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  return ESR_SUCCESS;
3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)CLEANUP:
344868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return rc;
345868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
346868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
347868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)ESR_ReturnCode SR_NametagsGetAtIndexImpl(SR_Nametags* self, size_t index, SR_Nametag** nametag)
348868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles){
349868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SR_NametagsImpl* impl = (SR_NametagsImpl*) self;
350868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  HashMap* nametags = impl->value;
3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LCHAR* id;
3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ESR_ReturnCode rc;
3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CHKLOG(rc, nametags->getValueAtIndex(nametags, index, (void **)nametag));
3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  CHKLOG(rc, (*nametag)->getID(*nametag, &id));
3575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  CHKLOG(rc, SR_EventLogToken_BASIC(impl->eventLog, impl->logLevel, L("id"), id));
358effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  CHKLOG(rc, SR_EventLogEvent_BASIC(impl->eventLog, impl->logLevel, L("SR_NametagsGetAtIndex")));
3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return ESR_SUCCESS;
36023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)CLEANUP:
3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return rc;
36223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}
3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
36423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)ESR_ReturnCode SR_NametagsContainsImpl(SR_Nametags* self, const LCHAR* id, ESR_BOOL* result)
3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles){
36623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  SR_NametagsImpl* impl = (SR_NametagsImpl*) self;
3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  HashMap* nametags = impl->value;
3684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ESR_ReturnCode rc;
3694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
370  CHKLOG(rc, nametags->containsKey(nametags, id, result));
371  return ESR_SUCCESS;
372CLEANUP:
373  return rc;
374}
375
376ESR_ReturnCode SR_NametagsDestroyImpl(SR_Nametags* self)
377{
378  SR_NametagsImpl* impl = (SR_NametagsImpl*) self;
379  LCHAR number[MAX_UINT_DIGITS+1];
380  ESR_ReturnCode rc;
381
382  if (impl->value != NULL)
383  {
384    size_t size, i, len;
385    HashMap* list = impl->value;
386    SR_Nametag* nametag;
387
388    CHKLOG(rc, list->getSize(list, &size));
389    for (i = 0; i < size; ++i)
390    {
391      CHKLOG(rc, list->getValueAtIndex(list, 0, (void **)&nametag));
392      CHKLOG(rc, list->removeAtIndex(list, 0));
393      CHKLOG(rc, nametag->destroy(nametag));
394    }
395
396    len = MAX_UINT_DIGITS + 1;
397    CHKLOG(rc, lultostr(size, (LCHAR*) &number, &len, 10));
398    CHKLOG(rc, SR_EventLogToken_BASIC(impl->eventLog, impl->logLevel, L("removeCount"), number));
399    CHKLOG(rc, SR_EventLogEvent_BASIC(impl->eventLog, impl->logLevel, L("SR_NametagsDestroy")));
400    list->destroy(list);
401    impl->value = NULL;
402  }
403  CHKLOG(rc, SR_EventLogTokenInt_BASIC(impl->eventLog, impl->logLevel, L("pointer"), (int) self));
404  CHKLOG(rc, SR_EventLogEvent_BASIC(impl->eventLog, impl->logLevel, L("SR_NametagsDestroy")));
405  impl->eventLog = NULL;
406  FREE(self);
407  return ESR_SUCCESS;
408CLEANUP:
409  return rc;
410}
411