diff options
Diffstat (limited to 'src/xmpp')
-rw-r--r-- | src/xmpp/bookmark.c | 14 | ||||
-rw-r--r-- | src/xmpp/iq.c | 13 | ||||
-rw-r--r-- | src/xmpp/message.c | 4 | ||||
-rw-r--r-- | src/xmpp/presence.c | 76 | ||||
-rw-r--r-- | src/xmpp/stanza.c | 22 |
5 files changed, 78 insertions, 51 deletions
diff --git a/src/xmpp/bookmark.c b/src/xmpp/bookmark.c index b4931b8f..b5d495a6 100644 --- a/src/xmpp/bookmark.c +++ b/src/xmpp/bookmark.c @@ -77,9 +77,7 @@ bookmark_request(void) id = strdup("bookmark_init_request"); autojoin_count = 0; - if (bookmark_ac != NULL) { - autocomplete_free(bookmark_ac); - } + autocomplete_free(bookmark_ac); bookmark_ac = autocomplete_new(); if (bookmark_list != NULL) { g_list_free_full(bookmark_list, _bookmark_item_destroy); @@ -180,15 +178,15 @@ _bookmark_join(const char *jid) char *account_name = jabber_get_account_name(); ProfAccount *account = accounts_get_account(account_name); Bookmark *item = found->data; - if (!muc_room_is_active(item->jid)) { + if (!muc_active(item->jid)) { char *nick = item->nick; if (nick == NULL) { nick = account->muc_nick; } presence_join_room(item->jid, nick, item->password); - muc_join_room(item->jid, nick, item->password, FALSE); + muc_join(item->jid, nick, item->password, FALSE); account_free(account); - } else if (muc_get_roster_received(item->jid)) { + } else if (muc_roster_complete(item->jid)) { ui_room_join(item->jid, TRUE); } return TRUE; @@ -345,9 +343,9 @@ _bookmark_handle_result(xmpp_conn_t * const conn, log_debug("Autojoin %s with nick=%s", jid, name); room_jid = jid_create_from_bare_and_resource(jid, name); - if (!muc_room_is_active(room_jid->barejid)) { + if (!muc_active(room_jid->barejid)) { presence_join_room(jid, name, password); - muc_join_room(jid, name, password, TRUE); + muc_join(jid, name, password, TRUE); } jid_destroy(room_jid); account_free(account); diff --git a/src/xmpp/iq.c b/src/xmpp/iq.c index 4a354a23..10355332 100644 --- a/src/xmpp/iq.c +++ b/src/xmpp/iq.c @@ -493,16 +493,17 @@ _version_result_handler(xmpp_conn_t * const conn, xmpp_stanza_t * const stanza, os_str = xmpp_stanza_get_text(os); } - PContact contact; Jid *jidp = jid_create(jid); - if (muc_room_is_active(jidp->barejid)) { - contact = muc_get_participant(jidp->barejid, jidp->resourcepart); + const char *presence = NULL; + if (muc_active(jidp->barejid)) { + Occupant *occupant = muc_roster_item(jidp->barejid, jidp->resourcepart); + presence = string_from_resource_presence(occupant->presence); } else { - contact = roster_get_contact(jidp->barejid); + PContact contact = roster_get_contact(jidp->barejid); + Resource *resource = p_contact_get_resource(contact, jidp->resourcepart); + presence = string_from_resource_presence(resource->presence); } - Resource *resource = p_contact_get_resource(contact, jidp->resourcepart); - const char *presence = string_from_resource_presence(resource->presence); handle_software_version_result(jid, presence, name_str, version_str, os_str); jid_destroy(jidp); diff --git a/src/xmpp/message.c b/src/xmpp/message.c index 0e80f9b5..f3940067 100644 --- a/src/xmpp/message.c +++ b/src/xmpp/message.c @@ -392,7 +392,7 @@ _groupchat_handler(xmpp_conn_t * const conn, } // room not active in profanity - if (!muc_room_is_active(jid->barejid)) { + if (!muc_active(jid->barejid)) { log_error("Message received for inactive chat room: %s", jid->str); jid_destroy(jid); return 1; @@ -444,7 +444,7 @@ _chat_handler(xmpp_conn_t * const conn, xmpp_stanza_t * const stanza, return 1; // private message from chat room use full jid (room/nick) - } else if (muc_room_is_active(jid->barejid)) { + } else if (muc_active(jid->barejid)) { // determine if the notifications happened whilst offline GTimeVal tv_stamp; gboolean delayed = stanza_get_delay(stanza, &tv_stamp); diff --git a/src/xmpp/presence.c b/src/xmpp/presence.c index 54c9d68c..cfbf18fe 100644 --- a/src/xmpp/presence.c +++ b/src/xmpp/presence.c @@ -142,7 +142,7 @@ _presence_subscription(const char * const jid, const jabber_subscr_t action) static GSList * _presence_get_subscription_requests(void) { - return autocomplete_get_list(sub_requests_ac); + return autocomplete_create_list(sub_requests_ac); } static gint @@ -167,7 +167,7 @@ static gboolean _presence_sub_request_exists(const char * const bare_jid) { gboolean result = FALSE; - GSList *requests_p = autocomplete_get_list(sub_requests_ac); + GSList *requests_p = autocomplete_create_list(sub_requests_ac); GSList *requests = requests_p; while (requests != NULL) { @@ -242,12 +242,12 @@ _presence_update(const resource_presence_t presence_type, const char * const msg static void _send_room_presence(xmpp_conn_t *conn, xmpp_stanza_t *presence) { - GList *rooms_p = muc_get_active_room_list(); + GList *rooms_p = muc_rooms(); GList *rooms = rooms_p; while (rooms != NULL) { const char *room = rooms->data; - const char *nick = muc_get_room_nick(room); + const char *nick = muc_nick(room); if (nick != NULL) { char *full_room_jid = create_fulljid(room, nick); @@ -331,7 +331,7 @@ _presence_leave_chat_room(const char * const room_jid) log_debug("Sending room leave presence to: %s", room_jid); xmpp_ctx_t *ctx = connection_get_ctx(); xmpp_conn_t *conn = connection_get_conn(); - char *nick = muc_get_room_nick(room_jid); + char *nick = muc_nick(room_jid); if (nick != NULL) { xmpp_stanza_t *presence = stanza_create_room_leave_presence(ctx, room_jid, @@ -697,27 +697,43 @@ _muc_user_handler(xmpp_conn_t * const conn, xmpp_stanza_t * const stanza, char *type = xmpp_stanza_get_attribute(stanza, STANZA_ATTR_TYPE); char *new_nick = stanza_get_new_nick(stanza); + // self unavailable if ((type != NULL) && (strcmp(type, STANZA_TYPE_UNAVAILABLE) == 0)) { // leave room if not self nick change if (new_nick != NULL) { - muc_set_room_pending_nick_change(from_room, new_nick); + muc_nick_change_start(from_room, new_nick); } else { handle_leave_room(from_room); } - // handle self nick change - } else if (muc_is_room_pending_nick_change(from_room)) { - muc_complete_room_nick_change(from_room, from_nick); - handle_room_nick_change(from_room, from_nick); + // self online + } else { + + // handle self nick change + if (muc_nick_change_pending(from_room)) { + handle_room_nick_change(from_room, from_nick); - // handle roster complete - } else if (!muc_get_roster_received(from_room)) { - handle_room_roster_complete(from_room); + // handle roster complete + } else if (!muc_roster_complete(from_room)) { + handle_room_roster_complete(from_room); - // room configuration required - if (stanza_muc_requires_config(stanza)) { - handle_room_requires_config(from_room); + // room configuration required + if (stanza_muc_requires_config(stanza)) { + handle_room_requires_config(from_room); + } + } + + // set own affiliation and role + xmpp_stanza_t *x = xmpp_stanza_get_child_by_ns(stanza, STANZA_NS_MUC_USER); + if (x) { + xmpp_stanza_t *item = xmpp_stanza_get_child_by_name(x, STANZA_NAME_ITEM); + if (item) { + char *role = xmpp_stanza_get_attribute(item, "role"); + muc_set_role(from_room, role); + char *affiliation = xmpp_stanza_get_attribute(item, "affiliation"); + muc_set_affiliation(from_room, affiliation); + } } } @@ -736,7 +752,7 @@ _muc_user_handler(xmpp_conn_t * const conn, xmpp_stanza_t * const stanza, if (stanza_is_room_nick_change(stanza)) { char *new_nick = stanza_get_new_nick(stanza); if (new_nick != NULL) { - muc_set_roster_pending_nick_change(from_room, new_nick, from_nick); + muc_roster_nick_change_start(from_room, new_nick, from_nick); free(new_nick); } } else { @@ -750,20 +766,32 @@ _muc_user_handler(xmpp_conn_t * const conn, xmpp_stanza_t * const stanza, } char *show_str = stanza_get_show(stanza, "online"); - if (!muc_get_roster_received(from_room)) { - muc_add_to_roster(from_room, from_nick, show_str, status_str); + char *role = NULL; + char *affiliation = NULL; + + xmpp_stanza_t *x = xmpp_stanza_get_child_by_ns(stanza, STANZA_NS_MUC_USER); + if (x) { + xmpp_stanza_t *item = xmpp_stanza_get_child_by_name(x, STANZA_NAME_ITEM); + if (item) { + role = xmpp_stanza_get_attribute(item, "role"); + affiliation = xmpp_stanza_get_attribute(item, "affiliation"); + } + } + + if (!muc_roster_complete(from_room)) { + muc_roster_add(from_room, from_nick, role, affiliation, show_str, status_str); } else { - char *old_nick = muc_complete_roster_nick_change(from_room, from_nick); + char *old_nick = muc_roster_nick_change_complete(from_room, from_nick); if (old_nick != NULL) { - muc_add_to_roster(from_room, from_nick, show_str, status_str); + muc_roster_add(from_room, from_nick, role, affiliation, show_str, status_str); handle_room_member_nick_change(from_room, old_nick, from_nick); free(old_nick); } else { - if (!muc_nick_in_roster(from_room, from_nick)) { - handle_room_member_online(from_room, from_nick, show_str, status_str); + if (!muc_roster_contains_nick(from_room, from_nick)) { + handle_room_member_online(from_room, from_nick, role, affiliation, show_str, status_str); } else { - handle_room_member_presence(from_room, from_nick, show_str, status_str); + handle_room_member_presence(from_room, from_nick, role, affiliation, show_str, status_str); } } } diff --git a/src/xmpp/stanza.c b/src/xmpp/stanza.c index 2d99c0f0..ff31bc65 100644 --- a/src/xmpp/stanza.c +++ b/src/xmpp/stanza.c @@ -822,11 +822,11 @@ stanza_is_muc_self_presence(xmpp_stanza_t * const stanza, // muc user namespaced x element xmpp_stanza_t *x = xmpp_stanza_get_child_by_ns(stanza, STANZA_NS_MUC_USER); - if (x != NULL) { + if (x) { // check for status child element with 110 code xmpp_stanza_t *x_children = xmpp_stanza_get_children(x); - while (x_children != NULL) { + while (x_children) { if (g_strcmp0(xmpp_stanza_get_name(x_children), STANZA_NAME_STATUS) == 0) { char *code = xmpp_stanza_get_attribute(x_children, STANZA_ATTR_CODE); if (g_strcmp0(code, "110") == 0) { @@ -838,9 +838,9 @@ stanza_is_muc_self_presence(xmpp_stanza_t * const stanza, // check for item child element with jid property xmpp_stanza_t *item = xmpp_stanza_get_child_by_name(x, STANZA_NAME_ITEM); - if (item != NULL) { + if (item) { char *jid = xmpp_stanza_get_attribute(item, STANZA_ATTR_JID); - if (jid != NULL) { + if (jid) { if (g_str_has_prefix(self_jid, jid)) { return TRUE; } @@ -849,21 +849,21 @@ stanza_is_muc_self_presence(xmpp_stanza_t * const stanza, // check if 'from' attribute identifies this user char *from = xmpp_stanza_get_attribute(stanza, STANZA_ATTR_FROM); - if (from != NULL) { + if (from) { Jid *from_jid = jid_create(from); - if (muc_room_is_active(from_jid->barejid)) { - char *nick = muc_get_room_nick(from_jid->barejid); + if (muc_active(from_jid->barejid)) { + char *nick = muc_nick(from_jid->barejid); if (g_strcmp0(from_jid->resourcepart, nick) == 0) { return TRUE; } } // check if a new nickname maps to a pending nick change for this user - if (muc_is_room_pending_nick_change(from_jid->barejid)) { + if (muc_nick_change_pending(from_jid->barejid)) { char *new_nick = from_jid->resourcepart; - if (new_nick != NULL) { - char *nick = muc_get_room_nick(from_jid->barejid); - char *old_nick = muc_get_old_nick(from_jid->barejid, new_nick); + if (new_nick) { + char *nick = muc_nick(from_jid->barejid); + char *old_nick = muc_old_nick(from_jid->barejid, new_nick); if (g_strcmp0(old_nick, nick) == 0) { return TRUE; } |