--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/xml/cxmllibrary/src/dom/src/text.c Tue Aug 31 17:02:56 2010 +0300
@@ -0,0 +1,646 @@
+/*
+* 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 <xml/cxml/nw_tinytree.h>
+#include <xml/cxml/nw_dom_text.h>
+#include <xml/cxml/nw_dom_document.h>
+
+/*
+ * 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;
+}