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