xml/cxmllibrary/src/dom/src/document.c
author hgs
Wed, 23 Jun 2010 20:27:15 +0530
changeset 24 74f0b3eb154c
permissions -rw-r--r--
201024
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
24
hgs
parents:
diff changeset
     1
/*
hgs
parents:
diff changeset
     2
* Copyright (c) 2000 - 2001 Nokia Corporation and/or its subsidiary(-ies).
hgs
parents:
diff changeset
     3
* All rights reserved.
hgs
parents:
diff changeset
     4
* This component and the accompanying materials are made available
hgs
parents:
diff changeset
     5
* under the terms of the License "Eclipse Public License v1.0"
hgs
parents:
diff changeset
     6
* which accompanies this distribution, and is available
hgs
parents:
diff changeset
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
hgs
parents:
diff changeset
     8
*
hgs
parents:
diff changeset
     9
* Initial Contributors:
hgs
parents:
diff changeset
    10
* Nokia Corporation - initial contribution.
hgs
parents:
diff changeset
    11
*
hgs
parents:
diff changeset
    12
* Contributors:
hgs
parents:
diff changeset
    13
*
hgs
parents:
diff changeset
    14
* Description: 
hgs
parents:
diff changeset
    15
*
hgs
parents:
diff changeset
    16
*/
hgs
parents:
diff changeset
    17
hgs
parents:
diff changeset
    18
hgs
parents:
diff changeset
    19
#include "cxml_internal.h"
hgs
parents:
diff changeset
    20
#include <xml/cxml/nw_dom_node.h>
hgs
parents:
diff changeset
    21
#include <xml/cxml/nw_dom_document.h>
hgs
parents:
diff changeset
    22
#include <xml/cxml/nw_dom_element.h>
hgs
parents:
diff changeset
    23
#include <xml/cxml/nw_tinytree.h>
hgs
parents:
diff changeset
    24
#include <xml/cxml/nw_encoder_wbxmlwriter.h>
hgs
parents:
diff changeset
    25
#include <xml/cxml/nw_xmlp_xmlp2wbxml.h>
hgs
parents:
diff changeset
    26
#include <xml/cxml/nw_tinydom_utils.h>
hgs
parents:
diff changeset
    27
hgs
parents:
diff changeset
    28
/*#include "nw_parser.h"*/
hgs
parents:
diff changeset
    29
hgs
parents:
diff changeset
    30
/************************
hgs
parents:
diff changeset
    31
* DOCUMENT - NODE Methods
hgs
parents:
diff changeset
    32
*************************/
hgs
parents:
diff changeset
    33
hgs
parents:
diff changeset
    34
EXPORT_C void
hgs
parents:
diff changeset
    35
NW_DOM_DocumentNode_Delete(NW_DOM_DocumentNode_t* docNode){
hgs
parents:
diff changeset
    36
  NW_WBXML_Parser_t *wbxmlParser;
hgs
parents:
diff changeset
    37
  NW_TinyDom_Tree_t *tinyDomTree;
hgs
parents:
diff changeset
    38
  NW_WBXML_Document_t *document;
hgs
parents:
diff changeset
    39
  NW_TinyTree_t *tinyTree;
hgs
parents:
diff changeset
    40
hgs
parents:
diff changeset
    41
if (docNode == NULL) {
hgs
parents:
diff changeset
    42
    return;
hgs
parents:
diff changeset
    43
  }
hgs
parents:
diff changeset
    44
hgs
parents:
diff changeset
    45
  tinyTree = NW_TinyTree_Node_findTree(docNode);
hgs
parents:
diff changeset
    46
  
hgs
parents:
diff changeset
    47
  if(tinyTree != NULL){
hgs
parents:
diff changeset
    48
    document = NW_TinyDom_getDocHeader(tinyTree);
hgs
parents:
diff changeset
    49
    tinyDomTree = NW_TinyDom_getTree(tinyTree);
hgs
parents:
diff changeset
    50
    wbxmlParser = tinyDomTree->parser;
hgs
parents:
diff changeset
    51
    if(wbxmlParser != NULL){
hgs
parents:
diff changeset
    52
      NW_WBXML_Parser_delete(wbxmlParser);
hgs
parents:
diff changeset
    53
    }
hgs
parents:
diff changeset
    54
    if(tinyDomTree != NULL){
hgs
parents:
diff changeset
    55
      NW_TinyDom_Tree_destruct(tinyDomTree);
hgs
parents:
diff changeset
    56
    }
hgs
parents:
diff changeset
    57
    if(document != NULL){
hgs
parents:
diff changeset
    58
      NW_WBXML_Document_destruct(document);
hgs
parents:
diff changeset
    59
    }
hgs
parents:
diff changeset
    60
  }
hgs
parents:
diff changeset
    61
}
hgs
parents:
diff changeset
    62
  /* ???? Does the writer need any cleanup ? */
hgs
parents:
diff changeset
    63
hgs
parents:
diff changeset
    64
hgs
parents:
diff changeset
    65
static void
hgs
parents:
diff changeset
    66
NW_TinyDom_Handle_Initialize(NW_TinyDom_Handle_t *h, 
hgs
parents:
diff changeset
    67
                             NW_Uint32 default_public_id,
hgs
parents:
diff changeset
    68
                             NW_Bool extTNotStringTable)
hgs
parents:
diff changeset
    69
{  
hgs
parents:
diff changeset
    70
  NW_ASSERT(h != NULL);
hgs
parents:
diff changeset
    71
hgs
parents:
diff changeset
    72
  (void) NW_Mem_memset(h, 0, sizeof(*h));
hgs
parents:
diff changeset
    73
hgs
parents:
diff changeset
    74
  NW_WBXML_Parser_newInPlace (&(h->wbxmlParser));
hgs
parents:
diff changeset
    75
  h->wbxmlParser.ext_t_not_table_index =(NW_Uint8)((extTNotStringTable == NW_FALSE)?
hgs
parents:
diff changeset
    76
                                          CXML_FALSE : CXML_TRUE);
hgs
parents:
diff changeset
    77
  NW_WBXML_Document_construct(&(h->document), default_public_id);
hgs
parents:
diff changeset
    78
  NW_TinyDom_Tree_construct (&(h->tinyDOMTree), 
hgs
parents:
diff changeset
    79
                             &(h->wbxmlParser), 
hgs
parents:
diff changeset
    80
                             &(h->document), 
hgs
parents:
diff changeset
    81
                             &(h->writer));
hgs
parents:
diff changeset
    82
  NW_TinyDom_Parser_construct (&(h->tinyParser), &(h->tinyDOMTree));
hgs
parents:
diff changeset
    83
}
hgs
parents:
diff changeset
    84
hgs
parents:
diff changeset
    85
hgs
parents:
diff changeset
    86
/* ************************************************************************/
hgs
parents:
diff changeset
    87
hgs
parents:
diff changeset
    88
/*
hgs
parents:
diff changeset
    89
 * Create and populate a dom tree by parsing a buffer, returning the
hgs
parents:
diff changeset
    90
 * document node.
hgs
parents:
diff changeset
    91
 */
hgs
parents:
diff changeset
    92
hgs
parents:
diff changeset
    93
EXPORT_C
hgs
parents:
diff changeset
    94
NW_DOM_DocumentNode_t * 
hgs
parents:
diff changeset
    95
NW_DOM_DocumentNode_BuildWBXMLTree(NW_TinyDom_Handle_t *h, 
hgs
parents:
diff changeset
    96
                                   NW_Byte *buffer,
hgs
parents:
diff changeset
    97
                                   NW_Int32 length,
hgs
parents:
diff changeset
    98
                                   NW_Bool freeBuff,
hgs
parents:
diff changeset
    99
                                   NW_Bool extTNotStringTable)
hgs
parents:
diff changeset
   100
{
hgs
parents:
diff changeset
   101
  NW_Status_t status;
hgs
parents:
diff changeset
   102
hgs
parents:
diff changeset
   103
  NW_ASSERT(h != NULL);
hgs
parents:
diff changeset
   104
hgs
parents:
diff changeset
   105
  NW_TinyDom_Handle_Initialize(h, 0, extTNotStringTable);
hgs
parents:
diff changeset
   106
hgs
parents:
diff changeset
   107
  status = NW_TinyDom_Parser_buildTree (&(h->tinyParser), 
hgs
parents:
diff changeset
   108
                                        (char *)buffer, 
hgs
parents:
diff changeset
   109
                                        (NW_Uint32)length,
hgs
parents:
diff changeset
   110
                                        freeBuff);
hgs
parents:
diff changeset
   111
  if (status == NW_STAT_SUCCESS) {
hgs
parents:
diff changeset
   112
    return  h->tinyDOMTree.root_node;
hgs
parents:
diff changeset
   113
  }
hgs
parents:
diff changeset
   114
  return NULL;
hgs
parents:
diff changeset
   115
}
hgs
parents:
diff changeset
   116
hgs
parents:
diff changeset
   117
/*
hgs
parents:
diff changeset
   118
 * This function is same at that of NW_DOM_DocumentNode_BuildWBXMLTree(..)
hgs
parents:
diff changeset
   119
 * but returns the error code.
hgs
parents:
diff changeset
   120
 */
hgs
parents:
diff changeset
   121
hgs
parents:
diff changeset
   122
static
hgs
parents:
diff changeset
   123
NW_DOM_DocumentNode_t * 
hgs
parents:
diff changeset
   124
CXML_DOM_DocumentNode_BuildWBXMLTree(NW_TinyDom_Handle_t *h, 
hgs
parents:
diff changeset
   125
                                   NW_Byte *buffer,
hgs
parents:
diff changeset
   126
                                   NW_Int32 length,
hgs
parents:
diff changeset
   127
                                   NW_Bool freeBuff,
hgs
parents:
diff changeset
   128
                                   NW_Bool extTNotStringTable,
hgs
parents:
diff changeset
   129
                                   NW_Status_t* errorStatus)
hgs
parents:
diff changeset
   130
{
hgs
parents:
diff changeset
   131
  NW_Status_t status;
hgs
parents:
diff changeset
   132
hgs
parents:
diff changeset
   133
  NW_ASSERT(h != NULL);
hgs
parents:
diff changeset
   134
hgs
parents:
diff changeset
   135
  NW_TinyDom_Handle_Initialize(h, 0, extTNotStringTable);
hgs
parents:
diff changeset
   136
hgs
parents:
diff changeset
   137
  status = NW_TinyDom_Parser_buildTree (&(h->tinyParser), 
hgs
parents:
diff changeset
   138
                                        (char *)buffer, 
hgs
parents:
diff changeset
   139
                                        (NW_Uint32)length,
hgs
parents:
diff changeset
   140
                                        freeBuff);
hgs
parents:
diff changeset
   141
  if (status == NW_STAT_SUCCESS) 
hgs
parents:
diff changeset
   142
  {
hgs
parents:
diff changeset
   143
    *errorStatus = status;
hgs
parents:
diff changeset
   144
    return  h->tinyDOMTree.root_node;
hgs
parents:
diff changeset
   145
  }
hgs
parents:
diff changeset
   146
  *errorStatus = status;
hgs
parents:
diff changeset
   147
  return NULL;
hgs
parents:
diff changeset
   148
}
hgs
parents:
diff changeset
   149
hgs
parents:
diff changeset
   150
hgs
parents:
diff changeset
   151
/* Function to copy the string table extension values from the 
hgs
parents:
diff changeset
   152
 * WBXML encoder to WBXML parser
hgs
parents:
diff changeset
   153
 */
hgs
parents:
diff changeset
   154
hgs
parents:
diff changeset
   155
static NW_Status_t
hgs
parents:
diff changeset
   156
NW_DOM_Write_WBXML_StrTbl(NW_TinyDom_Handle_t *p, void* WBXMLEncStrTbl)
hgs
parents:
diff changeset
   157
{
hgs
parents:
diff changeset
   158
     NW_Status_t status = NW_STAT_SUCCESS;
hgs
parents:
diff changeset
   159
     NW_Status_t s = NW_STAT_WBXML_ITERATE_DONE;
hgs
parents:
diff changeset
   160
     NW_Uint32 stringTableByteCount = 0;
hgs
parents:
diff changeset
   161
     NW_Encoder_StringTableIterator_t strTableIterator;
hgs
parents:
diff changeset
   162
     NW_Uint8* pLiteralBuf;
hgs
parents:
diff changeset
   163
     NW_String_t pLiteralStr;
hgs
parents:
diff changeset
   164
     NW_Uint32 docTableIndex;
hgs
parents:
diff changeset
   165
     NW_Encoder_StringTable_t* strTable = NULL;
hgs
parents:
diff changeset
   166
     NW_WBXML_Document_t* doc = &(p->document);
hgs
parents:
diff changeset
   167
         
hgs
parents:
diff changeset
   168
     strTable = (NW_Encoder_StringTable_t*) WBXMLEncStrTbl;
hgs
parents:
diff changeset
   169
hgs
parents:
diff changeset
   170
     stringTableByteCount = NW_Encoder_StringTable_getTotalBytes(strTable);
hgs
parents:
diff changeset
   171
     
hgs
parents:
diff changeset
   172
     
hgs
parents:
diff changeset
   173
     if(stringTableByteCount > 0)
hgs
parents:
diff changeset
   174
     {
hgs
parents:
diff changeset
   175
        /*The following function always return success so why bother to check? */
hgs
parents:
diff changeset
   176
hgs
parents:
diff changeset
   177
        NW_Encoder_StringTable_StringTableIterateInit(WBXMLEncStrTbl,&strTableIterator);
hgs
parents:
diff changeset
   178
hgs
parents:
diff changeset
   179
hgs
parents:
diff changeset
   180
        s =  NW_Encoder_StringTable_StringTableIterateNext
hgs
parents:
diff changeset
   181
                    (&strTableIterator,&stringTableByteCount,&pLiteralBuf);
hgs
parents:
diff changeset
   182
hgs
parents:
diff changeset
   183
        while(s == NW_STAT_WBXML_ITERATE_MORE)
hgs
parents:
diff changeset
   184
        {
hgs
parents:
diff changeset
   185
hgs
parents:
diff changeset
   186
         pLiteralStr.length = stringTableByteCount;
hgs
parents:
diff changeset
   187
         pLiteralStr.storage = pLiteralBuf;
hgs
parents:
diff changeset
   188
hgs
parents:
diff changeset
   189
         status =  NW_WBXML_Document_putTableString(doc,&pLiteralStr,&docTableIndex) ;
hgs
parents:
diff changeset
   190
hgs
parents:
diff changeset
   191
         if(status != NW_STAT_SUCCESS)
hgs
parents:
diff changeset
   192
         {
hgs
parents:
diff changeset
   193
          break;
hgs
parents:
diff changeset
   194
         }
hgs
parents:
diff changeset
   195
hgs
parents:
diff changeset
   196
           s =  NW_Encoder_StringTable_StringTableIterateNext
hgs
parents:
diff changeset
   197
                    (&strTableIterator,&stringTableByteCount,&pLiteralBuf) ;
hgs
parents:
diff changeset
   198
hgs
parents:
diff changeset
   199
        }/*end while */
hgs
parents:
diff changeset
   200
hgs
parents:
diff changeset
   201
     }/*end if(stringTableByteCount > 0)*/
hgs
parents:
diff changeset
   202
hgs
parents:
diff changeset
   203
     //Delete the tree
hgs
parents:
diff changeset
   204
hgs
parents:
diff changeset
   205
     NW_Encoder_StringTable_delete(WBXMLEncStrTbl);
hgs
parents:
diff changeset
   206
     WBXMLEncStrTbl = NULL;
hgs
parents:
diff changeset
   207
 return status;
hgs
parents:
diff changeset
   208
}/*end NW_DOM_Write_WBXML_StrTbl()*/
hgs
parents:
diff changeset
   209
hgs
parents:
diff changeset
   210
static
hgs
parents:
diff changeset
   211
NW_DOM_DocumentNode_t*
hgs
parents:
diff changeset
   212
NW_DOM_DocumentNode_BuildXMLTree(NW_TinyDom_Handle_t *h, 
hgs
parents:
diff changeset
   213
                                 NW_Byte *buffer,
hgs
parents:
diff changeset
   214
                                 NW_Int32 length,
hgs
parents:
diff changeset
   215
                                 NW_Uint32 publicID,
hgs
parents:
diff changeset
   216
                                 NW_Bool extTNotStringTable)
hgs
parents:
diff changeset
   217
{
hgs
parents:
diff changeset
   218
hgs
parents:
diff changeset
   219
  NW_Buffer_t inBuff;
hgs
parents:
diff changeset
   220
  NW_Buffer_t *outBuff = NULL;
hgs
parents:
diff changeset
   221
  NW_Uint32 encoding;
hgs
parents:
diff changeset
   222
  NW_Endianness_t endianness;
hgs
parents:
diff changeset
   223
  NW_DOM_DocumentNode_t* docNode;
hgs
parents:
diff changeset
   224
  NW_Status_t status;
hgs
parents:
diff changeset
   225
  NW_Uint32 line;
hgs
parents:
diff changeset
   226
  void* WBXMLEncStrTbl;
hgs
parents:
diff changeset
   227
hgs
parents:
diff changeset
   228
  inBuff.length = length;
hgs
parents:
diff changeset
   229
  inBuff.data = buffer;
hgs
parents:
diff changeset
   230
hgs
parents:
diff changeset
   231
  status = NW_XML_ComputeEncoding(length, 
hgs
parents:
diff changeset
   232
                                  buffer,
hgs
parents:
diff changeset
   233
                                  &encoding, 
hgs
parents:
diff changeset
   234
                                  &endianness);
hgs
parents:
diff changeset
   235
  if(status != NW_STAT_SUCCESS){
hgs
parents:
diff changeset
   236
    return NULL;
hgs
parents:
diff changeset
   237
  }
hgs
parents:
diff changeset
   238
hgs
parents:
diff changeset
   239
/*
hgs
parents:
diff changeset
   240
 * If applications want to use HTML Parser they can call the exported
hgs
parents:
diff changeset
   241
 * NW_HTMLP_HtmlToWbxml() and then call NW_DOM_DocumentNode_BuildWBXMLTree()
hgs
parents:
diff changeset
   242
 */
hgs
parents:
diff changeset
   243
  status = NW_XML_XmlToWbxml(&inBuff, encoding, &outBuff, &line, publicID,&WBXMLEncStrTbl); 
hgs
parents:
diff changeset
   244
hgs
parents:
diff changeset
   245
 
hgs
parents:
diff changeset
   246
hgs
parents:
diff changeset
   247
  if(status != NW_STAT_SUCCESS){
hgs
parents:
diff changeset
   248
    if(outBuff != NULL){
hgs
parents:
diff changeset
   249
      NW_Mem_Free(outBuff);
hgs
parents:
diff changeset
   250
    }
hgs
parents:
diff changeset
   251
hgs
parents:
diff changeset
   252
    return NULL;
hgs
parents:
diff changeset
   253
  }
hgs
parents:
diff changeset
   254
  docNode = NW_DOM_DocumentNode_BuildWBXMLTree(h, 
hgs
parents:
diff changeset
   255
                                              outBuff->data,
hgs
parents:
diff changeset
   256
                                              outBuff->length,
hgs
parents:
diff changeset
   257
                                              NW_TRUE,
hgs
parents:
diff changeset
   258
                                              extTNotStringTable);
hgs
parents:
diff changeset
   259
hgs
parents:
diff changeset
   260
  /* Write extension string table related information to the WBXML encoder. */
hgs
parents:
diff changeset
   261
  
hgs
parents:
diff changeset
   262
  if( docNode && WBXMLEncStrTbl)
hgs
parents:
diff changeset
   263
    {
hgs
parents:
diff changeset
   264
     status = NW_DOM_Write_WBXML_StrTbl(h,WBXMLEncStrTbl);
hgs
parents:
diff changeset
   265
     if(status != NW_STAT_SUCCESS)
hgs
parents:
diff changeset
   266
     {
hgs
parents:
diff changeset
   267
       if(outBuff != NULL)
hgs
parents:
diff changeset
   268
       {
hgs
parents:
diff changeset
   269
         NW_Mem_Free(outBuff);
hgs
parents:
diff changeset
   270
       }
hgs
parents:
diff changeset
   271
     }
hgs
parents:
diff changeset
   272
    }/* end if(WBXMLEncStrTbl)*/
hgs
parents:
diff changeset
   273
 
hgs
parents:
diff changeset
   274
  NW_Mem_Free(outBuff);
hgs
parents:
diff changeset
   275
  return docNode;
hgs
parents:
diff changeset
   276
}
hgs
parents:
diff changeset
   277
hgs
parents:
diff changeset
   278
static
hgs
parents:
diff changeset
   279
NW_DOM_DocumentNode_t*
hgs
parents:
diff changeset
   280
CXML_DOM_DocumentNode_BuildXMLTree(NW_TinyDom_Handle_t *h, 
hgs
parents:
diff changeset
   281
                                 NW_Byte *buffer,
hgs
parents:
diff changeset
   282
                                 NW_Int32 length,
hgs
parents:
diff changeset
   283
                                 NW_Uint32 publicID,
hgs
parents:
diff changeset
   284
                                 NW_Bool extTNotStringTable,
hgs
parents:
diff changeset
   285
                                 NW_Status_t* errorStatus)
hgs
parents:
diff changeset
   286
{
hgs
parents:
diff changeset
   287
hgs
parents:
diff changeset
   288
  NW_Buffer_t inBuff;
hgs
parents:
diff changeset
   289
  NW_Buffer_t *outBuff = NULL;
hgs
parents:
diff changeset
   290
  NW_Uint32 encoding;
hgs
parents:
diff changeset
   291
  NW_Endianness_t endianness;
hgs
parents:
diff changeset
   292
  NW_DOM_DocumentNode_t* docNode;
hgs
parents:
diff changeset
   293
  NW_Status_t status;
hgs
parents:
diff changeset
   294
  NW_Uint32 line;
hgs
parents:
diff changeset
   295
  void* WBXMLEncStrTbl;
hgs
parents:
diff changeset
   296
hgs
parents:
diff changeset
   297
  inBuff.length = length;
hgs
parents:
diff changeset
   298
  inBuff.data = buffer;
hgs
parents:
diff changeset
   299
hgs
parents:
diff changeset
   300
  status = NW_XML_ComputeEncoding(length, 
hgs
parents:
diff changeset
   301
                                  buffer,
hgs
parents:
diff changeset
   302
                                  &encoding, 
hgs
parents:
diff changeset
   303
                                  &endianness);
hgs
parents:
diff changeset
   304
  if(status != NW_STAT_SUCCESS)
hgs
parents:
diff changeset
   305
  {
hgs
parents:
diff changeset
   306
    *errorStatus = status;
hgs
parents:
diff changeset
   307
    return NULL;
hgs
parents:
diff changeset
   308
  }
hgs
parents:
diff changeset
   309
hgs
parents:
diff changeset
   310
/*
hgs
parents:
diff changeset
   311
 * If applications want to use HTML Parser they can call the exported
hgs
parents:
diff changeset
   312
 * NW_HTMLP_HtmlToWbxml() and then call NW_DOM_DocumentNode_BuildWBXMLTree()
hgs
parents:
diff changeset
   313
 */
hgs
parents:
diff changeset
   314
  status = NW_XML_XmlToWbxml(&inBuff, encoding, &outBuff, &line, publicID,&WBXMLEncStrTbl); 
hgs
parents:
diff changeset
   315
hgs
parents:
diff changeset
   316
 
hgs
parents:
diff changeset
   317
hgs
parents:
diff changeset
   318
  if(status != NW_STAT_SUCCESS){
hgs
parents:
diff changeset
   319
    if(outBuff != NULL){
hgs
parents:
diff changeset
   320
      NW_Mem_Free(outBuff);
hgs
parents:
diff changeset
   321
    }
hgs
parents:
diff changeset
   322
    *errorStatus = status;
hgs
parents:
diff changeset
   323
    return NULL;
hgs
parents:
diff changeset
   324
  }
hgs
parents:
diff changeset
   325
hgs
parents:
diff changeset
   326
  docNode = CXML_DOM_DocumentNode_BuildWBXMLTree(h, 
hgs
parents:
diff changeset
   327
                                              outBuff->data,
hgs
parents:
diff changeset
   328
                                              outBuff->length,
hgs
parents:
diff changeset
   329
                                              NW_TRUE,
hgs
parents:
diff changeset
   330
                                              extTNotStringTable,
hgs
parents:
diff changeset
   331
                                              errorStatus);
hgs
parents:
diff changeset
   332
hgs
parents:
diff changeset
   333
  /* Write extension string table related information to the WBXML encoder. */
hgs
parents:
diff changeset
   334
  
hgs
parents:
diff changeset
   335
  if( docNode && WBXMLEncStrTbl)
hgs
parents:
diff changeset
   336
    {
hgs
parents:
diff changeset
   337
     status = NW_DOM_Write_WBXML_StrTbl(h,WBXMLEncStrTbl);
hgs
parents:
diff changeset
   338
     if(status != NW_STAT_SUCCESS)
hgs
parents:
diff changeset
   339
     {
hgs
parents:
diff changeset
   340
       if(outBuff != NULL)
hgs
parents:
diff changeset
   341
       {
hgs
parents:
diff changeset
   342
         NW_Mem_Free(outBuff);
hgs
parents:
diff changeset
   343
       }
hgs
parents:
diff changeset
   344
       *errorStatus = status;
hgs
parents:
diff changeset
   345
     }
hgs
parents:
diff changeset
   346
    }/* end if(WBXMLEncStrTbl)*/
hgs
parents:
diff changeset
   347
 
hgs
parents:
diff changeset
   348
  NW_Mem_Free(outBuff);
hgs
parents:
diff changeset
   349
  return docNode;
hgs
parents:
diff changeset
   350
}/*CXML_DOM_DocumentNode_BuildXMLTree() */
hgs
parents:
diff changeset
   351
hgs
parents:
diff changeset
   352
EXPORT_C NW_DOM_DocumentNode_t*
hgs
parents:
diff changeset
   353
NW_DOM_DocumentNode_BuildTree(NW_TinyDom_Handle_t *h, 
hgs
parents:
diff changeset
   354
                                   NW_Byte *buffer,
hgs
parents:
diff changeset
   355
                                   NW_Int32 length,
hgs
parents:
diff changeset
   356
                                   NW_Bool encoded,
hgs
parents:
diff changeset
   357
                                   NW_Uint32 publicID,																	 
hgs
parents:
diff changeset
   358
                                   NW_Bool extTNotStringTable)
hgs
parents:
diff changeset
   359
{
hgs
parents:
diff changeset
   360
  if(encoded == NW_TRUE){
hgs
parents:
diff changeset
   361
    return  NW_DOM_DocumentNode_BuildWBXMLTree(h, 
hgs
parents:
diff changeset
   362
                                               buffer,
hgs
parents:
diff changeset
   363
                                               length,
hgs
parents:
diff changeset
   364
                                               NW_FALSE,
hgs
parents:
diff changeset
   365
                                               extTNotStringTable);
hgs
parents:
diff changeset
   366
  }
hgs
parents:
diff changeset
   367
hgs
parents:
diff changeset
   368
  return NW_DOM_DocumentNode_BuildXMLTree(h,buffer, length, publicID, extTNotStringTable);
hgs
parents:
diff changeset
   369
}
hgs
parents:
diff changeset
   370
hgs
parents:
diff changeset
   371
hgs
parents:
diff changeset
   372
hgs
parents:
diff changeset
   373
hgs
parents:
diff changeset
   374
/*
hgs
parents:
diff changeset
   375
 * Returns publicId of the document (WBXML Specific)
hgs
parents:
diff changeset
   376
 * otherwise 0
hgs
parents:
diff changeset
   377
 */
hgs
parents:
diff changeset
   378
hgs
parents:
diff changeset
   379
EXPORT_C NW_Uint32 
hgs
parents:
diff changeset
   380
NW_DOM_DocumentNode_getPublicIdAsNumber(NW_DOM_DocumentNode_t *doc)
hgs
parents:
diff changeset
   381
{
hgs
parents:
diff changeset
   382
  NW_WBXML_Document_t *header;
hgs
parents:
diff changeset
   383
  NW_TinyTree_t *tiny_tree;
hgs
parents:
diff changeset
   384
  
hgs
parents:
diff changeset
   385
  NW_ASSERT(doc != NULL);
hgs
parents:
diff changeset
   386
hgs
parents:
diff changeset
   387
  if (NW_DOM_Node_getNodeType(doc) != NW_DOM_DOCUMENT_NODE){
hgs
parents:
diff changeset
   388
    return 0;
hgs
parents:
diff changeset
   389
  }
hgs
parents:
diff changeset
   390
 
hgs
parents:
diff changeset
   391
  tiny_tree = NW_TinyTree_Node_findTree(doc);
hgs
parents:
diff changeset
   392
  header = NW_TinyDom_getDocHeader(tiny_tree);
hgs
parents:
diff changeset
   393
  NW_ASSERT(header != NULL);
hgs
parents:
diff changeset
   394
hgs
parents:
diff changeset
   395
  return header->publicid;
hgs
parents:
diff changeset
   396
}
hgs
parents:
diff changeset
   397
hgs
parents:
diff changeset
   398
/*
hgs
parents:
diff changeset
   399
 * Gets the publicid as string
hgs
parents:
diff changeset
   400
 * Returns
hgs
parents:
diff changeset
   401
 *    NW_STAT_DOM_NODE_TYPE_ERR
hgs
parents:
diff changeset
   402
 *    NW_STAT_SUCCESS
hgs
parents:
diff changeset
   403
 * MODIFIED - docType
hgs
parents:
diff changeset
   404
 */
hgs
parents:
diff changeset
   405
hgs
parents:
diff changeset
   406
EXPORT_C NW_Status_t
hgs
parents:
diff changeset
   407
NW_DOM_DocumentNode_getPublicId(NW_DOM_DocumentNode_t *doc, 
hgs
parents:
diff changeset
   408
                                NW_String_t *docType)
hgs
parents:
diff changeset
   409
{
hgs
parents:
diff changeset
   410
  NW_WBXML_Document_t *header;
hgs
parents:
diff changeset
   411
  NW_TinyTree_t *tiny_tree;
hgs
parents:
diff changeset
   412
hgs
parents:
diff changeset
   413
  NW_ASSERT(doc != NULL);
hgs
parents:
diff changeset
   414
  NW_ASSERT(docType != NULL);
hgs
parents:
diff changeset
   415
hgs
parents:
diff changeset
   416
  if (NW_DOM_Node_getNodeType(doc) != NW_DOM_DOCUMENT_NODE)
hgs
parents:
diff changeset
   417
    return NW_STAT_DOM_NODE_TYPE_ERR;
hgs
parents:
diff changeset
   418
hgs
parents:
diff changeset
   419
  tiny_tree = NW_TinyTree_Node_findTree(doc);
hgs
parents:
diff changeset
   420
  header = NW_TinyDom_getDocHeader(tiny_tree);
hgs
parents:
diff changeset
   421
hgs
parents:
diff changeset
   422
  NW_ASSERT(header != NULL);
hgs
parents:
diff changeset
   423
  NW_String_shallowCopy(docType, header->doc_type);
hgs
parents:
diff changeset
   424
hgs
parents:
diff changeset
   425
  return NW_STAT_SUCCESS;
hgs
parents:
diff changeset
   426
}
hgs
parents:
diff changeset
   427
hgs
parents:
diff changeset
   428
/*
hgs
parents:
diff changeset
   429
 * Returns the version of the document, 
hgs
parents:
diff changeset
   430
 * 0 in case of invalid operation (e.g. NULL doc)
hgs
parents:
diff changeset
   431
 */
hgs
parents:
diff changeset
   432
hgs
parents:
diff changeset
   433
EXPORT_C NW_Uint8 
hgs
parents:
diff changeset
   434
NW_DOM_DocumentNode_getVersion(NW_DOM_DocumentNode_t *doc)
hgs
parents:
diff changeset
   435
{
hgs
parents:
diff changeset
   436
  NW_WBXML_Document_t *header;
hgs
parents:
diff changeset
   437
  NW_TinyTree_t *tiny_tree;
hgs
parents:
diff changeset
   438
hgs
parents:
diff changeset
   439
  NW_ASSERT(doc != NULL); 
hgs
parents:
diff changeset
   440
hgs
parents:
diff changeset
   441
  if (NW_DOM_Node_getNodeType(doc) != NW_DOM_DOCUMENT_NODE){
hgs
parents:
diff changeset
   442
    return 0;
hgs
parents:
diff changeset
   443
  }
hgs
parents:
diff changeset
   444
hgs
parents:
diff changeset
   445
  tiny_tree = NW_TinyTree_Node_findTree(doc);
hgs
parents:
diff changeset
   446
  header = NW_TinyDom_getDocHeader(tiny_tree);
hgs
parents:
diff changeset
   447
  NW_ASSERT(header != NULL);
hgs
parents:
diff changeset
   448
  
hgs
parents:
diff changeset
   449
  return header->version;
hgs
parents:
diff changeset
   450
  
hgs
parents:
diff changeset
   451
}
hgs
parents:
diff changeset
   452
hgs
parents:
diff changeset
   453
/*
hgs
parents:
diff changeset
   454
 * Returns the supported encoding of the document
hgs
parents:
diff changeset
   455
 * or 0 for invalid document
hgs
parents:
diff changeset
   456
 */
hgs
parents:
diff changeset
   457
hgs
parents:
diff changeset
   458
EXPORT_C NW_Uint32 
hgs
parents:
diff changeset
   459
NW_DOM_DocumentNode_getCharacterEncoding(NW_DOM_DocumentNode_t *doc)
hgs
parents:
diff changeset
   460
{
hgs
parents:
diff changeset
   461
  NW_WBXML_Document_t *header;
hgs
parents:
diff changeset
   462
  NW_TinyTree_t *tiny_tree;
hgs
parents:
diff changeset
   463
hgs
parents:
diff changeset
   464
  NW_ASSERT(doc != NULL); 
hgs
parents:
diff changeset
   465
hgs
parents:
diff changeset
   466
  if (NW_DOM_Node_getNodeType(doc) != NW_DOM_DOCUMENT_NODE)
hgs
parents:
diff changeset
   467
    return 0;
hgs
parents:
diff changeset
   468
hgs
parents:
diff changeset
   469
  tiny_tree = NW_TinyTree_Node_findTree(doc);
hgs
parents:
diff changeset
   470
  header = NW_TinyDom_getDocHeader(tiny_tree);
hgs
parents:
diff changeset
   471
  NW_ASSERT(header != NULL);
hgs
parents:
diff changeset
   472
hgs
parents:
diff changeset
   473
  return header->charset;
hgs
parents:
diff changeset
   474
}
hgs
parents:
diff changeset
   475
hgs
parents:
diff changeset
   476
/*
hgs
parents:
diff changeset
   477
 * Returns child node that is the root of this document
hgs
parents:
diff changeset
   478
 */
hgs
parents:
diff changeset
   479
hgs
parents:
diff changeset
   480
EXPORT_C NW_DOM_ElementNode_t * 
hgs
parents:
diff changeset
   481
NW_DOM_DocumentNode_getDocumentElement(NW_DOM_DocumentNode_t *doc)
hgs
parents:
diff changeset
   482
{
hgs
parents:
diff changeset
   483
  NW_DOM_Node_t *docChild;
hgs
parents:
diff changeset
   484
  NW_Uint16 type;
hgs
parents:
diff changeset
   485
  
hgs
parents:
diff changeset
   486
  NW_ASSERT(doc != NULL); 
hgs
parents:
diff changeset
   487
hgs
parents:
diff changeset
   488
  if (NW_DOM_Node_getNodeType(doc) != NW_DOM_DOCUMENT_NODE){
hgs
parents:
diff changeset
   489
    return NULL;
hgs
parents:
diff changeset
   490
  }
hgs
parents:
diff changeset
   491
hgs
parents:
diff changeset
   492
  /*
hgs
parents:
diff changeset
   493
   * Get the first child of the document node
hgs
parents:
diff changeset
   494
   * (can be a PI node)
hgs
parents:
diff changeset
   495
   */
hgs
parents:
diff changeset
   496
hgs
parents:
diff changeset
   497
  docChild = NW_DOM_Node_getFirstChild(doc);
hgs
parents:
diff changeset
   498
hgs
parents:
diff changeset
   499
  type = NW_DOM_Node_getNodeType(docChild);    
hgs
parents:
diff changeset
   500
  if (type == 0){
hgs
parents:
diff changeset
   501
    return NULL;
hgs
parents:
diff changeset
   502
  }
hgs
parents:
diff changeset
   503
hgs
parents:
diff changeset
   504
  while (type != NW_DOM_ELEMENT_NODE){
hgs
parents:
diff changeset
   505
    docChild = NW_DOM_Node_getNextSibling(docChild);
hgs
parents:
diff changeset
   506
    type = NW_DOM_Node_getNodeType(docChild);
hgs
parents:
diff changeset
   507
  }
hgs
parents:
diff changeset
   508
hgs
parents:
diff changeset
   509
  return docChild;
hgs
parents:
diff changeset
   510
}
hgs
parents:
diff changeset
   511
hgs
parents:
diff changeset
   512
/*
hgs
parents:
diff changeset
   513
 * Gets the dictionary
hgs
parents:
diff changeset
   514
 */
hgs
parents:
diff changeset
   515
hgs
parents:
diff changeset
   516
EXPORT_C NW_WBXML_Dictionary_t *
hgs
parents:
diff changeset
   517
NW_DOM_DocumentNode_getDictionary(NW_DOM_DocumentNode_t *doc)
hgs
parents:
diff changeset
   518
{
hgs
parents:
diff changeset
   519
  NW_Uint32 publicid = 0;
hgs
parents:
diff changeset
   520
  NW_Uint32 encoding;
hgs
parents:
diff changeset
   521
  NW_WBXML_Dictionary_t *dictionary = NULL;
hgs
parents:
diff changeset
   522
  NW_Status_t status;
hgs
parents:
diff changeset
   523
hgs
parents:
diff changeset
   524
  NW_ASSERT(doc != NULL);
hgs
parents:
diff changeset
   525
hgs
parents:
diff changeset
   526
  encoding = NW_DOM_DocumentNode_getCharacterEncoding(doc);
hgs
parents:
diff changeset
   527
  publicid = NW_DOM_DocumentNode_getPublicIdAsNumber(doc);
hgs
parents:
diff changeset
   528
hgs
parents:
diff changeset
   529
  if (publicid != 0){
hgs
parents:
diff changeset
   530
    dictionary = NW_WBXML_Dictionary_getByPublicId(publicid);
hgs
parents:
diff changeset
   531
  }
hgs
parents:
diff changeset
   532
  else{
hgs
parents:
diff changeset
   533
    NW_String_t docType;
hgs
parents:
diff changeset
   534
hgs
parents:
diff changeset
   535
    status = NW_DOM_DocumentNode_getPublicId(doc, &docType);
hgs
parents:
diff changeset
   536
    if (status != NW_STAT_SUCCESS){
hgs
parents:
diff changeset
   537
      return NULL;
hgs
parents:
diff changeset
   538
    }
hgs
parents:
diff changeset
   539
    dictionary = NW_WBXML_Dictionary_getByDocType(&docType, encoding);
hgs
parents:
diff changeset
   540
  }
hgs
parents:
diff changeset
   541
  return dictionary;
hgs
parents:
diff changeset
   542
}
hgs
parents:
diff changeset
   543
hgs
parents:
diff changeset
   544
hgs
parents:
diff changeset
   545
hgs
parents:
diff changeset
   546
NW_Status_t
hgs
parents:
diff changeset
   547
NW_DOM_DocumentNode_getElementIteratorByTagName(NW_DOM_DocumentNode_t *doc, 
hgs
parents:
diff changeset
   548
                                                NW_String_t* name,
hgs
parents:
diff changeset
   549
                                                NW_DOM_NodeIterator_t *handle)
hgs
parents:
diff changeset
   550
{
hgs
parents:
diff changeset
   551
  NW_WBXML_Dictionary_t *dict = NULL;
hgs
parents:
diff changeset
   552
  NW_String_UCS2Buff_t *buff = NULL;
hgs
parents:
diff changeset
   553
  NW_Uint32 encoding;
hgs
parents:
diff changeset
   554
  NW_Int16 token;
hgs
parents:
diff changeset
   555
hgs
parents:
diff changeset
   556
  NW_ASSERT(doc != NULL);
hgs
parents:
diff changeset
   557
  NW_ASSERT(name != NULL);
hgs
parents:
diff changeset
   558
  NW_ASSERT(handle != NULL);
hgs
parents:
diff changeset
   559
hgs
parents:
diff changeset
   560
  encoding = NW_DOM_DocumentNode_getCharacterEncoding(doc);
hgs
parents:
diff changeset
   561
  dict = NW_DOM_DocumentNode_getDictionary(doc);
hgs
parents:
diff changeset
   562
  buff = NW_String_stringToUCS2Buff(name, encoding);
hgs
parents:
diff changeset
   563
  if((buff == NULL) || (dict == NULL)){
hgs
parents:
diff changeset
   564
    NW_Mem_Free(buff);
hgs
parents:
diff changeset
   565
    return NW_STAT_FAILURE;
hgs
parents:
diff changeset
   566
  }
hgs
parents:
diff changeset
   567
  token = NW_WBXML_Dictionary_getTagToken(dict, buff, NW_TRUE);
hgs
parents:
diff changeset
   568
  NW_Mem_Free(buff);
hgs
parents:
diff changeset
   569
  if (token < 0) {
hgs
parents:
diff changeset
   570
    return NW_STAT_FAILURE;
hgs
parents:
diff changeset
   571
  }
hgs
parents:
diff changeset
   572
  else { 
hgs
parents:
diff changeset
   573
  return NW_DOM_DocumentNode_getElementIteratorByTagToken(doc, 
hgs
parents:
diff changeset
   574
                                                          (NW_Uint16)token, 
hgs
parents:
diff changeset
   575
                                                          handle);
hgs
parents:
diff changeset
   576
}
hgs
parents:
diff changeset
   577
}
hgs
parents:
diff changeset
   578
hgs
parents:
diff changeset
   579
NW_Status_t
hgs
parents:
diff changeset
   580
NW_DOM_DocumentNode_getElementIteratorByTagToken(NW_DOM_DocumentNode_t *doc, 
hgs
parents:
diff changeset
   581
                                                 NW_Uint16 token,
hgs
parents:
diff changeset
   582
                                                 NW_DOM_NodeIterator_t *handle)
hgs
parents:
diff changeset
   583
{
hgs
parents:
diff changeset
   584
  
hgs
parents:
diff changeset
   585
  NW_DOM_ElementNode_t *elem;
hgs
parents:
diff changeset
   586
hgs
parents:
diff changeset
   587
  NW_ASSERT(doc != NULL);
hgs
parents:
diff changeset
   588
  NW_ASSERT(handle != NULL);
hgs
parents:
diff changeset
   589
hgs
parents:
diff changeset
   590
  if (NW_DOM_Node_getNodeType(doc) != NW_DOM_DOCUMENT_NODE)
hgs
parents:
diff changeset
   591
    return NW_STAT_DOM_NODE_TYPE_ERR;
hgs
parents:
diff changeset
   592
hgs
parents:
diff changeset
   593
  elem = NW_DOM_DocumentNode_getDocumentElement(doc);
hgs
parents:
diff changeset
   594
  NW_ASSERT(elem != NULL);
hgs
parents:
diff changeset
   595
hgs
parents:
diff changeset
   596
  return NW_DOM_NodeIterator_initialize(handle, elem, token); 
hgs
parents:
diff changeset
   597
}
hgs
parents:
diff changeset
   598
hgs
parents:
diff changeset
   599
hgs
parents:
diff changeset
   600
hgs
parents:
diff changeset
   601
hgs
parents:
diff changeset
   602
hgs
parents:
diff changeset
   603
/*
hgs
parents:
diff changeset
   604
 * Returns a pointer to the created Element Node
hgs
parents:
diff changeset
   605
 */
hgs
parents:
diff changeset
   606
EXPORT_C NW_DOM_ElementNode_t *
hgs
parents:
diff changeset
   607
NW_DOM_DocumentNode_createElementNode(
hgs
parents:
diff changeset
   608
  NW_DOM_DocumentNode_t *doc, NW_String_t *name)
hgs
parents:
diff changeset
   609
{
hgs
parents:
diff changeset
   610
  NW_Uint32 encoding = NW_DOM_DocumentNode_getCharacterEncoding(doc);
hgs
parents:
diff changeset
   611
  NW_String_UCS2Buff_t *ucs2Buff = NULL;
hgs
parents:
diff changeset
   612
 NW_Uint8 *uint8Buf = NULL;
hgs
parents:
diff changeset
   613
 NW_Int32 fqToken = 0;
hgs
parents:
diff changeset
   614
  NW_WBXML_Dictionary_t *dictionary = NW_DOM_DocumentNode_getDictionary(doc);
hgs
parents:
diff changeset
   615
  NW_TinyTree_t* tinyTree;
hgs
parents:
diff changeset
   616
  NW_TinyDom_Tree_t *tree;
hgs
parents:
diff changeset
   617
  
hgs
parents:
diff changeset
   618
  if ((doc == NULL) || (name == NULL) || (dictionary == NULL))
hgs
parents:
diff changeset
   619
  {
hgs
parents:
diff changeset
   620
    return NULL;
hgs
parents:
diff changeset
   621
  }
hgs
parents:
diff changeset
   622
hgs
parents:
diff changeset
   623
  ucs2Buff = NW_String_stringToUCS2Buff(name, encoding);
hgs
parents:
diff changeset
   624
  if (ucs2Buff == NULL){
hgs
parents:
diff changeset
   625
    return NULL;
hgs
parents:
diff changeset
   626
  }
hgs
parents:
diff changeset
   627
  uint8Buf = (NW_Uint8 *) CXML_Str_CvtToAscii((NW_Ucs2*) ucs2Buff);
hgs
parents:
diff changeset
   628
  NW_Mem_Free(ucs2Buff);
hgs
parents:
diff changeset
   629
  if(uint8Buf == NULL){
hgs
parents:
diff changeset
   630
    return NULL;
hgs
parents:
diff changeset
   631
  }
hgs
parents:
diff changeset
   632
  tinyTree = NW_TinyTree_Node_findTree(doc);
hgs
parents:
diff changeset
   633
  tree = NW_TinyDom_getTree(tinyTree);
hgs
parents:
diff changeset
   634
hgs
parents:
diff changeset
   635
  fqToken = (NW_Int32) NW_WBXML_Dictionary_getTagToken(dictionary, ucs2Buff, NW_TRUE);
hgs
parents:
diff changeset
   636
  NW_Mem_Free(uint8Buf);
hgs
parents:
diff changeset
   637
  if (fqToken == -1){
hgs
parents:
diff changeset
   638
    return NW_TinyDom_createElementByName(tree, name);
hgs
parents:
diff changeset
   639
  }
hgs
parents:
diff changeset
   640
  
hgs
parents:
diff changeset
   641
  return NW_TinyDom_createElementByToken(tree, (NW_Uint16)fqToken);  
hgs
parents:
diff changeset
   642
}
hgs
parents:
diff changeset
   643
hgs
parents:
diff changeset
   644
/*
hgs
parents:
diff changeset
   645
 * Returns a pointer to the created Element Node
hgs
parents:
diff changeset
   646
 */
hgs
parents:
diff changeset
   647
EXPORT_C NW_DOM_ElementNode_t * 
hgs
parents:
diff changeset
   648
NW_DOM_DocumentNode_createElementNodeByToken(
hgs
parents:
diff changeset
   649
  NW_DOM_DocumentNode_t *doc, NW_Uint16 token)
hgs
parents:
diff changeset
   650
{
hgs
parents:
diff changeset
   651
  NW_TinyTree_t* tinyTree;
hgs
parents:
diff changeset
   652
  NW_TinyDom_Tree_t *tree;
hgs
parents:
diff changeset
   653
  NW_WBXML_Dictionary_t *dictionary;
hgs
parents:
diff changeset
   654
  
hgs
parents:
diff changeset
   655
  dictionary = NW_DOM_DocumentNode_getDictionary(doc);
hgs
parents:
diff changeset
   656
  if ((doc == NULL) || (dictionary == NULL) || (token == 0))
hgs
parents:
diff changeset
   657
  {
hgs
parents:
diff changeset
   658
    return NULL;
hgs
parents:
diff changeset
   659
  }
hgs
parents:
diff changeset
   660
hgs
parents:
diff changeset
   661
  tinyTree = NW_TinyTree_Node_findTree(doc);
hgs
parents:
diff changeset
   662
  tree = NW_TinyDom_getTree(tinyTree);
hgs
parents:
diff changeset
   663
hgs
parents:
diff changeset
   664
  return NW_TinyDom_createElementByToken(tree, (NW_Uint16)token);  
hgs
parents:
diff changeset
   665
}
hgs
parents:
diff changeset
   666
hgs
parents:
diff changeset
   667
hgs
parents:
diff changeset
   668
/*
hgs
parents:
diff changeset
   669
 * Returns a pointer to the created Text Node
hgs
parents:
diff changeset
   670
 */
hgs
parents:
diff changeset
   671
EXPORT_C NW_DOM_TextNode_t * 
hgs
parents:
diff changeset
   672
NW_DOM_DocumentNode_createTextNodeWithTextItem(
hgs
parents:
diff changeset
   673
  NW_DOM_DocumentNode_t *doc, NW_DOM_TextItem_t *data)
hgs
parents:
diff changeset
   674
{
hgs
parents:
diff changeset
   675
  NW_TinyTree_t* tinyTree;
hgs
parents:
diff changeset
   676
  NW_TinyDom_Tree_t *tree;
hgs
parents:
diff changeset
   677
hgs
parents:
diff changeset
   678
  if ((doc == NULL) || (data == NULL))
hgs
parents:
diff changeset
   679
    return NULL;
hgs
parents:
diff changeset
   680
hgs
parents:
diff changeset
   681
  tinyTree = NW_TinyTree_Node_findTree(doc);
hgs
parents:
diff changeset
   682
  tree = NW_TinyDom_getTree(tinyTree);
hgs
parents:
diff changeset
   683
hgs
parents:
diff changeset
   684
  return NW_TinyDom_createTextNode(tree, data);
hgs
parents:
diff changeset
   685
}
hgs
parents:
diff changeset
   686
hgs
parents:
diff changeset
   687
/*
hgs
parents:
diff changeset
   688
 * Returns a pointer to the created Text Node
hgs
parents:
diff changeset
   689
 */
hgs
parents:
diff changeset
   690
EXPORT_C NW_DOM_TextNode_t * 
hgs
parents:
diff changeset
   691
NW_DOM_DocumentNode_createTextNode(
hgs
parents:
diff changeset
   692
  NW_DOM_DocumentNode_t *doc, NW_String_t *data)
hgs
parents:
diff changeset
   693
{
hgs
parents:
diff changeset
   694
  NW_TinyTree_t* tinyTree;
hgs
parents:
diff changeset
   695
  NW_TinyDom_Tree_t *tree;
hgs
parents:
diff changeset
   696
  NW_DOM_TextItem_t item;
hgs
parents:
diff changeset
   697
hgs
parents:
diff changeset
   698
  if (NW_DOM_TextItem_initFromString(&item, data) != NW_STAT_SUCCESS)
hgs
parents:
diff changeset
   699
    return NULL;
hgs
parents:
diff changeset
   700
hgs
parents:
diff changeset
   701
  if ((doc == NULL) || (data == NULL))
hgs
parents:
diff changeset
   702
    return NULL;
hgs
parents:
diff changeset
   703
hgs
parents:
diff changeset
   704
  tinyTree = NW_TinyTree_Node_findTree(doc);
hgs
parents:
diff changeset
   705
  tree = NW_TinyDom_getTree(tinyTree);
hgs
parents:
diff changeset
   706
hgs
parents:
diff changeset
   707
  return NW_TinyDom_createTextNode(tree, &item);
hgs
parents:
diff changeset
   708
}
hgs
parents:
diff changeset
   709
hgs
parents:
diff changeset
   710
/*
hgs
parents:
diff changeset
   711
 * Returns a pointer to the created Comment Node
hgs
parents:
diff changeset
   712
 */
hgs
parents:
diff changeset
   713
NW_DOM_CommentNode_t * 
hgs
parents:
diff changeset
   714
NW_DOM_DocumentNode_createCommentNode(
hgs
parents:
diff changeset
   715
  NW_DOM_DocumentNode_t *doc, NW_String_t *data)
hgs
parents:
diff changeset
   716
{
hgs
parents:
diff changeset
   717
  NW_DOM_TextNode_t *t = 
hgs
parents:
diff changeset
   718
    NW_DOM_DocumentNode_createTextNode(doc, data);
hgs
parents:
diff changeset
   719
  if (t == NULL)
hgs
parents:
diff changeset
   720
    return NULL;
hgs
parents:
diff changeset
   721
  NW_TinyTree_Node_setUserFlags(t, T_DOM_NODE_COMMENT);
hgs
parents:
diff changeset
   722
  t->flags |= T_DOM_NODE_XML;
hgs
parents:
diff changeset
   723
  return (NW_DOM_CommentNode_t *)t;
hgs
parents:
diff changeset
   724
}
hgs
parents:
diff changeset
   725
hgs
parents:
diff changeset
   726
hgs
parents:
diff changeset
   727
/*
hgs
parents:
diff changeset
   728
 * Returns a pointer to the created CDataSection Node
hgs
parents:
diff changeset
   729
 */
hgs
parents:
diff changeset
   730
NW_DOM_CDATASectionNode_t * 
hgs
parents:
diff changeset
   731
NW_DOM_DocumentNode_createCDATASectionNode(
hgs
parents:
diff changeset
   732
  NW_DOM_DocumentNode_t *doc, NW_String_t *data)
hgs
parents:
diff changeset
   733
{
hgs
parents:
diff changeset
   734
  NW_DOM_TextNode_t *t = 
hgs
parents:
diff changeset
   735
    NW_DOM_DocumentNode_createTextNode(doc, data);
hgs
parents:
diff changeset
   736
  if (t == NULL)
hgs
parents:
diff changeset
   737
    return NULL;
hgs
parents:
diff changeset
   738
  NW_TinyTree_Node_setUserFlags(t, T_DOM_NODE_CDATASECTION);
hgs
parents:
diff changeset
   739
  t->flags |= T_DOM_NODE_XML;
hgs
parents:
diff changeset
   740
  return (NW_DOM_CommentNode_t *)t;
hgs
parents:
diff changeset
   741
}
hgs
parents:
diff changeset
   742
hgs
parents:
diff changeset
   743
hgs
parents:
diff changeset
   744
/*
hgs
parents:
diff changeset
   745
 * Returns a pointer to the created ProcessingInstructionNode Node
hgs
parents:
diff changeset
   746
 */
hgs
parents:
diff changeset
   747
NW_DOM_ProcessingInstructionNode_t * 
hgs
parents:
diff changeset
   748
NW_DOM_DocumentNode_createProcessingInstructionNodeByAttrVal(NW_DOM_DocumentNode_t* pDoc,
hgs
parents:
diff changeset
   749
                                                             NW_String_t* pTargetString,
hgs
parents:
diff changeset
   750
                                                             NW_DOM_AttrVal_t* pData)
hgs
parents:
diff changeset
   751
{
hgs
parents:
diff changeset
   752
  NW_TinyTree_Node_t* pPiNode;
hgs
parents:
diff changeset
   753
  NW_TinyTree_Node_t* pAttrNode;
hgs
parents:
diff changeset
   754
  NW_TinyTree_t* pTinyTree;
hgs
parents:
diff changeset
   755
  NW_TinyDom_Tree_t* pTree;
hgs
parents:
diff changeset
   756
  NW_WBXML_Dictionary_t* pDictionary;
hgs
parents:
diff changeset
   757
  NW_Uint32 encoding;
hgs
parents:
diff changeset
   758
  NW_Int32 fqToken;
hgs
parents:
diff changeset
   759
hgs
parents:
diff changeset
   760
  if ((pDoc == NULL) || (pTargetString == NULL) || (pData == NULL)) {
hgs
parents:
diff changeset
   761
    return NULL;
hgs
parents:
diff changeset
   762
  }
hgs
parents:
diff changeset
   763
  pTinyTree = NW_TinyTree_Node_findTree(pDoc);
hgs
parents:
diff changeset
   764
  pTree = NW_TinyDom_getTree(pTinyTree);
hgs
parents:
diff changeset
   765
hgs
parents:
diff changeset
   766
  pDictionary = NW_DOM_DocumentNode_getDictionary(pDoc);
hgs
parents:
diff changeset
   767
  if (pDictionary == NULL) {
hgs
parents:
diff changeset
   768
    return NULL;
hgs
parents:
diff changeset
   769
  }
hgs
parents:
diff changeset
   770
  encoding = NW_DOM_DocumentNode_getCharacterEncoding(pDoc);
hgs
parents:
diff changeset
   771
  fqToken = NW_WBXML_Dictionary_getAttributeToken(pDictionary,
hgs
parents:
diff changeset
   772
                                                  pTargetString,
hgs
parents:
diff changeset
   773
                                                  encoding,
hgs
parents:
diff changeset
   774
                                                  NW_TRUE /* name */);
hgs
parents:
diff changeset
   775
  if (fqToken == -1)
hgs
parents:
diff changeset
   776
  {
hgs
parents:
diff changeset
   777
    pPiNode = NW_TinyTree_createNode(&(pTree->tree), 0);
hgs
parents:
diff changeset
   778
    if (pPiNode == NULL) {
hgs
parents:
diff changeset
   779
      return NULL;
hgs
parents:
diff changeset
   780
    }
hgs
parents:
diff changeset
   781
    NW_TinyTree_Node_setUserFlags(pPiNode, T_DOM_NODE_PI);
hgs
parents:
diff changeset
   782
hgs
parents:
diff changeset
   783
    pAttrNode = NW_TinyDom_createAttributeByName(pTree,
hgs
parents:
diff changeset
   784
                                                 pTargetString,
hgs
parents:
diff changeset
   785
                                                 pData);
hgs
parents:
diff changeset
   786
    if (pAttrNode == NULL) {
hgs
parents:
diff changeset
   787
      (void)NW_TinyTree_deleteNode(pPiNode);
hgs
parents:
diff changeset
   788
      return NULL;
hgs
parents:
diff changeset
   789
    }
hgs
parents:
diff changeset
   790
    (void)NW_TinyTree_attachChild(pPiNode, pAttrNode);
hgs
parents:
diff changeset
   791
    return pPiNode;
hgs
parents:
diff changeset
   792
  }
hgs
parents:
diff changeset
   793
  return NW_DOM_DocumentNode_createProcessingInstructionNodeByToken(pDoc,
hgs
parents:
diff changeset
   794
                                                                    (NW_Uint16)fqToken,
hgs
parents:
diff changeset
   795
                                                                    pData);
hgs
parents:
diff changeset
   796
}
hgs
parents:
diff changeset
   797
hgs
parents:
diff changeset
   798
/*
hgs
parents:
diff changeset
   799
 * Returns a pointer to the created ProcessingInstructionNode Node
hgs
parents:
diff changeset
   800
 */
hgs
parents:
diff changeset
   801
hgs
parents:
diff changeset
   802
NW_DOM_ProcessingInstructionNode_t * 
hgs
parents:
diff changeset
   803
NW_DOM_DocumentNode_createProcessingInstructionNodeByToken(
hgs
parents:
diff changeset
   804
  NW_DOM_DocumentNode_t *pDoc, NW_Uint16 token, NW_DOM_AttrVal_t *pData)
hgs
parents:
diff changeset
   805
{
hgs
parents:
diff changeset
   806
  NW_TinyTree_Node_t* pPiNode;
hgs
parents:
diff changeset
   807
  NW_TinyTree_Node_t* pAttrNode;
hgs
parents:
diff changeset
   808
  NW_TinyTree_t* pTinyTree;
hgs
parents:
diff changeset
   809
  NW_TinyDom_Tree_t* pTree;
hgs
parents:
diff changeset
   810
hgs
parents:
diff changeset
   811
  if ((pDoc == NULL) || (token == 0) || (pData == NULL))
hgs
parents:
diff changeset
   812
    return NULL;
hgs
parents:
diff changeset
   813
hgs
parents:
diff changeset
   814
  pTinyTree = NW_TinyTree_Node_findTree(pDoc);
hgs
parents:
diff changeset
   815
  pTree = NW_TinyDom_getTree(pTinyTree);
hgs
parents:
diff changeset
   816
  pPiNode = NW_TinyTree_createNode(&(pTree->tree), 0);
hgs
parents:
diff changeset
   817
  if (pPiNode == NULL) {
hgs
parents:
diff changeset
   818
    return NULL;
hgs
parents:
diff changeset
   819
  }
hgs
parents:
diff changeset
   820
  NW_TinyTree_Node_setUserFlags(pPiNode, T_DOM_NODE_PI);
hgs
parents:
diff changeset
   821
hgs
parents:
diff changeset
   822
  pAttrNode = NW_TinyDom_createAttributeByToken(pTree,
hgs
parents:
diff changeset
   823
                                                (NW_Uint8)token,
hgs
parents:
diff changeset
   824
                                                pData);
hgs
parents:
diff changeset
   825
  if (pAttrNode == NULL) {
hgs
parents:
diff changeset
   826
    (void)NW_TinyTree_deleteNode(pPiNode);
hgs
parents:
diff changeset
   827
    return NULL;
hgs
parents:
diff changeset
   828
  }
hgs
parents:
diff changeset
   829
  (void)NW_TinyTree_attachChild(pPiNode, pAttrNode);
hgs
parents:
diff changeset
   830
  return pPiNode;
hgs
parents:
diff changeset
   831
}
hgs
parents:
diff changeset
   832
hgs
parents:
diff changeset
   833
/*
hgs
parents:
diff changeset
   834
 * Returns a pointer to the created ProcessingInstructionNode Node
hgs
parents:
diff changeset
   835
 */
hgs
parents:
diff changeset
   836
NW_DOM_ProcessingInstructionNode_t * 
hgs
parents:
diff changeset
   837
NW_DOM_DocumentNode_createProcessingInstructionNode(
hgs
parents:
diff changeset
   838
  NW_DOM_DocumentNode_t *doc, NW_String_t *target, NW_String_t *data)
hgs
parents:
diff changeset
   839
{
hgs
parents:
diff changeset
   840
  NW_DOM_AttrVal_t val;
hgs
parents:
diff changeset
   841
hgs
parents:
diff changeset
   842
  if ((doc == NULL) || (target == 0) || (data == NULL))
hgs
parents:
diff changeset
   843
    return NULL;
hgs
parents:
diff changeset
   844
hgs
parents:
diff changeset
   845
  NW_DOM_AttrVal_initFromString(&val, data);
hgs
parents:
diff changeset
   846
  return NW_DOM_DocumentNode_createProcessingInstructionNodeByAttrVal(doc, target, &val);  
hgs
parents:
diff changeset
   847
}
hgs
parents:
diff changeset
   848
hgs
parents:
diff changeset
   849
/*
hgs
parents:
diff changeset
   850
 * Returns a pointer to the created Document Node
hgs
parents:
diff changeset
   851
 * - NOT SUPPRTED - ask Steve 
hgs
parents:
diff changeset
   852
NW_DOM_DocumentNode_t * 
hgs
parents:
diff changeset
   853
NW_DOM_DocumentNode_createDocument(
hgs
parents:
diff changeset
   854
    NW_Uint8 version, NW_String_t *publicid, NW_Uint32 encoding)
hgs
parents:
diff changeset
   855
{
hgs
parents:
diff changeset
   856
  NW_WBXML_Parser_t *WBXMLParser;
hgs
parents:
diff changeset
   857
  NW_TinyDom_Parser_t *tinyParser; 
hgs
parents:
diff changeset
   858
  NW_TinyDom_Tree_t *domTree;
hgs
parents:
diff changeset
   859
  NW_WBXML_Writer_t *writer;
hgs
parents:
diff changeset
   860
  NW_Status_t status;
hgs
parents:
diff changeset
   861
hgs
parents:
diff changeset
   862
  WBXMLParser = NW_Mem_Malloc(sizeof(NW_WBXML_Parser_t));
hgs
parents:
diff changeset
   863
  tinyParser = NW_Mem_Malloc(sizeof(NW_TinyDom_Parser_t));
hgs
parents:
diff changeset
   864
  domTree = NW_Mem_Malloc(sizeof(NW_TinyDom_Tree_t));
hgs
parents:
diff changeset
   865
  writer = NW_Mem_Malloc(sizeof(NW_WBXML_Writer_t));
hgs
parents:
diff changeset
   866
hgs
parents:
diff changeset
   867
  NW_WBXML_Parser_reset(WBXMLParser);
hgs
parents:
diff changeset
   868
  domTree->doc->version = version;
hgs
parents:
diff changeset
   869
  domTree->doc->doc_type = publicid;
hgs
parents:
diff changeset
   870
  domTree->doc->charset = encoding;
hgs
parents:
diff changeset
   871
  NW_TinyDom_Tree_construct(domTree, WBXMLParser, domTree->doc, writer);
hgs
parents:
diff changeset
   872
  NW_TinyDom_Parser_construct(tinyParser, domTree);
hgs
parents:
diff changeset
   873
  status = NW_TinyDom_Tree_create(domTree, tinyParser, domTree->doc, 
hgs
parents:
diff changeset
   874
    WBXMLParser, writer, 2);
hgs
parents:
diff changeset
   875
  if (status != NW_STAT_SUCCESS)
hgs
parents:
diff changeset
   876
    return NULL;
hgs
parents:
diff changeset
   877
  return NW_TinyDom_writeDocHeader(domTree, version, publicid, encoding);
hgs
parents:
diff changeset
   878
}*/
hgs
parents:
diff changeset
   879
hgs
parents:
diff changeset
   880
/*
hgs
parents:
diff changeset
   881
 * Create an empty dom tree, returning the document node.
hgs
parents:
diff changeset
   882
 */
hgs
parents:
diff changeset
   883
hgs
parents:
diff changeset
   884
EXPORT_C NW_DOM_DocumentNode_t * 
hgs
parents:
diff changeset
   885
NW_DOM_DocumentNode_createDocumentWithNumberPublicId(NW_TinyDom_Handle_t *h,
hgs
parents:
diff changeset
   886
                                                     NW_Uint8 version,
hgs
parents:
diff changeset
   887
                                                     NW_Uint32 publicid, 
hgs
parents:
diff changeset
   888
                                                     NW_Uint32 encoding,
hgs
parents:
diff changeset
   889
                                                     NW_Bool extTNotStringTable,
hgs
parents:
diff changeset
   890
                                                     NW_Bool enableStringTable)
hgs
parents:
diff changeset
   891
{
hgs
parents:
diff changeset
   892
  NW_Status_t status = NW_STAT_SUCCESS;
hgs
parents:
diff changeset
   893
  NW_TinyDom_Handle_Initialize(h, publicid, extTNotStringTable);
hgs
parents:
diff changeset
   894
hgs
parents:
diff changeset
   895
  h->document.charset = encoding;
hgs
parents:
diff changeset
   896
  h->document.publicid = publicid;
hgs
parents:
diff changeset
   897
  h->document.version = version;
hgs
parents:
diff changeset
   898
hgs
parents:
diff changeset
   899
  	 
hgs
parents:
diff changeset
   900
  	 status = NW_TinyDom_Tree_create(&h->tinyDOMTree, &h->tinyParser, 
hgs
parents:
diff changeset
   901
                                  &h->document, &h->wbxmlParser,
hgs
parents:
diff changeset
   902
                                  &h->writer, 4, enableStringTable);
hgs
parents:
diff changeset
   903
     
hgs
parents:
diff changeset
   904
  
hgs
parents:
diff changeset
   905
hgs
parents:
diff changeset
   906
  if(status == NW_STAT_SUCCESS)
hgs
parents:
diff changeset
   907
  {
hgs
parents:
diff changeset
   908
  	return h->tinyDOMTree.root_node;
hgs
parents:
diff changeset
   909
  }
hgs
parents:
diff changeset
   910
  else
hgs
parents:
diff changeset
   911
  {
hgs
parents:
diff changeset
   912
  	
hgs
parents:
diff changeset
   913
  	return NULL;
hgs
parents:
diff changeset
   914
  }
hgs
parents:
diff changeset
   915
}
hgs
parents:
diff changeset
   916
hgs
parents:
diff changeset
   917
hgs
parents:
diff changeset
   918
/*
hgs
parents:
diff changeset
   919
 * One of the API for Building the DOM tree.
hgs
parents:
diff changeset
   920
 */
hgs
parents:
diff changeset
   921
hgs
parents:
diff changeset
   922
EXPORT_C NW_DOM_DocumentNode_t* 
hgs
parents:
diff changeset
   923
CXML_DOM_DocumentNode_BuildTree(NW_TinyDom_Handle_t* h, 
hgs
parents:
diff changeset
   924
                              NW_Byte* buffer,
hgs
parents:
diff changeset
   925
                              NW_Int32 length,
hgs
parents:
diff changeset
   926
                              NW_Bool encoded,
hgs
parents:
diff changeset
   927
                              NW_Uint32 publicID,
hgs
parents:
diff changeset
   928
                              NW_Bool extTNotStringTable,
hgs
parents:
diff changeset
   929
                              NW_Status_t* errorStatus)
hgs
parents:
diff changeset
   930
{
hgs
parents:
diff changeset
   931
 *errorStatus = NW_STAT_SUCCESS;
hgs
parents:
diff changeset
   932
 if(encoded == NW_TRUE)
hgs
parents:
diff changeset
   933
 {
hgs
parents:
diff changeset
   934
    return  CXML_DOM_DocumentNode_BuildWBXMLTree(h, 
hgs
parents:
diff changeset
   935
                                                 buffer,
hgs
parents:
diff changeset
   936
                                                 length,
hgs
parents:
diff changeset
   937
                                                 NW_FALSE,
hgs
parents:
diff changeset
   938
                                                 extTNotStringTable,
hgs
parents:
diff changeset
   939
                                                 errorStatus);
hgs
parents:
diff changeset
   940
  }
hgs
parents:
diff changeset
   941
hgs
parents:
diff changeset
   942
  return CXML_DOM_DocumentNode_BuildXMLTree(h,
hgs
parents:
diff changeset
   943
                                            buffer, 
hgs
parents:
diff changeset
   944
                                            length, 
hgs
parents:
diff changeset
   945
                                            publicID, 
hgs
parents:
diff changeset
   946
                                            extTNotStringTable,
hgs
parents:
diff changeset
   947
                                            errorStatus);
hgs
parents:
diff changeset
   948
 
hgs
parents:
diff changeset
   949
hgs
parents:
diff changeset
   950
}/*end CXML_DOM_DocumentNode_BuildTree()*/
hgs
parents:
diff changeset
   951