📄 sample_util.c
字号:
/////////////////////////////////////////////////////////////////////////////// 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 + -