Commit fbfe1d5f authored by jehan's avatar jehan
Browse files

implement find dialog from callid/from_tag/to_tag

parent ee120693
......@@ -26,11 +26,11 @@ BELLE_SIP_BEGIN_DECLS
BELLESIP_EXPORT int belle_sip_provider_add_listening_point(belle_sip_provider_t *p, belle_sip_listening_point_t *lp);
void belle_sip_provider_remove_listening_point(belle_sip_provider_t *p, belle_sip_listening_point_t *lp);
BELLESIP_EXPORT void belle_sip_provider_remove_listening_point(belle_sip_provider_t *p, belle_sip_listening_point_t *lp);
BELLESIP_EXPORT belle_sip_listening_point_t *belle_sip_provider_get_listening_point(belle_sip_provider_t *p, const char *transport);
const belle_sip_list_t *belle_sip_provider_get_listening_points(belle_sip_provider_t *p);
BELLESIP_EXPORT const belle_sip_list_t *belle_sip_provider_get_listening_points(belle_sip_provider_t *p);
BELLESIP_EXPORT void belle_sip_provider_add_sip_listener(belle_sip_provider_t *p, belle_sip_listener_t *l);
......@@ -44,13 +44,13 @@ BELLESIP_EXPORT belle_sip_client_transaction_t *belle_sip_provider_create_client
BELLESIP_EXPORT belle_sip_server_transaction_t *belle_sip_provider_create_server_transaction(belle_sip_provider_t *p, belle_sip_request_t *req);
belle_sip_stack_t *belle_sip_provider_get_sip_stack(belle_sip_provider_t *p);
BELLESIP_EXPORT belle_sip_stack_t *belle_sip_provider_get_sip_stack(belle_sip_provider_t *p);
BELLESIP_EXPORT void belle_sip_provider_send_request(belle_sip_provider_t *p, belle_sip_request_t *req);
void belle_sip_provider_send_response(belle_sip_provider_t *p, belle_sip_response_t *resp);
BELLESIP_EXPORT void belle_sip_provider_send_response(belle_sip_provider_t *p, belle_sip_response_t *resp);
void belle_sip_provider_clean_channels(belle_sip_provider_t *p);
BELLESIP_EXPORT void belle_sip_provider_clean_channels(belle_sip_provider_t *p);
/**
* Add auth info to the request if found
......@@ -69,8 +69,18 @@ BELLESIP_EXPORT int belle_sip_provider_add_authorization(belle_sip_provider_t *p
* @param stack
* @param recv_error if <=0, will cause channel error to be reported
**/
BELLESIP_EXPORT void belle_sip_provider_set_recv_error(belle_sip_provider_t *prov, int recv_error);
void belle_sip_provider_set_recv_error(belle_sip_provider_t *prov, int recv_error);
/**
* Provides access to a specific dialog
* @param prov object
* @param call_if of the dialog
* @param from_tag of the dialog
* @param to_tag of the dialog
* @returns dialog corresponding to this parameter or NULL if not found
*
**/
BELLESIP_EXPORT belle_sip_dialog_t* belle_sip_provider_find_dialog(const belle_sip_provider_t *prov, const char* call_id,const char* from_tag,const char* to_tag);
BELLE_SIP_END_DECLS
......
......@@ -1322,7 +1322,7 @@ char* belle_sip_header_replaces_value_to_escaped_string(const belle_sip_header_r
break;
}
}
output_buff[out_buff_index]='\0';
return belle_sip_strdup(output_buff);
}
belle_sip_header_replaces_t* belle_sip_header_replaces_create(const char* call_id,const char* from_tag,const char* to_tag) {
......
......@@ -668,3 +668,26 @@ int belle_sip_dialog_handle_ack(belle_sip_dialog_t *obj, belle_sip_request_t *ac
belle_sip_message("Dialog ignoring incoming ACK (surely a retransmission)");
return -1;
}
belle_sip_dialog_t* belle_sip_provider_find_dialog(const belle_sip_provider_t *prov, const char* call_id,const char* from_tag,const char* to_tag) {
belle_sip_list_t* iterator;
for(iterator=prov->dialogs;iterator!=NULL;iterator=iterator->next) {
belle_sip_dialog_t* dialog=(belle_sip_dialog_t*)iterator->data;
if (strcmp(belle_sip_header_call_id_get_call_id(belle_sip_dialog_get_call_id(dialog)),call_id)==0) {
const char* target_from;
const char*target_to;
if (belle_sip_dialog_is_server(dialog)) {
target_to=belle_sip_dialog_get_local_tag(dialog);
target_from=belle_sip_dialog_get_remote_tag(dialog);
} else {
target_from=belle_sip_dialog_get_local_tag(dialog);
target_to=belle_sip_dialog_get_remote_tag(dialog);
}
if (strcmp(from_tag,target_from)==0 && strcmp(to_tag,target_to)==0) {
return dialog;
}
}
}
return NULL;
}
......@@ -20,7 +20,7 @@
#include "listeningpoint_internal.h"
#include "md5.h"
belle_sip_dialog_t *belle_sip_provider_find_dialog(belle_sip_provider_t *prov, belle_sip_request_t *msg, int as_uas);
belle_sip_dialog_t *belle_sip_provider_find_dialog_from_msg(belle_sip_provider_t *prov, belle_sip_request_t *msg, int as_uas);
typedef struct authorization_context {
belle_sip_header_call_id_t* callid;
......@@ -94,7 +94,7 @@ static void belle_sip_provider_dispatch_request(belle_sip_provider_t* prov, bell
/* Should we limit to ACK ? */
/*Search for a dialog if exist */
ev.dialog=belle_sip_provider_find_dialog(prov,req,1/*request=uas*/);
ev.dialog=belle_sip_provider_find_dialog_from_msg(prov,req,1/*request=uas*/);
if (strcmp("ACK",belle_sip_request_get_method(req))==0){
if (!ev.dialog) {
belle_sip_warning("Provider [%p] received an unexpected stateless ACK",prov);
......@@ -355,7 +355,7 @@ belle_sip_dialog_t * belle_sip_provider_create_dialog_internal(belle_sip_provide
}
/*finds an existing dialog for an outgoing or incoming request */
belle_sip_dialog_t *belle_sip_provider_find_dialog(belle_sip_provider_t *prov, belle_sip_request_t *msg, int as_uas){
belle_sip_dialog_t *belle_sip_provider_find_dialog_from_msg(belle_sip_provider_t *prov, belle_sip_request_t *msg, int as_uas){
belle_sip_list_t *elem;
belle_sip_dialog_t *dialog;
belle_sip_dialog_t *returned_dialog=NULL;
......@@ -437,7 +437,7 @@ belle_sip_client_transaction_t *belle_sip_provider_create_client_transaction(bel
}
}
}
belle_sip_transaction_set_dialog((belle_sip_transaction_t*)t,belle_sip_provider_find_dialog(prov,req,FALSE));
belle_sip_transaction_set_dialog((belle_sip_transaction_t*)t,belle_sip_provider_find_dialog_from_msg(prov,req,FALSE));
return t;
}
......@@ -450,7 +450,7 @@ belle_sip_server_transaction_t *belle_sip_provider_create_server_transaction(bel
return NULL;
}else
t=(belle_sip_server_transaction_t*)belle_sip_nist_new(prov,req);
belle_sip_transaction_set_dialog((belle_sip_transaction_t*)t,belle_sip_provider_find_dialog(prov,req,TRUE));
belle_sip_transaction_set_dialog((belle_sip_transaction_t*)t,belle_sip_provider_find_dialog_from_msg(prov,req,TRUE));
belle_sip_provider_add_server_transaction(prov,t);
return t;
}
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment