comparison libpurple/protocols/myspace/message.c @ 17291:d8903e1320a9

Previously, the return value of the processing function and msim_process() told msim_input_cb() whether to free the MsimMessage * or not, but now it is always freed. Functions can use msim_msg_clone() to keep a copy around if they need it. Message processing functions called from msim_process(), and msim_process() itself, now return TRUE if successful, FALSE if not successful.
author Jeffrey Connelly <jaconnel@calpoly.edu>
date Sun, 03 Jun 2007 01:28:59 +0000
parents 4f54e8c41086
children 2d9d53b509fd
comparison
equal deleted inserted replaced
17290:aa8e70fa1edc 17291:d8903e1320a9
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 29
30 /** Create a new MsimMessage. */
30 MsimMessage *msim_msg_new(void) 31 MsimMessage *msim_msg_new(void)
31 { 32 {
32 /* Just an empty list. */ 33 /* Just an empty list. */
33 return NULL; 34 return NULL;
34 } 35 }
35 36
36 /** Free an individual message element. */ 37 /** Clone an individual element.
38 *
39 * @param data MsimMessageElement * to clone.
40 * @param user_data Pointer to MsimMessage * to add cloned element to.
41 */
42 static void msim_msg_clone_element(gpointer data, gpointer user_data)
43 {
44 MsimMessageElement *elem;
45 MsimMessage **new;
46 gpointer new_data;
47
48 elem = (MsimMessageElement *)data;
49 new = (MsimMessage **)user_data;
50
51 switch (elem->type)
52 {
53 case MSIM_TYPE_BOOLEAN:
54 case MSIM_TYPE_INTEGER:
55 new_data = elem->data;
56 break;
57
58 case MSIM_TYPE_RAW:
59 case MSIM_TYPE_STRING:
60 new_data = g_strdup((gchar *)elem->data);
61 break;
62
63 case MSIM_TYPE_BINARY:
64 {
65 GString *gs;
66
67 gs = (GString *)elem->data;
68
69 new_data = g_string_new_len(gs->str, gs->len);
70 }
71 break;
72 /* TODO: other types */
73 default:
74 purple_debug_info("msim", "msim_msg_clone_element: unknown type %d\n", elem->type);
75 g_return_if_fail(NULL);
76 }
77
78 /* Append cloned data. Note that the 'name' field is a static string, so it
79 * never needs to be copied nor freed. */
80 *new = msim_msg_append(*new, elem->name, elem->type, new_data);
81 }
82
83 /** Clone an existing MsimMessage.
84 *
85 * @return Cloned message; caller should free with msim_msg_free().
86 */
87 MsimMessage *msim_msg_clone(MsimMessage *old)
88 {
89 MsimMessage *new;
90
91 if (!old)
92 return NULL;
93
94 new = msim_msg_new();
95
96 g_list_foreach(old, msim_msg_clone_element, &new);
97
98 return new;
99 }
100
101 /** Free an individual message element.
102 *
103 * @param data MsimMessageElement * to free.
104 * @param user_data Not used; required to match g_list_foreach() callback prototype.
105 */
37 static void msim_msg_free_element(gpointer data, gpointer user_data) 106 static void msim_msg_free_element(gpointer data, gpointer user_data)
38 { 107 {
39 MsimMessageElement *elem; 108 MsimMessageElement *elem;
40 109
41 elem = (MsimMessageElement *)data; 110 elem = (MsimMessageElement *)data;
42 111
43 switch (elem->type) 112 switch (elem->type)
44 { 113 {
45 case MSIM_TYPE_BOOLEAN: /* Fall through */ 114 case MSIM_TYPE_BOOLEAN:
46 case MSIM_TYPE_INTEGER: 115 case MSIM_TYPE_INTEGER:
47 /* Integer value stored in gpointer - no need to free(). */ 116 /* Integer value stored in gpointer - no need to free(). */
48 break; 117 break;
49 118
50 case MSIM_TYPE_RAW: /* Fall through */ 119 case MSIM_TYPE_RAW:
51 case MSIM_TYPE_STRING: 120 case MSIM_TYPE_STRING:
52 /* Always free strings - caller should have g_strdup()'d if 121 /* Always free strings - caller should have g_strdup()'d if
53 * string was static or temporary and not to be freed. */ 122 * string was static or temporary and not to be freed. */
54 g_free(elem->data); 123 g_free(elem->data);
55 break; 124 break;