media: refactor candidate_pair_established_cb
[siplcs.git] / src / api / sipe-backend.h
blob0547c208b9802b6cbcc23f37d216586cf032d048
1 /**
2 * @file sipe-backend.h
4 * pidgin-sipe
6 * Copyright (C) 2010-2015 SIPE Project <http://sipe.sourceforge.net/>
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
23 /**
25 * SIPE Core -> Backend API - functions called by SIPE core code
27 ***************** !!! IMPORTANT NOTE FOR BACKEND CODERS !!! *****************
29 * The SIPE core assumes atomicity and is *NOT* thread-safe.
31 * It *does not* protect any of its data structures or code paths with locks!
33 * In no circumstances it must be possible that a sipe_core_xxx() function can
34 * be entered through another thread while the first thread has entered the
35 * backend specific code through a sipe_backend_xxx() function.
37 ***************** !!! IMPORTANT NOTE FOR BACKEND CODERS !!! *****************
40 #ifdef __cplusplus
41 extern "C" {
42 #endif
44 /* Forward declarations */
45 struct sipe_backend_chat_session;
46 struct sipe_chat_session;
47 struct sipe_core_public;
48 struct sipe_transport_connection;
49 struct sipe_file_transfer;
50 struct sipe_media_call;
51 struct sipe_media;
53 /** MISC. STUFF **************************************************************/
54 /**
55 * Get the version of the backend suitable for e.g. UserAgent
57 * @return backend version string. Will be g_free()'d.by the core.
59 gchar *sipe_backend_version(void);
61 /** DEBUGGING ****************************************************************/
63 typedef enum {
64 SIPE_DEBUG_LEVEL_INFO,
65 SIPE_DEBUG_LEVEL_WARNING,
66 SIPE_DEBUG_LEVEL_ERROR,
67 } sipe_debug_level;
69 /**
70 * Output debug information without formatting
72 * Shouldn't be used directly. Instead use SIPE_DEBUG_xxx() macros
74 * @param level debug level
75 * @param msg debug message "\n" will be automatically appended.
77 void sipe_backend_debug_literal(sipe_debug_level level,
78 const gchar *msg);
80 /**
81 * Output debug information
83 * Shouldn't be used directly. Instead use SIPE_DEBUG_xxx() macros
85 * @param level debug level
86 * @param format format string. "\n" will be automatically appended.
88 void sipe_backend_debug(sipe_debug_level level,
89 const gchar *format,
90 ...) G_GNUC_PRINTF(2, 3);
92 /* Convenience macros */
93 #define SIPE_DEBUG_INFO(fmt, ...) sipe_backend_debug(SIPE_DEBUG_LEVEL_INFO, fmt, __VA_ARGS__)
94 #define SIPE_DEBUG_INFO_NOFORMAT(msg) sipe_backend_debug_literal(SIPE_DEBUG_LEVEL_INFO, msg)
95 #define SIPE_DEBUG_WARNING(fmt, ...) sipe_backend_debug(SIPE_DEBUG_LEVEL_WARNING, fmt, __VA_ARGS__)
96 #define SIPE_DEBUG_WARNING_NOFORMAT(msg) sipe_backend_debug_literal(SIPE_DEBUG_LEVEL_WARNING, msg)
97 #define SIPE_DEBUG_ERROR(fmt, ...) sipe_backend_debug(SIPE_DEBUG_LEVEL_ERROR, fmt, __VA_ARGS__)
98 #define SIPE_DEBUG_ERROR_NOFORMAT(msg) sipe_backend_debug_literal(SIPE_DEBUG_LEVEL_ERROR, msg)
101 * Check backend debugging status
103 * @return TRUE if debugging is enabled
105 gboolean sipe_backend_debug_enabled(void);
107 /** CHAT *********************************************************************/
109 void sipe_backend_chat_session_destroy(struct sipe_backend_chat_session *session);
110 void sipe_backend_chat_add(struct sipe_backend_chat_session *backend_session,
111 const gchar *uri,
112 gboolean is_new);
113 void sipe_backend_chat_close(struct sipe_backend_chat_session *backend_session);
116 * Joined a new chat
118 struct sipe_backend_chat_session *sipe_backend_chat_create(struct sipe_core_public *sipe_public,
119 struct sipe_chat_session *session,
120 const gchar *title,
121 const gchar *nick);
122 gboolean sipe_backend_chat_find(struct sipe_backend_chat_session *backend_session,
123 const gchar *uri);
124 gboolean sipe_backend_chat_is_operator(struct sipe_backend_chat_session *backend_session,
125 const gchar *uri);
126 void sipe_backend_chat_message(struct sipe_core_public *sipe_public,
127 struct sipe_backend_chat_session *backend_session,
128 const gchar *from,
129 time_t when,
130 const gchar *html);
131 void sipe_backend_chat_operator(struct sipe_backend_chat_session *backend_session,
132 const gchar *uri);
135 * Rejoin an existing chat window after connection re-establishment
137 void sipe_backend_chat_rejoin(struct sipe_core_public *sipe_public,
138 struct sipe_backend_chat_session *backend_session,
139 const gchar *nick,
140 const gchar *title);
143 * Core has completed connection re-establishment.
144 * Should call sipe_core_chat_rejoin() for existing chats.
146 void sipe_backend_chat_rejoin_all(struct sipe_core_public *sipe_public);
147 void sipe_backend_chat_remove(struct sipe_backend_chat_session *backend_session,
148 const gchar *uri);
151 * Move chat window to the front. Will be called when
152 * a user tries to join an already joined chat again.
154 void sipe_backend_chat_show(struct sipe_backend_chat_session *backend_session);
155 void sipe_backend_chat_topic(struct sipe_backend_chat_session *backend_session,
156 const gchar *topic);
158 /** CONNECTION ***************************************************************/
160 void sipe_backend_connection_completed(struct sipe_core_public *sipe_public);
162 typedef enum {
163 SIPE_CONNECTION_ERROR_NETWORK = 0,
164 SIPE_CONNECTION_ERROR_INVALID_USERNAME,
165 SIPE_CONNECTION_ERROR_INVALID_SETTINGS,
166 SIPE_CONNECTION_ERROR_AUTHENTICATION_FAILED,
167 SIPE_CONNECTION_ERROR_AUTHENTICATION_IMPOSSIBLE,
168 SIPE_CONNECTION_ERROR_LAST
169 } sipe_connection_error;
170 void sipe_backend_connection_error(struct sipe_core_public *sipe_public,
171 sipe_connection_error error,
172 const gchar *msg);
174 gboolean sipe_backend_connection_is_disconnecting(struct sipe_core_public *sipe_public);
175 gboolean sipe_backend_connection_is_valid(struct sipe_core_public *sipe_public);
177 /** DNS QUERY ****************************************************************/
179 typedef void (*sipe_dns_resolved_cb)(gpointer data, const gchar *hostname, guint port);
181 struct sipe_dns_query *sipe_backend_dns_query_srv(struct sipe_core_public *sipe_public,
182 const gchar *protocol,
183 const gchar *transport,
184 const gchar *domain,
185 sipe_dns_resolved_cb callback,
186 gpointer data);
188 struct sipe_dns_query *sipe_backend_dns_query_a(struct sipe_core_public *sipe_public,
189 const gchar *hostname,
190 guint port,
191 sipe_dns_resolved_cb callback,
192 gpointer data);
194 void sipe_backend_dns_query_cancel(struct sipe_dns_query *query);
196 /** FILE TRANSFER ************************************************************/
198 struct sipe_backend_fd;
200 void sipe_backend_ft_error(struct sipe_file_transfer *ft,
201 const gchar *errmsg);
202 const gchar *sipe_backend_ft_get_error(struct sipe_file_transfer *ft);
203 void sipe_backend_ft_deallocate(struct sipe_file_transfer *ft);
206 * Try to read up to @c size bytes from file transfer connection
208 * @param ft file transfer data.
209 * @param data buffer to read data into.
210 * @param size buffer size in bytes.
212 * @return number of bytes read or negative on failure.
213 * EAGAIN should return 0 bytes read.
215 gssize sipe_backend_ft_read(struct sipe_file_transfer *ft,
216 guchar *data,
217 gsize size);
220 * Try to write up to @c size bytes to file transfer connection
222 * @param ft file transfer data.
223 * @param data data to write
224 * @param size buffer size in bytes.
226 * @return number of bytes read or negative on failure.
227 * EAGAIN should return 0 bytes written.
229 gssize sipe_backend_ft_write(struct sipe_file_transfer *ft,
230 const guchar *data,
231 gsize size);
233 void sipe_backend_ft_set_completed(struct sipe_file_transfer *ft);
235 void sipe_backend_ft_cancel_local(struct sipe_file_transfer *ft);
236 void sipe_backend_ft_cancel_remote(struct sipe_file_transfer *ft);
238 void sipe_backend_ft_incoming(struct sipe_core_public *sipe_public,
239 struct sipe_file_transfer *ft,
240 const gchar *who,
241 const gchar *file_name,
242 gsize file_size);
244 * Begins file transfer with remote peer.
246 * You can provide either opened file descriptor to use for read/write operations
247 * or ip address and port where the backend should connect.
249 * @param ft file transfer data
250 * @param fd opaque file descriptor pointer or NULL if ip and port are used
251 * @param ip ip address to connect of NULL when file descriptor is used
252 * @param port port to connect or 0 when file descriptor is used
254 void sipe_backend_ft_start(struct sipe_file_transfer *ft,
255 struct sipe_backend_fd *fd,
256 const char* ip, unsigned port);
259 * Check whether file transfer is incoming or outgoing
261 * @param ft file transfer data
262 * @return @c TRUE if @c ft is incoming, otherwise @c FALSE
264 gboolean sipe_backend_ft_is_incoming(struct sipe_file_transfer *ft);
266 /** GROUP CHAT ***************************************************************/
268 #define SIPE_GROUPCHAT_ROOM_FILEPOST 0x00000001
269 #define SIPE_GROUPCHAT_ROOM_INVITE 0x00000002
270 #define SIPE_GROUPCHAT_ROOM_LOGGED 0x00000004
271 #define SIPE_GROUPCHAT_ROOM_PRIVATE 0x00000008
274 * Add a room found through room query
276 * @param uri room URI
277 * @param name human readable name for room
278 * @param description room description
279 * @param users number of users in the room
280 * @param flags SIPE_GROUPCHAT_ROOM_* flags
282 void sipe_backend_groupchat_room_add(struct sipe_core_public *sipe_public,
283 const gchar *uri,
284 const gchar *name,
285 const gchar *description,
286 guint users,
287 guint32 flags);
290 * Terminate room query
292 void sipe_backend_groupchat_room_terminate(struct sipe_core_public *sipe_public);
294 /** IM ***********************************************************************/
296 void sipe_backend_im_message(struct sipe_core_public *sipe_public,
297 const gchar *from,
298 const gchar *html);
299 void sipe_backend_im_topic(struct sipe_core_public *sipe_public,
300 const gchar *with,
301 const gchar *topic);
303 /** MARKUP *******************************************************************/
305 gchar *sipe_backend_markup_css_property(const gchar *style,
306 const gchar *option);
307 gchar *sipe_backend_markup_strip_html(const gchar *html);
309 /** MEDIA ********************************************************************/
311 typedef enum {
312 /* This client is the one who invites other participant to the call. */
313 SIPE_MEDIA_CALL_INITIATOR = 1,
314 /* Don't show any user interface elements for the call. */
315 SIPE_MEDIA_CALL_NO_UI = 2
316 } SipeMediaCallFlags;
318 typedef enum {
319 SIPE_ICE_NO_ICE,
320 SIPE_ICE_DRAFT_6,
321 SIPE_ICE_RFC_5245
322 } SipeIceVersion;
324 typedef enum {
325 SIPE_CANDIDATE_TYPE_ANY,
326 SIPE_CANDIDATE_TYPE_HOST,
327 SIPE_CANDIDATE_TYPE_RELAY,
328 SIPE_CANDIDATE_TYPE_SRFLX,
329 SIPE_CANDIDATE_TYPE_PRFLX
330 } SipeCandidateType;
332 typedef enum {
333 SIPE_COMPONENT_NONE = 0,
334 SIPE_COMPONENT_RTP = 1,
335 SIPE_COMPONENT_RTCP = 2
336 } SipeComponentType;
338 typedef enum {
339 SIPE_MEDIA_AUDIO,
340 SIPE_MEDIA_VIDEO,
341 SIPE_MEDIA_APPLICATION
342 } SipeMediaType;
344 typedef enum {
345 SIPE_NETWORK_PROTOCOL_UDP,
346 SIPE_NETWORK_PROTOCOL_TCP_ACTIVE,
347 SIPE_NETWORK_PROTOCOL_TCP_PASSIVE,
348 SIPE_NETWORK_PROTOCOL_TCP_SO,
349 } SipeNetworkProtocol;
351 typedef enum {
352 SIPE_ENCRYPTION_POLICY_REJECTED,
353 SIPE_ENCRYPTION_POLICY_OPTIONAL,
354 SIPE_ENCRYPTION_POLICY_REQUIRED,
355 SIPE_ENCRYPTION_POLICY_OBEY_SERVER
356 } SipeEncryptionPolicy;
358 struct sipe_media_call;
359 struct sipe_backend_media;
360 struct sipe_backend_codec;
361 struct sipe_backend_candidate;
362 struct sipe_backend_media_stream;
363 struct sipe_backend_media_relays;
365 struct sipe_media_stream {
366 struct sipe_backend_media_stream *backend_private;
368 struct sipe_media_call *call;
369 gchar *id;
371 void (*candidate_pairs_established_cb)(struct sipe_media_stream *);
372 void (*read_cb)(struct sipe_media_stream *);
375 struct sipe_media_call {
376 struct sipe_backend_media *backend_private;
378 gchar *with;
380 void (*stream_initialized_cb)(struct sipe_media_call *,
381 struct sipe_media_stream *);
382 void (*stream_end_cb)(struct sipe_media_call *,
383 struct sipe_media_stream *);
384 void (*media_end_cb)(struct sipe_media_call *);
385 void (*call_accept_cb)(struct sipe_media_call *, gboolean local);
386 void (*call_reject_cb)(struct sipe_media_call *, gboolean local);
387 void (*call_hold_cb) (struct sipe_media_call *, gboolean local,
388 gboolean state);
389 void (*call_hangup_cb)(struct sipe_media_call *, gboolean local);
390 void (*error_cb)(struct sipe_media_call *, gchar *message);
393 struct sipe_media_relay {
394 gchar *hostname;
395 guint udp_port;
396 guint tcp_port;
397 struct sipe_dns_query *dns_query;
400 /* Media handling */
401 struct sipe_backend_media *sipe_backend_media_new(struct sipe_core_public *sipe_public,
402 struct sipe_media_call *call,
403 const gchar *participant,
404 SipeMediaCallFlags flags);
405 void sipe_backend_media_free(struct sipe_backend_media *media);
407 void sipe_backend_media_set_cname(struct sipe_backend_media *media, gchar *cname);
409 struct sipe_backend_media_relays * sipe_backend_media_relays_convert(GSList *media_relays,
410 gchar *username,
411 gchar *password);
412 void sipe_backend_media_relays_free(struct sipe_backend_media_relays *media_relays);
414 struct sipe_backend_media_stream *sipe_backend_media_add_stream(struct sipe_media_call *media,
415 const gchar *id,
416 const gchar *participant,
417 SipeMediaType type,
418 SipeIceVersion ice_version,
419 gboolean initiator,
420 struct sipe_backend_media_relays *media_relays);
421 void sipe_backend_media_add_remote_candidates(struct sipe_media_call *media,
422 struct sipe_media_stream *stream,
423 GList *candidates);
424 gboolean sipe_backend_media_is_initiator(struct sipe_media_call *media,
425 struct sipe_media_stream *stream);
426 gboolean sipe_backend_media_accepted(struct sipe_backend_media *media);
427 gboolean sipe_backend_stream_initialized(struct sipe_media_call *media,
428 struct sipe_media_stream *stream);
429 GList *sipe_backend_media_get_active_local_candidates(struct sipe_media_call *media,
430 struct sipe_media_stream *stream);
431 GList *sipe_backend_media_get_active_remote_candidates(struct sipe_media_call *media,
432 struct sipe_media_stream *stream);
433 void sipe_backend_media_set_encryption_keys(struct sipe_media_call *media,
434 struct sipe_media_stream *stream,
435 const guchar *encryption_key,
436 const guchar *decryption_key);
438 /* Stream handling */
439 void sipe_backend_stream_hold(struct sipe_media_call *media,
440 struct sipe_media_stream *stream,
441 gboolean local);
442 void sipe_backend_stream_unhold(struct sipe_media_call *media,
443 struct sipe_media_stream *stream,
444 gboolean local);
445 gboolean sipe_backend_stream_is_held(struct sipe_media_stream *stream);
447 gssize sipe_backend_media_stream_read(struct sipe_media_stream *stream,
448 guint8 *buffer, gsize len);
450 void sipe_backend_media_stream_end(struct sipe_media_call *media,
451 struct sipe_media_stream *stream);
452 void sipe_backend_media_stream_free(struct sipe_backend_media_stream *stream);
454 /* Codec handling */
455 struct sipe_backend_codec *sipe_backend_codec_new(int id,
456 const char *name,
457 SipeMediaType type, guint clock_rate);
458 void sipe_backend_codec_free(struct sipe_backend_codec *codec);
459 int sipe_backend_codec_get_id(struct sipe_backend_codec *codec);
461 * @return codec name. Will be g_free'd() by the core.
463 gchar *sipe_backend_codec_get_name(struct sipe_backend_codec *codec);
464 guint sipe_backend_codec_get_clock_rate(struct sipe_backend_codec *codec);
465 void sipe_backend_codec_add_optional_parameter(struct sipe_backend_codec *codec,
466 const gchar *name,
467 const gchar *value);
468 GList *sipe_backend_codec_get_optional_parameters(struct sipe_backend_codec *codec);
469 gboolean sipe_backend_set_remote_codecs(struct sipe_media_call *media,
470 struct sipe_media_stream *stream,
471 GList *codecs);
472 GList* sipe_backend_get_local_codecs(struct sipe_media_call *media,
473 struct sipe_media_stream *stream);
475 /* Candidate handling */
476 struct sipe_backend_candidate * sipe_backend_candidate_new(const gchar *foundation,
477 SipeComponentType component,
478 SipeCandidateType type,
479 SipeNetworkProtocol proto,
480 const gchar *ip, guint port,
481 const gchar *username,
482 const gchar *password);
483 void sipe_backend_candidate_free(struct sipe_backend_candidate *candidate);
485 * @return user name. Will be g_free'd() by the core.
487 gchar *sipe_backend_candidate_get_username(struct sipe_backend_candidate *candidate);
489 * @return password. Will be g_free'd() by the core.
491 gchar *sipe_backend_candidate_get_password(struct sipe_backend_candidate *candidate);
493 * @return foundation. Will be g_free'd() by the core.
495 gchar *sipe_backend_candidate_get_foundation(struct sipe_backend_candidate *candidate);
497 * @return IP address string. Will be g_free'd() by the core.
499 gchar *sipe_backend_candidate_get_ip(struct sipe_backend_candidate *candidate);
500 guint sipe_backend_candidate_get_port(struct sipe_backend_candidate *candidate);
502 * @return IP address string. Will be g_free'd() by the core.
504 gchar *sipe_backend_candidate_get_base_ip(struct sipe_backend_candidate *candidate);
505 guint sipe_backend_candidate_get_base_port(struct sipe_backend_candidate *candidate);
506 guint32 sipe_backend_candidate_get_priority(struct sipe_backend_candidate *candidate);
507 void sipe_backend_candidate_set_priority(struct sipe_backend_candidate *candidate, guint32 priority);
508 SipeComponentType sipe_backend_candidate_get_component_type(struct sipe_backend_candidate *candidate);
509 SipeCandidateType sipe_backend_candidate_get_type(struct sipe_backend_candidate *candidate);
510 SipeNetworkProtocol sipe_backend_candidate_get_protocol(struct sipe_backend_candidate *candidate);
511 GList* sipe_backend_get_local_candidates(struct sipe_media_call *media,
512 struct sipe_media_stream *stream);
513 void sipe_backend_media_accept(struct sipe_backend_media *media, gboolean local);
514 void sipe_backend_media_hangup(struct sipe_backend_media *media, gboolean local);
515 void sipe_backend_media_reject(struct sipe_backend_media *media, gboolean local);
517 /** NETWORK ******************************************************************/
519 const gchar *sipe_backend_network_ip_address(struct sipe_core_public *sipe_public);
521 struct sipe_backend_listendata;
523 typedef void (*sipe_listen_start_cb)(unsigned short port, gpointer data);
524 typedef void (*sipe_client_connected_cb)(struct sipe_backend_fd *fd, gpointer data);
526 struct sipe_backend_listendata *
527 sipe_backend_network_listen_range(unsigned short port_min,
528 unsigned short port_max,
529 sipe_listen_start_cb listen_cb,
530 sipe_client_connected_cb connect_cb,
531 gpointer data);
532 void sipe_backend_network_listen_cancel(struct sipe_backend_listendata *ldata);
534 struct sipe_backend_fd * sipe_backend_fd_from_int(int fd);
535 gboolean sipe_backend_fd_is_valid(struct sipe_backend_fd *fd);
536 void sipe_backend_fd_free(struct sipe_backend_fd *fd);
538 /** NOTIFICATIONS *************************************************************/
540 void sipe_backend_notify_message_error(struct sipe_core_public *sipe_public,
541 struct sipe_backend_chat_session *backend_session,
542 const gchar *who,
543 const gchar *message);
544 void sipe_backend_notify_message_info(struct sipe_core_public *sipe_public,
545 struct sipe_backend_chat_session *backend_session,
546 const gchar *who,
547 const gchar *message);
550 * @param msg error message. Maybe @NULL
552 void sipe_backend_notify_error(struct sipe_core_public *sipe_public,
553 const gchar *title,
554 const gchar *msg);
556 /** SCHEDULE *****************************************************************/
558 gpointer sipe_backend_schedule_seconds(struct sipe_core_public *sipe_public,
559 guint timeout,
560 gpointer data);
561 gpointer sipe_backend_schedule_mseconds(struct sipe_core_public *sipe_public,
562 guint timeout,
563 gpointer data);
564 void sipe_backend_schedule_cancel(struct sipe_core_public *sipe_public,
565 gpointer data);
567 /** SEARCH *******************************************************************/
569 struct sipe_backend_search_results;
570 struct sipe_backend_search_token;
572 void sipe_backend_search_failed(struct sipe_core_public *sipe_public,
573 struct sipe_backend_search_token *token,
574 const gchar *msg);
575 struct sipe_backend_search_results *sipe_backend_search_results_start(struct sipe_core_public *sipe_public,
576 struct sipe_backend_search_token *token);
577 void sipe_backend_search_results_add(struct sipe_core_public *sipe_public,
578 struct sipe_backend_search_results *results,
579 const gchar *uri,
580 const gchar *name,
581 const gchar *company,
582 const gchar *country,
583 const gchar *email);
584 void sipe_backend_search_results_finalize(struct sipe_core_public *sipe_public,
585 struct sipe_backend_search_results *results,
586 const gchar *description,
587 gboolean more);
589 /** SETTINGS *****************************************************************/
591 typedef enum {
592 SIPE_SETTING_EMAIL_URL = 0,
593 SIPE_SETTING_EMAIL_LOGIN,
594 SIPE_SETTING_EMAIL_PASSWORD,
595 SIPE_SETTING_GROUPCHAT_USER,
596 SIPE_SETTING_USER_AGENT,
597 SIPE_SETTING_LAST
598 } sipe_setting;
599 const gchar *sipe_backend_setting(struct sipe_core_public *sipe_public,
600 sipe_setting type);
602 /** STATUS *******************************************************************/
604 guint sipe_backend_status(struct sipe_core_public *sipe_public);
605 gboolean sipe_backend_status_changed(struct sipe_core_public *sipe_public,
606 guint activity,
607 const gchar *message);
610 * Update user client with new status and note received from server
612 * NOTE: this must *NOT* trigger a call to @c sipe_core_status_set()!
614 * @param sipe_public The handle representing the protocol instance
615 * @param activity New activity
616 * @param message New note text
618 void sipe_backend_status_and_note(struct sipe_core_public *sipe_public,
619 guint activity,
620 const gchar *message);
622 /** TRANSPORT ****************************************************************/
624 typedef void transport_connected_cb(struct sipe_transport_connection *conn);
625 typedef void transport_input_cb(struct sipe_transport_connection *conn);
626 typedef void transport_error_cb(struct sipe_transport_connection *conn,
627 const gchar *msg);
629 typedef struct {
630 guint type;
631 const gchar *server_name;
632 guint server_port;
633 gpointer user_data;
634 transport_connected_cb *connected;
635 transport_input_cb *input;
636 transport_error_cb *error;
637 } sipe_connect_setup;
638 struct sipe_transport_connection *sipe_backend_transport_connect(struct sipe_core_public *sipe_public,
639 const sipe_connect_setup *setup);
640 void sipe_backend_transport_disconnect(struct sipe_transport_connection *conn);
641 void sipe_backend_transport_message(struct sipe_transport_connection *conn,
642 const gchar *buffer);
643 void sipe_backend_transport_flush(struct sipe_transport_connection *conn);
645 /** USER *********************************************************************/
647 void sipe_backend_user_feedback_typing(struct sipe_core_public *sipe_public,
648 const gchar *from);
649 void sipe_backend_user_feedback_typing_stop(struct sipe_core_public *sipe_public,
650 const gchar *from);
653 * Present a query that is to be accepted or declined by the user
655 * @param sipe_public The handle representing the protocol instance
656 * @param message Text of the query to be shown to user
657 * @param accept_label Label to be displayed on UI control that accepts query
658 * @param decline_label Label to be displayed on UI control that declines query
659 * @param key Opaque handle uniquely identifying the query. Backend
660 * should store it for the case SIPE core requests the
661 * query to be closed prematurely.
663 void sipe_backend_user_ask(struct sipe_core_public *sipe_public,
664 const gchar *message,
665 const gchar *accept_label,
666 const gchar *decline_label,
667 gpointer key);
670 * Closes the pending user query
672 * @param key Opaque handle uniquely identifying the query.
674 void sipe_backend_user_close_ask(gpointer key);
676 /** BUDDIES ******************************************************************/
679 * sipe_backend_buddy_get/set_string(): properties a buddy can have
680 * sipe_backend_buddy_info_add(): mapped, e.g. to a string label
682 typedef enum
684 SIPE_BUDDY_INFO_DISPLAY_NAME = 0,
685 SIPE_BUDDY_INFO_JOB_TITLE,
686 SIPE_BUDDY_INFO_CITY,
687 SIPE_BUDDY_INFO_STATE,
688 SIPE_BUDDY_INFO_OFFICE,
689 SIPE_BUDDY_INFO_DEPARTMENT,
690 SIPE_BUDDY_INFO_COUNTRY,
691 SIPE_BUDDY_INFO_WORK_PHONE,
692 SIPE_BUDDY_INFO_WORK_PHONE_DISPLAY,
693 SIPE_BUDDY_INFO_COMPANY,
694 SIPE_BUDDY_INFO_EMAIL,
695 SIPE_BUDDY_INFO_SITE,
696 SIPE_BUDDY_INFO_ZIPCODE,
697 SIPE_BUDDY_INFO_STREET,
698 SIPE_BUDDY_INFO_MOBILE_PHONE,
699 SIPE_BUDDY_INFO_MOBILE_PHONE_DISPLAY,
700 SIPE_BUDDY_INFO_HOME_PHONE,
701 SIPE_BUDDY_INFO_HOME_PHONE_DISPLAY,
702 SIPE_BUDDY_INFO_OTHER_PHONE,
703 SIPE_BUDDY_INFO_OTHER_PHONE_DISPLAY,
704 SIPE_BUDDY_INFO_CUSTOM1_PHONE,
705 SIPE_BUDDY_INFO_CUSTOM1_PHONE_DISPLAY,
706 SIPE_BUDDY_INFO_ALIAS, /* only for sipe_backend_buddy_info_add() */
707 SIPE_BUDDY_INFO_DEVICE, /* only for sipe_backend_buddy_info_add() */
708 } sipe_buddy_info_fields;
710 /* Opaque token */
711 typedef void* sipe_backend_buddy;
714 * Find a buddy in the given group of the buddy list, or anywhere on the
715 * list if @group_name is empty
717 * @param sipe_public The handle representing the protocol instance making the call
718 * @param buddy_name The name of the buddy
719 * @param group_name The name of the group to look in, or NULL for any group
720 * @return opaque handle to the buddy, or NULL if no buddy found
722 sipe_backend_buddy sipe_backend_buddy_find(struct sipe_core_public *sipe_public,
723 const gchar *buddy_name,
724 const gchar *group_name);
727 * Find all named buddies in the given group of the buddy list, or anywhere on the
728 * list if @group_name is empty; or all buddies if @name is empty
730 * @param sipe_public The handle representing the protocol instance making the call
731 * @param name The name of the buddy
732 * @param group_name The name of the group to look in, or NULL for any group
733 * @return GSList of opaque handles to the buddies
735 GSList* sipe_backend_buddy_find_all(struct sipe_core_public *sipe_public,
736 const gchar *buddy_name,
737 const gchar *group_name);
740 * Gets the name of a contact.
742 * @param sipe_public The handle representing the protocol instance making the call
743 * @param who The opaque handle to the contact as found by find_buddy
744 * @return The name. Must be freed.
746 gchar* sipe_backend_buddy_get_name(struct sipe_core_public *sipe_public,
747 const sipe_backend_buddy who);
750 * Gets the alias for a contact.
752 * @param sipe_public The handle representing the protocol instance making the call
753 * @param who The opaque handle to the contact as found by find_buddy
754 * @return The alias. Must be gfree'd.
756 gchar* sipe_backend_buddy_get_alias(struct sipe_core_public *sipe_public,
757 const sipe_backend_buddy who);
760 * Gets the server alias for a contact.
762 * @param sipe_public The handle representing the protocol instance making the call
763 * @param who The opaque handle to the contact as found by find_buddy
764 * @return The alias. Must be freed.
766 gchar* sipe_backend_buddy_get_server_alias(struct sipe_core_public *sipe_public,
767 const sipe_backend_buddy who);
770 * Gets the local alias for a contact
772 * @param sipe_public The handle representing the protocol instance making the call
773 * @param uri the budyy name
775 * @return the alias. Must be @g_free()'d.
777 gchar *sipe_backend_buddy_get_local_alias(struct sipe_core_public *sipe_public,
778 const sipe_backend_buddy who);
781 * Gets the name of the group a contact belongs to.
783 * @param sipe_public The handle representing the protocol instance making the call
784 * @param who The opaque handle to the contact as found by find_buddy
785 * @return The name. Must be freed.
787 gchar* sipe_backend_buddy_get_group_name(struct sipe_core_public *sipe_public,
788 const sipe_backend_buddy who);
791 * Called to retrieve a buddy-specific setting.
793 * @param sipe_public The handle representing the protocol instance making the call
794 * @param buddy The handle representing the buddy
795 * @param key The name of the setting
796 * @return The value of the setting. Must be freed.
798 gchar* sipe_backend_buddy_get_string(struct sipe_core_public *sipe_public,
799 sipe_backend_buddy buddy,
800 const sipe_buddy_info_fields key);
803 * Called to set a buddy-specific setting.
805 * @param sipe_public The handle representing the protocol instance making the call
806 * @param buddy The handle representing the buddy
807 * @param key The name of the setting
808 * @param val The value to set
810 void sipe_backend_buddy_set_string(struct sipe_core_public *sipe_public,
811 sipe_backend_buddy buddy,
812 const sipe_buddy_info_fields key,
813 const gchar *val);
816 * Called after one ore more buddy-specific settings have been updated.
818 * Can be used by the backend to trigger an UI update event
820 * @param sipe_public The handle representing the protocol instance making the call
821 * @param uri SIP URI of the contact
823 void sipe_backend_buddy_refresh_properties(struct sipe_core_public *sipe_public,
824 const gchar *uri);
827 * Get the status token for a contact
829 * @param sipe_public The handle representing the protocol instance making the call
830 * @param uri SIP URI of the contact
832 * @return activity
834 guint sipe_backend_buddy_get_status(struct sipe_core_public *sipe_public,
835 const gchar *uri);
838 * Sets the alias for a contact.
840 * @param sipe_public The handle representing the protocol instance making the call
841 * @param who The opaque handle to the contact as found by find_buddy
842 * @param alias The location where the alias will be put
843 * case. FALSE if the buddy was not found. The value of alias will not be changed.
845 void sipe_backend_buddy_set_alias(struct sipe_core_public *sipe_public,
846 const sipe_backend_buddy who,
847 const gchar *alias);
850 * Sets the server alias for a contact.
852 * @param sipe_public The handle representing the protocol instance making the call
853 * @param who The opaque handle to the contact as found by find_buddy
854 * @param alias The server alias of the contact
856 void sipe_backend_buddy_set_server_alias(struct sipe_core_public *sipe_public,
857 const sipe_backend_buddy who,
858 const gchar *alias);
861 * Start processing buddy list
863 * Will be called every time we receive a buddy list in roaming contacts
865 * @param sipe_public The handle representing the protocol instance making the call
867 void sipe_backend_buddy_list_processing_start(struct sipe_core_public *sipe_public);
870 * Finished processing buddy list
872 * Will be called every time we receive a buddy list in roaming contacts
874 * @param sipe_public The handle representing the protocol instance making the call
876 void sipe_backend_buddy_list_processing_finish(struct sipe_core_public *sipe_public);
879 * Add a contact to the buddy list
881 * @param sipe_public The handle representing the protocol instance making the call
882 * @param name The name of the contact
883 * @param alias The alias of the contact
884 * @param groupname The name of the group to add this contact to
885 * @return A handle to the newly created buddy
887 sipe_backend_buddy sipe_backend_buddy_add(struct sipe_core_public *sipe_public,
888 const gchar *name,
889 const gchar *alias,
890 const gchar *groupname);
893 * Remove a contact from the buddy list
895 * @param sipe_public The handle representing the protocol instance making the call
896 * @param who The opaque handle to the contact as found by find_buddy
898 void sipe_backend_buddy_remove(struct sipe_core_public *sipe_public,
899 const sipe_backend_buddy who);
902 * Notifies the user that a remote user has wants to add the local user to his
903 * or her buddy list and requires authorization to do so.
905 * @param sipe_public The handle representing the protocol instance making the call
906 * @param who The name of the user that added this account
907 * @param alias The optional alias of the remote user
908 * @param on_list True if the user is already in our list
909 * @param auth_cb The callback called when the local user accepts
910 * @param deny_cb The callback called when the local user rejects
911 * @param data Data to be passed back to the above callbacks
913 typedef void (*sipe_backend_buddy_request_authorization_cb)(void *);
915 void sipe_backend_buddy_request_add(struct sipe_core_public *sipe_public,
916 const gchar *who,
917 const gchar *alias);
919 void sipe_backend_buddy_request_authorization(struct sipe_core_public *sipe_public,
920 const gchar *who,
921 const gchar *alias,
922 gboolean on_list,
923 sipe_backend_buddy_request_authorization_cb auth_cb,
924 sipe_backend_buddy_request_authorization_cb deny_cb,
925 gpointer data);
927 gboolean sipe_backend_buddy_is_blocked(struct sipe_core_public *sipe_public,
928 const gchar *who);
930 void sipe_backend_buddy_set_blocked_status(struct sipe_core_public *sipe_public,
931 const gchar *who,
932 gboolean blocked);
934 void sipe_backend_buddy_set_status(struct sipe_core_public *sipe_public,
935 const gchar *who,
936 guint activity);
939 * Checks whether backend has a capability to use buddy photos. If this function
940 * returns @c FALSE, SIPE core will not attempt to download the photos from
941 * server to save bandwidth.
943 * @return @c TRUE if backend is photo capable, otherwise @FALSE
945 gboolean sipe_backend_uses_photo(void);
948 * Gives backend a photo image associated with a SIP URI. Backend has ownership
949 * of the data and must free it when not needed.
951 * @param sipe_public The handle representing the protocol instance making the call
952 * @param who The name of the user whose photo is being set
953 * @param image_data The photo image data, must be g_free()'d by backend
954 * @param image_len Size of the image in Bytes
955 * @param photo_hash A data checksum provided by the server
957 void sipe_backend_buddy_set_photo(struct sipe_core_public *sipe_public,
958 const gchar *who,
959 gpointer image_data,
960 gsize image_len,
961 const gchar *photo_hash);
964 * Retrieves a photo hash stored together with image data by
965 * @c sipe_backend_buddy_set_photo. Value is used by the core to detect photo
966 * file changes on server.
968 * @param sipe_public The handle representing the protocol instance making the call
969 * @param who The name of the user whose photo hash to retrieve
970 * @return a photo hash (may be NULL)
972 const gchar *sipe_backend_buddy_get_photo_hash(struct sipe_core_public *sipe_public,
973 const gchar *who);
976 * Called when a new internal group is about to be added. If this returns FALSE,
977 * the group will not be added.
979 * @param sipe_public The handle representing the protocol instance making the call
980 * @param group_name The group being added
981 * @return TRUE if everything is ok, FALSE if the group should not be added
983 gboolean sipe_backend_buddy_group_add(struct sipe_core_public *sipe_public,
984 const gchar *group_name);
987 * Called when a new internal group has been renamed
989 * @param sipe_public The handle representing the protocol instance making the call
990 * @param old_name old name of the group
991 * @param new_name new name of the group
992 * @return TRUE if the group was found and renamed
994 gboolean sipe_backend_buddy_group_rename(struct sipe_core_public *sipe_public,
995 const gchar *old_name,
996 const gchar *new_name);
999 * Called when a new internal group should be deleted
1001 * NOTE: this will only be called on empty groups.
1003 * @param sipe_public The handle representing the protocol instance making the call
1004 * @param group_name The group that should be removed
1006 void sipe_backend_buddy_group_remove(struct sipe_core_public *sipe_public,
1007 const gchar *group_name);
1010 * Present requested buddy information to the user
1012 struct sipe_backend_buddy_info;
1013 struct sipe_backend_buddy_info *sipe_backend_buddy_info_start(struct sipe_core_public *sipe_public);
1014 void sipe_backend_buddy_info_add(struct sipe_core_public *sipe_public,
1015 struct sipe_backend_buddy_info *info,
1016 sipe_buddy_info_fields key,
1017 const gchar *value);
1018 void sipe_backend_buddy_info_break(struct sipe_core_public *sipe_public,
1019 struct sipe_backend_buddy_info *info);
1020 void sipe_backend_buddy_info_finalize(struct sipe_core_public *sipe_public,
1021 struct sipe_backend_buddy_info *info,
1022 const gchar *uri);
1024 struct sipe_backend_buddy_tooltip;
1025 void sipe_backend_buddy_tooltip_add(struct sipe_core_public *sipe_public,
1026 struct sipe_backend_buddy_tooltip *tooltip,
1027 const gchar *description,
1028 const gchar *value);
1031 * Buddy menu creation
1033 enum sipe_buddy_menu_type {
1034 SIPE_BUDDY_MENU_MAKE_CHAT_LEADER = 0,
1035 SIPE_BUDDY_MENU_REMOVE_FROM_CHAT,
1036 SIPE_BUDDY_MENU_INVITE_TO_CHAT,
1037 SIPE_BUDDY_MENU_NEW_CHAT,
1038 SIPE_BUDDY_MENU_MAKE_CALL,
1039 SIPE_BUDDY_MENU_SEND_EMAIL,
1040 SIPE_BUDDY_MENU_ACCESS_LEVEL_HELP,
1041 SIPE_BUDDY_MENU_CHANGE_ACCESS_LEVEL,
1042 SIPE_BUDDY_MENU_ADD_NEW_DOMAIN,
1043 SIPE_BUDDY_MENU_TYPES
1046 struct sipe_backend_buddy_menu *sipe_backend_buddy_menu_start(struct sipe_core_public *sipe_public);
1047 struct sipe_backend_buddy_menu *sipe_backend_buddy_menu_add(struct sipe_core_public *sipe_public,
1048 struct sipe_backend_buddy_menu *menu,
1049 const gchar *label,
1050 enum sipe_buddy_menu_type type,
1051 gpointer parameter);
1052 struct sipe_backend_buddy_menu *sipe_backend_buddy_menu_separator(struct sipe_core_public *sipe_public,
1053 struct sipe_backend_buddy_menu *menu,
1054 const gchar *label);
1055 struct sipe_backend_buddy_menu *sipe_backend_buddy_sub_menu_add(struct sipe_core_public *sipe_public,
1056 struct sipe_backend_buddy_menu *menu,
1057 const gchar *label,
1058 struct sipe_backend_buddy_menu *sub);
1060 SipeEncryptionPolicy sipe_backend_media_get_encryption_policy(struct sipe_core_public *sipe_public);
1062 #ifdef __cplusplus
1064 #endif
1067 Local Variables:
1068 mode: c
1069 c-file-style: "bsd"
1070 indent-tabs-mode: t
1071 tab-width: 8
1072 End: