6 * Copyright (C) 2010-2016 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
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 !!! *****************
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
;
53 /** MISC. STUFF **************************************************************/
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 ****************************************************************/
65 SIPE_LOG_LEVEL_WARNING
,
67 SIPE_DEBUG_LEVEL_INFO
,
68 SIPE_DEBUG_LEVEL_WARNING
,
69 SIPE_DEBUG_LEVEL_ERROR
,
71 #define SIPE_DEBUG_LEVEL_LOWEST SIPE_DEBUG_LEVEL_INFO
74 * Output debug information without formatting
76 * Shouldn't be used directly. Instead use SIPE_DEBUG_xxx() macros
78 * @param level debug level
79 * @param msg debug message "\n" will be automatically appended.
81 void sipe_backend_debug_literal(sipe_debug_level level
,
85 * Output debug information
87 * Shouldn't be used directly. Instead use SIPE_DEBUG_xxx() macros
89 * @param level debug level
90 * @param format format string. "\n" will be automatically appended.
92 void sipe_backend_debug(sipe_debug_level level
,
94 ...) G_GNUC_PRINTF(2, 3);
96 /* Convenience macros */
97 #define SIPE_LOG_INFO(fmt, ...) sipe_backend_debug(SIPE_LOG_LEVEL_INFO, fmt, __VA_ARGS__)
98 #define SIPE_LOG_INFO_NOFORMAT(msg) sipe_backend_debug_literal(SIPE_LOG_LEVEL_INFO, msg)
99 #define SIPE_LOG_WARNING(fmt, ...) sipe_backend_debug(SIPE_LOG_LEVEL_WARNING, fmt, __VA_ARGS__)
100 #define SIPE_LOG_WARNING_NOFORMAT(msg) sipe_backend_debug_literal(SIPE_LOG_LEVEL_WARNING, msg)
101 #define SIPE_LOG_ERROR(fmt, ...) sipe_backend_debug(SIPE_LOG_LEVEL_ERROR, fmt, __VA_ARGS__)
102 #define SIPE_LOG_ERROR_NOFORMAT(msg) sipe_backend_debug_literal(SIPE_LOG_LEVEL_ERROR, msg)
103 #define SIPE_DEBUG_INFO(fmt, ...) sipe_backend_debug(SIPE_DEBUG_LEVEL_INFO, fmt, __VA_ARGS__)
104 #define SIPE_DEBUG_INFO_NOFORMAT(msg) sipe_backend_debug_literal(SIPE_DEBUG_LEVEL_INFO, msg)
105 #define SIPE_DEBUG_WARNING(fmt, ...) sipe_backend_debug(SIPE_DEBUG_LEVEL_WARNING, fmt, __VA_ARGS__)
106 #define SIPE_DEBUG_WARNING_NOFORMAT(msg) sipe_backend_debug_literal(SIPE_DEBUG_LEVEL_WARNING, msg)
107 #define SIPE_DEBUG_ERROR(fmt, ...) sipe_backend_debug(SIPE_DEBUG_LEVEL_ERROR, fmt, __VA_ARGS__)
108 #define SIPE_DEBUG_ERROR_NOFORMAT(msg) sipe_backend_debug_literal(SIPE_DEBUG_LEVEL_ERROR, msg)
111 * Check backend debugging status
113 * @return TRUE if debugging is enabled
115 gboolean
sipe_backend_debug_enabled(void);
117 /** CHAT *********************************************************************/
119 void sipe_backend_chat_session_destroy(struct sipe_backend_chat_session
*session
);
120 void sipe_backend_chat_add(struct sipe_backend_chat_session
*backend_session
,
123 void sipe_backend_chat_close(struct sipe_backend_chat_session
*backend_session
);
128 struct sipe_backend_chat_session
*sipe_backend_chat_create(struct sipe_core_public
*sipe_public
,
129 struct sipe_chat_session
*session
,
132 gboolean
sipe_backend_chat_find(struct sipe_backend_chat_session
*backend_session
,
134 gboolean
sipe_backend_chat_is_operator(struct sipe_backend_chat_session
*backend_session
,
136 void sipe_backend_chat_message(struct sipe_core_public
*sipe_public
,
137 struct sipe_backend_chat_session
*backend_session
,
141 void sipe_backend_chat_operator(struct sipe_backend_chat_session
*backend_session
,
145 * Rejoin an existing chat window after connection re-establishment
147 void sipe_backend_chat_rejoin(struct sipe_core_public
*sipe_public
,
148 struct sipe_backend_chat_session
*backend_session
,
153 * Core has completed connection re-establishment.
154 * Should call sipe_core_chat_rejoin() for existing chats.
156 void sipe_backend_chat_rejoin_all(struct sipe_core_public
*sipe_public
);
157 void sipe_backend_chat_remove(struct sipe_backend_chat_session
*backend_session
,
161 * Move chat window to the front. Will be called when
162 * a user tries to join an already joined chat again.
164 void sipe_backend_chat_show(struct sipe_backend_chat_session
*backend_session
);
165 void sipe_backend_chat_topic(struct sipe_backend_chat_session
*backend_session
,
168 /** CONNECTION ***************************************************************/
170 void sipe_backend_connection_completed(struct sipe_core_public
*sipe_public
);
173 SIPE_CONNECTION_ERROR_NETWORK
= 0,
174 SIPE_CONNECTION_ERROR_INVALID_USERNAME
,
175 SIPE_CONNECTION_ERROR_INVALID_SETTINGS
,
176 SIPE_CONNECTION_ERROR_AUTHENTICATION_FAILED
,
177 SIPE_CONNECTION_ERROR_AUTHENTICATION_IMPOSSIBLE
,
178 SIPE_CONNECTION_ERROR_LAST
179 } sipe_connection_error
;
180 void sipe_backend_connection_error(struct sipe_core_public
*sipe_public
,
181 sipe_connection_error error
,
184 gboolean
sipe_backend_connection_is_disconnecting(struct sipe_core_public
*sipe_public
);
185 gboolean
sipe_backend_connection_is_valid(struct sipe_core_public
*sipe_public
);
187 /** DNS QUERY ****************************************************************/
189 typedef void (*sipe_dns_resolved_cb
)(gpointer data
, const gchar
*hostname
, guint port
);
191 struct sipe_dns_query
*sipe_backend_dns_query_srv(struct sipe_core_public
*sipe_public
,
192 const gchar
*protocol
,
193 const gchar
*transport
,
195 sipe_dns_resolved_cb callback
,
198 struct sipe_dns_query
*sipe_backend_dns_query_a(struct sipe_core_public
*sipe_public
,
199 const gchar
*hostname
,
201 sipe_dns_resolved_cb callback
,
204 void sipe_backend_dns_query_cancel(struct sipe_dns_query
*query
);
206 /** FILE TRANSFER ************************************************************/
208 struct sipe_backend_fd
;
210 void sipe_backend_ft_error(struct sipe_file_transfer
*ft
,
211 const gchar
*errmsg
);
212 const gchar
*sipe_backend_ft_get_error(struct sipe_file_transfer
*ft
);
213 void sipe_backend_ft_deallocate(struct sipe_file_transfer
*ft
);
216 * Try to read up to @c size bytes from file transfer connection
218 * @param ft file transfer data.
219 * @param data buffer to read data into.
220 * @param size buffer size in bytes.
222 * @return number of bytes read or negative on failure.
223 * EAGAIN should return 0 bytes read.
225 gssize
sipe_backend_ft_read(struct sipe_file_transfer
*ft
,
230 * Try to write up to @c size bytes to file transfer connection
232 * @param ft file transfer data.
233 * @param data data to write
234 * @param size buffer size in bytes.
236 * @return number of bytes read or negative on failure.
237 * EAGAIN should return 0 bytes written.
239 gssize
sipe_backend_ft_write(struct sipe_file_transfer
*ft
,
243 void sipe_backend_ft_set_completed(struct sipe_file_transfer
*ft
);
245 void sipe_backend_ft_cancel_local(struct sipe_file_transfer
*ft
);
246 void sipe_backend_ft_cancel_remote(struct sipe_file_transfer
*ft
);
248 void sipe_backend_ft_incoming(struct sipe_core_public
*sipe_public
,
249 struct sipe_file_transfer
*ft
,
251 const gchar
*file_name
,
254 * Allocates and initializes backend file transfer structure for sending a file.
256 * @param sipe_public (in) the handle representing the protocol instance
257 * @param ft (in) sipe core file transfer structure
258 * @param who (in) SIP URI of the file recipient
259 * @param file_name (in) filesystem path of the file being sent
261 void sipe_backend_ft_outgoing(struct sipe_core_public
*sipe_public
,
262 struct sipe_file_transfer
*ft
,
264 const gchar
*file_name
);
266 * Begins file transfer with remote peer.
268 * You can provide either opened file descriptor to use for read/write operations
269 * or ip address and port where the backend should connect.
271 * @param ft file transfer data
272 * @param fd opaque file descriptor pointer or NULL if ip and port are used
273 * @param ip ip address to connect of NULL when file descriptor is used
274 * @param port port to connect or 0 when file descriptor is used
276 void sipe_backend_ft_start(struct sipe_file_transfer
*ft
,
277 struct sipe_backend_fd
*fd
,
278 const char* ip
, unsigned port
);
281 * Check whether file transfer is incoming or outgoing
283 * @param ft file transfer data
284 * @return @c TRUE if @c ft is incoming, otherwise @c FALSE
286 gboolean
sipe_backend_ft_is_incoming(struct sipe_file_transfer
*ft
);
288 /** GROUP CHAT ***************************************************************/
290 #define SIPE_GROUPCHAT_ROOM_FILEPOST 0x00000001
291 #define SIPE_GROUPCHAT_ROOM_INVITE 0x00000002
292 #define SIPE_GROUPCHAT_ROOM_LOGGED 0x00000004
293 #define SIPE_GROUPCHAT_ROOM_PRIVATE 0x00000008
296 * Add a room found through room query
298 * @param uri room URI
299 * @param name human readable name for room
300 * @param description room description
301 * @param users number of users in the room
302 * @param flags SIPE_GROUPCHAT_ROOM_* flags
304 void sipe_backend_groupchat_room_add(struct sipe_core_public
*sipe_public
,
307 const gchar
*description
,
312 * Terminate room query
314 void sipe_backend_groupchat_room_terminate(struct sipe_core_public
*sipe_public
);
316 /** IM ***********************************************************************/
318 void sipe_backend_im_message(struct sipe_core_public
*sipe_public
,
321 void sipe_backend_im_topic(struct sipe_core_public
*sipe_public
,
325 /** MARKUP *******************************************************************/
327 gchar
*sipe_backend_markup_css_property(const gchar
*style
,
328 const gchar
*option
);
329 gchar
*sipe_backend_markup_strip_html(const gchar
*html
);
331 /** MEDIA ********************************************************************/
334 /* This client is the one who invites other participant to the call. */
335 SIPE_MEDIA_CALL_INITIATOR
= 1,
336 /* Don't show any user interface elements for the call. */
337 SIPE_MEDIA_CALL_NO_UI
= 2
338 } SipeMediaCallFlags
;
347 SIPE_CANDIDATE_TYPE_ANY
,
348 SIPE_CANDIDATE_TYPE_HOST
,
349 SIPE_CANDIDATE_TYPE_RELAY
,
350 SIPE_CANDIDATE_TYPE_SRFLX
,
351 SIPE_CANDIDATE_TYPE_PRFLX
355 SIPE_COMPONENT_NONE
= 0,
356 SIPE_COMPONENT_RTP
= 1,
357 SIPE_COMPONENT_RTCP
= 2
363 SIPE_MEDIA_APPLICATION
367 SIPE_NETWORK_PROTOCOL_UDP
,
368 SIPE_NETWORK_PROTOCOL_TCP_ACTIVE
,
369 SIPE_NETWORK_PROTOCOL_TCP_PASSIVE
,
370 SIPE_NETWORK_PROTOCOL_TCP_SO
,
371 } SipeNetworkProtocol
;
374 SIPE_ENCRYPTION_POLICY_REJECTED
,
375 SIPE_ENCRYPTION_POLICY_OPTIONAL
,
376 SIPE_ENCRYPTION_POLICY_REQUIRED
,
377 SIPE_ENCRYPTION_POLICY_OBEY_SERVER
378 } SipeEncryptionPolicy
;
380 struct sipe_media_call
;
381 struct sipe_backend_media
;
382 struct sipe_backend_codec
;
383 struct sipe_backend_candidate
;
384 struct sipe_backend_media_stream
;
385 struct sipe_backend_media_relays
;
392 struct sipe_media_stream
{
393 struct sipe_backend_media_stream
*backend_private
;
395 struct sipe_media_call
*call
;
397 struct ssrc_range
*ssrc_range
;
399 void (*candidate_pairs_established_cb
)(struct sipe_media_stream
*);
400 void (*read_cb
)(struct sipe_media_stream
*);
401 void (*writable_cb
)(struct sipe_media_stream
*);
402 void (*mute_cb
)(struct sipe_media_stream
*, gboolean is_muted
);
405 struct sipe_media_call
{
406 struct sipe_backend_media
*backend_private
;
410 void (*stream_initialized_cb
)(struct sipe_media_call
*,
411 struct sipe_media_stream
*);
412 void (*media_end_cb
)(struct sipe_media_call
*);
413 void (*call_accept_cb
)(struct sipe_media_call
*, gboolean local
);
414 void (*call_reject_cb
)(struct sipe_media_call
*, gboolean local
);
415 void (*call_hold_cb
) (struct sipe_media_call
*, gboolean local
,
417 void (*call_hangup_cb
)(struct sipe_media_call
*, gboolean local
);
418 void (*error_cb
)(struct sipe_media_call
*, gchar
*message
);
421 struct sipe_media_relay
{
425 struct sipe_dns_query
*dns_query
;
429 struct sipe_backend_media
*sipe_backend_media_new(struct sipe_core_public
*sipe_public
,
430 struct sipe_media_call
*call
,
431 const gchar
*participant
,
432 SipeMediaCallFlags flags
);
433 void sipe_backend_media_free(struct sipe_backend_media
*media
);
435 void sipe_backend_media_set_cname(struct sipe_backend_media
*media
, gchar
*cname
);
437 struct sipe_backend_media_relays
* sipe_backend_media_relays_convert(GSList
*media_relays
,
440 void sipe_backend_media_relays_free(struct sipe_backend_media_relays
*media_relays
);
442 struct sipe_backend_media_stream
*sipe_backend_media_add_stream(struct sipe_media_stream
*stream
,
444 SipeIceVersion ice_version
,
446 struct sipe_backend_media_relays
*media_relays
,
447 guint min_port
, guint max_port
);
448 void sipe_backend_media_add_remote_candidates(struct sipe_media_call
*media
,
449 struct sipe_media_stream
*stream
,
451 gboolean
sipe_backend_media_is_initiator(struct sipe_media_call
*media
,
452 struct sipe_media_stream
*stream
);
453 gboolean
sipe_backend_media_accepted(struct sipe_backend_media
*media
);
454 gboolean
sipe_backend_stream_initialized(struct sipe_media_call
*media
,
455 struct sipe_media_stream
*stream
);
456 void sipe_backend_media_set_encryption_keys(struct sipe_media_call
*media
,
457 struct sipe_media_stream
*stream
,
458 const guchar
*encryption_key
,
459 const guchar
*decryption_key
);
461 /* Stream handling */
462 void sipe_backend_stream_hold(struct sipe_media_call
*media
,
463 struct sipe_media_stream
*stream
,
465 void sipe_backend_stream_unhold(struct sipe_media_call
*media
,
466 struct sipe_media_stream
*stream
,
468 gboolean
sipe_backend_stream_is_held(struct sipe_media_stream
*stream
);
470 GList
*sipe_backend_media_stream_get_active_local_candidates(struct sipe_media_stream
*stream
);
471 GList
*sipe_backend_media_stream_get_active_remote_candidates(struct sipe_media_stream
*stream
);
473 gssize
sipe_backend_media_stream_read(struct sipe_media_stream
*stream
,
474 guint8
*buffer
, gsize len
);
475 gssize
sipe_backend_media_stream_write(struct sipe_media_stream
*stream
,
476 guint8
*buffer
, gsize len
);
478 void sipe_backend_media_stream_end(struct sipe_media_call
*media
,
479 struct sipe_media_stream
*stream
);
480 void sipe_backend_media_stream_free(struct sipe_backend_media_stream
*stream
);
483 struct sipe_backend_codec
*sipe_backend_codec_new(int id
,
488 void sipe_backend_codec_free(struct sipe_backend_codec
*codec
);
489 int sipe_backend_codec_get_id(struct sipe_backend_codec
*codec
);
491 * @return codec name. Will be g_free'd() by the core.
493 gchar
*sipe_backend_codec_get_name(struct sipe_backend_codec
*codec
);
494 guint
sipe_backend_codec_get_clock_rate(struct sipe_backend_codec
*codec
);
495 void sipe_backend_codec_add_optional_parameter(struct sipe_backend_codec
*codec
,
498 GList
*sipe_backend_codec_get_optional_parameters(struct sipe_backend_codec
*codec
);
499 gboolean
sipe_backend_set_remote_codecs(struct sipe_media_call
*media
,
500 struct sipe_media_stream
*stream
,
502 GList
* sipe_backend_get_local_codecs(struct sipe_media_call
*media
,
503 struct sipe_media_stream
*stream
);
505 /* Candidate handling */
506 struct sipe_backend_candidate
* sipe_backend_candidate_new(const gchar
*foundation
,
507 SipeComponentType component
,
508 SipeCandidateType type
,
509 SipeNetworkProtocol proto
,
510 const gchar
*ip
, guint port
,
511 const gchar
*username
,
512 const gchar
*password
);
513 void sipe_backend_candidate_free(struct sipe_backend_candidate
*candidate
);
515 * @return user name. Will be g_free'd() by the core.
517 gchar
*sipe_backend_candidate_get_username(struct sipe_backend_candidate
*candidate
);
519 * @return password. Will be g_free'd() by the core.
521 gchar
*sipe_backend_candidate_get_password(struct sipe_backend_candidate
*candidate
);
523 * @return foundation. Will be g_free'd() by the core.
525 gchar
*sipe_backend_candidate_get_foundation(struct sipe_backend_candidate
*candidate
);
527 * @return IP address string. Will be g_free'd() by the core.
529 gchar
*sipe_backend_candidate_get_ip(struct sipe_backend_candidate
*candidate
);
530 guint
sipe_backend_candidate_get_port(struct sipe_backend_candidate
*candidate
);
532 * @return IP address string. Will be g_free'd() by the core.
534 gchar
*sipe_backend_candidate_get_base_ip(struct sipe_backend_candidate
*candidate
);
535 guint
sipe_backend_candidate_get_base_port(struct sipe_backend_candidate
*candidate
);
536 guint32
sipe_backend_candidate_get_priority(struct sipe_backend_candidate
*candidate
);
537 void sipe_backend_candidate_set_priority(struct sipe_backend_candidate
*candidate
, guint32 priority
);
538 SipeComponentType
sipe_backend_candidate_get_component_type(struct sipe_backend_candidate
*candidate
);
539 SipeCandidateType
sipe_backend_candidate_get_type(struct sipe_backend_candidate
*candidate
);
540 SipeNetworkProtocol
sipe_backend_candidate_get_protocol(struct sipe_backend_candidate
*candidate
);
541 GList
* sipe_backend_get_local_candidates(struct sipe_media_call
*media
,
542 struct sipe_media_stream
*stream
);
543 void sipe_backend_media_accept(struct sipe_backend_media
*media
, gboolean local
);
544 void sipe_backend_media_hangup(struct sipe_backend_media
*media
, gboolean local
);
545 void sipe_backend_media_reject(struct sipe_backend_media
*media
, gboolean local
);
547 /** NETWORK ******************************************************************/
549 struct sipe_backend_listendata
;
551 typedef void (*sipe_listen_start_cb
)(unsigned short port
, gpointer data
);
552 typedef void (*sipe_client_connected_cb
)(struct sipe_backend_fd
*fd
, gpointer data
);
554 struct sipe_backend_listendata
*
555 sipe_backend_network_listen_range(unsigned short port_min
,
556 unsigned short port_max
,
557 sipe_listen_start_cb listen_cb
,
558 sipe_client_connected_cb connect_cb
,
560 void sipe_backend_network_listen_cancel(struct sipe_backend_listendata
*ldata
);
562 struct sipe_backend_fd
* sipe_backend_fd_from_int(int fd
);
563 gboolean
sipe_backend_fd_is_valid(struct sipe_backend_fd
*fd
);
564 void sipe_backend_fd_free(struct sipe_backend_fd
*fd
);
566 /** NOTIFICATIONS *************************************************************/
568 void sipe_backend_notify_message_error(struct sipe_core_public
*sipe_public
,
569 struct sipe_backend_chat_session
*backend_session
,
571 const gchar
*message
);
572 void sipe_backend_notify_message_info(struct sipe_core_public
*sipe_public
,
573 struct sipe_backend_chat_session
*backend_session
,
575 const gchar
*message
);
578 * @param msg error message. Maybe @NULL
580 void sipe_backend_notify_error(struct sipe_core_public
*sipe_public
,
584 /** SCHEDULE *****************************************************************/
586 gpointer
sipe_backend_schedule_seconds(struct sipe_core_public
*sipe_public
,
589 gpointer
sipe_backend_schedule_mseconds(struct sipe_core_public
*sipe_public
,
592 void sipe_backend_schedule_cancel(struct sipe_core_public
*sipe_public
,
595 /** SEARCH *******************************************************************/
597 struct sipe_backend_search_results
;
598 struct sipe_backend_search_token
;
600 void sipe_backend_search_failed(struct sipe_core_public
*sipe_public
,
601 struct sipe_backend_search_token
*token
,
603 struct sipe_backend_search_results
*sipe_backend_search_results_start(struct sipe_core_public
*sipe_public
,
604 struct sipe_backend_search_token
*token
);
605 void sipe_backend_search_results_add(struct sipe_core_public
*sipe_public
,
606 struct sipe_backend_search_results
*results
,
609 const gchar
*company
,
610 const gchar
*country
,
612 void sipe_backend_search_results_finalize(struct sipe_core_public
*sipe_public
,
613 struct sipe_backend_search_results
*results
,
614 const gchar
*description
,
617 /** SETTINGS *****************************************************************/
620 SIPE_SETTING_EMAIL_URL
= 0,
621 SIPE_SETTING_EMAIL_LOGIN
,
622 SIPE_SETTING_EMAIL_PASSWORD
,
623 SIPE_SETTING_GROUPCHAT_USER
,
624 SIPE_SETTING_RDP_CLIENT
,
625 SIPE_SETTING_USER_AGENT
,
628 const gchar
*sipe_backend_setting(struct sipe_core_public
*sipe_public
,
631 /** STATUS *******************************************************************/
633 guint
sipe_backend_status(struct sipe_core_public
*sipe_public
);
634 gboolean
sipe_backend_status_changed(struct sipe_core_public
*sipe_public
,
636 const gchar
*message
);
639 * Update user client with new status and note received from server
641 * NOTE: this must *NOT* trigger a call to @c sipe_core_status_set()!
643 * @param sipe_public The handle representing the protocol instance
644 * @param activity New activity
645 * @param message New note text
647 void sipe_backend_status_and_note(struct sipe_core_public
*sipe_public
,
649 const gchar
*message
);
651 /** TRANSPORT ****************************************************************/
653 typedef void transport_connected_cb(struct sipe_transport_connection
*conn
);
654 typedef void transport_input_cb(struct sipe_transport_connection
*conn
);
655 typedef void transport_error_cb(struct sipe_transport_connection
*conn
,
660 const gchar
*server_name
;
663 transport_connected_cb
*connected
;
664 transport_input_cb
*input
;
665 transport_error_cb
*error
;
666 } sipe_connect_setup
;
667 struct sipe_transport_connection
*sipe_backend_transport_connect(struct sipe_core_public
*sipe_public
,
668 const sipe_connect_setup
*setup
);
669 void sipe_backend_transport_disconnect(struct sipe_transport_connection
*conn
);
670 gchar
*sipe_backend_transport_ip_address(struct sipe_transport_connection
*conn
);
671 void sipe_backend_transport_message(struct sipe_transport_connection
*conn
,
672 const gchar
*buffer
);
673 void sipe_backend_transport_flush(struct sipe_transport_connection
*conn
);
675 /** USER *********************************************************************/
677 void sipe_backend_user_feedback_typing(struct sipe_core_public
*sipe_public
,
679 void sipe_backend_user_feedback_typing_stop(struct sipe_core_public
*sipe_public
,
683 * Present a query that is to be accepted or declined by the user
685 * @param sipe_public The handle representing the protocol instance
686 * @param message Text of the query to be shown to user
687 * @param accept_label Label to be displayed on UI control that accepts query
688 * @param decline_label Label to be displayed on UI control that declines query
689 * @param key Opaque handle uniquely identifying the query. Backend
690 * should store it for the case SIPE core requests the
691 * query to be closed prematurely.
693 void sipe_backend_user_ask(struct sipe_core_public
*sipe_public
,
694 const gchar
*message
,
695 const gchar
*accept_label
,
696 const gchar
*decline_label
,
700 * Closes the pending user query
702 * @param key Opaque handle uniquely identifying the query.
704 void sipe_backend_user_close_ask(gpointer key
);
706 /** BUDDIES ******************************************************************/
709 * sipe_backend_buddy_get/set_string(): properties a buddy can have
710 * sipe_backend_buddy_info_add(): mapped, e.g. to a string label
714 SIPE_BUDDY_INFO_DISPLAY_NAME
= 0,
715 SIPE_BUDDY_INFO_JOB_TITLE
,
716 SIPE_BUDDY_INFO_CITY
,
717 SIPE_BUDDY_INFO_STATE
,
718 SIPE_BUDDY_INFO_OFFICE
,
719 SIPE_BUDDY_INFO_DEPARTMENT
,
720 SIPE_BUDDY_INFO_COUNTRY
,
721 SIPE_BUDDY_INFO_WORK_PHONE
,
722 SIPE_BUDDY_INFO_WORK_PHONE_DISPLAY
,
723 SIPE_BUDDY_INFO_COMPANY
,
724 SIPE_BUDDY_INFO_EMAIL
,
725 SIPE_BUDDY_INFO_SITE
,
726 SIPE_BUDDY_INFO_ZIPCODE
,
727 SIPE_BUDDY_INFO_STREET
,
728 SIPE_BUDDY_INFO_MOBILE_PHONE
,
729 SIPE_BUDDY_INFO_MOBILE_PHONE_DISPLAY
,
730 SIPE_BUDDY_INFO_HOME_PHONE
,
731 SIPE_BUDDY_INFO_HOME_PHONE_DISPLAY
,
732 SIPE_BUDDY_INFO_OTHER_PHONE
,
733 SIPE_BUDDY_INFO_OTHER_PHONE_DISPLAY
,
734 SIPE_BUDDY_INFO_CUSTOM1_PHONE
,
735 SIPE_BUDDY_INFO_CUSTOM1_PHONE_DISPLAY
,
736 SIPE_BUDDY_INFO_ALIAS
, /* only for sipe_backend_buddy_info_add() */
737 SIPE_BUDDY_INFO_DEVICE
, /* only for sipe_backend_buddy_info_add() */
738 } sipe_buddy_info_fields
;
741 typedef void* sipe_backend_buddy
;
744 * Find a buddy in the given group of the buddy list, or anywhere on the
745 * list if @group_name is empty
747 * @param sipe_public The handle representing the protocol instance making the call
748 * @param buddy_name The name of the buddy
749 * @param group_name The name of the group to look in, or NULL for any group
750 * @return opaque handle to the buddy, or NULL if no buddy found
752 sipe_backend_buddy
sipe_backend_buddy_find(struct sipe_core_public
*sipe_public
,
753 const gchar
*buddy_name
,
754 const gchar
*group_name
);
757 * Find all named buddies in the given group of the buddy list, or anywhere on the
758 * list if @group_name is empty; or all buddies if @name is empty
760 * @param sipe_public The handle representing the protocol instance making the call
761 * @param name The name of the buddy
762 * @param group_name The name of the group to look in, or NULL for any group
763 * @return GSList of opaque handles to the buddies
765 GSList
* sipe_backend_buddy_find_all(struct sipe_core_public
*sipe_public
,
766 const gchar
*buddy_name
,
767 const gchar
*group_name
);
770 * Gets the name of a contact.
772 * @param sipe_public The handle representing the protocol instance making the call
773 * @param who The opaque handle to the contact as found by find_buddy
774 * @return The name. Must be freed.
776 gchar
* sipe_backend_buddy_get_name(struct sipe_core_public
*sipe_public
,
777 const sipe_backend_buddy who
);
780 * Gets the alias for a contact.
782 * @param sipe_public The handle representing the protocol instance making the call
783 * @param who The opaque handle to the contact as found by find_buddy
784 * @return The alias. Must be gfree'd.
786 gchar
* sipe_backend_buddy_get_alias(struct sipe_core_public
*sipe_public
,
787 const sipe_backend_buddy who
);
790 * Gets the server alias for a contact.
792 * @param sipe_public The handle representing the protocol instance making the call
793 * @param who The opaque handle to the contact as found by find_buddy
794 * @return The alias. Must be freed.
796 gchar
* sipe_backend_buddy_get_server_alias(struct sipe_core_public
*sipe_public
,
797 const sipe_backend_buddy who
);
800 * Gets the local alias for a contact
802 * @param sipe_public The handle representing the protocol instance making the call
803 * @param uri the budyy name
805 * @return the alias. Must be @g_free()'d.
807 gchar
*sipe_backend_buddy_get_local_alias(struct sipe_core_public
*sipe_public
,
808 const sipe_backend_buddy who
);
811 * Gets the name of the group a contact belongs to.
813 * @param sipe_public The handle representing the protocol instance making the call
814 * @param who The opaque handle to the contact as found by find_buddy
815 * @return The name. Must be freed.
817 gchar
* sipe_backend_buddy_get_group_name(struct sipe_core_public
*sipe_public
,
818 const sipe_backend_buddy who
);
821 * Called to retrieve a buddy-specific setting.
823 * @param sipe_public The handle representing the protocol instance making the call
824 * @param buddy The handle representing the buddy
825 * @param key The name of the setting
826 * @return The value of the setting. Must be freed.
828 gchar
* sipe_backend_buddy_get_string(struct sipe_core_public
*sipe_public
,
829 sipe_backend_buddy buddy
,
830 const sipe_buddy_info_fields key
);
833 * Called to set a buddy-specific setting.
835 * @param sipe_public The handle representing the protocol instance making the call
836 * @param buddy The handle representing the buddy
837 * @param key The name of the setting
838 * @param val The value to set
840 void sipe_backend_buddy_set_string(struct sipe_core_public
*sipe_public
,
841 sipe_backend_buddy buddy
,
842 const sipe_buddy_info_fields key
,
846 * Called after one ore more buddy-specific settings have been updated.
848 * Can be used by the backend to trigger an UI update event
850 * @param sipe_public The handle representing the protocol instance making the call
851 * @param uri SIP URI of the contact
853 void sipe_backend_buddy_refresh_properties(struct sipe_core_public
*sipe_public
,
857 * Get the status token for a contact
859 * @param sipe_public The handle representing the protocol instance making the call
860 * @param uri SIP URI of the contact
864 guint
sipe_backend_buddy_get_status(struct sipe_core_public
*sipe_public
,
868 * Sets the alias for a contact.
870 * @param sipe_public The handle representing the protocol instance making the call
871 * @param who The opaque handle to the contact as found by find_buddy
872 * @param alias The location where the alias will be put
873 * case. FALSE if the buddy was not found. The value of alias will not be changed.
875 void sipe_backend_buddy_set_alias(struct sipe_core_public
*sipe_public
,
876 const sipe_backend_buddy who
,
880 * Sets the server alias for a contact.
882 * @param sipe_public The handle representing the protocol instance making the call
883 * @param who The opaque handle to the contact as found by find_buddy
884 * @param alias The server alias of the contact
886 void sipe_backend_buddy_set_server_alias(struct sipe_core_public
*sipe_public
,
887 const sipe_backend_buddy who
,
891 * Start processing buddy list
893 * Will be called every time we receive a buddy list in roaming contacts
895 * @param sipe_public The handle representing the protocol instance making the call
897 void sipe_backend_buddy_list_processing_start(struct sipe_core_public
*sipe_public
);
900 * Finished processing buddy list
902 * Will be called every time we receive a buddy list in roaming contacts
904 * @param sipe_public The handle representing the protocol instance making the call
906 void sipe_backend_buddy_list_processing_finish(struct sipe_core_public
*sipe_public
);
909 * Add a contact to the buddy list
911 * @param sipe_public The handle representing the protocol instance making the call
912 * @param name The name of the contact
913 * @param alias The alias of the contact
914 * @param groupname The name of the group to add this contact to
915 * @return A handle to the newly created buddy
917 sipe_backend_buddy
sipe_backend_buddy_add(struct sipe_core_public
*sipe_public
,
920 const gchar
*groupname
);
923 * Remove a contact from the buddy list
925 * @param sipe_public The handle representing the protocol instance making the call
926 * @param who The opaque handle to the contact as found by find_buddy
928 void sipe_backend_buddy_remove(struct sipe_core_public
*sipe_public
,
929 const sipe_backend_buddy who
);
932 * Notifies the user that a remote user has wants to add the local user to his
933 * or her buddy list and requires authorization to do so.
935 * @param sipe_public The handle representing the protocol instance making the call
936 * @param who The name of the user that added this account
937 * @param alias The optional alias of the remote user
938 * @param on_list True if the user is already in our list
939 * @param auth_cb The callback called when the local user accepts
940 * @param deny_cb The callback called when the local user rejects
941 * @param data Data to be passed back to the above callbacks
943 typedef void (*sipe_backend_buddy_request_authorization_cb
)(void *);
945 void sipe_backend_buddy_request_add(struct sipe_core_public
*sipe_public
,
949 void sipe_backend_buddy_request_authorization(struct sipe_core_public
*sipe_public
,
953 sipe_backend_buddy_request_authorization_cb auth_cb
,
954 sipe_backend_buddy_request_authorization_cb deny_cb
,
957 gboolean
sipe_backend_buddy_is_blocked(struct sipe_core_public
*sipe_public
,
960 void sipe_backend_buddy_set_blocked_status(struct sipe_core_public
*sipe_public
,
964 void sipe_backend_buddy_set_status(struct sipe_core_public
*sipe_public
,
969 * Checks whether backend has a capability to use buddy photos. If this function
970 * returns @c FALSE, SIPE core will not attempt to download the photos from
971 * server to save bandwidth.
973 * @return @c TRUE if backend is photo capable, otherwise @FALSE
975 gboolean
sipe_backend_uses_photo(void);
978 * Gives backend a photo image associated with a SIP URI. Backend has ownership
979 * of the data and must free it when not needed.
981 * @param sipe_public The handle representing the protocol instance making the call
982 * @param who The name of the user whose photo is being set
983 * @param image_data The photo image data, must be g_free()'d by backend
984 * @param image_len Size of the image in Bytes
985 * @param photo_hash A data checksum provided by the server
987 void sipe_backend_buddy_set_photo(struct sipe_core_public
*sipe_public
,
991 const gchar
*photo_hash
);
994 * Retrieves a photo hash stored together with image data by
995 * @c sipe_backend_buddy_set_photo. Value is used by the core to detect photo
996 * file changes on server.
998 * @param sipe_public The handle representing the protocol instance making the call
999 * @param who The name of the user whose photo hash to retrieve
1000 * @return a photo hash (may be NULL)
1002 const gchar
*sipe_backend_buddy_get_photo_hash(struct sipe_core_public
*sipe_public
,
1006 * Called when a new internal group is about to be added. If this returns FALSE,
1007 * the group will not be added.
1009 * @param sipe_public The handle representing the protocol instance making the call
1010 * @param group_name The group being added
1011 * @return TRUE if everything is ok, FALSE if the group should not be added
1013 gboolean
sipe_backend_buddy_group_add(struct sipe_core_public
*sipe_public
,
1014 const gchar
*group_name
);
1017 * Called when a new internal group has been renamed
1019 * @param sipe_public The handle representing the protocol instance making the call
1020 * @param old_name old name of the group
1021 * @param new_name new name of the group
1022 * @return TRUE if the group was found and renamed
1024 gboolean
sipe_backend_buddy_group_rename(struct sipe_core_public
*sipe_public
,
1025 const gchar
*old_name
,
1026 const gchar
*new_name
);
1029 * Called when a new internal group should be deleted
1031 * NOTE: this will only be called on empty groups.
1033 * @param sipe_public The handle representing the protocol instance making the call
1034 * @param group_name The group that should be removed
1036 void sipe_backend_buddy_group_remove(struct sipe_core_public
*sipe_public
,
1037 const gchar
*group_name
);
1040 * Present requested buddy information to the user
1042 struct sipe_backend_buddy_info
;
1043 struct sipe_backend_buddy_info
*sipe_backend_buddy_info_start(struct sipe_core_public
*sipe_public
);
1044 void sipe_backend_buddy_info_add(struct sipe_core_public
*sipe_public
,
1045 struct sipe_backend_buddy_info
*info
,
1046 sipe_buddy_info_fields key
,
1047 const gchar
*value
);
1048 void sipe_backend_buddy_info_break(struct sipe_core_public
*sipe_public
,
1049 struct sipe_backend_buddy_info
*info
);
1050 void sipe_backend_buddy_info_finalize(struct sipe_core_public
*sipe_public
,
1051 struct sipe_backend_buddy_info
*info
,
1054 struct sipe_backend_buddy_tooltip
;
1055 void sipe_backend_buddy_tooltip_add(struct sipe_core_public
*sipe_public
,
1056 struct sipe_backend_buddy_tooltip
*tooltip
,
1057 const gchar
*description
,
1058 const gchar
*value
);
1061 * Buddy menu creation
1063 enum sipe_buddy_menu_type
{
1064 SIPE_BUDDY_MENU_MAKE_CHAT_LEADER
= 0,
1065 SIPE_BUDDY_MENU_REMOVE_FROM_CHAT
,
1066 SIPE_BUDDY_MENU_INVITE_TO_CHAT
,
1067 SIPE_BUDDY_MENU_NEW_CHAT
,
1068 SIPE_BUDDY_MENU_MAKE_CALL
,
1069 SIPE_BUDDY_MENU_SEND_EMAIL
,
1070 SIPE_BUDDY_MENU_ACCESS_LEVEL_HELP
,
1071 SIPE_BUDDY_MENU_CHANGE_ACCESS_LEVEL
,
1072 SIPE_BUDDY_MENU_ADD_NEW_DOMAIN
,
1073 SIPE_BUDDY_MENU_TYPES
1076 struct sipe_backend_buddy_menu
*sipe_backend_buddy_menu_start(struct sipe_core_public
*sipe_public
);
1077 struct sipe_backend_buddy_menu
*sipe_backend_buddy_menu_add(struct sipe_core_public
*sipe_public
,
1078 struct sipe_backend_buddy_menu
*menu
,
1080 enum sipe_buddy_menu_type type
,
1081 gpointer parameter
);
1082 struct sipe_backend_buddy_menu
*sipe_backend_buddy_menu_separator(struct sipe_core_public
*sipe_public
,
1083 struct sipe_backend_buddy_menu
*menu
,
1084 const gchar
*label
);
1085 struct sipe_backend_buddy_menu
*sipe_backend_buddy_sub_menu_add(struct sipe_core_public
*sipe_public
,
1086 struct sipe_backend_buddy_menu
*menu
,
1088 struct sipe_backend_buddy_menu
*sub
);
1090 SipeEncryptionPolicy
sipe_backend_media_get_encryption_policy(struct sipe_core_public
*sipe_public
);