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

📄 soap.c

📁 upnpsdk-1.0.4.tar.gz Intel UPnP SDK Source
💻 C
📖 第 1 页 / 共 3 页
字号:
    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 + -