From 8b4bb1c7f100590f015fddb55b31fe3d0ea10417 Mon Sep 17 00:00:00 2001 From: James Booth Date: Sun, 1 Nov 2015 23:41:45 +0000 Subject: [PATCH] mucwin_roster takes ProfMucWin --- src/command/commands.c | 8 ++--- src/event/server_events.c | 5 +-- src/ui/mucwin.c | 64 +++++++++++++++++------------------- src/ui/ui.h | 2 +- tests/unittests/ui/stub_ui.c | 2 +- 5 files changed, 40 insertions(+), 41 deletions(-) diff --git a/src/command/commands.c b/src/command/commands.c index 540300de..98d2ec8a 100644 --- a/src/command/commands.c +++ b/src/command/commands.c @@ -1158,7 +1158,7 @@ _who_room(ProfWin *window, const char *const command, gchar **args) // no arg, show all contacts if ((presence == NULL) || (g_strcmp0(presence, "any") == 0)) { - mucwin_roster(mucwin->roomjid, occupants, NULL); + mucwin_roster(mucwin, occupants, NULL); // available } else if (strcmp("available", presence) == 0) { @@ -1172,7 +1172,7 @@ _who_room(ProfWin *window, const char *const command, gchar **args) occupants = g_list_next(occupants); } - mucwin_roster(mucwin->roomjid, filtered, "available"); + mucwin_roster(mucwin, filtered, "available"); // unavailable } else if (strcmp("unavailable", presence) == 0) { @@ -1186,7 +1186,7 @@ _who_room(ProfWin *window, const char *const command, gchar **args) occupants = g_list_next(occupants); } - mucwin_roster(mucwin->roomjid, filtered, "unavailable"); + mucwin_roster(mucwin, filtered, "unavailable"); // show specific status } else { @@ -1201,7 +1201,7 @@ _who_room(ProfWin *window, const char *const command, gchar **args) occupants = g_list_next(occupants); } - mucwin_roster(mucwin->roomjid, filtered, presence); + mucwin_roster(mucwin, filtered, presence); } g_list_free(occupants); diff --git a/src/event/server_events.c b/src/event/server_events.c index 3ba51afb..bfd8bdb3 100644 --- a/src/event/server_events.c +++ b/src/event/server_events.c @@ -557,9 +557,10 @@ sv_ev_muc_self_online(const char *const room, const char *const nick, gboolean c muc_roster_set_complete(room); // show roster if occupants list disabled by default - if (!prefs_get_boolean(PREF_OCCUPANTS)) { + ProfMucWin *mucwin = wins_get_muc(room); + if (mucwin && !prefs_get_boolean(PREF_OCCUPANTS)) { GList *occupants = muc_roster(room); - mucwin_roster(room, occupants, NULL); + mucwin_roster(mucwin, occupants, NULL); g_list_free(occupants); } diff --git a/src/ui/mucwin.c b/src/ui/mucwin.c index 279566ba..5edc6a8d 100644 --- a/src/ui/mucwin.c +++ b/src/ui/mucwin.c @@ -194,42 +194,40 @@ mucwin_room_disco_info(ProfMucWin *mucwin, GSList *identities, GSList *features) } void -mucwin_roster(const char *const roomjid, GList *roster, const char *const presence) +mucwin_roster(ProfMucWin *mucwin, GList *roster, const char *const presence) { - ProfWin *window = (ProfWin*)wins_get_muc(roomjid); - if (window == NULL) { - log_error("Received room roster but no window open for %s.", roomjid); - } else { - if ((roster == NULL) || (g_list_length(roster) == 0)) { - if (presence == NULL) { - win_print(window, '!', 0, NULL, 0, THEME_ROOMINFO, "", "Room is empty."); - } else { - win_vprint(window, '!', 0, NULL, 0, THEME_ROOMINFO, "", "No occupants %s.", presence); - } + assert(mucwin != NULL); + + ProfWin *window = (ProfWin*)mucwin; + if ((roster == NULL) || (g_list_length(roster) == 0)) { + if (presence == NULL) { + win_print(window, '!', 0, NULL, 0, THEME_ROOMINFO, "", "Room is empty."); } else { - int length = g_list_length(roster); - if (presence == NULL) { - win_vprint(window, '!', 0, NULL, NO_EOL, THEME_ROOMINFO, "", "%d occupants: ", length); - } else { - win_vprint(window, '!', 0, NULL, NO_EOL, THEME_ROOMINFO, "", "%d %s: ", length, presence); - } - - while (roster) { - Occupant *occupant = roster->data; - const char *presence_str = string_from_resource_presence(occupant->presence); - - theme_item_t presence_colour = theme_main_presence_attrs(presence_str); - win_vprint(window, '!', 0, NULL, NO_DATE | NO_EOL, presence_colour, "", "%s", occupant->nick); - - if (roster->next) { - win_print(window, '!', 0, NULL, NO_DATE | NO_EOL, 0, "", ", "); - } - - roster = g_list_next(roster); - } - win_print(window, '!', 0, NULL, NO_DATE, THEME_ONLINE, "", ""); - + win_vprint(window, '!', 0, NULL, 0, THEME_ROOMINFO, "", "No occupants %s.", presence); } + } else { + int length = g_list_length(roster); + if (presence == NULL) { + win_vprint(window, '!', 0, NULL, NO_EOL, THEME_ROOMINFO, "", "%d occupants: ", length); + } else { + win_vprint(window, '!', 0, NULL, NO_EOL, THEME_ROOMINFO, "", "%d %s: ", length, presence); + } + + while (roster) { + Occupant *occupant = roster->data; + const char *presence_str = string_from_resource_presence(occupant->presence); + + theme_item_t presence_colour = theme_main_presence_attrs(presence_str); + win_vprint(window, '!', 0, NULL, NO_DATE | NO_EOL, presence_colour, "", "%s", occupant->nick); + + if (roster->next) { + win_print(window, '!', 0, NULL, NO_DATE | NO_EOL, 0, "", ", "); + } + + roster = g_list_next(roster); + } + win_print(window, '!', 0, NULL, NO_DATE, THEME_ONLINE, "", ""); + } } diff --git a/src/ui/ui.h b/src/ui/ui.h index c7f6ec2e..61cf8745 100644 --- a/src/ui/ui.h +++ b/src/ui/ui.h @@ -172,7 +172,7 @@ void mucwin_occupant_affiliation_change(ProfMucWin *mucwin, const char *const ni const char *const affiliation, const char *const actor, const char *const reason); void mucwin_occupant_role_and_affiliation_change(ProfMucWin *mucwin, const char *const nick, const char *const role, const char *const affiliation, const char *const actor, const char *const reason); -void mucwin_roster(const char *const roomjid, GList *occupants, const char *const presence); +void mucwin_roster(ProfMucWin *mucwin, GList *occupants, const char *const presence); void mucwin_history(const char *const roomjid, const char *const nick, GDateTime *timestamp, const char *const message); void mucwin_message(const char *const roomjid, const char *const nick, const char *const message); diff --git a/tests/unittests/ui/stub_ui.c b/tests/unittests/ui/stub_ui.c index 01222777..5609b3a9 100644 --- a/tests/unittests/ui/stub_ui.c +++ b/tests/unittests/ui/stub_ui.c @@ -203,7 +203,7 @@ void mucwin_occupant_affiliation_change(ProfMucWin *mucwin, const char * const n const char * const actor, const char * const reason) {} void mucwin_occupant_role_and_affiliation_change(ProfMucWin *mucwin, const char * const nick, const char * const role, const char * const affiliation, const char * const actor, const char * const reason) {} -void mucwin_roster(const char * const roomjid, GList *occupants, const char * const presence) {} +void mucwin_roster(ProfMucWin *mucwin, GList *occupants, const char * const presence) {} void mucwin_history(const char * const roomjid, const char * const nick, GDateTime *timestamp, const char * const message) {} void mucwin_message(const char * const roomjid, const char * const nick,