libpurple/protocols/myspace/message.c

branch
soc.2007.msimprpl
changeset 17945
41cb5e7f15a3
parent 17942
4d750e00cdae
child 17946
69d0d7dfd3de
equal deleted inserted replaced
17944:62750b952935 17945:41cb5e7f15a3
24 24
25 static void msim_msg_free_element(gpointer data, gpointer user_data); 25 static void msim_msg_free_element(gpointer data, gpointer user_data);
26 static void msim_msg_debug_string_element(gpointer data, gpointer user_data); 26 static void msim_msg_debug_string_element(gpointer data, gpointer user_data);
27 static gchar *msim_msg_pack_using(MsimMessage *msg, GFunc gf, gchar *sep, gchar *begin, gchar *end); 27 static gchar *msim_msg_pack_using(MsimMessage *msg, GFunc gf, gchar *sep, gchar *begin, gchar *end);
28 static gchar *msim_msg_element_pack(MsimMessageElement *elem); 28 static gchar *msim_msg_element_pack(MsimMessageElement *elem);
29 static GList *msim_msg_get_node(MsimMessage *msg, gchar *name);
29 30
30 /** Create a new MsimMessage. */ 31 /** Create a new MsimMessage. */
31 MsimMessage *msim_msg_new(void) 32 MsimMessage *msim_msg_new(void)
32 { 33 {
33 /* Just an empty list. */ 34 /* Just an empty list. */
247 msim_msg_free(msg); 248 msim_msg_free(msg);
248 249
249 return success; 250 return success;
250 } 251 }
251 252
253 /** Create a new MsimMessageElement * - must be g_free()'d.
254 *
255 * For internal use; users probably want msim_msg_append() or msim_msg_insert_before().
256 */
257 static MsimMessageElement *msim_msg_element_new(gchar *name, MsimMessageType type, gpointer data)
258 {
259 MsimMessageElement *elem;
260
261 elem = g_new0(MsimMessageElement, 1);
262
263 elem->name = name;
264 elem->type = type;
265 elem->data = data;
266
267 return elem;
268 }
269
252 270
253 /** Append a new element to a message. 271 /** Append a new element to a message.
254 * 272 *
255 * @param name Textual name of element (static string, neither copied nor freed). 273 * @param name Textual name of element (static string, neither copied nor freed).
256 * @param type An MSIM_TYPE_* code. 274 * @param type An MSIM_TYPE_* code.
277 * * MSIM_TYPE_LIST: TODO 295 * * MSIM_TYPE_LIST: TODO
278 * 296 *
279 * */ 297 * */
280 MsimMessage *msim_msg_append(MsimMessage *msg, gchar *name, MsimMessageType type, gpointer data) 298 MsimMessage *msim_msg_append(MsimMessage *msg, gchar *name, MsimMessageType type, gpointer data)
281 { 299 {
282 MsimMessageElement *elem; 300 return g_list_append(msg, msim_msg_element_new(name, type, data));
283 301 }
284 elem = g_new0(MsimMessageElement, 1); 302
285 303 /** Insert a new element into a message, before the given element name.
286 elem->name = name; 304 *
287 elem->type = type; 305 * @param name_before Name of the element to insert the new element before. If
288 elem->data = data; 306 * could not be found, new element will be inserted at end.
289 307 *
290 return g_list_append(msg, elem); 308 * See msim_msg_append() for usage of other parameters, and an important note about return value.
309 */
310 MsimMessage *msim_msg_insert_before(MsimMessage *msg, gchar *name_before, gchar *name, MsimMessageType type, gpointer data)
311 {
312 MsimMessageElement *new_elem;
313 GList *node_before;
314
315 new_elem = msim_msg_element_new(name, type, data);
316
317 node_before = msim_msg_get_node(msg, name_before);
318
319 return g_list_insert_before(msg, node_before, new_elem);
291 } 320 }
292 321
293 /** Pack a string using the given GFunc and seperator. 322 /** Pack a string using the given GFunc and seperator.
294 * Used by msim_msg_dump() and msim_msg_pack(). 323 * Used by msim_msg_dump() and msim_msg_pack().
295 */ 324 */
655 g_strfreev(items); 684 g_strfreev(items);
656 685
657 return table; 686 return table;
658 } 687 }
659 688
689 /** Search for and return the node in msg, matching name, or NULL.
690 * For internal use - users probably want to use msim_msg_get() to
691 * access the MsimMessageElement *, instead of the GList * container.
692 */
693 static GList *msim_msg_get_node(MsimMessage *msg, gchar *name)
694 {
695 GList *i;
696
697 /* Linear search for the given name. O(n) but n is small. */
698 for (i = g_list_first(msg); i != NULL; i = g_list_next(i))
699 {
700 MsimMessageElement *elem;
701
702 elem = i->data;
703 g_return_val_if_fail(elem != NULL, NULL);
704
705 if (strcmp(elem->name, name) == 0)
706 return i;
707 }
708 return NULL;
709 }
710
711
712
660 /** Return the first MsimMessageElement * with given name in the MsimMessage *. 713 /** Return the first MsimMessageElement * with given name in the MsimMessage *.
661 * 714 *
662 * @param name Name to search for. 715 * @param name Name to search for.
663 * 716 *
664 * @return MsimMessageElement * matching name, or NULL. 717 * @return MsimMessageElement * matching name, or NULL.
667 * you can access directly. But it is often more convenient to use 720 * you can access directly. But it is often more convenient to use
668 * another msim_msg_get_* that converts the data to what type you want. 721 * another msim_msg_get_* that converts the data to what type you want.
669 */ 722 */
670 MsimMessageElement *msim_msg_get(MsimMessage *msg, gchar *name) 723 MsimMessageElement *msim_msg_get(MsimMessage *msg, gchar *name)
671 { 724 {
672 GList *i; 725 GList *node;
673 726
674 /* Linear search for the given name. O(n) but n is small. */ 727 node = msim_msg_get_node(msg, name);
675 for (i = g_list_first(msg); i != NULL; i = g_list_next(i)) 728 if (node)
676 { 729 return (MsimMessageElement *)node->data;
677 MsimMessageElement *elem; 730 else
678 731 return NULL;
679 elem = i->data;
680 g_return_val_if_fail(elem != NULL, NULL);
681
682 if (strcmp(elem->name, name) == 0)
683 return elem;
684 }
685 return NULL;
686 } 732 }
687 733
688 /** Return the data of an element of a given name, as a string. 734 /** Return the data of an element of a given name, as a string.
689 * 735 *
690 * @param name Name of element. 736 * @param name Name of element.

mercurial