about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorJames Booth <boothj5@gmail.com>2012-11-07 22:59:48 +0000
committerJames Booth <boothj5@gmail.com>2012-11-07 22:59:48 +0000
commitc4c5668779a26fa614b3511437454e6a2dcc027f (patch)
tree04441a4b279a14bd275731fd539c848f3ad49238
parent6cb9c853cb6a33ed7f8f1f29e513f4c587593b1a (diff)
downloadprofani-tty-c4c5668779a26fa614b3511437454e6a2dcc027f.tar.gz
room_chat: add occupants to room roster until roster received
-rw-r--r--src/jabber.c5
-rw-r--r--src/room_chat.c24
-rw-r--r--src/room_chat.h2
3 files changed, 30 insertions, 1 deletions
diff --git a/src/jabber.c b/src/jabber.c
index 21530c7e..336c990b 100644
--- a/src/jabber.c
+++ b/src/jabber.c
@@ -660,9 +660,12 @@ _room_presence_handler(const char * const jid)
 
     // handle self presence (means room roster has been sent)
     if (strcmp(room_get_nick_for_room(room), nick) == 0) {
+        room_set_roster_received(room);
         prof_handle_room_roster_complete(room);
     } else {
-        room_add_to_roster(room, nick);
+        if (!room_get_roster_received(room)) {
+            room_add_to_roster(room, nick);
+        }
     }
 
     return 1;
diff --git a/src/room_chat.c b/src/room_chat.c
index 6b560bbf..82f997f7 100644
--- a/src/room_chat.c
+++ b/src/room_chat.c
@@ -29,6 +29,7 @@ typedef struct _muc_room_t {
     char *jid;
     char *nick;
     GSList *roster;
+    gboolean roster_received;
 } muc_room;
 
 GHashTable *rooms = NULL;
@@ -47,6 +48,7 @@ room_join(const char * const jid, const char * const nick)
     new_room->jid = strdup(jid);
     new_room->nick = strdup(nick);
     new_room->roster = NULL;
+    new_room->roster_received = FALSE;
 
     g_hash_table_insert(rooms, strdup(jid), new_room);
 }
@@ -131,6 +133,28 @@ room_get_roster(const char * const jid)
     }
 }
 
+void
+room_set_roster_received(const char * const jid)
+{
+    muc_room *room = g_hash_table_lookup(rooms, jid);
+
+    if (room != NULL) {
+        room->roster_received = TRUE;
+    }
+}
+
+gboolean
+room_get_roster_received(const char * const jid)
+{
+    muc_room *room = g_hash_table_lookup(rooms, jid);
+
+    if (room != NULL) {
+        return room->roster_received;
+    } else {
+        return FALSE;
+    }
+}
+
 static void
 _room_free(muc_room *room)
 {
diff --git a/src/room_chat.h b/src/room_chat.h
index 58e309a1..77675fcd 100644
--- a/src/room_chat.h
+++ b/src/room_chat.h
@@ -30,3 +30,5 @@ gboolean room_parse_room_jid(const char * const room_jid, char **room,
     char **nick);
 void room_add_to_roster(const char * const jid, const char * const nick);
 GSList * room_get_roster(const char * const jid);
+void room_set_roster_received(const char * const jid);
+gboolean room_get_roster_received(const char * const jid);