3 Copyright (C) 2010 Simon MORLAT (simon.morlat@free.fr)
5 This program is free software; you can redistribute it and/or
6 modify it under the terms of the GNU General Public License
7 as published by the Free Software Foundation; either version 2
8 of the License, or (at your option) any later version.
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.
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
21 This header files defines the Signaling Abstraction Layer.
22 The purpose of this layer is too allow experiment different call signaling
23 protocols and implementations under linphone, for example SIP, JINGLE...
29 #include "mediastreamer2/mscommon.h"
33 typedef struct Sal Sal;
37 typedef struct SalOp SalOp;
41 typedef struct SalAddress SalAddress;
43 /* Address manipulation API*/
44 SalAddress * sal_address_new(const char *uri);
45 SalAddress * sal_address_clone(const SalAddress *addr);
46 const char *sal_address_get_scheme(const SalAddress *addr);
47 const char *sal_address_get_display_name(const SalAddress* addr);
48 const char *sal_address_get_username(const SalAddress *addr);
49 const char *sal_address_get_domain(const SalAddress *addr);
50 void sal_address_set_display_name(SalAddress *addr, const char *display_name);
51 void sal_address_set_username(SalAddress *addr, const char *username);
52 void sal_address_set_domain(SalAddress *addr, const char *host);
53 void sal_address_set_port(SalAddress *addr, const char *port);
54 void sal_address_set_port_int(SalAddress *uri, int port);
55 void sal_address_clean(SalAddress *addr);
56 char *sal_address_as_string(const SalAddress *u);
57 char *sal_address_as_string_uri_only(const SalAddress *u);
58 void sal_address_destroy(SalAddress *u);
64 void sal_uninit(Sal* sal);
65 void sal_set_user_pointer(Sal *sal, void *user_data);
66 void *sal_get_user_pointer(const Sal *sal);
85 typedef struct SalEndpointCandidate{
88 }SalEndpointCandidate;
90 #define SAL_ENDPOINT_CANDIDATE_MAX 2
92 typedef struct SalStreamDescription{
97 MSList *payloads; //<list of PayloadType
100 SalEndpointCandidate candidates[SAL_ENDPOINT_CANDIDATE_MAX];
101 } SalStreamDescription;
103 #define SAL_MEDIA_DESCRIPTION_MAX_STREAMS 4
105 typedef struct SalMediaDescription{
110 SalStreamDescription streams[SAL_MEDIA_DESCRIPTION_MAX_STREAMS];
111 } SalMediaDescription;
113 SalMediaDescription *sal_media_description_new();
114 void sal_media_description_ref(SalMediaDescription *md);
115 void sal_media_description_unref(SalMediaDescription *md);
116 bool_t sal_media_description_empty(SalMediaDescription *md);
117 const SalStreamDescription *sal_media_description_find_stream(const SalMediaDescription *md,
118 SalMediaProto proto, SalStreamType type);
120 /*this structure must be at the first byte of the SalOp structure defined by implementors*/
121 typedef struct SalOpBase{
123 char *route; /*or request-uri for REGISTER*/
128 SalMediaDescription *local_media;
129 SalMediaDescription *remote_media;
134 typedef enum SalError{
137 SalErrorFailure, /* see SalReason for more details */
141 typedef enum SalReason{
145 SalReasonTemporarilyUnavailable,
147 SalReasonDoNotDisturb,
153 typedef enum SalPresenceStatus{
157 SalPresenceBerightback,
159 SalPresenceOnthephone,
160 SalPresenceOuttolunch,
161 SalPresenceDonotdisturb,
163 SalPresenceAltService,
166 typedef enum SalSubscribeState{
168 SalSubscribeTerminated
171 typedef void (*SalOnCallReceived)(SalOp *op);
172 typedef void (*SalOnCallRinging)(SalOp *op);
173 typedef void (*SalOnCallAccepted)(SalOp *op);
174 typedef void (*SalOnCallAck)(SalOp *op);
175 typedef void (*SalOnCallUpdated)(SalOp *op);
176 typedef void (*SalOnCallTerminated)(SalOp *op, const char *from);
177 typedef void (*SalOnCallFailure)(SalOp *op, SalError error, SalReason reason, const char *details);
178 typedef void (*SalOnAuthRequested)(SalOp *op, const char *realm, const char *username);
179 typedef void (*SalOnAuthSuccess)(SalOp *op, const char *realm, const char *username);
180 typedef void (*SalOnRegisterSuccess)(SalOp *op, bool_t registered);
181 typedef void (*SalOnRegisterFailure)(SalOp *op, SalError error, SalReason reason, const char *details);
182 typedef void (*SalOnVfuRequest)(SalOp *op);
183 typedef void (*SalOnDtmfReceived)(SalOp *op, char dtmf);
184 typedef void (*SalOnRefer)(Sal *sal, SalOp *op, const char *referto);
185 typedef void (*SalOnTextReceived)(Sal *sal, const char *from, const char *msg);
186 typedef void (*SalOnNotify)(SalOp *op, SalSubscribeState ss, SalPresenceStatus status, const char *msg);
187 typedef void (*SalOnSubscribeReceived)(SalOp *salop, const char *from);
188 typedef void (*SalOnSubscribeClosed)(SalOp *salop, const char *from);
189 typedef void (*SalOnInternalMsg)(Sal *sal, const char *msg);
190 typedef void (*SalOnPingReply)(SalOp *salop);
192 typedef struct SalCallbacks{
193 SalOnCallReceived call_received;
194 SalOnCallRinging call_ringing;
195 SalOnCallAccepted call_accepted;
196 SalOnCallAck call_ack;
197 SalOnCallUpdated call_updated;
198 SalOnCallTerminated call_terminated;
199 SalOnCallFailure call_failure;
200 SalOnAuthRequested auth_requested;
201 SalOnAuthSuccess auth_success;
202 SalOnRegisterSuccess register_success;
203 SalOnRegisterFailure register_failure;
204 SalOnVfuRequest vfu_request;
205 SalOnDtmfReceived dtmf_received;
206 SalOnRefer refer_received;
207 SalOnTextReceived text_received;
209 SalOnSubscribeReceived subscribe_received;
210 SalOnSubscribeClosed subscribe_closed;
211 SalOnInternalMsg internal_message;
212 SalOnPingReply ping_reply;
215 typedef struct SalAuthInfo{
222 void sal_set_callbacks(Sal *ctx, const SalCallbacks *cbs);
223 int sal_listen_port(Sal *ctx, const char *addr, int port, SalTransport tr, int is_secure);
224 void sal_set_user_agent(Sal *ctx, const char *user_agent);
225 void sal_use_session_timers(Sal *ctx, int expires);
226 int sal_iterate(Sal *sal);
227 MSList * sal_get_pending_auths(Sal *sal);
229 /*create an operation */
230 SalOp * sal_op_new(Sal *sal);
232 /*generic SalOp API, working for all operations */
233 Sal *sal_op_get_sal(const SalOp *op);
234 void sal_op_set_contact(SalOp *op, const char *contact);
235 void sal_op_set_route(SalOp *op, const char *route);
236 void sal_op_set_from(SalOp *op, const char *from);
237 void sal_op_set_to(SalOp *op, const char *to);
238 void sal_op_release(SalOp *h);
239 void sal_op_authenticate(SalOp *h, const SalAuthInfo *info);
240 void sal_op_set_user_pointer(SalOp *h, void *up);
241 int sal_op_get_auth_requested(SalOp *h, const char **realm, const char **username);
242 const char *sal_op_get_from(const SalOp *op);
243 const char *sal_op_get_to(const SalOp *op);
244 const char *sal_op_get_contact(const SalOp *op);
245 const char *sal_op_get_route(const SalOp *op);
246 const char *sal_op_get_proxy(const SalOp *op);
247 /*for incoming requests, returns the origin of the packet as a sip uri*/
248 const char *sal_op_get_network_origin(const SalOp *op);
249 void *sal_op_get_user_pointer(const SalOp *op);
252 int sal_call_set_local_media_description(SalOp *h, SalMediaDescription *desc);
253 int sal_call(SalOp *h, const char *from, const char *to);
254 int sal_call_notify_ringing(SalOp *h);
255 int sal_call_accept(SalOp*h);
256 int sal_call_decline(SalOp *h, SalReason reason, const char *redirection /*optional*/);
257 SalMediaDescription * sal_call_get_final_media_description(SalOp *h);
258 int sal_refer(SalOp *h, const char *refer_to);
259 int sal_call_send_dtmf(SalOp *h, char dtmf);
260 int sal_call_terminate(SalOp *h);
261 bool_t sal_call_autoanswer_asked(SalOp *op);
264 int sal_register(SalOp *op, const char *proxy, const char *from, int expires);
265 int sal_unregister(SalOp *h);
268 int sal_text_send(SalOp *op, const char *from, const char *to, const char *text);
270 /*presence Subscribe/notify*/
271 int sal_subscribe_presence(SalOp *op, const char *from, const char *to);
272 int sal_unsubscribe(SalOp *op);
273 int sal_subscribe_accept(SalOp *op);
274 int sal_subscribe_decline(SalOp *op);
275 int sal_notify_presence(SalOp *op, SalPresenceStatus status, const char *status_message);
276 int sal_notify_close(SalOp *op);
278 /*presence publish */
279 int sal_publish(SalOp *op, const char *from, const char *to, SalPresenceStatus status);
282 /*ping: main purpose is to obtain its own contact address behind firewalls*/
283 int sal_ping(SalOp *op, const char *from, const char *to);
285 #define payload_type_set_number(pt,n) (pt)->user_data=(void*)((long)n);
286 #define payload_type_get_number(pt) ((int)(long)(pt)->user_data)
289 void sal_get_default_local_ip(Sal *sal, int address_family, char *ip, size_t iplen);
293 void __sal_op_init(SalOp *b, Sal *sal);
294 void __sal_op_set_network_origin(SalOp *op, const char *origin /*a sip uri*/);
295 void __sal_op_free(SalOp *b);