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