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*/
127 SalMediaDescription *local_media;
128 SalMediaDescription *remote_media;
133 typedef enum SalError{
136 SalErrorFailure, /* see SalReason for more details */
140 typedef enum SalReason{
144 SalReasonTemporarilyUnavailable,
146 SalReasonDoNotDisturb,
152 typedef enum SalPresenceStatus{
156 SalPresenceBerightback,
158 SalPresenceOnthephone,
159 SalPresenceOuttolunch,
160 SalPresenceDonotdisturb,
162 SalPresenceAltService,
165 typedef enum SalSubscribeState{
167 SalSubscribeTerminated
170 typedef void (*SalOnCallReceived)(SalOp *op);
171 typedef void (*SalOnCallRinging)(SalOp *op);
172 typedef void (*SalOnCallAccepted)(SalOp *op);
173 typedef void (*SalOnCallAck)(SalOp *op);
174 typedef void (*SalOnCallUpdated)(SalOp *op);
175 typedef void (*SalOnCallTerminated)(SalOp *op, const char *from);
176 typedef void (*SalOnCallFailure)(SalOp *op, SalError error, SalReason reason, const char *details);
177 typedef void (*SalOnAuthRequested)(SalOp *op, const char *realm, const char *username);
178 typedef void (*SalOnAuthSuccess)(SalOp *op, const char *realm, const char *username);
179 typedef void (*SalOnRegisterSuccess)(SalOp *op, bool_t registered);
180 typedef void (*SalOnRegisterFailure)(SalOp *op, SalError error, SalReason reason, const char *details);
181 typedef void (*SalOnVfuRequest)(SalOp *op);
182 typedef void (*SalOnDtmfReceived)(SalOp *op, char dtmf);
183 typedef void (*SalOnRefer)(Sal *sal, SalOp *op, const char *referto);
184 typedef void (*SalOnTextReceived)(Sal *sal, const char *from, const char *msg);
185 typedef void (*SalOnNotify)(SalOp *op, SalSubscribeState ss, SalPresenceStatus status, const char *msg);
186 typedef void (*SalOnSubscribeReceived)(SalOp *salop, const char *from);
187 typedef void (*SalOnSubscribeClosed)(SalOp *salop, const char *from);
188 typedef void (*SalOnInternalMsg)(Sal *sal, const char *msg);
190 typedef struct SalCallbacks{
191 SalOnCallReceived call_received;
192 SalOnCallRinging call_ringing;
193 SalOnCallAccepted call_accepted;
194 SalOnCallAck call_ack;
195 SalOnCallUpdated call_updated;
196 SalOnCallTerminated call_terminated;
197 SalOnCallFailure call_failure;
198 SalOnAuthRequested auth_requested;
199 SalOnAuthSuccess auth_success;
200 SalOnRegisterSuccess register_success;
201 SalOnRegisterFailure register_failure;
202 SalOnVfuRequest vfu_request;
203 SalOnDtmfReceived dtmf_received;
204 SalOnRefer refer_received;
205 SalOnTextReceived text_received;
207 SalOnSubscribeReceived subscribe_received;
208 SalOnSubscribeClosed subscribe_closed;
209 SalOnInternalMsg internal_message;
212 typedef struct SalAuthInfo{
219 void sal_set_callbacks(Sal *ctx, const SalCallbacks *cbs);
220 int sal_listen_port(Sal *ctx, const char *addr, int port, SalTransport tr, int is_secure);
221 void sal_set_user_agent(Sal *ctx, const char *user_agent);
222 void sal_masquerade(Sal *ctx, const char *ip);
223 void sal_use_session_timers(Sal *ctx, int expires);
224 int sal_iterate(Sal *sal);
225 MSList * sal_get_pending_auths(Sal *sal);
227 /*create an operation */
228 SalOp * sal_op_new(Sal *sal);
230 /*generic SalOp API, working for all operations */
231 Sal *sal_op_get_sal(const SalOp *op);
232 void sal_op_set_contact(SalOp *op, const char *contact);
233 void sal_op_set_route(SalOp *op, const char *route);
234 void sal_op_set_from(SalOp *op, const char *from);
235 void sal_op_set_to(SalOp *op, const char *to);
236 void sal_op_release(SalOp *h);
237 void sal_op_authenticate(SalOp *h, const SalAuthInfo *info);
238 void sal_op_set_user_pointer(SalOp *h, void *up);
239 int sal_op_get_auth_requested(SalOp *h, const char **realm, const char **username);
240 const char *sal_op_get_from(const SalOp *op);
241 const char *sal_op_get_to(const SalOp *op);
242 const char *sal_op_get_contact(const SalOp *op);
243 const char *sal_op_get_route(const SalOp *op);
244 const char *sal_op_get_proxy(const SalOp *op);
245 void *sal_op_get_user_pointer(const SalOp *op);
248 int sal_call_set_local_media_description(SalOp *h, SalMediaDescription *desc);
249 int sal_call(SalOp *h, const char *from, const char *to);
250 int sal_call_notify_ringing(SalOp *h);
251 int sal_call_accept(SalOp*h);
252 int sal_call_decline(SalOp *h, SalReason reason, const char *redirection /*optional*/);
253 SalMediaDescription * sal_call_get_final_media_description(SalOp *h);
254 int sal_refer(SalOp *h, const char *refer_to);
255 int sal_call_send_dtmf(SalOp *h, char dtmf);
256 int sal_call_terminate(SalOp *h);
259 int sal_register(SalOp *op, const char *proxy, const char *from, int expires);
260 int sal_unregister(SalOp *h);
263 int sal_text_send(SalOp *op, const char *from, const char *to, const char *text);
265 /*presence Subscribe/notify*/
266 int sal_subscribe_presence(SalOp *op, const char *from, const char *to);
267 int sal_unsubscribe(SalOp *op);
268 int sal_subscribe_accept(SalOp *op);
269 int sal_subscribe_decline(SalOp *op);
270 int sal_notify_presence(SalOp *op, SalPresenceStatus status, const char *status_message);
271 int sal_notify_close(SalOp *op);
273 /*presence publish */
274 int sal_publish(SalOp *op, const char *from, const char *to, SalPresenceStatus status);
276 #define payload_type_set_number(pt,n) (pt)->user_data=(void*)((long)n);
277 #define payload_type_get_number(pt) ((int)(long)(pt)->user_data)
280 void sal_get_default_local_ip(Sal *sal, int address_family, char *ip, size_t iplen);
284 void __sal_op_init(SalOp *b, Sal *sal);
285 void __sal_op_free(SalOp *b);