diff -r 6bcc0aa4be39 -r 889504eac4fb xml/cxmllibrary/src/wbxmlp/src/doc.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xml/cxmllibrary/src/wbxmlp/src/doc.c Tue Aug 31 17:02:56 2010 +0300 @@ -0,0 +1,213 @@ +/* +* Copyright (c) 2000 - 2001 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + + +/***************************************************************** +** File: wbxml_doc.c +** Description: +*****************************************************************/ + +#include "cxml_internal.h" +#include +#include +#include + + +EXPORT_C NW_Status_t +NW_WBXML_Document_construct(NW_WBXML_Document_t * doc, NW_Uint32 default_public_id) +{ + doc->version = 0; + doc->publicid = 0; + doc->doc_type = NULL; + doc->default_public_id = default_public_id; + doc->charset = 0; + doc->strtbl.length = 0; + doc->strtbl.data = 0; + doc->body_len = 0; + doc->strtbl_extension = NW_Encoder_StringTable_new(); + if (doc->strtbl_extension == NULL){ + return NW_STAT_OUT_OF_MEMORY; + } + return NW_STAT_SUCCESS; +} + +/* There is no document construct, since initialization is done by + * the parser + */ + +EXPORT_C void +NW_WBXML_Document_destruct (NW_WBXML_Document_t * doc) +{ + if (doc == NULL) { + return; + } + + if (doc->doc_type) { + NW_String_delete (doc->doc_type); + doc->doc_type = NULL; + } + + NW_Encoder_StringTable_delete(doc->strtbl_extension); +} + +/* + * Safely get a string from the string table + * + * RETURN NULL if an error occurs and sets parser->flags accordingly + */ + + +EXPORT_C NW_Status_t +NW_WBXML_Document_getTableString (NW_WBXML_Document_t * doc, + NW_Uint32 index, + NW_String_t *string) +{ + + NW_ASSERT(doc != NULL); + NW_ASSERT(string != NULL); + + if (index >= doc->strtbl.length){ + /* See if there are extended table members */ + if(NW_Encoder_StringTable_GetSize(doc->strtbl_extension) != 0) + { + NW_Status_t status; + NW_Encoder_StringTableIterator_t extTblIter; + NW_Uint32 strTblItrByteCnt = 0; + NW_Uint32 startingExtTblByteCnt = 0; + NW_Uint8* indexBuf; + NW_Uint32 extensionTblInx = index - doc->strtbl.length; + NW_Bool found = NW_FALSE; + + /* NW_Encoder_StringTable_get(..) requires the vector item + * index not the absolute extension string table index (as + * passed parameter [NW_Uint32 index]). So, itertor method + * is used to get the string. + * + */ + + /*The following function always return success so why bother to check? */ + + NW_Encoder_StringTable_StringTableIterateInit(doc->strtbl_extension,&extTblIter); + + status = NW_Encoder_StringTable_StringTableIterateNext + (&extTblIter,&strTblItrByteCnt,&indexBuf); + + + while(status == NW_STAT_WBXML_ITERATE_MORE) + { + + if(startingExtTblByteCnt == extensionTblInx) + { + found = NW_TRUE; + break; + } + + startingExtTblByteCnt += strTblItrByteCnt; + + status = NW_Encoder_StringTable_StringTableIterateNext + (&extTblIter,&strTblItrByteCnt,&indexBuf) ; + }//end while + + + if(found == NW_TRUE) + { + string->storage = indexBuf; + string->length = strTblItrByteCnt; + return NW_STAT_SUCCESS; + } + } + return NW_STAT_WBXML_ERROR_BYTECODE; + } + + /* Make sure string ends within string table */ + + if (!NW_String_valid(doc->strtbl.data + index, doc->strtbl.length - index, + doc->charset)) + { + return NW_STAT_WBXML_ERROR_BYTECODE; + } + + return NW_String_initialize (string, doc->strtbl.data + index, doc->charset); +} + +/* String table write method + * + * Writing a dom tree may require adding strings to the string table, + * if one exists, or creating a string table if none exists. We create + * an extended table using the encoder string table write methods if + * this is necessary. Unfortunately, there can be some duplication of + * strings between the two tables, because there is no efficient way to + * look up a string by name in the real string table. Therefore, any + * string that gets added to the table gets added to the extension + * table. The encoder takes care of rationalizing the two tables if + * the document gets rewritten as wbxml. + * + * If the string is not already in the table, this method adds it. The + * out parameter byteOffset returns the byte offset of the string in the + * extension table plus the size of the real string table so that + * extension table strings always have positions higher than real table + * strings. + */ +EXPORT_C NW_Status_t +NW_WBXML_Document_putTableString(NW_WBXML_Document_t * doc, + NW_String_t *string, + NW_Uint32 *byteOffset) +{ + NW_Uint32 extensionOffset; + NW_Status_t retval = + NW_Encoder_StringTable_append(doc->strtbl_extension, + string, + NW_TRUE, + &extensionOffset); + *byteOffset = doc->strtbl.length + extensionOffset; + return retval; +} + +NW_Uint8 +NW_WBXML_Document_getVersion(NW_WBXML_Document_t *document) +{ + NW_ASSERT(document != NULL); + return document->version; +} + +NW_Uint32 +NW_WBXML_Document_getPublicID(NW_WBXML_Document_t *document) +{ + NW_ASSERT(document != NULL); + return document->publicid; +} + +NW_String_t* +NW_WBXML_Document_getDocType(NW_WBXML_Document_t *document) +{ + NW_ASSERT(document != NULL); + return document->doc_type; +} + +NW_Uint32 +NW_WBXML_Document_getEncoding(NW_WBXML_Document_t *document) +{ + NW_ASSERT(document != NULL); + return document->charset; +} + + + + + + +