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

📄 gena_ctrlpt.c

📁 Upnp开发包文件
💻 C
📖 第 1 页 / 共 2 页
字号:
* Description:														*	This function unsubscribes a SID. It first validates the SID and *	client_handle,copies the subscription, sends UNSUBSCRIBE http request *	to service processes request and finally removes the subscription** Returns: int*	return UPNP_E_SUCCESS if service response is OK else *	returns appropriate error***************************************************************************/intgenaUnSubscribe( IN UpnpClient_Handle client_handle,                 IN const Upnp_SID in_sid ){    client_subscription *sub;    int return_code = GENA_SUCCESS;    struct Handle_Info *handle_info;    client_subscription sub_copy;    http_parser_t response;    HandleLock(  );    // validate handle and sid    if( GetHandleInfo( client_handle, &handle_info ) != HND_CLIENT ) {        HandleUnlock(  );        return GENA_E_BAD_HANDLE;    }    if( ( sub =          GetClientSubClientSID( handle_info->ClientSubList, in_sid ) )        == NULL ) {        HandleUnlock(  );        return GENA_E_BAD_SID;    }    return_code = copy_client_subscription( sub, &sub_copy );    HandleUnlock(  );    return_code = gena_unsubscribe( sub_copy.EventURL, sub_copy.ActualSID,                                    &response );    if( return_code == 0 ) {        httpmsg_destroy( &response.msg );    }    free_client_subscription( &sub_copy );    HandleLock(  );    if( GetHandleInfo( client_handle, &handle_info ) != HND_CLIENT ) {        HandleUnlock(  );        return GENA_E_BAD_HANDLE;    }    RemoveClientSubClientSID( &handle_info->ClientSubList, in_sid );    HandleUnlock(  );    return return_code;}/************************************************************************* Function : genaSubscribe*																	* Parameters:														*	IN UpnpClient_Handle client_handle: *	IN char * PublisherURL: NULL Terminated, of the form : *						"http://134.134.156.80:4000/RedBulb/Event"*	INOUT int * TimeOut: requested Duration, if -1, then "infinite".*						in the OUT case: actual Duration granted *						by Service, -1 for infinite*	OUT Upnp_SID out_sid:sid of subscription, memory passed in by caller** Description:														*	This function subscribes to a PublisherURL ( also mentioned as EventURL*	some places). It sends SUBSCRIBE http request to service processes *	request. Finally adds a Subscription to *	the clients subscription list, if service responds with OK** Returns: int*	return UPNP_E_SUCCESS if service response is OK else *	returns appropriate error***************************************************************************/intgenaSubscribe( IN UpnpClient_Handle client_handle,               IN char *PublisherURL,               INOUT int *TimeOut,               OUT Upnp_SID out_sid ){    int return_code = GENA_SUCCESS;    client_subscription *newSubscription = NULL;    uuid_upnp uid;    Upnp_SID temp_sid;    char *ActualSID = NULL;    struct Handle_Info *handle_info;    char *EventURL = NULL;    DBGONLY( UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__,                         "GENA SUBSCRIBE BEGIN" ) );    HandleLock(  );    memset( out_sid, 0, sizeof( Upnp_SID ) );    // validate handle    if( GetHandleInfo( client_handle, &handle_info ) != HND_CLIENT ) {        HandleUnlock(  );        return GENA_E_BAD_HANDLE;    }    HandleUnlock(  );    // subscribe    SubscribeLock(  );    return_code =        gena_subscribe( PublisherURL, TimeOut, NULL, &ActualSID );    HandleLock(  );    if( return_code != UPNP_E_SUCCESS ) {        DBGONLY( UpnpPrintf( UPNP_CRITICAL, GENA, __FILE__, __LINE__,                             "SUBSCRIBE FAILED in transfer error code: %d returned\n",                             return_code ) );        goto error_handler;    }    if( GetHandleInfo( client_handle, &handle_info ) != HND_CLIENT ) {        return_code = GENA_E_BAD_HANDLE;        goto error_handler;    }    // generate client SID    uuid_create( &uid );    uuid_unpack( &uid, temp_sid );    sprintf( out_sid, "uuid:%s", temp_sid );    // create event url    EventURL = ( char * )malloc( strlen( PublisherURL ) + 1 );    if( EventURL == NULL ) {        return_code = UPNP_E_OUTOF_MEMORY;        goto error_handler;    }    strcpy( EventURL, PublisherURL );    // fill subscription    newSubscription =        ( client_subscription * ) malloc( sizeof( client_subscription ) );    if( newSubscription == NULL ) {        return_code = UPNP_E_OUTOF_MEMORY;        goto error_handler;    }    newSubscription->EventURL = EventURL;    newSubscription->ActualSID = ActualSID;    strcpy( newSubscription->sid, out_sid );    newSubscription->RenewEventId = -1;    newSubscription->next = handle_info->ClientSubList;    handle_info->ClientSubList = newSubscription;    // schedule expiration event    return_code = ScheduleGenaAutoRenew( client_handle, *TimeOut,                                         newSubscription );  error_handler:    if( return_code != UPNP_E_SUCCESS ) {        free( ActualSID );        free( EventURL );        free( newSubscription );    }    HandleUnlock(  );    SubscribeUnlock(  );    return return_code;}/************************************************************************* Function : genaRenewSubscription*																	* Parameters:														*	IN UpnpClient_Handle client_handle: Client handle*	IN const Upnp_SID in_sid: subscription ID*	INOUT int * TimeOut: requested Duration, if -1, then "infinite".*						in the OUT case: actual Duration granted *						by Service, -1 for infinite** Description:														*	This function renews a SID. It first validates the SID and *	client_handle and copies the subscription. It sends RENEW *	(modified SUBSCRIBE) http request to service and processes*	the response.** Returns: int*	return UPNP_E_SUCCESS if service response is OK else *	returns appropriate error***************************************************************************/intgenaRenewSubscription( IN UpnpClient_Handle client_handle,                       IN const Upnp_SID in_sid,                       INOUT int *TimeOut ){    int return_code = GENA_SUCCESS;    client_subscription *sub;    client_subscription sub_copy;    struct Handle_Info *handle_info;    char *ActualSID;    ThreadPoolJob tempJob;    HandleLock(  );    // validate handle and sid    if( GetHandleInfo( client_handle, &handle_info ) != HND_CLIENT ) {        HandleUnlock(  );        return GENA_E_BAD_HANDLE;    }    if( ( sub = GetClientSubClientSID( handle_info->ClientSubList,                                       in_sid ) ) == NULL ) {        HandleUnlock(  );        return GENA_E_BAD_SID;    }    // remove old events    if( TimerThreadRemove( &gTimerThread, sub->RenewEventId, &tempJob ) ==        0 ) {        free_upnp_timeout( ( upnp_timeout * ) tempJob.arg );    }    DBGONLY( UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__,                         "REMOVED AUTO RENEW  EVENT" ) );    sub->RenewEventId = -1;    return_code = copy_client_subscription( sub, &sub_copy );    HandleUnlock(  );    if( return_code != HTTP_SUCCESS ) {        return return_code;    }    return_code = gena_subscribe( sub_copy.EventURL, TimeOut,                                  sub_copy.ActualSID, &ActualSID );    HandleLock(  );    if( GetHandleInfo( client_handle, &handle_info ) != HND_CLIENT ) {        HandleUnlock(  );        if( return_code == UPNP_E_SUCCESS ) {            free( ActualSID );        }        return GENA_E_BAD_HANDLE;    }    // we just called GetHandleInfo, so we don't check for return value    //GetHandleInfo(client_handle, &handle_info);    if( return_code != UPNP_E_SUCCESS ) {        // network failure (remove client sub)        RemoveClientSubClientSID( &handle_info->ClientSubList, in_sid );        free_client_subscription( &sub_copy );        HandleUnlock(  );        return return_code;    }    // get subscription    if( ( sub = GetClientSubClientSID( handle_info->ClientSubList,                                       in_sid ) ) == NULL ) {        free( ActualSID );        free_client_subscription( &sub_copy );        HandleUnlock(  );        return GENA_E_BAD_SID;    }    // store actual sid    free( sub->ActualSID );    sub->ActualSID = ActualSID;    // start renew subscription timer    return_code = ScheduleGenaAutoRenew( client_handle, *TimeOut, sub );    if( return_code != GENA_SUCCESS ) {        RemoveClientSubClientSID( &handle_info->ClientSubList, sub->sid );    }    free_client_subscription( &sub_copy );    HandleUnlock(  );    return return_code;}/************************************************************************* Function : gena_process_notification_event*																	* Parameters:														*	IN SOCKINFO *info: Socket structure containing the device socket *					information*	IN http_message_t* event: The http message contains the GENA *								notification** Description:														*	This function processes NOTIFY events that are sent by devices. *	called by genacallback()** Returns: void** Note : called by genacallback()****************************************************************************/voidgena_process_notification_event( IN SOCKINFO * info,                                 IN http_message_t * event ){    struct Upnp_Event event_struct;    int eventKey;    token sid;    client_subscription *subscription;    IXML_Document *ChangedVars;    struct Handle_Info *handle_info;    void *cookie;    Upnp_FunPtr callback;    UpnpClient_Handle client_handle;    memptr sid_hdr;    memptr nt_hdr,      nts_hdr;    memptr seq_hdr;    // get SID    if( httpmsg_find_hdr( event, HDR_SID, &sid_hdr ) == NULL ) {        error_respond( info, HTTP_PRECONDITION_FAILED, event );        return;    }    sid.buff = sid_hdr.buf;    sid.size = sid_hdr.length;    // get event key    if( httpmsg_find_hdr( event, HDR_SEQ, &seq_hdr ) == NULL ||        matchstr( seq_hdr.buf, seq_hdr.length, "%d%0", &eventKey )        != PARSE_OK ) {        error_respond( info, HTTP_BAD_REQUEST, event );        return;    }    // get NT and NTS headers    if( httpmsg_find_hdr( event, HDR_NT, &nt_hdr ) == NULL ||        httpmsg_find_hdr( event, HDR_NTS, &nts_hdr ) == NULL ) {        error_respond( info, HTTP_BAD_REQUEST, event );        return;    }    // verify NT and NTS headers    if( memptr_cmp( &nt_hdr, "upnp:event" ) != 0 ||        memptr_cmp( &nts_hdr, "upnp:propchange" ) != 0 ) {        error_respond( info, HTTP_PRECONDITION_FAILED, event );        return;    }    // parse the content (should be XML)    if( !has_xml_content_type( event ) ||        event->msg.length == 0 ||        ( ixmlParseBufferEx( event->entity.buf, &ChangedVars ) ) !=        IXML_SUCCESS ) {        error_respond( info, HTTP_BAD_REQUEST, event );        return;    }    HandleLock(  );    // get client info    if( GetClientHandleInfo( &client_handle, &handle_info ) != HND_CLIENT ) {        error_respond( info, HTTP_PRECONDITION_FAILED, event );        HandleUnlock(  );        ixmlDocument_free( ChangedVars );        return;    }    // get subscription based on SID    if( ( subscription = GetClientSubActualSID( handle_info->ClientSubList,                                                &sid ) ) == NULL ) {        if( eventKey == 0 ) {            // wait until we've finished processing a subscription             //   (if we are in the middle)            // this is to avoid mistakenly rejecting the first event if we             //   receive it before the subscription response            HandleUnlock(  );            // try and get Subscription Lock             //   (in case we are in the process of subscribing)            SubscribeLock(  );            // get HandleLock again            HandleLock(  );            if( GetClientHandleInfo( &client_handle, &handle_info )                != HND_CLIENT ) {                error_respond( info, HTTP_PRECONDITION_FAILED, event );                SubscribeUnlock(  );                HandleUnlock(  );                ixmlDocument_free( ChangedVars );                return;            }            if( ( subscription =                  GetClientSubActualSID( handle_info->ClientSubList,                                         &sid ) ) == NULL ) {                error_respond( info, HTTP_PRECONDITION_FAILED, event );                SubscribeUnlock(  );                HandleUnlock(  );                ixmlDocument_free( ChangedVars );                return;            }            SubscribeUnlock(  );        } else {            error_respond( info, HTTP_PRECONDITION_FAILED, event );            HandleUnlock(  );            ixmlDocument_free( ChangedVars );            return;        }    }    error_respond( info, HTTP_OK, event );  // success    // fill event struct    strcpy( event_struct.Sid, subscription->sid );    event_struct.EventKey = eventKey;    event_struct.ChangedVariables = ChangedVars;    // copy callback    callback = handle_info->Callback;    cookie = handle_info->Cookie;    HandleUnlock(  );    // make callback with event struct    // In future, should find a way of mainting    // that the handle is not unregistered in the middle of a    // callback    callback( UPNP_EVENT_RECEIVED, &event_struct, cookie );    ixmlDocument_free( ChangedVars );}#endif // INCLUDE_CLIENT_APIS#endif // EXCLUDE_GENA

⌨️ 快捷键说明

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