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

📄 soap.c

📁 upnpsdk-1.0.4.tar.gz Intel UPnP SDK Source
💻 C
📖 第 1 页 / 共 3 页
字号:
/////////////////////////////////////////////////////////////////////////////// Copyright (c) 2000 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 the 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.//// $Revision: 1.1.1.6 $// $Date: 2001/06/15 00:22:16 $// #include "../../inc/tools/config.h"#if EXCLUDE_SOAP == 0#include "../inc/genlib/closesocket/upnpclosesocket.h"#include <stdlib.h>#include <ctype.h>#include <stdio.h>#include <stdarg.h>#include "tools/config.h"#include "../inc/genlib/miniserver/miniserver.h"#include "../inc/interface.h"#include "../inc/genlib/http_client/http_client.h"#include "../../inc/upnp.h"#include <sys/utsname.h>#define HEADER_LENGTH 2000#define MIN_LEN 25#define TIMEOUT 10#define XML_HEADER 300int CreateControlResponse(char * OutBuf, char * ActionNameRes);char* itoa( int Value, char* string, int radix ){  if( radix == 10 ) {    sprintf( string, "%d", Value );  } else if( radix == 16 ) {    sprintf( string, "%x", Value );  } else if( radix == 8 ) {    sprintf( string, "%o", Value );  }  return( string );} ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Function    : void AddResponseHeader(char * First,char * OutBuff, char * XmlBuff) // Description : This function creates the complete request packet by adding the HTTP header and xml header. // // Parameters  : First : Type of response packet. //               OutBuff : Final response buffer. //               XmlBuff : XML buffer. // Return value: None //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////void AddResponseHeader(char * First,char * OutBuff, char * XmlBuff){    char Date[40];    struct utsname sys_info;    memset(&sys_info,0x00,sizeof(sys_info));    uname(&sys_info);        currentTmToHttpDate(Date);    sprintf(OutBuff,"%sCONTENT-LENGTH:%d\r\n",First,strlen(XmlBuff)+1);    sprintf(OutBuff+strlen(OutBuff),"CONTENT-TYPE:text/xml\r\n%sEXT:\r\nSERVER:%s/%s UPnP/1.0 Intel UPnP SDK/1.0\r\n\r\n",Date,sys_info.sysname,sys_info.release);    strcat(OutBuff,XmlBuff);}////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Function    : int GetBufferErrorCode(char *Buffer) // Description : Checks the HTTP header error code. // // Parameters  : Buffer : Input buffer. // // Return value: 1 if HTTP code is 200 else -1. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////int GetBufferErrorCode(char *Buffer){   char * Ptr;   char Header[LINE_SIZE];   Ptr = strstr(Buffer,"\r\n");   strncpy(Header,Buffer,Ptr-Buffer);   Header[Ptr-Buffer]='\0';   if((char*)strstr(Header,"200") == NULL) return -1;   else return 1;} ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Function    : char * strstrcase(char * Src, char * Tok) // Description : This is a case independent version of std strstr() fn // // Parameters  : src : source string //               Tok : String to find. // // Return value: Position of found string or NULL. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////char * strstrcase(char * Src, char * Tok){   int i=0, SrcLen, TokLen;   char*Tmp, *RetVal=NULL;   SrcLen = strlen(Src);   TokLen = strlen(Tok);   Tmp =(char*)malloc(strlen(Tok)+1);   while(i< SrcLen && SrcLen-i >= TokLen)   {      strncpy(Tmp,Src+i,TokLen);      Tmp[TokLen] = '\0';      if( strcasecmp(Tmp,Tok) == 0)      {         RetVal=Src+i;         break;      }      ++i;   }  free(Tmp);  return RetVal;} ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Function    : int GetNode(Upnp_Document TempDoc, char *NodeName, Upnp_Document * RespNode) // Description : This function seperates the given node from the root DOM node. // Parameters  : TempDoc :  The root DOM node. //               NodeName : Node name to be searched. //               RespNode : Response/Output node. // Return value: 1 if successfull, or -1 if fails. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////int GetNode(Upnp_Document TempDoc, char *NodeName, Upnp_Document * RespNode){   int RetVal=-1;   Upnp_DOMString  ActBuf=NULL;   Upnp_NodeList NodeList=NULL;   Upnp_Node TmpNode=NULL;   DBGONLY(UpnpPrintf(UPNP_INFO,SOAP,__FILE__,__LINE__,"Fn:GetNode   Node Name = %s\n ",NodeName);)   NodeList = UpnpDocument_getElementsByTagName(TempDoc,(Upnp_DOMString)NodeName);   if (NodeList != NULL)   {      TmpNode = UpnpNodeList_item(NodeList,0);      if(TmpNode != NULL)      {         ActBuf = UpnpNewPrintDocument(TmpNode);         DBGONLY(UpnpPrintf(UPNP_INFO,SOAP,__FILE__,__LINE__,"Fn:GetNode Node value is %s\n", ActBuf);)         *RespNode = UpnpParse_Buffer(ActBuf);         free(ActBuf);         RetVal=1;	        UpnpNode_free(TmpNode);      }      UpnpNodeList_free(NodeList);   }  return RetVal;} ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Function    : int GetActionNode(Upnp_Document TempDoc, char *NodeName, Upnp_Document * RespNode) // Description : This function seperates the action node from the root DOM node. // Parameters  : TempDoc  : The root DOM node. //               NodeName : Node name to be searched. //               RespNode : Response/Output node. // Return value: 1 if successfull, or -1 if fails. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////int GetActionNode(Upnp_Document TempDoc, char *NodeName, Upnp_Document * RespNode){   Upnp_Node EnvpNode;   Upnp_Node BodyNode;   Upnp_Node ActNode;   Upnp_DOMString ActNodeName=NULL;   DBGONLY(UpnpPrintf(UPNP_INFO,SOAP,__FILE__,__LINE__,"Fn:GetActionNode   node name =%s\n ",NodeName);)   *RespNode = NULL;   // Got the Envelop node here   EnvpNode = UpnpDocument_getFirstChild(TempDoc);   if(EnvpNode == NULL) return -1;   // Got Body here   BodyNode = UpnpNode_getFirstChild(EnvpNode);   if( BodyNode == NULL)   {       UpnpNode_free(EnvpNode);       return -1;   }   // Got action node here   ActNode = UpnpNode_getFirstChild(BodyNode);   if( ActNode == NULL)   {       UpnpNode_free(EnvpNode);       UpnpNode_free(BodyNode);       return -1;   }   //Test whether this is the action node   ActNodeName = UpnpNode_getNodeName(ActNode);   if( ActNodeName == NULL)   {       UpnpNode_free(EnvpNode);       UpnpNode_free(BodyNode);       UpnpNode_free(ActNode);       return -1;   }      if(strstr(ActNodeName, NodeName) == NULL)   {       UpnpNode_free(EnvpNode);       UpnpNode_free(BodyNode);       UpnpNode_free(ActNode);       Upnpfree(ActNodeName);       return -1;   }   else    {       Upnpfree(ActNodeName);       ActNodeName = UpnpNewPrintDocument(ActNode);       *RespNode = UpnpParse_Buffer(ActNodeName);       Upnpfree(ActNodeName);       UpnpNode_free(EnvpNode);       UpnpNode_free(BodyNode);       UpnpNode_free(ActNode);       return 1;   }} ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Function    : int GetVarName(Upnp_Document TempDoc, char * VarName) // Description : This function retrieves the requested variable name. // Parameters  : TempDoc :  The root DOM node. //               VarName :  Output variable name. // Return value: 1 if successfull, or -1 if fails. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////int GetVarName(Upnp_Document TempDoc, char * VarName){   Upnp_Node EnvpNode;   Upnp_Node BodyNode;   Upnp_Node StNode;   Upnp_Node VarNameNode;   Upnp_Node VarNode;   Upnp_DOMString StNodeName=NULL;   Upnp_DOMString Temp;   Upnp_DOMException Err;   // Got the Envelop node here   EnvpNode = UpnpDocument_getFirstChild(TempDoc);   if(EnvpNode == NULL) return -1;   // Got Body here   BodyNode = UpnpNode_getFirstChild(EnvpNode);   if( BodyNode == NULL)   {       UpnpNode_free(EnvpNode);       return -1;   }   // Got action node here   StNode = UpnpNode_getFirstChild(BodyNode);   if( StNode == NULL)   {       UpnpNode_free(EnvpNode);       UpnpNode_free(BodyNode);       return -1;   }   //Test whether this is the action node   StNodeName = UpnpNode_getNodeName(StNode);   if( StNodeName == NULL)   {       UpnpNode_free(EnvpNode);       UpnpNode_free(BodyNode);       UpnpNode_free(StNode);       return -1;   }   if(strstr(StNodeName, "QueryStateVariable") == NULL)   {       UpnpNode_free(EnvpNode);       UpnpNode_free(BodyNode);       UpnpNode_free(StNode);       Upnpfree(StNodeName);       return -1;   }   else   {       Upnpfree(StNodeName);       VarNameNode = UpnpNode_getFirstChild(StNode);       if( VarNameNode == NULL)       {          UpnpNode_free(EnvpNode);          UpnpNode_free(BodyNode);          UpnpNode_free(StNode);          return -1;       }       VarNode=UpnpNode_getFirstChild(VarNameNode);       Temp = UpnpNode_getNodeValue(VarNode,&Err);       strcpy( VarName,Temp);       DBGONLY(UpnpPrintf(UPNP_INFO,SOAP,__FILE__,__LINE__,"Received query for variable  name %s\n",VarName);)       Upnpfree(Temp);       UpnpNode_free(VarNode);       UpnpNode_free(VarNameNode);       UpnpNode_free(StNode);       UpnpNode_free(EnvpNode);       UpnpNode_free(BodyNode);       return 1;   }} ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Function    : int GetActionName(char * Header, char * Name) // Description : Retrievs the action name from the HTTP header. // Parameters  : Header : Http header string. //               Name :  Output action name string. // // Return value: 1 if successfull -1 otherwise. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////int GetActionName(char * Header, char * Name){  char * Ptr,Index=0,*Tmp;  printf( "=========================================\n");  printf("	GetActionName -> Header : %s \n", Header);  printf( "=========================================\n");  //Parse with HTTP header  if( ( Ptr = (char*)strstrcase(Header,"SOAPACTION") ) != NULL )  {     if( (Ptr = (char*)strstr(Header,"#")) != NULL)     {         ++Ptr;         while( /* isalnum(*Ptr) != 0 &&  */ isblank(*Ptr) == 0)         {		if( isalnum(*Ptr) != 0 )		{	    		printf("%c ", *Ptr);            		*(Name+Index++) = *(Ptr++);		}		else		{			if( (*Ptr) == '_' )			{				 printf("%c ", *Ptr);                        	*(Name+Index++) = *(Ptr++);			}			else			{				break;			}		}         }	printf("al = %d bl = %d\n", isalnum('_'), isblank('_'));         *(Name+Index++) = '\0';     }else return -1;  }  else //Parse only action header  {     if( (Tmp =  (char*)strstr(Header,"<")) != NULL)     {        if( (Ptr = (char*)strstr(Tmp,":")) != NULL)        {           Ptr = Ptr+1;           while(*Ptr != ' ')           *(Name+Index++) = *(Ptr++);           *(Name+Index++) = '\0';        }else return -1;

⌨️ 快捷键说明

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