/*================================================================ * ixmlDocument_createTextNodeEx * Creates an text node. * External function. * Parameters: * data: text data for the text node. It is stored in nodeValue field. * Return Value: * IXML_SUCCESS * IXML_INVALID_PARAMETER: if either doc or data is NULL * IXML_INSUFFICIENT_MEMORY: if not enough memory to finish this operations. * *=================================================================*/ int ixmlDocument_createTextNodeEx( IN IXML_Document * doc, IN char *data, OUT IXML_Node ** textNode ) { IXML_Node *returnNode; int rc = IXML_SUCCESS; returnNode = NULL; //080903, JC, allow to create text node with NULL //if( ( doc == NULL ) || ( data == NULL ) ) { if( doc == NULL ) { rc = IXML_INVALID_PARAMETER; goto ErrorHandler; } returnNode = ( IXML_Node * ) malloc( sizeof( IXML_Node ) ); if( returnNode == NULL ) { rc = IXML_INSUFFICIENT_MEMORY; goto ErrorHandler; } // initialize the node ixmlNode_init( returnNode ); returnNode->nodeName = strdup( TEXTNODENAME ); if( returnNode->nodeName == NULL ) { ixmlNode_free( returnNode ); returnNode = NULL; rc = IXML_INSUFFICIENT_MEMORY; goto ErrorHandler; } // add in node value if( data != NULL ) { /* TODO: ok, here the data should be unescaped! */ returnNode->nodeValue = strdup( data ); /* */ if( returnNode->nodeValue == NULL ) { ixmlNode_free( returnNode ); returnNode = NULL; rc = IXML_INSUFFICIENT_MEMORY; goto ErrorHandler; } } returnNode->nodeType = eTEXT_NODE; returnNode->ownerDocument = doc; ErrorHandler: *textNode = returnNode; return rc; }
/*================================================================ * ixmlDocument_createTextNodeEx * Creates an text node. * External function. * Parameters: * data: text data for the text node. It is stored in nodeValue field. * Return Value: * IXML_SUCCESS * IXML_INVALID_PARAMETER: if either doc or data is NULL * IXML_INSUFFICIENT_MEMORY: if not enough memory to finish this operations. * *=================================================================*/ int ixmlDocument_createTextNodeEx( IN IXML_Document * doc, IN char *data, OUT IXML_Node ** textNode ) { IXML_Node *returnNode; int rc = IXML_SUCCESS; returnNode = NULL; if( ( doc == NULL ) || ( data == NULL ) ) { rc = IXML_INVALID_PARAMETER; goto ErrorHandler; } returnNode = ( IXML_Node * ) malloc( sizeof( IXML_Node ) ); if( returnNode == NULL ) { rc = IXML_INSUFFICIENT_MEMORY; goto ErrorHandler; } /* initialize the node */ ixmlNode_init( returnNode ); returnNode->nodeName = strdup( TEXTNODENAME ); if( returnNode->nodeName == NULL ) { ixmlNode_free( returnNode ); returnNode = NULL; rc = IXML_INSUFFICIENT_MEMORY; goto ErrorHandler; } /* add in node value */ if( data != NULL ) { returnNode->nodeValue = strdup( data ); if( returnNode->nodeValue == NULL ) { ixmlNode_free( returnNode ); returnNode = NULL; rc = IXML_INSUFFICIENT_MEMORY; goto ErrorHandler; } } returnNode->nodeType = eTEXT_NODE; returnNode->ownerDocument = doc; ErrorHandler: *textNode = returnNode; return rc; }
/*================================================================ * ixmlNode_cloneTextNode * Returns a clone of nodeptr * Internal to parser only. * *=================================================================*/ IXML_Node * ixmlNode_cloneTextNode( IN IXML_Node * nodeptr ) { IXML_Node *newNode = NULL; assert( nodeptr != NULL ); newNode = ( IXML_Node * ) ixml_malloc( sizeof( IXML_Node ) ); if( newNode == NULL ) { return NULL; } else { ixmlNode_init( newNode ); ixmlNode_setNodeName( newNode, nodeptr->nodeName ); ixmlNode_setNodeValue( newNode, nodeptr->nodeValue ); newNode->nodeType = eTEXT_NODE; } return newNode; }
/*! * \brief Return a clone of CDATASection node. * * \return A clone of CDATASection node. */ static IXML_CDATASection *ixmlNode_cloneCDATASect( /*! [in] The \b Node to clone. */ IXML_CDATASection *nodeptr) { IXML_CDATASection *newCDATA = NULL; IXML_Node *newNode; IXML_Node *srcNode; assert(nodeptr != NULL); newCDATA = (IXML_CDATASection *)malloc(sizeof (IXML_CDATASection)); if (newCDATA != NULL) { newNode = (IXML_Node *)newCDATA; ixmlNode_init(newNode); srcNode = (IXML_Node *)nodeptr; ixmlNode_setNodeName(newNode, srcNode->nodeName); ixmlNode_setNodeValue(newNode, srcNode->nodeValue); newNode->nodeType = eCDATA_SECTION_NODE; } return newCDATA; }
/*================================================================ * ixmlElement_setAttributeNS * Adds a new attribute. If an attribute with the same local name * and namespace URI is already present on the element, its prefix * is changed to be the prefix part of the qualifiedName, and its * value is changed to be the value parameter. This value is a * simple string. * External function. * * Parameter: * namespaceURI: the namespace of the attribute to create or alter. * qualifiedName: the qualified name of the attribute to create or alter. * value: the value to set in string form. * * Return Value: * IXML_SUCCESS or failure * *=================================================================*/ int ixmlElement_setAttributeNS( IN IXML_Element * element, IN DOMString namespaceURI, IN DOMString qualifiedName, IN DOMString value ) { IXML_Node *attrNode = NULL; IXML_Node newAttrNode; IXML_Attr *newAttr; int rc; if( ( element == NULL ) || ( namespaceURI == NULL ) || ( qualifiedName == NULL ) || ( value == NULL ) ) { return IXML_INVALID_PARAMETER; } if( Parser_isValidXmlName( qualifiedName ) == FALSE ) { return IXML_INVALID_CHARACTER_ERR; } ixmlNode_init( &newAttrNode ); #ifdef _UPNP_MM_ newAttrNode.nodeName = upnp_strdup( qualifiedName ); #else newAttrNode.nodeName = strdup( qualifiedName ); #endif if( newAttrNode.nodeName == NULL ) { return IXML_INSUFFICIENT_MEMORY; } rc = Parser_setNodePrefixAndLocalName( &newAttrNode ); if( rc != IXML_SUCCESS ) { Parser_freeNodeContent( &newAttrNode ); return rc; } // see DOM 2 spec page 59 if( ( newAttrNode.prefix != NULL && namespaceURI == NULL ) || ( strcmp( newAttrNode.prefix, "xml" ) == 0 && strcmp( namespaceURI, "http://www.w3.org/XML/1998/namespace" ) != 0 ) || ( strcmp( qualifiedName, "xmlns" ) == 0 && strcmp( namespaceURI, "http://www.w3.org/2000/xmlns/" ) != 0 ) ) { Parser_freeNodeContent( &newAttrNode ); return IXML_NAMESPACE_ERR; } attrNode = element->n.firstAttr; while( attrNode != NULL ) { if( strcmp( attrNode->localName, newAttrNode.localName ) == 0 && strcmp( attrNode->namespaceURI, namespaceURI ) == 0 ) { break; //found it } else { attrNode = attrNode->nextSibling; } } if( attrNode != NULL ) { if( attrNode->prefix != NULL ) { #ifdef _UPNP_MM_ upnp_free( attrNode->prefix ); // remove the old prefix #else free( attrNode->prefix ); // remove the old prefix #endif } // replace it with the new prefix #ifdef _UPNP_MM_ attrNode->prefix = upnp_strdup( newAttrNode.prefix ); #else attrNode->prefix = strdup( newAttrNode.prefix ); #endif if( attrNode->prefix == NULL ) { Parser_freeNodeContent( &newAttrNode ); return IXML_INSUFFICIENT_MEMORY; } if( attrNode->nodeValue != NULL ) { #ifdef _UPNP_MM_ upnp_free( attrNode->nodeValue ); #else free( attrNode->nodeValue ); #endif } #ifdef _UPNP_MM_ attrNode->nodeValue = upnp_strdup( value ); #else attrNode->nodeValue = strdup( value ); #endif if( attrNode->nodeValue == NULL ) { #ifdef _UPNP_MM_ upnp_free( attrNode->prefix ); #else free( attrNode->prefix ); #endif Parser_freeNodeContent( &newAttrNode ); return IXML_INSUFFICIENT_MEMORY; } } else { // add a new attribute rc = ixmlDocument_createAttributeNSEx( ( IXML_Document * ) element->n.ownerDocument, namespaceURI, qualifiedName, &newAttr ); if( rc != IXML_SUCCESS ) { return rc; } #ifdef _UPNP_MM_ newAttr->n.nodeValue = upnp_strdup( value ); #else newAttr->n.nodeValue = strdup( value ); #endif if( newAttr->n.nodeValue == NULL ) { ixmlAttr_free( newAttr ); return IXML_INSUFFICIENT_MEMORY; } if( ixmlElement_setAttributeNodeNS( element, newAttr, NULL ) != IXML_SUCCESS ) { ixmlAttr_free( newAttr ); return IXML_FAILED; } } Parser_freeNodeContent( &newAttrNode ); return IXML_SUCCESS; }
int ixmlElement_setAttributeNS( IXML_Element *element, const DOMString namespaceURI, const DOMString qualifiedName, const DOMString value) { IXML_Node *attrNode = NULL; IXML_Node newAttrNode; IXML_Attr *newAttr; int rc; if (element == NULL || namespaceURI == NULL || qualifiedName == NULL || value == NULL) { return IXML_INVALID_PARAMETER; } if (Parser_isValidXmlName(qualifiedName) == FALSE) { return IXML_INVALID_CHARACTER_ERR; } ixmlNode_init(&newAttrNode); newAttrNode.nodeName = strdup(qualifiedName); if (newAttrNode.nodeName == NULL) { return IXML_INSUFFICIENT_MEMORY; } rc = Parser_setNodePrefixAndLocalName(&newAttrNode); if (rc != IXML_SUCCESS) { Parser_freeNodeContent(&newAttrNode); return rc; } /* see DOM 2 spec page 59 */ if ((newAttrNode.prefix != NULL && namespaceURI == NULL) || (newAttrNode.prefix != NULL && strcmp(newAttrNode.prefix, "xml") == 0 && strcmp(namespaceURI, "http://www.w3.org/XML/1998/namespace") != 0) || (strcmp(qualifiedName, "xmlns") == 0 && strcmp(namespaceURI, "http://www.w3.org/2000/xmlns/") != 0)) { Parser_freeNodeContent( &newAttrNode ); return IXML_NAMESPACE_ERR; } attrNode = element->n.firstAttr; while (attrNode != NULL) { if (strcmp(attrNode->localName, newAttrNode.localName) == 0 && strcmp(attrNode->namespaceURI, namespaceURI) == 0) { /* Found it */ break; } else { attrNode = attrNode->nextSibling; } } if (attrNode != NULL) { if (attrNode->prefix != NULL) { /* Remove the old prefix */ free(attrNode->prefix); } /* replace it with the new prefix */ if (newAttrNode.prefix != NULL) { attrNode->prefix = strdup( newAttrNode.prefix ); if (attrNode->prefix == NULL) { Parser_freeNodeContent(&newAttrNode); return IXML_INSUFFICIENT_MEMORY; } } else attrNode->prefix = newAttrNode.prefix; if (attrNode->nodeValue != NULL) { free(attrNode->nodeValue); } attrNode->nodeValue = strdup(value); if (attrNode->nodeValue == NULL) { free(attrNode->prefix); Parser_freeNodeContent(&newAttrNode); return IXML_INSUFFICIENT_MEMORY; } } else { /* Add a new attribute */ rc = ixmlDocument_createAttributeNSEx( (IXML_Document *)element->n.ownerDocument, namespaceURI, qualifiedName, &newAttr); if (rc != IXML_SUCCESS) { Parser_freeNodeContent(&newAttrNode); return rc; } newAttr->n.nodeValue = strdup(value); if (newAttr->n.nodeValue == NULL) { ixmlAttr_free(newAttr); Parser_freeNodeContent(&newAttrNode); return IXML_INSUFFICIENT_MEMORY; } if (ixmlElement_setAttributeNodeNS(element, newAttr, &newAttr) != IXML_SUCCESS) { ixmlAttr_free(newAttr); Parser_freeNodeContent(&newAttrNode); return IXML_FAILED; } } Parser_freeNodeContent(&newAttrNode); return IXML_SUCCESS; }