1 /*
2 	belle-sip - SIP (RFC3261) library.
3     Copyright (C) 2010  Belledonne Communications SARL
4 
5     This program is free software: you can redistribute it and/or modify
6     it under the terms of the GNU General Public License as published by
7     the Free Software Foundation, either version 2 of the License, or
8     (at your option) any later version.
9 
10     This program is distributed in the hope that it will be useful,
11     but WITHOUT ANY WARRANTY; without even the implied warranty of
12     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13     GNU General Public License for more details.
14 
15     You should have received a copy of the GNU General Public License
16     along with this program.  If not, see <http://www.gnu.org/licenses/>.
17 */
18 #include "belle_sip_internal.h"
19 
20 
belle_sip_response_event_get_response(const belle_sip_response_event_t * event)21 belle_sip_response_t* belle_sip_response_event_get_response(const belle_sip_response_event_t* event) {
22 	return event->response;
23 }
24 
belle_sip_response_event_get_client_transaction(const belle_sip_response_event_t * event)25 belle_sip_client_transaction_t *belle_sip_response_event_get_client_transaction(const belle_sip_response_event_t* event){
26 	return event->client_transaction;
27 }
28 
belle_sip_response_event_get_dialog(const belle_sip_response_event_t * event)29 belle_sip_dialog_t *belle_sip_response_event_get_dialog(const belle_sip_response_event_t* event){
30 	return event->dialog;
31 }
32 
belle_sip_request_event_get_request(const belle_sip_request_event_t * event)33 belle_sip_request_t* belle_sip_request_event_get_request(const belle_sip_request_event_t* event){
34 	return event->request;
35 }
36 
belle_sip_request_event_get_server_transaction(const belle_sip_request_event_t * event)37 belle_sip_server_transaction_t *belle_sip_request_event_get_server_transaction(const belle_sip_request_event_t* event){
38 	return event->server_transaction;
39 }
40 
belle_sip_request_event_get_dialog(const belle_sip_request_event_t * event)41 belle_sip_dialog_t *belle_sip_request_event_get_dialog(const belle_sip_request_event_t* event){
42 	return event->dialog;
43 }
44 
belle_sip_dialog_terminated_event_get_dialog(const belle_sip_dialog_terminated_event_t * event)45 belle_sip_dialog_t* belle_sip_dialog_terminated_event_get_dialog(const belle_sip_dialog_terminated_event_t *event) {
46 	return event->dialog;
47 }
48 
belle_sip_dialog_terminated_event_is_expired(const belle_sip_dialog_terminated_event_t * event)49 int belle_sip_dialog_terminated_event_is_expired(const belle_sip_dialog_terminated_event_t *event){
50 	return event->is_expired;
51 }
52 
belle_sip_io_error_event_get_host(const belle_sip_io_error_event_t * event)53 const char* belle_sip_io_error_event_get_host(const belle_sip_io_error_event_t* event) {
54 	return event->host;
55 }
56 
belle_sip_io_error_event_get_transport(const belle_sip_io_error_event_t * event)57 const char* belle_sip_io_error_event_get_transport(const belle_sip_io_error_event_t* event) {
58 	return event->transport;
59 }
60 
belle_sip_io_error_event_port(const belle_sip_io_error_event_t * event)61 unsigned int belle_sip_io_error_event_port(const belle_sip_io_error_event_t* event) {
62 	return event->port;
63 }
64 
belle_sip_io_error_event_get_source(const belle_sip_io_error_event_t * event)65 belle_sip_object_t* belle_sip_io_error_event_get_source(const belle_sip_io_error_event_t* event) {
66 	return event->source;
67 }
68 
69 
70 
71 typedef struct belle_sip_callbacks belle_sip_callbacks_t;
72 
73 struct belle_sip_callbacks{
74 	belle_sip_object_t base;
75 	belle_sip_listener_callbacks_t cbs;
76 	void *user_ctx;
77 };
78 
79 
process_dialog_terminated(belle_sip_listener_t * l,const belle_sip_dialog_terminated_event_t * event)80 static void process_dialog_terminated(belle_sip_listener_t *l, const belle_sip_dialog_terminated_event_t *event){
81 	belle_sip_callbacks_t *obj=(belle_sip_callbacks_t*)l;
82 	if (obj->cbs.process_dialog_terminated)
83 		obj->cbs.process_dialog_terminated(obj->user_ctx,event);
84 }
85 
process_io_error(belle_sip_listener_t * l,const belle_sip_io_error_event_t * event)86 static void process_io_error(belle_sip_listener_t *l, const belle_sip_io_error_event_t *event){
87 	belle_sip_callbacks_t *obj=(belle_sip_callbacks_t*)l;
88 	if (obj->cbs.process_io_error)
89 		obj->cbs.process_io_error(obj->user_ctx,event);
90 }
91 
process_request_event(belle_sip_listener_t * l,const belle_sip_request_event_t * event)92 static void process_request_event(belle_sip_listener_t *l, const belle_sip_request_event_t *event){
93 	belle_sip_callbacks_t *obj=(belle_sip_callbacks_t*)l;
94 	if (obj->cbs.process_request_event)
95 		obj->cbs.process_request_event(obj->user_ctx,event);
96 }
97 
process_response_event(belle_sip_listener_t * l,const belle_sip_response_event_t * event)98 static void process_response_event(belle_sip_listener_t *l, const belle_sip_response_event_t *event){
99 	belle_sip_callbacks_t *obj=(belle_sip_callbacks_t*)l;
100 	if (obj->cbs.process_response_event)
101 		obj->cbs.process_response_event(obj->user_ctx,event);
102 }
103 
process_timeout(belle_sip_listener_t * l,const belle_sip_timeout_event_t * event)104 static void process_timeout(belle_sip_listener_t *l, const belle_sip_timeout_event_t *event){
105 	belle_sip_callbacks_t *obj=(belle_sip_callbacks_t*)l;
106 	if (obj->cbs.process_timeout)
107 		obj->cbs.process_timeout(obj->user_ctx,event);
108 }
109 
process_transaction_terminated(belle_sip_listener_t * l,const belle_sip_transaction_terminated_event_t * event)110 static void process_transaction_terminated(belle_sip_listener_t *l, const belle_sip_transaction_terminated_event_t *event){
111 	belle_sip_callbacks_t *obj=(belle_sip_callbacks_t*)l;
112 	if (obj->cbs.process_transaction_terminated)
113 		obj->cbs.process_transaction_terminated(obj->user_ctx,event);
114 }
process_auth_requested(belle_sip_listener_t * l,belle_sip_auth_event_t * event)115 static void process_auth_requested(belle_sip_listener_t *l, belle_sip_auth_event_t *event){
116 	belle_sip_callbacks_t *obj=(belle_sip_callbacks_t*)l;
117 	if (obj->cbs.process_auth_requested)
118 		obj->cbs.process_auth_requested(obj->user_ctx,event);
119 }
120 
121 BELLE_SIP_DECLARE_VPTR(belle_sip_callbacks_t);
122 
123 BELLE_SIP_IMPLEMENT_INTERFACE_BEGIN(belle_sip_callbacks_t,belle_sip_listener_t)
124 	process_dialog_terminated,
125 	process_io_error,
126 	process_request_event,
127 	process_response_event,
128 	process_timeout,
129 	process_transaction_terminated,
130 	process_auth_requested
131 BELLE_SIP_IMPLEMENT_INTERFACE_END
132 
133 BELLE_SIP_DECLARE_IMPLEMENTED_INTERFACES_1(belle_sip_callbacks_t,belle_sip_listener_t);
134 
belle_sip_callbacks_destroy(belle_sip_callbacks_t * obj)135 static void belle_sip_callbacks_destroy(belle_sip_callbacks_t *obj){
136 	if (obj->cbs.listener_destroyed)
137 		obj->cbs.listener_destroyed(obj->user_ctx);
138 }
139 
140 BELLE_SIP_INSTANCIATE_VPTR(belle_sip_callbacks_t,belle_sip_object_t,belle_sip_callbacks_destroy,NULL,NULL,FALSE);
141 
142 
belle_sip_listener_create_from_callbacks(const belle_sip_listener_callbacks_t * callbacks,void * user_ctx)143 belle_sip_listener_t *belle_sip_listener_create_from_callbacks(const belle_sip_listener_callbacks_t *callbacks, void *user_ctx){
144 	belle_sip_callbacks_t *obj=belle_sip_object_new(belle_sip_callbacks_t);
145 	memcpy(&obj->cbs,callbacks,sizeof(belle_sip_listener_callbacks_t));
146 	obj->user_ctx=user_ctx;
147 	return BELLE_SIP_LISTENER(obj);
148 }
149 
belle_sip_transaction_terminated_event_get_client_transaction(const belle_sip_transaction_terminated_event_t * event)150 belle_sip_client_transaction_t *belle_sip_transaction_terminated_event_get_client_transaction(const belle_sip_transaction_terminated_event_t* event) {
151 	return event->is_server_transaction ? NULL:BELLE_SIP_CLIENT_TRANSACTION(event->transaction);
152 }
belle_sip_transaction_terminated_event_get_server_transaction(const belle_sip_transaction_terminated_event_t * event)153 belle_sip_server_transaction_t *belle_sip_transaction_terminated_event_get_server_transaction(const belle_sip_transaction_terminated_event_t* event) {
154 	return event->is_server_transaction ? BELLE_SIP_SERVER_TRANSACTION(event->transaction):NULL;
155 }
156 
belle_sip_timeout_event_get_client_transaction(const belle_sip_timeout_event_t * event)157 belle_sip_client_transaction_t *belle_sip_timeout_event_get_client_transaction(const belle_sip_timeout_event_t* event) {
158 	return event->is_server_transaction ? NULL:BELLE_SIP_CLIENT_TRANSACTION(event->transaction);
159 }
belle_sip_timeout_event_get_server_transaction(const belle_sip_timeout_event_t * event)160 belle_sip_server_transaction_t *belle_sip_timeout_event_get_server_transaction(const belle_sip_timeout_event_t* event) {
161 	return event->is_server_transaction ? BELLE_SIP_SERVER_TRANSACTION(event->transaction):NULL;
162 }
163