From bfe1d76e5fcc29bb9c2c13935e4dbb5ecf0731ff Mon Sep 17 00:00:00 2001 From: James Booth Date: Mon, 28 Jan 2013 22:55:26 +0000 Subject: Moved functions to xmpp_presence --- src/command.c | 10 ++-- src/profanity.c | 8 +-- src/xmpp.h | 14 +++-- src/xmpp_conn.c | 170 +++++++++------------------------------------------- src/xmpp_iq.c | 2 +- src/xmpp_presence.c | 147 +++++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 193 insertions(+), 158 deletions(-) (limited to 'src') diff --git a/src/command.c b/src/command.c index c3701d3f..23a0fa45 100644 --- a/src/command.c +++ b/src/command.c @@ -1835,7 +1835,7 @@ _cmd_join(gchar **args, struct cmd_help_t help) Jid *room_jid = jid_create_from_bare_and_resource(room, nick); if (!muc_room_is_active(room_jid)) { - jabber_join(room_jid); + presence_join_room(room_jid); } win_join_chat(room_jid); @@ -1858,7 +1858,7 @@ _cmd_nick(gchar **args, struct cmd_help_t help) char *room = win_current_get_recipient(); char *nick = args[0]; - jabber_change_room_nick(room, nick); + presence_change_room_nick(room, nick); return TRUE; } @@ -1927,7 +1927,7 @@ _cmd_close(gchar **args, struct cmd_help_t help) if (conn_status == JABBER_CONNECTED) { if (win_current_is_groupchat()) { char *room_jid = win_current_get_recipient(); - jabber_leave_chat_room(room_jid); + presence_leave_chat_room(room_jid); } else if (win_current_is_chat() || win_current_is_private()) { if (prefs_get_states()) { @@ -2180,7 +2180,7 @@ _cmd_set_priority(gchar **args, struct cmd_help_t help) char *status = jabber_get_status(); prefs_set_priority((int)intval); // update presence with new priority - jabber_update_presence(jabber_get_presence(), status, 0); + presence_update(jabber_get_presence(), status, 0); cons_show("Priority set to %d.", intval); } @@ -2302,7 +2302,7 @@ _update_presence(const jabber_presence_t presence, if (conn_status != JABBER_CONNECTED) { cons_show("You are not currently connected."); } else { - jabber_update_presence(presence, msg, 0); + presence_update(presence, msg, 0); title_bar_set_status(presence); if (msg != NULL) { cons_show("Status set to %s, \"%s\"", show, msg); diff --git a/src/profanity.c b/src/profanity.c index e8ea1770..741f9b81 100644 --- a/src/profanity.c +++ b/src/profanity.c @@ -469,7 +469,7 @@ _handle_idle_time() // handle away mode if (strcmp(prefs_get_autoaway_mode(), "away") == 0) { - jabber_update_presence(PRESENCE_AWAY, prefs_get_autoaway_message(), 0); + presence_update(PRESENCE_AWAY, prefs_get_autoaway_message(), 0); if (prefs_get_autoaway_message() != NULL) { cons_show("Idle for %d minutes, status set to away, \"%s\".", prefs_get_autoaway_time(), prefs_get_autoaway_message()); @@ -484,7 +484,7 @@ _handle_idle_time() // handle idle mode } else if (strcmp(prefs_get_autoaway_mode(), "idle") == 0) { - jabber_update_presence(PRESENCE_ONLINE, + presence_update(PRESENCE_ONLINE, prefs_get_autoaway_message(), idle_ms / 1000); } } @@ -496,12 +496,12 @@ _handle_idle_time() // handle check if (prefs_get_autoaway_check()) { if (strcmp(prefs_get_autoaway_mode(), "away") == 0) { - jabber_update_presence(PRESENCE_ONLINE, NULL, 0); + presence_update(PRESENCE_ONLINE, NULL, 0); cons_show("No longer idle, status set to online."); title_bar_set_status(PRESENCE_ONLINE); win_current_page_off(); } else if (strcmp(prefs_get_autoaway_mode(), "idle") == 0) { - jabber_update_presence(PRESENCE_ONLINE, NULL, 0); + presence_update(PRESENCE_ONLINE, NULL, 0); title_bar_set_status(PRESENCE_ONLINE); } } diff --git a/src/xmpp.h b/src/xmpp.h index b8356729..7513608e 100644 --- a/src/xmpp.h +++ b/src/xmpp.h @@ -146,17 +146,12 @@ jabber_conn_status_t jabber_connect_with_account(ProfAccount *account, const char * const passwd); void jabber_disconnect(void); void jabber_process_events(void); -void jabber_join(Jid *jid); -void jabber_change_room_nick(const char * const room, const char * const nick); -void jabber_leave_chat_room(const char * const room_jid); void jabber_send(const char * const msg, const char * const recipient); void jabber_send_groupchat(const char * const msg, const char * const recipient); void jabber_send_inactive(const char * const recipient); void jabber_send_composing(const char * const recipient); void jabber_send_paused(const char * const recipient); void jabber_send_gone(const char * const recipient); -void jabber_update_presence(jabber_presence_t status, const char * const msg, - int idle); const char * jabber_get_jid(void); jabber_conn_status_t jabber_get_connection_status(void); int jabber_get_priority(void); @@ -168,6 +163,10 @@ void jabber_set_autoping(int seconds); xmpp_conn_t *jabber_get_conn(void); xmpp_ctx_t *jabber_get_ctx(void); int error_handler(xmpp_stanza_t * const stanza); +void jabber_conn_set_presence(jabber_presence_t presence); +void jabber_conn_set_priority(int priority); +void jabber_conn_set_status(const char * const message); +char* jabber_get_account_name(void); // iq functions void iq_add_handlers(xmpp_conn_t * const conn, xmpp_ctx_t * const ctx); @@ -179,6 +178,11 @@ GList* presence_get_subscription_requests(void); void presence_free_sub_requests(void); int presence_handler(xmpp_conn_t * const conn, xmpp_stanza_t * const stanza, void * const userdata); +void presence_join_room(Jid *jid); +void presence_change_room_nick(const char * const room, const char * const nick); +void presence_leave_chat_room(const char * const room_jid); +void presence_update(jabber_presence_t status, const char * const msg, + int idle); // caps functions void caps_init(void); diff --git a/src/xmpp_conn.c b/src/xmpp_conn.c index 52ded632..9bf94074 100644 --- a/src/xmpp_conn.c +++ b/src/xmpp_conn.c @@ -318,149 +318,6 @@ jabber_send_gone(const char * const recipient) chat_session_set_sent(recipient); } -void -jabber_join(Jid *jid) -{ - xmpp_stanza_t *presence = stanza_create_room_join_presence(jabber_conn.ctx, - jid->fulljid); - xmpp_send(jabber_conn.conn, presence); - xmpp_stanza_release(presence); - - muc_join_room(jid->barejid, jid->resourcepart); -} - -void -jabber_change_room_nick(const char * const room, const char * const nick) -{ - char *full_room_jid = create_fulljid(room, nick); - xmpp_stanza_t *presence = stanza_create_room_newnick_presence(jabber_conn.ctx, - full_room_jid); - xmpp_send(jabber_conn.conn, presence); - xmpp_stanza_release(presence); - - free(full_room_jid); -} - -void -jabber_leave_chat_room(const char * const room_jid) -{ - char *nick = muc_get_room_nick(room_jid); - - xmpp_stanza_t *presence = stanza_create_room_leave_presence(jabber_conn.ctx, - room_jid, nick); - xmpp_send(jabber_conn.conn, presence); - xmpp_stanza_release(presence); -} - -void -jabber_update_presence(jabber_presence_t status, const char * const msg, - int idle) -{ - int pri; - char *show, *last; - - // don't send presence when disconnected - if (jabber_conn.conn_status != JABBER_CONNECTED) - return; - - pri = prefs_get_priority(); - if (pri < JABBER_PRIORITY_MIN || pri > JABBER_PRIORITY_MAX) - pri = 0; - - jabber_conn.presence = status; - jabber_conn.priority = pri; - - switch(status) - { - case PRESENCE_AWAY: - show = STANZA_TEXT_AWAY; - last = STANZA_TEXT_AWAY; - break; - case PRESENCE_DND: - show = STANZA_TEXT_DND; - last = STANZA_TEXT_DND; - break; - case PRESENCE_CHAT: - show = STANZA_TEXT_CHAT; - last = STANZA_TEXT_CHAT; - break; - case PRESENCE_XA: - show = STANZA_TEXT_XA; - last = STANZA_TEXT_XA; - break; - default: // PRESENCE_ONLINE - show = NULL; - last = STANZA_TEXT_ONLINE; - break; - } - - if (jabber_conn.status != NULL) { - free(jabber_conn.status); - jabber_conn.status = NULL; - } - if (msg != NULL) - jabber_conn.status = strdup(msg); - - xmpp_stanza_t *presence = stanza_create_presence(jabber_conn.ctx, show, msg); - if (pri != 0) { - xmpp_stanza_t *priority, *value; - char pri_str[10]; - - snprintf(pri_str, sizeof(pri_str), "%d", pri); - priority = xmpp_stanza_new(jabber_conn.ctx); - value = xmpp_stanza_new(jabber_conn.ctx); - xmpp_stanza_set_name(priority, STANZA_NAME_PRIORITY); - xmpp_stanza_set_text(value, pri_str); - xmpp_stanza_add_child(priority, value); - xmpp_stanza_add_child(presence, priority); - } - - if (idle > 0) { - xmpp_stanza_t *query = xmpp_stanza_new(jabber_conn.ctx); - xmpp_stanza_set_name(query, STANZA_NAME_QUERY); - xmpp_stanza_set_ns(query, STANZA_NS_LASTACTIVITY); - char idle_str[10]; - snprintf(idle_str, sizeof(idle_str), "%d", idle); - xmpp_stanza_set_attribute(query, STANZA_ATTR_SECONDS, idle_str); - xmpp_stanza_add_child(presence, query); - } - - // add caps - xmpp_stanza_t *caps = xmpp_stanza_new(jabber_conn.ctx); - xmpp_stanza_set_name(caps, STANZA_NAME_C); - xmpp_stanza_set_ns(caps, STANZA_NS_CAPS); - xmpp_stanza_t *query = caps_create_query_response_stanza(jabber_conn.ctx); - - char *sha1 = caps_create_sha1_str(query); - xmpp_stanza_set_attribute(caps, STANZA_ATTR_HASH, "sha-1"); - xmpp_stanza_set_attribute(caps, STANZA_ATTR_NODE, "http://www.profanity.im"); - xmpp_stanza_set_attribute(caps, STANZA_ATTR_VER, sha1); - xmpp_stanza_add_child(presence, caps); - - xmpp_send(jabber_conn.conn, presence); - - // send presence for each room - GList *rooms = muc_get_active_room_list(); - while (rooms != NULL) { - char *room = rooms->data; - char *nick = muc_get_room_nick(room); - char *full_room_jid = create_fulljid(room, nick); - - xmpp_stanza_set_attribute(presence, STANZA_ATTR_TO, full_room_jid); - xmpp_send(jabber_conn.conn, presence); - - rooms = g_list_next(rooms); - } - g_list_free(rooms); - - xmpp_stanza_release(presence); - - FREE_SET_NULL(sha1); - - // set last presence for account - accounts_set_last_presence(saved_account.name, last); -} - void jabber_set_autoping(int seconds) { @@ -518,6 +375,33 @@ jabber_get_status(void) return jabber_conn.status; } +char * +jabber_get_account_name(void) +{ + return saved_account.name; +} + +void +jabber_conn_set_presence(jabber_presence_t presence) +{ + jabber_conn.presence = presence; +} + +void +jabber_conn_set_status(const char * const message) +{ + FREE_SET_NULL(jabber_conn.status); + if (message != NULL) { + jabber_conn.status = strdup(message); + } +} + +void +jabber_conn_set_priority(int priority) +{ + jabber_conn.priority = priority; +} + void jabber_free_resources(void) { diff --git a/src/xmpp_iq.c b/src/xmpp_iq.c index 0d6dbada..fbef60ca 100644 --- a/src/xmpp_iq.c +++ b/src/xmpp_iq.c @@ -141,7 +141,7 @@ _iq_handle_roster_result(xmpp_conn_t * const conn, xmpp_stanza_t * const stanza, * presence rather than PRESENCE_ONLINE. It will be helpful * when I set dnd status and reconnect for some reason */ // send initial presence - jabber_update_presence(PRESENCE_ONLINE, NULL, 0); + presence_update(PRESENCE_ONLINE, NULL, 0); } return 1; diff --git a/src/xmpp_presence.c b/src/xmpp_presence.c index aa5dcad3..897204f7 100644 --- a/src/xmpp_presence.c +++ b/src/xmpp_presence.c @@ -25,8 +25,10 @@ #include +#include "common.h" #include "log.h" #include "muc.h" +#include "preferences.h" #include "profanity.h" #include "xmpp.h" @@ -87,6 +89,151 @@ presence_free_sub_requests(void) g_hash_table_remove_all(sub_requests); } +void +presence_join_room(Jid *jid) +{ + xmpp_ctx_t *ctx = jabber_get_ctx(); + xmpp_conn_t *conn = jabber_get_conn(); + xmpp_stanza_t *presence = stanza_create_room_join_presence(ctx, jid->fulljid); + xmpp_send(conn, presence); + xmpp_stanza_release(presence); + + muc_join_room(jid->barejid, jid->resourcepart); +} + +void +presence_change_room_nick(const char * const room, const char * const nick) +{ + xmpp_ctx_t *ctx = jabber_get_ctx(); + xmpp_conn_t *conn = jabber_get_conn(); + char *full_room_jid = create_fulljid(room, nick); + xmpp_stanza_t *presence = stanza_create_room_newnick_presence(ctx, full_room_jid); + xmpp_send(conn, presence); + xmpp_stanza_release(presence); + + free(full_room_jid); +} + +void +presence_leave_chat_room(const char * const room_jid) +{ + xmpp_ctx_t *ctx = jabber_get_ctx(); + xmpp_conn_t *conn = jabber_get_conn(); + char *nick = muc_get_room_nick(room_jid); + + xmpp_stanza_t *presence = stanza_create_room_leave_presence(ctx, room_jid, + nick); + xmpp_send(conn, presence); + xmpp_stanza_release(presence); +} + +void +presence_update(jabber_presence_t status, const char * const msg, + int idle) +{ + xmpp_ctx_t *ctx = jabber_get_ctx(); + xmpp_conn_t *conn = jabber_get_conn(); + int pri; + char *show, *last; + + // don't send presence when disconnected + if (jabber_get_connection_status() != JABBER_CONNECTED) + return; + + pri = prefs_get_priority(); + if (pri < JABBER_PRIORITY_MIN || pri > JABBER_PRIORITY_MAX) + pri = 0; + + jabber_conn_set_presence(status); + jabber_conn_set_priority(pri); + + switch(status) + { + case PRESENCE_AWAY: + show = STANZA_TEXT_AWAY; + last = STANZA_TEXT_AWAY; + break; + case PRESENCE_DND: + show = STANZA_TEXT_DND; + last = STANZA_TEXT_DND; + break; + case PRESENCE_CHAT: + show = STANZA_TEXT_CHAT; + last = STANZA_TEXT_CHAT; + break; + case PRESENCE_XA: + show = STANZA_TEXT_XA; + last = STANZA_TEXT_XA; + break; + default: // PRESENCE_ONLINE + show = NULL; + last = STANZA_TEXT_ONLINE; + break; + } + + jabber_conn_set_status(msg); + + xmpp_stanza_t *presence = stanza_create_presence(ctx, show, msg); + if (pri != 0) { + xmpp_stanza_t *priority, *value; + char pri_str[10]; + + snprintf(pri_str, sizeof(pri_str), "%d", pri); + priority = xmpp_stanza_new(ctx); + value = xmpp_stanza_new(ctx); + xmpp_stanza_set_name(priority, STANZA_NAME_PRIORITY); + xmpp_stanza_set_text(value, pri_str); + xmpp_stanza_add_child(priority, value); + xmpp_stanza_add_child(presence, priority); + } + + if (idle > 0) { + xmpp_stanza_t *query = xmpp_stanza_new(ctx); + xmpp_stanza_set_name(query, STANZA_NAME_QUERY); + xmpp_stanza_set_ns(query, STANZA_NS_LASTACTIVITY); + char idle_str[10]; + snprintf(idle_str, sizeof(idle_str), "%d", idle); + xmpp_stanza_set_attribute(query, STANZA_ATTR_SECONDS, idle_str); + xmpp_stanza_add_child(presence, query); + } + + // add caps + xmpp_stanza_t *caps = xmpp_stanza_new(ctx); + xmpp_stanza_set_name(caps, STANZA_NAME_C); + xmpp_stanza_set_ns(caps, STANZA_NS_CAPS); + xmpp_stanza_t *query = caps_create_query_response_stanza(ctx); + + char *sha1 = caps_create_sha1_str(query); + xmpp_stanza_set_attribute(caps, STANZA_ATTR_HASH, "sha-1"); + xmpp_stanza_set_attribute(caps, STANZA_ATTR_NODE, "http://www.profanity.im"); + xmpp_stanza_set_attribute(caps, STANZA_ATTR_VER, sha1); + xmpp_stanza_add_child(presence, caps); + + xmpp_send(conn, presence); + + // send presence for each room + GList *rooms = muc_get_active_room_list(); + while (rooms != NULL) { + char *room = rooms->data; + char *nick = muc_get_room_nick(room); + char *full_room_jid = create_fulljid(room, nick); + + xmpp_stanza_set_attribute(presence, STANZA_ATTR_TO, full_room_jid); + xmpp_send(conn, presence); + + rooms = g_list_next(rooms); + } + g_list_free(rooms); + + xmpp_stanza_release(presence); + + FREE_SET_NULL(sha1); + + // set last presence for account + accounts_set_last_presence(jabber_get_account_name(), last); +} + + int presence_handler(xmpp_conn_t * const conn, xmpp_stanza_t * const stanza, void * const userdata) -- cgit 1.4.1-2-gfad0