]> sjero.net Git - linphone/blob - coreapi/sal.h
eb8042361b3de18a1265c4976cca548f64efe709
[linphone] / coreapi / sal.h
1 /*
2 linphone
3 Copyright (C) 2010  Simon MORLAT (simon.morlat@free.fr)
4
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.
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, write to the Free Software
17 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
18 */
19
20 /** 
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...
24 **/
25
26 #ifndef sal_h
27 #define sal_h
28
29 #include "mediastreamer2/mscommon.h"
30
31 struct Sal;
32
33 typedef struct Sal Sal;
34
35 struct SalOp;
36
37 typedef struct SalOp SalOp;
38
39 struct SalAddress;
40
41 typedef struct SalAddress SalAddress;
42
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);
59
60
61
62
63 Sal * sal_init();
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);
67
68 typedef enum {
69         SalTransportDatagram,
70         SalTransportStream
71 }SalTransport;
72
73 typedef enum {
74         SalAudio,
75         SalVideo,
76         SalOther
77 } SalStreamType;
78
79 typedef enum{
80         SalProtoUnknown,
81         SalProtoRtpAvp,
82         SalProtoRtpSavp
83 }SalMediaProto;
84
85 typedef struct SalEndpointCandidate{
86         char addr[64];
87         int port;
88 }SalEndpointCandidate;
89
90 #define SAL_ENDPOINT_CANDIDATE_MAX 2
91
92 typedef struct SalStreamDescription{
93         SalMediaProto proto;
94         SalStreamType type;
95         char addr[64];
96         int port;
97         MSList *payloads; //<list of PayloadType
98         int bandwidth;
99         int ptime;
100         SalEndpointCandidate candidates[SAL_ENDPOINT_CANDIDATE_MAX];
101 } SalStreamDescription;
102
103 #define SAL_MEDIA_DESCRIPTION_MAX_STREAMS 4
104
105 typedef struct SalMediaDescription{
106         int refcount;
107         char addr[64];
108         char username[64];
109         int nstreams;
110         SalStreamDescription streams[SAL_MEDIA_DESCRIPTION_MAX_STREAMS];
111 } SalMediaDescription;
112
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);
119
120 /*this structure must be at the first byte of the SalOp structure defined by implementors*/
121 typedef struct SalOpBase{
122         Sal *root;
123         char *route; /*or request-uri for REGISTER*/
124         char *contact;
125         char *from;
126         char *to;
127         SalMediaDescription *local_media;
128         SalMediaDescription *remote_media;
129         void *user_pointer;
130 } SalOpBase;
131
132
133 typedef enum SalError{
134         SalErrorNoResponse,
135         SalErrorProtocol,
136         SalErrorFailure, /* see SalReason for more details */
137         SalErrorUnknown
138 } SalError;
139
140 typedef enum SalReason{
141         SalReasonDeclined,
142         SalReasonBusy,
143         SalReasonRedirect,
144         SalReasonTemporarilyUnavailable,
145         SalReasonNotFound,
146         SalReasonDoNotDisturb,
147         SalReasonMedia,
148         SalReasonForbidden,
149         SalReasonUnknown
150 }SalReason;
151
152 typedef enum SalPresenceStatus{
153         SalPresenceOffline,
154         SalPresenceOnline,
155         SalPresenceBusy,
156         SalPresenceBerightback,
157         SalPresenceAway,
158         SalPresenceOnthephone,
159         SalPresenceOuttolunch,
160         SalPresenceDonotdisturb,
161         SalPresenceMoved,
162         SalPresenceAltService,
163 }SalPresenceStatus;
164
165 typedef enum SalSubscribeState{
166         SalSubscribeActive,
167         SalSubscribeTerminated
168 }SalSubscribeState;
169
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);
189
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;
206         SalOnNotify notify;
207         SalOnSubscribeReceived subscribe_received;
208         SalOnSubscribeClosed subscribe_closed;
209         SalOnInternalMsg internal_message;
210 }SalCallbacks;
211
212 typedef struct SalAuthInfo{
213         char *username;
214         char *userid;
215         char *password;
216         char *realm;
217 }SalAuthInfo;
218
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);
226
227 /*create an operation */
228 SalOp * sal_op_new(Sal *sal);
229
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);
246
247 /*Call API*/
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);
257
258 /*Registration*/
259 int sal_register(SalOp *op, const char *proxy, const char *from, int expires);
260 int sal_unregister(SalOp *h);
261
262 /*Messaging */
263 int sal_text_send(SalOp *op, const char *from, const char *to, const char *text);
264
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);
272
273 /*presence publish */
274 int sal_publish(SalOp *op, const char *from, const char *to, SalPresenceStatus status);
275
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)
278
279 /*misc*/
280 void sal_get_default_local_ip(Sal *sal, int address_family, char *ip, size_t iplen);
281
282
283 /*internal API */
284 void __sal_op_init(SalOp *b, Sal *sal);
285 void __sal_op_free(SalOp *b);
286
287
288 #endif