xml/cxmllibrary/src/wbxmlp/src/parse_logic.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
/*****************************************************************
hgs
parents:
diff changeset
    20
**  File: wbxml_parse_logic.c
hgs
parents:
diff changeset
    21
**
hgs
parents:
diff changeset
    22
**  Description:
hgs
parents:
diff changeset
    23
*
hgs
parents:
diff changeset
    24
* Here is the main parser logic. None of these functions has
hgs
parents:
diff changeset
    25
* any knowlege of how wbxml is stored or read, so they should
hgs
parents:
diff changeset
    26
* work as well with a buffer, stream or file based parser. These
hgs
parents:
diff changeset
    27
* functions require some implementation of the "parser reader
hgs
parents:
diff changeset
    28
* interface" as defined in wbxml_reader.h.
hgs
parents:
diff changeset
    29
*
hgs
parents:
diff changeset
    30
*****************************************************************/
hgs
parents:
diff changeset
    31
hgs
parents:
diff changeset
    32
#include "cxml_internal.h"
hgs
parents:
diff changeset
    33
#include <xml/cxml/nw_wbxml_token.h>
hgs
parents:
diff changeset
    34
#include <xml/cxml/nw_wbxml_dictionary.h>
hgs
parents:
diff changeset
    35
#include <xml/cxml/nw_wbxml_document.h>
hgs
parents:
diff changeset
    36
#include <xml/cxml/nw_wbxml_event.h>
hgs
parents:
diff changeset
    37
#include <xml/cxml/nw_wbxml_reader.h>
hgs
parents:
diff changeset
    38
#include "nw_wbxml_parsei.h"
hgs
parents:
diff changeset
    39
#include <xml/cxml/nw_string_char.h>
hgs
parents:
diff changeset
    40
hgs
parents:
diff changeset
    41
#ifndef HTTP_utf_8
hgs
parents:
diff changeset
    42
#define HTTP_utf_8 0x6A
hgs
parents:
diff changeset
    43
#endif
hgs
parents:
diff changeset
    44
hgs
parents:
diff changeset
    45
#define TOKEN_STATE_TAG         0
hgs
parents:
diff changeset
    46
#define TOKEN_STATE_ATTR        1
hgs
parents:
diff changeset
    47
hgs
parents:
diff changeset
    48
#define WBXML_MAX_RECURSIVE_CALL_DEPTH 120  /* For parse element only */
hgs
parents:
diff changeset
    49
hgs
parents:
diff changeset
    50
/* The parser tries to be very strict about errors caused by bad NW_Byte
hgs
parents:
diff changeset
    51
 * code, lack of memory, etc. For example, the parser will not read
hgs
parents:
diff changeset
    52
 * past the end of the buffer. Callbacks can also set error status to
hgs
parents:
diff changeset
    53
 * stop parsing. These will be detected as soon as possible after the
hgs
parents:
diff changeset
    54
 * callback returns.  The following method is called with the return
hgs
parents:
diff changeset
    55
 * value (NW_Status_t) from the callback functions.  The status is
hgs
parents:
diff changeset
    56
 * saved and if it is not NW_STAT_SUCCESS, then the parser's flags
hgs
parents:
diff changeset
    57
 * field is updated so that the parser will know that a callback has
hgs
parents:
diff changeset
    58
 * raised an exception/error condition. The parser will quit as soon
hgs
parents:
diff changeset
    59
 * as it checks the flags.
hgs
parents:
diff changeset
    60
 */
hgs
parents:
diff changeset
    61
hgs
parents:
diff changeset
    62
static void
hgs
parents:
diff changeset
    63
NW_WBXML_Parser_setStatus (NW_WBXML_Parser_t * parser,
hgs
parents:
diff changeset
    64
                           NW_Status_t status)
hgs
parents:
diff changeset
    65
{
hgs
parents:
diff changeset
    66
  parser->status = status;
hgs
parents:
diff changeset
    67
hgs
parents:
diff changeset
    68
  switch (status)
hgs
parents:
diff changeset
    69
  {
hgs
parents:
diff changeset
    70
  case NW_STAT_SUCCESS:
hgs
parents:
diff changeset
    71
    break;
hgs
parents:
diff changeset
    72
  case NW_STAT_OUT_OF_MEMORY:
hgs
parents:
diff changeset
    73
    parser->flags |= NW_WBXML_PARSER_NOMEMORY;
hgs
parents:
diff changeset
    74
    break;
hgs
parents:
diff changeset
    75
  case NW_STAT_WBXML_ERROR_BYTECODE:
hgs
parents:
diff changeset
    76
    parser->flags |= NW_WBXML_PARSER_BYTECODEERROR;
hgs
parents:
diff changeset
    77
    break;
hgs
parents:
diff changeset
    78
  case NW_STAT_WBXML_ERROR_CHARSET_UNSUPPORTED:
hgs
parents:
diff changeset
    79
    parser->flags |= NW_WBXML_PARSER_CHARSET_UNSUPPORTED;
hgs
parents:
diff changeset
    80
    break;
hgs
parents:
diff changeset
    81
  default:
hgs
parents:
diff changeset
    82
    parser->flags |= NW_WBXML_PARSER_UNKNOWN_ERROR;
hgs
parents:
diff changeset
    83
    break;
hgs
parents:
diff changeset
    84
  }
hgs
parents:
diff changeset
    85
  return;
hgs
parents:
diff changeset
    86
}
hgs
parents:
diff changeset
    87
hgs
parents:
diff changeset
    88
/*
hgs
parents:
diff changeset
    89
 * Convert the parser's flag status code to a NW_Status_t constant
hgs
parents:
diff changeset
    90
 */
hgs
parents:
diff changeset
    91
hgs
parents:
diff changeset
    92
static NW_Status_t
hgs
parents:
diff changeset
    93
NW_WBXML_Parser_flagToStatus (NW_WBXML_Parser_t * parser)
hgs
parents:
diff changeset
    94
{
hgs
parents:
diff changeset
    95
  if (parser->flags & NW_WBXML_PARSER_NOMEMORY)
hgs
parents:
diff changeset
    96
    return NW_STAT_OUT_OF_MEMORY;
hgs
parents:
diff changeset
    97
hgs
parents:
diff changeset
    98
  if (parser->flags & NW_WBXML_PARSER_BYTECODEERROR)
hgs
parents:
diff changeset
    99
    return NW_STAT_WBXML_ERROR_BYTECODE;
hgs
parents:
diff changeset
   100
hgs
parents:
diff changeset
   101
  if (parser->flags & NW_WBXML_PARSER_CHARSET_UNSUPPORTED)
hgs
parents:
diff changeset
   102
    return NW_STAT_WBXML_ERROR_CHARSET_UNSUPPORTED;
hgs
parents:
diff changeset
   103
hgs
parents:
diff changeset
   104
  return parser->status;
hgs
parents:
diff changeset
   105
}
hgs
parents:
diff changeset
   106
hgs
parents:
diff changeset
   107
hgs
parents:
diff changeset
   108
#define GET_STATE(parser) ((parser)->state & NW_WBXML_PARSER_S_MASK)
hgs
parents:
diff changeset
   109
#define SET_STATE(parser, st) \
hgs
parents:
diff changeset
   110
  ((parser)->state = (~NW_WBXML_PARSER_S_MASK & parser->state) | (st))
hgs
parents:
diff changeset
   111
hgs
parents:
diff changeset
   112
#define CHECK_PARSER_STATUS \
hgs
parents:
diff changeset
   113
  if((parser->flags & NW_WBXML_PARSER_S_MASK) != NW_WBXML_PARSER_OK) \
hgs
parents:
diff changeset
   114
    return NW_WBXML_Parser_flagToStatus(parser)
hgs
parents:
diff changeset
   115
hgs
parents:
diff changeset
   116
hgs
parents:
diff changeset
   117
/*
hgs
parents:
diff changeset
   118
* Create an uninitialized code page registry. As long as the registry is not
hgs
parents:
diff changeset
   119
* created, it will be ignored. Once it has been created, the parser will check
hgs
parents:
diff changeset
   120
* the REGISTRY_INIT flag. If this is not set, the registry will be initialized
hgs
parents:
diff changeset
   121
* as the parser runs. If this is set, then the registry will be consulted when
hgs
parents:
diff changeset
   122
* updating the offset.
hgs
parents:
diff changeset
   123
*/
hgs
parents:
diff changeset
   124
hgs
parents:
diff changeset
   125
NW_Status_t
hgs
parents:
diff changeset
   126
NW_WBXML_Parser_addCPRegistry(NW_WBXML_Parser_t* parser,
hgs
parents:
diff changeset
   127
                              NW_WBXML_CP_Registry_Entry_t* storage,
hgs
parents:
diff changeset
   128
                              NW_Int32 count)
hgs
parents:
diff changeset
   129
{
hgs
parents:
diff changeset
   130
  NW_ASSERT(parser != NULL);
hgs
parents:
diff changeset
   131
  NW_ASSERT(storage != NULL);
hgs
parents:
diff changeset
   132
hgs
parents:
diff changeset
   133
  parser->cp_registry.storage = storage;
hgs
parents:
diff changeset
   134
  parser->cp_registry.current = storage;
hgs
parents:
diff changeset
   135
  parser->cp_registry.count = count;
hgs
parents:
diff changeset
   136
  // WLIU_DEBUG: parser->cp_registry.realcount = 0;
hgs
parents:
diff changeset
   137
  parser->state &= ~NW_WBXML_REGISTRY_INIT; /* Make sure flag is not set */
hgs
parents:
diff changeset
   138
  return NW_STAT_SUCCESS;
hgs
parents:
diff changeset
   139
}
hgs
parents:
diff changeset
   140
hgs
parents:
diff changeset
   141
static void
hgs
parents:
diff changeset
   142
NW_WBXML_CPRegistry_addEntry(NW_WBXML_CP_Registry_t *registry ,
hgs
parents:
diff changeset
   143
                             NW_Uint8 code_page,
hgs
parents:
diff changeset
   144
                             NW_Uint32 offset, /* must point to switch_page token */
hgs
parents:
diff changeset
   145
                             NW_Uint8 token_state)
hgs
parents:
diff changeset
   146
{
hgs
parents:
diff changeset
   147
  NW_ASSERT(registry != NULL);
hgs
parents:
diff changeset
   148
  NW_ASSERT(registry->current < (registry->storage + registry->count));
hgs
parents:
diff changeset
   149
hgs
parents:
diff changeset
   150
  /* ignoring page type (tag or attribute) check that registry is in
hgs
parents:
diff changeset
   151
  increasing order of offset so that the algorith in
hgs
parents:
diff changeset
   152
  NW_WBXML_CPRegistry_getCodePages() works */
hgs
parents:
diff changeset
   153
  NW_ASSERT((registry->current > registry->storage) ?
hgs
parents:
diff changeset
   154
            (offset > (registry->current - 1)->start_offset)
hgs
parents:
diff changeset
   155
            : 1);
hgs
parents:
diff changeset
   156
  /* Each entry must record if it is for tokens or attributes.  A
hgs
parents:
diff changeset
   157
  trick to encode this without extra memory relies on the use of two
hgs
parents:
diff changeset
   158
  bytes in WBXML to encode a page switch.  With two bytes one has an
hgs
parents:
diff changeset
   159
  even offset and one an odd offset.  We pick the even if it is a tag
hgs
parents:
diff changeset
   160
  page and the odd offset if it is an attribute page. */
hgs
parents:
diff changeset
   161
  if (token_state == TOKEN_STATE_TAG) {
hgs
parents:
diff changeset
   162
    if (offset & 1) { /* if it is odd, advance one to make it even */
hgs
parents:
diff changeset
   163
      offset++;
hgs
parents:
diff changeset
   164
    }
hgs
parents:
diff changeset
   165
  } else {
hgs
parents:
diff changeset
   166
    NW_ASSERT(token_state == TOKEN_STATE_ATTR);
hgs
parents:
diff changeset
   167
    if ((offset & 1) == 0) { /* if it is even, advance one to make it odd */
hgs
parents:
diff changeset
   168
      offset++;
hgs
parents:
diff changeset
   169
    }
hgs
parents:
diff changeset
   170
  }
hgs
parents:
diff changeset
   171
  registry->current->start_offset = offset;
hgs
parents:
diff changeset
   172
  registry->current->code_page = code_page;
hgs
parents:
diff changeset
   173
hgs
parents:
diff changeset
   174
  //if(registry->current < (registry->storage + registry->count - 1)){
hgs
parents:
diff changeset
   175
    registry->current++;
hgs
parents:
diff changeset
   176
    // WLIU_DEBUG: registry->realcount++;
hgs
parents:
diff changeset
   177
  //
hgs
parents:
diff changeset
   178
}
hgs
parents:
diff changeset
   179
hgs
parents:
diff changeset
   180
void
hgs
parents:
diff changeset
   181
NW_WBXML_CPRegistry_getCodePages(NW_WBXML_CP_Registry_t* registry,
hgs
parents:
diff changeset
   182
                                 NW_Uint32 offset,
hgs
parents:
diff changeset
   183
                                 NW_Uint8 *tag_code_page,
hgs
parents:
diff changeset
   184
                                 NW_Uint8 *attribute_code_page)
hgs
parents:
diff changeset
   185
{
hgs
parents:
diff changeset
   186
  NW_WBXML_CP_Registry_Entry_t* entry;
hgs
parents:
diff changeset
   187
hgs
parents:
diff changeset
   188
  NW_ASSERT(registry != NULL);
hgs
parents:
diff changeset
   189
hgs
parents:
diff changeset
   190
  *tag_code_page = 0;
hgs
parents:
diff changeset
   191
  *attribute_code_page = 0;
hgs
parents:
diff changeset
   192
  for (entry = registry->storage;
hgs
parents:
diff changeset
   193
       entry < (registry->storage + registry->count);
hgs
parents:
diff changeset
   194
       entry++){
hgs
parents:
diff changeset
   195
    /* assume that the entries are in increasing offset order */
hgs
parents:
diff changeset
   196
    NW_ASSERT((entry > registry->storage) ?
hgs
parents:
diff changeset
   197
              (entry->start_offset > (entry - 1)->start_offset)
hgs
parents:
diff changeset
   198
              : 1);
hgs
parents:
diff changeset
   199
hgs
parents:
diff changeset
   200
    if(offset > entry->start_offset) {
hgs
parents:
diff changeset
   201
      if(entry->start_offset & 1) {
hgs
parents:
diff changeset
   202
        /* odd offset indicates attributes */
hgs
parents:
diff changeset
   203
        *attribute_code_page = entry->code_page;
hgs
parents:
diff changeset
   204
      } else {
hgs
parents:
diff changeset
   205
        /* even offset indicates tokens */
hgs
parents:
diff changeset
   206
        *tag_code_page = entry->code_page;
hgs
parents:
diff changeset
   207
      }
hgs
parents:
diff changeset
   208
    } else {
hgs
parents:
diff changeset
   209
      break; /* early out */
hgs
parents:
diff changeset
   210
    }
hgs
parents:
diff changeset
   211
  }
hgs
parents:
diff changeset
   212
}
hgs
parents:
diff changeset
   213
hgs
parents:
diff changeset
   214
hgs
parents:
diff changeset
   215
/*
hgs
parents:
diff changeset
   216
  This function parses "version publicid charset strtbl" which is a
hgs
parents:
diff changeset
   217
  sequence that comprises the "header" of a WBXML document.
hgs
parents:
diff changeset
   218
hgs
parents:
diff changeset
   219
  From specification WAP-192-WBXML-20010725-a, Version 1.3, 25 July 2001,
hgs
parents:
diff changeset
   220
  section 5.3 BNF for Document Structure:
hgs
parents:
diff changeset
   221
hgs
parents:
diff changeset
   222
  start = version publicid charset strtbl body
hgs
parents:
diff changeset
   223
  version = u_int8 // WBXML version number
hgs
parents:
diff changeset
   224
  publicid = mb_u_int32 | ( zero index )
hgs
parents:
diff changeset
   225
  charset = mb_u_int32
hgs
parents:
diff changeset
   226
  strtbl = length *byte
hgs
parents:
diff changeset
   227
  length = mb_u_int32
hgs
parents:
diff changeset
   228
hgs
parents:
diff changeset
   229
  The "version" specifies the WBXML specification version. The
hgs
parents:
diff changeset
   230
  version byte contains the major version minus one in the upper
hgs
parents:
diff changeset
   231
  four bits and the minor version in the lower four bits. For
hgs
parents:
diff changeset
   232
  example, the version number 1.3 would be encoded as 0x03.
hgs
parents:
diff changeset
   233
hgs
parents:
diff changeset
   234
  The first form of publicid is a multi-byte positive integer value,
hgs
parents:
diff changeset
   235
  greater than zero, representing a well-known XML document type given
hgs
parents:
diff changeset
   236
  an assigned value.  See table at section 7.2.1 or try
hgs
parents:
diff changeset
   237
  http://www.wapforum.org/wina/wbxml-public-docid.htm
hgs
parents:
diff changeset
   238
  Note that 0x01 is used for "unknown or missing public identifier."
hgs
parents:
diff changeset
   239
hgs
parents:
diff changeset
   240
  The second form of publicid begins with a 0 byte followed by a
hgs
parents:
diff changeset
   241
  string table index (note that these "index" values are all 0-based
hgs
parents:
diff changeset
   242
  byte offsets from the start of the string table).  The entry in the
hgs
parents:
diff changeset
   243
  string table encodes the XML document type string.
hgs
parents:
diff changeset
   244
hgs
parents:
diff changeset
   245
  The charset is the multi-byte encoding of the IANA charset MIBenum
hgs
parents:
diff changeset
   246
  http://www.iana.org/assignments/character-sets
hgs
parents:
diff changeset
   247
hgs
parents:
diff changeset
   248
  The string table either has length 0, if empty, or the length is the
hgs
parents:
diff changeset
   249
  byte count of the string table block not counting the length byte
hgs
parents:
diff changeset
   250
  itself.
hgs
parents:
diff changeset
   251
hgs
parents:
diff changeset
   252
  This is what the specification says about "index" as an index into
hgs
parents:
diff changeset
   253
  the string table:
hgs
parents:
diff changeset
   254
hgs
parents:
diff changeset
   255
  "Various tokens encode references to the contents of the string
hgs
parents:
diff changeset
   256
  table. These references are encoded as scalar byte offsets from the
hgs
parents:
diff changeset
   257
  first byte of the first string in the string table. For example, the
hgs
parents:
diff changeset
   258
  offset of the first string is zero (0)."
hgs
parents:
diff changeset
   259
hgs
parents:
diff changeset
   260
  So, "index" is a 0-based byte offset from the first byte of the
hgs
parents:
diff changeset
   261
  string table.  The first byte of the string table is the one after
hgs
parents:
diff changeset
   262
  the multi-byte encoding of the string table length.
hgs
parents:
diff changeset
   263
hgs
parents:
diff changeset
   264
  This function returns one of:
hgs
parents:
diff changeset
   265
hgs
parents:
diff changeset
   266
  NW_STAT_SUCCESS
hgs
parents:
diff changeset
   267
  NW_STAT_OUT_OF_MEMORY
hgs
parents:
diff changeset
   268
  NW_STAT_WBXML_ERROR_BYTECODE
hgs
parents:
diff changeset
   269
*/
hgs
parents:
diff changeset
   270
NW_Status_t
hgs
parents:
diff changeset
   271
NW_WBXML_Parser_docHeaderParse(NW_WBXML_Parser_t* pParser,
hgs
parents:
diff changeset
   272
                               NW_WBXML_Document_t* pDoc)
hgs
parents:
diff changeset
   273
{
hgs
parents:
diff changeset
   274
  NW_Int32 bytesRead;
hgs
parents:
diff changeset
   275
  NW_Uint32 docTypeByteOffset = 0;
hgs
parents:
diff changeset
   276
  NW_Status_t substatus;
hgs
parents:
diff changeset
   277
  NW_Status_t status = NW_STAT_WBXML_ERROR_BYTECODE;
hgs
parents:
diff changeset
   278
hgs
parents:
diff changeset
   279
  /* this is an internal function where caller should guarantee these */
hgs
parents:
diff changeset
   280
  NW_ASSERT(pParser != NULL);
hgs
parents:
diff changeset
   281
  NW_ASSERT(pDoc != NULL);
hgs
parents:
diff changeset
   282
  NW_ASSERT(GET_STATE(pParser) == NW_WBXML_PARSER_S_START);
hgs
parents:
diff changeset
   283
hgs
parents:
diff changeset
   284
  /* version */
hgs
parents:
diff changeset
   285
  pDoc->version = NW_WBXML_Parser_readUint8(pParser);
hgs
parents:
diff changeset
   286
  if (NW_WBXML_Parser_advance(pParser, 1) < 0) {
hgs
parents:
diff changeset
   287
    goto errorExitHeaderParse;
hgs
parents:
diff changeset
   288
  }
hgs
parents:
diff changeset
   289
  /* publicid */
hgs
parents:
diff changeset
   290
  bytesRead = NW_WBXML_Parser_readMbUint32(pParser, &(pDoc->publicid));
hgs
parents:
diff changeset
   291
  if ((bytesRead < 0)
hgs
parents:
diff changeset
   292
      || (NW_WBXML_Parser_advance(pParser, bytesRead) < 0)) {
hgs
parents:
diff changeset
   293
    goto errorExitHeaderParse;
hgs
parents:
diff changeset
   294
  }
hgs
parents:
diff changeset
   295
  /* check for publicid second form referencing string table */
hgs
parents:
diff changeset
   296
  if (pDoc->publicid == 0) {
hgs
parents:
diff changeset
   297
    /* save doctype string table index for after string table is read */
hgs
parents:
diff changeset
   298
    bytesRead = NW_WBXML_Parser_readMbUint32(pParser, &docTypeByteOffset);
hgs
parents:
diff changeset
   299
    if ((bytesRead < 0)
hgs
parents:
diff changeset
   300
        || (NW_WBXML_Parser_advance(pParser, bytesRead) < 0)) {
hgs
parents:
diff changeset
   301
      goto errorExitHeaderParse;
hgs
parents:
diff changeset
   302
    }
hgs
parents:
diff changeset
   303
  }
hgs
parents:
diff changeset
   304
hgs
parents:
diff changeset
   305
 if(pDoc->publicid == 1) //As per WBXML spec, invalid public identifier
hgs
parents:
diff changeset
   306
  {
hgs
parents:
diff changeset
   307
    return NW_STAT_WMLBROWSER_BAD_CONTENT;
hgs
parents:
diff changeset
   308
  }
hgs
parents:
diff changeset
   309
hgs
parents:
diff changeset
   310
  /* charset */
hgs
parents:
diff changeset
   311
  if (pDoc->version != 0) {
hgs
parents:
diff changeset
   312
    bytesRead = NW_WBXML_Parser_readMbUint32(pParser, &(pDoc->charset));
hgs
parents:
diff changeset
   313
    if ((bytesRead < 0)
hgs
parents:
diff changeset
   314
        || (NW_WBXML_Parser_advance(pParser, bytesRead) < 0)) {
hgs
parents:
diff changeset
   315
      goto errorExitHeaderParse;
hgs
parents:
diff changeset
   316
    }
hgs
parents:
diff changeset
   317
  } else {
hgs
parents:
diff changeset
   318
    /* For WBXML version 1.0, which did not have a charset field in
hgs
parents:
diff changeset
   319
       the document header, we hardwire the charset to UTF-8.  This is
hgs
parents:
diff changeset
   320
       against the spec which says that the charset should come as
hgs
parents:
diff changeset
   321
       side info with the doc (e.g., get charset from the load
hgs
parents:
diff changeset
   322
       response), but the API needs to change to support this so
hgs
parents:
diff changeset
   323
       rather than reject all version 1.0 docs we accept the UTF-8
hgs
parents:
diff changeset
   324
       (includes ASCII but not Latin-1) encoded ones. */
hgs
parents:
diff changeset
   325
    pDoc->charset = HTTP_utf_8;
hgs
parents:
diff changeset
   326
  }
hgs
parents:
diff changeset
   327
  substatus = NW_String_charsetValid(pDoc->charset);
hgs
parents:
diff changeset
   328
  if (substatus != NW_STAT_SUCCESS) {
hgs
parents:
diff changeset
   329
    status = substatus;
hgs
parents:
diff changeset
   330
    goto errorExitHeaderParse;
hgs
parents:
diff changeset
   331
  }
hgs
parents:
diff changeset
   332
  /* strtbl */
hgs
parents:
diff changeset
   333
  substatus = NW_WBXML_Parser_readStringTable(pParser, pDoc,
hgs
parents:
diff changeset
   334
                                              &(pDoc->strtbl.data));
hgs
parents:
diff changeset
   335
  if (substatus != NW_STAT_SUCCESS) {
hgs
parents:
diff changeset
   336
    status = substatus;
hgs
parents:
diff changeset
   337
    goto errorExitHeaderParse;
hgs
parents:
diff changeset
   338
  }
hgs
parents:
diff changeset
   339
hgs
parents:
diff changeset
   340
  /* record remainder of doc as the body length */
hgs
parents:
diff changeset
   341
  pDoc->body_len = pParser->left;
hgs
parents:
diff changeset
   342
hgs
parents:
diff changeset
   343
  /* deal with doctype string, maybe from string table */
hgs
parents:
diff changeset
   344
hgs
parents:
diff changeset
   345
  if(pDoc->doc_type)
hgs
parents:
diff changeset
   346
  {
hgs
parents:
diff changeset
   347
   NW_String_delete(pDoc->doc_type);
hgs
parents:
diff changeset
   348
  }
hgs
parents:
diff changeset
   349
hgs
parents:
diff changeset
   350
  pDoc->doc_type = NULL;
hgs
parents:
diff changeset
   351
  if (pDoc->publicid == 0) {
hgs
parents:
diff changeset
   352
    /* now that we have the string table, get the doctype string */
hgs
parents:
diff changeset
   353
    if ((docTypeByteOffset >= pDoc->strtbl.length)
hgs
parents:
diff changeset
   354
        || (!NW_String_valid(pDoc->strtbl.data + docTypeByteOffset,
hgs
parents:
diff changeset
   355
                             pDoc->strtbl.length - docTypeByteOffset,
hgs
parents:
diff changeset
   356
                             pDoc->charset))) {
hgs
parents:
diff changeset
   357
      goto errorExitHeaderParse;
hgs
parents:
diff changeset
   358
    }
hgs
parents:
diff changeset
   359
    pDoc->doc_type = NW_String_new();
hgs
parents:
diff changeset
   360
    if (pDoc->doc_type != NULL) {
hgs
parents:
diff changeset
   361
      if (NW_String_initialize(pDoc->doc_type,
hgs
parents:
diff changeset
   362
                               pDoc->strtbl.data + docTypeByteOffset,
hgs
parents:
diff changeset
   363
                               pDoc->charset) != NW_STAT_SUCCESS) {
hgs
parents:
diff changeset
   364
        NW_String_delete(pDoc->doc_type);
hgs
parents:
diff changeset
   365
        pDoc->doc_type = NULL;
hgs
parents:
diff changeset
   366
        goto errorExitHeaderParse;
hgs
parents:
diff changeset
   367
      }
hgs
parents:
diff changeset
   368
      /* TBD should now go back and try to fill in the internal "publicId"
hgs
parents:
diff changeset
   369
         from the WBXML dictionary to match the docType. */
hgs
parents:
diff changeset
   370
    } else {
hgs
parents:
diff changeset
   371
      status = NW_STAT_OUT_OF_MEMORY;
hgs
parents:
diff changeset
   372
      goto errorExitHeaderParse;
hgs
parents:
diff changeset
   373
    }
hgs
parents:
diff changeset
   374
  } else {
hgs
parents:
diff changeset
   375
    /* doc came with publicid so now fill in the type string. */
hgs
parents:
diff changeset
   376
    substatus
hgs
parents:
diff changeset
   377
      = NW_WBXML_Dictionary_publicId_to_doctypeString(pDoc->publicid,
hgs
parents:
diff changeset
   378
                                                      &(pDoc->doc_type));
hgs
parents:
diff changeset
   379
    /* ignore any error other than OOM */
hgs
parents:
diff changeset
   380
    if (substatus == NW_STAT_OUT_OF_MEMORY) {
hgs
parents:
diff changeset
   381
      status = NW_STAT_OUT_OF_MEMORY;
hgs
parents:
diff changeset
   382
      goto errorExitHeaderParse;
hgs
parents:
diff changeset
   383
    }
hgs
parents:
diff changeset
   384
  }
hgs
parents:
diff changeset
   385
  SET_STATE(pParser, NW_WBXML_PARSER_S_HEADER);
hgs
parents:
diff changeset
   386
  pParser->doc = pDoc;
hgs
parents:
diff changeset
   387
  status = NW_STAT_SUCCESS;
hgs
parents:
diff changeset
   388
 errorExitHeaderParse:
hgs
parents:
diff changeset
   389
  return status;
hgs
parents:
diff changeset
   390
}
hgs
parents:
diff changeset
   391
hgs
parents:
diff changeset
   392
/*
hgs
parents:
diff changeset
   393
 * Save/restore context can be used if the parser is to be invoked
hgs
parents:
diff changeset
   394
 * reentrantly (in a callback).  Normally this should be avoided since
hgs
parents:
diff changeset
   395
 * the only really safe way to do this is to save the whole parser
hgs
parents:
diff changeset
   396
 * object on the stack. This uses a lot of space!
hgs
parents:
diff changeset
   397
 */
hgs
parents:
diff changeset
   398
hgs
parents:
diff changeset
   399
NW_Status_t
hgs
parents:
diff changeset
   400
NW_WBXML_Parser_saveContext(NW_WBXML_Parser_t *parser,
hgs
parents:
diff changeset
   401
                            NW_WBXML_Parser_t *context)
hgs
parents:
diff changeset
   402
{
hgs
parents:
diff changeset
   403
  NW_ASSERT(parser != NULL);
hgs
parents:
diff changeset
   404
  NW_ASSERT(context != NULL);
hgs
parents:
diff changeset
   405
hgs
parents:
diff changeset
   406
  NW_Mem_memcpy(context, parser, sizeof(*parser));
hgs
parents:
diff changeset
   407
  return NW_STAT_SUCCESS;
hgs
parents:
diff changeset
   408
}
hgs
parents:
diff changeset
   409
hgs
parents:
diff changeset
   410
NW_Status_t
hgs
parents:
diff changeset
   411
NW_WBXML_Parser_restoreContext(NW_WBXML_Parser_t *parser,
hgs
parents:
diff changeset
   412
                               NW_WBXML_Parser_t *context)
hgs
parents:
diff changeset
   413
{
hgs
parents:
diff changeset
   414
  NW_ASSERT(parser != NULL);
hgs
parents:
diff changeset
   415
  NW_ASSERT(context != NULL);
hgs
parents:
diff changeset
   416
hgs
parents:
diff changeset
   417
  NW_Mem_memcpy(parser, context, sizeof(*parser));
hgs
parents:
diff changeset
   418
  return NW_STAT_SUCCESS;
hgs
parents:
diff changeset
   419
}
hgs
parents:
diff changeset
   420
hgs
parents:
diff changeset
   421
NW_Status_t
hgs
parents:
diff changeset
   422
NW_WBXML_Parser_setTagCodepage(NW_WBXML_Parser_t *parser,
hgs
parents:
diff changeset
   423
                               NW_Uint8 page)
hgs
parents:
diff changeset
   424
{
hgs
parents:
diff changeset
   425
  NW_ASSERT(parser != NULL);
hgs
parents:
diff changeset
   426
hgs
parents:
diff changeset
   427
  parser->tag_code_page = page;
hgs
parents:
diff changeset
   428
  return NW_STAT_SUCCESS;
hgs
parents:
diff changeset
   429
}
hgs
parents:
diff changeset
   430
hgs
parents:
diff changeset
   431
NW_Uint8
hgs
parents:
diff changeset
   432
NW_WBXML_Parser_getTagCodepage(NW_WBXML_Parser_t *parser)
hgs
parents:
diff changeset
   433
{
hgs
parents:
diff changeset
   434
  NW_ASSERT(parser != NULL);
hgs
parents:
diff changeset
   435
hgs
parents:
diff changeset
   436
  return parser->tag_code_page;
hgs
parents:
diff changeset
   437
}
hgs
parents:
diff changeset
   438
hgs
parents:
diff changeset
   439
NW_Status_t
hgs
parents:
diff changeset
   440
NW_WBXML_Parser_setAttrCodepage(NW_WBXML_Parser_t *parser,
hgs
parents:
diff changeset
   441
                                NW_Uint8 page)
hgs
parents:
diff changeset
   442
{
hgs
parents:
diff changeset
   443
  NW_ASSERT(parser != NULL);
hgs
parents:
diff changeset
   444
hgs
parents:
diff changeset
   445
  parser->attribute_code_page = page;
hgs
parents:
diff changeset
   446
  return NW_STAT_SUCCESS;
hgs
parents:
diff changeset
   447
}
hgs
parents:
diff changeset
   448
hgs
parents:
diff changeset
   449
NW_Uint8
hgs
parents:
diff changeset
   450
NW_WBXML_Parser_getAttrCodepage(NW_WBXML_Parser_t *parser)
hgs
parents:
diff changeset
   451
{
hgs
parents:
diff changeset
   452
  NW_ASSERT(parser != NULL);
hgs
parents:
diff changeset
   453
hgs
parents:
diff changeset
   454
  return parser->attribute_code_page;
hgs
parents:
diff changeset
   455
}
hgs
parents:
diff changeset
   456
hgs
parents:
diff changeset
   457
/*
hgs
parents:
diff changeset
   458
* Turn an eight bit token into a fully qualified 32 bit token depending
hgs
parents:
diff changeset
   459
* on the parser state.
hgs
parents:
diff changeset
   460
*/
hgs
parents:
diff changeset
   461
hgs
parents:
diff changeset
   462
static
hgs
parents:
diff changeset
   463
NW_Uint32
hgs
parents:
diff changeset
   464
FqToken (NW_WBXML_Parser_t * parser,
hgs
parents:
diff changeset
   465
         NW_Uint8 token,
hgs
parents:
diff changeset
   466
         NW_Int32 token_state)
hgs
parents:
diff changeset
   467
{
hgs
parents:
diff changeset
   468
  NW_Uint32 fq_token = token;
hgs
parents:
diff changeset
   469
hgs
parents:
diff changeset
   470
  NW_ASSERT(parser != NULL);
hgs
parents:
diff changeset
   471
hgs
parents:
diff changeset
   472
  fq_token |= (parser->dictionary << 16);
hgs
parents:
diff changeset
   473
  if (token_state == TOKEN_STATE_ATTR) {
hgs
parents:
diff changeset
   474
    fq_token |=
hgs
parents:
diff changeset
   475
      ((parser->attribute_code_page << 8) | NW_WBXML_CP_STATE_ATTR);
hgs
parents:
diff changeset
   476
  } else {
hgs
parents:
diff changeset
   477
    fq_token |= ((parser->tag_code_page << 8) | NW_WBXML_CP_STATE_TAG);
hgs
parents:
diff changeset
   478
  }
hgs
parents:
diff changeset
   479
  return fq_token;
hgs
parents:
diff changeset
   480
}
hgs
parents:
diff changeset
   481
hgs
parents:
diff changeset
   482
hgs
parents:
diff changeset
   483
/* Invoke callbacks */
hgs
parents:
diff changeset
   484
hgs
parents:
diff changeset
   485
/* The callback wrappers use the parser flags to implement an
hgs
parents:
diff changeset
   486
 * "exception" mechanism. If a callback returns a non-OK status, the
hgs
parents:
diff changeset
   487
 * parser will detect this as soon as possible and stop what
hgs
parents:
diff changeset
   488
 * it is doing.
hgs
parents:
diff changeset
   489
 */
hgs
parents:
diff changeset
   490
hgs
parents:
diff changeset
   491
/* Handle state callbacks */
hgs
parents:
diff changeset
   492
hgs
parents:
diff changeset
   493
static
hgs
parents:
diff changeset
   494
void
hgs
parents:
diff changeset
   495
Handle_Pi(NW_WBXML_Parser_t *parser)
hgs
parents:
diff changeset
   496
{
hgs
parents:
diff changeset
   497
  NW_Status_t status;
hgs
parents:
diff changeset
   498
  if ((parser->handler) && (parser->handler->Pi_CB)){
hgs
parents:
diff changeset
   499
    status = (*(parser->handler->Pi_CB)) (parser, parser->context);
hgs
parents:
diff changeset
   500
    NW_WBXML_Parser_setStatus (parser, status);
hgs
parents:
diff changeset
   501
  }
hgs
parents:
diff changeset
   502
}
hgs
parents:
diff changeset
   503
hgs
parents:
diff changeset
   504
static
hgs
parents:
diff changeset
   505
void
hgs
parents:
diff changeset
   506
Handle_Pi_End(NW_WBXML_Parser_t *parser)
hgs
parents:
diff changeset
   507
{
hgs
parents:
diff changeset
   508
  NW_Status_t status;
hgs
parents:
diff changeset
   509
  if ((parser->handler) && (parser->handler->Pi_End_CB)){
hgs
parents:
diff changeset
   510
    status = (*(parser->handler->Pi_End_CB)) (parser, parser->context);
hgs
parents:
diff changeset
   511
    NW_WBXML_Parser_setStatus (parser, status);
hgs
parents:
diff changeset
   512
  }
hgs
parents:
diff changeset
   513
}
hgs
parents:
diff changeset
   514
hgs
parents:
diff changeset
   515
static
hgs
parents:
diff changeset
   516
void
hgs
parents:
diff changeset
   517
Handle_Tag_Start(NW_WBXML_Parser_t *parser)
hgs
parents:
diff changeset
   518
{
hgs
parents:
diff changeset
   519
  NW_Status_t status;
hgs
parents:
diff changeset
   520
  if ((parser->handler) && (parser->handler->Tag_Start_CB)){
hgs
parents:
diff changeset
   521
    status = (*(parser->handler->Tag_Start_CB)) (parser, parser->context);
hgs
parents:
diff changeset
   522
    NW_WBXML_Parser_setStatus (parser, status);
hgs
parents:
diff changeset
   523
  }
hgs
parents:
diff changeset
   524
}
hgs
parents:
diff changeset
   525
hgs
parents:
diff changeset
   526
static
hgs
parents:
diff changeset
   527
void
hgs
parents:
diff changeset
   528
Handle_Tag_End(NW_WBXML_Parser_t *parser)
hgs
parents:
diff changeset
   529
{
hgs
parents:
diff changeset
   530
  NW_Status_t status;
hgs
parents:
diff changeset
   531
  if ((parser->handler) && (parser->handler->Tag_End_CB)){
hgs
parents:
diff changeset
   532
    status = (*(parser->handler->Tag_End_CB)) (parser, parser->context);
hgs
parents:
diff changeset
   533
    NW_WBXML_Parser_setStatus (parser, status);
hgs
parents:
diff changeset
   534
  }
hgs
parents:
diff changeset
   535
}
hgs
parents:
diff changeset
   536
hgs
parents:
diff changeset
   537
static
hgs
parents:
diff changeset
   538
void
hgs
parents:
diff changeset
   539
Handle_Attr_Start(NW_WBXML_Parser_t *parser)
hgs
parents:
diff changeset
   540
{
hgs
parents:
diff changeset
   541
  NW_Status_t status;
hgs
parents:
diff changeset
   542
  if ((parser->handler) && (parser->handler->Attr_Start_CB)){
hgs
parents:
diff changeset
   543
    status = (*(parser->handler->Attr_Start_CB)) (parser, parser->context);
hgs
parents:
diff changeset
   544
    NW_WBXML_Parser_setStatus (parser, status);
hgs
parents:
diff changeset
   545
  }
hgs
parents:
diff changeset
   546
}
hgs
parents:
diff changeset
   547
hgs
parents:
diff changeset
   548
static
hgs
parents:
diff changeset
   549
void
hgs
parents:
diff changeset
   550
Handle_Attr_Val(NW_WBXML_Parser_t *parser)
hgs
parents:
diff changeset
   551
{
hgs
parents:
diff changeset
   552
  NW_Status_t status;
hgs
parents:
diff changeset
   553
  if ((parser->handler) && (parser->handler->Attr_Val_CB)){
hgs
parents:
diff changeset
   554
    status = (*(parser->handler->Attr_Val_CB)) (parser, parser->context);
hgs
parents:
diff changeset
   555
    NW_WBXML_Parser_setStatus (parser, status);
hgs
parents:
diff changeset
   556
  }
hgs
parents:
diff changeset
   557
}
hgs
parents:
diff changeset
   558
hgs
parents:
diff changeset
   559
static
hgs
parents:
diff changeset
   560
void
hgs
parents:
diff changeset
   561
Handle_Content(NW_WBXML_Parser_t *parser)
hgs
parents:
diff changeset
   562
{
hgs
parents:
diff changeset
   563
  NW_Status_t status;
hgs
parents:
diff changeset
   564
  if ((parser->handler) && (parser->handler->Content_CB)){
hgs
parents:
diff changeset
   565
    status = (*(parser->handler->Content_CB)) (parser, parser->context);
hgs
parents:
diff changeset
   566
    NW_WBXML_Parser_setStatus (parser, status);
hgs
parents:
diff changeset
   567
  }
hgs
parents:
diff changeset
   568
}
hgs
parents:
diff changeset
   569
hgs
parents:
diff changeset
   570
static
hgs
parents:
diff changeset
   571
void
hgs
parents:
diff changeset
   572
Handle_Codepage(NW_WBXML_Parser_t *parser)
hgs
parents:
diff changeset
   573
{
hgs
parents:
diff changeset
   574
  NW_Status_t status;
hgs
parents:
diff changeset
   575
  if ((parser->handler) && (parser->handler->CodePage_CB)){
hgs
parents:
diff changeset
   576
    status = (*(parser->handler->CodePage_CB)) (parser, parser->context);
hgs
parents:
diff changeset
   577
    NW_WBXML_Parser_setStatus (parser, status);
hgs
parents:
diff changeset
   578
  }
hgs
parents:
diff changeset
   579
}
hgs
parents:
diff changeset
   580
hgs
parents:
diff changeset
   581
static
hgs
parents:
diff changeset
   582
void
hgs
parents:
diff changeset
   583
Handle_Extension(NW_WBXML_Parser_t *parser)
hgs
parents:
diff changeset
   584
{
hgs
parents:
diff changeset
   585
  NW_Status_t status;
hgs
parents:
diff changeset
   586
  if ((parser->handler) && (parser->handler->Extension_CB)){
hgs
parents:
diff changeset
   587
    status = (*(parser->handler->Extension_CB)) (parser, parser->context);
hgs
parents:
diff changeset
   588
    NW_WBXML_Parser_setStatus (parser, status);
hgs
parents:
diff changeset
   589
  }
hgs
parents:
diff changeset
   590
}
hgs
parents:
diff changeset
   591
hgs
parents:
diff changeset
   592
/* Handle data type callbacks */
hgs
parents:
diff changeset
   593
hgs
parents:
diff changeset
   594
static
hgs
parents:
diff changeset
   595
void
hgs
parents:
diff changeset
   596
Handle_Fq_Token(NW_WBXML_Parser_t *parser,
hgs
parents:
diff changeset
   597
                NW_Uint32 token)
hgs
parents:
diff changeset
   598
{
hgs
parents:
diff changeset
   599
  NW_Status_t status;
hgs
parents:
diff changeset
   600
  if ((parser->handler) && (parser->handler->FQToken_CB)){
hgs
parents:
diff changeset
   601
    status = (*(parser->handler->FQToken_CB)) (parser, token, parser->context);
hgs
parents:
diff changeset
   602
    NW_WBXML_Parser_setStatus (parser, status);
hgs
parents:
diff changeset
   603
  }
hgs
parents:
diff changeset
   604
}
hgs
parents:
diff changeset
   605
hgs
parents:
diff changeset
   606
static
hgs
parents:
diff changeset
   607
void
hgs
parents:
diff changeset
   608
Handle_Inline_String(NW_WBXML_Parser_t *parser,
hgs
parents:
diff changeset
   609
                     NW_Uint32 len)
hgs
parents:
diff changeset
   610
{
hgs
parents:
diff changeset
   611
  NW_Status_t status;
hgs
parents:
diff changeset
   612
  if ((parser->handler) && (parser->handler->InlineString_CB)){
hgs
parents:
diff changeset
   613
    status = (*(parser->handler->InlineString_CB)) (parser, len,
hgs
parents:
diff changeset
   614
                                                    parser->context);
hgs
parents:
diff changeset
   615
    
hgs
parents:
diff changeset
   616
        NW_WBXML_Parser_setStatus (parser, status);
hgs
parents:
diff changeset
   617
 } 
hgs
parents:
diff changeset
   618
}
hgs
parents:
diff changeset
   619
hgs
parents:
diff changeset
   620
static
hgs
parents:
diff changeset
   621
void
hgs
parents:
diff changeset
   622
Handle_Table_String(NW_WBXML_Parser_t *parser,
hgs
parents:
diff changeset
   623
                    NW_Uint32 index)
hgs
parents:
diff changeset
   624
{
hgs
parents:
diff changeset
   625
  NW_Status_t status;
hgs
parents:
diff changeset
   626
  if ((parser->handler) && (parser->handler->TableString_CB)){
hgs
parents:
diff changeset
   627
    status = (*(parser->handler->TableString_CB)) (parser, index,
hgs
parents:
diff changeset
   628
                                                   parser->context);
hgs
parents:
diff changeset
   629
    NW_WBXML_Parser_setStatus (parser, status);
hgs
parents:
diff changeset
   630
  }
hgs
parents:
diff changeset
   631
}
hgs
parents:
diff changeset
   632
hgs
parents:
diff changeset
   633
static
hgs
parents:
diff changeset
   634
void
hgs
parents:
diff changeset
   635
Handle_Binary(NW_WBXML_Parser_t *parser,
hgs
parents:
diff changeset
   636
              NW_Uint32 value)
hgs
parents:
diff changeset
   637
{
hgs
parents:
diff changeset
   638
  NW_Status_t status;
hgs
parents:
diff changeset
   639
  if ((parser->handler) && (parser->handler->Binary_CB)){
hgs
parents:
diff changeset
   640
    status = (*(parser->handler->Binary_CB)) (parser, value, parser->context);
hgs
parents:
diff changeset
   641
    NW_WBXML_Parser_setStatus (parser, status);
hgs
parents:
diff changeset
   642
  }
hgs
parents:
diff changeset
   643
}
hgs
parents:
diff changeset
   644
hgs
parents:
diff changeset
   645
static
hgs
parents:
diff changeset
   646
void
hgs
parents:
diff changeset
   647
Handle_Opaque(NW_WBXML_Parser_t *parser,
hgs
parents:
diff changeset
   648
              NW_Uint32 len)
hgs
parents:
diff changeset
   649
{
hgs
parents:
diff changeset
   650
  NW_Status_t status;
hgs
parents:
diff changeset
   651
  if ((parser->handler) && (parser->handler->Opaque_CB)){
hgs
parents:
diff changeset
   652
    status = (*(parser->handler->Opaque_CB)) (parser, len, parser->context);
hgs
parents:
diff changeset
   653
    NW_WBXML_Parser_setStatus (parser, status);
hgs
parents:
diff changeset
   654
  }
hgs
parents:
diff changeset
   655
}
hgs
parents:
diff changeset
   656
hgs
parents:
diff changeset
   657
static
hgs
parents:
diff changeset
   658
void
hgs
parents:
diff changeset
   659
Handle_Entity(NW_WBXML_Parser_t *parser,
hgs
parents:
diff changeset
   660
              NW_Uint32 e)
hgs
parents:
diff changeset
   661
{
hgs
parents:
diff changeset
   662
  NW_Status_t status;
hgs
parents:
diff changeset
   663
  if ((parser->handler) && (parser->handler->Entity_CB)){
hgs
parents:
diff changeset
   664
    status = (*(parser->handler->Entity_CB)) (parser, e, parser->context);
hgs
parents:
diff changeset
   665
    NW_WBXML_Parser_setStatus (parser, status);
hgs
parents:
diff changeset
   666
  }
hgs
parents:
diff changeset
   667
}
hgs
parents:
diff changeset
   668
hgs
parents:
diff changeset
   669
/*
hgs
parents:
diff changeset
   670
* Safely get the next token, checking for switch pages along the way.
hgs
parents:
diff changeset
   671
* While this does advance past any switch pages, it DOES NOT advance
hgs
parents:
diff changeset
   672
* past the returned token.
hgs
parents:
diff changeset
   673
*/
hgs
parents:
diff changeset
   674
hgs
parents:
diff changeset
   675
static
hgs
parents:
diff changeset
   676
NW_Status_t
hgs
parents:
diff changeset
   677
NW_WBXML_Parser_getNextToken (NW_WBXML_Parser_t * parser,
hgs
parents:
diff changeset
   678
                              NW_Uint8 * token,
hgs
parents:
diff changeset
   679
                              NW_Int32 token_state)
hgs
parents:
diff changeset
   680
{
hgs
parents:
diff changeset
   681
hgs
parents:
diff changeset
   682
  NW_ASSERT(parser != NULL);
hgs
parents:
diff changeset
   683
hgs
parents:
diff changeset
   684
  if (!NW_WBXML_Parser_hasMoreBytecode (parser)) {
hgs
parents:
diff changeset
   685
    return NW_STAT_WBXML_ERROR_BYTECODE;
hgs
parents:
diff changeset
   686
  }
hgs
parents:
diff changeset
   687
hgs
parents:
diff changeset
   688
  while ((*token = NW_WBXML_Parser_readUint8 (parser)) ==
hgs
parents:
diff changeset
   689
         NW_WBXML_SWITCH_PAGE)
hgs
parents:
diff changeset
   690
  {
hgs
parents:
diff changeset
   691
    if (NW_WBXML_Parser_advance (parser, 1) < 0){
hgs
parents:
diff changeset
   692
      return NW_STAT_WBXML_ERROR_BYTECODE;
hgs
parents:
diff changeset
   693
    }
hgs
parents:
diff changeset
   694
    if (!NW_WBXML_Parser_hasMoreBytecode (parser)) {
hgs
parents:
diff changeset
   695
      return NW_STAT_WBXML_ERROR_BYTECODE;
hgs
parents:
diff changeset
   696
    }
hgs
parents:
diff changeset
   697
hgs
parents:
diff changeset
   698
    if (token_state == TOKEN_STATE_TAG){
hgs
parents:
diff changeset
   699
      parser->tag_code_page = NW_WBXML_Parser_readUint8 (parser);
hgs
parents:
diff changeset
   700
    } else {
hgs
parents:
diff changeset
   701
      parser->attribute_code_page = NW_WBXML_Parser_readUint8 (parser);
hgs
parents:
diff changeset
   702
    }
hgs
parents:
diff changeset
   703
hgs
parents:
diff changeset
   704
    if((parser->cp_registry.count > 0)
hgs
parents:
diff changeset
   705
      && ((parser->flags & NW_WBXML_REGISTRY_INIT) != NW_WBXML_REGISTRY_INIT)){
hgs
parents:
diff changeset
   706
      NW_ASSERT(parser->offset > 0);
hgs
parents:
diff changeset
   707
      /* We have a registry but we haven't finished initing it yet */
hgs
parents:
diff changeset
   708
      // WLIU_DEBUG: RFileLogger::WriteFormat(_L("Browser"), _L("cp_count.txt"), EFileLoggingModeAppend, _L("=== cp_count: %x, pW->index: %x \n"), parser->cp_registry.realcount +1, parser->offset - parser->lastValid);
hgs
parents:
diff changeset
   709
      NW_WBXML_CPRegistry_addEntry(&(parser->cp_registry),
hgs
parents:
diff changeset
   710
                                   NW_WBXML_Parser_readUint8(parser),
hgs
parents:
diff changeset
   711
                                   /* must use switch page token position */
hgs
parents:
diff changeset
   712
                                   parser->offset - 1,
hgs
parents:
diff changeset
   713
                                   (NW_Uint8)token_state);
hgs
parents:
diff changeset
   714
    }
hgs
parents:
diff changeset
   715
hgs
parents:
diff changeset
   716
    Handle_Codepage(parser);
hgs
parents:
diff changeset
   717
hgs
parents:
diff changeset
   718
    if (NW_WBXML_Parser_advance (parser, 1) < 0){
hgs
parents:
diff changeset
   719
      return NW_STAT_WBXML_ERROR_BYTECODE;
hgs
parents:
diff changeset
   720
    }
hgs
parents:
diff changeset
   721
    if (!NW_WBXML_Parser_hasMoreBytecode (parser)) {
hgs
parents:
diff changeset
   722
      return NW_STAT_WBXML_ERROR_BYTECODE;
hgs
parents:
diff changeset
   723
    }
hgs
parents:
diff changeset
   724
  }
hgs
parents:
diff changeset
   725
  return NW_STAT_SUCCESS;
hgs
parents:
diff changeset
   726
}
hgs
parents:
diff changeset
   727
hgs
parents:
diff changeset
   728
/*
hgs
parents:
diff changeset
   729
 * Element parsing methods: The parser is made up of a set of methods
hgs
parents:
diff changeset
   730
 * that know how to parse individual elements of the wbxml source. For
hgs
parents:
diff changeset
   731
 * elements that repeat, these are implemented in iterators. Building
hgs
parents:
diff changeset
   732
 * the parser from a set of element parsers and iterators makes it
hgs
parents:
diff changeset
   733
 * simple to use the parser as a deserializer for wbxml elements.
hgs
parents:
diff changeset
   734
 */
hgs
parents:
diff changeset
   735
hgs
parents:
diff changeset
   736
#define HAS_CONTENT(t)    ((t)&NW_WBXML_FLAGS_CONTENT)
hgs
parents:
diff changeset
   737
#define HAS_ATTRIBUTES(t) ((t)&NW_WBXML_FLAGS_ATTRIBUTES)
hgs
parents:
diff changeset
   738
hgs
parents:
diff changeset
   739
/*
hgs
parents:
diff changeset
   740
* Parse the token and name part of a tag. This generates a fully
hgs
parents:
diff changeset
   741
* qualified token.
hgs
parents:
diff changeset
   742
*/
hgs
parents:
diff changeset
   743
hgs
parents:
diff changeset
   744
NW_Status_t
hgs
parents:
diff changeset
   745
NW_WBXML_Parser_tagNameParse(NW_WBXML_Parser_t *parser)
hgs
parents:
diff changeset
   746
{
hgs
parents:
diff changeset
   747
  NW_Uint8 token;
hgs
parents:
diff changeset
   748
  NW_Int32 ilen;
hgs
parents:
diff changeset
   749
  NW_Uint32 index;
hgs
parents:
diff changeset
   750
  NW_Uint32 fq_token;
hgs
parents:
diff changeset
   751
  NW_Status_t status;
hgs
parents:
diff changeset
   752
hgs
parents:
diff changeset
   753
  NW_ASSERT(parser != NULL);
hgs
parents:
diff changeset
   754
hgs
parents:
diff changeset
   755
  Handle_Tag_Start(parser);
hgs
parents:
diff changeset
   756
hgs
parents:
diff changeset
   757
  CHECK_PARSER_STATUS;
hgs
parents:
diff changeset
   758
hgs
parents:
diff changeset
   759
  status = NW_WBXML_Parser_getNextToken (parser, &token, TOKEN_STATE_TAG);
hgs
parents:
diff changeset
   760
  if(status != NW_STAT_SUCCESS){
hgs
parents:
diff changeset
   761
    return status;
hgs
parents:
diff changeset
   762
  }
hgs
parents:
diff changeset
   763
hgs
parents:
diff changeset
   764
  fq_token = FqToken (parser, token, TOKEN_STATE_TAG);
hgs
parents:
diff changeset
   765
  Handle_Fq_Token(parser, fq_token);
hgs
parents:
diff changeset
   766
hgs
parents:
diff changeset
   767
  if (HAS_CONTENT(fq_token) || HAS_ATTRIBUTES(fq_token) ||
hgs
parents:
diff changeset
   768
      (NW_WBXML_Parser_hasMoreBytecode (parser)))
hgs
parents:
diff changeset
   769
  {
hgs
parents:
diff changeset
   770
    if (NW_WBXML_Parser_advance (parser, 1) < 0){
hgs
parents:
diff changeset
   771
        return NW_STAT_WBXML_ERROR_BYTECODE;
hgs
parents:
diff changeset
   772
    }
hgs
parents:
diff changeset
   773
  }
hgs
parents:
diff changeset
   774
hgs
parents:
diff changeset
   775
  /*
hgs
parents:
diff changeset
   776
   * Note that while the spec defines tokens for literal tags with
hgs
parents:
diff changeset
   777
   * and without attributes and content, they are just
hgs
parents:
diff changeset
   778
   * NW_WBXML_LITERAL with the content and/or attributes flags
hgs
parents:
diff changeset
   779
   * set. So ...
hgs
parents:
diff changeset
   780
   */
hgs
parents:
diff changeset
   781
hgs
parents:
diff changeset
   782
  if ((token & NW_WBXML_MASK_TAG_ID) == NW_WBXML_LITERAL){
hgs
parents:
diff changeset
   783
hgs
parents:
diff changeset
   784
  /*
hgs
parents:
diff changeset
   785
   * TODO:  Should check for another global token
hgs
parents:
diff changeset
   786
   * and return an error?
hgs
parents:
diff changeset
   787
   */
hgs
parents:
diff changeset
   788
hgs
parents:
diff changeset
   789
    ilen = NW_WBXML_Parser_readMbUint32 (parser, &index);
hgs
parents:
diff changeset
   790
    if(ilen < 0){
hgs
parents:
diff changeset
   791
      return NW_STAT_WBXML_ERROR_BYTECODE;
hgs
parents:
diff changeset
   792
    }
hgs
parents:
diff changeset
   793
hgs
parents:
diff changeset
   794
    Handle_Table_String(parser, index);
hgs
parents:
diff changeset
   795
hgs
parents:
diff changeset
   796
    if(NW_WBXML_Parser_advance(parser, ilen) < 0){
hgs
parents:
diff changeset
   797
      return NW_STAT_WBXML_ERROR_BYTECODE;
hgs
parents:
diff changeset
   798
    }
hgs
parents:
diff changeset
   799
  }
hgs
parents:
diff changeset
   800
hgs
parents:
diff changeset
   801
  if (HAS_ATTRIBUTES (fq_token)){   /* Has attributes, possibly content */
hgs
parents:
diff changeset
   802
    status = NW_STAT_WBXML_HAS_ATTRIBUTES;
hgs
parents:
diff changeset
   803
    if (HAS_CONTENT (fq_token)){
hgs
parents:
diff changeset
   804
      status = NW_STAT_WBXML_HAS_ATTR_CONTENT;
hgs
parents:
diff changeset
   805
    }
hgs
parents:
diff changeset
   806
  }
hgs
parents:
diff changeset
   807
hgs
parents:
diff changeset
   808
  else if (HAS_CONTENT (fq_token)){ /* Has content, no attributes */
hgs
parents:
diff changeset
   809
    status = NW_STAT_WBXML_HAS_CONTENT;
hgs
parents:
diff changeset
   810
  }
hgs
parents:
diff changeset
   811
hgs
parents:
diff changeset
   812
  else{                             /* No attributes, no content */
hgs
parents:
diff changeset
   813
    status = NW_STAT_SUCCESS;
hgs
parents:
diff changeset
   814
    Handle_Tag_End(parser);
hgs
parents:
diff changeset
   815
  }
hgs
parents:
diff changeset
   816
hgs
parents:
diff changeset
   817
  return status;
hgs
parents:
diff changeset
   818
}
hgs
parents:
diff changeset
   819
hgs
parents:
diff changeset
   820
/* Parse an attribute list */
hgs
parents:
diff changeset
   821
hgs
parents:
diff changeset
   822
NW_Status_t
hgs
parents:
diff changeset
   823
NW_WBXML_Parser_attributeListIterate(NW_WBXML_Parser_t *parser)
hgs
parents:
diff changeset
   824
{
hgs
parents:
diff changeset
   825
  NW_Uint8 token;
hgs
parents:
diff changeset
   826
  NW_Status_t status;
hgs
parents:
diff changeset
   827
hgs
parents:
diff changeset
   828
  NW_ASSERT(parser != NULL);
hgs
parents:
diff changeset
   829
hgs
parents:
diff changeset
   830
  status = NW_WBXML_Parser_attributeParse (parser);
hgs
parents:
diff changeset
   831
  if(status != NW_STAT_SUCCESS){
hgs
parents:
diff changeset
   832
    return status;
hgs
parents:
diff changeset
   833
  }
hgs
parents:
diff changeset
   834
hgs
parents:
diff changeset
   835
  status = NW_WBXML_Parser_getNextToken (parser, &token, TOKEN_STATE_ATTR);
hgs
parents:
diff changeset
   836
  if(status != NW_STAT_SUCCESS){
hgs
parents:
diff changeset
   837
    return status;
hgs
parents:
diff changeset
   838
  }
hgs
parents:
diff changeset
   839
hgs
parents:
diff changeset
   840
  if (token == NW_WBXML_END){
hgs
parents:
diff changeset
   841
    return NW_STAT_WBXML_ITERATE_DONE;
hgs
parents:
diff changeset
   842
  }
hgs
parents:
diff changeset
   843
  return NW_STAT_WBXML_ITERATE_MORE;
hgs
parents:
diff changeset
   844
}
hgs
parents:
diff changeset
   845
hgs
parents:
diff changeset
   846
static
hgs
parents:
diff changeset
   847
NW_Status_t
hgs
parents:
diff changeset
   848
NW_WBXML_Parser_attributeListParse(NW_WBXML_Parser_t *parser)
hgs
parents:
diff changeset
   849
{
hgs
parents:
diff changeset
   850
  NW_Status_t status;
hgs
parents:
diff changeset
   851
hgs
parents:
diff changeset
   852
  /* Run the attribute list iterator till it completes */
hgs
parents:
diff changeset
   853
hgs
parents:
diff changeset
   854
  while ((parser->flags & NW_WBXML_PARSER_S_MASK) == NW_WBXML_PARSER_OK){
hgs
parents:
diff changeset
   855
    status = NW_WBXML_Parser_attributeListIterate(parser);
hgs
parents:
diff changeset
   856
    if(status == NW_STAT_WBXML_ITERATE_DONE){
hgs
parents:
diff changeset
   857
      return NW_STAT_SUCCESS;
hgs
parents:
diff changeset
   858
    }
hgs
parents:
diff changeset
   859
    if(status != NW_STAT_WBXML_ITERATE_MORE){
hgs
parents:
diff changeset
   860
      return status;
hgs
parents:
diff changeset
   861
    }
hgs
parents:
diff changeset
   862
  }
hgs
parents:
diff changeset
   863
  return NW_WBXML_Parser_flagToStatus(parser);
hgs
parents:
diff changeset
   864
}
hgs
parents:
diff changeset
   865
hgs
parents:
diff changeset
   866
/*
hgs
parents:
diff changeset
   867
* Parse a processing instruction
hgs
parents:
diff changeset
   868
*/
hgs
parents:
diff changeset
   869
static
hgs
parents:
diff changeset
   870
NW_Status_t
hgs
parents:
diff changeset
   871
NW_WBXML_Parser_piParse (NW_WBXML_Parser_t * parser,
hgs
parents:
diff changeset
   872
                         NW_Int32 token_state)
hgs
parents:
diff changeset
   873
{
hgs
parents:
diff changeset
   874
hgs
parents:
diff changeset
   875
  NW_Uint8 token;
hgs
parents:
diff changeset
   876
  NW_Status_t status;
hgs
parents:
diff changeset
   877
hgs
parents:
diff changeset
   878
  status = NW_WBXML_Parser_getNextToken (parser, &token, token_state);
hgs
parents:
diff changeset
   879
  if(status != NW_STAT_SUCCESS){
hgs
parents:
diff changeset
   880
    return status;
hgs
parents:
diff changeset
   881
  }
hgs
parents:
diff changeset
   882
hgs
parents:
diff changeset
   883
  switch (token){
hgs
parents:
diff changeset
   884
  case NW_WBXML_PI:
hgs
parents:
diff changeset
   885
    Handle_Pi(parser);
hgs
parents:
diff changeset
   886
    /*
hgs
parents:
diff changeset
   887
    * Advance past the PI token and then get the PI's
hgs
parents:
diff changeset
   888
    * target and value
hgs
parents:
diff changeset
   889
    */
hgs
parents:
diff changeset
   890
    if(NW_WBXML_Parser_advance (parser, 1) < 0){
hgs
parents:
diff changeset
   891
      return NW_STAT_WBXML_ERROR_BYTECODE;
hgs
parents:
diff changeset
   892
    }
hgs
parents:
diff changeset
   893
    status = NW_WBXML_Parser_attributeParse (parser);
hgs
parents:
diff changeset
   894
    if(status != NW_STAT_SUCCESS){
hgs
parents:
diff changeset
   895
      return status;
hgs
parents:
diff changeset
   896
    }
hgs
parents:
diff changeset
   897
    /* Advance past the PI's end token */
hgs
parents:
diff changeset
   898
    status = NW_WBXML_Parser_getNextToken (parser, &token, TOKEN_STATE_ATTR);
hgs
parents:
diff changeset
   899
    if(status != NW_STAT_SUCCESS){
hgs
parents:
diff changeset
   900
      return status;
hgs
parents:
diff changeset
   901
    }
hgs
parents:
diff changeset
   902
    if (token == NW_WBXML_END){
hgs
parents:
diff changeset
   903
      Handle_Pi_End(parser);
hgs
parents:
diff changeset
   904
      /*
hgs
parents:
diff changeset
   905
       * Must advance the reader past the end token but since this
hgs
parents:
diff changeset
   906
       * PI may be the last NW_Byte in the bytecode, first check to see
hgs
parents:
diff changeset
   907
       * if there is any bytecode left.
hgs
parents:
diff changeset
   908
       */
hgs
parents:
diff changeset
   909
      if (NW_WBXML_Parser_hasMoreBytecode (parser)){
hgs
parents:
diff changeset
   910
        NW_WBXML_Parser_advance (parser, 1);
hgs
parents:
diff changeset
   911
      }
hgs
parents:
diff changeset
   912
    }
hgs
parents:
diff changeset
   913
    else
hgs
parents:
diff changeset
   914
      return NW_STAT_WBXML_ERROR_BYTECODE;
hgs
parents:
diff changeset
   915
    break;
hgs
parents:
diff changeset
   916
  default:
hgs
parents:
diff changeset
   917
    return NW_STAT_WBXML_ERROR_BYTECODE;
hgs
parents:
diff changeset
   918
  }
hgs
parents:
diff changeset
   919
  return NW_STAT_SUCCESS;
hgs
parents:
diff changeset
   920
}
hgs
parents:
diff changeset
   921
hgs
parents:
diff changeset
   922
/* Parse an element, recursively parsing content */
hgs
parents:
diff changeset
   923
hgs
parents:
diff changeset
   924
static
hgs
parents:
diff changeset
   925
NW_Status_t
hgs
parents:
diff changeset
   926
NW_WBXML_Parser_elementParse (NW_WBXML_Parser_t * parser)
hgs
parents:
diff changeset
   927
{
hgs
parents:
diff changeset
   928
  NW_Status_t tag_status = NW_STAT_SUCCESS;
hgs
parents:
diff changeset
   929
  NW_Status_t status     = NW_STAT_WBXML_ERROR_BYTECODE;
hgs
parents:
diff changeset
   930
hgs
parents:
diff changeset
   931
  if (++(parser->recursiveCallCnt) >= WBXML_MAX_RECURSIVE_CALL_DEPTH) {
hgs
parents:
diff changeset
   932
    goto FuncExit;
hgs
parents:
diff changeset
   933
  }
hgs
parents:
diff changeset
   934
hgs
parents:
diff changeset
   935
  /* The while loop checks parser status after each case. */
hgs
parents:
diff changeset
   936
  while ((parser->flags & NW_WBXML_PARSER_S_MASK) == NW_WBXML_PARSER_OK){
hgs
parents:
diff changeset
   937
    if (tag_status == NW_STAT_SUCCESS){
hgs
parents:
diff changeset
   938
      tag_status = NW_WBXML_Parser_tagNameParse(parser);
hgs
parents:
diff changeset
   939
      if(tag_status == NW_STAT_SUCCESS){
hgs
parents:
diff changeset
   940
        status = NW_STAT_SUCCESS; /* Normal return */
hgs
parents:
diff changeset
   941
        goto FuncExit;
hgs
parents:
diff changeset
   942
      }
hgs
parents:
diff changeset
   943
    }
hgs
parents:
diff changeset
   944
hgs
parents:
diff changeset
   945
    else if((tag_status == NW_STAT_WBXML_HAS_ATTRIBUTES) ||
hgs
parents:
diff changeset
   946
            (tag_status == NW_STAT_WBXML_HAS_ATTR_CONTENT)) {
hgs
parents:
diff changeset
   947
hgs
parents:
diff changeset
   948
      status = NW_WBXML_Parser_attributeListParse (parser);
hgs
parents:
diff changeset
   949
      if(status != NW_STAT_SUCCESS){
hgs
parents:
diff changeset
   950
        goto FuncExit;
hgs
parents:
diff changeset
   951
      }
hgs
parents:
diff changeset
   952
hgs
parents:
diff changeset
   953
      if (NW_WBXML_Parser_hasMoreBytecode (parser)){
hgs
parents:
diff changeset
   954
        if(NW_WBXML_Parser_advance (parser, 1) < 0){
hgs
parents:
diff changeset
   955
          status = NW_STAT_WBXML_ERROR_BYTECODE;
hgs
parents:
diff changeset
   956
          goto FuncExit;
hgs
parents:
diff changeset
   957
        }
hgs
parents:
diff changeset
   958
      }
hgs
parents:
diff changeset
   959
hgs
parents:
diff changeset
   960
      if(tag_status == NW_STAT_WBXML_HAS_ATTR_CONTENT) {
hgs
parents:
diff changeset
   961
        tag_status = NW_STAT_WBXML_HAS_CONTENT;
hgs
parents:
diff changeset
   962
      }
hgs
parents:
diff changeset
   963
      else {
hgs
parents:
diff changeset
   964
        Handle_Tag_End(parser);
hgs
parents:
diff changeset
   965
        status = NW_STAT_SUCCESS;       /* Normal return */
hgs
parents:
diff changeset
   966
        goto FuncExit;
hgs
parents:
diff changeset
   967
      }
hgs
parents:
diff changeset
   968
hgs
parents:
diff changeset
   969
      /*  TODO:  else check for error (token >= 128) */
hgs
parents:
diff changeset
   970
    }
hgs
parents:
diff changeset
   971
hgs
parents:
diff changeset
   972
    else if((tag_status == NW_STAT_WBXML_HAS_CONTENT) ||
hgs
parents:
diff changeset
   973
            (tag_status == NW_STAT_WBXML_HAS_ATTR_CONTENT)) {
hgs
parents:
diff changeset
   974
hgs
parents:
diff changeset
   975
      status = NW_WBXML_Parser_contentParse(parser);
hgs
parents:
diff changeset
   976
      if(status != NW_STAT_SUCCESS){
hgs
parents:
diff changeset
   977
        goto FuncExit;
hgs
parents:
diff changeset
   978
      }
hgs
parents:
diff changeset
   979
hgs
parents:
diff changeset
   980
      Handle_Tag_End(parser);
hgs
parents:
diff changeset
   981
      status = NW_STAT_SUCCESS; /* Normal return */
hgs
parents:
diff changeset
   982
      goto FuncExit;
hgs
parents:
diff changeset
   983
    }
hgs
parents:
diff changeset
   984
    else{
hgs
parents:
diff changeset
   985
      /* Unexpected NW_Byte code */
hgs
parents:
diff changeset
   986
      status = NW_STAT_WBXML_ERROR_BYTECODE;
hgs
parents:
diff changeset
   987
      goto FuncExit;
hgs
parents:
diff changeset
   988
    }
hgs
parents:
diff changeset
   989
  }
hgs
parents:
diff changeset
   990
  status = NW_STAT_WBXML_ERROR_BYTECODE; /* Bad parser status */
hgs
parents:
diff changeset
   991
hgs
parents:
diff changeset
   992
  FuncExit:
hgs
parents:
diff changeset
   993
  --(parser->recursiveCallCnt);
hgs
parents:
diff changeset
   994
  return status;
hgs
parents:
diff changeset
   995
}
hgs
parents:
diff changeset
   996
hgs
parents:
diff changeset
   997
hgs
parents:
diff changeset
   998
/* Parse a sequence of text components until a non-text component is reached */
hgs
parents:
diff changeset
   999
hgs
parents:
diff changeset
  1000
hgs
parents:
diff changeset
  1001
static
hgs
parents:
diff changeset
  1002
NW_Uint32
hgs
parents:
diff changeset
  1003
isTextToken(NW_Uint8 token){
hgs
parents:
diff changeset
  1004
  if((token == NW_WBXML_STR_I)
hgs
parents:
diff changeset
  1005
    ||(token == NW_WBXML_STR_T)
hgs
parents:
diff changeset
  1006
    ||(token == NW_WBXML_OPAQUE)
hgs
parents:
diff changeset
  1007
    ||(token == NW_WBXML_ENTITY)
hgs
parents:
diff changeset
  1008
    ||(token == NW_WBXML_EXT_I_0)
hgs
parents:
diff changeset
  1009
    || (token == NW_WBXML_EXT_I_1)
hgs
parents:
diff changeset
  1010
    || (token == NW_WBXML_EXT_I_2)
hgs
parents:
diff changeset
  1011
    || (token == NW_WBXML_EXT_T_0)
hgs
parents:
diff changeset
  1012
    || (token == NW_WBXML_EXT_T_1)
hgs
parents:
diff changeset
  1013
    || (token == NW_WBXML_EXT_T_2)
hgs
parents:
diff changeset
  1014
    || (token == NW_WBXML_EXT_0)
hgs
parents:
diff changeset
  1015
    || (token == NW_WBXML_EXT_1)
hgs
parents:
diff changeset
  1016
    || (token == NW_WBXML_EXT_2)){
hgs
parents:
diff changeset
  1017
    return 1;
hgs
parents:
diff changeset
  1018
  }
hgs
parents:
diff changeset
  1019
  return 0;
hgs
parents:
diff changeset
  1020
}
hgs
parents:
diff changeset
  1021
hgs
parents:
diff changeset
  1022
hgs
parents:
diff changeset
  1023
NW_Status_t
hgs
parents:
diff changeset
  1024
NW_WBXML_Parser_textIterate(NW_WBXML_Parser_t * parser){
hgs
parents:
diff changeset
  1025
hgs
parents:
diff changeset
  1026
  NW_Uint8 token;
hgs
parents:
diff changeset
  1027
  NW_Int32 ilen = 0;
hgs
parents:
diff changeset
  1028
  NW_Uint32 index;
hgs
parents:
diff changeset
  1029
  NW_Uint32 e;
hgs
parents:
diff changeset
  1030
  NW_Status_t status;
hgs
parents:
diff changeset
  1031
hgs
parents:
diff changeset
  1032
  status = NW_WBXML_Parser_getNextToken (parser, &token, TOKEN_STATE_TAG);
hgs
parents:
diff changeset
  1033
  if(status != NW_STAT_SUCCESS){
hgs
parents:
diff changeset
  1034
    return status;
hgs
parents:
diff changeset
  1035
  }
hgs
parents:
diff changeset
  1036
hgs
parents:
diff changeset
  1037
  switch (token){
hgs
parents:
diff changeset
  1038
  case NW_WBXML_STR_I:
hgs
parents:
diff changeset
  1039
    Handle_Content(parser);
hgs
parents:
diff changeset
  1040
    if(NW_WBXML_Parser_advance (parser, 1) < 0){
hgs
parents:
diff changeset
  1041
      return NW_STAT_WBXML_ERROR_BYTECODE;
hgs
parents:
diff changeset
  1042
    }
hgs
parents:
diff changeset
  1043
    ilen = NW_WBXML_Parser_getInlineStrLen(parser, parser->doc);
hgs
parents:
diff changeset
  1044
    if(ilen < 0){
hgs
parents:
diff changeset
  1045
      return NW_STAT_WBXML_ERROR_BYTECODE;
hgs
parents:
diff changeset
  1046
    }
hgs
parents:
diff changeset
  1047
    Handle_Inline_String(parser, (NW_Uint32)ilen);
hgs
parents:
diff changeset
  1048
    if(NW_WBXML_Parser_advance(parser, ilen) < 0){
hgs
parents:
diff changeset
  1049
      return NW_STAT_WBXML_ERROR_BYTECODE;
hgs
parents:
diff changeset
  1050
    }
hgs
parents:
diff changeset
  1051
    break;
hgs
parents:
diff changeset
  1052
  case NW_WBXML_STR_T:
hgs
parents:
diff changeset
  1053
    Handle_Content(parser);
hgs
parents:
diff changeset
  1054
    if(NW_WBXML_Parser_advance (parser, 1) < 0){
hgs
parents:
diff changeset
  1055
      return NW_STAT_WBXML_ERROR_BYTECODE;
hgs
parents:
diff changeset
  1056
    }
hgs
parents:
diff changeset
  1057
    ilen = NW_WBXML_Parser_readMbUint32 (parser, &index);
hgs
parents:
diff changeset
  1058
    if ((ilen < 0) || (index >= parser->doc->strtbl.length)) {
hgs
parents:
diff changeset
  1059
      return NW_STAT_WBXML_ERROR_BYTECODE;
hgs
parents:
diff changeset
  1060
    }
hgs
parents:
diff changeset
  1061
    if (!NW_String_valid(parser->doc->strtbl.data + index,
hgs
parents:
diff changeset
  1062
                         parser->doc->strtbl.length - index,
hgs
parents:
diff changeset
  1063
                         parser->doc->charset)) {
hgs
parents:
diff changeset
  1064
      return  NW_STAT_WBXML_ERROR_BYTECODE;
hgs
parents:
diff changeset
  1065
    }
hgs
parents:
diff changeset
  1066
    Handle_Table_String(parser, index);
hgs
parents:
diff changeset
  1067
    if(NW_WBXML_Parser_advance(parser, ilen)< 0){
hgs
parents:
diff changeset
  1068
      return NW_STAT_WBXML_ERROR_BYTECODE;
hgs
parents:
diff changeset
  1069
    }
hgs
parents:
diff changeset
  1070
    break;
hgs
parents:
diff changeset
  1071
  case NW_WBXML_ENTITY:
hgs
parents:
diff changeset
  1072
    Handle_Content(parser);
hgs
parents:
diff changeset
  1073
    if(NW_WBXML_Parser_advance (parser, 1) < 0){
hgs
parents:
diff changeset
  1074
      return NW_STAT_WBXML_ERROR_BYTECODE;
hgs
parents:
diff changeset
  1075
    }
hgs
parents:
diff changeset
  1076
    ilen = NW_WBXML_Parser_readMbUint32 (parser, &e);
hgs
parents:
diff changeset
  1077
    if(ilen < 0){
hgs
parents:
diff changeset
  1078
      return NW_STAT_WBXML_ERROR_BYTECODE;
hgs
parents:
diff changeset
  1079
    }
hgs
parents:
diff changeset
  1080
    if(NW_WBXML_Parser_advance (parser, ilen) < 0){
hgs
parents:
diff changeset
  1081
      return NW_STAT_WBXML_ERROR_BYTECODE;
hgs
parents:
diff changeset
  1082
    }
hgs
parents:
diff changeset
  1083
    Handle_Entity(parser, e);
hgs
parents:
diff changeset
  1084
    break;
hgs
parents:
diff changeset
  1085
  case NW_WBXML_EXT_I_0:
hgs
parents:
diff changeset
  1086
  case NW_WBXML_EXT_I_1:
hgs
parents:
diff changeset
  1087
  case NW_WBXML_EXT_I_2:
hgs
parents:
diff changeset
  1088
  case NW_WBXML_EXT_T_0:
hgs
parents:
diff changeset
  1089
  case NW_WBXML_EXT_T_1:
hgs
parents:
diff changeset
  1090
  case NW_WBXML_EXT_T_2:
hgs
parents:
diff changeset
  1091
  case NW_WBXML_EXT_0:
hgs
parents:
diff changeset
  1092
  case NW_WBXML_EXT_1:
hgs
parents:
diff changeset
  1093
  case NW_WBXML_EXT_2:
hgs
parents:
diff changeset
  1094
    Handle_Content(parser);
hgs
parents:
diff changeset
  1095
    status = NW_WBXML_Parser_extensionParse (parser, TOKEN_STATE_TAG);
hgs
parents:
diff changeset
  1096
    if(status != NW_STAT_SUCCESS){
hgs
parents:
diff changeset
  1097
      return status;
hgs
parents:
diff changeset
  1098
    }
hgs
parents:
diff changeset
  1099
    break;
hgs
parents:
diff changeset
  1100
  case NW_WBXML_OPAQUE:
hgs
parents:
diff changeset
  1101
    Handle_Content(parser);
hgs
parents:
diff changeset
  1102
    status = NW_WBXML_Parser_opaqueParse (parser, TOKEN_STATE_TAG);
hgs
parents:
diff changeset
  1103
    if(status != NW_STAT_SUCCESS){
hgs
parents:
diff changeset
  1104
      return status;
hgs
parents:
diff changeset
  1105
    }
hgs
parents:
diff changeset
  1106
    break;
hgs
parents:
diff changeset
  1107
  case NW_WBXML_PI:
hgs
parents:
diff changeset
  1108
    status = NW_WBXML_Parser_piParse (parser, TOKEN_STATE_TAG);
hgs
parents:
diff changeset
  1109
    if (status != NW_STAT_SUCCESS){
hgs
parents:
diff changeset
  1110
      return status;
hgs
parents:
diff changeset
  1111
    }
hgs
parents:
diff changeset
  1112
    break;
hgs
parents:
diff changeset
  1113
  default:
hgs
parents:
diff changeset
  1114
    return NW_STAT_FAILURE;
hgs
parents:
diff changeset
  1115
  }
hgs
parents:
diff changeset
  1116
  if (NW_WBXML_Parser_hasMoreBytecode (parser)) {
hgs
parents:
diff changeset
  1117
    status = NW_WBXML_Parser_getNextToken(parser, &token, TOKEN_STATE_TAG);
hgs
parents:
diff changeset
  1118
    if(status != NW_STAT_SUCCESS){
hgs
parents:
diff changeset
  1119
      return status;
hgs
parents:
diff changeset
  1120
    }
hgs
parents:
diff changeset
  1121
    if(isTextToken(token))
hgs
parents:
diff changeset
  1122
      return NW_STAT_WBXML_ITERATE_MORE;
hgs
parents:
diff changeset
  1123
  }
hgs
parents:
diff changeset
  1124
  return NW_STAT_WBXML_ITERATE_DONE;
hgs
parents:
diff changeset
  1125
}
hgs
parents:
diff changeset
  1126
hgs
parents:
diff changeset
  1127
static
hgs
parents:
diff changeset
  1128
NW_Status_t
hgs
parents:
diff changeset
  1129
NW_WBXML_Parser_textParse(NW_WBXML_Parser_t * parser){
hgs
parents:
diff changeset
  1130
hgs
parents:
diff changeset
  1131
  NW_Status_t status;
hgs
parents:
diff changeset
  1132
hgs
parents:
diff changeset
  1133
  /* Run the text iterator till it completes */
hgs
parents:
diff changeset
  1134
hgs
parents:
diff changeset
  1135
  while ((parser->flags & NW_WBXML_PARSER_S_MASK) == NW_WBXML_PARSER_OK){
hgs
parents:
diff changeset
  1136
    status = NW_WBXML_Parser_textIterate(parser);
hgs
parents:
diff changeset
  1137
    if(status == NW_STAT_WBXML_ITERATE_DONE){
hgs
parents:
diff changeset
  1138
      return NW_STAT_SUCCESS;
hgs
parents:
diff changeset
  1139
    }
hgs
parents:
diff changeset
  1140
    if(status != NW_STAT_WBXML_ITERATE_MORE){
hgs
parents:
diff changeset
  1141
      return status;
hgs
parents:
diff changeset
  1142
    }
hgs
parents:
diff changeset
  1143
  }
hgs
parents:
diff changeset
  1144
  return NW_WBXML_Parser_flagToStatus(parser);
hgs
parents:
diff changeset
  1145
}
hgs
parents:
diff changeset
  1146
hgs
parents:
diff changeset
  1147
hgs
parents:
diff changeset
  1148
/* Parse tag content */
hgs
parents:
diff changeset
  1149
hgs
parents:
diff changeset
  1150
NW_Status_t
hgs
parents:
diff changeset
  1151
NW_WBXML_Parser_contentParse (NW_WBXML_Parser_t * parser){
hgs
parents:
diff changeset
  1152
hgs
parents:
diff changeset
  1153
  NW_Uint8 token;
hgs
parents:
diff changeset
  1154
  NW_Status_t status;
hgs
parents:
diff changeset
  1155
hgs
parents:
diff changeset
  1156
  while ((parser->flags & NW_WBXML_PARSER_S_MASK) == NW_WBXML_PARSER_OK){
hgs
parents:
diff changeset
  1157
hgs
parents:
diff changeset
  1158
    status = NW_WBXML_Parser_getNextToken (parser, &token, TOKEN_STATE_TAG);
hgs
parents:
diff changeset
  1159
    if(status != NW_STAT_SUCCESS){
hgs
parents:
diff changeset
  1160
      return status;
hgs
parents:
diff changeset
  1161
    }
hgs
parents:
diff changeset
  1162
hgs
parents:
diff changeset
  1163
    switch (token){
hgs
parents:
diff changeset
  1164
    case NW_WBXML_END:
hgs
parents:
diff changeset
  1165
      if (NW_WBXML_Parser_hasMoreBytecode (parser)){
hgs
parents:
diff changeset
  1166
        NW_WBXML_Parser_advance (parser, 1);
hgs
parents:
diff changeset
  1167
      }
hgs
parents:
diff changeset
  1168
      return NW_STAT_SUCCESS;             /* Normal return */
hgs
parents:
diff changeset
  1169
hgs
parents:
diff changeset
  1170
    case NW_WBXML_STR_I:
hgs
parents:
diff changeset
  1171
    case NW_WBXML_STR_T:
hgs
parents:
diff changeset
  1172
    case NW_WBXML_ENTITY:
hgs
parents:
diff changeset
  1173
    case NW_WBXML_PI:
hgs
parents:
diff changeset
  1174
    case NW_WBXML_EXT_I_0:
hgs
parents:
diff changeset
  1175
    case NW_WBXML_EXT_I_1:
hgs
parents:
diff changeset
  1176
    case NW_WBXML_EXT_I_2:
hgs
parents:
diff changeset
  1177
    case NW_WBXML_EXT_T_0:
hgs
parents:
diff changeset
  1178
    case NW_WBXML_EXT_T_1:
hgs
parents:
diff changeset
  1179
    case NW_WBXML_EXT_T_2:
hgs
parents:
diff changeset
  1180
    case NW_WBXML_EXT_0:
hgs
parents:
diff changeset
  1181
    case NW_WBXML_EXT_1:
hgs
parents:
diff changeset
  1182
    case NW_WBXML_EXT_2:
hgs
parents:
diff changeset
  1183
    case NW_WBXML_OPAQUE:
hgs
parents:
diff changeset
  1184
      status = NW_WBXML_Parser_textParse(parser);
hgs
parents:
diff changeset
  1185
      if(status != NW_STAT_SUCCESS){
hgs
parents:
diff changeset
  1186
        return status;
hgs
parents:
diff changeset
  1187
      }
hgs
parents:
diff changeset
  1188
      break;
hgs
parents:
diff changeset
  1189
    case NW_WBXML_LITERAL:
hgs
parents:
diff changeset
  1190
    case NW_WBXML_LITERAL_A:
hgs
parents:
diff changeset
  1191
    case NW_WBXML_LITERAL_C:
hgs
parents:
diff changeset
  1192
    case NW_WBXML_LITERAL_AC:
hgs
parents:
diff changeset
  1193
    default:
hgs
parents:
diff changeset
  1194
      Handle_Content(parser);
hgs
parents:
diff changeset
  1195
      status = NW_WBXML_Parser_elementParse (parser);
hgs
parents:
diff changeset
  1196
      if(status != NW_STAT_SUCCESS){
hgs
parents:
diff changeset
  1197
        return status;
hgs
parents:
diff changeset
  1198
      }
hgs
parents:
diff changeset
  1199
      break;
hgs
parents:
diff changeset
  1200
    }
hgs
parents:
diff changeset
  1201
  }
hgs
parents:
diff changeset
  1202
  return NW_WBXML_Parser_flagToStatus(parser);
hgs
parents:
diff changeset
  1203
}
hgs
parents:
diff changeset
  1204
hgs
parents:
diff changeset
  1205
/* Parse an extension */
hgs
parents:
diff changeset
  1206
hgs
parents:
diff changeset
  1207
NW_Status_t
hgs
parents:
diff changeset
  1208
NW_WBXML_Parser_extensionParse (NW_WBXML_Parser_t * parser,
hgs
parents:
diff changeset
  1209
                                NW_Int32 token_state)
hgs
parents:
diff changeset
  1210
{
hgs
parents:
diff changeset
  1211
  NW_Uint8 token = 0;
hgs
parents:
diff changeset
  1212
  NW_Uint32 fq_token;
hgs
parents:
diff changeset
  1213
  int ilen;
hgs
parents:
diff changeset
  1214
  NW_Uint32 value;
hgs
parents:
diff changeset
  1215
  NW_Status_t status;
hgs
parents:
diff changeset
  1216
hgs
parents:
diff changeset
  1217
  /*  if (token_state == TOKEN_STATE_TAG)
hgs
parents:
diff changeset
  1218
  * handler = parser->handler; TODO: deal with this
hgs
parents:
diff changeset
  1219
  */
hgs
parents:
diff changeset
  1220
hgs
parents:
diff changeset
  1221
  Handle_Extension(parser);
hgs
parents:
diff changeset
  1222
hgs
parents:
diff changeset
  1223
  status = NW_WBXML_Parser_getNextToken (parser, &token, token_state);
hgs
parents:
diff changeset
  1224
  if(status != NW_STAT_SUCCESS){
hgs
parents:
diff changeset
  1225
    return status;
hgs
parents:
diff changeset
  1226
  }
hgs
parents:
diff changeset
  1227
hgs
parents:
diff changeset
  1228
  fq_token = FqToken (parser, token, token_state);
hgs
parents:
diff changeset
  1229
  Handle_Fq_Token(parser, fq_token);
hgs
parents:
diff changeset
  1230
hgs
parents:
diff changeset
  1231
  switch (token){
hgs
parents:
diff changeset
  1232
  case NW_WBXML_EXT_I_0:
hgs
parents:
diff changeset
  1233
  case NW_WBXML_EXT_I_1:
hgs
parents:
diff changeset
  1234
  case NW_WBXML_EXT_I_2:
hgs
parents:
diff changeset
  1235
    if(NW_WBXML_Parser_advance (parser, 1) < 0){
hgs
parents:
diff changeset
  1236
      return NW_STAT_WBXML_ERROR_BYTECODE;
hgs
parents:
diff changeset
  1237
    }
hgs
parents:
diff changeset
  1238
hgs
parents:
diff changeset
  1239
    ilen = NW_WBXML_Parser_getInlineStrLen(parser, parser->doc);
hgs
parents:
diff changeset
  1240
    if(ilen < 0){
hgs
parents:
diff changeset
  1241
      return NW_STAT_WBXML_ERROR_BYTECODE;
hgs
parents:
diff changeset
  1242
    }
hgs
parents:
diff changeset
  1243
hgs
parents:
diff changeset
  1244
    Handle_Inline_String(parser, (NW_Uint32)ilen);
hgs
parents:
diff changeset
  1245
hgs
parents:
diff changeset
  1246
    if(NW_WBXML_Parser_advance(parser, ilen)<0){
hgs
parents:
diff changeset
  1247
      return NW_STAT_WBXML_ERROR_BYTECODE;
hgs
parents:
diff changeset
  1248
    }
hgs
parents:
diff changeset
  1249
    break;
hgs
parents:
diff changeset
  1250
  case NW_WBXML_EXT_T_0:
hgs
parents:
diff changeset
  1251
  case NW_WBXML_EXT_T_1:
hgs
parents:
diff changeset
  1252
  case NW_WBXML_EXT_T_2:
hgs
parents:
diff changeset
  1253
hgs
parents:
diff changeset
  1254
    if(NW_WBXML_Parser_advance (parser, 1) < 0){
hgs
parents:
diff changeset
  1255
      return NW_STAT_WBXML_ERROR_BYTECODE;
hgs
parents:
diff changeset
  1256
    }
hgs
parents:
diff changeset
  1257
hgs
parents:
diff changeset
  1258
    ilen = NW_WBXML_Parser_readMbUint32 (parser, &value);
hgs
parents:
diff changeset
  1259
hgs
parents:
diff changeset
  1260
    if(ilen < 0){
hgs
parents:
diff changeset
  1261
      return NW_STAT_WBXML_ERROR_BYTECODE;
hgs
parents:
diff changeset
  1262
    }
hgs
parents:
diff changeset
  1263
hgs
parents:
diff changeset
  1264
    if (parser->ext_t_not_table_index == 0) {
hgs
parents:
diff changeset
  1265
      Handle_Table_String(parser, value);
hgs
parents:
diff changeset
  1266
    } else {
hgs
parents:
diff changeset
  1267
      Handle_Binary(parser, value); /* handle ext_t anonymous int */
hgs
parents:
diff changeset
  1268
    }
hgs
parents:
diff changeset
  1269
    if(NW_WBXML_Parser_advance (parser, ilen) < 0){
hgs
parents:
diff changeset
  1270
      return NW_STAT_WBXML_ERROR_BYTECODE;
hgs
parents:
diff changeset
  1271
    }
hgs
parents:
diff changeset
  1272
    break;
hgs
parents:
diff changeset
  1273
  case NW_WBXML_EXT_0:
hgs
parents:
diff changeset
  1274
  case NW_WBXML_EXT_1:
hgs
parents:
diff changeset
  1275
  case NW_WBXML_EXT_2:
hgs
parents:
diff changeset
  1276
    if(NW_WBXML_Parser_advance (parser, 1) < 0){
hgs
parents:
diff changeset
  1277
      return NW_STAT_WBXML_ERROR_BYTECODE;
hgs
parents:
diff changeset
  1278
    }
hgs
parents:
diff changeset
  1279
    /* Note - For an extension token without other parameters the
hgs
parents:
diff changeset
  1280
     second parameter to Handle_Binary is bogus.  The callback is here
hgs
parents:
diff changeset
  1281
     so that the parser client can manage its internal state. */
hgs
parents:
diff changeset
  1282
    Handle_Binary(parser, 0);
hgs
parents:
diff changeset
  1283
    break;
hgs
parents:
diff changeset
  1284
  default:
hgs
parents:
diff changeset
  1285
    NW_ASSERT(NW_FALSE);
hgs
parents:
diff changeset
  1286
    return NW_STAT_WBXML_ERROR_BYTECODE;
hgs
parents:
diff changeset
  1287
  }
hgs
parents:
diff changeset
  1288
  return NW_STAT_SUCCESS;
hgs
parents:
diff changeset
  1289
}
hgs
parents:
diff changeset
  1290
hgs
parents:
diff changeset
  1291
hgs
parents:
diff changeset
  1292
/*
hgs
parents:
diff changeset
  1293
* Parse an attribute
hgs
parents:
diff changeset
  1294
*/
hgs
parents:
diff changeset
  1295
hgs
parents:
diff changeset
  1296
hgs
parents:
diff changeset
  1297
hgs
parents:
diff changeset
  1298
NW_Status_t
hgs
parents:
diff changeset
  1299
NW_WBXML_Parser_attributeNameParse (NW_WBXML_Parser_t * parser){
hgs
parents:
diff changeset
  1300
hgs
parents:
diff changeset
  1301
  NW_Uint8 token;
hgs
parents:
diff changeset
  1302
  NW_Uint32 fq_token;
hgs
parents:
diff changeset
  1303
  NW_Uint32 index;
hgs
parents:
diff changeset
  1304
  NW_Int32 ilen;
hgs
parents:
diff changeset
  1305
  NW_Status_t status;
hgs
parents:
diff changeset
  1306
hgs
parents:
diff changeset
  1307
  if (!NW_WBXML_Parser_hasMoreBytecode(parser)) {
hgs
parents:
diff changeset
  1308
    return NW_STAT_WBXML_ERROR_BYTECODE;
hgs
parents:
diff changeset
  1309
  }
hgs
parents:
diff changeset
  1310
hgs
parents:
diff changeset
  1311
  status = NW_WBXML_Parser_getNextToken (parser, &token, TOKEN_STATE_ATTR);
hgs
parents:
diff changeset
  1312
  if(status != NW_STAT_SUCCESS){
hgs
parents:
diff changeset
  1313
    return status;
hgs
parents:
diff changeset
  1314
  }
hgs
parents:
diff changeset
  1315
hgs
parents:
diff changeset
  1316
  if (token < 128){
hgs
parents:
diff changeset
  1317
    Handle_Attr_Start(parser);
hgs
parents:
diff changeset
  1318
    if (parser->status == NW_STAT_OUT_OF_MEMORY) {
hgs
parents:
diff changeset
  1319
      return parser->status;
hgs
parents:
diff changeset
  1320
    }
hgs
parents:
diff changeset
  1321
    if(NW_WBXML_Parser_advance (parser, 1)<0){
hgs
parents:
diff changeset
  1322
      return NW_STAT_WBXML_ERROR_BYTECODE;
hgs
parents:
diff changeset
  1323
    }
hgs
parents:
diff changeset
  1324
hgs
parents:
diff changeset
  1325
    fq_token = FqToken (parser, token, TOKEN_STATE_ATTR);
hgs
parents:
diff changeset
  1326
hgs
parents:
diff changeset
  1327
    Handle_Fq_Token(parser, fq_token);
hgs
parents:
diff changeset
  1328
  }
hgs
parents:
diff changeset
  1329
hgs
parents:
diff changeset
  1330
  else{
hgs
parents:
diff changeset
  1331
    return NW_STAT_WBXML_ERROR_BYTECODE;
hgs
parents:
diff changeset
  1332
  }
hgs
parents:
diff changeset
  1333
hgs
parents:
diff changeset
  1334
  if (token == NW_WBXML_LITERAL){
hgs
parents:
diff changeset
  1335
    /*  TODO:  Should check for another global token and return an error? */
hgs
parents:
diff changeset
  1336
    ilen = NW_WBXML_Parser_readMbUint32 (parser, &index);
hgs
parents:
diff changeset
  1337
    if(ilen < 0){
hgs
parents:
diff changeset
  1338
      return NW_STAT_WBXML_ERROR_BYTECODE;
hgs
parents:
diff changeset
  1339
    }
hgs
parents:
diff changeset
  1340
    Handle_Table_String(parser, index);
hgs
parents:
diff changeset
  1341
    if(NW_WBXML_Parser_advance(parser, ilen) < 0){
hgs
parents:
diff changeset
  1342
      return NW_STAT_WBXML_ERROR_BYTECODE;
hgs
parents:
diff changeset
  1343
    }
hgs
parents:
diff changeset
  1344
  }
hgs
parents:
diff changeset
  1345
  return NW_STAT_SUCCESS;
hgs
parents:
diff changeset
  1346
}
hgs
parents:
diff changeset
  1347
hgs
parents:
diff changeset
  1348
hgs
parents:
diff changeset
  1349
NW_Status_t
hgs
parents:
diff changeset
  1350
NW_WBXML_Parser_attributeValsIterate (NW_WBXML_Parser_t * parser)
hgs
parents:
diff changeset
  1351
{
hgs
parents:
diff changeset
  1352
  NW_Uint8 token;
hgs
parents:
diff changeset
  1353
  NW_Uint32 fq_token;
hgs
parents:
diff changeset
  1354
  NW_Uint32 index;
hgs
parents:
diff changeset
  1355
  NW_Uint32 e;
hgs
parents:
diff changeset
  1356
  NW_Int32 ilen;
hgs
parents:
diff changeset
  1357
  NW_Status_t status;
hgs
parents:
diff changeset
  1358
hgs
parents:
diff changeset
  1359
  status = NW_WBXML_Parser_getNextToken (parser, &token, TOKEN_STATE_ATTR);
hgs
parents:
diff changeset
  1360
  if(status != NW_STAT_SUCCESS){
hgs
parents:
diff changeset
  1361
    return status;
hgs
parents:
diff changeset
  1362
  }
hgs
parents:
diff changeset
  1363
hgs
parents:
diff changeset
  1364
  if (token == NW_WBXML_STR_I){
hgs
parents:
diff changeset
  1365
    /* NW_WBXML_ATTR_COMPONENT_STRING; */
hgs
parents:
diff changeset
  1366
    if(NW_WBXML_Parser_advance (parser, 1) < 0){
hgs
parents:
diff changeset
  1367
      return NW_STAT_WBXML_ERROR_BYTECODE;
hgs
parents:
diff changeset
  1368
    }
hgs
parents:
diff changeset
  1369
    ilen = NW_WBXML_Parser_getInlineStrLen(parser, parser->doc);
hgs
parents:
diff changeset
  1370
    if(ilen < 0){
hgs
parents:
diff changeset
  1371
      return NW_STAT_WBXML_ERROR_BYTECODE;
hgs
parents:
diff changeset
  1372
    }
hgs
parents:
diff changeset
  1373
    Handle_Attr_Val(parser);
hgs
parents:
diff changeset
  1374
    Handle_Inline_String(parser, (NW_Uint32) ilen);
hgs
parents:
diff changeset
  1375
    if(NW_WBXML_Parser_advance(parser, ilen) < 0){
hgs
parents:
diff changeset
  1376
      return NW_STAT_WBXML_ERROR_BYTECODE;
hgs
parents:
diff changeset
  1377
    }
hgs
parents:
diff changeset
  1378
  }
hgs
parents:
diff changeset
  1379
  else if (token == NW_WBXML_STR_T){
hgs
parents:
diff changeset
  1380
    /* NW_WBXML_ATTR_COMPONENT_STRING; */
hgs
parents:
diff changeset
  1381
    if(NW_WBXML_Parser_advance (parser, 1) < 0){
hgs
parents:
diff changeset
  1382
      return NW_STAT_WBXML_ERROR_BYTECODE;
hgs
parents:
diff changeset
  1383
    }
hgs
parents:
diff changeset
  1384
    ilen = NW_WBXML_Parser_readMbUint32 (parser, &index);
hgs
parents:
diff changeset
  1385
    if(ilen < 0){
hgs
parents:
diff changeset
  1386
      return NW_STAT_WBXML_ERROR_BYTECODE;
hgs
parents:
diff changeset
  1387
    }
hgs
parents:
diff changeset
  1388
    Handle_Attr_Val(parser);
hgs
parents:
diff changeset
  1389
    Handle_Table_String(parser, index);
hgs
parents:
diff changeset
  1390
    if(NW_WBXML_Parser_advance(parser, ilen)<0){
hgs
parents:
diff changeset
  1391
      return NW_STAT_WBXML_ERROR_BYTECODE;
hgs
parents:
diff changeset
  1392
    }
hgs
parents:
diff changeset
  1393
  }
hgs
parents:
diff changeset
  1394
  else if (token == NW_WBXML_OPAQUE){
hgs
parents:
diff changeset
  1395
    /* NW_WBXML_ATTR_COMPONENT_OPAQUE; */
hgs
parents:
diff changeset
  1396
    if(NW_WBXML_Parser_advance (parser, 1) < 0){
hgs
parents:
diff changeset
  1397
      return NW_STAT_WBXML_ERROR_BYTECODE;
hgs
parents:
diff changeset
  1398
    }
hgs
parents:
diff changeset
  1399
    ilen = NW_WBXML_Parser_readMbUint32 (parser, &index);
hgs
parents:
diff changeset
  1400
    if(ilen < 0){
hgs
parents:
diff changeset
  1401
      return NW_STAT_WBXML_ERROR_BYTECODE;
hgs
parents:
diff changeset
  1402
    }
hgs
parents:
diff changeset
  1403
    /* Move past the length NW_Byte(s) */
hgs
parents:
diff changeset
  1404
    if(NW_WBXML_Parser_advance (parser, ilen) < 0){
hgs
parents:
diff changeset
  1405
      return NW_STAT_WBXML_ERROR_BYTECODE;
hgs
parents:
diff changeset
  1406
    }
hgs
parents:
diff changeset
  1407
    Handle_Attr_Val(parser);
hgs
parents:
diff changeset
  1408
    Handle_Opaque(parser, index);
hgs
parents:
diff changeset
  1409
    if(NW_WBXML_Parser_advance (parser, (NW_Int32)index) < 0){
hgs
parents:
diff changeset
  1410
      return NW_STAT_WBXML_ERROR_BYTECODE;
hgs
parents:
diff changeset
  1411
    }
hgs
parents:
diff changeset
  1412
  }
hgs
parents:
diff changeset
  1413
  else if (token == NW_WBXML_ENTITY){
hgs
parents:
diff changeset
  1414
    /*NW_WBXML_ATTR_COMPONENT_ENTITY; */
hgs
parents:
diff changeset
  1415
    if(NW_WBXML_Parser_advance (parser, 1) < 0){
hgs
parents:
diff changeset
  1416
      return NW_STAT_WBXML_ERROR_BYTECODE;
hgs
parents:
diff changeset
  1417
    }
hgs
parents:
diff changeset
  1418
    ilen = NW_WBXML_Parser_readMbUint32 (parser,&e);
hgs
parents:
diff changeset
  1419
    if(ilen < 0){
hgs
parents:
diff changeset
  1420
      return NW_STAT_WBXML_ERROR_BYTECODE;
hgs
parents:
diff changeset
  1421
    }
hgs
parents:
diff changeset
  1422
    Handle_Entity(parser, e);
hgs
parents:
diff changeset
  1423
    if(NW_WBXML_Parser_advance (parser, ilen) < 0){
hgs
parents:
diff changeset
  1424
      return NW_STAT_WBXML_ERROR_BYTECODE;
hgs
parents:
diff changeset
  1425
    }
hgs
parents:
diff changeset
  1426
  }
hgs
parents:
diff changeset
  1427
  else if ((token == NW_WBXML_EXT_I_0)
hgs
parents:
diff changeset
  1428
           || (token == NW_WBXML_EXT_I_1)
hgs
parents:
diff changeset
  1429
           || (token == NW_WBXML_EXT_I_2)
hgs
parents:
diff changeset
  1430
           || (token == NW_WBXML_EXT_T_0)
hgs
parents:
diff changeset
  1431
           || (token == NW_WBXML_EXT_T_1)
hgs
parents:
diff changeset
  1432
           || (token == NW_WBXML_EXT_T_2)
hgs
parents:
diff changeset
  1433
           || (token == NW_WBXML_EXT_0)
hgs
parents:
diff changeset
  1434
           || (token == NW_WBXML_EXT_1)
hgs
parents:
diff changeset
  1435
           || (token == NW_WBXML_EXT_2)){
hgs
parents:
diff changeset
  1436
hgs
parents:
diff changeset
  1437
    /* NW_WBXML_ATTR_COMPONENT_EXT; */
hgs
parents:
diff changeset
  1438
    Handle_Attr_Val(parser);
hgs
parents:
diff changeset
  1439
    status = NW_WBXML_Parser_extensionParse (parser, TOKEN_STATE_ATTR);
hgs
parents:
diff changeset
  1440
    if(status != NW_STAT_SUCCESS){
hgs
parents:
diff changeset
  1441
      return NW_STAT_WBXML_ERROR_BYTECODE;
hgs
parents:
diff changeset
  1442
    }
hgs
parents:
diff changeset
  1443
  }
hgs
parents:
diff changeset
  1444
  else if (token >= 128){
hgs
parents:
diff changeset
  1445
    /*NW_WBXML_ATTR_COMPONENT_TOKEN; */
hgs
parents:
diff changeset
  1446
    fq_token = FqToken(parser, token, TOKEN_STATE_ATTR);
hgs
parents:
diff changeset
  1447
    Handle_Attr_Val(parser);
hgs
parents:
diff changeset
  1448
    Handle_Fq_Token(parser, fq_token);
hgs
parents:
diff changeset
  1449
    if(NW_WBXML_Parser_advance (parser, 1) < 0){
hgs
parents:
diff changeset
  1450
      return NW_STAT_WBXML_ERROR_BYTECODE;
hgs
parents:
diff changeset
  1451
    }
hgs
parents:
diff changeset
  1452
  }
hgs
parents:
diff changeset
  1453
hgs
parents:
diff changeset
  1454
  status = NW_WBXML_Parser_getNextToken (parser, &token, TOKEN_STATE_ATTR);
hgs
parents:
diff changeset
  1455
  if(status != NW_STAT_SUCCESS){
hgs
parents:
diff changeset
  1456
    return status;
hgs
parents:
diff changeset
  1457
  }
hgs
parents:
diff changeset
  1458
hgs
parents:
diff changeset
  1459
  /*
hgs
parents:
diff changeset
  1460
  * Attribute tokens are either text tokens or
hgs
parents:
diff changeset
  1461
  * dictionary-defined tokens > 128
hgs
parents:
diff changeset
  1462
  */
hgs
parents:
diff changeset
  1463
  if(isTextToken(token) || (token >=128)){
hgs
parents:
diff changeset
  1464
hgs
parents:
diff changeset
  1465
    return NW_STAT_WBXML_ITERATE_MORE;          /* Normal exit */
hgs
parents:
diff changeset
  1466
  }
hgs
parents:
diff changeset
  1467
  else /*if ((token < 128) || (token == NW_WBXML_END)
hgs
parents:
diff changeset
  1468
    || (token == NW_WBXML_LITERAL))*/{
hgs
parents:
diff changeset
  1469
    /*parser->state &= ~NW_WBXML_PARSER_S_ATTR_VAL; */
hgs
parents:
diff changeset
  1470
    /* Don't advance parser */
hgs
parents:
diff changeset
  1471
    return NW_STAT_WBXML_ITERATE_DONE;      /* Normal exit */
hgs
parents:
diff changeset
  1472
  }
hgs
parents:
diff changeset
  1473
}
hgs
parents:
diff changeset
  1474
hgs
parents:
diff changeset
  1475
NW_Status_t
hgs
parents:
diff changeset
  1476
NW_WBXML_Parser_attributeParse(NW_WBXML_Parser_t *parser)
hgs
parents:
diff changeset
  1477
{
hgs
parents:
diff changeset
  1478
  NW_Status_t status;
hgs
parents:
diff changeset
  1479
hgs
parents:
diff changeset
  1480
  status = NW_WBXML_Parser_attributeNameParse(parser);
hgs
parents:
diff changeset
  1481
  if(status != NW_STAT_SUCCESS){
hgs
parents:
diff changeset
  1482
    return status;
hgs
parents:
diff changeset
  1483
  }
hgs
parents:
diff changeset
  1484
  while ((parser->flags & NW_WBXML_PARSER_S_MASK) == NW_WBXML_PARSER_OK){
hgs
parents:
diff changeset
  1485
    status = NW_WBXML_Parser_attributeValsIterate(parser);
hgs
parents:
diff changeset
  1486
    if(status == NW_STAT_WBXML_ITERATE_DONE){
hgs
parents:
diff changeset
  1487
      return NW_STAT_SUCCESS;
hgs
parents:
diff changeset
  1488
    }
hgs
parents:
diff changeset
  1489
    if(status != NW_STAT_WBXML_ITERATE_MORE){
hgs
parents:
diff changeset
  1490
      return status;
hgs
parents:
diff changeset
  1491
    }
hgs
parents:
diff changeset
  1492
  }
hgs
parents:
diff changeset
  1493
  return NW_WBXML_Parser_flagToStatus(parser);
hgs
parents:
diff changeset
  1494
}
hgs
parents:
diff changeset
  1495
hgs
parents:
diff changeset
  1496
hgs
parents:
diff changeset
  1497
/*
hgs
parents:
diff changeset
  1498
* Parse opaque data
hgs
parents:
diff changeset
  1499
*/
hgs
parents:
diff changeset
  1500
hgs
parents:
diff changeset
  1501
NW_Status_t
hgs
parents:
diff changeset
  1502
NW_WBXML_Parser_opaqueParse (NW_WBXML_Parser_t * parser,
hgs
parents:
diff changeset
  1503
                             NW_Int32 token_state)
hgs
parents:
diff changeset
  1504
{
hgs
parents:
diff changeset
  1505
hgs
parents:
diff changeset
  1506
  NW_Uint32 index;
hgs
parents:
diff changeset
  1507
  NW_Int32 ilen = 0;
hgs
parents:
diff changeset
  1508
  NW_Uint8 token;
hgs
parents:
diff changeset
  1509
  NW_Status_t status;
hgs
parents:
diff changeset
  1510
hgs
parents:
diff changeset
  1511
  status = NW_WBXML_Parser_getNextToken (parser, &token, token_state);
hgs
parents:
diff changeset
  1512
  if(status != NW_STAT_SUCCESS){
hgs
parents:
diff changeset
  1513
    return status;
hgs
parents:
diff changeset
  1514
  }
hgs
parents:
diff changeset
  1515
hgs
parents:
diff changeset
  1516
  switch (token){
hgs
parents:
diff changeset
  1517
  case NW_WBXML_OPAQUE:
hgs
parents:
diff changeset
  1518
    if(NW_WBXML_Parser_advance (parser, 1) < 0){
hgs
parents:
diff changeset
  1519
      return NW_STAT_WBXML_ERROR_BYTECODE;
hgs
parents:
diff changeset
  1520
    }
hgs
parents:
diff changeset
  1521
    ilen = NW_WBXML_Parser_readMbUint32 (parser, &index);
hgs
parents:
diff changeset
  1522
    if(ilen < 0){
hgs
parents:
diff changeset
  1523
      return NW_STAT_WBXML_ERROR_BYTECODE;
hgs
parents:
diff changeset
  1524
    }
hgs
parents:
diff changeset
  1525
    if(NW_WBXML_Parser_advance (parser, ilen) < 0){
hgs
parents:
diff changeset
  1526
      return NW_STAT_WBXML_ERROR_BYTECODE;
hgs
parents:
diff changeset
  1527
    }
hgs
parents:
diff changeset
  1528
    Handle_Opaque(parser,index);
hgs
parents:
diff changeset
  1529
    if(NW_WBXML_Parser_advance (parser, (NW_Int32)index) < 0){
hgs
parents:
diff changeset
  1530
      return NW_STAT_WBXML_ERROR_BYTECODE;
hgs
parents:
diff changeset
  1531
    }
hgs
parents:
diff changeset
  1532
    break;
hgs
parents:
diff changeset
  1533
  default:
hgs
parents:
diff changeset
  1534
    /* return NW_STAT_WBXML_ERROR_BYTECODE;*/
hgs
parents:
diff changeset
  1535
    NW_ASSERT(NW_FALSE); /* Never reached */
hgs
parents:
diff changeset
  1536
  }
hgs
parents:
diff changeset
  1537
  return NW_STAT_SUCCESS;
hgs
parents:
diff changeset
  1538
}
hgs
parents:
diff changeset
  1539
hgs
parents:
diff changeset
  1540
hgs
parents:
diff changeset
  1541
/*
hgs
parents:
diff changeset
  1542
* Parse the body of a document
hgs
parents:
diff changeset
  1543
*
hgs
parents:
diff changeset
  1544
* RETURN NW_STAT_SUCCESS
hgs
parents:
diff changeset
  1545
*        NW_STAT_OUT_OF_MEMORY
hgs
parents:
diff changeset
  1546
*        NW_STAT_BAD_INPUT_PARAM
hgs
parents:
diff changeset
  1547
*        NW_STAT_WBXML_ERROR_BYTECODE
hgs
parents:
diff changeset
  1548
*        NW_STAT_WBXML_ERROR_CHARSET_UNSUPPORTED
hgs
parents:
diff changeset
  1549
*/
hgs
parents:
diff changeset
  1550
hgs
parents:
diff changeset
  1551
NW_Status_t
hgs
parents:
diff changeset
  1552
NW_WBXML_Parser_bodyParse (NW_WBXML_Parser_t * parser)
hgs
parents:
diff changeset
  1553
{
hgs
parents:
diff changeset
  1554
  NW_Status_t status;
hgs
parents:
diff changeset
  1555
  NW_Uint8 token;
hgs
parents:
diff changeset
  1556
hgs
parents:
diff changeset
  1557
  NW_ASSERT(parser != NULL);
hgs
parents:
diff changeset
  1558
  // WLIU_DEBUG: RFileLogger::WriteFormat(_L("Browser"), _L("cp_count.txt"), EFileLoggingModeAppend, _L("====== body parse starts =====\n"));
hgs
parents:
diff changeset
  1559
hgs
parents:
diff changeset
  1560
  /* This is not quite the WBXML grammar because we want to permit
hgs
parents:
diff changeset
  1561
     loose HTML docs where there is no one document node. */
hgs
parents:
diff changeset
  1562
  while (((parser->flags & NW_WBXML_PARSER_S_MASK) == NW_WBXML_PARSER_OK)
hgs
parents:
diff changeset
  1563
         && NW_WBXML_Parser_hasMoreBytecode (parser)) {
hgs
parents:
diff changeset
  1564
hgs
parents:
diff changeset
  1565
    status = NW_WBXML_Parser_getNextToken (parser, &token, TOKEN_STATE_TAG);
hgs
parents:
diff changeset
  1566
    if(status != NW_STAT_SUCCESS){
hgs
parents:
diff changeset
  1567
      return status;
hgs
parents:
diff changeset
  1568
    }
hgs
parents:
diff changeset
  1569
hgs
parents:
diff changeset
  1570
    switch (token){
hgs
parents:
diff changeset
  1571
    case NW_WBXML_END:
hgs
parents:
diff changeset
  1572
      if (NW_WBXML_Parser_hasMoreBytecode (parser)) {
hgs
parents:
diff changeset
  1573
        if(NW_WBXML_Parser_advance (parser, 1) < 0){
hgs
parents:
diff changeset
  1574
          return NW_STAT_WBXML_ERROR_BYTECODE;
hgs
parents:
diff changeset
  1575
        }
hgs
parents:
diff changeset
  1576
        Handle_Tag_End(parser);
hgs
parents:
diff changeset
  1577
      }
hgs
parents:
diff changeset
  1578
      break;
hgs
parents:
diff changeset
  1579
hgs
parents:
diff changeset
  1580
    case NW_WBXML_STR_I:
hgs
parents:
diff changeset
  1581
    case NW_WBXML_STR_T:
hgs
parents:
diff changeset
  1582
    case NW_WBXML_ENTITY:
hgs
parents:
diff changeset
  1583
    case NW_WBXML_PI:
hgs
parents:
diff changeset
  1584
    case NW_WBXML_EXT_I_0:
hgs
parents:
diff changeset
  1585
    case NW_WBXML_EXT_I_1:
hgs
parents:
diff changeset
  1586
    case NW_WBXML_EXT_I_2:
hgs
parents:
diff changeset
  1587
    case NW_WBXML_EXT_T_0:
hgs
parents:
diff changeset
  1588
    case NW_WBXML_EXT_T_1:
hgs
parents:
diff changeset
  1589
    case NW_WBXML_EXT_T_2:
hgs
parents:
diff changeset
  1590
    case NW_WBXML_EXT_0:
hgs
parents:
diff changeset
  1591
    case NW_WBXML_EXT_1:
hgs
parents:
diff changeset
  1592
    case NW_WBXML_EXT_2:
hgs
parents:
diff changeset
  1593
    case NW_WBXML_OPAQUE:
hgs
parents:
diff changeset
  1594
      status = NW_WBXML_Parser_textParse(parser);
hgs
parents:
diff changeset
  1595
      if(status != NW_STAT_SUCCESS){
hgs
parents:
diff changeset
  1596
        return status;
hgs
parents:
diff changeset
  1597
      }
hgs
parents:
diff changeset
  1598
      break;
hgs
parents:
diff changeset
  1599
hgs
parents:
diff changeset
  1600
    case NW_WBXML_LITERAL:
hgs
parents:
diff changeset
  1601
    case NW_WBXML_LITERAL_A:
hgs
parents:
diff changeset
  1602
    case NW_WBXML_LITERAL_C:
hgs
parents:
diff changeset
  1603
    case NW_WBXML_LITERAL_AC:
hgs
parents:
diff changeset
  1604
    default:
hgs
parents:
diff changeset
  1605
      status = NW_WBXML_Parser_elementParse (parser);
hgs
parents:
diff changeset
  1606
      if(status != NW_STAT_SUCCESS){
hgs
parents:
diff changeset
  1607
        return status;
hgs
parents:
diff changeset
  1608
      }
hgs
parents:
diff changeset
  1609
      break;
hgs
parents:
diff changeset
  1610
    }
hgs
parents:
diff changeset
  1611
  }
hgs
parents:
diff changeset
  1612
  CHECK_PARSER_STATUS;
hgs
parents:
diff changeset
  1613
hgs
parents:
diff changeset
  1614
  /*
hgs
parents:
diff changeset
  1615
  * If we have a registry then it must be inited at this point, so
hgs
parents:
diff changeset
  1616
  * set the init flag.
hgs
parents:
diff changeset
  1617
  */
hgs
parents:
diff changeset
  1618
hgs
parents:
diff changeset
  1619
  if((parser->cp_registry.count > 0)
hgs
parents:
diff changeset
  1620
    && ((parser->flags & NW_WBXML_REGISTRY_INIT) != NW_WBXML_REGISTRY_INIT)){
hgs
parents:
diff changeset
  1621
    parser->flags |= NW_WBXML_REGISTRY_INIT;
hgs
parents:
diff changeset
  1622
  }
hgs
parents:
diff changeset
  1623
hgs
parents:
diff changeset
  1624
  // WLIU_DEBUG: RFileLogger::WriteFormat(_L("Browser"), _L("cp_count.txt"), EFileLoggingModeAppend, _L("====== body parse ends =====\n"));
hgs
parents:
diff changeset
  1625
hgs
parents:
diff changeset
  1626
  if (parser->handler && parser->handler->EndDocument_CB){
hgs
parents:
diff changeset
  1627
    return (*(parser->handler->EndDocument_CB)) (parser, parser->context);
hgs
parents:
diff changeset
  1628
  }
hgs
parents:
diff changeset
  1629
  return NW_STAT_SUCCESS;
hgs
parents:
diff changeset
  1630
}
hgs
parents:
diff changeset
  1631
hgs
parents:
diff changeset
  1632
hgs
parents:
diff changeset
  1633
/*
hgs
parents:
diff changeset
  1634
* Cache the parser's event handler and context
hgs
parents:
diff changeset
  1635
*
hgs
parents:
diff changeset
  1636
* RETURN: NW_STAT_SUCCESS
hgs
parents:
diff changeset
  1637
*/
hgs
parents:
diff changeset
  1638
hgs
parents:
diff changeset
  1639
EXPORT_C NW_Status_t
hgs
parents:
diff changeset
  1640
NW_WBXML_Parser_registerHandler (NW_WBXML_Parser_t * parser,
hgs
parents:
diff changeset
  1641
                                 const struct NW_WBXML_EventHandler_s * handler,
hgs
parents:
diff changeset
  1642
                                 void *context)
hgs
parents:
diff changeset
  1643
{
hgs
parents:
diff changeset
  1644
hgs
parents:
diff changeset
  1645
  NW_ASSERT(parser != NULL);
hgs
parents:
diff changeset
  1646
hgs
parents:
diff changeset
  1647
  parser->handler = handler;
hgs
parents:
diff changeset
  1648
  parser->context = context;
hgs
parents:
diff changeset
  1649
hgs
parents:
diff changeset
  1650
  return NW_STAT_SUCCESS;
hgs
parents:
diff changeset
  1651
}