about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--src/command/command.c10
-rw-r--r--src/command/commands.c16
-rw-r--r--src/command/commands.h1
-rw-r--r--src/config/preferences.c5
-rw-r--r--src/config/preferences.h1
-rw-r--r--src/ui/console.c9
-rw-r--r--src/ui/ui.h1
-rw-r--r--src/xmpp/connection.c6
-rw-r--r--src/xmpp/iq.c10
-rw-r--r--src/xmpp/stanza.c28
-rw-r--r--src/xmpp/stanza.h3
-rw-r--r--src/xmpp/xmpp.h1
12 files changed, 85 insertions, 6 deletions
diff --git a/src/command/command.c b/src/command/command.c
index 7be6603d..f44a21f5 100644
--- a/src/command/command.c
+++ b/src/command/command.c
@@ -858,6 +858,16 @@ static struct cmd_t command_defs[] =
           "shared  : Share logs between all instances, accepts 'on' or 'off', defaults to 'on'.",
           NULL } } },
 
+    { "/carbons",
+      cmd_carbons, parse_args, 1, 1, &cons_carbons_setting,
+      { "/carbons on|off", "Message carbons.",
+      { "/carbons on|off",
+        "---------------",
+        "Enable or disable message carbons.",
+        "",
+        "Example : /carbons on",
+        NULL  } } },
+
     { "/reconnect",
         cmd_reconnect, parse_args, 1, 1, &cons_reconnect_setting,
         { "/reconnect seconds", "Set reconnect interval.",
diff --git a/src/command/commands.c b/src/command/commands.c
index 2059c982..477471d5 100644
--- a/src/command/commands.c
+++ b/src/command/commands.c
@@ -3883,6 +3883,22 @@ cmd_history(gchar **args, struct cmd_help_t help)
 }
 
 gboolean
+cmd_carbons(gchar **args, struct cmd_help_t help)
+{
+    gboolean result = _cmd_set_boolean_preference(args[0], help,
+        "Carbons message", PREF_CARBONS);
+
+    // enable carbons
+    if (strcmp(args[0], "on") == 0) {
+        iq_enable_carbons();
+    }
+    else if (strcmp(args[0], "off") == 0){
+        iq_disable_carbons();
+    }
+    return result;
+}
+
+gboolean
 cmd_away(gchar **args, struct cmd_help_t help)
 {
     _update_presence(RESOURCE_AWAY, "away", args);
diff --git a/src/command/commands.h b/src/command/commands.h
index f4e040a9..1c16d635 100644
--- a/src/command/commands.h
+++ b/src/command/commands.h
@@ -85,6 +85,7 @@ gboolean cmd_grlog(gchar **args, struct cmd_help_t help);
 gboolean cmd_group(gchar **args, struct cmd_help_t help);
 gboolean cmd_help(gchar **args, struct cmd_help_t help);
 gboolean cmd_history(gchar **args, struct cmd_help_t help);
+gboolean cmd_carbons(gchar **args, struct cmd_help_t help);
 gboolean cmd_info(gchar **args, struct cmd_help_t help);
 gboolean cmd_intype(gchar **args, struct cmd_help_t help);
 gboolean cmd_invite(gchar **args, struct cmd_help_t help);
diff --git a/src/config/preferences.c b/src/config/preferences.c
index 67f12b18..47ef9391 100644
--- a/src/config/preferences.c
+++ b/src/config/preferences.c
@@ -558,6 +558,7 @@ _get_group(preference_t pref)
             return PREF_GROUP_PRESENCE;
         case PREF_CONNECT_ACCOUNT:
         case PREF_DEFAULT_ACCOUNT:
+        case PREF_CARBONS:
             return PREF_GROUP_CONNECTION;
         case PREF_OTR_WARN:
         case PREF_OTR_LOG:
@@ -593,6 +594,8 @@ _get_key(preference_t pref)
             return "intype";
         case PREF_HISTORY:
             return "history";
+        case PREF_CARBONS:
+            return "carbons";
         case PREF_MOUSE:
             return "mouse";
         case PREF_OCCUPANTS:
@@ -698,7 +701,7 @@ _get_default_boolean(preference_t pref)
         case PREF_OCCUPANTS:
         case PREF_MUC_PRIVILEGES:
         case PREF_PRESENCE:
-        case PREF_WRAP:
+        case PREF_WRAP:        
         case PREF_INPBLOCK_DYNAMIC:
             return TRUE;
         default:
diff --git a/src/config/preferences.h b/src/config/preferences.h
index 68286f09..aa23e48a 100644
--- a/src/config/preferences.h
+++ b/src/config/preferences.h
@@ -59,6 +59,7 @@ typedef enum {
     PREF_FLASH,
     PREF_INTYPE,
     PREF_HISTORY,
+    PREF_CARBONS,
     PREF_MOUSE,
     PREF_OCCUPANTS,
     PREF_OCCUPANTS_SIZE,
diff --git a/src/ui/console.c b/src/ui/console.c
index cdf5d1b8..82bac1e0 100644
--- a/src/ui/console.c
+++ b/src/ui/console.c
@@ -1168,6 +1168,15 @@ cons_history_setting(void)
 }
 
 void
+cons_carbons_setting(void)
+{
+    if (prefs_get_boolean(PREF_CARBONS))
+        cons_show("Message carbons (/carbons)    : ON");
+    else
+        cons_show("Message carbons (/carbons)    : OFF");
+}
+
+void
 cons_show_chat_prefs(void)
 {
     cons_show("Chat preferences:");
diff --git a/src/ui/ui.h b/src/ui/ui.h
index 99e73b4a..44ff42f4 100644
--- a/src/ui/ui.h
+++ b/src/ui/ui.h
@@ -308,6 +308,7 @@ void cons_outtype_setting(void);
 void cons_intype_setting(void);
 void cons_gone_setting(void);
 void cons_history_setting(void);
+void cons_carbons_setting(void);
 void cons_log_setting(void);
 void cons_chlog_setting(void);
 void cons_grlog_setting(void);
diff --git a/src/xmpp/connection.c b/src/xmpp/connection.c
index 8bb7c74c..34fba22d 100644
--- a/src/xmpp/connection.c
+++ b/src/xmpp/connection.c
@@ -463,10 +463,14 @@ _connection_handler(xmpp_conn_t * const conn,
         message_add_handlers();
         presence_add_handlers();
         iq_add_handlers();
-        iq_enable_carbons();
 
         roster_request();
         bookmark_request();
+
+        if (prefs_get_boolean(PREF_CARBONS)){
+            iq_enable_carbons();
+        }
+        
         jabber_conn.conn_status = JABBER_CONNECTED;
 
         if (prefs_get_reconnect() != 0) {
diff --git a/src/xmpp/iq.c b/src/xmpp/iq.c
index 071b07c5..be22b01f 100644
--- a/src/xmpp/iq.c
+++ b/src/xmpp/iq.c
@@ -163,6 +163,16 @@ iq_enable_carbons()
 }
 
 void
+iq_disable_carbons()
+{
+    xmpp_conn_t * const conn = connection_get_conn();
+    xmpp_ctx_t * const ctx = connection_get_ctx();
+    xmpp_stanza_t *iq = stanza_disable_carbons(ctx);
+    xmpp_send(conn, iq);
+    xmpp_stanza_release(iq);
+}
+
+void
 iq_disco_info_request(gchar *jid)
 {
     xmpp_conn_t * const conn = connection_get_conn();
diff --git a/src/xmpp/stanza.c b/src/xmpp/stanza.c
index 06177800..b0d7de86 100644
--- a/src/xmpp/stanza.c
+++ b/src/xmpp/stanza.c
@@ -206,12 +206,32 @@ stanza_enable_carbons(xmpp_ctx_t *ctx){
     xmpp_stanza_set_name(iq, STANZA_NAME_IQ);
     xmpp_stanza_set_type(iq, STANZA_TYPE_SET);   
     xmpp_stanza_set_id(iq, id);
+    free(id);
+
+    xmpp_stanza_t *carbons_enable = xmpp_stanza_new(ctx);
+    xmpp_stanza_set_name(carbons_enable, STANZA_NAME_ENABLE);
+    xmpp_stanza_set_ns(carbons_enable, STANZA_NS_CARBONS);
+
+    xmpp_stanza_add_child(iq, carbons_enable);
+
+    return iq;
+}
+
+xmpp_stanza_t *
+stanza_disable_carbons(xmpp_ctx_t *ctx){
+    xmpp_stanza_t *iq = xmpp_stanza_new(ctx);
+    char *id = create_unique_id(NULL);
+
+    xmpp_stanza_set_name(iq, STANZA_NAME_IQ);
+    xmpp_stanza_set_type(iq, STANZA_TYPE_SET);   
+    xmpp_stanza_set_id(iq, id);
+    free(id);
 
-    xmpp_stanza_t *carbon_enable = xmpp_stanza_new(ctx);
-    xmpp_stanza_set_name(carbon_enable, STANZA_NAME_ENABLE);
-    xmpp_stanza_set_ns(carbon_enable, STANZA_NS_CARBONS);
+    xmpp_stanza_t *carbons_disable = xmpp_stanza_new(ctx);
+    xmpp_stanza_set_name(carbons_disable, STANZA_NAME_DISABLE);
+    xmpp_stanza_set_ns(carbons_disable, STANZA_NS_CARBONS);
 
-    xmpp_stanza_add_child(iq, carbon_enable);
+    xmpp_stanza_add_child(iq, carbons_disable);
 
     return iq;
 }
diff --git a/src/xmpp/stanza.h b/src/xmpp/stanza.h
index 0c5a2b01..e4f3ce57 100644
--- a/src/xmpp/stanza.h
+++ b/src/xmpp/stanza.h
@@ -78,6 +78,7 @@
 #define STANZA_NAME_DESTROY "destroy"
 #define STANZA_NAME_ACTOR "actor"
 #define STANZA_NAME_ENABLE "enable"
+#define STANZA_NAME_DISABLE "disable"
 
 // error conditions
 #define STANZA_NAME_BAD_REQUEST "bad-request"
@@ -183,6 +184,8 @@ xmpp_stanza_t* stanza_create_bookmarks_storage_request(xmpp_ctx_t *ctx);
 
 xmpp_stanza_t * stanza_enable_carbons(xmpp_ctx_t *ctx);
 
+xmpp_stanza_t * stanza_disable_carbons(xmpp_ctx_t *ctx);
+
 xmpp_stanza_t* stanza_create_chat_state(xmpp_ctx_t *ctx,
     const char * const fulljid, const char * const state);
 
diff --git a/src/xmpp/xmpp.h b/src/xmpp/xmpp.h
index 41355e30..1fc32665 100644
--- a/src/xmpp/xmpp.h
+++ b/src/xmpp/xmpp.h
@@ -173,6 +173,7 @@ gboolean presence_sub_request_exists(const char * const bare_jid);
 
 // iq functions
 void iq_enable_carbons();
+void iq_disable_carbons();
 void iq_send_software_version(const char * const fulljid);
 void iq_room_list_request(gchar *conferencejid);
 void iq_disco_info_request(gchar *jid);