⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sample_util.c

📁 Upnp开发包文件
💻 C
📖 第 1 页 / 共 2 页
字号:
/////////////////////////////////////////////////////////////////////////////// Copyright (c) 2000-2003 Intel Corporation // All rights reserved. //// Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are met: //// * Redistributions of source code must retain the above copyright notice, // this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above copyright notice, // this list of conditions and the following disclaimer in the documentation // and/or other materials provided with the distribution. // * Neither name of Intel Corporation nor the names of its contributors // may be used to endorse or promote products derived from this software // without specific prior written permission.// // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY // OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE./////////////////////////////////////////////////////////////////////////////#include "sample_util.h"#include <stdarg.h>/*   Function pointer to use for displaying formatted   strings. Set on Initialization of device.  */int initialize = 1;print_string gPrintFun = NULL;state_update gStateUpdateFun = NULL;//mutex to control displaying of eventsithread_mutex_t display_mutex;/******************************************************************************** * SampleUtil_Initialize * * Description:  *     Initializes the sample util. Must be called before any sample util  *     functions. May be called multiple times. * * Parameters: *   print_function - print function to use in SampleUtil_Print * ********************************************************************************/intSampleUtil_Initialize( print_string print_function ){    if( initialize ) {        ithread_mutexattr_t attr;        gPrintFun = print_function;        ithread_mutexattr_init( &attr );        ithread_mutexattr_setkind_np( &attr, ITHREAD_MUTEX_RECURSIVE_NP );        ithread_mutex_init( &display_mutex, &attr );        ithread_mutexattr_destroy( &attr );        initialize = 0;    }    return UPNP_E_SUCCESS;}/******************************************************************************** * SampleUtil_RegisterUpdateFunction * * Description:  * * Parameters: * ********************************************************************************/intSampleUtil_RegisterUpdateFunction( state_update update_function ){    static int initialize = 1;  //only intialize once    if( initialize ) {        gStateUpdateFun = update_function;        initialize = 0;    }    return UPNP_E_SUCCESS;}/******************************************************************************** * SampleUtil_Finish * * Description:  *     Releases Resources held by sample util. * * Parameters: * ********************************************************************************/intSampleUtil_Finish(  ){    ithread_mutex_destroy( &display_mutex );    gPrintFun = NULL;    initialize = 1;    return UPNP_E_SUCCESS;}/******************************************************************************** * SampleUtil_GetElementValue * * Description:  *       Given a DOM node such as <Channel>11</Channel>, this routine *       extracts the value (e.g., 11) from the node and returns it as  *       a string. The string must be freed by the caller using  *       free. * * Parameters: *   node -- The DOM node from which to extract the value * ********************************************************************************/char *SampleUtil_GetElementValue( IN IXML_Element * element ){    IXML_Node *child = ixmlNode_getFirstChild( ( IXML_Node * ) element );    char *temp = NULL;    if( ( child != 0 ) && ( ixmlNode_getNodeType( child ) == eTEXT_NODE ) ) {        temp = strdup( ixmlNode_getNodeValue( child ) );    }    return temp;}/******************************************************************************** * SampleUtil_GetFirstServiceList * * Description:  *       Given a DOM node representing a UPnP Device Description Document, *       this routine parses the document and finds the first service list *       (i.e., the service list for the root device).  The service list *       is returned as a DOM node list. * * Parameters: *   node -- The DOM node from which to extract the service list * ********************************************************************************/IXML_NodeList *SampleUtil_GetFirstServiceList( IN IXML_Document * doc ){    IXML_NodeList *ServiceList = NULL;    IXML_NodeList *servlistnodelist = NULL;    IXML_Node *servlistnode = NULL;    servlistnodelist =        ixmlDocument_getElementsByTagName( doc, "serviceList" );    if( servlistnodelist && ixmlNodeList_length( servlistnodelist ) ) {        /*           we only care about the first service list, from the root device          */        servlistnode = ixmlNodeList_item( servlistnodelist, 0 );        /*           create as list of DOM nodes          */        ServiceList =            ixmlElement_getElementsByTagName( ( IXML_Element * )                                              servlistnode, "service" );    }    if( servlistnodelist )        ixmlNodeList_free( servlistnodelist );    return ServiceList;}/******************************************************************************** * SampleUtil_GetFirstDocumentItem * * Description:  *       Given a document node, this routine searches for the first element *       named by the input string item, and returns its value as a string. *       String must be freed by caller using free. * Parameters: *   doc -- The DOM document from which to extract the value *   item -- The item to search for * ********************************************************************************/char *SampleUtil_GetFirstDocumentItem( IN IXML_Document * doc,                                 IN const char *item ){    IXML_NodeList *nodeList = NULL;    IXML_Node *textNode = NULL;    IXML_Node *tmpNode = NULL;    char *ret = NULL;    nodeList = ixmlDocument_getElementsByTagName( doc, ( char * )item );    if( nodeList ) {        if( ( tmpNode = ixmlNodeList_item( nodeList, 0 ) ) ) {            textNode = ixmlNode_getFirstChild( tmpNode );            ret = strdup( ixmlNode_getNodeValue( textNode ) );        }    }    if( nodeList )        ixmlNodeList_free( nodeList );    return ret;}/******************************************************************************** * SampleUtil_GetFirstElementItem * * Description:  *       Given a DOM element, this routine searches for the first element *       named by the input string item, and returns its value as a string. *       The string must be freed using free. * Parameters: *   node -- The DOM element from which to extract the value *   item -- The item to search for * ********************************************************************************/char *SampleUtil_GetFirstElementItem( IN IXML_Element * element,                                IN const char *item ){    IXML_NodeList *nodeList = NULL;    IXML_Node *textNode = NULL;    IXML_Node *tmpNode = NULL;    char *ret = NULL;    nodeList = ixmlElement_getElementsByTagName( element, ( char * )item );    if( nodeList == NULL ) {        SampleUtil_Print( "Error finding %s in XML Node\n", item );        return NULL;    }    if( ( tmpNode = ixmlNodeList_item( nodeList, 0 ) ) == NULL ) {        SampleUtil_Print( "Error finding %s value in XML Node\n", item );        ixmlNodeList_free( nodeList );        return NULL;    }    textNode = ixmlNode_getFirstChild( tmpNode );    ret = strdup( ixmlNode_getNodeValue( textNode ) );    if( !ret ) {        SampleUtil_Print( "Error allocating memory for %s in XML Node\n",                          item );        ixmlNodeList_free( nodeList );        return NULL;    }    ixmlNodeList_free( nodeList );    return ret;}/******************************************************************************** * SampleUtil_PrintEventType * * Description:  *       Prints a callback event type as a string. * * Parameters: *   S -- The callback event * ********************************************************************************/voidSampleUtil_PrintEventType( IN Upnp_EventType S ){    switch ( S ) {        case UPNP_DISCOVERY_ADVERTISEMENT_ALIVE:            SampleUtil_Print( "UPNP_DISCOVERY_ADVERTISEMENT_ALIVE\n" );            break;        case UPNP_DISCOVERY_ADVERTISEMENT_BYEBYE:            SampleUtil_Print( "UPNP_DISCOVERY_ADVERTISEMENT_BYEBYE\n" );            break;        case UPNP_DISCOVERY_SEARCH_RESULT:            SampleUtil_Print( "UPNP_DISCOVERY_SEARCH_RESULT\n" );            break;        case UPNP_DISCOVERY_SEARCH_TIMEOUT:            SampleUtil_Print( "UPNP_DISCOVERY_SEARCH_TIMEOUT\n" );            break;            /*               SOAP Stuff              */        case UPNP_CONTROL_ACTION_REQUEST:            SampleUtil_Print( "UPNP_CONTROL_ACTION_REQUEST\n" );            break;        case UPNP_CONTROL_ACTION_COMPLETE:            SampleUtil_Print( "UPNP_CONTROL_ACTION_COMPLETE\n" );            break;        case UPNP_CONTROL_GET_VAR_REQUEST:            SampleUtil_Print( "UPNP_CONTROL_GET_VAR_REQUEST\n" );            break;        case UPNP_CONTROL_GET_VAR_COMPLETE:            SampleUtil_Print( "UPNP_CONTROL_GET_VAR_COMPLETE\n" );            break;            /*               GENA Stuff              */        case UPNP_EVENT_SUBSCRIPTION_REQUEST:            SampleUtil_Print( "UPNP_EVENT_SUBSCRIPTION_REQUEST\n" );            break;        case UPNP_EVENT_RECEIVED:            SampleUtil_Print( "UPNP_EVENT_RECEIVED\n" );            break;        case UPNP_EVENT_RENEWAL_COMPLETE:            SampleUtil_Print( "UPNP_EVENT_RENEWAL_COMPLETE\n" );            break;        case UPNP_EVENT_SUBSCRIBE_COMPLETE:            SampleUtil_Print( "UPNP_EVENT_SUBSCRIBE_COMPLETE\n" );            break;        case UPNP_EVENT_UNSUBSCRIBE_COMPLETE:            SampleUtil_Print( "UPNP_EVENT_UNSUBSCRIBE_COMPLETE\n" );            break;        case UPNP_EVENT_AUTORENEWAL_FAILED:            SampleUtil_Print( "UPNP_EVENT_AUTORENEWAL_FAILED\n" );            break;        case UPNP_EVENT_SUBSCRIPTION_EXPIRED:            SampleUtil_Print( "UPNP_EVENT_SUBSCRIPTION_EXPIRED\n" );            break;    }}/******************************************************************************** * SampleUtil_PrintEvent * * Description:  *       Prints callback event structure details. * * Parameters: *   EventType -- The type of callback event *   Event -- The callback event structure * ********************************************************************************/intSampleUtil_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 );

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -