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

📄 upnpapi.c

📁 upnpsdk-1.0.4.tar.gz Intel UPnP SDK Source
💻 C
📖 第 1 页 / 共 5 页
字号:
    OUT char* descURL,    OUT char* descAlias ){    int retVal;    char *membuf = NULL;    char *descStr = NULL;    char *actualAliasStr = NULL;    int descIsMalloked = 0;    if ( description == NULL )    {        return UPNP_E_INVALID_PARAM;    }    // non-URL description must have configuration specified    if ( descriptionType != UPNPREG_URL_DESC && (!config_baseURL) )    {        return UPNP_E_INVALID_PARAM;    }    if ( descriptionType == UPNPREG_URL_DESC )    {        if ((retVal=UpnpDownloadXmlDoc(description, xmlDoc))!=UPNP_E_SUCCESS)        {            return retVal;        }    }    else if ( descriptionType == UPNPREG_FILENAME_DESC )    {        FILE *fp;        unsigned fileLen;        unsigned num_read;        if ( (fp = fopen(description, "rb")) == NULL )        {            return UPNP_E_FILE_NOT_FOUND;        }        fseek( fp, 0, SEEK_END );        fileLen = ftell( fp );        rewind( fp );        if ( (membuf = (char *)malloc(fileLen + 1)) == NULL )        {            fclose( fp );            return UPNP_E_OUTOF_MEMORY;        }        num_read = fread( membuf, 1, fileLen, fp );        if ( num_read != fileLen )        {            fclose( fp );            free( membuf );            return UPNP_E_FILE_READ_ERROR;        }        membuf[fileLen] = 0;        fclose( fp );        *xmlDoc = UpnpParse_Buffer( membuf );        free( membuf );    }    else if ( descriptionType == UPNPREG_BUF_DESC )    {        *xmlDoc = UpnpParse_Buffer( description );    }    else    {        return UPNP_E_INVALID_PARAM;    }    if ( *xmlDoc == NULL )    {        return UPNP_E_INVALID_DESC;    }    // determine alias    if ( config_baseURL )    {        char *aliasStr;        struct sockaddr_in serverAddr;        if ( descriptionType == UPNPREG_BUF_DESC )        {            aliasStr = "description.xml";        }        else  // URL or filename        {            retVal = GetNameForAlias( description, &aliasStr );            if ( retVal != UPNP_E_SUCCESS )            {                UpnpDocument_free( *xmlDoc );                return retVal;            }        }        get_server_addr( &serverAddr );        // config        retVal = Configure_Urlbase( *xmlDoc, &serverAddr,            aliasStr, &actualAliasStr, &descStr );        if ( retVal != UPNP_E_SUCCESS )        {            UpnpDocument_free( *xmlDoc );            return retVal;        }        descIsMalloked = 1;    }    else // manual    {        descStr = description;    }    if ( strlen(descStr) > (LINE_SIZE - 1) )    {        UpnpDocument_free( *xmlDoc );        if ( descIsMalloked )        {            free( descStr );            free( actualAliasStr );        }        return UPNP_E_URL_TOO_BIG;    }    strcpy( descURL, descStr );    if ( descIsMalloked )    {        strcpy( descAlias, actualAliasStr );        free( descStr );        free( actualAliasStr );    }    assert( *xmlDoc != NULL );    return UPNP_E_SUCCESS;}#else   // no web server// returns://   UPNP_E_SUCCESS//   UPNP_E_NO_WEB_SERVER//   UPNP_E_INVALID_PARAM//   UPNP_E_URL_TOO_LONGstatic int GetDescDocumentAndURL( IN Upnp_DescType descriptionType,    IN char* description,    IN unsigned int bufferLen,    IN int config_baseURL,    OUT Upnp_Document* xmlDoc,    OUT char* descURL,    OUT char* descAlias ){    int retVal;    if ( (descriptionType != UPNPREG_URL_DESC) || config_baseURL )    {        return UPNP_E_NO_WEB_SERVER;    }    if ( description == NULL )    {        return UPNP_E_INVALID_PARAM;    }    if ( strlen(description) > (LINE_SIZE - 1) )    {        return UPNP_E_URL_TOO_BIG;    }    strcpy( descURL, description );    if ((retVal=UpnpDownloadXmlDoc(description, xmlDoc))!=UPNP_E_SUCCESS)    {        return retVal;    }    return UPNP_E_SUCCESS;}#endif // INTERNAL_WEB_SERVER// ********************************************************// return codes://   UPNP_E_SUCCESS//   UPNP_E_OUTOF_MEMORY//   UPNP_E_URL_TOO_BIG//   UPNP_E_INVALID_PARAM//   UPNP_E_FILE_NOT_FOUND//   UPNP_E_FILE_READ_ERROR//   UPNP_E_INVALID_URL//   UPNP_E_INVALID_DESC//   UPNP_E_EXT_NOT_XML//   UPNP_E_NETWORK_ERROR//   UPNP_E_SOCKET_WRITE//   UPNP_E_SOCKET_READ//   UPNP_E_SOCKET_BIND//   UPNP_E_SOCKET_CONNECT//   UPNP_E_OUTOF_SOCKET//   UPNP_E_NO_WEB_SERVERint UpnpRegisterRootDevice2( IN Upnp_DescType descriptionType,        IN const char* description_const,        IN size_t bufferLen,    // ignored unless descType == UPNPREG_BUF_DESC        IN int config_baseURL,        IN Upnp_FunPtr Fun,        IN const void* Cookie,        OUT UpnpDevice_Handle* Hnd ){    struct Handle_Info * HInfo;    int retVal=0;    char *description = (char *)description_const;    DBGONLY(UpnpPrintf(UPNP_INFO,API,__FILE__,__LINE__,"Inside UpnpRegisterRootDevice2 \n");)    if(UpnpSdkInit != 1)    {        return UPNP_E_FINISH;    }    if ( Hnd == NULL || Fun == NULL )    {        return UPNP_E_INVALID_PARAM;    }    HandleLock();    if ((*Hnd = GetFreeHandle()) == UPNP_E_OUTOF_HANDLE)    {        HandleUnlock();        return UPNP_E_OUTOF_MEMORY;    }    HInfo = (struct Handle_Info *) malloc (sizeof(struct Handle_Info));    if (HInfo == NULL)    {        HandleUnlock();        return UPNP_E_OUTOF_MEMORY;    }    HandleTable[*Hnd] = HInfo;    // prevent accidental removal of a non-existent alias    HInfo->aliasInstalled = 0;    retVal = GetDescDocumentAndURL( descriptionType, description,        bufferLen, config_baseURL, &HInfo->DescDocument,        HInfo->DescURL, HInfo->DescAlias );    if ( retVal != UPNP_E_SUCCESS )    {        FreeHandle(*Hnd);        HandleUnlock();        return retVal;    }    HInfo->aliasInstalled = (config_baseURL != 0);    HInfo->HType = HND_DEVICE;    HInfo->Callback = Fun;    HInfo->Cookie = (void *)Cookie;    HInfo->MaxAge = DEFAULT_MAXAGE;    HInfo->DeviceList = NULL;    HInfo->ServiceList = NULL;    CLIENTONLY(HInfo->ClientSubList=NULL;)    HInfo->MaxSubscriptions=UPNP_INFINITE;    HInfo->MaxSubscriptionTimeOut=UPNP_INFINITE;    DBGONLY(    UpnpPrintf(UPNP_ALL,API,__FILE__,__LINE__,"UpnpRegisterRootDevice2: Valid Description\n");    UpnpPrintf(UPNP_ALL,API,__FILE__,__LINE__,"UpnpRegisterRootDevice2: DescURL : %s\n", HInfo->DescURL);)    HInfo->DeviceList  = UpnpDocument_getElementsByTagName(HInfo->DescDocument, "device");    if (HInfo->DeviceList == NULL)    {        FreeHandle(*Hnd);        HandleUnlock();        DBGONLY(UpnpPrintf(UPNP_INFO,API,__FILE__,__LINE__,"UpnpRegisterRootDevice2: No devices found for RootDevice\n");)        return UPNP_E_INVALID_DESC;    }    HInfo->ServiceList = UpnpDocument_getElementsByTagName(HInfo->DescDocument , "serviceList");    if (HInfo->ServiceList == NULL)    {        FreeHandle(*Hnd);        HandleUnlock();        DBGONLY(UpnpPrintf(UPNP_INFO,API,__FILE__,__LINE__,"UpnpRegisterRootDevice2: No services found for RootDevice\n");)        return UPNP_E_INVALID_DESC;    }    DBGONLY(UpnpPrintf(UPNP_ALL,API,__FILE__,__LINE__,"UpnpRegisterRootDevice2: Gena Check\n");)    //*******************************    //GENA SET UP    //*******************************    if (getServiceTable(HInfo->DescDocument, &HInfo->ServiceTable,HInfo->DescURL))    {       DBGONLY(UpnpPrintf(UPNP_ALL,API,__FILE__,__LINE__,"UpnpRegisterRootDevice2: GENA Service Table \n");)    }    else    {       DBGONLY(UpnpPrintf(UPNP_ALL,API,__FILE__,__LINE__,"\nUpnpRegisterRootDevice2: No Eventing Support Found \n");)    }    HandleUnlock();    DBGONLY(UpnpPrintf(UPNP_ALL,API,__FILE__,__LINE__,"Exiting RegisterRootDevice2 Successfully\n");)    return UPNP_E_SUCCESS;}  /****************** End of UpnpRegisterRootDevice2  *********************/#endif //INCLUDE_DEVICE_APIS#ifdef INCLUDE_CLIENT_APISint UpnpRegisterClient(IN Upnp_FunPtr Fun,                IN const void * Cookie,                OUT UpnpClient_Handle *Hnd){    struct Handle_Info * HInfo;    DBGONLY(UpnpPrintf(UPNP_ALL,API,__FILE__,__LINE__,"Inside UpnpRegisterClient \n");)    if(UpnpSdkInit != 1)    {        HandleUnlock();        return UPNP_E_FINISH;    }    if (Fun == NULL || Hnd == NULL)         return UPNP_E_INVALID_PARAM;    HandleLock();    if ((*Hnd = GetFreeHandle()) == UPNP_E_OUTOF_HANDLE)     {        HandleUnlock();        return UPNP_E_OUTOF_MEMORY;     }    HInfo = (struct Handle_Info *) malloc (sizeof(struct Handle_Info));    if (HInfo == NULL)     {        HandleUnlock();        return UPNP_E_OUTOF_MEMORY;    }    HInfo->HType = HND_CLIENT;    HInfo->Callback = Fun;    HInfo->Cookie = (void *) Cookie;    HInfo->MaxAge = 0;    HInfo->ClientSubList=NULL;    DEVICEONLY(HInfo->MaxSubscriptions=UPNP_INFINITE;)    DEVICEONLY(HInfo->MaxSubscriptionTimeOut=UPNP_INFINITE;)        HandleTable[*Hnd] = HInfo;    HandleUnlock();    DBGONLY(UpnpPrintf(UPNP_ALL,API,__FILE__,__LINE__,"Exiting UpnpRegisterClient \n");)    return  UPNP_E_SUCCESS;}  /****************** End of UpnpRegisterClient   *********************/#endif // INCLUDE_CLIENT_APIS#ifdef INCLUDE_CLIENT_APISint UpnpUnRegisterClient(IN UpnpClient_Handle Hnd){    struct Handle_Info *HInfo;    DBGONLY(UpnpPrintf(UPNP_ALL,API,__FILE__,__LINE__,"Inside UpnpUnRegisterClient \n");)    #if EXCLUDE_GENA == 0    if (genaUnregisterClient(Hnd) != UPNP_E_SUCCESS)        return UPNP_E_INVALID_HANDLE;    #endif    HandleLock();    if (GetHandleInfo(Hnd, &HInfo) == UPNP_E_INVALID_HANDLE)    {       HandleUnlock();       return UPNP_E_INVALID_HANDLE;    }         FreeHandle(Hnd);    HandleUnlock();    DBGONLY(UpnpPrintf(UPNP_ALL,API,__FILE__,__LINE__,"Exiting UpnpUnRegisterClient \n");)    return  UPNP_E_SUCCESS;}  /****************** End of UpnpUnRegisterClient *********************/#endif // INCLUDE_CLIENT_APIS//-----------------------------------------------------------------------------////                                   SSDP interface////-----------------------------------------------------------------------------#ifdef INCLUDE_DEVICE_APIS#if EXCLUDE_SSDP == 0int UpnpSendAdvertisement(IN UpnpDevice_Handle Hnd, IN int Exp){    struct Handle_Info *  SInfo=NULL;     int retVal = 0, *ptrMx;    upnp_timeout *adEvent;    DBGONLY(UpnpPrintf(UPNP_ALL,API,__FILE__,__LINE__,"Inside UpnpSendAdvertisement \n");)    HandleLock();    if(GetHandleInfo(Hnd, &SInfo) != HND_DEVICE)    {        HandleUnlock();        return UPNP_E_INVALID_HANDLE;    }    if (Exp < 1)	   Exp = DEFAULT_MAXAGE;    SInfo->MaxAge = Exp;     HandleUnlock();     retVal = AdvertiseAndReply(1, Hnd, 0, (struct sockaddr_in *) NULL,                              (char *) NULL, (char *) NULL, (char *) NULL,                              Exp);        if (retVal != UPNP_E_SUCCESS)        return retVal;    ptrMx = (int *) malloc (sizeof(int));    if (ptrMx == NULL)        return UPNP_E_OUTOF_MEMORY;    adEvent = (upnp_timeout *) malloc (sizeof(upnp_timeout));        if (adEvent == NULL)    {           free(ptrMx);         return UPNP_E_OUTOF_MEMORY;    }    *ptrMx = Exp;    adEvent->handle = Hnd;    adEvent->Event = ptrMx;        if ((retVal = ScheduleTimerEvent(Exp - AUTO_ADVERTISEMENT_TIME,                   AutoAdvertise, adEvent, &GLOBAL_TIMER_THREAD,                   &(adEvent->eventId))) !=UPNP_E_SUCCESS)    {        free(adEvent);        free(ptrMx);        return retVal;    }       DBGONLY(UpnpPrintf(UPNP_ALL,API,__FILE__,__LINE__,"Exiting UpnpSendAdvertisement \n");)    return retVal;

⌨️ 快捷键说明

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