| 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. |