# HG changeset patch # User Mark Doliner # Date 1218014826 0 # Node ID 9bf36aad87359f6129ee910b247a21041ddbdb58 # Parent bfbad8f78ec6f665943ece24803de13c9f195d7d We talked about this and decided it was probably cleaner to not use a static variable here. diff -r bfbad8f78ec6 -r 9bf36aad8735 libpurple/protocols/jabber/jabber.h --- a/libpurple/protocols/jabber/jabber.h Wed Aug 06 07:03:37 2008 +0000 +++ b/libpurple/protocols/jabber/jabber.h Wed Aug 06 09:27:06 2008 +0000 @@ -108,6 +108,37 @@ GHashTable *buddies; gboolean roster_parsed; + /* + * This boolean was added to eliminate a heinous bug where we would + * get into a loop with the server and move a buddy back and forth + * from one group to another. + * + * The sequence goes something like this: + * 1. Our resource and another resource both approve an authorization + * request at the exact same time. We put the buddy in group A and + * the other resource put the buddy in group B. + * 2. The server receives the roster add for group B and sends us a + * roster push. + * 3. We receive this roster push and modify our local blist. This + * triggers us to send a roster add for group B. + * 4. The server recieves our earlier roster add for group A and sends + * us a roster push. + * 5. We receive this roster push and modify our local blist. This + * triggers us to send a roster add for group A. + * 6. The server receives our earlier roster add for group B and sends + * us a roster push. + * (repeat steps 3 through 6 ad infinitum) + * + * This boolean is used to short-circuit the sending of a roster add + * when we receive a roster push. + * + * See these bug reports: + * http://trac.adiumx.com/ticket/8834 + * http://developer.pidgin.im/ticket/5484 + * http://developer.pidgin.im/ticket/6188 + */ + gboolean currently_parsing_roster_push; + GHashTable *chats; GList *chat_servers; PurpleRoomlist *roomlist; diff -r bfbad8f78ec6 -r 9bf36aad8735 libpurple/protocols/jabber/roster.c --- a/libpurple/protocols/jabber/roster.c Wed Aug 06 07:03:37 2008 +0000 +++ b/libpurple/protocols/jabber/roster.c Wed Aug 06 09:27:06 2008 +0000 @@ -31,37 +31,6 @@ #include -/* - * This boolean was added to eliminate a heinous bug where we would - * get into a loop with the server and move a buddy back and forth - * from one group to another. - * - * The sequence goes something like this: - * 1. Our resource and another resource both approve an authorization - * request at the exact same time. We put the buddy in group A and - * the other resource put the buddy in group B. - * 2. The server receives the roster add for group B and sends us a - * roster push. - * 3. We receive this roster push and modify our local blist. This - * triggers us to send a roster add for group B. - * 4. The server recieves our earlier roster add for group A and sends - * us a roster push. - * 5. We receive this roster push and modify our local blist. This - * triggers us to send a roster add for group A. - * 6. The server receives our earlier roster add for group B and sends - * us a roster push. - * (repeat steps 3 through 6 ad infinitum) - * - * This boolean is used to short-circuit the sending of a roster add - * when we receive a roster push. - * - * See these bug reports: - * http://trac.adiumx.com/ticket/8834 - * http://developer.pidgin.im/ticket/5484 - * http://developer.pidgin.im/ticket/6188 - */ -static gboolean parsing_from_server = FALSE; - void jabber_roster_request(JabberStream *js) { JabberIq *iq; @@ -199,7 +168,7 @@ if(!query) return; - parsing_from_server = TRUE; + js->currently_parsing_roster_push = TRUE; for(item = xmlnode_get_child(query, "item"); item; item = xmlnode_get_next_twin(item)) { @@ -283,7 +252,7 @@ } } - parsing_from_server = FALSE; + js->currently_parsing_roster_push = FALSE; /* if we're just now parsing the roster for the first time, * then now would be the time to send our initial presence */ @@ -303,7 +272,7 @@ JabberIq *iq; xmlnode *query, *item, *group; - if (parsing_from_server) + if (js->currently_parsing_roster_push) return; if(!(b = purple_find_buddy(js->gc->account, name)))