6 * Copyright (C) 2009-2012 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
24 * Interface dependencies:
30 /* Forward declarations */
31 struct sipe_core_private
;
32 struct sipe_transport_connection
;
34 /* Our publication type keys. OCS 2007+
35 * Format: SIPE_PUB_{Category}[_{SubSategory}]
42 * Unique to the device.
44 #define SIPE_PUB_DEVICE 0
49 * Availability, activity, end-point location, time zone, and device type.
50 * First hexadecimal digit is 0x3; remaining seven hexadecimal digits are unique per device.
52 #define SIPE_PUB_STATE_MACHINE 3
57 * Availability and activity.
60 #define SIPE_PUB_STATE_USER 2
65 * Availability, activity, meeting subject, and meeting location.
66 * First hexadecimal digit is 0x4; remaining seven hexadecimal digits are unique per device.
68 #define SIPE_PUB_STATE_CALENDAR 4
71 * Calendar state for an Out of Office meeting
73 * (??)Activity for when a user sets or removes an Out of Office message in Exchange.
74 * (+)user sets in Outlook for an Out of Office meeting
75 * First hexadecimal digit is 0x5; remaining seven hexadecimal digits are unique per device.
77 #define SIPE_PUB_STATE_CALENDAR_OOF 5
82 * Availability and activity for RCC call connect/disconnect or participant count changes from 0 to 2, 2 to N, N to 2, 2 to 0.
83 * First hexadecimal digit is 0x7; remaining seven hexadecimal digits are unique per device.
85 #define SIPE_PUB_STATE_PHONE_RCC 7
90 * Availability and activity for VOIP call connect/disconnect or participant count changes from 0 to 2, 2 to N, N to 2, 2 to 0.
91 * First hexadecimal digit is 0x8; remaining seven hexadecimal digits uniquely define the SIP URI and device.
93 #define SIPE_PUB_STATE_PHONE_VOIP 8
98 * Start time, granularity, and free/busy data.
99 * First hexadecimal digit is 0x4; last seven hexadecimal digits uniquely define the calendar.
101 #define SIPE_PUB_CALENDAR_DATA 400
106 * Out of Office note that a user sets in Outlook using the Out of Office assistant.
107 * First hexadecimal digit is 0x4; last seven hexadecimal digits uniquely define the calendar.
109 #define SIPE_PUB_NOTE_OOF 400
112 * Returns epid value.
114 * @param sipe_private (in) SIPE core private data
116 * @return epid. Must be g_free()'d.
119 get_epid(struct sipe_core_private
*sipe_private
);
122 * Returns UUID value.
124 * @param sipe_private (in) SIPE core private data
126 * @return uuid. Must be g_free()'d.
129 get_uuid(struct sipe_core_private
*sipe_private
);
134 * @return Call ID. Must be g_free()'d.
136 gchar
*gencallid(void);
141 * @return Tag. Must be g_free()'d.
146 * Generate conference-id
147 * 32 characters long. Value space is restricted to printable ASCII characters
149 * Ex.: 8386E6AEAAA41E4AA6627BA76D43B6D1
151 * @return conference-id. Must be g_free()'d.
153 gchar
*genconfid(void);
156 * Returns instance value for particular publication type.
157 * It should be consistent for the same endpoint
158 * but different between distinct endpoints.
160 * See defined constants for keys patterned SIPE_PUB_*
163 sipe_get_pub_instance(struct sipe_core_private
*sipe_private
,
164 int publication_key
);
167 * Get contact information from SIPE account
169 * @param sipe_private (in) SIPE core private data
171 * @return Contact. Must be g_free()'d.
173 gchar
*get_contact(const struct sipe_core_private
*sipe_private
);
176 * Parses URI from SIP header
178 * @param hdr (in) To/From header
180 * @return URI with sip: prefix. Must be g_free()'d.
182 gchar
*parse_from(const gchar
*hdr
);
185 * Create sip: URI from name
189 * @return URI with sip: prefix. Must be g_free()'d.
191 gchar
*sip_uri_from_name(const gchar
*name
);
194 * Create sip: URI from SIP account user name
196 * @param sipe_private (in) SIPE core private data
198 * @return URI with sip: prefix. Must be g_free()'d.
200 #define sip_uri_self(sipe_private) (sip_uri_from_name(sipe_private->username))
203 * Create sip: URI from name or sip: URI
205 * @param string (in) name or sip: URI
207 * @return URI with sip: prefix. Must be g_free()'d.
209 gchar
*sip_uri(const gchar
*string
);
212 * Create sip: URI from name or sip: URI. Checks for invalid characters
214 * @param string (in) name or sip: URI
216 * @return URI with sip: prefix. Returns NULL if @c string contains invalid
217 * characters. Must be g_free()'d.
219 gchar
*sip_uri_if_valid(const gchar
*string
);
222 * Returns pointer to URI without sip: prefix if any (doesn't allocate memory)
224 * @param sip_uri SIP URI possibly with sip: prefix. Example: sip:first.last@hq.company.com
226 * @return pointer to URL without sip: prefix. Coresponding example: first.last@hq.company.com
228 const gchar
*sipe_get_no_sip_uri(const gchar
*sip_uri
);
231 * Tries to figure out if contact alias which stored locally
232 * is just SIP URI, not a proper display name or local alias.
234 * @param uri SIP URI with 'sip:' prefix.
235 * @param alias as returned by purple.
238 sipe_is_bad_alias(const char *uri
,
242 * Checks if provided string is empty - NULL, zero size or just series of white spaces.
243 * Doesn't modify input string.
246 is_empty(const char *st
);
248 /** Returns newly allocated string. Must be g_free()'d */
250 replace(const char *st
,
252 const char *replace
);
257 * @param type message type description (SIP or HTTP).
258 * @param header message header
259 * @param body message body or NULL
260 * @param sending TRUE if outgoing message
262 void sipe_utils_message_debug(const gchar
*type
,
268 * Tests two strings for equality.
270 * Unlike strcmp(), this function will not crash if one or both of the
271 * strings are @c NULL.
273 * Same as purple_strequal (defined only for 2.6) to maintain
274 * our backward compatibility.
276 * @param left A string
277 * @param right A string to compare with left
279 * @return @c TRUE if the strings are the same, else @c FALSE.
282 gboolean
sipe_strequal(const gchar
*left
, const gchar
*right
);
285 * Tests two strings for equality, ignoring the case
287 * Same as glib @c g_ascii_strcasecmp() but works correctly for @c NULL
288 * pointers too. Plus it doesn't complain loudly about them...
290 * @param left A string
291 * @param right A string to compare with left
293 * @return @c TRUE if the strings are the same, else @c FALSE.
296 gboolean
sipe_strcase_equal(const gchar
*left
, const gchar
*right
);
299 * Compares two strings
301 * Unlike strcmp(), this function will not crash if one or both of the
302 * strings are @c NULL.
304 * Same as g_strcmp0 (defined only for >= 2.16) to maintain
305 * our backward compatibility. The declaration is compatible to
309 * @param b A string to compare with a
311 * @return negative value if a < b; zero if a = b; positive value if a > b.
314 gint
sipe_strcompare(gconstpointer a
, gconstpointer b
);
317 * Parses a timestamp in ISO8601 format and returns a time_t.
318 * Assumes UTC if no timezone specified
320 * @param timestamp The timestamp
323 sipe_utils_str_to_time(const gchar
*timestamp
);
326 * Converts time_t to ISO8601 string.
329 * Must be g_free()'d after use.
331 * Example: 2010-02-03T23:59:59Z
334 sipe_utils_time_to_str(time_t timestamp
);
342 * Parses string of hex digits to buffer.
345 * @param hex_str (in) string of hex digits to convert.
346 * @param buff (out) newly allocated buffer. Must be g_free()'d after use.
348 * @return size of newly allocated buffer
351 hex_str_to_buff(const char *hex_str
, guint8
**buff
);
354 * Composes hex string out of provided buffer.
357 * @param buff input buffer
358 * @param buff_len length of buffer
360 * @result newly allocated hex string representing buffer. Must be g_free()'d after use.
363 buff_to_hex_str(const guint8
*buff
, const size_t buff_len
);
366 * Creates name-value pairs from given lines and appends them to @c list
368 * Lines must be in format 'name [delimiter] value'
370 * @param list a list of @c sipnameval structures
371 * @param lines array of strings in format 'name: value'
372 * @param delimiter sequence of characters between name and value
374 * @return @c FALSE if any of @c lines has incorrect format, @c TRUE otherwise
377 sipe_utils_parse_lines(GSList
**list
, gchar
**lines
, gchar
*delimiter
);
380 * Adds a name-value pair to @c list
382 * @param list a list of @c sipnameval structures
383 * @param name attribute's name
384 * @param value value of attribute @c name
386 * @return the new start of the GSList
389 sipe_utils_nameval_add(GSList
*list
, const gchar
*name
, const gchar
*value
);
392 * Finds a value of attribute @c name in @c list
394 * @param list a list of @c sipnameval structures
395 * @param name attribute to find
397 * @return value of @c name or NULL if @c name is not found
400 sipe_utils_nameval_find(const GSList
*list
, const gchar
*name
);
403 * Returns @c which occurrence of attribute @c name in @c list
405 * @c which is zero based, so 0 means first occurrence of @c name in @c list.
407 * @param list a list of @c sipnameval structures
408 * @param name attribute to find
409 * @param which specifies occurrence of @name in @c list
411 * @return value of @c name or NULL if @c name is not found
414 sipe_utils_nameval_find_instance(const GSList
*list
, const gchar
*name
, int which
);
417 * Frees memory allocated by @c list
419 * @param list a list of @c sipnameval structures
422 sipe_utils_nameval_free(GSList
*list
);
425 * Given a string, this replaces one substring with another
426 * and returns a newly allocated string.
428 * @param string the string from which to replace stuff.
429 * @param delimiter the substring you want replaced.
430 * @param replacement the substring you want as replacement.
432 * @return string with the substitution or NULL. Must be g_free()'d after use.
434 gchar
*sipe_utils_str_replace(const gchar
*string
,
435 const gchar
*delimiter
,
436 const gchar
*replacement
);
439 * Remove read characters from transport buffer
441 * @param conn the transport connection
442 * @param unread pointer to the first character in the buffer
444 void sipe_utils_shrink_buffer(struct sipe_transport_connection
*conn
,
445 const gchar
*unread
);
447 * Checks whether given IP address belongs to private block as defined in RFC1918
449 * @param ip IPv4 address in "X.X.X.X" format
450 * @return @c TRUE if address is private
452 gboolean
sipe_utils_ip_is_private(const char *ip
);
455 * Generate presence key
457 * @param uri presence URI
459 * @return key string. Must be g_free()'d after use.
461 gchar
*sipe_utils_presence_key(const gchar
*uri
);
464 * Generate subscription key
466 * @param event event name
467 * @param uri presence URI
469 * @return key string. Must be g_free()'d after use.
471 gchar
*sipe_utils_subscription_key(const gchar
*event
,
475 * Decodes a URI into a plain string.
477 * @param string the string to translate.
479 * @return the resulting string. Must be g_free()'d after use.
481 gchar
*sipe_utils_uri_unescape(const gchar
*string
);
484 * Inserts in item in the list only if the value isn't already in that list
486 * @param list a singly linked list
487 * @param data the item to insert
488 * @param fund function to use to compare the values
490 * @return the new list head
493 slist_insert_unique_sorted(GSList
*list
, gpointer data
, GCompareFunc func
);