comparison libpurple/protocols/jabber/usermood.c @ 32819:2c6510167895 default tip

propagate from branch 'im.pidgin.pidgin.2.x.y' (head 3315c5dfbd0ad16511bdcf865e5b07c02d07df24) to branch 'im.pidgin.pidgin' (head cbd1eda6bcbf0565ae7766396bb8f6f419cb6a9a)
author Elliott Sales de Andrade <qulogic@pidgin.im>
date Sat, 02 Jun 2012 02:30:49 +0000
parents 3b1070cb4f29
children
comparison
equal deleted inserted replaced
32818:01ff09d4a463 32819:2c6510167895
113 {"thirsty", N_("Thirsty"), NULL}, 113 {"thirsty", N_("Thirsty"), NULL},
114 {"tired", N_("Tired"), NULL}, 114 {"tired", N_("Tired"), NULL},
115 {"undefined", N_("Undefined"), NULL}, 115 {"undefined", N_("Undefined"), NULL},
116 {"weak", N_("Weak"), NULL}, 116 {"weak", N_("Weak"), NULL},
117 {"worried", N_("Worried"), NULL}, 117 {"worried", N_("Worried"), NULL},
118 /* Mark the last record. */ 118 /* Mar last record. */
119 {NULL, NULL, NULL} 119 {NULL, NULL, NULL}
120 }; 120 };
121
122 static const PurpleMood*
123 find_mood_by_name(const gchar *name)
124 {
125 int i;
126
127 g_return_val_if_fail(name && *name, NULL);
128
129 for (i = 0; moods[i].mood != NULL; ++i) {
130 if (g_str_equal(name, moods[i].mood)) {
131 return &moods[i];
132 }
133 }
134
135 return NULL;
136 }
121 137
122 static void jabber_mood_cb(JabberStream *js, const char *from, xmlnode *items) { 138 static void jabber_mood_cb(JabberStream *js, const char *from, xmlnode *items) {
123 /* it doesn't make sense to have more than one item here, so let's just pick the first one */ 139 /* it doesn't make sense to have more than one item here, so let's just pick the first one */
124 xmlnode *item = xmlnode_get_child(items, "item"); 140 xmlnode *item = xmlnode_get_child(items, "item");
125 const char *newmood = NULL; 141 const char *newmood = NULL;
137 if (moodinfo->type == XMLNODE_TYPE_TAG) { 153 if (moodinfo->type == XMLNODE_TYPE_TAG) {
138 if (!strcmp(moodinfo->name, "text")) { 154 if (!strcmp(moodinfo->name, "text")) {
139 if (!moodtext) /* only pick the first one */ 155 if (!moodtext) /* only pick the first one */
140 moodtext = xmlnode_get_data(moodinfo); 156 moodtext = xmlnode_get_data(moodinfo);
141 } else { 157 } else {
142 int i; 158 const PurpleMood *target_mood;
143 for (i = 0; moods[i].mood; ++i) { 159
144 /* verify that the mood is known (valid) */ 160 /* verify that the mood is known (valid) */
145 if (!strcmp(moodinfo->name, moods[i].mood)) { 161 target_mood = find_mood_by_name(moodinfo->name);
146 newmood = moods[i].mood; 162 newmood = target_mood ? target_mood->mood : NULL;
147 break;
148 }
149 }
150 } 163 }
164
151 if (newmood != NULL && moodtext != NULL) 165 if (newmood != NULL && moodtext != NULL)
152 break; 166 break;
153 } 167 }
154 if (newmood != NULL && moodtext != NULL) 168 if (newmood != NULL && moodtext != NULL)
155 break; 169 break;
156 } 170 }
157 if (newmood != NULL) { 171 if (newmood != NULL) {
158 purple_prpl_got_user_status(js->gc->account, from, "mood", 172 purple_prpl_got_user_status(purple_connection_get_account(js->gc), from, "mood",
159 PURPLE_MOOD_NAME, newmood, 173 PURPLE_MOOD_NAME, newmood,
160 PURPLE_MOOD_COMMENT, moodtext, 174 PURPLE_MOOD_COMMENT, moodtext,
161 NULL); 175 NULL);
162 } else { 176 } else {
163 purple_prpl_got_user_status_deactive(js->gc->account, from, "mood"); 177 purple_prpl_got_user_status_deactive(purple_connection_get_account(js->gc), from, "mood");
164 } 178 }
165 g_free(moodtext); 179 g_free(moodtext);
166 } 180 }
167 181
168 void jabber_mood_init(void) { 182 void jabber_mood_init(void) {
169 jabber_add_feature("http://jabber.org/protocol/mood", jabber_pep_namespace_only_when_pep_enabled_cb); 183 jabber_add_feature("http://jabber.org/protocol/mood", jabber_pep_namespace_only_when_pep_enabled_cb);
170 jabber_pep_register_handler("http://jabber.org/protocol/mood", jabber_mood_cb); 184 jabber_pep_register_handler("http://jabber.org/protocol/mood", jabber_mood_cb);
171 } 185 }
172 186
173 void jabber_mood_set(JabberStream *js, const char *mood, const char *text) { 187 gboolean
188 jabber_mood_set(JabberStream *js, const char *mood, const char *text)
189 {
190 const PurpleMood *target_mood = NULL;
174 xmlnode *publish, *moodnode; 191 xmlnode *publish, *moodnode;
192
193 if (mood && *mood) {
194 target_mood = find_mood_by_name(mood);
195 /* Mood specified, but is invalid --
196 * fail so that the command can handle this.
197 */
198 if (!target_mood)
199 return FALSE;
200 }
175 201
176 publish = xmlnode_new("publish"); 202 publish = xmlnode_new("publish");
177 xmlnode_set_attrib(publish,"node","http://jabber.org/protocol/mood"); 203 xmlnode_set_attrib(publish,"node","http://jabber.org/protocol/mood");
178 moodnode = xmlnode_new_child(xmlnode_new_child(publish, "item"), "mood"); 204 moodnode = xmlnode_new_child(xmlnode_new_child(publish, "item"), "mood");
179 xmlnode_set_namespace(moodnode, "http://jabber.org/protocol/mood"); 205 xmlnode_set_namespace(moodnode, "http://jabber.org/protocol/mood");
180 if (mood && *mood) { 206
181 /* if mood is NULL, set an empty mood node, meaning: unset mood */ 207 if (target_mood) {
208 /* If target_mood is not NULL, then
209 * target_mood->mood == mood, and is a valid element name.
210 */
182 xmlnode_new_child(moodnode, mood); 211 xmlnode_new_child(moodnode, mood);
183 } 212
184 213 /* Only set text when setting a mood */
185 if (text && *text) { 214 if (text && *text) {
186 xmlnode *textnode = xmlnode_new_child(moodnode, "text"); 215 xmlnode *textnode = xmlnode_new_child(moodnode, "text");
187 xmlnode_insert_data(textnode, text, -1); 216 xmlnode_insert_data(textnode, text, -1);
217 }
188 } 218 }
189 219
190 jabber_pep_publish(js, publish); 220 jabber_pep_publish(js, publish);
191 /* publish is freed by jabber_pep_publish -> jabber_iq_send -> jabber_iq_free 221 return TRUE;
192 (yay for well-defined memory management rules) */
193 } 222 }
194 223
195 PurpleMood *jabber_get_moods(PurpleAccount *account) 224 PurpleMood *jabber_get_moods(PurpleAccount *account)
196 { 225 {
197 return moods; 226 return moods;