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