static void caller_process_response_event(void *user_ctx, const belle_sip_response_event_t *event){ belle_sip_client_transaction_t* client_transaction = belle_sip_response_event_get_client_transaction(event); belle_sip_header_from_t* from=belle_sip_message_get_header_by_type(belle_sip_response_event_get_response(event),belle_sip_header_from_t); belle_sip_header_cseq_t* invite_cseq=belle_sip_message_get_header_by_type(belle_sip_transaction_get_request(BELLE_SIP_TRANSACTION(client_transaction)),belle_sip_header_cseq_t); belle_sip_request_t* ack; belle_sip_dialog_t* dialog; int status; if (!belle_sip_uri_equals(BELLE_SIP_URI(user_ctx),belle_sip_header_address_get_uri(BELLE_SIP_HEADER_ADDRESS(from)))) { belle_sip_message("Message [%p] not for caller, skipping",belle_sip_response_event_get_response(event)); return; /*not for the caller*/ } status = belle_sip_response_get_status_code(belle_sip_response_event_get_response(event)); belle_sip_message("caller_process_response_event [%i]",status); if (BC_ASSERT_PTR_NOT_NULL(client_transaction)) { dialog = belle_sip_transaction_get_dialog(BELLE_SIP_TRANSACTION(client_transaction)); if (BC_ASSERT_PTR_NOT_NULL(dialog)) { BC_ASSERT_PTR_EQUAL(caller_dialog,dialog); if (belle_sip_dialog_get_state(dialog) == BELLE_SIP_DIALOG_NULL) { BC_ASSERT_EQUAL(status,100, int, "%d"); } else if (belle_sip_dialog_get_state(dialog) == BELLE_SIP_DIALOG_EARLY){ BC_ASSERT_EQUAL(status,180, int, "%d"); /*send 200ok from callee*/ belle_sip_server_transaction_send_response(inserv_transaction,ok_response); belle_sip_object_unref(ok_response); ok_response=NULL; } else if (belle_sip_dialog_get_state(dialog) == BELLE_SIP_DIALOG_CONFIRMED) {
static void callee_process_request_event(void *user_ctx, const belle_sip_request_event_t *event) { belle_sip_dialog_t* dialog; belle_sip_response_t* ringing_response; belle_sip_header_content_type_t* content_type ; belle_sip_header_content_length_t* content_length; belle_sip_server_transaction_t* server_transaction = belle_sip_request_event_get_server_transaction(event); belle_sip_header_to_t* to=belle_sip_message_get_header_by_type(belle_sip_request_event_get_request(event),belle_sip_header_to_t); const char* method; if (!belle_sip_uri_equals(BELLE_SIP_URI(user_ctx),belle_sip_header_address_get_uri(BELLE_SIP_HEADER_ADDRESS(to)))) { belle_sip_message("Message [%p] not for callee, skipping",belle_sip_request_event_get_request(event)); return; /*not for the callee*/ } method = belle_sip_request_get_method(belle_sip_request_event_get_request(event)); if (!server_transaction && strcmp(method,"ACK")!=0) { server_transaction= belle_sip_provider_create_server_transaction(prov,belle_sip_request_event_get_request(event)); } belle_sip_message("callee_process_request_event received [%s] message",method); dialog = belle_sip_request_event_get_dialog(event); if (!dialog ) { BC_ASSERT_STRING_EQUAL_FATAL("INVITE",method); dialog=belle_sip_provider_create_dialog(prov,BELLE_SIP_TRANSACTION(server_transaction)); callee_dialog=dialog; inserv_transaction=server_transaction; } if (belle_sip_dialog_get_state(dialog) == BELLE_SIP_DIALOG_NULL) { ringing_response = belle_sip_response_create_from_request(belle_sip_transaction_get_request(BELLE_SIP_TRANSACTION(server_transaction)),180); /*prepare 200ok*/ ok_response = belle_sip_response_create_from_request(belle_sip_transaction_get_request(BELLE_SIP_TRANSACTION(server_transaction)),200); content_length= belle_sip_header_content_length_create(strlen(sdp)); content_type = belle_sip_header_content_type_create("application","sdp"); belle_sip_message_add_header(BELLE_SIP_MESSAGE(ok_response),BELLE_SIP_HEADER(content_type)); belle_sip_message_add_header(BELLE_SIP_MESSAGE(ok_response),BELLE_SIP_HEADER(content_length)); belle_sip_message_set_body(BELLE_SIP_MESSAGE(ok_response),sdp,strlen(sdp)); belle_sip_object_ref(ok_response); /*only send ringing*/ belle_sip_server_transaction_send_response(server_transaction,ringing_response); } else if (belle_sip_dialog_get_state(dialog) == BELLE_SIP_DIALOG_CONFIRMED) { /*time to send bye*/ belle_sip_client_transaction_t* client_transaction = belle_sip_provider_create_client_transaction(prov,belle_sip_dialog_create_request(dialog,"BYE")); belle_sip_client_transaction_send_request(client_transaction); } else { belle_sip_warning("Unexpected state [%s] for dialog [%p]",belle_sip_dialog_state_to_string(belle_sip_dialog_get_state(dialog)),dialog ); } }
static void caller_process_request_event(void *user_ctx, const belle_sip_request_event_t *event) { belle_sip_server_transaction_t* server_transaction; belle_sip_response_t* resp; belle_sip_dialog_t* dialog; belle_sip_header_to_t* to=belle_sip_message_get_header_by_type(belle_sip_request_event_get_request(event),belle_sip_header_to_t); if (!belle_sip_uri_equals(BELLE_SIP_URI(user_ctx),belle_sip_header_address_get_uri(BELLE_SIP_HEADER_ADDRESS(to)))) { belle_sip_message("Message [%p] not for caller, skipping",belle_sip_request_event_get_request(event)); return; /*not for the caller*/ } belle_sip_message("caller_process_request_event received [%s] message",belle_sip_request_get_method(belle_sip_request_event_get_request(event))); server_transaction=belle_sip_provider_create_server_transaction(prov,belle_sip_request_event_get_request(event)); BC_ASSERT_STRING_EQUAL_FATAL("BYE",belle_sip_request_get_method(belle_sip_request_event_get_request(event))); dialog = belle_sip_transaction_get_dialog(BELLE_SIP_TRANSACTION(server_transaction)); BC_ASSERT_PTR_NOT_NULL_FATAL(dialog); BC_ASSERT_EQUAL(belle_sip_dialog_get_state(dialog) , BELLE_SIP_DIALOG_CONFIRMED, int, "%d"); resp=belle_sip_response_create_from_request(belle_sip_request_event_get_request(event),200); belle_sip_server_transaction_send_response(server_transaction,resp); }
static void test_uri_equals(void) { belle_sip_uri_t* a; belle_sip_uri_t* b; /* * The URIs within each of the following sets are equivalent: sip:%[email protected];transport=TCP sip:[email protected];Transport=tcp */ a = belle_sip_uri_parse("sip:%[email protected];transport=TCP"); CU_ASSERT_PTR_NOT_NULL_FATAL(a); b = belle_sip_uri_parse("sip:[email protected];Transport=tcp"); CU_ASSERT_PTR_NOT_NULL_FATAL(b); CU_ASSERT_TRUE(belle_sip_uri_equals(a,b)); belle_sip_object_unref(a); belle_sip_object_unref(b); /* sip:[email protected] sip:[email protected];newparam=5 sip:[email protected];security=on */ a = belle_sip_uri_parse("sip:[email protected]"); CU_ASSERT_PTR_NOT_NULL_FATAL(a); b = belle_sip_uri_parse("sip:[email protected];newparam=5"); CU_ASSERT_PTR_NOT_NULL_FATAL(b); CU_ASSERT_TRUE(belle_sip_uri_equals(a,b)); belle_sip_object_unref(a); belle_sip_object_unref(b); /* sip:biloxi.com;transport=tcp;method=REGISTER?to=sip:bob%40biloxi.com sip:biloxi.com;method=REGISTER;transport=tcp?to=sip:bob%40biloxi.com */ a = belle_sip_uri_parse("sip:biloxi.com;transport=tcp;method=REGISTER?to=sip:bob%40biloxi.com"); CU_ASSERT_PTR_NOT_NULL_FATAL(a); b = belle_sip_uri_parse("sip:biloxi.com;method=REGISTER;transport=tcp?to=sip:bob%40biloxi.com"); CU_ASSERT_PTR_NOT_NULL_FATAL(b); CU_ASSERT_TRUE(belle_sip_uri_equals(a,b)); belle_sip_object_unref(a); belle_sip_object_unref(b); /* sip:[email protected]?subject=project%20x&priority=urgent sip:[email protected]?priority=urgent&subject=project%20x The URIs within each of the following sets are not equivalent: SIP:[email protected];Transport=udp (different usernames) sip:[email protected];Transport=UDP */ a = belle_sip_uri_parse("sip:[email protected];Transport=udp"); CU_ASSERT_PTR_NOT_NULL_FATAL(a); b = belle_sip_uri_parse("sip:[email protected];Transport=UDP"); CU_ASSERT_PTR_NOT_NULL_FATAL(b); CU_ASSERT_FALSE(belle_sip_uri_equals(a,b)); belle_sip_object_unref(a); belle_sip_object_unref(b); /* sip:[email protected] (can resolve to different ports) sip:[email protected]:5060 */ a = belle_sip_uri_parse("sip:[email protected];Transport=udp"); CU_ASSERT_PTR_NOT_NULL_FATAL(a); b = belle_sip_uri_parse("sip:[email protected];Transport=UDP"); CU_ASSERT_PTR_NOT_NULL_FATAL(b); CU_ASSERT_FALSE(belle_sip_uri_equals(a,b)); belle_sip_object_unref(a); belle_sip_object_unref(b); /* sip:[email protected] (can resolve to different transports) sip:[email protected];transport=udp */ a = belle_sip_uri_parse("sip:[email protected]"); CU_ASSERT_PTR_NOT_NULL_FATAL(a); b = belle_sip_uri_parse("sip:[email protected];transport=udp"); CU_ASSERT_PTR_NOT_NULL_FATAL(b); CU_ASSERT_FALSE(belle_sip_uri_equals(a,b)); belle_sip_object_unref(a); belle_sip_object_unref(b); /* sip:[email protected] (can resolve to different port and transports) sip:[email protected]:6000;transport=tcp */ a = belle_sip_uri_parse("sip:[email protected]"); CU_ASSERT_PTR_NOT_NULL_FATAL(a); b = belle_sip_uri_parse("sip:[email protected]:6000;transport=tcp"); CU_ASSERT_PTR_NOT_NULL_FATAL(b); CU_ASSERT_FALSE(belle_sip_uri_equals(a,b)); belle_sip_object_unref(a); belle_sip_object_unref(b); /* sip:[email protected] (different header component) sip:[email protected]?Subject=next%20meeting sip:[email protected] (even though that's what sip:[email protected] phone21.boxesbybob.com resolves to) Note that equality is not transitive: o sip:[email protected] and sip:[email protected];security=on are equivalent o sip:[email protected] and sip:[email protected];security=off are equivalent o sip:[email protected];security=on and sip:[email protected];security=off are not equivalent Rosenberg, et. al. Standards Track [Page 155] RFC 3261 SIP: Session Initiation Protocol June 2002 */ }