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 @@ -3882,6 +3882,22 @@ cmd_history(gchar **args, struct cmd_help_t help) return result; } +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) { 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 @@ -1167,6 +1167,15 @@ cons_history_setting(void) cons_show("Chat history (/history) : OFF"); } +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) { 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 @@ -162,6 +162,16 @@ iq_enable_carbons() xmpp_stanza_release(iq); } +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) { 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 *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_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, carbon_enable); + 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 *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, 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);