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