/* ***************************************************************************** ** FUNCTION NAME: createElementTextNode ** ** FUNCTION INPUTS: ** @IXML_Element *parentElement: parent element ** @char *name: tag name ** @char *value: tag value ** ** FUNCTION DESCRIPTION ** This function will create element with name and value, and add to parent ** element. ** ** FUNCTION OUTPUTS: ** Returns IXML_Element pointer when success,on NULL on failed. ** ** HISTORY: ** 2008-7-2 Steven Leong Created ***************************************************************************** */ IXML_Element* createElementTextNode(IXML_Element *parentElement, char *name, char *value) { IXML_Element *element = NULL; IXML_Node *node = NULL; element = ixmlDocument_createElement(parentElement->n.ownerDocument, name); if(element == NULL){ return NULL; } if(value != NULL){ node = ixmlDocument_createTextNode(parentElement->n.ownerDocument, value); if(node == NULL){ ixmlElement_free(element); return NULL; } if(ixmlNode_appendChild((IXML_Node *)element, node) != IXML_SUCCESS){ ixmlElement_free(element); ixmlNode_free(node); return NULL; } } if(ixmlNode_appendChild((IXML_Node *)parentElement,(IXML_Node *)element)!=IXML_SUCCESS){ ixmlElement_free(element); return NULL; } return element; }
int ixmlDocument_createElementNSEx( IXML_Document *doc, const DOMString namespaceURI, const DOMString qualifiedName, IXML_Element **rtElement) { IXML_Element *newElement = NULL; int ret = IXML_SUCCESS; int line = 0; if (doc == NULL || namespaceURI == NULL || qualifiedName == NULL) { line = __LINE__; ret = IXML_INVALID_PARAMETER; goto ErrorHandler; } ret = ixmlDocument_createElementEx(doc, qualifiedName, &newElement); if (ret != IXML_SUCCESS) { line = __LINE__; goto ErrorHandler; } /* set the namespaceURI field */ newElement->n.namespaceURI = _strdup(namespaceURI); if (newElement->n.namespaceURI == NULL) { line = __LINE__; ixmlElement_free(newElement); newElement = NULL; ret = IXML_INSUFFICIENT_MEMORY; goto ErrorHandler; } /* set the localName and prefix */ ret = ixmlNode_setNodeName((IXML_Node *)newElement, qualifiedName); if (ret != IXML_SUCCESS) { line = __LINE__; ixmlElement_free(newElement); newElement = NULL; ret = IXML_INSUFFICIENT_MEMORY; goto ErrorHandler; } newElement->n.nodeValue = NULL; ErrorHandler: *rtElement = newElement; if (ret != IXML_SUCCESS) { IxmlPrintf(__FILE__, line, "ixmlDocument_createElementNSEx", "Error %d\n", ret); } return ret; }
/*================================================================ * ixmlDocument_createElementNSEx * Creates an element of the given qualified name and namespace URI. * External function. * Parameters: * namespaceURI: the namespace URI of the element to create. * qualifiedName: the qualified name of the element to instantiate. * Return Value: * Return Value: * IXML_SUCCESS * IXML_INVALID_PARAMETER: if either doc,namespaceURI or qualifiedName is NULL * IXML_INSUFFICIENT_MEMORY: if not enough memory to finish this operations. * *=================================================================*/ int ixmlDocument_createElementNSEx( IN IXML_Document * doc, IN DOMString namespaceURI, IN DOMString qualifiedName, OUT IXML_Element ** rtElement ) { IXML_Element *newElement = NULL; int errCode = IXML_SUCCESS; if( ( doc == NULL ) || ( namespaceURI == NULL ) || ( qualifiedName == NULL ) ) { errCode = IXML_INVALID_PARAMETER; goto ErrorHandler; } errCode = ixmlDocument_createElementEx( doc, qualifiedName, &newElement ); if( errCode != IXML_SUCCESS ) { goto ErrorHandler; } /* set the namespaceURI field */ newElement->n.namespaceURI = strdup( namespaceURI ); if( newElement->n.namespaceURI == NULL ) { ixmlElement_free( newElement ); newElement = NULL; errCode = IXML_INSUFFICIENT_MEMORY; goto ErrorHandler; } /* set the localName and prefix */ errCode = ixmlNode_setNodeName( ( IXML_Node * ) newElement, qualifiedName ); if( errCode != IXML_SUCCESS ) { ixmlElement_free( newElement ); newElement = NULL; errCode = IXML_INSUFFICIENT_MEMORY; goto ErrorHandler; } newElement->n.nodeValue = NULL; ErrorHandler: *rtElement = newElement; return errCode; }
/*================================================================ * ixmlDocument_createElementEx * Creates an element of the type specified. * External function. * Parameters: * doc: pointer to document * tagName: The name of the element, it is case-sensitive. * Return Value: * IXML_SUCCESS * IXML_INVALID_PARAMETER: if either doc or tagName is NULL * IXML_INSUFFICIENT_MEMORY: if not enough memory to finish this operations. * *=================================================================*/ int ixmlDocument_createElementEx( IN IXML_Document * doc, IN DOMString tagName, OUT IXML_Element ** rtElement ) { int errCode = IXML_SUCCESS; IXML_Element *newElement = NULL; if( ( doc == NULL ) || ( tagName == NULL ) ) { errCode = IXML_INVALID_PARAMETER; goto ErrorHandler; } newElement = ( IXML_Element * ) malloc( sizeof( IXML_Element ) ); if( newElement == NULL ) { errCode = IXML_INSUFFICIENT_MEMORY; goto ErrorHandler; } ixmlElement_init( newElement ); newElement->tagName = strdup( tagName ); if( newElement->tagName == NULL ) { ixmlElement_free( newElement ); newElement = NULL; errCode = IXML_INSUFFICIENT_MEMORY; goto ErrorHandler; } /* set the node fields */ newElement->n.nodeType = eELEMENT_NODE; newElement->n.nodeName = strdup( tagName ); if( newElement->n.nodeName == NULL ) { ixmlElement_free( newElement ); newElement = NULL; errCode = IXML_INSUFFICIENT_MEMORY; goto ErrorHandler; } newElement->n.ownerDocument = doc; ErrorHandler: *rtElement = newElement; return errCode; }
/****************************************************************************** * DestroyObject * * Description: * DIDL Object destructor, automatically called by "talloc_free". * *****************************************************************************/ static int DestroyObject (DIDLObject* const o) { if (o) { ixmlElement_free (o->element); // The "talloc'ed" strings will be deleted automatically } return 0; // ok -> deallocate memory }
/*================================================================ * ixmlNode_cloneElement * returns a clone of element node * Internal to parser only. * *=================================================================*/ IXML_Element * ixmlNode_cloneElement( IN IXML_Element * nodeptr ) { IXML_Element *newElement; IXML_Node *elementNode; IXML_Node *srcNode; int rc; assert( nodeptr != NULL ); newElement = ( IXML_Element * ) malloc( sizeof( IXML_Element ) ); if( newElement == NULL ) { return NULL; } ixmlElement_init( newElement ); rc = ixmlElement_setTagName( newElement, nodeptr->tagName ); if( rc != IXML_SUCCESS ) { ixmlElement_free( newElement ); return NULL; } elementNode = ( IXML_Node * ) newElement; srcNode = ( IXML_Node * ) nodeptr; rc = ixmlNode_setNodeName( elementNode, srcNode->nodeName ); if( rc != IXML_SUCCESS ) { ixmlElement_free( newElement ); return NULL; } rc = ixmlNode_setNodeValue( elementNode, srcNode->nodeValue ); if( rc != IXML_SUCCESS ) { ixmlElement_free( newElement ); return NULL; } rc = ixmlNode_setNamespaceURI( elementNode, srcNode->namespaceURI ); if( rc != IXML_SUCCESS ) { ixmlElement_free( newElement ); return NULL; } rc = ixmlNode_setPrefix( elementNode, srcNode->prefix ); if( rc != IXML_SUCCESS ) { ixmlElement_free( newElement ); return NULL; } rc = ixmlNode_setLocalName( elementNode, srcNode->localName ); if( rc != IXML_SUCCESS ) { ixmlElement_free( newElement ); return NULL; } elementNode->nodeType = eELEMENT_NODE; return newElement; }
void rtpxmlElement_free(RTPXML_Element* element) { ixmlElement_free((IXML_Element *) element); }
int WriteID3Tag(char *ptrPath,ZDB_METATRACK *trackMeta) { IXML_Document *dom = NULL; IXML_Element *elementCmd = NULL; IXML_Element *element = NULL; IXML_Node *node = NULL; char *ptrXml = NULL; char *result = NULL; if((dom = ixmlDocument_createDocument()) == NULL) return ZAPP_FAILED; /*cmd node*/ if((elementCmd = ixmlDocument_createElement(dom, "cmd")) == NULL) goto errOut; /*op = WriteMetadata*/ ixmlElement_setAttribute(elementCmd,"op","WriteMetadata"); ixmlNode_appendChild(&dom->n, (IXML_Node *)elementCmd); //FileName node if((element = ixmlDocument_createElement(dom, "FileName")) == NULL) goto errOut; if((node = ixmlDocument_createTextNode(dom, ptrPath)) == NULL) { ixmlElement_free(element); goto errOut; } ixmlNode_appendChild((IXML_Node *)element, node); ixmlNode_appendChild((IXML_Node *)elementCmd, (IXML_Node *)element); //artFile node if((element = ixmlDocument_createElement(dom, "artFile")) == NULL) goto errOut; if((node = ixmlDocument_createTextNode(dom, trackMeta->albumArtURI)) == NULL) { ixmlElement_free(element); goto errOut; } ixmlNode_appendChild((IXML_Node *)element, node); ixmlNode_appendChild((IXML_Node *)elementCmd, (IXML_Node *)element); //title node if((element = ixmlDocument_createElement(dom, "title")) == NULL) goto errOut; if((node = ixmlDocument_createTextNode(dom, trackMeta->trackTitle)) == NULL) { ixmlElement_free(element); goto errOut; } ixmlNode_appendChild((IXML_Node *)element, node); ixmlNode_appendChild((IXML_Node *)elementCmd, (IXML_Node *)element); //album node if((element = ixmlDocument_createElement(dom, "album")) == NULL) goto errOut; if((node = ixmlDocument_createTextNode(dom, trackMeta->albumname)) == NULL) { ixmlElement_free(element); goto errOut; } ixmlNode_appendChild((IXML_Node *)element, node); ixmlNode_appendChild((IXML_Node *)elementCmd, (IXML_Node *)element); //artistname node if((element = ixmlDocument_createElement(dom, "artist")) == NULL) goto errOut; if((node = ixmlDocument_createTextNode(dom, trackMeta->artistname)) == NULL) { ixmlElement_free(element); goto errOut; } ixmlNode_appendChild((IXML_Node *)element, node); ixmlNode_appendChild((IXML_Node *)elementCmd, (IXML_Node *)element); //genre node if((element = ixmlDocument_createElement(dom, "genre")) == NULL) goto errOut; if((node = ixmlDocument_createTextNode(dom, trackMeta->genrename)) == NULL) { ixmlElement_free(element); goto errOut; } ixmlNode_appendChild((IXML_Node *)element, node); ixmlNode_appendChild((IXML_Node *)elementCmd, (IXML_Node *)element); //year node if((element = ixmlDocument_createElement(dom, "year")) == NULL) goto errOut; if((node = ixmlDocument_createTextNode(dom, trackMeta->releaseDate)) == NULL) { ixmlElement_free(element); goto errOut; } ixmlNode_appendChild((IXML_Node *)element, node); ixmlNode_appendChild((IXML_Node *)elementCmd, (IXML_Node *)element); //trackNum node if((element = ixmlDocument_createElement(dom, "trackNum")) == NULL) goto errOut; if((node = ixmlDocument_createTextNode(dom, trackMeta->trackNo)) == NULL) { ixmlElement_free(element); goto errOut; } ixmlNode_appendChild((IXML_Node *)element, node); ixmlNode_appendChild((IXML_Node *)elementCmd, (IXML_Node *)element); ptrXml = ixmlPrintDocument(dom); result = Call3rdPartyCommand("zxtract", ptrXml, strlen(ptrXml),32); errOut: if(result) { free(result); } ixmlDocument_free(dom); if(ptrXml != NULL) { free(ptrXml); } return ZAPP_SUCCESS; }
/************************************************************************ * Function : config_description_doc * * Parameters : * INOUT IXML_Document *doc ;IMXL description document to be * configured * IN const char* ip_str ; string containing the IP port number * OUT char** root_path_str ; buffer to hold the root path * of the configured description document * INOUT IXML_Document *doc : Description document * IN const char* ip_str : ipaddress string * OUT char** root_path_str : root path string * * Description : Configure the description document. Add the standard * format and then add information from the root device and any * child nodes. * * Return : int ; * UPNP_E_SUCCESS - On Success * UPNP_E_OUTOF_MEMORY - Default Error * UPNP_E_INVALID_DESC - Invalid child node * UPNP_E_INVALID_URL - Invalid node information * * Note : ************************************************************************/ static int config_description_doc( INOUT IXML_Document * doc, IN const char *ip_str, OUT char **root_path_str ) { xboolean addNew = FALSE; IXML_NodeList *baseList; IXML_Element *element = NULL; IXML_Element *newElement = NULL; IXML_Node *textNode = NULL; IXML_Node *rootNode = NULL; IXML_Node *urlbase_node = NULL; char *urlBaseStr = "URLBase"; const DOMString domStr = NULL; uri_type uri; int err_code; int len; membuffer url_str; membuffer root_path; membuffer_init( &url_str ); membuffer_init( &root_path ); err_code = UPNP_E_OUTOF_MEMORY; // default error baseList = ixmlDocument_getElementsByTagName( doc, urlBaseStr ); if( baseList == NULL ) { // urlbase not found -- create new one addNew = TRUE; element = ixmlDocument_createElement( doc, urlBaseStr ); if( element == NULL ) { goto error_handler; } if( membuffer_append_str( &url_str, "http://" ) != 0 || membuffer_append_str( &url_str, ip_str ) != 0 || membuffer_append_str( &url_str, "/" ) != 0 || membuffer_append_str( &root_path, "/" ) != 0 ) { goto error_handler; } rootNode = ixmlNode_getFirstChild( ( IXML_Node * ) doc ); if( rootNode == NULL ) { err_code = UPNP_E_INVALID_DESC; goto error_handler; } err_code = ixmlNode_appendChild( rootNode, ( IXML_Node * ) element ); if( err_code != IXML_SUCCESS ) { goto error_handler; } textNode = ixmlDocument_createTextNode( doc, ( char * )url_str.buf ); if( textNode == NULL ) { goto error_handler; } err_code = ixmlNode_appendChild( ( IXML_Node * ) element, textNode ); if( err_code != IXML_SUCCESS ) { goto error_handler; } } else { // urlbase found urlbase_node = ixmlNodeList_item( baseList, 0 ); assert( urlbase_node != NULL ); textNode = ixmlNode_getFirstChild( urlbase_node ); if( textNode == NULL ) { err_code = UPNP_E_INVALID_DESC; goto error_handler; } domStr = ixmlNode_getNodeValue( textNode ); if( domStr == NULL ) { err_code = UPNP_E_INVALID_URL; goto error_handler; } len = parse_uri( domStr, strlen( domStr ), &uri ); if( len < 0 || uri.type != ABSOLUTE ) { err_code = UPNP_E_INVALID_URL; goto error_handler; } if( membuffer_assign( &url_str, uri.scheme.buff, uri.scheme.size ) != 0 || membuffer_append_str( &url_str, "://" ) != 0 || membuffer_append_str( &url_str, ip_str ) != 0 ) { goto error_handler; } // add leading '/' if missing from relative path if( ( uri.pathquery.size > 0 && uri.pathquery.buff[0] != '/' ) || ( uri.pathquery.size == 0 ) ) { if( membuffer_append_str( &url_str, "/" ) != 0 || membuffer_append_str( &root_path, "/" ) != 0 ) { goto error_handler; } } if( membuffer_append( &url_str, uri.pathquery.buff, uri.pathquery.size ) != 0 || membuffer_append( &root_path, uri.pathquery.buff, uri.pathquery.size ) != 0 ) { goto error_handler; } // add trailing '/' if missing if( url_str.buf[url_str.length - 1] != '/' ) { if( membuffer_append( &url_str, "/", 1 ) != 0 ) { goto error_handler; } } err_code = ixmlNode_setNodeValue( textNode, url_str.buf ); if( err_code != IXML_SUCCESS ) { goto error_handler; } } *root_path_str = membuffer_detach( &root_path ); // return path err_code = UPNP_E_SUCCESS; error_handler: if( err_code != UPNP_E_SUCCESS ) { ixmlElement_free( newElement ); } ixmlNodeList_free( baseList ); membuffer_destroy( &root_path ); membuffer_destroy( &url_str ); return err_code; }
int xmldb_putDeviceReference(IXML_Element* deviceData) { IXML_Element* devices = ixmlNode_convertToElement( getNodeByHref(_storage, DEVICE_LIST_URI, NULL)); if (devices == NULL) { // database failure log_error("Unable to find device list in the storage."); return -1; } //TODO check that there are no links with such address yet // create new <ref/> object and copy 'href', 'name', 'display' and // 'displayName' attributes to it IXML_Element* ref = ixmlElement_createChildElementWithLog(devices, OBIX_OBJ_REF); if (ref == NULL) { log_error("Unable to add new reference to the device list."); return -1; } // copy attribute uri int error = ixmlElement_copyAttributeWithLog(deviceData, ref, OBIX_ATTR_HREF, TRUE); if (error != IXML_SUCCESS) { ixmlElement_free(ref); return -1; } // copy attribute name error = ixmlElement_copyAttributeWithLog(deviceData, ref, OBIX_ATTR_NAME, FALSE); if ((error != IXML_SUCCESS) && (error != IXML_NOT_FOUND_ERR)) { ixmlElement_free(ref); return -1; } // copy optional attribute display error = ixmlElement_copyAttributeWithLog(deviceData, ref, OBIX_ATTR_DISPLAY, FALSE); if ((error != IXML_SUCCESS) && (error != IXML_NOT_FOUND_ERR)) { ixmlElement_free(ref); return -1; } // copy optional attribute displayName error = ixmlElement_copyAttributeWithLog(deviceData, ref, OBIX_ATTR_DISPLAY_NAME, FALSE); if ((error != IXML_SUCCESS) && (error != IXML_NOT_FOUND_ERR)) { ixmlElement_free(ref); return -1; } return 0; }