about summary refs log tree commit diff stats
path: root/src/xmpp/bookmark.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/xmpp/bookmark.c')
-rw-r--r--src/xmpp/bookmark.c167
1 files changed, 128 insertions, 39 deletions
diff --git a/src/xmpp/bookmark.c b/src/xmpp/bookmark.c
index c73f3db3..a252841d 100644
--- a/src/xmpp/bookmark.c
+++ b/src/xmpp/bookmark.c
@@ -35,6 +35,7 @@
 #include "xmpp/stanza.h"
 #include "xmpp/xmpp.h"
 #include "xmpp/bookmark.h"
+#include "ui/ui.h"
 
 #define BOOKMARK_TIMEOUT 5000
 /* TODO: replace with a preference */
@@ -83,69 +84,128 @@ bookmark_request(void)
 }
 
 static gboolean
-_bookmark_add(const char *jid, const char *nick, gboolean autojoin)
+_bookmark_add(const char *jid, const char *nick, const char *password, const char *autojoin_str)
 {
-    gboolean added = TRUE;
     if (autocomplete_contains(bookmark_ac, jid)) {
-        added = FALSE;
+        return FALSE;
+    } else {
+        Bookmark *item = malloc(sizeof(*item));
+        item->jid = strdup(jid);
+        if (nick != NULL) {
+            item->nick = strdup(nick);
+        } else {
+            item->nick = NULL;
+        }
+        if (password != NULL) {
+            item->password = strdup(password);
+        } else {
+            item->password = NULL;
+        }
+
+        if (g_strcmp0(autojoin_str, "on") == 0) {
+            item->autojoin = TRUE;
+        } else {
+            item->autojoin = FALSE;
+        }
+
+        bookmark_list = g_list_append(bookmark_list, item);
+        autocomplete_add(bookmark_ac, jid);
+        _send_bookmarks();
+
+        return TRUE;
     }
+}
 
-    /* this may be command for modifying */
+static gboolean
+_bookmark_update(const char *jid, const char *nick, const char *password, const char *autojoin_str)
+{
     Bookmark *item = malloc(sizeof(*item));
     item->jid = strdup(jid);
-    if (nick != NULL) {
-        item->nick = strdup(nick);
-    } else {
-        item->nick = NULL;
-    }
-    item->autojoin = autojoin;
+    item->nick = NULL;
+    item->password = NULL;
+    item->autojoin = FALSE;
 
     GList *found = g_list_find_custom(bookmark_list, item, _match_bookmark_by_jid);
-    if (found != NULL) {
-        bookmark_list = g_list_remove_link(bookmark_list, found);
-        _bookmark_item_destroy(found->data);
-        g_list_free(found);
+    _bookmark_item_destroy(item);
+    if (found == NULL) {
+        return FALSE;
+    } else {
+        Bookmark *bm = found->data;
+        if (nick != NULL) {
+            free(bm->nick);
+            bm->nick = strdup(nick);
+        }
+        if (password != NULL) {
+            free(bm->password);
+            bm->password = strdup(password);
+        }
+        if (autojoin_str != NULL) {
+            if (g_strcmp0(autojoin_str, "on") == 0) {
+                bm->autojoin = TRUE;
+            } else if (g_strcmp0(autojoin_str, "off") == 0) {
+                bm->autojoin = FALSE;
+            }
+        }
+        _send_bookmarks();
+        return TRUE;
     }
-    bookmark_list = g_list_append(bookmark_list, item);
-
-    autocomplete_remove(bookmark_ac, jid);
-    autocomplete_add(bookmark_ac, jid);
+}
 
-    _send_bookmarks();
+static gboolean
+_bookmark_join(const char *jid)
+{
+    Bookmark *item = malloc(sizeof(*item));
+    item->jid = strdup(jid);
+    item->nick = NULL;
+    item->password = NULL;
+    item->autojoin = FALSE;
 
-    return added;
+    GList *found = g_list_find_custom(bookmark_list, item, _match_bookmark_by_jid);
+    _bookmark_item_destroy(item);
+    if (found == NULL) {
+        return FALSE;
+    } else {
+        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)) {
+            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);
+            account_free(account);
+        } else if (muc_get_roster_received(item->jid)) {
+            ui_room_join(item->jid, TRUE);
+        }
+        return TRUE;
+    }
 }
 
 static gboolean
-_bookmark_remove(const char *jid, gboolean autojoin)
+_bookmark_remove(const char *jid)
 {
     Bookmark *item = malloc(sizeof(*item));
     item->jid = strdup(jid);
     item->nick = NULL;
-    item->autojoin = autojoin;
+    item->password = NULL;
+    item->autojoin = FALSE;
 
     GList *found = g_list_find_custom(bookmark_list, item, _match_bookmark_by_jid);
     _bookmark_item_destroy(item);
     gboolean removed = found != NULL;
 
     if (removed) {
-        // set autojoin FALSE
-        if (autojoin) {
-            Bookmark *bookmark = found->data;
-            bookmark->autojoin = FALSE;
-
-        // remove bookmark
-        } else {
-            bookmark_list = g_list_remove_link(bookmark_list, found);
-            _bookmark_item_destroy(found->data);
-            g_list_free(found);
-            autocomplete_remove(bookmark_ac, jid);
-        }
-
+        bookmark_list = g_list_remove_link(bookmark_list, found);
+        _bookmark_item_destroy(found->data);
+        g_list_free(found);
+        autocomplete_remove(bookmark_ac, jid);
         _send_bookmarks();
+        return TRUE;
+    } else {
+        return FALSE;
     }
-
-    return removed;
 }
 
 static const GList *
@@ -176,9 +236,11 @@ _bookmark_handle_result(xmpp_conn_t * const conn,
     char *id = (char *)userdata;
     xmpp_stanza_t *ptr;
     xmpp_stanza_t *nick;
+    xmpp_stanza_t *password_st;
     char *name;
     char *jid;
     char *autojoin;
+    char *password;
     gboolean autojoin_val;
     Jid *my_jid;
     Bookmark *item;
@@ -231,6 +293,17 @@ _bookmark_handle_result(xmpp_conn_t * const conn,
             }
         }
 
+        password = NULL;
+        password_st = xmpp_stanza_get_child_by_name(ptr, "password");
+        if (password_st) {
+            char *tmp;
+            tmp = xmpp_stanza_get_text(password_st);
+            if (tmp) {
+                password = strdup(tmp);
+                xmpp_free(ctx, tmp);
+            }
+        }
+
         autojoin = xmpp_stanza_get_attribute(ptr, "autojoin");
         if (autojoin && (strcmp(autojoin, "1") == 0 || strcmp(autojoin, "true") == 0)) {
             autojoin_val = TRUE;
@@ -242,6 +315,7 @@ _bookmark_handle_result(xmpp_conn_t * const conn,
         item = malloc(sizeof(*item));
         item->jid = strdup(jid);
         item->nick = name;
+        item->password = password;
         item->autojoin = autojoin_val;
         bookmark_list = g_list_append(bookmark_list, item);
 
@@ -259,8 +333,8 @@ _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)) {
-                    presence_join_room(jid, name, NULL);
-                    muc_join_room(jid, name, NULL, TRUE);
+                    presence_join_room(jid, name, password);
+                    muc_join_room(jid, name, password, TRUE);
                 }
                 jid_destroy(room_jid);
             } else {
@@ -303,6 +377,7 @@ _bookmark_item_destroy(gpointer item)
 
     free(p->jid);
     free(p->nick);
+    free(p->password);
     free(p);
 }
 
@@ -364,6 +439,18 @@ _send_bookmarks(void)
             xmpp_stanza_release(nick_st);
         }
 
+        if (bookmark->password != NULL) {
+            xmpp_stanza_t *password_st = xmpp_stanza_new(ctx);
+            xmpp_stanza_set_name(password_st, STANZA_NAME_PASSWORD);
+            xmpp_stanza_t *password_text = xmpp_stanza_new(ctx);
+            xmpp_stanza_set_text(password_text, bookmark->password);
+            xmpp_stanza_add_child(password_st, password_text);
+            xmpp_stanza_add_child(conference, password_st);
+
+            xmpp_stanza_release(password_text);
+            xmpp_stanza_release(password_st);
+        }
+
         xmpp_stanza_add_child(storage, conference);
         xmpp_stanza_release(conference);
 
@@ -383,7 +470,9 @@ void
 bookmark_init_module(void)
 {
     bookmark_add = _bookmark_add;
+    bookmark_update = _bookmark_update;
     bookmark_remove = _bookmark_remove;
+    bookmark_join = _bookmark_join;
     bookmark_get_list = _bookmark_get_list;
     bookmark_find = _bookmark_find;
     bookmark_autocomplete_reset = _bookmark_autocomplete_reset;