diff -r 889504eac4fb -r 604ca70b6235 xml/cxmllibrary/src/dom/src/text.c --- a/xml/cxmllibrary/src/dom/src/text.c Tue Aug 31 17:02:56 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,646 +0,0 @@ -/* -* 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: -* -*/ - - -#include "cxml_internal.h" -#include -#include -#include - -/* - * Returns - * NW_STAT_DOM_NODE_TYPE_ERR - not a text node - * NW_STAT_SUCCESS - * - */ - -EXPORT_C NW_Status_t -NW_DOM_TextNode_getTextItemIterator(NW_DOM_TextNode_t *node, - NW_DOM_TextItemIterator_t *iterator) -{ - NW_TinyTree_t *tiny_tree; - - NW_ASSERT(node != NULL); - NW_ASSERT(iterator != NULL); - - if ((NW_DOM_Node_getNodeType(node) != NW_DOM_TEXT_NODE) - && (NW_DOM_Node_getNodeType(node) != NW_DOM_COMMENT_NODE) - && (NW_DOM_Node_getNodeType(node) != NW_DOM_CDATA_SECTION_NODE)) { - return NW_STAT_DOM_NODE_TYPE_ERR; - } - - tiny_tree = NW_TinyTree_Node_findTree(node); - NW_TinyDom_TextHandle_init(iterator, - NW_TinyDom_getParser(tiny_tree), - NW_TinyTree_Node_getSourceOffset(node)); - - return NW_STAT_SUCCESS; -} - -/* - * Returns - * NW_STAT_DOM_NODE_TYPE_ERR - not a text node - * NW_STAT_OUT_OF_MEMORY - unable to allocate memory for string storage - * NW_STAT_DOM_NO_STRING_RETURNED - If string storage is not assigned - * NW_STAT_SUCCESS - * - * MODIFIED valueString - the value of the node - */ - -EXPORT_C NW_Status_t -NW_DOM_TextNode_getData(NW_DOM_TextNode_t *node, - NW_String_t *valueString) -{ - NW_Status_t status; - NW_DOM_TextItemIterator_t iterator; - NW_String_t str; - NW_DOM_TextItem_t item; - NW_DOM_DocumentNode_t *docNode; - NW_Uint32 encoding; - - NW_ASSERT(node != NULL); - NW_ASSERT(valueString != NULL); - - docNode = NW_DOM_Node_getOwnerDocument(node); - encoding = NW_DOM_DocumentNode_getCharacterEncoding(docNode); - - if (NW_DOM_Node_getNodeType(node) != NW_DOM_TEXT_NODE){ - return NW_STAT_DOM_NODE_TYPE_ERR; - } - - /* Initializes the handle with values*/ - - status = NW_DOM_TextNode_getTextItemIterator(node, &iterator); - if (status != NW_STAT_SUCCESS){ - return status; - } - - valueString->length = 0; - valueString->storage = NULL; - NW_String_setUserOwnsStorage(valueString); - - while (NW_DOM_TextItemIterator_getNextTextItem(&iterator, &item) - == NW_STAT_WBXML_ITERATE_MORE){ - - status = NW_DOM_TextItem_toString(&item, &str, encoding); - - if (status != NW_STAT_SUCCESS){ - return status; - } - - if ((valueString->length == 0) || (valueString->storage == NULL)){ - status = NW_String_deepCopy(valueString, &str); - } - else{ - status = NW_String_concatenate(valueString, &str, encoding); - } - - if (status != NW_STAT_SUCCESS){ - NW_String_deleteStorage(&str); - if (status == NW_STAT_OUT_OF_MEMORY) - { - return NW_STAT_OUT_OF_MEMORY; - } - else - { - return NW_STAT_DOM_NO_STRING_RETURNED; - } - } - } - - NW_String_deleteStorage(&str); - return NW_STAT_SUCCESS; -} - - -/* - * This method creates a new TextNode and replaces the previous one - * Returns NW_STAT_BAD_INPUT_PARAM - * NW_STAT_SUCCESS - */ - -EXPORT_C NW_Status_t -NW_DOM_TextNode_setDataFromTextItem(NW_DOM_TextNode_t** node, - NW_DOM_TextItem_t *val) -{ - NW_DOM_Node_t *parent = NW_DOM_Node_getParentNode(*node); - NW_DOM_DocumentNode_t *doc = NW_DOM_Node_getOwnerDocument(*node); - NW_DOM_TextNode_t *newNode = NULL; - NW_Status_t status; - - if ((node == NULL) || (val == NULL) || (parent == NULL) || (doc == NULL)) - return NW_STAT_BAD_INPUT_PARAM; - - newNode = NW_DOM_DocumentNode_createTextNodeWithTextItem(doc, val); - if (newNode == NULL) - return NW_STAT_BAD_INPUT_PARAM; - - status = NW_DOM_Node_replaceChild(parent, newNode, *node); - if (status != NW_STAT_SUCCESS) - return status; - *node = newNode; - return NW_STAT_SUCCESS; -} - - -EXPORT_C NW_Status_t -NW_DOM_TextNode_addDataFromTextItem(NW_DOM_TextNode_t* node, - NW_DOM_TextItem_t *val) -{ - NW_TinyTree_t* tinyTree; - NW_TinyDom_Tree_t* domTree; - NW_DOM_DocumentNode_t *docNode; - NW_Uint32 encoding; - - if ((node == NULL) || (val == NULL)) - return NW_STAT_BAD_INPUT_PARAM; - - tinyTree = NW_TinyTree_Node_findTree(node); - docNode = NW_DOM_Node_getOwnerDocument(node); - if ((tinyTree == NULL) || (docNode == NULL)) { - return NW_STAT_FAILURE; - } - domTree = NW_TinyDom_getTree(tinyTree); - if (domTree == NULL) { - return NW_STAT_FAILURE; - } - encoding = NW_DOM_DocumentNode_getCharacterEncoding(docNode); - - return NW_TinyDom_addDataFromTextItem(tinyTree, domTree, node, - val, encoding); -} - -/* - * This method creates a new TextNode and replaces the previous one - * Returns - * Returns NW_STAT_BAD_INPUT_PARAM - * NW_STAT_SUCCESS - */ - -EXPORT_C NW_Status_t -NW_DOM_TextNode_setData(NW_DOM_TextNode_t** node, NW_String_t *val) -{ - NW_DOM_Node_t *parent = NW_DOM_Node_getParentNode(*node); - NW_DOM_DocumentNode_t *doc = NW_DOM_Node_getOwnerDocument(*node); - NW_DOM_TextNode_t *newNode = NULL; - NW_Status_t status; - - if ((node == NULL) || (val == NULL) || (parent == NULL) || (doc == NULL)) - return NW_STAT_BAD_INPUT_PARAM; - - newNode = NW_DOM_DocumentNode_createTextNode(doc, val); - - if (newNode == NULL){ - /* TBD is this correct? maybe it is out-of-memory? */ - return NW_STAT_BAD_INPUT_PARAM; - } - /* TBD replaceChild is buggy because it may return the child as the status! */ - status = NW_DOM_Node_replaceChild(parent, newNode, *node); - - if (status != NW_STAT_SUCCESS){ - return status; - } - /* TBD isn't there a memory leak when the old child is not deleted? */ - - *node = newNode; - return NW_STAT_SUCCESS; -} - - -/** - * TextItem methods - **/ - - -NW_DOM_TextItem_t * -NW_DOM_TextItem_new(void) -{ - return (NW_DOM_TextItem_t *) NW_Mem_Malloc(sizeof (NW_DOM_TextItem_t)); -} - -/* - * Initializes a Text Item of type NW_DOM_TEXT_ITEM_STRING - * Returns NW_STAT_SUCCESS - */ - -EXPORT_C NW_Status_t -NW_DOM_TextItem_initFromString (NW_DOM_TextItem_t *item, - NW_String_t * string) -{ - NW_ASSERT(item != NULL); - NW_ASSERT(string != NULL); - - item->type = NW_WBXML_ATTR_COMPONENT_STRING; - item->component.string = *string; - return NW_STAT_SUCCESS; -} - -/** - * Initializes a Text Item of type NW_DOM_TEXT_ITEM_ENTITY - * Returns NW_STAT_SUCCESS - */ - -EXPORT_C NW_Status_t -NW_DOM_TextItem_initFromEntity (NW_DOM_TextItem_t *item, NW_Uint32 entity) -{ - - NW_ASSERT(item != NULL); - - item->type = NW_WBXML_ATTR_COMPONENT_ENTITY; - item->component.entity = entity; - return NW_STAT_SUCCESS; -} - - -/* - Initializes a Text Item of type NW_DOM_TEXT_ITEM_EXTENSION - Returns NW_STAT_SUCCESS or NW_STAT_FAILURE if args are not valid. - - Makes a shallow copy of str. - */ -EXPORT_C NW_Status_t -NW_DOM_TextItem_initFromExtension (NW_DOM_TextItem_t *item, - NW_Uint16 token, - NW_String_t *str) -{ - /* Text items and AttrVals are nearly the same thing. */ - return NW_DOM_AttrVal_initFromExtension(item, token, str); -} - -/* - Initializes a Text Item of type NW_DOM_TEXT_ITEM_EXTENSION for the - particular case of EXT_T_[0,1,2] where the associated integer value - is not a reference into the string table. - - Returns NW_STAT_SUCCESS or NW_STAT_FAILURE if args are not valid. -*/ -EXPORT_C NW_Status_t -NW_DOM_TextItem_initFromExtensionInt (NW_DOM_TextItem_t *item, - NW_Uint16 token, - NW_Uint32 x) -{ - /* Text items and AttrVals are nearly the same thing. */ - return NW_DOM_AttrVal_initFromExtensionInt(item, token, x); -} - - -/* - * Initializes a Text Item of type NW_DOM_TEXT_ITEM_OPAQUE - * Returns NW_STAT_SUCCESS - */ - -EXPORT_C NW_Status_t -NW_DOM_TextItem_initFromOpaque (NW_DOM_TextItem_t *item, - NW_Uint32 length, - NW_Byte* data) -{ - NW_ASSERT(item != NULL); - NW_ASSERT(data != NULL); - - item->type = NW_WBXML_ATTR_COMPONENT_OPAQUE; - item->component.opaque.length = length; - item->component.opaque.data = data; - - return NW_STAT_SUCCESS; -} - - -NW_Status_t -NW_DOM_TextItem_delete(NW_DOM_TextItem_t *textItem) -{ - NW_ASSERT(textItem != NULL); - - NW_Mem_Free(textItem); - - return NW_STAT_SUCCESS; -} - -/* - * Returns the type of Text Item - */ - -EXPORT_C NW_DOM_TextItemType_t -NW_DOM_TextItem_getType(NW_DOM_TextItem_t *item) -{ - - NW_ASSERT(item != NULL); - - switch(item->type) - { - case NW_WBXML_ATTR_COMPONENT_EXT: - return NW_DOM_TEXT_ITEM_EXTENSION; - case NW_WBXML_ATTR_COMPONENT_STRING: - return NW_DOM_TEXT_ITEM_STRING; - case NW_WBXML_ATTR_COMPONENT_ENTITY: - return NW_DOM_TEXT_ITEM_ENTITY; - case NW_WBXML_ATTR_COMPONENT_OPAQUE: - return NW_DOM_TEXT_ITEM_OPAQUE; - default: - return 0; - } -} - -/* - * Sets the type of Text Item - */ - -/* TBD This is a very dangerous function and should be made internal - use only (i.e., static)! */ -NW_Status_t -NW_DOM_TextItem_setType(NW_DOM_TextItem_t *item, - NW_DOM_TextItemType_t type) -{ - NW_ASSERT(item != NULL); - - switch(type) - { - case NW_DOM_TEXT_ITEM_EXTENSION: - item->type = NW_WBXML_ATTR_COMPONENT_EXT; - break; - case NW_DOM_TEXT_ITEM_STRING: - item->type = NW_WBXML_ATTR_COMPONENT_STRING; - break; - case NW_DOM_TEXT_ITEM_OPAQUE: - item->type = NW_WBXML_ATTR_COMPONENT_OPAQUE; - break; - case NW_DOM_TEXT_ITEM_ENTITY: - item->type = NW_WBXML_ATTR_COMPONENT_ENTITY; - break; - default: - return NW_STAT_BAD_INPUT_PARAM; - } - return NW_STAT_SUCCESS; -} - -/* - * Returns - * NW_STAT_WBXML_ERROR_CHARSET_UNSUPPORTED - if encoding is not supported - * NW_STAT_DOM_NO_STRING_RETURNED - * NW_STAT_SUCCESS - * - * MODIFIED - string - the String representation of item - */ - -EXPORT_C NW_Status_t -NW_DOM_TextItem_toString(NW_DOM_TextItem_t *item, - NW_String_t *string, - NW_Uint32 encoding) -{ - NW_Status_t status; - - NW_ASSERT(item != NULL); - NW_ASSERT(string != NULL); - - NW_String_initialize(string, NULL, 0); - - if ((NW_String_charsetValid(encoding)) != NW_STAT_SUCCESS){ - return NW_STAT_WBXML_ERROR_CHARSET_UNSUPPORTED; - } - - switch (NW_DOM_TextItem_getType(item)) - { - case NW_DOM_TEXT_ITEM_STRING: - { - NW_Byte *storage = item->component.string.storage; - status = NW_String_initialize(string, storage, encoding); - if(status == NW_STAT_SUCCESS){ - return NW_STAT_SUCCESS; - } - else{ - return NW_STAT_DOM_NO_STRING_RETURNED; - } - } - case NW_DOM_TEXT_ITEM_ENTITY: - status = NW_String_entityToString(item->component.entity, - string, encoding); - if(status == NW_STAT_SUCCESS){ - return NW_STAT_SUCCESS; - } - else{ - return NW_STAT_DOM_NO_STRING_RETURNED; - } - - case NW_DOM_TEXT_ITEM_OPAQUE: - return NW_STAT_DOM_NO_STRING_RETURNED; - case NW_DOM_TEXT_ITEM_EXTENSION: - { - NW_Uint8 t; /* 8-bit token */ - - t = (NW_Uint8)(item->component.ext.token); - if ((t == NW_WBXML_EXT_0) - || (t == NW_WBXML_EXT_1) - || (t == NW_WBXML_EXT_2)) { - return NW_STAT_DOM_NO_STRING_RETURNED; - } - if ((item->component.ext.type - == NW_TINYDOM_EXTENSION_TYPE_EXT_T_INTEGER) - && ((t == NW_WBXML_EXT_T_0) - || (t == NW_WBXML_EXT_T_1) - || (t == NW_WBXML_EXT_T_2))) { - return NW_STAT_DOM_NO_STRING_RETURNED; - } - if (item->component.ext.value.string.storage == NULL) { - return NW_STAT_DOM_NO_STRING_RETURNED; - } - /* struct assignment, shallow copy */ - *string = item->component.ext.value.string; - return NW_STAT_SUCCESS; - } - default: - return NW_STAT_DOM_NO_STRING_RETURNED; - } -} - - -EXPORT_C NW_Uint32 -NW_DOM_TextItem_getEntity(NW_DOM_TextItem_t *item) -{ - NW_ASSERT(item != NULL); - - if (NW_DOM_TextItem_getType(item) != NW_DOM_TEXT_ITEM_ENTITY){ - return 0; - } - - return item->component.entity; -} - -/* - * If TextItem is of type NW_DOM_TEXT_ITEM_STRING returns NW_STAT_SUCCESS - * and modifies string. - */ - -EXPORT_C NW_Status_t -NW_DOM_TextItem_getString(NW_DOM_TextItem_t *item, - NW_String_t *string) -{ - NW_ASSERT(item != NULL); - NW_ASSERT(string != NULL); - - if (NW_DOM_TextItem_getType(item) != NW_DOM_TEXT_ITEM_STRING){ - return NW_STAT_BAD_INPUT_PARAM; - } - - return NW_String_copy(string, &item->component.string); -} - -EXPORT_C NW_Status_t -NW_DOM_TextItem_getExtensionToken(NW_DOM_TextItem_t* pItem, - NW_Uint16* pX) -{ - /* Text items and AttrVals are nearly the same thing. */ - return NW_DOM_AttrVal_getExtensionToken(pItem, pX); -} - -/* If TextItem is of type NW_DOM_TEXT_ITEM_EXTENSION and extension - isn't EXT_T_[0,1,2] in non string table reference form, returns token - otherwise returns 0 and returns str->length = 0, str->storage = NULL. - - All returned strings are shallow copies and the only proper way to - free these is to call NW_String_delete(pStr). */ -EXPORT_C NW_Uint16 -NW_DOM_TextItem_getExtension(NW_DOM_TextItem_t *item, - NW_String_t *str) -{ - NW_Uint16 fqToken; - NW_Uint8 t; /* 8-bit token */ - - NW_ASSERT(item != NULL); - NW_ASSERT(str != NULL); - - NW_String_initialize(str, NULL, 0); - - if (NW_DOM_TextItem_getType(item) != NW_DOM_TEXT_ITEM_EXTENSION) { - return 0; - } - - /* TBD If it could be gauranteed that the extension was constructed - correctly then it would be enough to just unconditionally - shallowCopy. */ - - fqToken = (NW_Uint16)(item->component.ext.token); - t = (NW_Uint8)fqToken; - - if (((t == NW_WBXML_EXT_T_0) - || (t == NW_WBXML_EXT_T_1) - || (t == NW_WBXML_EXT_T_2)) - && (item->component.ext.type - == NW_TINYDOM_EXTENSION_TYPE_EXT_T_INTEGER)) { - /* This function is not for this case: use "getExtensionInt" form. */ - return 0; - } - - if ((t != NW_WBXML_EXT_0) && (t != NW_WBXML_EXT_1) && (t != NW_WBXML_EXT_2)) { - /* By fiat we do nothing with the single byte extension tokens. A - more correct version might be to callback to the client to - request a mapping to a client determined string. - - In the normal case where EXT_T refers to the string table, both - the EXT_T and EXT_I forms are represented by an explicit pointer - to the string value since for the EXT_T form we don't have a - pointer to the string table anyway. */ - NW_String_shallowCopy(str, &item->component.ext.value.string); - } - return fqToken; -} - -EXPORT_C NW_Status_t -NW_DOM_TextItem_getExtensionInt(NW_DOM_TextItem_t* item, - NW_Uint32* x) -{ - NW_Uint16 fqToken; - NW_Uint8 t; /* 8-bit token */ - - NW_ASSERT(item != NULL); - NW_ASSERT(x != NULL); - - if ((NW_DOM_TextItem_getType(item) != NW_DOM_TEXT_ITEM_EXTENSION) - || ((item->component.ext.type - != NW_TINYDOM_EXTENSION_TYPE_EXT_T_INTEGER))) - { - return NW_STAT_FAILURE; - } - - fqToken = (NW_Uint16)(item->component.ext.token); - t = (NW_Uint8)fqToken; - if ((t == NW_WBXML_EXT_T_0) - || (t == NW_WBXML_EXT_T_1) - || (t == NW_WBXML_EXT_T_2)) { - *x = item->component.ext.value.x; - return NW_STAT_SUCCESS; - } - return NW_STAT_FAILURE; -} - -EXPORT_C NW_Byte * -NW_DOM_TextItem_getOpaque(NW_DOM_TextItem_t *item, - NW_Uint32 *opaqueLen) -{ - NW_ASSERT(item != NULL); - - if (NW_DOM_TextItem_getType(item) != NW_DOM_TEXT_ITEM_OPAQUE){ - return NULL; - } - - *opaqueLen = item->component.opaque.length; - return item->component.opaque.data; -} - - -/* - * TEXT NODE HANDLE - */ - -NW_DOM_TextItemIterator_t * -NW_DOM_TextItemIterator_new(void) -{ - return (NW_DOM_TextItemIterator_t *) - NW_Mem_Malloc(sizeof (NW_DOM_TextItemIterator_t)); -} - - -NW_Status_t -NW_DOM_TextItemIterator_delete(NW_DOM_TextItemIterator_t *handle) -{ - NW_ASSERT(handle != NULL); - - NW_Mem_Free (handle); - - return NW_STAT_SUCCESS; -} - -/* - * Returns NW_STAT_WBXML_ITERATE_MORE - * NW_STAT_WBXML_ITERATE_DONE - * - * MODIFIED textItem - */ - -EXPORT_C NW_Status_t -NW_DOM_TextItemIterator_getNextTextItem(NW_DOM_TextItemIterator_t *handle, - NW_DOM_TextItem_t *textItem) -{ - NW_TinyTree_Offset_t offset; - - NW_ASSERT(handle != NULL); - NW_ASSERT(textItem != NULL); - - offset = NW_TinyDom_TextHandle_iterate(handle, textItem); - if (offset == 0){ - return NW_STAT_WBXML_ITERATE_DONE; - } - return NW_STAT_WBXML_ITERATE_MORE; -}