about summary refs log tree commit diff stats
path: root/src/jabber.c
diff options
context:
space:
mode:
authorDmitry Podgorny <pasis.ua@gmail.com>2012-11-13 12:51:28 +0200
committerDmitry Podgorny <pasis.ua@gmail.com>2012-11-13 12:51:28 +0200
commita114fe88b80010dd3c4f29319bd67e7daa533cb1 (patch)
treea5b69aa358b4e43b6ae90ed44277a9ff5a0efdd0 /src/jabber.c
parentb14aab4adedfe0c2d252af692ffddffe03d54e65 (diff)
downloadprofani-tty-a114fe88b80010dd3c4f29319bd67e7daa533cb1.tar.gz
introduce priority support
add new command /priority <int>
improve jabber_update_presence()
use jabber_update_presence() for sending initial presence
save priority and status string to jabber_conn structure
Diffstat (limited to 'src/jabber.c')
-rw-r--r--src/jabber.c68
1 files changed, 59 insertions, 9 deletions
diff --git a/src/jabber.c b/src/jabber.c
index bb691a42..1af0bcdb 100644
--- a/src/jabber.c
+++ b/src/jabber.c
@@ -43,7 +43,9 @@ static struct _jabber_conn_t {
     xmpp_conn_t *conn;
     jabber_conn_status_t conn_status;
     jabber_presence_t presence;
+    char *status;
     int tls_disabled;
+    int priority;
 } jabber_conn;
 
 static log_level_t _get_log_level(xmpp_log_level_t xmpp_level);
@@ -78,6 +80,7 @@ jabber_init(const int disable_tls)
     log_info("Initialising XMPP");
     jabber_conn.conn_status = JABBER_STARTED;
     jabber_conn.presence = PRESENCE_OFFLINE;
+    jabber_conn.status = NULL;
     jabber_conn.tls_disabled = disable_tls;
 }
 
@@ -86,6 +89,9 @@ jabber_restart(void)
 {
     jabber_conn.conn_status = JABBER_STARTED;
     jabber_conn.presence = PRESENCE_OFFLINE;
+    if (jabber_conn.status != NULL)
+        free(jabber_conn.status);
+    jabber_conn.status = NULL;
 }
 
 jabber_conn_status_t
@@ -274,9 +280,15 @@ jabber_leave_chat_room(const char * const room_jid)
 void
 jabber_update_presence(jabber_presence_t status, const char * const msg)
 {
+    int pri = prefs_get_priority();
+    char *show;
+
+    if (pri < -128 || pri > 127)
+        pri = 0;
+
     jabber_conn.presence = status;
+    jabber_conn.priority = pri;
 
-    char *show = NULL;
     switch(status)
     {
         case PRESENCE_AWAY:
@@ -291,12 +303,29 @@ jabber_update_presence(jabber_presence_t status, const char * const msg)
         case PRESENCE_XA:
             show = STANZA_TEXT_XA;
             break;
-        default:
-            show = STANZA_TEXT_ONLINE;
+        default: // PRESENCE_ONLINE
+            show = NULL;
             break;
     }
 
+    if (jabber_conn.status != NULL)
+        free(jabber_conn.status);
+    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[5];
+
+        sprintf(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);
+    }
     xmpp_send(jabber_conn.conn, presence);
     xmpp_stanza_release(presence);
 }
@@ -313,6 +342,27 @@ jabber_get_jid(void)
     return xmpp_conn_get_jid(jabber_conn.conn);
 }
 
+int
+jabber_get_priority(void)
+{
+    return jabber_conn.priority;
+}
+
+jabber_presence_t
+jabber_get_presence(void)
+{
+    return jabber_conn.presence;
+}
+
+char *
+jabber_get_status(void)
+{
+    if (jabber_conn.status == NULL)
+        return NULL;
+    else
+        return strdup(jabber_conn.status);
+}
+
 void
 jabber_free_resources(void)
 {
@@ -571,7 +621,6 @@ static int
 _roster_handler(xmpp_conn_t * const conn,
     xmpp_stanza_t * const stanza, void * const userdata)
 {
-    xmpp_ctx_t *ctx = (xmpp_ctx_t *)userdata;
     xmpp_stanza_t *query, *item;
     char *type = xmpp_stanza_get_type(stanza);
 
@@ -593,11 +642,12 @@ _roster_handler(xmpp_conn_t * const conn,
 
             item = xmpp_stanza_get_next(item);
         }
-        xmpp_stanza_t* pres;
-        pres = xmpp_stanza_new(ctx);
-        xmpp_stanza_set_name(pres, STANZA_NAME_PRESENCE);
-        xmpp_send(conn, pres);
-        xmpp_stanza_release(pres);
+
+        /* TODO: Save somehow last presence show and use it for initial
+         *       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);
     }
 
     return 1;