Mercurial > pidgin
comparison libpurple/protocols/jabber/presence.c @ 25978:7e020fbe2cdb
propagate from branch 'im.pidgin.pidgin' (head 303af74a38e7b313d4fb0be4d4054a16cb13d819)
to branch 'im.pidgin.cpw.darkrain42.xmpp.avatars' (head 11e989f3ac36a0f958f031d55245db093923ea76)
author | Paul Aurich <paul@darkrain42.org> |
---|---|
date | Sat, 07 Mar 2009 01:32:29 +0000 |
parents | 0fa91206cf5a 5f9a24d1c25e |
children | 242a8c97270b |
comparison
equal
deleted
inserted
replaced
25426:2d92bbe6807b | 25978:7e020fbe2cdb |
---|---|
134 purple_debug_info("jabber", "attempt to send presence before roster retrieved\n"); | 134 purple_debug_info("jabber", "attempt to send presence before roster retrieved\n"); |
135 return; | 135 return; |
136 } | 136 } |
137 | 137 |
138 purple_status_to_jabber(status, &state, &stripped, &priority); | 138 purple_status_to_jabber(status, &state, &stripped, &priority); |
139 | 139 |
140 /* check for buzz support */ | 140 /* check for buzz support */ |
141 allowBuzz = purple_status_get_attr_boolean(status,"buzz"); | 141 allowBuzz = purple_status_get_attr_boolean(status,"buzz"); |
142 /* changing the buzz state has to trigger a re-broadcasting of the presence for caps */ | 142 /* changing the buzz state has to trigger a re-broadcasting of the presence for caps */ |
143 | 143 |
144 if (js->googletalk && stripped == NULL && purple_presence_is_status_primitive_active(p, PURPLE_STATUS_TUNE)) { | 144 if (js->googletalk && stripped == NULL && purple_presence_is_status_primitive_active(p, PURPLE_STATUS_TUNE)) { |
145 tune = purple_presence_get_status(p, "tune"); | 145 tune = purple_presence_get_status(p, "tune"); |
146 stripped = jabber_google_presence_outgoing(tune); | 146 stripped = jabber_google_presence_outgoing(tune); |
147 } | 147 } |
148 | 148 |
149 #define CHANGED(a,b) ((!a && b) || (a && a[0] == '\0' && b && b[0] != '\0') || \ | 149 #define CHANGED(a,b) ((!a && b) || (a && a[0] == '\0' && b && b[0] != '\0') || \ |
150 (a && !b) || (a && a[0] != '\0' && b && b[0] == '\0') || (a && b && strcmp(a,b))) | 150 (a && !b) || (a && a[0] != '\0' && b && b[0] == '\0') || (a && b && strcmp(a,b))) |
151 /* check if there are any differences to the <presence> and send them in that case */ | 151 /* check if there are any differences to the <presence> and send them in that case */ |
152 if (allowBuzz != js->allowBuzz || js->old_state != state || CHANGED(js->old_msg, stripped) || | 152 if (allowBuzz != js->allowBuzz || js->old_state != state || CHANGED(js->old_msg, stripped) || |
153 js->old_priority != priority || CHANGED(js->old_avatarhash, js->avatar_hash)) { | 153 js->old_priority != priority || CHANGED(js->old_avatarhash, js->avatar_hash)) { |
172 | 172 |
173 jabber_send(js, presence); | 173 jabber_send(js, presence); |
174 | 174 |
175 g_hash_table_foreach(js->chats, chats_send_presence_foreach, presence); | 175 g_hash_table_foreach(js->chats, chats_send_presence_foreach, presence); |
176 xmlnode_free(presence); | 176 xmlnode_free(presence); |
177 | 177 |
178 /* update old values */ | 178 /* update old values */ |
179 | 179 |
180 if(js->old_msg) | 180 if(js->old_msg) |
181 g_free(js->old_msg); | 181 g_free(js->old_msg); |
182 if(js->old_avatarhash) | 182 if(js->old_avatarhash) |
183 g_free(js->old_avatarhash); | 183 g_free(js->old_avatarhash); |
184 js->old_msg = g_strdup(stripped); | 184 js->old_msg = g_strdup(stripped); |
197 uri = purple_status_get_attr_string(tune, PURPLE_TUNE_URL); | 197 uri = purple_status_get_attr_string(tune, PURPLE_TUNE_URL); |
198 track = purple_status_get_attr_string(tune, PURPLE_TUNE_TRACK); | 198 track = purple_status_get_attr_string(tune, PURPLE_TUNE_TRACK); |
199 length = (!purple_status_get_attr_value(tune, PURPLE_TUNE_TIME)) ? -1 : | 199 length = (!purple_status_get_attr_value(tune, PURPLE_TUNE_TIME)) ? -1 : |
200 purple_status_get_attr_int(tune, PURPLE_TUNE_TIME); | 200 purple_status_get_attr_int(tune, PURPLE_TUNE_TIME); |
201 } | 201 } |
202 | 202 |
203 if(CHANGED(artist, js->old_artist) || CHANGED(title, js->old_title) || CHANGED(source, js->old_source) || | 203 if(CHANGED(artist, js->old_artist) || CHANGED(title, js->old_title) || CHANGED(source, js->old_source) || |
204 CHANGED(uri, js->old_uri) || CHANGED(track, js->old_track) || (length != js->old_length)) { | 204 CHANGED(uri, js->old_uri) || CHANGED(track, js->old_track) || (length != js->old_length)) { |
205 PurpleJabberTuneInfo tuneinfo = { | 205 PurpleJabberTuneInfo tuneinfo = { |
206 (char*)artist, | 206 (char*)artist, |
207 (char*)title, | 207 (char*)title, |
209 (char*)track, | 209 (char*)track, |
210 length, | 210 length, |
211 (char*)uri | 211 (char*)uri |
212 }; | 212 }; |
213 jabber_tune_set(js->gc, &tuneinfo); | 213 jabber_tune_set(js->gc, &tuneinfo); |
214 | 214 |
215 /* update old values */ | 215 /* update old values */ |
216 g_free(js->old_artist); | 216 g_free(js->old_artist); |
217 g_free(js->old_title); | 217 g_free(js->old_title); |
218 g_free(js->old_source); | 218 g_free(js->old_source); |
219 g_free(js->old_uri); | 219 g_free(js->old_uri); |
270 /* JEP-0115 */ | 270 /* JEP-0115 */ |
271 c = xmlnode_new_child(presence, "c"); | 271 c = xmlnode_new_child(presence, "c"); |
272 xmlnode_set_namespace(c, "http://jabber.org/protocol/caps"); | 272 xmlnode_set_namespace(c, "http://jabber.org/protocol/caps"); |
273 xmlnode_set_attrib(c, "node", CAPS0115_NODE); | 273 xmlnode_set_attrib(c, "node", CAPS0115_NODE); |
274 xmlnode_set_attrib(c, "ver", VERSION); | 274 xmlnode_set_attrib(c, "ver", VERSION); |
275 | 275 |
276 if(js != NULL) { | 276 if(js != NULL) { |
277 /* add the extensions */ | 277 /* add the extensions */ |
278 char extlist[1024]; | 278 char extlist[1024]; |
279 unsigned remaining = 1023; /* one less for the \0 */ | 279 unsigned remaining = 1023; /* one less for the \0 */ |
280 GList *feature; | 280 GList *feature; |
281 | 281 |
282 extlist[0] = '\0'; | 282 extlist[0] = '\0'; |
283 for(feature = jabber_features; feature && remaining > 0; feature = feature->next) { | 283 for(feature = jabber_features; feature && remaining > 0; feature = feature->next) { |
284 JabberFeature *feat = (JabberFeature*)feature->data; | 284 JabberFeature *feat = (JabberFeature*)feature->data; |
285 unsigned featlen; | 285 unsigned featlen; |
286 | 286 |
287 if(feat->is_enabled != NULL && feat->is_enabled(js, feat->shortname, feat->namespace) == FALSE) | 287 if(feat->is_enabled != NULL && feat->is_enabled(js, feat->shortname, feat->namespace) == FALSE) |
288 continue; /* skip this feature */ | 288 continue; /* skip this feature */ |
289 | 289 |
290 featlen = strlen(feat->shortname); | 290 featlen = strlen(feat->shortname); |
291 | 291 |
292 /* cut off when we don't have any more space left in our buffer (too bad) */ | 292 /* cut off when we don't have any more space left in our buffer (too bad) */ |
293 if(featlen > remaining) | 293 if(featlen > remaining) |
294 break; | 294 break; |
295 | 295 |
296 strncat(extlist,feat->shortname,remaining); | 296 strncat(extlist,feat->shortname,remaining); |
297 remaining -= featlen; | 297 remaining -= featlen; |
298 if(feature->next) { /* no space at the end */ | 298 if(feature->next) { /* no space at the end */ |
299 strncat(extlist," ",remaining); | 299 strncat(extlist," ",remaining); |
300 --remaining; | 300 --remaining; |
302 } | 302 } |
303 /* did we add anything? */ | 303 /* did we add anything? */ |
304 if(remaining < 1023) | 304 if(remaining < 1023) |
305 xmlnode_set_attrib(c, "ext", extlist); | 305 xmlnode_set_attrib(c, "ext", extlist); |
306 } | 306 } |
307 | 307 |
308 return presence; | 308 return presence; |
309 } | 309 } |
310 | 310 |
311 struct _jabber_add_permit { | 311 struct _jabber_add_permit { |
312 PurpleConnection *gc; | 312 PurpleConnection *gc; |
751 state, status); | 751 state, status); |
752 if(caps) { | 752 if(caps) { |
753 const char *node = xmlnode_get_attrib(caps,"node"); | 753 const char *node = xmlnode_get_attrib(caps,"node"); |
754 const char *ver = xmlnode_get_attrib(caps,"ver"); | 754 const char *ver = xmlnode_get_attrib(caps,"ver"); |
755 const char *ext = xmlnode_get_attrib(caps,"ext"); | 755 const char *ext = xmlnode_get_attrib(caps,"ext"); |
756 | 756 |
757 if(node && ver) { | 757 if(node && ver) { |
758 JabberPresenceCapabilities *userdata = g_new0(JabberPresenceCapabilities, 1); | 758 JabberPresenceCapabilities *userdata = g_new0(JabberPresenceCapabilities, 1); |
759 userdata->js = js; | 759 userdata->js = js; |
760 userdata->jb = jb; | 760 userdata->jb = jb; |
761 userdata->from = g_strdup(from); | 761 userdata->from = g_strdup(from); |