void RemoveClientSubClientSID(GenlibClientSubscription **head, const UpnpString *sid) { GenlibClientSubscription *finger = *head; GenlibClientSubscription *previous = NULL; int found = 0; while (finger) { found = !strcmp( UpnpString_get_String(sid), GenlibClientSubscription_get_SID_cstr(finger)); if (found) { if (previous) { GenlibClientSubscription_set_Next(previous, GenlibClientSubscription_get_Next(finger)); } else { *head = GenlibClientSubscription_get_Next(finger); } GenlibClientSubscription_set_Next(finger, NULL); freeClientSubList(finger); finger = NULL; } else { previous = finger; finger = GenlibClientSubscription_get_Next(finger); } } }
/************************************************************************ * Function : genaUnregisterClient * * Parameters: * IN UpnpClient_Handle client_handle: Handle containing all the control * point related information * * Description: * This function unsubcribes all the outstanding subscriptions and cleans * the subscription list. This function is called when control point * unregisters. * * Returns: int * return UPNP_E_SUCCESS if successful else returns appropriate error ***************************************************************************/ int genaUnregisterClient( IN UpnpClient_Handle client_handle ) { client_subscription sub_copy; int return_code = UPNP_E_SUCCESS; struct Handle_Info *handle_info = NULL; http_parser_t response; while( TRUE ) { HandleLock( ); if( GetHandleInfo( client_handle, &handle_info ) != HND_CLIENT ) { HandleUnlock( ); return GENA_E_BAD_HANDLE; } if( handle_info->ClientSubList == NULL ) { return_code = UPNP_E_SUCCESS; break; } return_code = copy_client_subscription( handle_info->ClientSubList, &sub_copy ); if( return_code != HTTP_SUCCESS ) { break; } RemoveClientSubClientSID( &handle_info->ClientSubList, sub_copy.sid ); 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 ); } freeClientSubList( handle_info->ClientSubList ); HandleUnlock( ); return return_code; }
int genaUnregisterClient(UpnpClient_Handle client_handle) { ClientSubscription *sub_copy = UpnpClientSubscription_new(); int return_code = UPNP_E_SUCCESS; struct Handle_Info *handle_info = NULL; http_parser_t response; while (TRUE) { HandleLock(); if (GetHandleInfo(client_handle, &handle_info) != HND_CLIENT) { HandleUnlock(); return_code = GENA_E_BAD_HANDLE; goto exit_function; } if (handle_info->ClientSubList == NULL) { return_code = UPNP_E_SUCCESS; break; } UpnpClientSubscription_assign(sub_copy, handle_info->ClientSubList); RemoveClientSubClientSID( &handle_info->ClientSubList, UpnpClientSubscription_get_SID(sub_copy)); HandleUnlock(); return_code = gena_unsubscribe( UpnpClientSubscription_get_EventURL(sub_copy), UpnpClientSubscription_get_ActualSID(sub_copy), &response); if (return_code == 0) { httpmsg_destroy(&response.msg); } free_client_subscription(sub_copy); } freeClientSubList(handle_info->ClientSubList); HandleUnlock(); exit_function: UpnpClientSubscription_delete(sub_copy); return return_code; }