xml/cxmllibrary/src/encoder/src/WBXMLWriter.cpp
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 "cxml_internal.h"
hgs
parents:
diff changeset
    20
#include <xml/cxml/nw_wbxml_token.h>
hgs
parents:
diff changeset
    21
#include <xml/cxml/nw_encoder_wbxmlwriter.h>
hgs
parents:
diff changeset
    22
#include <xml/cxml/nw_wbxml_parse.h>
hgs
parents:
diff changeset
    23
#include "cxml_mem.h"
hgs
parents:
diff changeset
    24
hgs
parents:
diff changeset
    25
// WLIU_DEBUG: #include "flogger.h"
hgs
parents:
diff changeset
    26
  /* a reserved name used for encoding tags and attributes that
hgs
parents:
diff changeset
    27
otherwise aren't in the dictionaries. zzzunknown must be in the
hgs
parents:
diff changeset
    28
dictionary for both tag names and attribute names */
hgs
parents:
diff changeset
    29
#define zzzunknownCharCount 10
hgs
parents:
diff changeset
    30
static const NW_Uint8 zzzunknown[] = {'z','z','z','u','n','k','n','o','w','n','\0'};
hgs
parents:
diff changeset
    31
#define zzzunknownEncoding HTTP_utf_8
hgs
parents:
diff changeset
    32
hgs
parents:
diff changeset
    33
hgs
parents:
diff changeset
    34
static
hgs
parents:
diff changeset
    35
NW_Status_t
hgs
parents:
diff changeset
    36
NW_WBXML_Writer_Memcpy(NW_WBXML_Writer_t* pW, const NW_Uint8* pBytes,
hgs
parents:
diff changeset
    37
                       NW_Uint32 writeLength)
hgs
parents:
diff changeset
    38
{
hgs
parents:
diff changeset
    39
  NW_Status_t s = NW_STAT_SUCCESS;
hgs
parents:
diff changeset
    40
  if (writeLength == 0) {
hgs
parents:
diff changeset
    41
    return NW_STAT_FAILURE;
hgs
parents:
diff changeset
    42
  }
hgs
parents:
diff changeset
    43
  if (!pW->sizing) {
hgs
parents:
diff changeset
    44
    if (((pW->index + writeLength - 1) >= pW->byteCount)
hgs
parents:
diff changeset
    45
        && (pW->growBufCallback != NULL)) {
hgs
parents:
diff changeset
    46
      /* try to grow buf */
hgs
parents:
diff changeset
    47
      s = (*pW->growBufCallback)(pW, writeLength);
hgs
parents:
diff changeset
    48
      if (NW_STAT_IS_FAILURE(s)) {
hgs
parents:
diff changeset
    49
        return s;
hgs
parents:
diff changeset
    50
      }
hgs
parents:
diff changeset
    51
    }
hgs
parents:
diff changeset
    52
    if ((pW->index + writeLength - 1) >= pW->byteCount) {
hgs
parents:
diff changeset
    53
      /* grow buf unavailable or didn't alloc enough */
hgs
parents:
diff changeset
    54
      return NW_STAT_OUT_OF_MEMORY;
hgs
parents:
diff changeset
    55
    }
hgs
parents:
diff changeset
    56
    NW_Mem_memcpy(pW->pBuf + pW->index, pBytes, writeLength);
hgs
parents:
diff changeset
    57
  }
hgs
parents:
diff changeset
    58
  pW->index += writeLength;
hgs
parents:
diff changeset
    59
  return s;
hgs
parents:
diff changeset
    60
}
hgs
parents:
diff changeset
    61
hgs
parents:
diff changeset
    62
typedef struct NW_WBXML_Multibyte_s {
hgs
parents:
diff changeset
    63
  NW_Uint8 length; /* encoded length in bytes from 1..5 */
hgs
parents:
diff changeset
    64
  NW_Uint8 buf[5];
hgs
parents:
diff changeset
    65
} NW_WBXML_Multibyte_t;
hgs
parents:
diff changeset
    66
hgs
parents:
diff changeset
    67
/* see the WBXML specification for the definition of this function */
hgs
parents:
diff changeset
    68
static
hgs
parents:
diff changeset
    69
void
hgs
parents:
diff changeset
    70
NW_WBXML_EncodeMultibyte(NW_Uint32 x, NW_WBXML_Multibyte_t* pM)
hgs
parents:
diff changeset
    71
{
hgs
parents:
diff changeset
    72
  NW_Uint8 i;
hgs
parents:
diff changeset
    73
  NW_Uint8 littleEndian[5];
hgs
parents:
diff changeset
    74
hgs
parents:
diff changeset
    75
  littleEndian[0] = (NW_Uint8)(x & 0x7f);
hgs
parents:
diff changeset
    76
  for (i = 1; i < 5; i++) {
hgs
parents:
diff changeset
    77
    x >>= 7; /* unsigned x, no sign extension */
hgs
parents:
diff changeset
    78
    littleEndian[i] = (NW_Uint8)(x & 0x7f);
hgs
parents:
diff changeset
    79
    if (!x) {
hgs
parents:
diff changeset
    80
      break;
hgs
parents:
diff changeset
    81
    }
hgs
parents:
diff changeset
    82
  }
hgs
parents:
diff changeset
    83
  pM->length = i;
hgs
parents:
diff changeset
    84
  for (i = 0; i < pM->length; i++) {
hgs
parents:
diff changeset
    85
    pM->buf[i] = littleEndian[pM->length - 1 - i];
hgs
parents:
diff changeset
    86
    if ((i + 1) < pM->length) {
hgs
parents:
diff changeset
    87
      pM->buf[i] |= 0x80;
hgs
parents:
diff changeset
    88
    }
hgs
parents:
diff changeset
    89
  }
hgs
parents:
diff changeset
    90
}
hgs
parents:
diff changeset
    91
hgs
parents:
diff changeset
    92
static
hgs
parents:
diff changeset
    93
NW_Status_t
hgs
parents:
diff changeset
    94
NW_WBXML_Writer_Multibyte(NW_WBXML_Writer_t* pW, NW_Uint32 x)
hgs
parents:
diff changeset
    95
{
hgs
parents:
diff changeset
    96
  NW_WBXML_Multibyte_t multibyte;
hgs
parents:
diff changeset
    97
hgs
parents:
diff changeset
    98
  NW_WBXML_EncodeMultibyte(x, &multibyte);
hgs
parents:
diff changeset
    99
  return NW_WBXML_Writer_Memcpy(pW, multibyte.buf,
hgs
parents:
diff changeset
   100
                                multibyte.length);
hgs
parents:
diff changeset
   101
}
hgs
parents:
diff changeset
   102
hgs
parents:
diff changeset
   103
typedef enum {
hgs
parents:
diff changeset
   104
    NW_WBXML_TAG,
hgs
parents:
diff changeset
   105
    NW_WBXML_ATTRIBUTE
hgs
parents:
diff changeset
   106
} NW_WBXML_Writer_ItemType;
hgs
parents:
diff changeset
   107
hgs
parents:
diff changeset
   108
static
hgs
parents:
diff changeset
   109
NW_Status_t
hgs
parents:
diff changeset
   110
NW_WBXML_Writer_MaybeSwitchPage(NW_WBXML_Writer_t* pW, NW_Uint8 page,
hgs
parents:
diff changeset
   111
                                NW_WBXML_Writer_ItemType itemType,
hgs
parents:
diff changeset
   112
                                NW_Bool* switched)
hgs
parents:
diff changeset
   113
{
hgs
parents:
diff changeset
   114
  NW_Status_t s = NW_STAT_SUCCESS;
hgs
parents:
diff changeset
   115
  NW_Uint8 token = NW_WBXML_SWITCH_PAGE; /* global so on all code pages */
hgs
parents:
diff changeset
   116
  NW_Bool changePage = 0;
hgs
parents:
diff changeset
   117
hgs
parents:
diff changeset
   118
  *switched = NW_FALSE;
hgs
parents:
diff changeset
   119
  switch (itemType) {
hgs
parents:
diff changeset
   120
  case NW_WBXML_TAG:
hgs
parents:
diff changeset
   121
    changePage = (NW_Bool)(page != pW->tagCodePage);
hgs
parents:
diff changeset
   122
    if (changePage) {
hgs
parents:
diff changeset
   123
      pW->tagCodePage = page;
hgs
parents:
diff changeset
   124
      // WLIU_DEBUG: pW->cp_count++;
hgs
parents:
diff changeset
   125
    }
hgs
parents:
diff changeset
   126
    break;
hgs
parents:
diff changeset
   127
  case NW_WBXML_ATTRIBUTE:
hgs
parents:
diff changeset
   128
    changePage = (NW_Bool)(page != pW->attributeCodePage);
hgs
parents:
diff changeset
   129
    if (changePage) {
hgs
parents:
diff changeset
   130
      pW->attributeCodePage = page;
hgs
parents:
diff changeset
   131
      // WLIU_DEBUG: pW->cp_count++;
hgs
parents:
diff changeset
   132
    }
hgs
parents:
diff changeset
   133
    break;
hgs
parents:
diff changeset
   134
  default:
hgs
parents:
diff changeset
   135
    s = NW_STAT_FAILURE;
hgs
parents:
diff changeset
   136
    break;
hgs
parents:
diff changeset
   137
  }
hgs
parents:
diff changeset
   138
  if (changePage) { 
hgs
parents:
diff changeset
   139
    s = NW_WBXML_Writer_Memcpy(pW, &token, 1);
hgs
parents:
diff changeset
   140
    // WLIU_DEBUG: RFileLogger::WriteFormat(_L("Browser"), _L("cp_count.txt"), EFileLoggingModeAppend, _L("=== cp_count: %x, pW->index: %x \n"), pW->cp_count, pW->index);
hgs
parents:
diff changeset
   141
    if (NW_STAT_IS_FAILURE(s)) {
hgs
parents:
diff changeset
   142
      return s;
hgs
parents:
diff changeset
   143
    }
hgs
parents:
diff changeset
   144
    s = NW_WBXML_Writer_Memcpy(pW, &page, 1);
hgs
parents:
diff changeset
   145
        if (NW_STAT_IS_FAILURE(s)) {
hgs
parents:
diff changeset
   146
      return s;
hgs
parents:
diff changeset
   147
    }
hgs
parents:
diff changeset
   148
    *switched = NW_TRUE;
hgs
parents:
diff changeset
   149
  }
hgs
parents:
diff changeset
   150
  return s;
hgs
parents:
diff changeset
   151
}
hgs
parents:
diff changeset
   152
hgs
parents:
diff changeset
   153
EXPORT_C
hgs
parents:
diff changeset
   154
NW_Status_t
hgs
parents:
diff changeset
   155
NW_WBXML_Writer_Header(NW_WBXML_Writer_t* pW, NW_Uint8 WBXMLVersion,
hgs
parents:
diff changeset
   156
                       NW_Uint32 publicIdentifier, NW_Uint32 charsetMIBEnum,
hgs
parents:
diff changeset
   157
                       NW_Uint32 stringTableByteCount)
hgs
parents:
diff changeset
   158
hgs
parents:
diff changeset
   159
{
hgs
parents:
diff changeset
   160
  NW_Status_t s;
hgs
parents:
diff changeset
   161
  NW_Uint32 byteCount;
hgs
parents:
diff changeset
   162
  NW_Uint8* pBuf;
hgs
parents:
diff changeset
   163
  NW_Encoder_StringTableIterator_t strTableIterator;
hgs
parents:
diff changeset
   164
hgs
parents:
diff changeset
   165
  /* header = version publicid charset stringtable */
hgs
parents:
diff changeset
   166
hgs
parents:
diff changeset
   167
  s = NW_WBXML_Writer_Memcpy(pW, &WBXMLVersion, 1);
hgs
parents:
diff changeset
   168
  if (NW_STAT_IS_FAILURE(s)) {
hgs
parents:
diff changeset
   169
    return s;
hgs
parents:
diff changeset
   170
  }
hgs
parents:
diff changeset
   171
  s = NW_WBXML_Writer_Multibyte(pW, publicIdentifier);
hgs
parents:
diff changeset
   172
  if (NW_STAT_IS_FAILURE(s)) {
hgs
parents:
diff changeset
   173
    return s;
hgs
parents:
diff changeset
   174
  }
hgs
parents:
diff changeset
   175
  s = NW_WBXML_Writer_Multibyte(pW, charsetMIBEnum);
hgs
parents:
diff changeset
   176
  if (NW_STAT_IS_FAILURE(s)) {
hgs
parents:
diff changeset
   177
    return s;
hgs
parents:
diff changeset
   178
  }
hgs
parents:
diff changeset
   179
  s = NW_WBXML_Writer_Multibyte(pW, stringTableByteCount);
hgs
parents:
diff changeset
   180
  if (NW_STAT_IS_FAILURE(s)) {
hgs
parents:
diff changeset
   181
    return s;
hgs
parents:
diff changeset
   182
  }
hgs
parents:
diff changeset
   183
  if (stringTableByteCount) {
hgs
parents:
diff changeset
   184
    NW_ASSERT(pW->stringTableIterateInit);
hgs
parents:
diff changeset
   185
    NW_ASSERT(pW->stringTableIterateNext);
hgs
parents:
diff changeset
   186
    s = (*(pW->stringTableIterateInit))(pW->pStringTableObject,
hgs
parents:
diff changeset
   187
                                        &strTableIterator);
hgs
parents:
diff changeset
   188
    if (NW_STAT_IS_FAILURE(s)) {
hgs
parents:
diff changeset
   189
      return s;
hgs
parents:
diff changeset
   190
    }
hgs
parents:
diff changeset
   191
    s = (*(pW->stringTableIterateNext))(&strTableIterator,
hgs
parents:
diff changeset
   192
                                        &byteCount, &pBuf);
hgs
parents:
diff changeset
   193
    while (s == NW_STAT_WBXML_ITERATE_MORE){
hgs
parents:
diff changeset
   194
      s = NW_WBXML_Writer_Memcpy(pW, pBuf, byteCount);
hgs
parents:
diff changeset
   195
      if (s != NW_STAT_SUCCESS){
hgs
parents:
diff changeset
   196
        return s;
hgs
parents:
diff changeset
   197
      }
hgs
parents:
diff changeset
   198
      s = (*(pW->stringTableIterateNext))(&strTableIterator,
hgs
parents:
diff changeset
   199
                                          &byteCount, &pBuf);
hgs
parents:
diff changeset
   200
    }
hgs
parents:
diff changeset
   201
    if (s != NW_STAT_WBXML_ITERATE_DONE){
hgs
parents:
diff changeset
   202
      return NW_STAT_FAILURE;
hgs
parents:
diff changeset
   203
    }
hgs
parents:
diff changeset
   204
  }
hgs
parents:
diff changeset
   205
  return NW_STAT_SUCCESS;
hgs
parents:
diff changeset
   206
}
hgs
parents:
diff changeset
   207
hgs
parents:
diff changeset
   208
/* if boolean "set" is 1 then "or" with mask, else "and" with ~mask */
hgs
parents:
diff changeset
   209
static
hgs
parents:
diff changeset
   210
NW_Status_t
hgs
parents:
diff changeset
   211
NW_WBXML_Writer_TagFlagOp(NW_WBXML_Writer_t* pW, NW_Uint32 index,
hgs
parents:
diff changeset
   212
                          NW_Uint8 mask, NW_Bool set)
hgs
parents:
diff changeset
   213
{
hgs
parents:
diff changeset
   214
  NW_Status_t s = NW_STAT_SUCCESS;
hgs
parents:
diff changeset
   215
  if (!pW->sizing) {
hgs
parents:
diff changeset
   216
    if (index < pW->byteCount) {
hgs
parents:
diff changeset
   217
      if (set) {
hgs
parents:
diff changeset
   218
        (pW->pBuf)[index] |= mask;
hgs
parents:
diff changeset
   219
      } else {
hgs
parents:
diff changeset
   220
        (pW->pBuf)[index] &= ~mask;
hgs
parents:
diff changeset
   221
      }
hgs
parents:
diff changeset
   222
    } else {
hgs
parents:
diff changeset
   223
      s = NW_STAT_FAILURE;
hgs
parents:
diff changeset
   224
    }
hgs
parents:
diff changeset
   225
  }
hgs
parents:
diff changeset
   226
  return s;
hgs
parents:
diff changeset
   227
}
hgs
parents:
diff changeset
   228
hgs
parents:
diff changeset
   229
EXPORT_C
hgs
parents:
diff changeset
   230
NW_Status_t
hgs
parents:
diff changeset
   231
NW_WBXML_Writer_TagSetContentFlag(NW_WBXML_Writer_t* pW, NW_Uint32 index)
hgs
parents:
diff changeset
   232
{
hgs
parents:
diff changeset
   233
  return NW_WBXML_Writer_TagFlagOp(pW, index, NW_WBXML_FLAGS_CONTENT, 1);
hgs
parents:
diff changeset
   234
}
hgs
parents:
diff changeset
   235
hgs
parents:
diff changeset
   236
EXPORT_C
hgs
parents:
diff changeset
   237
NW_Status_t
hgs
parents:
diff changeset
   238
NW_WBXML_Writer_TagClearContentFlag(NW_WBXML_Writer_t* pW, NW_Uint32 index)
hgs
parents:
diff changeset
   239
{
hgs
parents:
diff changeset
   240
  return NW_WBXML_Writer_TagFlagOp(pW, index, NW_WBXML_FLAGS_CONTENT, 0);
hgs
parents:
diff changeset
   241
}
hgs
parents:
diff changeset
   242
hgs
parents:
diff changeset
   243
EXPORT_C
hgs
parents:
diff changeset
   244
NW_Status_t
hgs
parents:
diff changeset
   245
NW_WBXML_Writer_TagSetAttributesFlag(NW_WBXML_Writer_t* pW, NW_Uint32 index)
hgs
parents:
diff changeset
   246
{
hgs
parents:
diff changeset
   247
  return NW_WBXML_Writer_TagFlagOp(pW, index, NW_WBXML_FLAGS_ATTRIBUTES, 1);
hgs
parents:
diff changeset
   248
}
hgs
parents:
diff changeset
   249
hgs
parents:
diff changeset
   250
NW_Status_t
hgs
parents:
diff changeset
   251
NW_WBXML_Writer_TagClearAttributesFlag(NW_WBXML_Writer_t* pW, NW_Uint32 index)
hgs
parents:
diff changeset
   252
{
hgs
parents:
diff changeset
   253
  return NW_WBXML_Writer_TagFlagOp(pW, index, NW_WBXML_FLAGS_ATTRIBUTES, 0);
hgs
parents:
diff changeset
   254
}
hgs
parents:
diff changeset
   255
hgs
parents:
diff changeset
   256
NW_Status_t
hgs
parents:
diff changeset
   257
NW_WBXML_Writer_TagToken(NW_WBXML_Writer_t* pW, NW_Uint16 fqToken,
hgs
parents:
diff changeset
   258
                    NW_Uint32* pTagIndex)
hgs
parents:
diff changeset
   259
{
hgs
parents:
diff changeset
   260
  NW_Status_t s;
hgs
parents:
diff changeset
   261
  NW_Uint8 token;
hgs
parents:
diff changeset
   262
  NW_Uint8 page;
hgs
parents:
diff changeset
   263
  NW_Bool  switched = NW_FALSE;
hgs
parents:
diff changeset
   264
hgs
parents:
diff changeset
   265
  token = NW_WBXML_Dictionary_extractToken(fqToken);
hgs
parents:
diff changeset
   266
  page =  NW_WBXML_Dictionary_extractPage(fqToken);
hgs
parents:
diff changeset
   267
hgs
parents:
diff changeset
   268
  s = NW_WBXML_Writer_MaybeSwitchPage(pW, page, NW_WBXML_TAG, &switched);
hgs
parents:
diff changeset
   269
  if (NW_STAT_IS_FAILURE(s)) {
hgs
parents:
diff changeset
   270
    return s;
hgs
parents:
diff changeset
   271
  }
hgs
parents:
diff changeset
   272
  *pTagIndex = pW->index;
hgs
parents:
diff changeset
   273
  return NW_WBXML_Writer_Memcpy(pW, &token, 1); /* tag token */
hgs
parents:
diff changeset
   274
  }
hgs
parents:
diff changeset
   275
hgs
parents:
diff changeset
   276
static
hgs
parents:
diff changeset
   277
NW_Status_t
hgs
parents:
diff changeset
   278
NW_WBXML_Writer_Literal(NW_WBXML_Writer_t* pW, NW_Uint32 stringTableIndex)
hgs
parents:
diff changeset
   279
  {
hgs
parents:
diff changeset
   280
  NW_Status_t s;
hgs
parents:
diff changeset
   281
hgs
parents:
diff changeset
   282
  /* global in WBXML spec, so on all code pages */
hgs
parents:
diff changeset
   283
  static const NW_Uint8 literalToken = NW_WBXML_LITERAL;
hgs
parents:
diff changeset
   284
hgs
parents:
diff changeset
   285
  s = NW_WBXML_Writer_Memcpy(pW, &literalToken, 1);
hgs
parents:
diff changeset
   286
    if (NW_STAT_IS_FAILURE(s)) {
hgs
parents:
diff changeset
   287
      return s;
hgs
parents:
diff changeset
   288
    }
hgs
parents:
diff changeset
   289
  return NW_WBXML_Writer_Multibyte(pW, stringTableIndex);
hgs
parents:
diff changeset
   290
  }
hgs
parents:
diff changeset
   291
hgs
parents:
diff changeset
   292
/* This function will write to the extension string Table. The buffer
hgs
parents:
diff changeset
   293
 * "pBuf" is not NULL terminated. This can handle any type of encoding.
hgs
parents:
diff changeset
   294
 */
hgs
parents:
diff changeset
   295
hgs
parents:
diff changeset
   296
hgs
parents:
diff changeset
   297
static
hgs
parents:
diff changeset
   298
NW_Status_t
hgs
parents:
diff changeset
   299
NW_WBXML_Writer_StringTableLiteral2(NW_WBXML_Writer_t* pW,
hgs
parents:
diff changeset
   300
                                   NW_Uint32 charCount,
hgs
parents:
diff changeset
   301
                                   const NW_Uint8* pBuf,
hgs
parents:
diff changeset
   302
                                   NW_Uint32 encoding)
hgs
parents:
diff changeset
   303
{
hgs
parents:
diff changeset
   304
 NW_Uint32 byteCount = 0;
hgs
parents:
diff changeset
   305
 NW_Uint32 totalByteCount = 0;
hgs
parents:
diff changeset
   306
 NW_Ucs2 c;
hgs
parents:
diff changeset
   307
 NW_Uint32 numbytes;
hgs
parents:
diff changeset
   308
 NW_Uint8* literalName = NULL;
hgs
parents:
diff changeset
   309
 NW_Status_t s = NW_STAT_SUCCESS;
hgs
parents:
diff changeset
   310
 NW_Uint32 i =0;
hgs
parents:
diff changeset
   311
 NW_Uint32 tableIndex = 0;
hgs
parents:
diff changeset
   312
hgs
parents:
diff changeset
   313
 if(pBuf == NULL)
hgs
parents:
diff changeset
   314
 {
hgs
parents:
diff changeset
   315
  return NW_STAT_BAD_INPUT_PARAM;
hgs
parents:
diff changeset
   316
 }
hgs
parents:
diff changeset
   317
hgs
parents:
diff changeset
   318
 if (pW->addToStringTable != NULL) 
hgs
parents:
diff changeset
   319
   {
hgs
parents:
diff changeset
   320
hgs
parents:
diff changeset
   321
   /*
hgs
parents:
diff changeset
   322
    * pBuf is not NULL terminated. So, need to use the following method.
hgs
parents:
diff changeset
   323
    */
hgs
parents:
diff changeset
   324
hgs
parents:
diff changeset
   325
    numbytes = NW_String_readChar( (NW_Byte*) pBuf,&c,encoding);
hgs
parents:
diff changeset
   326
hgs
parents:
diff changeset
   327
   /* Calculate the length of string. Also add the number of characters 
hgs
parents:
diff changeset
   328
    * required for the NULL termination.
hgs
parents:
diff changeset
   329
    */
hgs
parents:
diff changeset
   330
hgs
parents:
diff changeset
   331
    byteCount = (numbytes * charCount) ;
hgs
parents:
diff changeset
   332
        
hgs
parents:
diff changeset
   333
    totalByteCount = byteCount + numbytes;
hgs
parents:
diff changeset
   334
hgs
parents:
diff changeset
   335
hgs
parents:
diff changeset
   336
    literalName = (NW_Uint8*) NW_Mem_Malloc(totalByteCount);
hgs
parents:
diff changeset
   337
hgs
parents:
diff changeset
   338
    if (literalName != NULL) 
hgs
parents:
diff changeset
   339
     {
hgs
parents:
diff changeset
   340
      (void)NW_Mem_memcpy(literalName, pBuf, byteCount );
hgs
parents:
diff changeset
   341
hgs
parents:
diff changeset
   342
hgs
parents:
diff changeset
   343
       for(i=0; i < numbytes; i++)
hgs
parents:
diff changeset
   344
       {
hgs
parents:
diff changeset
   345
        literalName[byteCount+i] = '\0';
hgs
parents:
diff changeset
   346
       }
hgs
parents:
diff changeset
   347
hgs
parents:
diff changeset
   348
hgs
parents:
diff changeset
   349
       /* During the PASS -1, the Literal is also added to the string table
hgs
parents:
diff changeset
   350
        * so the correct index of Literal can be found. The index of the literal
hgs
parents:
diff changeset
   351
        * is written in the WBXML buffer. The index is UINT 32 so (index = 01) and
hgs
parents:
diff changeset
   352
        * (index == 0x80) is encoded differently in the WBXML integer encoding. So, 
hgs
parents:
diff changeset
   353
        * string table function calculates the correct index. So, the calling function
hgs
parents:
diff changeset
   354
        * should free the string table after PASS-1. Currently, PASS-1 and PASS-2 is 
hgs
parents:
diff changeset
   355
        * used in the XML parser only.
hgs
parents:
diff changeset
   356
        */
hgs
parents:
diff changeset
   357
hgs
parents:
diff changeset
   358
hgs
parents:
diff changeset
   359
       s = (*pW->addToStringTable)(pW->pStringTableObject,
hgs
parents:
diff changeset
   360
                                    totalByteCount, literalName,
hgs
parents:
diff changeset
   361
                                    &tableIndex);
hgs
parents:
diff changeset
   362
      if (NW_STAT_IS_SUCCESS(s))
hgs
parents:
diff changeset
   363
      {
hgs
parents:
diff changeset
   364
       s = NW_WBXML_Writer_Literal(pW,tableIndex);
hgs
parents:
diff changeset
   365
       if(literalName != NULL)
hgs
parents:
diff changeset
   366
       {
hgs
parents:
diff changeset
   367
        NW_Mem_Free(literalName);
hgs
parents:
diff changeset
   368
       }
hgs
parents:
diff changeset
   369
      }
hgs
parents:
diff changeset
   370
     }/*end if (literalName != NULL) */
hgs
parents:
diff changeset
   371
     else
hgs
parents:
diff changeset
   372
     {
hgs
parents:
diff changeset
   373
      s = NW_STAT_OUT_OF_MEMORY;
hgs
parents:
diff changeset
   374
     }
hgs
parents:
diff changeset
   375
 } /*end if(pW->addToStringTable != NULL)*/
hgs
parents:
diff changeset
   376
hgs
parents:
diff changeset
   377
return s;
hgs
parents:
diff changeset
   378
}/* NW_WBXML_Writer_StringTableLiteral2(..) */
hgs
parents:
diff changeset
   379
hgs
parents:
diff changeset
   380
/* Examine the out parameter *pFound to see if the string was found in
hgs
parents:
diff changeset
   381
the string table.  If it wasn't found, then it can't be written as a literal
hgs
parents:
diff changeset
   382
in WBXML.  A failure return code means something else went wrong. The key
hgs
parents:
diff changeset
   383
part of this function is that it just queries the string table and doesn't
hgs
parents:
diff changeset
   384
try to force the string to be added to the string table. */
hgs
parents:
diff changeset
   385
static
hgs
parents:
diff changeset
   386
NW_Status_t
hgs
parents:
diff changeset
   387
NW_WBXML_Writer_StringTableLiteral(NW_WBXML_Writer_t* pW,
hgs
parents:
diff changeset
   388
                                   NW_Uint32 byteCount,
hgs
parents:
diff changeset
   389
                                   const NW_Uint8* pBuf,
hgs
parents:
diff changeset
   390
                                   NW_Bool* pFound)
hgs
parents:
diff changeset
   391
{
hgs
parents:
diff changeset
   392
  NW_Status_t s;
hgs
parents:
diff changeset
   393
  NW_Uint32 tableIndex = 0;
hgs
parents:
diff changeset
   394
hgs
parents:
diff changeset
   395
  *pFound = 0;
hgs
parents:
diff changeset
   396
  if (pW->getStringTableOffset) {
hgs
parents:
diff changeset
   397
    s = (*pW->getStringTableOffset)(pW->pStringTableObject,
hgs
parents:
diff changeset
   398
                                    byteCount, pBuf,
hgs
parents:
diff changeset
   399
                                    pFound, &tableIndex);
hgs
parents:
diff changeset
   400
    if (NW_STAT_IS_FAILURE(s)) {
hgs
parents:
diff changeset
   401
      return s;
hgs
parents:
diff changeset
   402
    }
hgs
parents:
diff changeset
   403
  }
hgs
parents:
diff changeset
   404
  if (*pFound) {
hgs
parents:
diff changeset
   405
    /* global, so on all code pages */
hgs
parents:
diff changeset
   406
    static const NW_Uint8 tableRefToken = NW_WBXML_STR_T;
hgs
parents:
diff changeset
   407
hgs
parents:
diff changeset
   408
    s = NW_WBXML_Writer_Memcpy(pW, &tableRefToken, 1);
hgs
parents:
diff changeset
   409
    if (NW_STAT_IS_FAILURE(s)) {
hgs
parents:
diff changeset
   410
      return s;
hgs
parents:
diff changeset
   411
    }
hgs
parents:
diff changeset
   412
    return NW_WBXML_Writer_Multibyte(pW, tableIndex);
hgs
parents:
diff changeset
   413
  }
hgs
parents:
diff changeset
   414
  /* *pFound indicates whether the string table entry was found so
hgs
parents:
diff changeset
   415
     we return success */
hgs
parents:
diff changeset
   416
  return NW_STAT_SUCCESS;
hgs
parents:
diff changeset
   417
}
hgs
parents:
diff changeset
   418
hgs
parents:
diff changeset
   419
/* charCount should not include null termination character if any exists */
hgs
parents:
diff changeset
   420
EXPORT_C
hgs
parents:
diff changeset
   421
NW_Status_t
hgs
parents:
diff changeset
   422
NW_WBXML_Writer_TagString(NW_WBXML_Writer_t* pW, NW_Uint32 encoding,
hgs
parents:
diff changeset
   423
                          NW_Uint32 charCount, NW_Uint32 byteCount,
hgs
parents:
diff changeset
   424
                          NW_Uint8* pBuf, NW_Uint32* pTagIndex)
hgs
parents:
diff changeset
   425
{
hgs
parents:
diff changeset
   426
  NW_Status_t s;
hgs
parents:
diff changeset
   427
  NW_Uint16 fqToken;
hgs
parents:
diff changeset
   428
hgs
parents:
diff changeset
   429
  (void) byteCount;
hgs
parents:
diff changeset
   430
hgs
parents:
diff changeset
   431
  /* try token */
hgs
parents:
diff changeset
   432
  s = NW_WBXML_Dictionary_getTagToken2(pW->pTagDictionary, encoding,
hgs
parents:
diff changeset
   433
                                       charCount, pBuf, &fqToken);
hgs
parents:
diff changeset
   434
  if (NW_STAT_IS_SUCCESS(s)) {
hgs
parents:
diff changeset
   435
    return NW_WBXML_Writer_TagToken(pW, fqToken, pTagIndex);
hgs
parents:
diff changeset
   436
  }
hgs
parents:
diff changeset
   437
hgs
parents:
diff changeset
   438
  /* try string table reference */
hgs
parents:
diff changeset
   439
  if (pW->addToStringTable != NULL)
hgs
parents:
diff changeset
   440
  {
hgs
parents:
diff changeset
   441
    *pTagIndex = pW->index;
hgs
parents:
diff changeset
   442
    s = NW_WBXML_Writer_StringTableLiteral2(pW, charCount, pBuf, encoding);
hgs
parents:
diff changeset
   443
    // Return on success or failure (out of memory, etc.) except
hgs
parents:
diff changeset
   444
    // NW_STAT_STR_TBL_OVERFLOW.
hgs
parents:
diff changeset
   445
    if (s != NW_STAT_STR_TBL_OVERFLOW)
hgs
parents:
diff changeset
   446
    {
hgs
parents:
diff changeset
   447
      return s;
hgs
parents:
diff changeset
   448
    }
hgs
parents:
diff changeset
   449
  }
hgs
parents:
diff changeset
   450
  
hgs
parents:
diff changeset
   451
  /* no token, not in string table...try to encode as the unknown tag */
hgs
parents:
diff changeset
   452
  s = NW_WBXML_Dictionary_getTagToken2(pW->pTagDictionary, zzzunknownEncoding,
hgs
parents:
diff changeset
   453
                                       zzzunknownCharCount,
hgs
parents:
diff changeset
   454
                                       (NW_Uint8*)&zzzunknown[0],
hgs
parents:
diff changeset
   455
                                       &fqToken);
hgs
parents:
diff changeset
   456
  if (NW_STAT_IS_SUCCESS(s)) 
hgs
parents:
diff changeset
   457
  {
hgs
parents:
diff changeset
   458
   return NW_WBXML_Writer_TagToken(pW, fqToken, pTagIndex);
hgs
parents:
diff changeset
   459
  }
hgs
parents:
diff changeset
   460
hgs
parents:
diff changeset
   461
  /* getting here means no token, no string table entry
hgs
parents:
diff changeset
   462
  and the reserved unknown tag is missing from the dictionary */
hgs
parents:
diff changeset
   463
  NW_ASSERT(s == NW_STAT_SUCCESS); /* force error to be caught here */
hgs
parents:
diff changeset
   464
  return s;
hgs
parents:
diff changeset
   465
}
hgs
parents:
diff changeset
   466
hgs
parents:
diff changeset
   467
static
hgs
parents:
diff changeset
   468
NW_Status_t
hgs
parents:
diff changeset
   469
NW_WBXML_Writer_InlineString(NW_WBXML_Writer_t* pW,
hgs
parents:
diff changeset
   470
                             NW_Uint32 encoding,
hgs
parents:
diff changeset
   471
                             NW_Uint32 byteCount,
hgs
parents:
diff changeset
   472
                             const NW_Uint8* pTextIn)
hgs
parents:
diff changeset
   473
{
hgs
parents:
diff changeset
   474
  NW_Uint8* pTextOut = (NW_Uint8*)pTextIn; /* default */
hgs
parents:
diff changeset
   475
  NW_Status_t s;
hgs
parents:
diff changeset
   476
  NW_Bool nullTerminated;
hgs
parents:
diff changeset
   477
  NW_Uint8 token = NW_WBXML_STR_I; /* global so on all code pages */
hgs
parents:
diff changeset
   478
hgs
parents:
diff changeset
   479
  nullTerminated = NW_FALSE;
hgs
parents:
diff changeset
   480
hgs
parents:
diff changeset
   481
  s = NW_WBXML_Writer_Memcpy(pW, &token, 1);
hgs
parents:
diff changeset
   482
  if (NW_STAT_IS_FAILURE(s)) {
hgs
parents:
diff changeset
   483
    if (pTextOut != pTextIn) {
hgs
parents:
diff changeset
   484
      NW_Mem_Free(pTextOut);
hgs
parents:
diff changeset
   485
    }
hgs
parents:
diff changeset
   486
    return s;
hgs
parents:
diff changeset
   487
  }
hgs
parents:
diff changeset
   488
  s = NW_WBXML_Writer_Memcpy(pW, pTextOut, byteCount);
hgs
parents:
diff changeset
   489
  if (NW_STAT_IS_FAILURE(s)) {
hgs
parents:
diff changeset
   490
    if (pTextOut != pTextIn) {
hgs
parents:
diff changeset
   491
      NW_Mem_Free(pTextOut);
hgs
parents:
diff changeset
   492
    }
hgs
parents:
diff changeset
   493
    return s;
hgs
parents:
diff changeset
   494
  }
hgs
parents:
diff changeset
   495
  if (pTextOut != pTextIn) {
hgs
parents:
diff changeset
   496
    NW_Mem_Free(pTextOut);
hgs
parents:
diff changeset
   497
  }
hgs
parents:
diff changeset
   498
hgs
parents:
diff changeset
   499
  /* test string to see if written bytes are already null terminated */
hgs
parents:
diff changeset
   500
  /* FUTURE MISSING UTILITY SUPPORT
hgs
parents:
diff changeset
   501
  this char encoding API isn't implemented yet
hgs
parents:
diff changeset
   502
  NW_Char_SimpleString_t n;
hgs
parents:
diff changeset
   503
  s = NW_CharEncoding_nullTermination(encoding, &n);
hgs
parents:
diff changeset
   504
  if (NW_STAT_IS_FAILURE(s)) {
hgs
parents:
diff changeset
   505
    return s;
hgs
parents:
diff changeset
   506
  }
hgs
parents:
diff changeset
   507
  test if null termination already written and if not...
hgs
parents:
diff changeset
   508
  s = NW_WBXML_Writer_Memcpy(pW, n.buf, n.byteCount);
hgs
parents:
diff changeset
   509
  if (NW_STAT_IS_FAILURE(s)) {
hgs
parents:
diff changeset
   510
    return s;
hgs
parents:
diff changeset
   511
  }
hgs
parents:
diff changeset
   512
  */
hgs
parents:
diff changeset
   513
  /* BUG HACK BEGIN
hgs
parents:
diff changeset
   514
  Should not assume null termination missing but this works
hgs
parents:
diff changeset
   515
  with the XMLP client.  Remove this when char encoding
hgs
parents:
diff changeset
   516
  null termination utility support is available */
hgs
parents:
diff changeset
   517
hgs
parents:
diff changeset
   518
  if (encoding == HTTP_iso_10646_ucs_2){
hgs
parents:
diff changeset
   519
    /* just look for any 1 bits in the UCS2 char */
hgs
parents:
diff changeset
   520
    NW_Uint8 lastChar = (pTextIn + byteCount)[-1];
hgs
parents:
diff changeset
   521
    lastChar |= (pTextIn + byteCount)[-2];
hgs
parents:
diff changeset
   522
    if (lastChar == 0){
hgs
parents:
diff changeset
   523
      nullTerminated = NW_TRUE;
hgs
parents:
diff changeset
   524
    }
hgs
parents:
diff changeset
   525
  }
hgs
parents:
diff changeset
   526
  else if ((encoding == HTTP_iso_8859_1) ||
hgs
parents:
diff changeset
   527
            (encoding == HTTP_utf_8) ||
hgs
parents:
diff changeset
   528
            (encoding == HTTP_us_ascii))
hgs
parents:
diff changeset
   529
  {
hgs
parents:
diff changeset
   530
    NW_Uint8 lastChar = (pTextIn + byteCount)[-1];
hgs
parents:
diff changeset
   531
    if (lastChar == 0){
hgs
parents:
diff changeset
   532
      nullTerminated = NW_TRUE;
hgs
parents:
diff changeset
   533
    }
hgs
parents:
diff changeset
   534
  }
hgs
parents:
diff changeset
   535
  else{
hgs
parents:
diff changeset
   536
    NW_ASSERT(0);
hgs
parents:
diff changeset
   537
  }
hgs
parents:
diff changeset
   538
  if (!nullTerminated)
hgs
parents:
diff changeset
   539
  {
hgs
parents:
diff changeset
   540
  token = 0;
hgs
parents:
diff changeset
   541
  s = NW_WBXML_Writer_Memcpy(pW, &token, 1);
hgs
parents:
diff changeset
   542
  if (NW_STAT_IS_FAILURE(s)) {
hgs
parents:
diff changeset
   543
    return s;
hgs
parents:
diff changeset
   544
  }
hgs
parents:
diff changeset
   545
  if (encoding == HTTP_iso_10646_ucs_2) {
hgs
parents:
diff changeset
   546
    s = NW_WBXML_Writer_Memcpy(pW, &token, 1);
hgs
parents:
diff changeset
   547
    if (NW_STAT_IS_FAILURE(s)) {
hgs
parents:
diff changeset
   548
      return s;
hgs
parents:
diff changeset
   549
    }
hgs
parents:
diff changeset
   550
  }
hgs
parents:
diff changeset
   551
  }
hgs
parents:
diff changeset
   552
  /* BUG HACK END */
hgs
parents:
diff changeset
   553
  return NW_STAT_SUCCESS;
hgs
parents:
diff changeset
   554
}
hgs
parents:
diff changeset
   555
hgs
parents:
diff changeset
   556
/*
hgs
parents:
diff changeset
   557
1. charCount should not include null termination character if any exists
hgs
parents:
diff changeset
   558
2. if there is an attribute name but no value use valueCharCount==0,
hgs
parents:
diff changeset
   559
   valueByteCount==0 and pValue==NULL
hgs
parents:
diff changeset
   560
*/
hgs
parents:
diff changeset
   561
EXPORT_C
hgs
parents:
diff changeset
   562
NW_Status_t
hgs
parents:
diff changeset
   563
NW_WBXML_Writer_AttributeAndValue2(NW_WBXML_Writer_t* pW, NW_Uint32 encoding,
hgs
parents:
diff changeset
   564
                                  NW_Uint32 nameCharCount, NW_Uint8* pName,
hgs
parents:
diff changeset
   565
                                  NW_Uint32 valueCharCount, NW_Uint32 valueByteCount,
hgs
parents:
diff changeset
   566
                                  NW_Uint8* pValue,
hgs
parents:
diff changeset
   567
                                  NW_Uint32* cp_count)
hgs
parents:
diff changeset
   568
{
hgs
parents:
diff changeset
   569
  /*
hgs
parents:
diff changeset
   570
  Note: According to the WBXML specification, attribute codes (tokens) may
hgs
parents:
diff changeset
   571
  encode all or a prefix of the attribute value as well as the attribute name.
hgs
parents:
diff changeset
   572
  The implementation here is simpler, it assumes that attribute names are
hgs
parents:
diff changeset
   573
  encoded separately from attribute values.
hgs
parents:
diff changeset
   574
  */
hgs
parents:
diff changeset
   575
  NW_Status_t s;
hgs
parents:
diff changeset
   576
  NW_Uint16 fqToken;
hgs
parents:
diff changeset
   577
  NW_Uint8 token;
hgs
parents:
diff changeset
   578
  NW_Uint8 page;
hgs
parents:
diff changeset
   579
  NW_Bool switched = NW_FALSE;
hgs
parents:
diff changeset
   580
  NW_Bool extStrTbl = NW_FALSE;
hgs
parents:
diff changeset
   581
hgs
parents:
diff changeset
   582
  *cp_count = 0;
hgs
parents:
diff changeset
   583
  /* Note: This dictionary lookup function is insufficient to look up
hgs
parents:
diff changeset
   584
  combined attribute and value.  To do that we must be able to pass both
hgs
parents:
diff changeset
   585
  the name and value and get both a return token and a character count
hgs
parents:
diff changeset
   586
  of the value characters represented by the token so we can tell if there
hgs
parents:
diff changeset
   587
  are remaing value characters to write. */
hgs
parents:
diff changeset
   588
  s = NW_WBXML_Dictionary_getAttributeNameToken(pW->pAttributeDictionary,
hgs
parents:
diff changeset
   589
                                                encoding,
hgs
parents:
diff changeset
   590
                                                nameCharCount, pName, &fqToken);
hgs
parents:
diff changeset
   591
  if (NW_STAT_IS_FAILURE(s)) {
hgs
parents:
diff changeset
   592
    /* failure here means that we should encode as the reserved unknown
hgs
parents:
diff changeset
   593
    name, so force that */
hgs
parents:
diff changeset
   594
    fqToken = NW_WBXML_LITERAL;
hgs
parents:
diff changeset
   595
  }
hgs
parents:
diff changeset
   596
  token = NW_WBXML_Dictionary_extractToken(fqToken);
hgs
parents:
diff changeset
   597
  page =  NW_WBXML_Dictionary_extractPage(fqToken);
hgs
parents:
diff changeset
   598
hgs
parents:
diff changeset
   599
hgs
parents:
diff changeset
   600
  if ((token & NW_WBXML_MASK_TAG_ID) == NW_WBXML_LITERAL)
hgs
parents:
diff changeset
   601
  {
hgs
parents:
diff changeset
   602
   
hgs
parents:
diff changeset
   603
   /* If strig table is supported then the attribute name not found 
hgs
parents:
diff changeset
   604
    * in the dictionary is stored in string table a LITRAL otherwise
hgs
parents:
diff changeset
   605
    * the workaround is to encode the name as a reserved unknown. 
hgs
parents:
diff changeset
   606
   */
hgs
parents:
diff changeset
   607
hgs
parents:
diff changeset
   608
     if (pW->getStringTableOffset)
hgs
parents:
diff changeset
   609
     {
hgs
parents:
diff changeset
   610
      s = NW_WBXML_Writer_StringTableLiteral2(pW,nameCharCount,pName, encoding);
hgs
parents:
diff changeset
   611
hgs
parents:
diff changeset
   612
      if (NW_STAT_IS_FAILURE(s)) 
hgs
parents:
diff changeset
   613
      {
hgs
parents:
diff changeset
   614
       return s;
hgs
parents:
diff changeset
   615
      }
hgs
parents:
diff changeset
   616
      extStrTbl = NW_TRUE;
hgs
parents:
diff changeset
   617
     }//end if(pW->getStringTableOffset)
hgs
parents:
diff changeset
   618
     else
hgs
parents:
diff changeset
   619
     {
hgs
parents:
diff changeset
   620
hgs
parents:
diff changeset
   621
       s = NW_WBXML_Dictionary_getAttributeNameToken(pW->pAttributeDictionary,
hgs
parents:
diff changeset
   622
                                                  zzzunknownEncoding,
hgs
parents:
diff changeset
   623
                                                  zzzunknownCharCount,
hgs
parents:
diff changeset
   624
                                                  (NW_Uint8*)&zzzunknown[0],
hgs
parents:
diff changeset
   625
                                                  &fqToken);
hgs
parents:
diff changeset
   626
       if (NW_STAT_IS_FAILURE(s)) 
hgs
parents:
diff changeset
   627
       {
hgs
parents:
diff changeset
   628
           /* failure here means the reserved unknown name is missing from
hgs
parents:
diff changeset
   629
           the dictionary */
hgs
parents:
diff changeset
   630
          NW_ASSERT(s==NW_STAT_SUCCESS);/*force error to be caught here*/
hgs
parents:
diff changeset
   631
          return s;
hgs
parents:
diff changeset
   632
       }
hgs
parents:
diff changeset
   633
        token = NW_WBXML_Dictionary_extractToken(fqToken);
hgs
parents:
diff changeset
   634
        page =  NW_WBXML_Dictionary_extractPage(fqToken);
hgs
parents:
diff changeset
   635
     }//end else
hgs
parents:
diff changeset
   636
  }//end if ((token & NW_WBXML_MASK_TAG_ID) == NW_WBXML_LITERAL)
hgs
parents:
diff changeset
   637
hgs
parents:
diff changeset
   638
     //
hgs
parents:
diff changeset
   639
     //If attribute name is found in the dictionary only then check for the
hgs
parents:
diff changeset
   640
     // Page switching.
hgs
parents:
diff changeset
   641
     //
hgs
parents:
diff changeset
   642
hgs
parents:
diff changeset
   643
     if(!extStrTbl)
hgs
parents:
diff changeset
   644
     {
hgs
parents:
diff changeset
   645
hgs
parents:
diff changeset
   646
        s = NW_WBXML_Writer_MaybeSwitchPage(pW, page, NW_WBXML_ATTRIBUTE, &switched);
hgs
parents:
diff changeset
   647
        if (NW_STAT_IS_FAILURE(s)) {
hgs
parents:
diff changeset
   648
            return s;
hgs
parents:
diff changeset
   649
         }
hgs
parents:
diff changeset
   650
        if (switched)
hgs
parents:
diff changeset
   651
            *cp_count = *cp_count + 1 ;
hgs
parents:
diff changeset
   652
        s = NW_WBXML_Writer_Memcpy(pW, &token, 1); /* attribute name token */
hgs
parents:
diff changeset
   653
        if (NW_STAT_IS_FAILURE(s)) {
hgs
parents:
diff changeset
   654
           return s;
hgs
parents:
diff changeset
   655
         }
hgs
parents:
diff changeset
   656
     }//end if(!extStrTbl)   
hgs
parents:
diff changeset
   657
hgs
parents:
diff changeset
   658
hgs
parents:
diff changeset
   659
  if ((valueCharCount == 0) && (pValue != NULL))
hgs
parents:
diff changeset
   660
  {
hgs
parents:
diff changeset
   661
    token = NW_WBXML_STR_I; /* global so on all code pages */
hgs
parents:
diff changeset
   662
hgs
parents:
diff changeset
   663
    s = NW_WBXML_Writer_Memcpy(pW, &token, 1);
hgs
parents:
diff changeset
   664
    if (NW_STAT_IS_FAILURE(s)) {
hgs
parents:
diff changeset
   665
      return s;
hgs
parents:
diff changeset
   666
    }
hgs
parents:
diff changeset
   667
    token = 0;
hgs
parents:
diff changeset
   668
    s = NW_WBXML_Writer_Memcpy(pW, &token, 1);
hgs
parents:
diff changeset
   669
    if (NW_STAT_IS_FAILURE(s)) {
hgs
parents:
diff changeset
   670
      return s;
hgs
parents:
diff changeset
   671
    }
hgs
parents:
diff changeset
   672
    if (encoding == HTTP_iso_10646_ucs_2) {
hgs
parents:
diff changeset
   673
      s = NW_WBXML_Writer_Memcpy(pW, &token, 1);
hgs
parents:
diff changeset
   674
      if (NW_STAT_IS_FAILURE(s)) {
hgs
parents:
diff changeset
   675
        return s;
hgs
parents:
diff changeset
   676
      }
hgs
parents:
diff changeset
   677
    }
hgs
parents:
diff changeset
   678
  }
hgs
parents:
diff changeset
   679
  else
hgs
parents:
diff changeset
   680
  {
hgs
parents:
diff changeset
   681
    if ((valueCharCount != 0) && (pValue != NULL))
hgs
parents:
diff changeset
   682
    {
hgs
parents:
diff changeset
   683
      s = NW_WBXML_Dictionary_getAttributeValueToken(pW->pAttributeDictionary,
hgs
parents:
diff changeset
   684
                                                    encoding,
hgs
parents:
diff changeset
   685
                                                    valueCharCount, pValue,
hgs
parents:
diff changeset
   686
                                                    &fqToken);
hgs
parents:
diff changeset
   687
      if (NW_STAT_IS_FAILURE(s)) {
hgs
parents:
diff changeset
   688
        /* failure means couldn't find a token, force to literal */
hgs
parents:
diff changeset
   689
        fqToken = NW_WBXML_LITERAL; /* page is irrelevant here */
hgs
parents:
diff changeset
   690
      }
hgs
parents:
diff changeset
   691
      token = NW_WBXML_Dictionary_extractToken(fqToken);
hgs
parents:
diff changeset
   692
      page =  NW_WBXML_Dictionary_extractPage(fqToken);
hgs
parents:
diff changeset
   693
      if ((token & NW_WBXML_MASK_TAG_ID) == NW_WBXML_LITERAL)
hgs
parents:
diff changeset
   694
      {
hgs
parents:
diff changeset
   695
        s = NW_WBXML_Writer_InlineString(pW, encoding,
hgs
parents:
diff changeset
   696
                                        valueByteCount, pValue);
hgs
parents:
diff changeset
   697
        if (NW_STAT_IS_FAILURE(s)) {
hgs
parents:
diff changeset
   698
          return s;
hgs
parents:
diff changeset
   699
        }
hgs
parents:
diff changeset
   700
      } else {
hgs
parents:
diff changeset
   701
        s = NW_WBXML_Writer_MaybeSwitchPage(pW, page,
hgs
parents:
diff changeset
   702
                                            NW_WBXML_ATTRIBUTE, &switched);
hgs
parents:
diff changeset
   703
        if (NW_STAT_IS_FAILURE(s)) {
hgs
parents:
diff changeset
   704
          return s;
hgs
parents:
diff changeset
   705
        }
hgs
parents:
diff changeset
   706
        if (switched)
hgs
parents:
diff changeset
   707
          *cp_count = *cp_count + 1 ;
hgs
parents:
diff changeset
   708
        s = NW_WBXML_Writer_Memcpy(pW, &token, 1);/*attr value token*/
hgs
parents:
diff changeset
   709
        if (NW_STAT_IS_FAILURE(s)) {
hgs
parents:
diff changeset
   710
          return s;
hgs
parents:
diff changeset
   711
        }
hgs
parents:
diff changeset
   712
      }
hgs
parents:
diff changeset
   713
    }
hgs
parents:
diff changeset
   714
  }
hgs
parents:
diff changeset
   715
  return NW_STAT_SUCCESS;
hgs
parents:
diff changeset
   716
}
hgs
parents:
diff changeset
   717
hgs
parents:
diff changeset
   718
EXPORT_C
hgs
parents:
diff changeset
   719
NW_Status_t
hgs
parents:
diff changeset
   720
NW_WBXML_Writer_AttributeAndValue(NW_WBXML_Writer_t* pW, NW_Uint32 encoding,
hgs
parents:
diff changeset
   721
                                  NW_Uint32 nameCharCount, NW_Uint8* pName,
hgs
parents:
diff changeset
   722
                                  NW_Uint32 valueCharCount, NW_Uint32 valueByteCount,
hgs
parents:
diff changeset
   723
                                  NW_Uint8* pValue)
hgs
parents:
diff changeset
   724
{
hgs
parents:
diff changeset
   725
  NW_Uint32 cp_cnt = 0;
hgs
parents:
diff changeset
   726
  return NW_WBXML_Writer_AttributeAndValue2(pW, encoding, nameCharCount, pName, valueCharCount, 
hgs
parents:
diff changeset
   727
                                  valueByteCount, pValue, &cp_cnt);
hgs
parents:
diff changeset
   728
hgs
parents:
diff changeset
   729
}
hgs
parents:
diff changeset
   730
hgs
parents:
diff changeset
   731
NW_Status_t
hgs
parents:
diff changeset
   732
NW_WBXML_Writer_AttributeNameString(NW_WBXML_Writer_t* pW, NW_Uint32 encoding,
hgs
parents:
diff changeset
   733
                                    NW_Uint32 nameCharCount,
hgs
parents:
diff changeset
   734
                                    NW_Uint32 nameByteCount, NW_Uint8* pName)
hgs
parents:
diff changeset
   735
{
hgs
parents:
diff changeset
   736
  NW_Status_t s;
hgs
parents:
diff changeset
   737
  NW_Uint16 fqToken;
hgs
parents:
diff changeset
   738
hgs
parents:
diff changeset
   739
  (void) nameByteCount;
hgs
parents:
diff changeset
   740
hgs
parents:
diff changeset
   741
  /* try token */
hgs
parents:
diff changeset
   742
  s = NW_WBXML_Dictionary_getAttributeToken2(pW->pAttributeDictionary,
hgs
parents:
diff changeset
   743
                                             encoding, nameCharCount,
hgs
parents:
diff changeset
   744
                                             pName, &fqToken,
hgs
parents:
diff changeset
   745
                                             NW_TRUE /* isName */);
hgs
parents:
diff changeset
   746
  if (NW_STAT_IS_SUCCESS(s)) {
hgs
parents:
diff changeset
   747
    return NW_WBXML_Writer_AttributeToken(pW, fqToken);
hgs
parents:
diff changeset
   748
  }
hgs
parents:
diff changeset
   749
hgs
parents:
diff changeset
   750
  /* try string table */
hgs
parents:
diff changeset
   751
  if (pW->addToStringTable != NULL) {
hgs
parents:
diff changeset
   752
    s = NW_WBXML_Writer_StringTableLiteral2(pW, nameCharCount, pName, encoding);
hgs
parents:
diff changeset
   753
    return s;
hgs
parents:
diff changeset
   754
    
hgs
parents:
diff changeset
   755
  }
hgs
parents:
diff changeset
   756
  /* no token, no string table so try unknown token */
hgs
parents:
diff changeset
   757
  s = NW_WBXML_Dictionary_getAttributeToken2(pW->pAttributeDictionary,
hgs
parents:
diff changeset
   758
                                             zzzunknownEncoding,
hgs
parents:
diff changeset
   759
                                             zzzunknownCharCount,
hgs
parents:
diff changeset
   760
                                             (NW_Uint8*)&zzzunknown[0],
hgs
parents:
diff changeset
   761
                                             &fqToken,
hgs
parents:
diff changeset
   762
                                             NW_TRUE /* isName */);
hgs
parents:
diff changeset
   763
  if (NW_STAT_IS_SUCCESS(s)) {
hgs
parents:
diff changeset
   764
    return NW_WBXML_Writer_AttributeToken(pW, fqToken);
hgs
parents:
diff changeset
   765
  }
hgs
parents:
diff changeset
   766
  NW_ASSERT(NW_STAT_IS_SUCCESS(s)); /* force debug to stop here */
hgs
parents:
diff changeset
   767
  return NW_STAT_FAILURE;
hgs
parents:
diff changeset
   768
}
hgs
parents:
diff changeset
   769
hgs
parents:
diff changeset
   770
NW_Status_t
hgs
parents:
diff changeset
   771
NW_WBXML_Writer_AttributeToken(NW_WBXML_Writer_t* pW,
hgs
parents:
diff changeset
   772
                               NW_Uint16 fqToken)
hgs
parents:
diff changeset
   773
hgs
parents:
diff changeset
   774
{
hgs
parents:
diff changeset
   775
  NW_Status_t s;
hgs
parents:
diff changeset
   776
  NW_Uint8 token;
hgs
parents:
diff changeset
   777
  NW_Uint8 page;
hgs
parents:
diff changeset
   778
  NW_Bool switched = NW_FALSE;
hgs
parents:
diff changeset
   779
hgs
parents:
diff changeset
   780
  token = NW_WBXML_Dictionary_extractToken(fqToken);
hgs
parents:
diff changeset
   781
  page =  NW_WBXML_Dictionary_extractPage(fqToken);
hgs
parents:
diff changeset
   782
hgs
parents:
diff changeset
   783
  s = NW_WBXML_Writer_MaybeSwitchPage(pW, page, NW_WBXML_ATTRIBUTE, &switched);
hgs
parents:
diff changeset
   784
  if (NW_STAT_IS_FAILURE(s)) {
hgs
parents:
diff changeset
   785
    return s;
hgs
parents:
diff changeset
   786
  }
hgs
parents:
diff changeset
   787
  return NW_WBXML_Writer_Memcpy(pW, &token, 1); /* attribute token */
hgs
parents:
diff changeset
   788
}
hgs
parents:
diff changeset
   789
hgs
parents:
diff changeset
   790
NW_Status_t
hgs
parents:
diff changeset
   791
NW_WBXML_Writer_Entity(NW_WBXML_Writer_t* pW,
hgs
parents:
diff changeset
   792
                       NW_Uint32 entity)
hgs
parents:
diff changeset
   793
{
hgs
parents:
diff changeset
   794
  NW_Status_t s;
hgs
parents:
diff changeset
   795
  static const NW_Uint8 entityToken = NW_WBXML_ENTITY;
hgs
parents:
diff changeset
   796
hgs
parents:
diff changeset
   797
  s = NW_WBXML_Writer_Memcpy(pW, &entityToken, 1);
hgs
parents:
diff changeset
   798
  if (NW_STAT_IS_FAILURE(s)) {
hgs
parents:
diff changeset
   799
    return s;
hgs
parents:
diff changeset
   800
  }
hgs
parents:
diff changeset
   801
  return NW_WBXML_Writer_Multibyte(pW, entity);
hgs
parents:
diff changeset
   802
}
hgs
parents:
diff changeset
   803
hgs
parents:
diff changeset
   804
/*
hgs
parents:
diff changeset
   805
This is a helper function for the EXT_T_[0,1,2] forms for these extensions.
hgs
parents:
diff changeset
   806
*/
hgs
parents:
diff changeset
   807
NW_Status_t
hgs
parents:
diff changeset
   808
NW_WBXML_Writer_ExtensionUseStringTable(NW_WBXML_Writer_t* pW,
hgs
parents:
diff changeset
   809
                                        NW_Uint16 fqToken,
hgs
parents:
diff changeset
   810
                                        NW_Uint32 byteCount,
hgs
parents:
diff changeset
   811
                                        NW_Uint8* pBuf)
hgs
parents:
diff changeset
   812
{
hgs
parents:
diff changeset
   813
  NW_Uint32 tableIndex;
hgs
parents:
diff changeset
   814
  NW_Status_t s;
hgs
parents:
diff changeset
   815
hgs
parents:
diff changeset
   816
  if (pW->addToStringTable != NULL) {
hgs
parents:
diff changeset
   817
    s = (*pW->addToStringTable)(pW->pStringTableObject,
hgs
parents:
diff changeset
   818
                                byteCount, pBuf, &tableIndex);
hgs
parents:
diff changeset
   819
    if (NW_STAT_IS_SUCCESS(s)) {
hgs
parents:
diff changeset
   820
      return NW_WBXML_Writer_Extension(pW, fqToken, tableIndex, 0, NULL);
hgs
parents:
diff changeset
   821
    }
hgs
parents:
diff changeset
   822
  }
hgs
parents:
diff changeset
   823
  return NW_STAT_FAILURE;
hgs
parents:
diff changeset
   824
}
hgs
parents:
diff changeset
   825
hgs
parents:
diff changeset
   826
/*
hgs
parents:
diff changeset
   827
There are three type of extensions:
hgs
parents:
diff changeset
   828
hgs
parents:
diff changeset
   829
1. one of three possible single byte tokens
hgs
parents:
diff changeset
   830
     NW_WBXML_EXT_[0,1,2]
hgs
parents:
diff changeset
   831
2. an extension token followed by a multibyte encoded NW_Uint32 value
hgs
parents:
diff changeset
   832
     NW_WBXML_EXT_T_[0,1,2] multibyte(anonymousValue)
hgs
parents:
diff changeset
   833
3. an extension token followed by an in-line string
hgs
parents:
diff changeset
   834
     NW_WBXML_EXT_I_[0,1,2] null-terminated-string
hgs
parents:
diff changeset
   835
hgs
parents:
diff changeset
   836
This function handles all three cases so you have to pass the appropriate
hgs
parents:
diff changeset
   837
arguments for each case:
hgs
parents:
diff changeset
   838
hgs
parents:
diff changeset
   839
1. fqToken should be one of NW_WBXML_EXT_[0,1,2] (with any page value)
hgs
parents:
diff changeset
   840
   and anonymousValue, byteCount and pBuf should be 0 or NULL
hgs
parents:
diff changeset
   841
hgs
parents:
diff changeset
   842
2. fqToken should be one of NW_WBXML_EXT_T_[0,1,2] (with any page value),
hgs
parents:
diff changeset
   843
   anonymousValue should be the value to multibyte encode
hgs
parents:
diff changeset
   844
   and byteCount and pBuf should be 0 and NULL
hgs
parents:
diff changeset
   845
hgs
parents:
diff changeset
   846
3. fqToken should be one of NW_WBXML_EXT_I_[0,1,2] (with any page value),
hgs
parents:
diff changeset
   847
   byteCount should be the byte length of the null terminated string
hgs
parents:
diff changeset
   848
   pointed to by pBuf
hgs
parents:
diff changeset
   849
   and anonymousValue is ignored
hgs
parents:
diff changeset
   850
*/
hgs
parents:
diff changeset
   851
NW_Status_t
hgs
parents:
diff changeset
   852
NW_WBXML_Writer_Extension(NW_WBXML_Writer_t* pW,
hgs
parents:
diff changeset
   853
                          NW_Uint16 fqToken,
hgs
parents:
diff changeset
   854
                          NW_Uint32 anonymousValue,
hgs
parents:
diff changeset
   855
                          NW_Uint32 byteCount,
hgs
parents:
diff changeset
   856
                          NW_Uint8* pBuf)
hgs
parents:
diff changeset
   857
{
hgs
parents:
diff changeset
   858
  NW_Status_t s;
hgs
parents:
diff changeset
   859
  NW_Uint8 token = (NW_Uint8)(fqToken & NW_WBXML_MASK_TOKEN);
hgs
parents:
diff changeset
   860
hgs
parents:
diff changeset
   861
  s = NW_WBXML_Writer_Memcpy(pW, &token, 1);
hgs
parents:
diff changeset
   862
  if (NW_STAT_IS_FAILURE(s)) {
hgs
parents:
diff changeset
   863
    return s;
hgs
parents:
diff changeset
   864
  }
hgs
parents:
diff changeset
   865
hgs
parents:
diff changeset
   866
  switch (token) {
hgs
parents:
diff changeset
   867
  case NW_WBXML_EXT_0:
hgs
parents:
diff changeset
   868
  case NW_WBXML_EXT_1:
hgs
parents:
diff changeset
   869
  case NW_WBXML_EXT_2:
hgs
parents:
diff changeset
   870
    NW_ASSERT(byteCount == 0);
hgs
parents:
diff changeset
   871
    NW_ASSERT(pBuf == NULL);
hgs
parents:
diff changeset
   872
    break;
hgs
parents:
diff changeset
   873
  case NW_WBXML_EXT_T_0:
hgs
parents:
diff changeset
   874
  case NW_WBXML_EXT_T_1:
hgs
parents:
diff changeset
   875
  case NW_WBXML_EXT_T_2:
hgs
parents:
diff changeset
   876
    NW_ASSERT(byteCount == 0);
hgs
parents:
diff changeset
   877
    NW_ASSERT(pBuf == NULL);
hgs
parents:
diff changeset
   878
    s = NW_WBXML_Writer_Multibyte(pW, anonymousValue);
hgs
parents:
diff changeset
   879
    break;
hgs
parents:
diff changeset
   880
  case NW_WBXML_EXT_I_0:
hgs
parents:
diff changeset
   881
  case NW_WBXML_EXT_I_1:
hgs
parents:
diff changeset
   882
  case NW_WBXML_EXT_I_2:
hgs
parents:
diff changeset
   883
    NW_ASSERT(byteCount > 0);
hgs
parents:
diff changeset
   884
    NW_ASSERT(pBuf != NULL);
hgs
parents:
diff changeset
   885
    s = NW_WBXML_Writer_Memcpy(pW, pBuf, byteCount);
hgs
parents:
diff changeset
   886
    break;
hgs
parents:
diff changeset
   887
  default:
hgs
parents:
diff changeset
   888
    NW_ASSERT(!"wrong token");
hgs
parents:
diff changeset
   889
    return NW_STAT_FAILURE;
hgs
parents:
diff changeset
   890
  }
hgs
parents:
diff changeset
   891
  return s;
hgs
parents:
diff changeset
   892
}
hgs
parents:
diff changeset
   893
hgs
parents:
diff changeset
   894
EXPORT_C
hgs
parents:
diff changeset
   895
NW_Status_t
hgs
parents:
diff changeset
   896
NW_WBXML_Writer_Opaque(NW_WBXML_Writer_t* pW, NW_Uint32 byteCount,
hgs
parents:
diff changeset
   897
                       NW_Uint8* pBuf)
hgs
parents:
diff changeset
   898
{
hgs
parents:
diff changeset
   899
  NW_Status_t s;
hgs
parents:
diff changeset
   900
  NW_Uint8 token = NW_WBXML_OPAQUE; /* global so on all code pages */
hgs
parents:
diff changeset
   901
  s = NW_WBXML_Writer_Memcpy(pW, &token, 1);
hgs
parents:
diff changeset
   902
  if (NW_STAT_IS_FAILURE(s)) {
hgs
parents:
diff changeset
   903
    return s;
hgs
parents:
diff changeset
   904
  }
hgs
parents:
diff changeset
   905
  s = NW_WBXML_Writer_Multibyte(pW, byteCount);
hgs
parents:
diff changeset
   906
  if (NW_STAT_IS_FAILURE(s)) {
hgs
parents:
diff changeset
   907
    return s;
hgs
parents:
diff changeset
   908
  }
hgs
parents:
diff changeset
   909
  s = NW_WBXML_Writer_Memcpy(pW, pBuf, byteCount);
hgs
parents:
diff changeset
   910
  return s;
hgs
parents:
diff changeset
   911
}
hgs
parents:
diff changeset
   912
hgs
parents:
diff changeset
   913
EXPORT_C
hgs
parents:
diff changeset
   914
NW_Status_t
hgs
parents:
diff changeset
   915
NW_WBXML_Writer_Text(NW_WBXML_Writer_t* pW, NW_Uint32 encoding,
hgs
parents:
diff changeset
   916
                     NW_Uint32 byteCount, const NW_Uint8* pText)
hgs
parents:
diff changeset
   917
{
hgs
parents:
diff changeset
   918
  NW_Status_t s;
hgs
parents:
diff changeset
   919
  NW_Bool found = 0;
hgs
parents:
diff changeset
   920
hgs
parents:
diff changeset
   921
  /* try string table */
hgs
parents:
diff changeset
   922
  s = NW_WBXML_Writer_StringTableLiteral(pW, byteCount, pText, &found);
hgs
parents:
diff changeset
   923
  if (NW_STAT_IS_FAILURE(s) || found) {
hgs
parents:
diff changeset
   924
    return s;
hgs
parents:
diff changeset
   925
  }
hgs
parents:
diff changeset
   926
  /* back off to inline string */
hgs
parents:
diff changeset
   927
  return NW_WBXML_Writer_InlineString(pW, encoding, byteCount, pText);
hgs
parents:
diff changeset
   928
}
hgs
parents:
diff changeset
   929
hgs
parents:
diff changeset
   930
EXPORT_C
hgs
parents:
diff changeset
   931
NW_Status_t
hgs
parents:
diff changeset
   932
NW_WBXML_Writer_PI(NW_WBXML_Writer_t* pW)
hgs
parents:
diff changeset
   933
{
hgs
parents:
diff changeset
   934
  NW_Uint8 piToken = 0x43; /* global, so on all code pages */
hgs
parents:
diff changeset
   935
  return NW_WBXML_Writer_Memcpy(pW, &piToken, 1);
hgs
parents:
diff changeset
   936
}
hgs
parents:
diff changeset
   937
hgs
parents:
diff changeset
   938
hgs
parents:
diff changeset
   939
EXPORT_C
hgs
parents:
diff changeset
   940
NW_Status_t
hgs
parents:
diff changeset
   941
NW_WBXML_Writer_End(NW_WBXML_Writer_t* pW)
hgs
parents:
diff changeset
   942
{
hgs
parents:
diff changeset
   943
  NW_Uint8 endToken = NW_WBXML_END; /* global, so on all code pages */
hgs
parents:
diff changeset
   944
  return NW_WBXML_Writer_Memcpy(pW, &endToken, 1);
hgs
parents:
diff changeset
   945
}
hgs
parents:
diff changeset
   946
hgs
parents:
diff changeset
   947
EXPORT_C
hgs
parents:
diff changeset
   948
void
hgs
parents:
diff changeset
   949
NW_WBXML_Writer_Initialize(NW_WBXML_Writer_t* pW,
hgs
parents:
diff changeset
   950
                           NW_Uint32 byteCount, NW_Uint8* pBuf,
hgs
parents:
diff changeset
   951
                           NW_WBXML_Writer_GrowBuf_t growBufCallback,
hgs
parents:
diff changeset
   952
                           NW_WBXML_Dictionary_t* pTagDictionary,
hgs
parents:
diff changeset
   953
                           NW_WBXML_Dictionary_t* pAttributeDictionary,
hgs
parents:
diff changeset
   954
                           NW_WBXML_Writer_GetStringTableOffset_t getStringTableOffset,
hgs
parents:
diff changeset
   955
                           NW_WBXML_Writer_AddToStringTable_t addToStringTable,
hgs
parents:
diff changeset
   956
                           void* pStringTableObject,
hgs
parents:
diff changeset
   957
                           NW_WBXML_Writer_StringTableIterateInit_t stringTableIterateInit,
hgs
parents:
diff changeset
   958
                           NW_WBXML_Writer_StringTableIterateNext_t stringTableIterateNext,
hgs
parents:
diff changeset
   959
                           NW_Bool sizing)
hgs
parents:
diff changeset
   960
{
hgs
parents:
diff changeset
   961
  pW->index = 0;
hgs
parents:
diff changeset
   962
  pW->byteCount = byteCount;
hgs
parents:
diff changeset
   963
  pW->pBuf = pBuf;
hgs
parents:
diff changeset
   964
  pW->growBufCallback = growBufCallback;
hgs
parents:
diff changeset
   965
  pW->pTagDictionary = pTagDictionary;
hgs
parents:
diff changeset
   966
  pW->pAttributeDictionary = pAttributeDictionary;
hgs
parents:
diff changeset
   967
  pW->getStringTableOffset = getStringTableOffset;
hgs
parents:
diff changeset
   968
  pW->addToStringTable = addToStringTable;
hgs
parents:
diff changeset
   969
  pW->pStringTableObject = pStringTableObject;
hgs
parents:
diff changeset
   970
  pW->stringTableIterateInit = stringTableIterateInit;
hgs
parents:
diff changeset
   971
  pW->stringTableIterateNext = stringTableIterateNext;
hgs
parents:
diff changeset
   972
  pW->tagCodePage = 0;
hgs
parents:
diff changeset
   973
  pW->attributeCodePage = 0;
hgs
parents:
diff changeset
   974
  pW->sizing = sizing;
hgs
parents:
diff changeset
   975
  //WLIU_DEBUG: pW->cp_count = 0;
hgs
parents:
diff changeset
   976
}
hgs
parents:
diff changeset
   977
hgs
parents:
diff changeset
   978
void
hgs
parents:
diff changeset
   979
NW_WBXML_Writer_SetToSizing(NW_WBXML_Writer_t* pW)
hgs
parents:
diff changeset
   980
{
hgs
parents:
diff changeset
   981
  pW->index = 0;
hgs
parents:
diff changeset
   982
  pW->tagCodePage = 0;  /* TBD BUG ? will this give correct code pages */
hgs
parents:
diff changeset
   983
  pW->attributeCodePage = 0;/* TBD BUG ? will this give correct code pages */
hgs
parents:
diff changeset
   984
  pW->sizing = 1;
hgs
parents:
diff changeset
   985
  // WLIU_DEBUG: pW->cp_count = 0;
hgs
parents:
diff changeset
   986
}
hgs
parents:
diff changeset
   987
hgs
parents:
diff changeset
   988
hgs
parents:
diff changeset
   989
void
hgs
parents:
diff changeset
   990
NW_WBXML_Writer_SetToWrite(NW_WBXML_Writer_t* pW, NW_Uint32 byteCount, NW_Uint8* pBuf)
hgs
parents:
diff changeset
   991
{
hgs
parents:
diff changeset
   992
  pW->index = 0;
hgs
parents:
diff changeset
   993
  pW->byteCount = byteCount;
hgs
parents:
diff changeset
   994
  pW->pBuf = pBuf;
hgs
parents:
diff changeset
   995
  pW->tagCodePage = 0;  /* TBD BUG ? will this give correct code pages */
hgs
parents:
diff changeset
   996
  pW->attributeCodePage = 0;/* TBD BUG ? will this give correct code pages */
hgs
parents:
diff changeset
   997
  pW->sizing = 0;
hgs
parents:
diff changeset
   998
  // WLIU_DEBUG: pW->cp_count = 0;
hgs
parents:
diff changeset
   999
}