xml/cxmllibrary/src/encoder/src/StringTable.c
author hgs
Wed, 23 Jun 2010 20:27:15 +0530
changeset 24 74f0b3eb154c
permissions -rw-r--r--
201024
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
24
hgs
parents:
diff changeset
     1
/*
hgs
parents:
diff changeset
     2
* Copyright (c) 2000 - 2001 Nokia Corporation and/or its subsidiary(-ies).
hgs
parents:
diff changeset
     3
* All rights reserved.
hgs
parents:
diff changeset
     4
* This component and the accompanying materials are made available
hgs
parents:
diff changeset
     5
* under the terms of the License "Eclipse Public License v1.0"
hgs
parents:
diff changeset
     6
* which accompanies this distribution, and is available
hgs
parents:
diff changeset
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
hgs
parents:
diff changeset
     8
*
hgs
parents:
diff changeset
     9
* Initial Contributors:
hgs
parents:
diff changeset
    10
* Nokia Corporation - initial contribution.
hgs
parents:
diff changeset
    11
*
hgs
parents:
diff changeset
    12
* Contributors:
hgs
parents:
diff changeset
    13
*
hgs
parents:
diff changeset
    14
* Description: 
hgs
parents:
diff changeset
    15
*
hgs
parents:
diff changeset
    16
*/
hgs
parents:
diff changeset
    17
hgs
parents:
diff changeset
    18
hgs
parents:
diff changeset
    19
#include <xml/cxml/nw_encoder_stringtable.h>
hgs
parents:
diff changeset
    20
#include <xml/cxml/nw_wbxml_parse.h>
hgs
parents:
diff changeset
    21
#include <xml/cxml/nw_dom_attribute.h>
hgs
parents:
diff changeset
    22
#include <xml/cxml/nw_dom_element.h>
hgs
parents:
diff changeset
    23
#include <xml/cxml/nw_dom_text.h>
hgs
parents:
diff changeset
    24
#include <xml/cxml/nw_dom_document.h>
hgs
parents:
diff changeset
    25
#include "cxml_internal.h"
hgs
parents:
diff changeset
    26
hgs
parents:
diff changeset
    27
/* ------------------------------------------------------------------------- *
hgs
parents:
diff changeset
    28
   private methods
hgs
parents:
diff changeset
    29
 * ------------------------------------------------------------------------- */
hgs
parents:
diff changeset
    30
hgs
parents:
diff changeset
    31
/* ------------------------------------------------------------------------- */
hgs
parents:
diff changeset
    32
static
hgs
parents:
diff changeset
    33
NW_Status_t
hgs
parents:
diff changeset
    34
NW_Encoder_StringItem_initialize(NW_Encoder_StringItem_t *strItem,
hgs
parents:
diff changeset
    35
                                  NW_String_t *str)
hgs
parents:
diff changeset
    36
{
hgs
parents:
diff changeset
    37
  NW_Status_t status = NW_STAT_SUCCESS;
hgs
parents:
diff changeset
    38
hgs
parents:
diff changeset
    39
  if (strItem == NULL){
hgs
parents:
diff changeset
    40
    return NW_STAT_BAD_INPUT_PARAM;
hgs
parents:
diff changeset
    41
  }
hgs
parents:
diff changeset
    42
hgs
parents:
diff changeset
    43
  if(str == NULL)
hgs
parents:
diff changeset
    44
  {
hgs
parents:
diff changeset
    45
   return NW_STAT_BAD_INPUT_PARAM;
hgs
parents:
diff changeset
    46
  }
hgs
parents:
diff changeset
    47
 
hgs
parents:
diff changeset
    48
hgs
parents:
diff changeset
    49
   strItem->data.storage = CXML_Mem_Malloc(str->length + 1);
hgs
parents:
diff changeset
    50
hgs
parents:
diff changeset
    51
   if(strItem->data.storage == NULL)
hgs
parents:
diff changeset
    52
   {
hgs
parents:
diff changeset
    53
    return NW_STAT_OUT_OF_MEMORY;
hgs
parents:
diff changeset
    54
   }
hgs
parents:
diff changeset
    55
hgs
parents:
diff changeset
    56
    NW_Mem_memcpy(strItem->data.storage,str->storage,str->length);
hgs
parents:
diff changeset
    57
hgs
parents:
diff changeset
    58
    strItem->data.storage[str->length] = '\0';
hgs
parents:
diff changeset
    59
    
hgs
parents:
diff changeset
    60
    if (status == NW_STAT_SUCCESS)
hgs
parents:
diff changeset
    61
    {
hgs
parents:
diff changeset
    62
     strItem->frequency = 1;
hgs
parents:
diff changeset
    63
     strItem->data.length = str->length; 
hgs
parents:
diff changeset
    64
    }
hgs
parents:
diff changeset
    65
    else
hgs
parents:
diff changeset
    66
    {
hgs
parents:
diff changeset
    67
     status = NW_STAT_OUT_OF_MEMORY;
hgs
parents:
diff changeset
    68
    }
hgs
parents:
diff changeset
    69
hgs
parents:
diff changeset
    70
  return status;
hgs
parents:
diff changeset
    71
}
hgs
parents:
diff changeset
    72
hgs
parents:
diff changeset
    73
/*
hgs
parents:
diff changeset
    74
 * Finds string contained in an item (AttrValItem or Text Item)
hgs
parents:
diff changeset
    75
 * An item can be string, extension, entity, opaque, or token
hgs
parents:
diff changeset
    76
 * Only extension and string may contain strings
hgs
parents:
diff changeset
    77
 * Returns NW_STAT_BAD_INPUT_PARAM
hgs
parents:
diff changeset
    78
 *         NW_STAT_SUCCESS
hgs
parents:
diff changeset
    79
 */
hgs
parents:
diff changeset
    80
/* ------------------------------------------------------------------------- */
hgs
parents:
diff changeset
    81
static
hgs
parents:
diff changeset
    82
NW_Status_t
hgs
parents:
diff changeset
    83
NW_Encoder_StringTable_getItemString(NW_Encoder_StringTable_t *strTable,
hgs
parents:
diff changeset
    84
                                     NW_DOM_AttrVal_t *item)
hgs
parents:
diff changeset
    85
{
hgs
parents:
diff changeset
    86
  NW_Uint32 ignoreVal;
hgs
parents:
diff changeset
    87
hgs
parents:
diff changeset
    88
  if ((strTable == NULL) || (item == NULL)){
hgs
parents:
diff changeset
    89
    return NW_STAT_BAD_INPUT_PARAM;
hgs
parents:
diff changeset
    90
  }
hgs
parents:
diff changeset
    91
hgs
parents:
diff changeset
    92
  switch(item->type) {
hgs
parents:
diff changeset
    93
  case NW_DOM_ATTR_VAL_STRING:
hgs
parents:
diff changeset
    94
    return NW_Encoder_StringTable_append(strTable, &item->component.string,
hgs
parents:
diff changeset
    95
                                         NW_FALSE, &ignoreVal);
hgs
parents:
diff changeset
    96
hgs
parents:
diff changeset
    97
  case NW_DOM_ATTR_VAL_EXTENSION:
hgs
parents:
diff changeset
    98
    {
hgs
parents:
diff changeset
    99
      NW_Uint8 t; /* 8-bit token */
hgs
parents:
diff changeset
   100
hgs
parents:
diff changeset
   101
      t = (NW_Uint8)(item->component.ext.token);
hgs
parents:
diff changeset
   102
      if ((item->component.ext.type == NW_TINYDOM_EXTENSION_TYPE_NORMAL)
hgs
parents:
diff changeset
   103
          && ((t == NW_WBXML_EXT_T_0)
hgs
parents:
diff changeset
   104
              || (t == NW_WBXML_EXT_T_1)
hgs
parents:
diff changeset
   105
              || (t == NW_WBXML_EXT_T_2))) {
hgs
parents:
diff changeset
   106
        return NW_Encoder_StringTable_append(strTable,
hgs
parents:
diff changeset
   107
                                             &(item->component.ext.value.string),
hgs
parents:
diff changeset
   108
                                             NW_FALSE, &ignoreVal);
hgs
parents:
diff changeset
   109
      }
hgs
parents:
diff changeset
   110
      break;
hgs
parents:
diff changeset
   111
    }
hgs
parents:
diff changeset
   112
  default:
hgs
parents:
diff changeset
   113
    break;
hgs
parents:
diff changeset
   114
  }
hgs
parents:
diff changeset
   115
  return NW_STAT_SUCCESS;
hgs
parents:
diff changeset
   116
}
hgs
parents:
diff changeset
   117
hgs
parents:
diff changeset
   118
/**
hgs
parents:
diff changeset
   119
 * Finds strings in an attribute - iterates over attribute values
hgs
parents:
diff changeset
   120
 * Returns NW_STAT_BAD_INPUT_PARAM
hgs
parents:
diff changeset
   121
 *         NW_STAT_SUCCESS
hgs
parents:
diff changeset
   122
 */
hgs
parents:
diff changeset
   123
/* ------------------------------------------------------------------------- */
hgs
parents:
diff changeset
   124
static
hgs
parents:
diff changeset
   125
NW_Status_t
hgs
parents:
diff changeset
   126
NW_Encoder_StringTable_getAttributeStrings(NW_Encoder_StringTable_t *strTable,
hgs
parents:
diff changeset
   127
                                           NW_DOM_AttributeHandle_t *attrHandle)
hgs
parents:
diff changeset
   128
{
hgs
parents:
diff changeset
   129
  NW_Status_t status;
hgs
parents:
diff changeset
   130
  NW_DOM_AttrVal_t attrVal;
hgs
parents:
diff changeset
   131
  NW_Uint16 token;
hgs
parents:
diff changeset
   132
  NW_Uint16 fqToken;
hgs
parents:
diff changeset
   133
hgs
parents:
diff changeset
   134
  if ((strTable == NULL) || (attrHandle == NULL)){
hgs
parents:
diff changeset
   135
    return NW_STAT_BAD_INPUT_PARAM;
hgs
parents:
diff changeset
   136
  }
hgs
parents:
diff changeset
   137
hgs
parents:
diff changeset
   138
  fqToken = NW_DOM_AttributeHandle_getToken(attrHandle);
hgs
parents:
diff changeset
   139
  NW_ASSERT(fqToken);
hgs
parents:
diff changeset
   140
  token = (NW_Uint16)(fqToken & NW_WBXML_MASK_TOKEN);
hgs
parents:
diff changeset
   141
  if (token == NW_WBXML_LITERAL)
hgs
parents:
diff changeset
   142
  {
hgs
parents:
diff changeset
   143
    NW_Uint32 ignoreVal;
hgs
parents:
diff changeset
   144
    NW_String_t attributeName;
hgs
parents:
diff changeset
   145
hgs
parents:
diff changeset
   146
    status = NW_DOM_AttributeHandle_getName(attrHandle, &attributeName);
hgs
parents:
diff changeset
   147
    if (status != NW_STAT_SUCCESS){
hgs
parents:
diff changeset
   148
      return status;
hgs
parents:
diff changeset
   149
    }
hgs
parents:
diff changeset
   150
    status = NW_Encoder_StringTable_append(strTable, &attributeName, NW_TRUE,
hgs
parents:
diff changeset
   151
                                           &ignoreVal);
hgs
parents:
diff changeset
   152
  }
hgs
parents:
diff changeset
   153
hgs
parents:
diff changeset
   154
  while (NW_DOM_AttributeHandle_getNextVal(attrHandle, &attrVal) == NW_STAT_WBXML_ITERATE_MORE)
hgs
parents:
diff changeset
   155
  {
hgs
parents:
diff changeset
   156
    status = NW_Encoder_StringTable_getItemString(strTable, &attrVal);
hgs
parents:
diff changeset
   157
    if (status != NW_STAT_SUCCESS){
hgs
parents:
diff changeset
   158
      return status;
hgs
parents:
diff changeset
   159
    }
hgs
parents:
diff changeset
   160
  }
hgs
parents:
diff changeset
   161
hgs
parents:
diff changeset
   162
  return NW_STAT_SUCCESS;
hgs
parents:
diff changeset
   163
}
hgs
parents:
diff changeset
   164
hgs
parents:
diff changeset
   165
/**
hgs
parents:
diff changeset
   166
 * Finds strings in an Element Node
hgs
parents:
diff changeset
   167
 * Returns NW_STAT_BAD_INPUT_PARAM
hgs
parents:
diff changeset
   168
 *         NW_STAT_SUCCESS
hgs
parents:
diff changeset
   169
 */
hgs
parents:
diff changeset
   170
/* ------------------------------------------------------------------------- */
hgs
parents:
diff changeset
   171
static
hgs
parents:
diff changeset
   172
NW_Status_t
hgs
parents:
diff changeset
   173
NW_Encoder_StringTable_getElementStrings(NW_Encoder_StringTable_t *strTable,
hgs
parents:
diff changeset
   174
                                                NW_DOM_ElementNode_t *e)
hgs
parents:
diff changeset
   175
{
hgs
parents:
diff changeset
   176
  NW_Status_t status;
hgs
parents:
diff changeset
   177
  NW_DOM_AttributeListIterator_t listIterator;
hgs
parents:
diff changeset
   178
  NW_DOM_AttributeHandle_t attrHandle;
hgs
parents:
diff changeset
   179
  NW_Uint32 fqToken;
hgs
parents:
diff changeset
   180
  NW_Uint8 token;
hgs
parents:
diff changeset
   181
hgs
parents:
diff changeset
   182
  if ((strTable == NULL) || (e == NULL)){
hgs
parents:
diff changeset
   183
    return NW_STAT_BAD_INPUT_PARAM;
hgs
parents:
diff changeset
   184
  }
hgs
parents:
diff changeset
   185
hgs
parents:
diff changeset
   186
  fqToken = NW_DOM_ElementNode_getTagToken(e);
hgs
parents:
diff changeset
   187
  if (fqToken == 0){
hgs
parents:
diff changeset
   188
    return NW_STAT_FAILURE;
hgs
parents:
diff changeset
   189
  }
hgs
parents:
diff changeset
   190
hgs
parents:
diff changeset
   191
  token = (NW_Uint8)(fqToken & NW_WBXML_MASK_TOKEN);
hgs
parents:
diff changeset
   192
hgs
parents:
diff changeset
   193
  /* put element in table if it is LITERAL tag */
hgs
parents:
diff changeset
   194
  if (token == NW_WBXML_LITERAL)
hgs
parents:
diff changeset
   195
  {
hgs
parents:
diff changeset
   196
    NW_String_t elementName;
hgs
parents:
diff changeset
   197
    NW_Uint32 ignoreVal;
hgs
parents:
diff changeset
   198
hgs
parents:
diff changeset
   199
    if (NW_DOM_ElementNode_getTagName(e, &elementName) != NW_STAT_SUCCESS){
hgs
parents:
diff changeset
   200
      return NW_STAT_FAILURE;
hgs
parents:
diff changeset
   201
    }
hgs
parents:
diff changeset
   202
    status = NW_Encoder_StringTable_append(strTable, &elementName, NW_TRUE,
hgs
parents:
diff changeset
   203
                                           &ignoreVal);
hgs
parents:
diff changeset
   204
    if (status != NW_STAT_SUCCESS){
hgs
parents:
diff changeset
   205
      return status;
hgs
parents:
diff changeset
   206
    }
hgs
parents:
diff changeset
   207
  }
hgs
parents:
diff changeset
   208
hgs
parents:
diff changeset
   209
  /* go through attribute strings */
hgs
parents:
diff changeset
   210
  if (NW_DOM_ElementNode_hasAttributes(e))
hgs
parents:
diff changeset
   211
  {
hgs
parents:
diff changeset
   212
    status = NW_DOM_ElementNode_getAttributeListIterator(e, &listIterator);
hgs
parents:
diff changeset
   213
    if (status != NW_STAT_SUCCESS){
hgs
parents:
diff changeset
   214
      return status;
hgs
parents:
diff changeset
   215
    }
hgs
parents:
diff changeset
   216
    while (NW_DOM_AttributeListIterator_getNextAttribute(&listIterator, &attrHandle) == NW_STAT_WBXML_ITERATE_MORE)
hgs
parents:
diff changeset
   217
    {
hgs
parents:
diff changeset
   218
      status = NW_Encoder_StringTable_getAttributeStrings(strTable, &attrHandle);
hgs
parents:
diff changeset
   219
      if (status != NW_STAT_SUCCESS){
hgs
parents:
diff changeset
   220
        return status;
hgs
parents:
diff changeset
   221
      }
hgs
parents:
diff changeset
   222
    }
hgs
parents:
diff changeset
   223
  }
hgs
parents:
diff changeset
   224
  return NW_STAT_SUCCESS;
hgs
parents:
diff changeset
   225
}
hgs
parents:
diff changeset
   226
hgs
parents:
diff changeset
   227
/**
hgs
parents:
diff changeset
   228
 * Finds strings in a TextNode
hgs
parents:
diff changeset
   229
 * Returns NW_STAT_BAD_INPUT_PARAM
hgs
parents:
diff changeset
   230
 *         NW_STAT_SUCCESS
hgs
parents:
diff changeset
   231
 */
hgs
parents:
diff changeset
   232
/* ------------------------------------------------------------------------- */
hgs
parents:
diff changeset
   233
static
hgs
parents:
diff changeset
   234
NW_Status_t
hgs
parents:
diff changeset
   235
NW_Encoder_StringTable_getTextStrings(NW_Encoder_StringTable_t *strTable,
hgs
parents:
diff changeset
   236
                                      NW_DOM_TextNode_t *textNode)
hgs
parents:
diff changeset
   237
{
hgs
parents:
diff changeset
   238
  NW_DOM_TextItemIterator_t textIter;
hgs
parents:
diff changeset
   239
  NW_DOM_TextItem_t item;
hgs
parents:
diff changeset
   240
  NW_Status_t status;
hgs
parents:
diff changeset
   241
hgs
parents:
diff changeset
   242
  if ((strTable == NULL) || (textNode == NULL))
hgs
parents:
diff changeset
   243
  {
hgs
parents:
diff changeset
   244
    return NW_STAT_BAD_INPUT_PARAM;
hgs
parents:
diff changeset
   245
  }
hgs
parents:
diff changeset
   246
hgs
parents:
diff changeset
   247
  (void) NW_DOM_TextNode_getTextItemIterator(textNode, &textIter);
hgs
parents:
diff changeset
   248
  while (NW_DOM_TextItemIterator_getNextTextItem(&textIter, &item) == NW_STAT_WBXML_ITERATE_MORE)
hgs
parents:
diff changeset
   249
  {
hgs
parents:
diff changeset
   250
    status = NW_Encoder_StringTable_getItemString(strTable, &item);
hgs
parents:
diff changeset
   251
    if (status != NW_STAT_SUCCESS){
hgs
parents:
diff changeset
   252
      return status;
hgs
parents:
diff changeset
   253
    }
hgs
parents:
diff changeset
   254
  }
hgs
parents:
diff changeset
   255
  return NW_STAT_SUCCESS;
hgs
parents:
diff changeset
   256
}
hgs
parents:
diff changeset
   257
hgs
parents:
diff changeset
   258
/**
hgs
parents:
diff changeset
   259
 * Finds strings in a Node (Recursive in nature)
hgs
parents:
diff changeset
   260
 * So it finds strings in entire tree
hgs
parents:
diff changeset
   261
 * Returns NW_STAT_BAD_INPUT_PARAM
hgs
parents:
diff changeset
   262
 *         NW_STAT_SUCCESS
hgs
parents:
diff changeset
   263
 */
hgs
parents:
diff changeset
   264
/* ------------------------------------------------------------------------- */
hgs
parents:
diff changeset
   265
static
hgs
parents:
diff changeset
   266
NW_Status_t
hgs
parents:
diff changeset
   267
NW_Encoder_StringTable_getNodeStrings(NW_Encoder_StringTable_t *strTable,
hgs
parents:
diff changeset
   268
                                      NW_DOM_Node_t *node,
hgs
parents:
diff changeset
   269
                                      NW_WBXML_Dictionary_t *dictionary)
hgs
parents:
diff changeset
   270
{
hgs
parents:
diff changeset
   271
  NW_Uint32 type;
hgs
parents:
diff changeset
   272
hgs
parents:
diff changeset
   273
  type = NW_DOM_Node_getNodeType(node);
hgs
parents:
diff changeset
   274
hgs
parents:
diff changeset
   275
  if ((strTable == NULL) || (node == NULL)){
hgs
parents:
diff changeset
   276
    return NW_STAT_BAD_INPUT_PARAM;
hgs
parents:
diff changeset
   277
  }
hgs
parents:
diff changeset
   278
hgs
parents:
diff changeset
   279
  switch (type)
hgs
parents:
diff changeset
   280
  {
hgs
parents:
diff changeset
   281
    case NW_DOM_ELEMENT_NODE:
hgs
parents:
diff changeset
   282
      {
hgs
parents:
diff changeset
   283
        NW_Encoder_StringTable_getElementStrings(strTable, node);
hgs
parents:
diff changeset
   284
        if (NW_DOM_Node_getFirstChild(node))
hgs
parents:
diff changeset
   285
        {
hgs
parents:
diff changeset
   286
          NW_Encoder_StringTable_getNodeStrings(strTable, NW_DOM_Node_getFirstChild(node), dictionary);
hgs
parents:
diff changeset
   287
        }
hgs
parents:
diff changeset
   288
hgs
parents:
diff changeset
   289
        if (NW_DOM_Node_getNextSibling(node))
hgs
parents:
diff changeset
   290
        {
hgs
parents:
diff changeset
   291
          NW_Encoder_StringTable_getNodeStrings(strTable, NW_DOM_Node_getNextSibling(node), dictionary);
hgs
parents:
diff changeset
   292
        }
hgs
parents:
diff changeset
   293
      }
hgs
parents:
diff changeset
   294
      break;
hgs
parents:
diff changeset
   295
hgs
parents:
diff changeset
   296
    case NW_DOM_TEXT_NODE:
hgs
parents:
diff changeset
   297
      NW_Encoder_StringTable_getTextStrings(strTable, node);
hgs
parents:
diff changeset
   298
hgs
parents:
diff changeset
   299
      if (NW_DOM_Node_getNextSibling(node))
hgs
parents:
diff changeset
   300
      {
hgs
parents:
diff changeset
   301
        NW_Encoder_StringTable_getNodeStrings (strTable, NW_DOM_Node_getNextSibling(node), dictionary);
hgs
parents:
diff changeset
   302
      }
hgs
parents:
diff changeset
   303
hgs
parents:
diff changeset
   304
      break;
hgs
parents:
diff changeset
   305
hgs
parents:
diff changeset
   306
    case NW_DOM_PROCESSING_INSTRUCTION_NODE:
hgs
parents:
diff changeset
   307
/*      PiPrint (node, encoding); */
hgs
parents:
diff changeset
   308
hgs
parents:
diff changeset
   309
     if (NW_DOM_Node_getNextSibling(node))
hgs
parents:
diff changeset
   310
     {
hgs
parents:
diff changeset
   311
       NW_Encoder_StringTable_getNodeStrings (strTable, NW_DOM_Node_getNextSibling(node), dictionary);
hgs
parents:
diff changeset
   312
     }
hgs
parents:
diff changeset
   313
hgs
parents:
diff changeset
   314
      break;
hgs
parents:
diff changeset
   315
hgs
parents:
diff changeset
   316
    default:
hgs
parents:
diff changeset
   317
      if (NW_DOM_Node_getNextSibling(node))
hgs
parents:
diff changeset
   318
      {
hgs
parents:
diff changeset
   319
        NW_Encoder_StringTable_getNodeStrings (strTable, NW_DOM_Node_getNextSibling(node), dictionary);
hgs
parents:
diff changeset
   320
      }
hgs
parents:
diff changeset
   321
  }
hgs
parents:
diff changeset
   322
  return NW_STAT_SUCCESS;
hgs
parents:
diff changeset
   323
}
hgs
parents:
diff changeset
   324
hgs
parents:
diff changeset
   325
/**
hgs
parents:
diff changeset
   326
 * Finds all the string in document
hgs
parents:
diff changeset
   327
 * Returns NW_STAT_BAD_INPUT_PARAM
hgs
parents:
diff changeset
   328
 *         NW_STAT_OUT_OF_MEMORY
hgs
parents:
diff changeset
   329
 *         NW_STAT_SUCCESS
hgs
parents:
diff changeset
   330
 */
hgs
parents:
diff changeset
   331
/* ------------------------------------------------------------------------- */
hgs
parents:
diff changeset
   332
static
hgs
parents:
diff changeset
   333
NW_Status_t
hgs
parents:
diff changeset
   334
NW_Encoder_StringTable_findDocStrings(NW_Encoder_StringTable_t *strTable,
hgs
parents:
diff changeset
   335
                                      NW_DOM_DocumentNode_t *doc,
hgs
parents:
diff changeset
   336
                                      NW_WBXML_Dictionary_t *dictionary)
hgs
parents:
diff changeset
   337
{
hgs
parents:
diff changeset
   338
  NW_String_t docType;
hgs
parents:
diff changeset
   339
  NW_DOM_ElementNode_t *elem;
hgs
parents:
diff changeset
   340
  NW_Status_t status;
hgs
parents:
diff changeset
   341
hgs
parents:
diff changeset
   342
  if ((strTable == NULL) || (doc == NULL)){
hgs
parents:
diff changeset
   343
    return NW_STAT_BAD_INPUT_PARAM;
hgs
parents:
diff changeset
   344
  }
hgs
parents:
diff changeset
   345
hgs
parents:
diff changeset
   346
  if (NW_DOM_DocumentNode_getPublicIdAsNumber(doc) == 0)
hgs
parents:
diff changeset
   347
  {
hgs
parents:
diff changeset
   348
    NW_Uint32 ignoreVal;
hgs
parents:
diff changeset
   349
    status = NW_DOM_DocumentNode_getPublicId(doc, &docType);
hgs
parents:
diff changeset
   350
    if (status != NW_STAT_SUCCESS){
hgs
parents:
diff changeset
   351
      return status;
hgs
parents:
diff changeset
   352
    }
hgs
parents:
diff changeset
   353
    status = NW_Encoder_StringTable_append(strTable, &docType, NW_TRUE,
hgs
parents:
diff changeset
   354
                                           &ignoreVal);
hgs
parents:
diff changeset
   355
    if (status != NW_STAT_SUCCESS){
hgs
parents:
diff changeset
   356
      return status;
hgs
parents:
diff changeset
   357
    }
hgs
parents:
diff changeset
   358
  }
hgs
parents:
diff changeset
   359
  elem = NW_DOM_DocumentNode_getDocumentElement(doc);
hgs
parents:
diff changeset
   360
  status = NW_Encoder_StringTable_getNodeStrings(strTable, elem, dictionary);
hgs
parents:
diff changeset
   361
  return status;
hgs
parents:
diff changeset
   362
}
hgs
parents:
diff changeset
   363
hgs
parents:
diff changeset
   364
/* ------------------------------------------------------------------------- *
hgs
parents:
diff changeset
   365
   public methods
hgs
parents:
diff changeset
   366
 * ------------------------------------------------------------------------- */
hgs
parents:
diff changeset
   367
hgs
parents:
diff changeset
   368
/*
hgs
parents:
diff changeset
   369
 * Creates a new String Table
hgs
parents:
diff changeset
   370
 */
hgs
parents:
diff changeset
   371
/* ------------------------------------------------------------------------- */
hgs
parents:
diff changeset
   372
EXPORT_C
hgs
parents:
diff changeset
   373
NW_Encoder_StringTable_t *
hgs
parents:
diff changeset
   374
NW_Encoder_StringTable_new()
hgs
parents:
diff changeset
   375
{
hgs
parents:
diff changeset
   376
  NW_Encoder_StringTable_t* strTable;
hgs
parents:
diff changeset
   377
hgs
parents:
diff changeset
   378
  strTable = (NW_Encoder_StringTable_t*)
hgs
parents:
diff changeset
   379
              NW_Mem_Malloc(sizeof(NW_Encoder_StringTable_t));
hgs
parents:
diff changeset
   380
  if (strTable != NULL){
hgs
parents:
diff changeset
   381
    strTable->vector = CXML_Vector_Construct(sizeof(NW_Encoder_StringItem_t), 4);
hgs
parents:
diff changeset
   382
		if(strTable->vector == NULL)
hgs
parents:
diff changeset
   383
		{
hgs
parents:
diff changeset
   384
			NW_Mem_Free(strTable);
hgs
parents:
diff changeset
   385
			return NULL;
hgs
parents:
diff changeset
   386
		}
hgs
parents:
diff changeset
   387
  }
hgs
parents:
diff changeset
   388
hgs
parents:
diff changeset
   389
  return strTable;
hgs
parents:
diff changeset
   390
}
hgs
parents:
diff changeset
   391
hgs
parents:
diff changeset
   392
/*
hgs
parents:
diff changeset
   393
 * Deletes a String Table
hgs
parents:
diff changeset
   394
 */
hgs
parents:
diff changeset
   395
/* ------------------------------------------------------------------------- */
hgs
parents:
diff changeset
   396
hgs
parents:
diff changeset
   397
EXPORT_C void
hgs
parents:
diff changeset
   398
NW_Encoder_StringTable_delete(NW_Encoder_StringTable_t* strTable)
hgs
parents:
diff changeset
   399
{
hgs
parents:
diff changeset
   400
  CXML_Vector_t* vectorObj = NULL;
hgs
parents:
diff changeset
   401
  NW_Encoder_StringItem_t* strItem = NULL;
hgs
parents:
diff changeset
   402
  CXML_Vector_Metric_t index;
hgs
parents:
diff changeset
   403
hgs
parents:
diff changeset
   404
    if (strTable == NULL)
hgs
parents:
diff changeset
   405
    {
hgs
parents:
diff changeset
   406
     return;
hgs
parents:
diff changeset
   407
    }
hgs
parents:
diff changeset
   408
  
hgs
parents:
diff changeset
   409
  if(strTable->vector)
hgs
parents:
diff changeset
   410
  {
hgs
parents:
diff changeset
   411
   vectorObj = strTable->vector;
hgs
parents:
diff changeset
   412
  }
hgs
parents:
diff changeset
   413
  
hgs
parents:
diff changeset
   414
  //Free the data memory.
hgs
parents:
diff changeset
   415
hgs
parents:
diff changeset
   416
  
hgs
parents:
diff changeset
   417
  for (index = 0; index < vectorObj->size; index++) 
hgs
parents:
diff changeset
   418
  {
hgs
parents:
diff changeset
   419
    strItem = (NW_Encoder_StringItem_t*) CXML_Vector_AddressAt(vectorObj,index);
hgs
parents:
diff changeset
   420
    if(strItem)       
hgs
parents:
diff changeset
   421
    {
hgs
parents:
diff changeset
   422
     if((strItem->data).storage)
hgs
parents:
diff changeset
   423
     {
hgs
parents:
diff changeset
   424
      NW_Mem_Free ( (strItem->data).storage);
hgs
parents:
diff changeset
   425
     }
hgs
parents:
diff changeset
   426
    }		
hgs
parents:
diff changeset
   427
  }/*end for() */
hgs
parents:
diff changeset
   428
hgs
parents:
diff changeset
   429
  CXML_Vector_Destruct(strTable->vector);
hgs
parents:
diff changeset
   430
  NW_Mem_Free(strTable);
hgs
parents:
diff changeset
   431
}
hgs
parents:
diff changeset
   432
hgs
parents:
diff changeset
   433
/* returns number of elements in the string table */
hgs
parents:
diff changeset
   434
/* ------------------------------------------------------------------------- */
hgs
parents:
diff changeset
   435
EXPORT_C CXML_Vector_Metric_t
hgs
parents:
diff changeset
   436
NW_Encoder_StringTable_GetSize(NW_Encoder_StringTable_t *strTable)
hgs
parents:
diff changeset
   437
{
hgs
parents:
diff changeset
   438
  return (NW_Uint32)strTable->vector->size;
hgs
parents:
diff changeset
   439
}
hgs
parents:
diff changeset
   440
hgs
parents:
diff changeset
   441
/**
hgs
parents:
diff changeset
   442
 * Appends new found string in the document to the list. If the string
hgs
parents:
diff changeset
   443
 * was already present in the list, then it increases its frequency,
hgs
parents:
diff changeset
   444
 * otherwise it creates a new StringItem in the list
hgs
parents:
diff changeset
   445
 *
hgs
parents:
diff changeset
   446
 * MODIFIED index n= of the string into the table
hgs
parents:
diff changeset
   447
 *
hgs
parents:
diff changeset
   448
 * Returns NW_STAT_BAD_INPUT_PARAM
hgs
parents:
diff changeset
   449
 *         NW_STAT_STR_TBL_OVERFLOW
hgs
parents:
diff changeset
   450
 *         NW_STAT_OUT_OF_MEMORY
hgs
parents:
diff changeset
   451
 *         NW_STAT_SUCCESS
hgs
parents:
diff changeset
   452
 */
hgs
parents:
diff changeset
   453
/* ------------------------------------------------------------------------- */
hgs
parents:
diff changeset
   454
NW_Status_t
hgs
parents:
diff changeset
   455
NW_Encoder_StringTable_append(NW_Encoder_StringTable_t *strTable,
hgs
parents:
diff changeset
   456
                              NW_String_t *string,
hgs
parents:
diff changeset
   457
                              NW_Bool literalOrDocType,
hgs
parents:
diff changeset
   458
                              NW_Uint32 *extensionByteOffset)
hgs
parents:
diff changeset
   459
{
hgs
parents:
diff changeset
   460
  NW_Encoder_StringItem_t* strItem;
hgs
parents:
diff changeset
   461
  NW_Encoder_StringItem_t newStrItem;
hgs
parents:
diff changeset
   462
  NW_Uint32 ignoreVal;
hgs
parents:
diff changeset
   463
  NW_Status_t status;
hgs
parents:
diff changeset
   464
hgs
parents:
diff changeset
   465
  if ((strTable == NULL) || (string == NULL)){
hgs
parents:
diff changeset
   466
    return NW_STAT_BAD_INPUT_PARAM;
hgs
parents:
diff changeset
   467
  }
hgs
parents:
diff changeset
   468
hgs
parents:
diff changeset
   469
  newStrItem.data.storage = NULL;
hgs
parents:
diff changeset
   470
hgs
parents:
diff changeset
   471
  /* Also, there can be malformed document. cXML parser wants to limits
hgs
parents:
diff changeset
   472
   * non DTD elements or attributes. So check current number of elements
hgs
parents:
diff changeset
   473
   * in the parser. This is for security reasons.
hgs
parents:
diff changeset
   474
   */
hgs
parents:
diff changeset
   475
hgs
parents:
diff changeset
   476
   if((NW_Uint32)strTable->vector->size > CXML_MAX_STRTBL_ITEMS)
hgs
parents:
diff changeset
   477
   {
hgs
parents:
diff changeset
   478
    return NW_STAT_STR_TBL_OVERFLOW;
hgs
parents:
diff changeset
   479
   }
hgs
parents:
diff changeset
   480
hgs
parents:
diff changeset
   481
  /* Find if string is already there in the string table.  By design
hgs
parents:
diff changeset
   482
   if string isn't found, then *extensionByteOffset has value equal to
hgs
parents:
diff changeset
   483
   the offset of the new item to add which is just the count of all
hgs
parents:
diff changeset
   484
   bytes already in the string table. */
hgs
parents:
diff changeset
   485
  strItem = NW_Encoder_StringTable_find(strTable, string, &ignoreVal,
hgs
parents:
diff changeset
   486
                                         extensionByteOffset);
hgs
parents:
diff changeset
   487
  if (strItem != NULL) {
hgs
parents:
diff changeset
   488
    strItem->frequency++;
hgs
parents:
diff changeset
   489
    return NW_STAT_SUCCESS;
hgs
parents:
diff changeset
   490
  }
hgs
parents:
diff changeset
   491
  /* string not found, create a new entry. We need a duplicating the 
hgs
parents:
diff changeset
   492
   * strings.
hgs
parents:
diff changeset
   493
  */
hgs
parents:
diff changeset
   494
hgs
parents:
diff changeset
   495
  status = NW_Encoder_StringItem_initialize(&newStrItem, string);
hgs
parents:
diff changeset
   496
hgs
parents:
diff changeset
   497
  
hgs
parents:
diff changeset
   498
  if (status != NW_STAT_SUCCESS){
hgs
parents:
diff changeset
   499
    return status;
hgs
parents:
diff changeset
   500
  }
hgs
parents:
diff changeset
   501
  if (literalOrDocType){
hgs
parents:
diff changeset
   502
    newStrItem.frequency = 2;
hgs
parents:
diff changeset
   503
  }
hgs
parents:
diff changeset
   504
  CXML_Vector_InsertAt(strTable->vector, &newStrItem,
hgs
parents:
diff changeset
   505
                       CXML_Vector_AtEnd, NULL);
hgs
parents:
diff changeset
   506
hgs
parents:
diff changeset
   507
  
hgs
parents:
diff changeset
   508
  return NW_STAT_SUCCESS;
hgs
parents:
diff changeset
   509
}
hgs
parents:
diff changeset
   510
hgs
parents:
diff changeset
   511
/*
hgs
parents:
diff changeset
   512
 * Finds a string in the list and returns the corresponding
hgs
parents:
diff changeset
   513
 * StringItem, otherwise returns NULL
hgs
parents:
diff changeset
   514
 */
hgs
parents:
diff changeset
   515
/* ------------------------------------------------------------------------- */
hgs
parents:
diff changeset
   516
NW_Encoder_StringItem_t*
hgs
parents:
diff changeset
   517
NW_Encoder_StringTable_find(NW_Encoder_StringTable_t *strTable,
hgs
parents:
diff changeset
   518
                            NW_String_t *string,
hgs
parents:
diff changeset
   519
                            NW_Uint32 *strIndex,
hgs
parents:
diff changeset
   520
                            NW_Uint32 *byteOffset)
hgs
parents:
diff changeset
   521
{
hgs
parents:
diff changeset
   522
  CXML_Vector_Metric_t index;
hgs
parents:
diff changeset
   523
hgs
parents:
diff changeset
   524
  if ((strTable == NULL) || (string == NULL)){
hgs
parents:
diff changeset
   525
    return NULL;
hgs
parents:
diff changeset
   526
  }
hgs
parents:
diff changeset
   527
  *strIndex = 0;
hgs
parents:
diff changeset
   528
  *byteOffset = 0;
hgs
parents:
diff changeset
   529
  for (index = 0;
hgs
parents:
diff changeset
   530
       index < strTable->vector->size;
hgs
parents:
diff changeset
   531
       index++)
hgs
parents:
diff changeset
   532
  {
hgs
parents:
diff changeset
   533
    NW_Encoder_StringItem_t *item;
hgs
parents:
diff changeset
   534
hgs
parents:
diff changeset
   535
    item = (NW_Encoder_StringItem_t*)
hgs
parents:
diff changeset
   536
            CXML_Vector_ElementAt(strTable->vector, index);
hgs
parents:
diff changeset
   537
    if (NW_String_equals(string, &item->data))
hgs
parents:
diff changeset
   538
    {
hgs
parents:
diff changeset
   539
      *strIndex = index;
hgs
parents:
diff changeset
   540
      return item;
hgs
parents:
diff changeset
   541
    }
hgs
parents:
diff changeset
   542
    *byteOffset = *byteOffset + NW_String_getByteCount(&item->data);
hgs
parents:
diff changeset
   543
  }
hgs
parents:
diff changeset
   544
  return NULL;
hgs
parents:
diff changeset
   545
}
hgs
parents:
diff changeset
   546
hgs
parents:
diff changeset
   547
/**
hgs
parents:
diff changeset
   548
 * Finds the string at a given index
hgs
parents:
diff changeset
   549
 */
hgs
parents:
diff changeset
   550
/* ------------------------------------------------------------------------- */
hgs
parents:
diff changeset
   551
NW_Status_t
hgs
parents:
diff changeset
   552
NW_Encoder_StringTable_get(NW_Encoder_StringTable_t *strTable,
hgs
parents:
diff changeset
   553
                           NW_Uint32 index,
hgs
parents:
diff changeset
   554
                           NW_String_t* string)
hgs
parents:
diff changeset
   555
{
hgs
parents:
diff changeset
   556
  NW_Encoder_StringItem_t *strItem;
hgs
parents:
diff changeset
   557
hgs
parents:
diff changeset
   558
  strItem = (NW_Encoder_StringItem_t*)
hgs
parents:
diff changeset
   559
          CXML_Vector_ElementAt(strTable->vector,
hgs
parents:
diff changeset
   560
                                     (CXML_Vector_Metric_t)index);
hgs
parents:
diff changeset
   561
hgs
parents:
diff changeset
   562
  if (strItem){
hgs
parents:
diff changeset
   563
    string->storage = strItem->data.storage;
hgs
parents:
diff changeset
   564
    string->length = strItem->data.length;
hgs
parents:
diff changeset
   565
    return NW_STAT_SUCCESS;
hgs
parents:
diff changeset
   566
  }
hgs
parents:
diff changeset
   567
  return NW_STAT_FAILURE;
hgs
parents:
diff changeset
   568
}
hgs
parents:
diff changeset
   569
hgs
parents:
diff changeset
   570
/**
hgs
parents:
diff changeset
   571
 * Finds item at a given index
hgs
parents:
diff changeset
   572
 */
hgs
parents:
diff changeset
   573
/* ------------------------------------------------------------------------- */
hgs
parents:
diff changeset
   574
NW_Encoder_StringItem_t*
hgs
parents:
diff changeset
   575
NW_Encoder_StringTable_getItemAt(NW_Encoder_StringTable_t *strTable,
hgs
parents:
diff changeset
   576
                                 NW_Uint32 index)
hgs
parents:
diff changeset
   577
{
hgs
parents:
diff changeset
   578
  return  (NW_Encoder_StringItem_t*)
hgs
parents:
diff changeset
   579
          CXML_Vector_ElementAt(strTable->vector,
hgs
parents:
diff changeset
   580
                                     (CXML_Vector_Metric_t)index);
hgs
parents:
diff changeset
   581
}
hgs
parents:
diff changeset
   582
hgs
parents:
diff changeset
   583
/**
hgs
parents:
diff changeset
   584
 * Removes a string item
hgs
parents:
diff changeset
   585
 */
hgs
parents:
diff changeset
   586
/* ------------------------------------------------------------------------- */
hgs
parents:
diff changeset
   587
NW_Status_t
hgs
parents:
diff changeset
   588
NW_Encoder_StringTable_removeAt(NW_Encoder_StringTable_t *strTable,
hgs
parents:
diff changeset
   589
                                CXML_Vector_Metric_t index)
hgs
parents:
diff changeset
   590
{
hgs
parents:
diff changeset
   591
  return CXML_Vector_RemoveAt(strTable->vector, (CXML_Vector_Metric_t)index);
hgs
parents:
diff changeset
   592
}
hgs
parents:
diff changeset
   593
hgs
parents:
diff changeset
   594
/*
hgs
parents:
diff changeset
   595
 * Returns the total number of bytes used for storing all the
hgs
parents:
diff changeset
   596
 * strings in the list
hgs
parents:
diff changeset
   597
 */
hgs
parents:
diff changeset
   598
/* ------------------------------------------------------------------------- */
hgs
parents:
diff changeset
   599
EXPORT_C NW_Uint32
hgs
parents:
diff changeset
   600
NW_Encoder_StringTable_getTotalBytes(NW_Encoder_StringTable_t *strTable)
hgs
parents:
diff changeset
   601
{
hgs
parents:
diff changeset
   602
  NW_Uint32 byteLength;
hgs
parents:
diff changeset
   603
  CXML_Vector_Metric_t index;
hgs
parents:
diff changeset
   604
hgs
parents:
diff changeset
   605
  byteLength = 0;
hgs
parents:
diff changeset
   606
hgs
parents:
diff changeset
   607
  for (index = 0;
hgs
parents:
diff changeset
   608
       index < strTable->vector->size;
hgs
parents:
diff changeset
   609
       index++)
hgs
parents:
diff changeset
   610
 {
hgs
parents:
diff changeset
   611
    NW_Encoder_StringItem_t *strItem;
hgs
parents:
diff changeset
   612
hgs
parents:
diff changeset
   613
    strItem = (NW_Encoder_StringItem_t*)
hgs
parents:
diff changeset
   614
            CXML_Vector_ElementAt(strTable->vector, index);
hgs
parents:
diff changeset
   615
    byteLength += strItem->data.length;
hgs
parents:
diff changeset
   616
  }
hgs
parents:
diff changeset
   617
hgs
parents:
diff changeset
   618
  return byteLength;
hgs
parents:
diff changeset
   619
}
hgs
parents:
diff changeset
   620
hgs
parents:
diff changeset
   621
/* ------------------------------------------------------------------------- */
hgs
parents:
diff changeset
   622
EXPORT_C NW_Status_t
hgs
parents:
diff changeset
   623
NW_Encoder_StringTable_createFromDOM(NW_Encoder_StringTable_t *strTable,
hgs
parents:
diff changeset
   624
                                     NW_DOM_DocumentNode_t *doc,
hgs
parents:
diff changeset
   625
                                     NW_WBXML_Dictionary_t *dictionary)
hgs
parents:
diff changeset
   626
{
hgs
parents:
diff changeset
   627
hgs
parents:
diff changeset
   628
  /* make a table of strings in the document */
hgs
parents:
diff changeset
   629
  NW_Encoder_StringTable_findDocStrings(strTable, doc, dictionary);
hgs
parents:
diff changeset
   630
hgs
parents:
diff changeset
   631
  /* The string table will be freed once at the end. So, don't do
hgs
parents:
diff changeset
   632
   * this here. This is causing the memory leak otherwise.
hgs
parents:
diff changeset
   633
   */
hgs
parents:
diff changeset
   634
  return NW_STAT_SUCCESS;
hgs
parents:
diff changeset
   635
}
hgs
parents:
diff changeset
   636
hgs
parents:
diff changeset
   637
hgs
parents:
diff changeset
   638
/* callback implementations */
hgs
parents:
diff changeset
   639
/* ------------------------------------------------------------------------- */
hgs
parents:
diff changeset
   640
EXPORT_C NW_Status_t
hgs
parents:
diff changeset
   641
NW_Encoder_StringTable_getStringTableOffset(void* pStringTableObject,
hgs
parents:
diff changeset
   642
                                            NW_Uint32 byteCount,
hgs
parents:
diff changeset
   643
                                            const NW_Uint8* pString,
hgs
parents:
diff changeset
   644
                                            NW_Bool* pFound,
hgs
parents:
diff changeset
   645
                                            NW_Uint32* pTableOffset)
hgs
parents:
diff changeset
   646
{
hgs
parents:
diff changeset
   647
  NW_Encoder_StringItem_t *strItem;
hgs
parents:
diff changeset
   648
  NW_Uint32 strIndex;
hgs
parents:
diff changeset
   649
  NW_String_t string;
hgs
parents:
diff changeset
   650
hgs
parents:
diff changeset
   651
  string.storage = (NW_Byte*)pString;
hgs
parents:
diff changeset
   652
  string.length = byteCount;
hgs
parents:
diff changeset
   653
hgs
parents:
diff changeset
   654
  strItem = NW_Encoder_StringTable_find((NW_Encoder_StringTable_t*) pStringTableObject, 
hgs
parents:
diff changeset
   655
                                        &string, &strIndex, pTableOffset);
hgs
parents:
diff changeset
   656
hgs
parents:
diff changeset
   657
  if (strItem == NULL)
hgs
parents:
diff changeset
   658
      *pFound = NW_FALSE;
hgs
parents:
diff changeset
   659
  else
hgs
parents:
diff changeset
   660
      *pFound = NW_TRUE;
hgs
parents:
diff changeset
   661
hgs
parents:
diff changeset
   662
  return NW_STAT_SUCCESS;
hgs
parents:
diff changeset
   663
}
hgs
parents:
diff changeset
   664
hgs
parents:
diff changeset
   665
/* ------------------------------------------------------------------------- */
hgs
parents:
diff changeset
   666
EXPORT_C NW_Status_t
hgs
parents:
diff changeset
   667
NW_Encoder_StringTable_addToStringTable(void* pStringTableObject,
hgs
parents:
diff changeset
   668
                                        NW_Uint32 byteCount,
hgs
parents:
diff changeset
   669
                                        const NW_Uint8* pString,
hgs
parents:
diff changeset
   670
                                        NW_Uint32* pTableOffset)
hgs
parents:
diff changeset
   671
{
hgs
parents:
diff changeset
   672
  NW_String_t string;
hgs
parents:
diff changeset
   673
hgs
parents:
diff changeset
   674
  string.storage = (NW_Byte*)pString;
hgs
parents:
diff changeset
   675
  string.length = byteCount;
hgs
parents:
diff changeset
   676
  *pTableOffset = 0;
hgs
parents:
diff changeset
   677
  return NW_Encoder_StringTable_append((NW_Encoder_StringTable_t*) pStringTableObject, 
hgs
parents:
diff changeset
   678
                                       &string, NW_TRUE, pTableOffset);
hgs
parents:
diff changeset
   679
}
hgs
parents:
diff changeset
   680
hgs
parents:
diff changeset
   681
/* ------------------------------------------------------------------------- */
hgs
parents:
diff changeset
   682
EXPORT_C NW_Status_t
hgs
parents:
diff changeset
   683
NW_Encoder_StringTable_StringTableIterateInit(void* pStringTableObject,
hgs
parents:
diff changeset
   684
                                              void* pStringTableIterator)
hgs
parents:
diff changeset
   685
{
hgs
parents:
diff changeset
   686
  NW_Encoder_StringTableIterator_t *strIterator;
hgs
parents:
diff changeset
   687
hgs
parents:
diff changeset
   688
  strIterator = (NW_Encoder_StringTableIterator_t*)pStringTableIterator;
hgs
parents:
diff changeset
   689
  strIterator->strTable = (NW_Encoder_StringTable_t*)pStringTableObject;
hgs
parents:
diff changeset
   690
  strIterator->currentIndex = 0;
hgs
parents:
diff changeset
   691
  return NW_STAT_SUCCESS;
hgs
parents:
diff changeset
   692
}
hgs
parents:
diff changeset
   693
hgs
parents:
diff changeset
   694
/* at end of string table return byteCount = 0 */
hgs
parents:
diff changeset
   695
/* ------------------------------------------------------------------------- */
hgs
parents:
diff changeset
   696
EXPORT_C NW_Status_t
hgs
parents:
diff changeset
   697
NW_Encoder_StringTable_StringTableIterateNext(void* pStringTableIterator,
hgs
parents:
diff changeset
   698
                                              NW_Uint32* pByteCount,
hgs
parents:
diff changeset
   699
                                              NW_Uint8** ppBuf)
hgs
parents:
diff changeset
   700
{
hgs
parents:
diff changeset
   701
  NW_Encoder_StringTableIterator_t *strIterator;
hgs
parents:
diff changeset
   702
  CXML_Vector_Metric_t size;
hgs
parents:
diff changeset
   703
  NW_String_t string;
hgs
parents:
diff changeset
   704
  NW_Status_t status;
hgs
parents:
diff changeset
   705
hgs
parents:
diff changeset
   706
  strIterator = (NW_Encoder_StringTableIterator_t*)pStringTableIterator;
hgs
parents:
diff changeset
   707
  size = NW_Encoder_StringTable_GetSize(strIterator->strTable);
hgs
parents:
diff changeset
   708
hgs
parents:
diff changeset
   709
  if (strIterator->currentIndex >= size){
hgs
parents:
diff changeset
   710
    return NW_STAT_WBXML_ITERATE_DONE;
hgs
parents:
diff changeset
   711
  }
hgs
parents:
diff changeset
   712
  status = NW_Encoder_StringTable_get(strIterator->strTable, strIterator->currentIndex, &string);
hgs
parents:
diff changeset
   713
  if (status != NW_STAT_SUCCESS){
hgs
parents:
diff changeset
   714
    return status;
hgs
parents:
diff changeset
   715
  }
hgs
parents:
diff changeset
   716
  *pByteCount = string.length;
hgs
parents:
diff changeset
   717
  *ppBuf = string.storage;
hgs
parents:
diff changeset
   718
  strIterator->currentIndex++;
hgs
parents:
diff changeset
   719
  return NW_STAT_WBXML_ITERATE_MORE;
hgs
parents:
diff changeset
   720
}
hgs
parents:
diff changeset
   721