📄 soap.c
字号:
itoa(strlen(XmlPtr)+1,LenBuf,10); strncpy(InBuff+strlen("CONTENT-LENGTH:"),LenBuf,strlen(LenBuf)); DBGONLY(UpnpPrintf(UPNP_PACKET,SOAP,__FILE__,__LINE__,"SoapGetServiceVarStatus: Sending packet \n%s\n",InBuff);) // Sending request packet transferHTTP("POST",InBuff,strlen(InBuff)+1,&RecvBuff,ActionURL); // And receive the response. if(RecvBuff != NULL && strlen(RecvBuff) > MIN_LEN) { DBGONLY(UpnpPrintf(UPNP_PACKET,SOAP,__FILE__,__LINE__,"SoapGetServiceVarStatus: Received packet \n%s\n",RecvBuff);) Xml= strstr(RecvBuff,"\r\n\r\n"); if(Xml == NULL) { free(RecvBuff); free(InBuff); return UPNP_E_INVALID_DESC; } else Xml = Xml+4; XmlDoc=UpnpParse_Buffer(Xml); if(XmlDoc == NULL) { free(RecvBuff); free(InBuff); return UPNP_E_INVALID_DESC; } if ((RetVal=GetBufferErrorCode(RecvBuff)) > 0) { GetNodeValue(XmlDoc,"return",&Val); *VarVal = Val; RetVal = UPNP_E_SUCCESS; } else { GetNodeValue(XmlDoc,"errorCode",&Val); RetVal = atoi(Val); Upnpfree(Val); GetNodeValue(XmlDoc,"errorDescription",&Val); *VarVal = Val; } free(InBuff); free(RecvBuff); UpnpDocument_free(XmlDoc); } else if(RecvBuff != NULL) { free(RecvBuff); *VarVal = NULL; free(InBuff); RetVal = UPNP_E_INVALID_URL; } else { DBGONLY(UpnpPrintf(UPNP_CRITICAL,SOAP,__FILE__,__LINE__,"SoapGetServiceVarStatus: Received NULL packet");) *VarVal = NULL; free(InBuff); RetVal = UPNP_E_INVALID_URL; } return RetVal;}#endif ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Function : int GetCtrlUrl(char * InBuf, char * Url) // Description : This function retrieves the control URL from the HTTP message. // // Parameters : InBuf : The complete HTTP buffer. // Url : Control URL. // // Return value: None //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////int GetCtrlUrl(char * InBuf, char * Url){ char * Sptr,*Eptr,i=0; Sptr = (char*)strstrcase(InBuf,"POST"); if(Sptr != NULL ) Sptr = Sptr + 4; else return -1; Eptr = (char*)strstrcase(InBuf,"HTTP"); if(Eptr != NULL) Eptr = Eptr -1; else return -1; while(++Sptr != Eptr) *(Url+i++) = *Sptr; *(Url+i++) = '\0'; return 1;} ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Function : int GetDeviceInfo(char *CtrlUrl,char *DevUDN, char *ServiceID, Upnp_FunPtr *Fun) // Description : This function returns all the information related with service. // // Parameters : CtrlUrl : Control URL. // DevUDN : Device UDN. // ServiceID : Service UUID. // Fun : Callback function // // Return value: None //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////DEVICEONLY(int GetDeviceInfo(char *CtrlUrl,char *DevUDN, char *ServiceID, Upnp_FunPtr *Fun, void ** Cookie){ struct Handle_Info *HInfo; int DeviceHandle ; service_info *SInfo; strcpy(DevUDN, ""); strcpy(ServiceID, ""); *Fun=NULL; HandleLock(); // Write the code to find all the the data related with service if ( GetDeviceHandleInfo(&DeviceHandle, &HInfo) != HND_DEVICE ) { DBGONLY(UpnpPrintf(UPNP_INFO,SOAP,__FILE__,__LINE__,"Client handle , Can't send reply!!!!\n");) HandleUnlock(); return -1; } else { if ((SInfo=FindServiceControlURLPath(&HInfo->ServiceTable,CtrlUrl)) == NULL ) { DBGONLY(UpnpPrintf(UPNP_CRITICAL,SOAP,__FILE__,__LINE__,"Error in FindServiceControlURLPath\n");) HandleUnlock(); return -1; } else { strcpy(ServiceID,SInfo->serviceId); strcpy(DevUDN,SInfo->UDN); *Fun = HInfo->Callback; *Cookie = (void *) HInfo->Cookie; HandleUnlock(); return 1; } } HandleUnlock(); return -1;}) ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Function : int ProcessSoapEventPacket( char * InData, int Socket) // Description : This function serves all the request that come from the client, like GetVatStatus or execute action. // // Parameters : InData : The input request packet that include HTTP header and XML. // Socket : Socket to send the reply. // Return value: 1 if successful. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////#ifdef INCLUDE_DEVICE_APIS// All the response function will be called from here.int ProcessSoapEventPacket( char * InData, int Socket){ char *InStr,*RespStr; int BuffLen; char ActName[NAME_SIZE],CtrlUrl[LINE_SIZE]; char None[] ="NULL",*Xml; Upnp_Document RespNode; Upnp_Document XmlDoc; struct Upnp_Action_Request *ActParam; // Event to be sent to client callback fn. struct Upnp_State_Var_Request *VarParam; void * Cookie=NULL; Upnp_FunPtr SoapEventCallback; Xml= strstr(InData,"\r\n\r\n"); if(Xml == NULL) { UpnpCloseSocket(Socket); return -1; } else Xml = Xml+4; XmlDoc=UpnpParse_Buffer(Xml); if(XmlDoc == NULL) { UpnpCloseSocket(Socket); return -1; } DBGONLY(UpnpPrintf(UPNP_PACKET,SOAP,__FILE__,__LINE__,"Soap server received packet \n %s\n",InData);) BuffLen = strlen(InData)+1; if(BuffLen < HEADER_LENGTH)BuffLen = HEADER_LENGTH ; InStr = (char*) malloc(BuffLen); if(InStr == NULL) { DBGONLY(UpnpPrintf(UPNP_CRITICAL,SOAP,__FILE__,__LINE__,"Error in memory allocation!!!!!!!!!!!\n");) UpnpCloseSocket(Socket); UpnpDocument_free(XmlDoc); return UPNP_E_OUTOF_MEMORY; } if(GetCtrlUrl(InData,CtrlUrl) > 0 ) { if((char*)strstrcase(InData,"QueryStateVariable") == NULL) //This soap action { if(GetActionName(InData,ActName)< 0) { DBGONLY(UpnpPrintf(UPNP_CRITICAL,SOAP,__FILE__,__LINE__,"Couldn't find action name in the header\n");) CreateControlFailure(InStr,UPNP_E_INVALID_ACTION,"Invalid action name!!!!!"); write_bytes(Socket,InStr,strlen(InStr)+1,TIMEOUT); UpnpCloseSocket(Socket); free(InStr); UpnpDocument_free(XmlDoc); return -1; } DBGONLY(UpnpPrintf(UPNP_INFO,SOAP,__FILE__,__LINE__,"Found action name = %s\n", ActName);) if( GetActionNode(XmlDoc, ActName, &RespNode) < 0) { DBGONLY(UpnpPrintf(UPNP_CRITICAL,SOAP,__FILE__,__LINE__,"Couldn't find action buffer returning error code\n")); CreateControlFailure(InStr,UPNP_E_INVALID_ACTION,"Invalid control URL!!!!!"); write_bytes(Socket,InStr,strlen(InStr)+1,TIMEOUT); UpnpCloseSocket(Socket); free(InStr); UpnpDocument_free(XmlDoc); return -1; } //UpnpPrintDocument(RespNode, InStr); //printf("Action buffer =%s\n",InStr); DBGONLY(UpnpPrintf(UPNP_INFO,SOAP,__FILE__,__LINE__,"Calling Callback\n")); ActParam = (struct Upnp_Action_Request *) malloc (sizeof(struct Upnp_Action_Request)); if(GetDeviceInfo(CtrlUrl,ActParam->DevUDN, ActParam->ServiceID,&SoapEventCallback,&Cookie)< 0) { DBGONLY(UpnpPrintf(UPNP_INFO,SOAP,__FILE__,__LINE__,"Inside Calling GetDeviceInfo\n")); CreateControlFailure(InStr,UPNP_E_INVALID_ACTION,"Invalid control URL!!!!!"); write_bytes(Socket,InStr,strlen(InStr)+1,TIMEOUT); UpnpDocument_free(XmlDoc); UpnpDocument_free(RespNode); free(InStr); free(ActParam); UpnpCloseSocket(Socket); return -1; } strcpy(ActParam->ActionName,ActName); strcpy(ActParam->ErrStr,""); ActParam->ActionRequest=RespNode; ActParam->ActionResult=NULL; ActParam->ErrCode = UPNP_E_SUCCESS; SoapEventCallback(UPNP_CONTROL_ACTION_REQUEST,ActParam,Cookie); if(ActParam->ErrCode == UPNP_E_SUCCESS && ActParam->ActionResult != NULL) { RespStr = UpnpNewPrintDocument(ActParam->ActionResult); if(RespStr == NULL) { UpnpDocument_free(XmlDoc); UpnpDocument_free(RespNode); free(InStr); free(ActParam); UpnpCloseSocket(Socket); return -1; } if(RespStr != NULL && (int)strlen(RespStr) > abs(BuffLen-HEADER_LENGTH)) { free(InStr); InStr = (char*) malloc(strlen(RespStr)+HEADER_LENGTH); } CreateControlResponse(InStr,RespStr); DBGONLY(UpnpPrintf(UPNP_PACKET,SOAP,__FILE__,__LINE__,"Sending response \n%s\n",InStr);) write_bytes(Socket,InStr,strlen(InStr)+1,TIMEOUT); UpnpDocument_free(ActParam->ActionResult); free(RespStr); } else if (strlen(ActParam->ErrStr) > 1) { CreateControlFailure(InStr,ActParam->ErrCode,ActParam->ErrStr); write_bytes(Socket,InStr,strlen(InStr)+1,TIMEOUT); } else { CreateControlFailure(InStr,ActParam->ErrCode,"Invalid Request!!!!!"); write_bytes(Socket,InStr,strlen(InStr)+1,TIMEOUT); } UpnpDocument_free(XmlDoc); UpnpDocument_free(RespNode); free(InStr); free(ActParam); UpnpCloseSocket(Socket); } else { if(GetVarName(XmlDoc,InStr) < 0) { DBGONLY(UpnpPrintf(UPNP_CRITICAL,SOAP,__FILE__,__LINE__,"Received error in query for var %s\n",InStr);) CreateControlFailure(InStr,UPNP_E_INVALID_URL,"Invalid XML!!!!!"); write_bytes(Socket,InStr,strlen(InStr)+1,TIMEOUT); UpnpCloseSocket(Socket); free(InStr); UpnpDocument_free(XmlDoc); return -1; } DBGONLY(UpnpPrintf(UPNP_INFO,SOAP,__FILE__,__LINE__,"Received query for var = %s\n", InStr);) VarParam = (struct Upnp_State_Var_Request *) malloc (sizeof(struct Upnp_State_Var_Request)); if(GetDeviceInfo(CtrlUrl,VarParam->DevUDN, VarParam->ServiceID,&SoapEventCallback,&Cookie)< 0) { CreateControlFailure(InStr,UPNP_E_INVALID_URL,"Invalid control URL!!!!!"); write_bytes(Socket,InStr,strlen(InStr)+1,TIMEOUT); free(InStr); free(VarParam); UpnpDocument_free(XmlDoc); UpnpCloseSocket(Socket); return -1; } strcpy(VarParam->ErrStr,""); VarParam->ErrCode = UPNP_E_SUCCESS; VarParam->CurrentVal = NULL; strcpy(VarParam->StateVarName, InStr); SoapEventCallback(UPNP_CONTROL_GET_VAR_REQUEST,VarParam,Cookie); DBGONLY(UpnpPrintf(UPNP_INFO,SOAP,__FILE__,__LINE__,"Return from callback for var request\n")); if(VarParam->ErrCode == UPNP_E_SUCCESS) { if(VarParam->CurrentVal != NULL) { if((int)strlen(VarParam->CurrentVal) > abs(BuffLen-HEADER_LENGTH)) { free(InStr); InStr = (char*) malloc(strlen(VarParam->CurrentVal)+HEADER_LENGTH); } CreateControlQueryResponse(InStr,VarParam->CurrentVal); DBGONLY(UpnpPrintf(UPNP_PACKET,SOAP,__FILE__,__LINE__,"Soap server sending packet \n %s\n",InStr);) write_bytes(Socket,InStr,strlen(InStr)+1,TIMEOUT); free(VarParam->CurrentVal); } else { CreateControlQueryResponse(InStr,None); DBGONLY(UpnpPrintf(UPNP_PACKET,SOAP,__FILE__,__LINE__,"Soap server sending packet \n %s\n",InStr);) write_bytes(Socket,InStr,strlen(InStr)+1,TIMEOUT); } } else { if (strlen(VarParam->ErrStr) >1 ) CreateControlFailure(InStr,VarParam->ErrCode,VarParam->ErrStr); else CreateControlFailure(InStr,VarParam->ErrCode,"Unknown Error !!!!!!!!!!!"); write_bytes(Socket,InStr,strlen(InStr)+1,TIMEOUT); } free(InStr); free(VarParam); UpnpDocument_free(XmlDoc); UpnpCloseSocket(Socket); return -1; } } else { CreateControlFailure(InStr,UPNP_E_INVALID_URL,"Invalid control URL !!!!!"); write_bytes(Socket,InStr,strlen(InStr)+1,TIMEOUT); free(InStr); UpnpDocument_free(XmlDoc); UpnpCloseSocket(Socket); } return 1;}#endif ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Function : int InitSoap() // Description : This function initializes the SOAP layer with MiniServer. // // Parameters : None // // Return value: None //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////int InitSoap(){ #ifdef INCLUDE_DEVICE_APIS SetSoapCallback((MiniServerCallback)ProcessSoapEventPacket); #endif return UPNP_E_SUCCESS;}#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -