Mercurial > pidgin
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; |