/* ***************************************************************************** ** FUNCTION NAME: ResponseCMD ** ** FUNCTION INPUTS: ** @char *objID: object ID ** ** FUNCTION DESCRIPTION ** This function will create response xml string without error ** ** FUNCTION OUTPUTS: ** Returns ZAPP_SUCCESS on success, or ZAPP_FAILED on failed. ** ** HISTORY: ** 2008-7-2 Steven Leong Created ***************************************************************************** */ int ResponseCMD(char *objID) { IXML_Document *dom = NULL; IXML_Element *element = NULL; char *ptrXml = NULL; /* Package response xml */ if((dom = ixmlDocument_createDocument()) == NULL) return ZAPP_FAILED; //ret node if((element = ixmlDocument_createElement(dom,"ret")) == NULL) goto errOut; ixmlNode_appendChild(&dom->n, (IXML_Node *)element); //err node if(createElementTextNode(element,"err","0") == NULL) goto errOut; //msg node if(createElementTextNode(element,"msg","") == NULL) goto errOut; //category node if(createElementTextNode(element,"objID", objID) == NULL) goto errOut; ptrXml = ixmlPrintDocument(dom); ZRipResponse(ptrXml); ZFREE(ptrXml); ixmlDocument_free(dom); return ZAPP_SUCCESS; errOut: ixmlDocument_free(dom); return ZAPP_FAILED; }
int main (int argc, char* argv[]) { int i; if (argc < 2) { fprintf (stderr, "Usage: %s [xml files to load]\n", argv[0]); exit (EXIT_FAILURE); } for (i = 1; i < argc; i++) { int rc; IXML_Document* doc = NULL; DOMString s; char* p; printf ("Test \"%s\" \n", argv[i]); printf (" Loading ... "); fflush (stdout); rc = ixmlLoadDocumentEx (argv[i], &doc); if (rc != IXML_SUCCESS) { fprintf (stderr, "** error : can't load document %s : " "error %d (%s)\n", argv[i], rc, get_ixml_error_string (rc)); exit (EXIT_FAILURE); } printf ("OK\n"); printf (" Printing ... "); fflush (stdout); s = ixmlPrintDocument (doc); if (s == NULL || s[0] == '\0') { fprintf (stderr, "** error : can't print loaded document %s\n", argv[i]); exit (EXIT_FAILURE); } p = s + strlen(s)-1; while (isspace(*p) && p > s) p--; if (*s != '<' || *p != '>') { fprintf (stderr, "** error : malformed printed document '%s' :" "%s\n", argv[i], s); exit (EXIT_FAILURE); } printf ("OK\n"); ixmlFreeDOMString (s); ixmlDocument_free (doc); } exit (EXIT_SUCCESS); }
/************************************************************************ * Function : configure_urlbase * * Parameters : * INOUT IXML_Document *doc ; IXML Description document * IN const struct sockaddr_in* serverAddr ; socket address object * providing the IP address and port information * IN const char* alias ; string containing the alias * IN time_t last_modified ; time when the XML document was * downloaded * OUT char docURL[LINE_SIZE] ; buffer to hold the URL of the * document. * INOUT IXML_Document *doc:dom document whose urlbase is to be modified * IN const struct sockaddr_in* serverAddr : ip address and port of * the miniserver * IN const char* alias : a name to be used for the temp; e.g.:"foo.xml" * IN time_t last_modified : time * OUT char docURL[LINE_SIZE] : document URL * * Description : Configure the full URL for the description document. * Create the URL document and add alias, description information. * The doc is added to the web server to be served using the given * alias. * * Return : int ; * UPNP_E_SUCCESS - On Success * UPNP_E_OUTOF_MEMORY - Default Error * * Note : ************************************************************************/ int configure_urlbase( INOUT IXML_Document * doc, IN const struct sockaddr_in *serverAddr, IN const char *alias, IN time_t last_modified, OUT char docURL[LINE_SIZE] ) { char *root_path = NULL; char *new_alias = NULL; char *xml_str = NULL; int err_code; char ipaddr_port[LINE_SIZE]; err_code = UPNP_E_OUTOF_MEMORY; // default error // get IP address and port addrToString( serverAddr, ipaddr_port ); // config url-base in 'doc' err_code = config_description_doc( doc, ipaddr_port, &root_path ); if( err_code != UPNP_E_SUCCESS ) { goto error_handler; } // calc alias err_code = calc_alias( alias, root_path, &new_alias ); if( err_code != UPNP_E_SUCCESS ) { goto error_handler; } // calc full url for desc doc err_code = calc_descURL( ipaddr_port, new_alias, docURL ); if( err_code != UPNP_E_SUCCESS ) { goto error_handler; } // xml doc to str xml_str = ixmlPrintDocument( doc ); if( xml_str == NULL ) { goto error_handler; } UpnpPrintf( UPNP_INFO, API, __FILE__, __LINE__, "desc url: %s\n", docURL ); UpnpPrintf( UPNP_INFO, API, __FILE__, __LINE__, "doc = %s\n", xml_str ); // store in web server err_code = web_server_set_alias( new_alias, xml_str, strlen( xml_str ), last_modified ); error_handler: free( root_path ); free( new_alias ); if( err_code != UPNP_E_SUCCESS ) { ixmlFreeDOMString( xml_str ); } return err_code; }
/* * Fetches and parses the UPNP response */ bool MediaServer::fetchContents() { IXML_Document* p_response = _browseAction( m_psz_objectId, "BrowseDirectChildren", "*", // Some servers don't understand "0" as "no-limit" "1000", /* RequestedCount */ "" /* SortCriteria */ ); if ( !p_response ) { msg_Err( m_access, "No response from browse() action" ); return false; } IXML_Document* p_result = parseBrowseResult( p_response ); ixmlDocument_free( p_response ); if ( !p_result ) { msg_Err( m_access, "browse() response parsing failed" ); return false; } #ifndef NDEBUG msg_Dbg( m_access, "Got DIDL document: %s", ixmlPrintDocument( p_result ) ); #endif IXML_NodeList* containerNodeList = ixmlDocument_getElementsByTagName( p_result, "container" ); if ( containerNodeList ) { for ( unsigned int i = 0; i < ixmlNodeList_length( containerNodeList ); i++ ) addContainer( (IXML_Element*)ixmlNodeList_item( containerNodeList, i ) ); ixmlNodeList_free( containerNodeList ); } IXML_NodeList* itemNodeList = ixmlDocument_getElementsByTagName( p_result, "item" ); if ( itemNodeList ) { for ( unsigned int i = 0; i < ixmlNodeList_length( itemNodeList ); i++ ) addItem( (IXML_Element*)ixmlNodeList_item( itemNodeList, i ) ); ixmlNodeList_free( itemNodeList ); } ixmlDocument_free( p_result ); return true; }
/* * Fetches and parses the UPNP response */ void MediaServer::fetchContents() { const char* objectID = ""; vlc_url_t url; vlc_UrlParse( &url, access_->psz_location, '?'); if ( url.psz_option && !strncmp( url.psz_option, "ObjectID=", strlen( "ObjectID=" ) ) ) { objectID = &url.psz_option[strlen( "ObjectID=" )]; } IXML_Document* p_response = _browseAction( objectID, "BrowseDirectChildren", "id,dc:title,res," /* Filter */ "sec:CaptionInfo,sec:CaptionInfoEx," "pv:subtitlefile", "0", /* RequestedCount */ "" /* SortCriteria */ ); vlc_UrlClean( &url ); if ( !p_response ) { msg_Err( access_, "No response from browse() action" ); return; } xmlDocument_ = parseBrowseResult( p_response ); ixmlDocument_free( p_response ); if ( !xmlDocument_ ) { msg_Err( access_, "browse() response parsing failed" ); return; } #ifndef NDEBUG msg_Dbg( access_, "Got DIDL document: %s", ixmlPrintDocument( xmlDocument_ ) ); #endif containerNodeList_ = ixmlDocument_getElementsByTagName( xmlDocument_, "container" ); itemNodeList_ = ixmlDocument_getElementsByTagName( xmlDocument_, "item" ); }
/****************************************************************************** * XMLUtil_GetDocumentString *****************************************************************************/ char* XMLUtil_GetDocumentString (void* context, const IXML_Document* doc) { // TBD XXX // TBD prepend <?xml version="1.0"?> if not already done ??? // TBD XXX char* ret = NULL; if (doc) { DOMString s = ixmlPrintDocument (doc); if (s) { ret = talloc_strdup (context, s); ixmlFreeDOMString (s); } else { ret = talloc_strdup (context, "(error)"); } } else { ret = talloc_strdup (context, "(null)"); } return ret; }
//path, friendlyName static void UpdateValue(const char *Path,const char *NodeElement, char *NewValue) { char *Buf = NULL; IXML_Document *doc = NULL; IXML_NodeList *node = NULL; IXML_Node *NodePtr = NULL; if(ixmlLoadDocumentEx(Path, &doc) == IXML_INVALID_PARAMETER) goto EXIT_THIS; node = ixmlDocument_getElementsByTagName(doc, NodeElement); if (node) { if (NodePtr = ixmlNodeList_item(node, 0)) { NodePtr = ixmlNode_getFirstChild(NodePtr); ixmlNode_setNodeValue(NodePtr,NewValue); } } else { goto EXIT_XML; } Buf = ixmlPrintDocument(doc); if(WriteFile(Path,Buf) != SUCCESS) goto EXIT_THIS; EXIT_XML: if (node) ixmlNodeList_free(node); free(Buf); ixmlDocument_free(doc); EXIT_THIS: return; }
/******************************************************************************** * SampleUtil_PrintEvent * * Description: * Prints callback event structure details. * * Parameters: * EventType -- The type of callback event * Event -- The callback event structure * ********************************************************************************/ int SampleUtil_PrintEvent( IN Upnp_EventType EventType, IN void *Event ) { ithread_mutex_lock( &display_mutex ); SampleUtil_Print ( "\n\n\n======================================================================\n" ); SampleUtil_Print ( "----------------------------------------------------------------------\n" ); SampleUtil_PrintEventType( EventType ); switch ( EventType ) { /* SSDP */ case UPNP_DISCOVERY_ADVERTISEMENT_ALIVE: case UPNP_DISCOVERY_ADVERTISEMENT_BYEBYE: case UPNP_DISCOVERY_SEARCH_RESULT: { struct Upnp_Discovery *d_event = ( struct Upnp_Discovery * )Event; SampleUtil_Print( "ErrCode = %d\n", d_event->ErrCode ); SampleUtil_Print( "Expires = %d\n", d_event->Expires ); SampleUtil_Print( "DeviceId = %s\n", d_event->DeviceId ); SampleUtil_Print( "DeviceType = %s\n", d_event->DeviceType ); SampleUtil_Print( "ServiceType = %s\n", d_event->ServiceType ); SampleUtil_Print( "ServiceVer = %s\n", d_event->ServiceVer ); SampleUtil_Print( "Location = %s\n", d_event->Location ); SampleUtil_Print( "OS = %s\n", d_event->Os ); SampleUtil_Print( "Ext = %s\n", d_event->Ext ); } break; case UPNP_DISCOVERY_SEARCH_TIMEOUT: // Nothing to print out here break; /* SOAP */ case UPNP_CONTROL_ACTION_REQUEST: { struct Upnp_Action_Request *a_event = ( struct Upnp_Action_Request * )Event; char *xmlbuff = NULL; SampleUtil_Print( "ErrCode = %d\n", a_event->ErrCode ); SampleUtil_Print( "ErrStr = %s\n", a_event->ErrStr ); SampleUtil_Print( "ActionName = %s\n", a_event->ActionName ); SampleUtil_Print( "UDN = %s\n", a_event->DevUDN ); SampleUtil_Print( "ServiceID = %s\n", a_event->ServiceID ); if( a_event->ActionRequest ) { xmlbuff = ixmlPrintDocument( a_event->ActionRequest ); if( xmlbuff ) SampleUtil_Print( "ActRequest = %s\n", xmlbuff ); if( xmlbuff ) ixmlFreeDOMString( xmlbuff ); xmlbuff = NULL; } else { SampleUtil_Print( "ActRequest = (null)\n" ); } if( a_event->ActionResult ) { xmlbuff = ixmlPrintDocument( a_event->ActionResult ); if( xmlbuff ) SampleUtil_Print( "ActResult = %s\n", xmlbuff ); if( xmlbuff ) ixmlFreeDOMString( xmlbuff ); xmlbuff = NULL; } else { SampleUtil_Print( "ActResult = (null)\n" ); } } break; case UPNP_CONTROL_ACTION_COMPLETE: { struct Upnp_Action_Complete *a_event = ( struct Upnp_Action_Complete * )Event; char *xmlbuff = NULL; SampleUtil_Print( "ErrCode = %d\n", a_event->ErrCode ); SampleUtil_Print( "CtrlUrl = %s\n", a_event->CtrlUrl ); if( a_event->ActionRequest ) { xmlbuff = ixmlPrintDocument( a_event->ActionRequest ); if( xmlbuff ) SampleUtil_Print( "ActRequest = %s\n", xmlbuff ); if( xmlbuff ) ixmlFreeDOMString( xmlbuff ); xmlbuff = NULL; } else { SampleUtil_Print( "ActRequest = (null)\n" ); } if( a_event->ActionResult ) { xmlbuff = ixmlPrintDocument( a_event->ActionResult ); if( xmlbuff ) SampleUtil_Print( "ActResult = %s\n", xmlbuff ); if( xmlbuff ) ixmlFreeDOMString( xmlbuff ); xmlbuff = NULL; } else { SampleUtil_Print( "ActResult = (null)\n" ); } } break; case UPNP_CONTROL_GET_VAR_REQUEST: { struct Upnp_State_Var_Request *sv_event = ( struct Upnp_State_Var_Request * )Event; SampleUtil_Print( "ErrCode = %d\n", sv_event->ErrCode ); SampleUtil_Print( "ErrStr = %s\n", sv_event->ErrStr ); SampleUtil_Print( "UDN = %s\n", sv_event->DevUDN ); SampleUtil_Print( "ServiceID = %s\n", sv_event->ServiceID ); SampleUtil_Print( "StateVarName= %s\n", sv_event->StateVarName ); SampleUtil_Print( "CurrentVal = %s\n", sv_event->CurrentVal ); } break; case UPNP_CONTROL_GET_VAR_COMPLETE: { struct Upnp_State_Var_Complete *sv_event = ( struct Upnp_State_Var_Complete * )Event; SampleUtil_Print( "ErrCode = %d\n", sv_event->ErrCode ); SampleUtil_Print( "CtrlUrl = %s\n", sv_event->CtrlUrl ); SampleUtil_Print( "StateVarName= %s\n", sv_event->StateVarName ); SampleUtil_Print( "CurrentVal = %s\n", sv_event->CurrentVal ); } break; /* GENA */ case UPNP_EVENT_SUBSCRIPTION_REQUEST: { struct Upnp_Subscription_Request *sr_event = ( struct Upnp_Subscription_Request * )Event; SampleUtil_Print( "ServiceID = %s\n", sr_event->ServiceId ); SampleUtil_Print( "UDN = %s\n", sr_event->UDN ); SampleUtil_Print( "SID = %s\n", sr_event->Sid ); } break; case UPNP_EVENT_RECEIVED: { struct Upnp_Event *e_event = ( struct Upnp_Event * )Event; char *xmlbuff = NULL; SampleUtil_Print( "SID = %s\n", e_event->Sid ); SampleUtil_Print( "EventKey = %d\n", e_event->EventKey ); xmlbuff = ixmlPrintDocument( e_event->ChangedVariables ); SampleUtil_Print( "ChangedVars = %s\n", xmlbuff ); ixmlFreeDOMString( xmlbuff ); xmlbuff = NULL; } break; case UPNP_EVENT_RENEWAL_COMPLETE: { struct Upnp_Event_Subscribe *es_event = ( struct Upnp_Event_Subscribe * )Event; SampleUtil_Print( "SID = %s\n", es_event->Sid ); SampleUtil_Print( "ErrCode = %d\n", es_event->ErrCode ); SampleUtil_Print( "TimeOut = %d\n", es_event->TimeOut ); } break; case UPNP_EVENT_SUBSCRIBE_COMPLETE: case UPNP_EVENT_UNSUBSCRIBE_COMPLETE: { struct Upnp_Event_Subscribe *es_event = ( struct Upnp_Event_Subscribe * )Event; SampleUtil_Print( "SID = %s\n", es_event->Sid ); SampleUtil_Print( "ErrCode = %d\n", es_event->ErrCode ); SampleUtil_Print( "PublisherURL= %s\n", es_event->PublisherUrl ); SampleUtil_Print( "TimeOut = %d\n", es_event->TimeOut ); } break; case UPNP_EVENT_AUTORENEWAL_FAILED: case UPNP_EVENT_SUBSCRIPTION_EXPIRED: { struct Upnp_Event_Subscribe *es_event = ( struct Upnp_Event_Subscribe * )Event; SampleUtil_Print( "SID = %s\n", es_event->Sid ); SampleUtil_Print( "ErrCode = %d\n", es_event->ErrCode ); SampleUtil_Print( "PublisherURL= %s\n", es_event->PublisherUrl ); SampleUtil_Print( "TimeOut = %d\n", es_event->TimeOut ); } break; } SampleUtil_Print ( "----------------------------------------------------------------------\n" ); SampleUtil_Print ( "======================================================================\n\n\n\n" ); ithread_mutex_unlock( &display_mutex ); return ( 0 ); }
DOMString rtpxmlPrintDocument(RTPXML_Document *doc) { return (ixmlPrintDocument((IXML_Document *)doc)); }
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; }
/* * Fetches and parses the UPNP response */ bool MediaServer::_fetchContents( Container* p_parent ) { if (!p_parent) { msg_Err( _p_sd, "No parent" ); return false; } IXML_Document* p_response = _browseAction( p_parent->getObjectID(), "BrowseDirectChildren", "*", "0", "0", "" ); if ( !p_response ) { msg_Err( _p_sd, "No response from browse() action" ); return false; } IXML_Document* p_result = parseBrowseResult( p_response ); ixmlDocument_free( p_response ); if ( !p_result ) { msg_Err( _p_sd, "browse() response parsing failed" ); return false; } #ifndef NDEBUG else { msg_Dbg( _p_sd, "Got DIDL document: %s", ixmlPrintDocument( p_result ) ); } #endif IXML_NodeList* containerNodeList = ixmlDocument_getElementsByTagName( p_result, "container" ); if ( containerNodeList ) { for ( unsigned int i = 0; i < ixmlNodeList_length( containerNodeList ); i++ ) { IXML_Element* containerElement = ( IXML_Element* )ixmlNodeList_item( containerNodeList, i ); const char* objectID = ixmlElement_getAttribute( containerElement, "id" ); if ( !objectID ) continue; const char* title = xml_getChildElementValue( containerElement, "dc:title" ); if ( !title ) continue; Container* container = new Container( p_parent, objectID, title ); p_parent->addContainer( container ); _fetchContents( container ); } ixmlNodeList_free( containerNodeList ); } IXML_NodeList* itemNodeList = ixmlDocument_getElementsByTagName( p_result, "item" ); if ( itemNodeList ) { for ( unsigned int i = 0; i < ixmlNodeList_length( itemNodeList ); i++ ) { IXML_Element* itemElement = ( IXML_Element* )ixmlNodeList_item( itemNodeList, i ); const char* objectID = ixmlElement_getAttribute( itemElement, "id" ); if ( !objectID ) continue; const char* title = xml_getChildElementValue( itemElement, "dc:title" ); if ( !title ) continue; const char* resource = xml_getChildElementValue( itemElement, "res" ); if ( !resource ) continue; const char* psz_duration = xml_getChildElementAttributeValue( itemElement, "res", "duration" ); mtime_t i_duration = -1; int i_hours, i_minutes, i_seconds, i_decis; if ( psz_duration ) { if( sscanf( psz_duration, "%02d:%02d:%02d.%d", &i_hours, &i_minutes, &i_seconds, &i_decis )) i_duration = INT64_C(1000000) * ( i_hours*3600 + i_minutes*60 + i_seconds ) + INT64_C(100000) * i_decis; } Item* item = new Item( p_parent, objectID, title, resource, i_duration ); p_parent->addItem( item ); } ixmlNodeList_free( itemNodeList ); } ixmlDocument_free( p_result ); return true; }
/**************************************************************************** * Function : get_response_value * * Parameters : * IN http_message_t* hmsg : HTTP response message * IN int code : return code in the HTTP response * IN char*name : name of the action * OUT int *upnp_error_code : UPnP error code * OUT IXML_Node ** action_value : SOAP response node * OUT DOMString * str_value : state varible value ( in the case of * querry state variable request) * * Description : This function handles the response coming back from the * device. This function parses the response and gives back the SOAP * response node. * * Return : int * return the type of the SOAP message if successful else returns * appropriate error. * * Note : ****************************************************************************/ static int get_response_value( IN http_message_t * hmsg, IN int code, IN char *name, OUT int *upnp_error_code, OUT IXML_Node ** action_value, OUT DOMString * str_value ) { IXML_Node *node = NULL; IXML_Node *root_node = NULL; IXML_Node *error_node = NULL; IXML_Document *doc = NULL; char *node_str = NULL; char *temp_str = NULL; DOMString error_node_str = NULL; int err_code; xboolean done = FALSE; char *names[5]; DOMString nodeValue; err_code = UPNP_E_BAD_RESPONSE; // default error // only 200 and 500 status codes are relevant if( ( hmsg->status_code != HTTP_OK && hmsg->status_code != HTTP_INTERNAL_SERVER_ERROR ) || !has_xml_content_type( hmsg ) ) { goto error_handler; } if( ixmlParseBufferEx( hmsg->entity.buf, &doc ) != IXML_SUCCESS ) { goto error_handler; } root_node = ixmlNode_getFirstChild( ( IXML_Node * ) doc ); if( root_node == NULL ) { goto error_handler; } if( code == SOAP_ACTION_RESP ) { // // try reading soap action response // assert( action_value != NULL ); *action_value = NULL; names[0] = "Envelope"; names[1] = "Body"; names[2] = name; if( dom_find_deep_node( names, 3, root_node, &node ) == UPNP_E_SUCCESS ) { node_str = ixmlPrintDocument( node ); if( node_str == NULL ) { err_code = UPNP_E_OUTOF_MEMORY; goto error_handler; } if( ixmlParseBufferEx( node_str, ( IXML_Document ** ) action_value ) != IXML_SUCCESS ) { err_code = UPNP_E_BAD_RESPONSE; goto error_handler; } err_code = SOAP_ACTION_RESP; done = TRUE; } } else if( code == SOAP_VAR_RESP ) { // try reading var response assert( str_value != NULL ); *str_value = NULL; names[0] = "Envelope"; names[1] = "Body"; names[2] = "QueryStateVariableResponse"; names[3] = "return"; if( dom_find_deep_node( names, 4, root_node, &node ) == UPNP_E_SUCCESS ) { nodeValue = get_node_value( node ); if( nodeValue == NULL ) { goto error_handler; } *str_value = ixmlCloneDOMString( nodeValue ); err_code = SOAP_VAR_RESP; done = TRUE; } } if( !done ) { // not action or var resp; read error code and description *str_value = NULL; names[0] = "Envelope"; names[1] = "Body"; names[2] = "Fault"; names[3] = "detail"; names[4] = "UPnPError"; if( dom_find_deep_node( names, 5, root_node, &error_node ) != UPNP_E_SUCCESS ) { goto error_handler; } if( dom_find_node( "errorCode", error_node, &node ) != UPNP_E_SUCCESS ) { goto error_handler; } temp_str = get_node_value( node ); if( temp_str == NULL ) { goto error_handler; } *upnp_error_code = atoi( temp_str ); if( *upnp_error_code < 400 ) { err_code = *upnp_error_code; goto error_handler; // bad SOAP error code } if( code == SOAP_VAR_RESP ) { if( dom_find_node( "errorDescription", error_node, &node ) != UPNP_E_SUCCESS ) { goto error_handler; } nodeValue = get_node_value( node ); if( nodeValue == NULL ) { goto error_handler; } *str_value = ixmlCloneDOMString( nodeValue ); if( *str_value == NULL ) { goto error_handler; } err_code = SOAP_VAR_RESP_ERROR; } else if( code == SOAP_ACTION_RESP ) { error_node_str = ixmlPrintDocument( error_node ); if( error_node_str == NULL ) { err_code = UPNP_E_OUTOF_MEMORY; goto error_handler; } if( ixmlParseBufferEx( error_node_str, ( IXML_Document ** ) action_value ) != IXML_SUCCESS ) { err_code = UPNP_E_BAD_RESPONSE; goto error_handler; } err_code = SOAP_ACTION_RESP_ERROR; } } error_handler: ixmlDocument_free( doc ); ixmlFreeDOMString( node_str ); ixmlFreeDOMString( error_node_str ); return err_code; }
int xml_end_len; int action_str_len; *response_node = NULL; // init err_code = UPNP_E_OUTOF_MEMORY; // default error DBGONLY( UpnpPrintf( UPNP_INFO, SOAP, __FILE__, __LINE__, "Inside SoapSendAction():" ); ) // init membuffer_init( &request ); membuffer_init( &responsename ); // print action action_str = ixmlPrintDocument( ( IXML_Node * ) action_node ); if( action_str == NULL ) { goto error_handler; } // get action name if( get_action_name( action_str, &name ) != 0 ) { err_code = UPNP_E_INVALID_ACTION; goto error_handler; } // parse url if( http_FixStrUrl( action_url, strlen( action_url ), &url ) != 0 ) { err_code = UPNP_E_INVALID_URL; goto error_handler; } DBGONLY( UpnpPrintf( UPNP_INFO, SOAP, __FILE__, __LINE__,
/* * Fetches and parses the UPNP response */ bool MediaServer::_fetchContents( Container* p_parent, int i_offset ) { if (!p_parent) { msg_Err( _p_sd, "No parent" ); return false; } char* psz_starting_index; if( asprintf( &psz_starting_index, "%d", i_offset ) < 0 ) { msg_Err( _p_sd, "asprintf error:%d", i_offset ); return false; } IXML_Document* p_response = _browseAction( p_parent->getObjectID(), "BrowseDirectChildren", "*", /* Filter */ psz_starting_index, /* StartingIndex */ "0", /* RequestedCount */ "" /* SortCriteria */ ); free( psz_starting_index ); if ( !p_response ) { msg_Err( _p_sd, "No response from browse() action" ); return false; } IXML_Document* p_result = parseBrowseResult( p_response ); int i_number_returned = xml_getNumber( p_response, "NumberReturned" ); int i_total_matches = xml_getNumber( p_response , "TotalMatches" ); #ifndef NDEBUG msg_Dbg( _p_sd, "i_offset[%d]i_number_returned[%d]_total_matches[%d]\n", i_offset, i_number_returned, i_total_matches ); #endif ixmlDocument_free( p_response ); if ( !p_result ) { msg_Err( _p_sd, "browse() response parsing failed" ); return false; } #ifndef NDEBUG msg_Dbg( _p_sd, "Got DIDL document: %s", ixmlPrintDocument( p_result ) ); #endif IXML_NodeList* containerNodeList = ixmlDocument_getElementsByTagName( p_result, "container" ); if ( containerNodeList ) { for ( unsigned int i = 0; i < ixmlNodeList_length( containerNodeList ); i++ ) { IXML_Element* containerElement = ( IXML_Element* )ixmlNodeList_item( containerNodeList, i ); const char* objectID = ixmlElement_getAttribute( containerElement, "id" ); if ( !objectID ) continue; const char* title = xml_getChildElementValue( containerElement, "dc:title" ); if ( !title ) continue; Container* container = new Container( p_parent, objectID, title ); p_parent->addContainer( container ); _fetchContents( container, 0 ); } ixmlNodeList_free( containerNodeList ); } IXML_NodeList* itemNodeList = ixmlDocument_getElementsByTagName( p_result, "item" ); if ( itemNodeList ) { for ( unsigned int i = 0; i < ixmlNodeList_length( itemNodeList ); i++ ) { IXML_Element* itemElement = ( IXML_Element* )ixmlNodeList_item( itemNodeList, i ); const char* objectID = ixmlElement_getAttribute( itemElement, "id" ); if ( !objectID ) continue; const char* title = xml_getChildElementValue( itemElement, "dc:title" ); if ( !title ) continue; const char* resource = xml_getChildElementValue( itemElement, "res" ); if ( !resource ) continue; const char* psz_duration = xml_getChildElementAttributeValue( itemElement, "res", "duration" ); mtime_t i_duration = -1; int i_hours, i_minutes, i_seconds, i_decis; if ( psz_duration ) { if( sscanf( psz_duration, "%02d:%02d:%02d.%d", &i_hours, &i_minutes, &i_seconds, &i_decis )) i_duration = INT64_C(1000000) * ( i_hours*3600 + i_minutes*60 + i_seconds ) + INT64_C(100000) * i_decis; } Item* item = new Item( p_parent, objectID, title, resource, i_duration ); p_parent->addItem( item ); } ixmlNodeList_free( itemNodeList ); } ixmlDocument_free( p_result ); if( i_offset + i_number_returned < i_total_matches ) return _fetchContents( p_parent, i_offset + i_number_returned ); return true; }