static void belle_sip_body_handler_clone(belle_sip_body_handler_t *obj, const belle_sip_body_handler_t *orig){ obj->progress_cb=orig->progress_cb; obj->user_data=orig->user_data; obj->expected_size=orig->expected_size; obj->transfered_size=orig->transfered_size; obj->headers=belle_sip_list_copy_with_data(orig->headers,(void *(*)(void*))belle_sip_object_clone_and_ref); if (orig->headerStringBuffer!=NULL) { obj->headerStringBuffer = strdup(orig->headerStringBuffer); } }
void belle_http_provider_cancel_request(belle_http_provider_t *obj, belle_http_request_t *req){ belle_sip_list_t *outgoing_messages; belle_http_request_cancel(req); if (req->channel){ // Keep the list of the outgoing messages of the channel... outgoing_messages = belle_sip_list_copy_with_data(req->channel->outgoing_messages,(void* (*)(void*))belle_sip_object_ref); provider_remove_channel(obj, req->channel); // ... close the channel... belle_sip_channel_force_close(req->channel); // ... and reenqueue the previously queued outgoing messages into a new channel belle_sip_list_for_each2(outgoing_messages,(void (*)(void*,void*))reenqueue_request,obj); belle_sip_list_free_with_data(outgoing_messages,belle_sip_object_unref); } }
static void notify_incoming_messages(belle_sip_channel_t *obj){ belle_sip_list_t *elem,*l_it; belle_sip_list_t *listeners=belle_sip_list_copy_with_data(obj->listeners,(void *(*)(void*))belle_sip_object_ref); for(l_it=listeners;l_it!=NULL;l_it=l_it->next){ belle_sip_channel_listener_t *listener=(belle_sip_channel_listener_t*)l_it->data; for(elem=obj->incoming_messages;elem!=NULL;elem=elem->next){ belle_sip_message_t *msg=(belle_sip_message_t*)elem->data; BELLE_SIP_INTERFACE_METHODS_TYPE(belle_sip_channel_listener_t) *methods; methods=BELLE_SIP_INTERFACE_GET_METHODS(listener,belle_sip_channel_listener_t); if (methods->on_message) methods->on_message(listener,obj,msg); } } belle_sip_list_free_with_data(listeners,belle_sip_object_unref); belle_sip_list_free_with_data(obj->incoming_messages,belle_sip_object_unref); obj->incoming_messages=NULL; }
static void belle_sip_multipart_body_handler_clone(belle_sip_multipart_body_handler_t *obj){ obj->parts=belle_sip_list_copy_with_data(obj->parts,(void *(*)(void*))belle_sip_object_clone_and_ref); }