1
0
Fork 0

Merge pull request #991 from paulfariello/feature/xep-0050

Add support for xep 0050 ad-hoc commands, without multi-step
This commit is contained in:
Michael Vetter 2018-09-27 17:27:37 +02:00 committed by GitHub
commit 47f90d7a39
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
38 changed files with 695 additions and 190 deletions

View File

@ -29,7 +29,7 @@ core_sources = \
src/ui/chatwin.c \
src/ui/mucwin.c \
src/ui/privwin.c \
src/ui/mucconfwin.c \
src/ui/confwin.c \
src/ui/xmlwin.c \
src/command/cmd_defs.h src/command/cmd_defs.c \
src/command/cmd_funcs.h src/command/cmd_funcs.c \

View File

@ -664,7 +664,7 @@ cmd_ac_init(void)
autocomplete_add(time_ac, "console");
autocomplete_add(time_ac, "chat");
autocomplete_add(time_ac, "muc");
autocomplete_add(time_ac, "mucconfig");
autocomplete_add(time_ac, "config");
autocomplete_add(time_ac, "private");
autocomplete_add(time_ac, "xml");
autocomplete_add(time_ac, "statusbar");
@ -1107,8 +1107,8 @@ cmd_ac_reset(ProfWin *window)
muc_jid_autocomplete_reset(mucwin->roomjid);
}
if (window->type == WIN_MUC_CONFIG) {
ProfMucConfWin *confwin = (ProfMucConfWin*)window;
if (window->type == WIN_CONFIG) {
ProfConfWin *confwin = (ProfConfWin*)window;
assert(confwin->memcheck == PROFCONFWIN_MEMCHECK);
if (confwin->form) {
form_reset_autocompleters(confwin->form);
@ -2349,13 +2349,13 @@ _inpblock_autocomplete(ProfWin *window, const char *const input, gboolean previo
static char*
_form_autocomplete(ProfWin *window, const char *const input, gboolean previous)
{
if (window->type != WIN_MUC_CONFIG) {
if (window->type != WIN_CONFIG) {
return NULL;
}
char *found = NULL;
ProfMucConfWin *confwin = (ProfMucConfWin*)window;
ProfConfWin *confwin = (ProfConfWin*)window;
DataForm *form = confwin->form;
if (form) {
found = autocomplete_param_with_ac(input, "/form help", form->tag_ac, TRUE, previous);
@ -2375,13 +2375,13 @@ _form_autocomplete(ProfWin *window, const char *const input, gboolean previous)
static char*
_form_field_autocomplete(ProfWin *window, const char *const input, gboolean previous)
{
if (window->type != WIN_MUC_CONFIG) {
if (window->type != WIN_CONFIG) {
return NULL;
}
char *found = NULL;
ProfMucConfWin *confwin = (ProfMucConfWin*)window;
ProfConfWin *confwin = (ProfConfWin*)window;
DataForm *form = confwin->form;
if (form == NULL) {
return NULL;
@ -2510,7 +2510,7 @@ _time_autocomplete(ProfWin *window, const char *const input, gboolean previous)
return found;
}
found = autocomplete_param_with_ac(input, "/time mucconfig", time_format_ac, TRUE, previous);
found = autocomplete_param_with_ac(input, "/time config", time_format_ac, TRUE, previous);
if (found) {
return found;
}

View File

@ -1265,8 +1265,8 @@ static struct cmd_t command_defs[] =
CMD_TAGS(
CMD_TAG_UI)
CMD_SYN(
"/time console|chat|muc|mucconfig|private|xml set <format>",
"/time console|chat|muc|mucconfig|private|xml off",
"/time console|chat|muc|config|private|xml set <format>",
"/time console|chat|muc|config|private|xml off",
"/time statusbar set <format>",
"/time statusbar off",
"/time lastactivity set <format>")
@ -1283,8 +1283,8 @@ static struct cmd_t command_defs[] =
{ "chat off", "Do not show time in chat windows." },
{ "muc set <format>", "Set time format for chat room windows." },
{ "muc off", "Do not show time in chat room windows." },
{ "mucconfig set <format>", "Set time format for chat room config windows." },
{ "mucconfig off", "Do not show time in chat room config windows." },
{ "config set <format>", "Set time format for config windows." },
{ "config off", "Do not show time in config windows." },
{ "private set <format>", "Set time format for private chat windows." },
{ "private off", "Do not show time in private chat windows." },
{ "xml set <format>", "Set time format for XML console window." },
@ -2306,6 +2306,26 @@ static struct cmd_t command_defs[] =
CMD_EXAMPLES(
"/export /path/to/output.csv",
"/export ~/contacts.csv")
},
{ "/cmd",
parse_args, 1, 3, NULL,
CMD_SUBFUNCS(
{ "list", cmd_command_list },
{ "exec", cmd_command_exec })
CMD_NOMAINFUNC
CMD_NOTAGS
CMD_SYN(
"/cmd list [<jid>]",
"/cmd exec <command> [<jid>]")
CMD_DESC(
"Execute ad hoc commands.")
CMD_ARGS(
{ "list", "List supported ad hoc commands." },
{ "exec <command>", "Execute a command." })
CMD_EXAMPLES(
"/cmd list",
"/cmd exec ping")
}
};

View File

@ -70,6 +70,7 @@
#include "ui/ui.h"
#include "ui/window_list.h"
#include "xmpp/xmpp.h"
#include "xmpp/connection.h"
#include "xmpp/contact.h"
#include "xmpp/roster_list.h"
#include "xmpp/jid.h"
@ -204,7 +205,7 @@ cmd_tls_trust(ProfWin *window, const char *const command, gchar **args)
#ifdef HAVE_LIBMESODE
jabber_conn_status_t conn_status = connection_get_status();
if (conn_status != JABBER_CONNECTED) {
cons_show("You are not currently connected.");
cons_show("You are currently not connected.");
return TRUE;
}
if (!connection_is_secured()) {
@ -3632,11 +3633,11 @@ cmd_decline(ProfWin *window, const char *const command, gchar **args)
gboolean
cmd_form_field(ProfWin *window, char *tag, gchar **args)
{
if (window->type != WIN_MUC_CONFIG) {
if (window->type != WIN_CONFIG) {
return TRUE;
}
ProfMucConfWin *confwin = (ProfMucConfWin*)window;
ProfConfWin *confwin = (ProfConfWin*)window;
DataForm *form = confwin->form;
if (form) {
if (!form_tag_exists(form, tag)) {
@ -3657,14 +3658,14 @@ cmd_form_field(ProfWin *window, char *tag, gchar **args)
if (g_strcmp0(value, "on") == 0) {
form_set_value(form, tag, "1");
win_println(window, THEME_DEFAULT, '-', "Field updated...");
mucconfwin_show_form_field(confwin, form, tag);
confwin_show_form_field(confwin, form, tag);
} else if (g_strcmp0(value, "off") == 0) {
form_set_value(form, tag, "0");
win_println(window, THEME_DEFAULT, '-', "Field updated...");
mucconfwin_show_form_field(confwin, form, tag);
confwin_show_form_field(confwin, form, tag);
} else {
win_println(window, THEME_DEFAULT, '-', "Invalid command, usage:");
mucconfwin_field_help(confwin, tag);
confwin_field_help(confwin, tag);
win_println(window, THEME_DEFAULT, '-', "");
}
break;
@ -3675,24 +3676,24 @@ cmd_form_field(ProfWin *window, char *tag, gchar **args)
value = args[0];
if (value == NULL) {
win_println(window, THEME_DEFAULT, '-', "Invalid command, usage:");
mucconfwin_field_help(confwin, tag);
confwin_field_help(confwin, tag);
win_println(window, THEME_DEFAULT, '-', "");
} else {
form_set_value(form, tag, value);
win_println(window, THEME_DEFAULT, '-', "Field updated...");
mucconfwin_show_form_field(confwin, form, tag);
confwin_show_form_field(confwin, form, tag);
}
break;
case FIELD_LIST_SINGLE:
value = args[0];
if ((value == NULL) || !form_field_contains_option(form, tag, value)) {
win_println(window, THEME_DEFAULT, '-', "Invalid command, usage:");
mucconfwin_field_help(confwin, tag);
confwin_field_help(confwin, tag);
win_println(window, THEME_DEFAULT, '-', "");
} else {
form_set_value(form, tag, value);
win_println(window, THEME_DEFAULT, '-', "Field updated...");
mucconfwin_show_form_field(confwin, form, tag);
confwin_show_form_field(confwin, form, tag);
}
break;
@ -3703,32 +3704,32 @@ cmd_form_field(ProfWin *window, char *tag, gchar **args)
}
if ((g_strcmp0(cmd, "add") != 0) && (g_strcmp0(cmd, "remove"))) {
win_println(window, THEME_DEFAULT, '-', "Invalid command, usage:");
mucconfwin_field_help(confwin, tag);
confwin_field_help(confwin, tag);
win_println(window, THEME_DEFAULT, '-', "");
break;
}
if (value == NULL) {
win_println(window, THEME_DEFAULT, '-', "Invalid command, usage:");
mucconfwin_field_help(confwin, tag);
confwin_field_help(confwin, tag);
win_println(window, THEME_DEFAULT, '-', "");
break;
}
if (g_strcmp0(cmd, "add") == 0) {
form_add_value(form, tag, value);
win_println(window, THEME_DEFAULT, '-', "Field updated...");
mucconfwin_show_form_field(confwin, form, tag);
confwin_show_form_field(confwin, form, tag);
break;
}
if (g_strcmp0(args[0], "remove") == 0) {
if (!g_str_has_prefix(value, "val")) {
win_println(window, THEME_DEFAULT, '-', "Invalid command, usage:");
mucconfwin_field_help(confwin, tag);
confwin_field_help(confwin, tag);
win_println(window, THEME_DEFAULT, '-', "");
break;
}
if (strlen(value) < 4) {
win_println(window, THEME_DEFAULT, '-', "Invalid command, usage:");
mucconfwin_field_help(confwin, tag);
confwin_field_help(confwin, tag);
win_println(window, THEME_DEFAULT, '-', "");
break;
}
@ -3736,7 +3737,7 @@ cmd_form_field(ProfWin *window, char *tag, gchar **args)
int index = strtol(&value[3], NULL, 10);
if ((index < 1) || (index > form_get_value_count(form, tag))) {
win_println(window, THEME_DEFAULT, '-', "Invalid command, usage:");
mucconfwin_field_help(confwin, tag);
confwin_field_help(confwin, tag);
win_println(window, THEME_DEFAULT, '-', "");
break;
}
@ -3744,7 +3745,7 @@ cmd_form_field(ProfWin *window, char *tag, gchar **args)
removed = form_remove_text_multi_value(form, tag, index);
if (removed) {
win_println(window, THEME_DEFAULT, '-', "Field updated...");
mucconfwin_show_form_field(confwin, form, tag);
confwin_show_form_field(confwin, form, tag);
} else {
win_println(window, THEME_DEFAULT, '-', "Could not remove %s from %s", value, tag);
}
@ -3757,13 +3758,13 @@ cmd_form_field(ProfWin *window, char *tag, gchar **args)
}
if ((g_strcmp0(cmd, "add") != 0) && (g_strcmp0(cmd, "remove"))) {
win_println(window, THEME_DEFAULT, '-', "Invalid command, usage:");
mucconfwin_field_help(confwin, tag);
confwin_field_help(confwin, tag);
win_println(window, THEME_DEFAULT, '-', "");
break;
}
if (value == NULL) {
win_println(window, THEME_DEFAULT, '-', "Invalid command, usage:");
mucconfwin_field_help(confwin, tag);
confwin_field_help(confwin, tag);
win_println(window, THEME_DEFAULT, '-', "");
break;
}
@ -3773,13 +3774,13 @@ cmd_form_field(ProfWin *window, char *tag, gchar **args)
added = form_add_unique_value(form, tag, value);
if (added) {
win_println(window, THEME_DEFAULT, '-', "Field updated...");
mucconfwin_show_form_field(confwin, form, tag);
confwin_show_form_field(confwin, form, tag);
} else {
win_println(window, THEME_DEFAULT, '-', "Value %s already selected for %s", value, tag);
}
} else {
win_println(window, THEME_DEFAULT, '-', "Invalid command, usage:");
mucconfwin_field_help(confwin, tag);
confwin_field_help(confwin, tag);
win_println(window, THEME_DEFAULT, '-', "");
}
break;
@ -3790,13 +3791,13 @@ cmd_form_field(ProfWin *window, char *tag, gchar **args)
removed = form_remove_value(form, tag, value);
if (removed) {
win_println(window, THEME_DEFAULT, '-', "Field updated...");
mucconfwin_show_form_field(confwin, form, tag);
confwin_show_form_field(confwin, form, tag);
} else {
win_println(window, THEME_DEFAULT, '-', "Value %s is not currently set for %s", value, tag);
}
} else {
win_println(window, THEME_DEFAULT, '-', "Invalid command, usage:");
mucconfwin_field_help(confwin, tag);
confwin_field_help(confwin, tag);
win_println(window, THEME_DEFAULT, '-', "");
}
}
@ -3808,13 +3809,13 @@ cmd_form_field(ProfWin *window, char *tag, gchar **args)
}
if ((g_strcmp0(cmd, "add") != 0) && (g_strcmp0(cmd, "remove"))) {
win_println(window, THEME_DEFAULT, '-', "Invalid command, usage:");
mucconfwin_field_help(confwin, tag);
confwin_field_help(confwin, tag);
win_println(window, THEME_DEFAULT, '-', "");
break;
}
if (value == NULL) {
win_println(window, THEME_DEFAULT, '-', "Invalid command, usage:");
mucconfwin_field_help(confwin, tag);
confwin_field_help(confwin, tag);
win_println(window, THEME_DEFAULT, '-', "");
break;
}
@ -3822,7 +3823,7 @@ cmd_form_field(ProfWin *window, char *tag, gchar **args)
added = form_add_unique_value(form, tag, value);
if (added) {
win_println(window, THEME_DEFAULT, '-', "Field updated...");
mucconfwin_show_form_field(confwin, form, tag);
confwin_show_form_field(confwin, form, tag);
} else {
win_println(window, THEME_DEFAULT, '-', "JID %s already exists in %s", value, tag);
}
@ -3832,7 +3833,7 @@ cmd_form_field(ProfWin *window, char *tag, gchar **args)
removed = form_remove_value(form, tag, value);
if (removed) {
win_println(window, THEME_DEFAULT, '-', "Field updated...");
mucconfwin_show_form_field(confwin, form, tag);
confwin_show_form_field(confwin, form, tag);
} else {
win_println(window, THEME_DEFAULT, '-', "Field %s does not contain %s", tag, value);
}
@ -3857,7 +3858,7 @@ cmd_form(ProfWin *window, const char *const command, gchar **args)
return TRUE;
}
if (window->type != WIN_MUC_CONFIG) {
if (window->type != WIN_CONFIG) {
cons_show("Command '/form' does not apply to this window.");
return TRUE;
}
@ -3870,20 +3871,20 @@ cmd_form(ProfWin *window, const char *const command, gchar **args)
return TRUE;
}
ProfMucConfWin *confwin = (ProfMucConfWin*)window;
ProfConfWin *confwin = (ProfConfWin*)window;
assert(confwin->memcheck == PROFCONFWIN_MEMCHECK);
if (g_strcmp0(args[0], "show") == 0) {
mucconfwin_show_form(confwin);
confwin_show_form(confwin);
return TRUE;
}
if (g_strcmp0(args[0], "help") == 0) {
char *tag = args[1];
if (tag) {
mucconfwin_field_help(confwin, tag);
confwin_field_help(confwin, tag);
} else {
mucconfwin_form_help(confwin);
confwin_form_help(confwin);
gchar **help_text = NULL;
Command *command = cmd_get("/form");
@ -3898,12 +3899,12 @@ cmd_form(ProfWin *window, const char *const command, gchar **args)
return TRUE;
}
if (g_strcmp0(args[0], "submit") == 0) {
iq_submit_room_config(confwin->roomjid, confwin->form);
if (g_strcmp0(args[0], "submit") == 0 && confwin->submit != NULL) {
confwin->submit(confwin);
}
if (g_strcmp0(args[0], "cancel") == 0) {
iq_room_config_cancel(confwin->roomjid);
if (g_strcmp0(args[0], "cancel") == 0 && confwin->cancel != NULL) {
confwin->cancel(confwin);
}
if ((g_strcmp0(args[0], "submit") == 0) || (g_strcmp0(args[0], "cancel") == 0)) {
@ -4264,7 +4265,7 @@ cmd_room(ProfWin *window, const char *const command, gchar **args)
}
if (g_strcmp0(args[0], "config") == 0) {
ProfMucConfWin *confwin = wins_get_muc_conf(mucwin->roomjid);
ProfConfWin *confwin = wins_get_conf(mucwin->roomjid);
if (confwin) {
ui_focus_win((ProfWin*)confwin);
@ -5159,20 +5160,20 @@ cmd_time(ProfWin *window, const char *const command, gchar **args)
cons_bad_cmd_usage(command);
return TRUE;
}
} else if (g_strcmp0(args[0], "mucconfig") == 0) {
} else if (g_strcmp0(args[0], "config") == 0) {
if (args[1] == NULL) {
char *format = prefs_get_string(PREF_TIME_MUCCONFIG);
cons_show("MUC config time format: '%s'.", format);
char *format = prefs_get_string(PREF_TIME_CONFIG);
cons_show("config time format: '%s'.", format);
prefs_free_string(format);
return TRUE;
} else if (g_strcmp0(args[1], "set") == 0 && args[2] != NULL) {
prefs_set_string(PREF_TIME_MUCCONFIG, args[2]);
cons_show("MUC config time format set to '%s'.", args[2]);
prefs_set_string(PREF_TIME_CONFIG, args[2]);
cons_show("config time format set to '%s'.", args[2]);
wins_resize_all();
return TRUE;
} else if (g_strcmp0(args[1], "off") == 0) {
prefs_set_string(PREF_TIME_MUCCONFIG, "off");
cons_show("MUC config time display disabled.");
prefs_set_string(PREF_TIME_CONFIG, "off");
cons_show("config time display disabled.");
wins_resize_all();
return TRUE;
} else {
@ -7552,10 +7553,122 @@ cmd_encwarn(ProfWin *window, const char *const command, gchar **args)
return TRUE;
}
gboolean
cmd_command_list(ProfWin *window, const char *const command, gchar **args)
{
jabber_conn_status_t conn_status = connection_get_status();
if (conn_status != JABBER_CONNECTED) {
cons_show("You are not currently connected.");
return TRUE;
}
if (connection_supports(XMPP_FEATURE_COMMANDS) == FALSE) {
cons_show("Server does not support ad hoc commands.");
return TRUE;
}
char *jid = args[1];
if (jid == NULL) {
switch (window->type) {
case WIN_MUC:
{
ProfMucWin *mucwin = (ProfMucWin*)window;
assert(mucwin->memcheck == PROFMUCWIN_MEMCHECK);
jid = mucwin->roomjid;
break;
}
case WIN_CHAT:
{
ProfChatWin *chatwin = (ProfChatWin*)window;
assert(chatwin->memcheck == PROFCHATWIN_MEMCHECK);
jid = chatwin->barejid;
break;
}
case WIN_PRIVATE:
{
ProfPrivateWin *privatewin = (ProfPrivateWin*)window;
assert(privatewin->memcheck == PROFPRIVATEWIN_MEMCHECK);
jid = privatewin->fulljid;
break;
}
case WIN_CONSOLE:
{
jid = connection_get_domain();
break;
}
default:
cons_show("Cannot send ad hoc commands.");
return TRUE;
}
}
iq_command_list(jid);
cons_show("List available ad hoc commands");
return TRUE;
}
gboolean
cmd_command_exec(ProfWin *window, const char *const command, gchar **args)
{
jabber_conn_status_t conn_status = connection_get_status();
if (conn_status != JABBER_CONNECTED) {
cons_show("You are not currently connected.");
return TRUE;
}
if (connection_supports(XMPP_FEATURE_COMMANDS) == FALSE) {
cons_show("Server does not support ad hoc commands.");
return TRUE;
}
char *jid = args[2];
if (jid == NULL) {
switch (window->type) {
case WIN_MUC:
{
ProfMucWin *mucwin = (ProfMucWin*)window;
assert(mucwin->memcheck == PROFMUCWIN_MEMCHECK);
jid = mucwin->roomjid;
break;
}
case WIN_CHAT:
{
ProfChatWin *chatwin = (ProfChatWin*)window;
assert(chatwin->memcheck == PROFCHATWIN_MEMCHECK);
jid = chatwin->barejid;
break;
}
case WIN_PRIVATE:
{
ProfPrivateWin *privatewin = (ProfPrivateWin*)window;
assert(privatewin->memcheck == PROFPRIVATEWIN_MEMCHECK);
jid = privatewin->fulljid;
break;
}
case WIN_CONSOLE:
{
jid = connection_get_domain();
break;
}
default:
cons_show("Cannot send ad hoc commands.");
return TRUE;
}
}
iq_command_exec(jid, args[1]);
cons_show("Execute %s...", args[1]);
return TRUE;
}
static gboolean
_cmd_execute(ProfWin *window, const char *const command, const char *const inp)
{
if (g_str_has_prefix(command, "/field") && window->type == WIN_MUC_CONFIG) {
if (g_str_has_prefix(command, "/field") && window->type == WIN_CONFIG) {
gboolean result = FALSE;
gchar **args = parse_args_with_freetext(inp, 1, 2, &result);
if (!result) {

View File

@ -158,6 +158,8 @@ gboolean cmd_script(ProfWin *window, const char *const command, gchar **args);
gboolean cmd_export(ProfWin *window, const char *const command, gchar **args);
gboolean cmd_charset(ProfWin *window, const char *const command, gchar **args);
gboolean cmd_console(ProfWin *window, const char *const command, gchar **args);
gboolean cmd_command_list(ProfWin *window, const char *const command, gchar **args);
gboolean cmd_command_exec(ProfWin *window, const char *const command, gchar **args);
gboolean cmd_plugins(ProfWin *window, const char *const command, gchar **args);
gboolean cmd_plugins_sourcepath(ProfWin *window, const char *const command, gchar **args);

View File

@ -123,7 +123,7 @@ prefs_load(void)
g_key_file_set_string(prefs, PREF_GROUP_UI, "time.console", val);
g_key_file_set_string(prefs, PREF_GROUP_UI, "time.chat", val);
g_key_file_set_string(prefs, PREF_GROUP_UI, "time.muc", val);
g_key_file_set_string(prefs, PREF_GROUP_UI, "time.mucconfig", val);
g_key_file_set_string(prefs, PREF_GROUP_UI, "time.config", val);
g_key_file_set_string(prefs, PREF_GROUP_UI, "time.private", val);
g_key_file_set_string(prefs, PREF_GROUP_UI, "time.xmlconsole", val);
g_key_file_remove_key(prefs, PREF_GROUP_UI, "time", NULL);
@ -1567,7 +1567,7 @@ _get_group(preference_t pref)
case PREF_TIME_CONSOLE:
case PREF_TIME_CHAT:
case PREF_TIME_MUC:
case PREF_TIME_MUCCONFIG:
case PREF_TIME_CONFIG:
case PREF_TIME_PRIVATE:
case PREF_TIME_XMLCONSOLE:
case PREF_TIME_STATUSBAR:
@ -1777,8 +1777,8 @@ _get_key(preference_t pref)
return "time.chat";
case PREF_TIME_MUC:
return "time.muc";
case PREF_TIME_MUCCONFIG:
return "time.mucconfig";
case PREF_TIME_CONFIG:
return "time.config";
case PREF_TIME_PRIVATE:
return "time.private";
case PREF_TIME_XMLCONSOLE:
@ -1967,7 +1967,7 @@ _get_default_string(preference_t pref)
return "%H:%M:%S";
case PREF_TIME_MUC:
return "%H:%M:%S";
case PREF_TIME_MUCCONFIG:
case PREF_TIME_CONFIG:
return "%H:%M:%S";
case PREF_TIME_PRIVATE:
return "%H:%M:%S";

View File

@ -92,7 +92,7 @@ typedef enum {
PREF_TIME_CONSOLE,
PREF_TIME_CHAT,
PREF_TIME_MUC,
PREF_TIME_MUCCONFIG,
PREF_TIME_CONFIG,
PREF_TIME_PRIVATE,
PREF_TIME_XMLCONSOLE,
PREF_TIME_STATUSBAR,

View File

@ -413,7 +413,7 @@ _load_preferences(void)
_set_string_preference("time.console", PREF_TIME_CONSOLE);
_set_string_preference("time.chat", PREF_TIME_CHAT);
_set_string_preference("time.muc", PREF_TIME_MUC);
_set_string_preference("time.mucconfig", PREF_TIME_MUCCONFIG);
_set_string_preference("time.config", PREF_TIME_CONFIG);
_set_string_preference("time.private", PREF_TIME_PRIVATE);
_set_string_preference("time.xmlconsole", PREF_TIME_XMLCONSOLE);
_set_string_preference("time.statusbar", PREF_TIME_STATUSBAR);

View File

@ -1,5 +1,5 @@
/*
* mucconfwin.c
* confwin.c
*
* Copyright (C) 2012 - 2018 James Booth <boothj5@gmail.com>
*
@ -40,10 +40,10 @@
#include "ui/win_types.h"
#include "ui/window_list.h"
static void _mucconfwin_form_field(ProfWin *window, char *tag, FormField *field);
static void _confwin_form_field(ProfWin *window, char *tag, FormField *field);
void
mucconfwin_show_form(ProfMucConfWin *confwin)
confwin_show_form(ProfConfWin *confwin)
{
ProfWin *window = (ProfWin*) confwin;
if (confwin->form->title) {
@ -54,7 +54,7 @@ mucconfwin_show_form(ProfMucConfWin *confwin)
}
win_println(window, THEME_DEFAULT, '-', "");
mucconfwin_form_help(confwin);
confwin_form_help(confwin);
GSList *fields = confwin->form->fields;
GSList *curr_field = fields;
@ -68,7 +68,7 @@ mucconfwin_show_form(ProfMucConfWin *confwin)
}
} else if (g_strcmp0(field->type, "hidden") != 0 && field->var) {
char *tag = g_hash_table_lookup(confwin->form->var_to_tag, field->var);
_mucconfwin_form_field(window, tag, field);
_confwin_form_field(window, tag, field);
}
curr_field = g_slist_next(curr_field);
@ -76,35 +76,37 @@ mucconfwin_show_form(ProfMucConfWin *confwin)
}
void
mucconfwin_show_form_field(ProfMucConfWin *confwin, DataForm *form, char *tag)
confwin_show_form_field(ProfConfWin *confwin, DataForm *form, char *tag)
{
assert(confwin != NULL);
FormField *field = form_get_field_by_tag(form, tag);
ProfWin *window = (ProfWin*)confwin;
_mucconfwin_form_field(window, tag, field);
_confwin_form_field(window, tag, field);
win_println(window, THEME_DEFAULT, '-', "");
}
void
mucconfwin_handle_configuration(ProfMucConfWin *confwin, DataForm *form)
confwin_handle_configuration(ProfConfWin *confwin, DataForm *form)
{
assert(confwin != NULL);
ProfWin *window = (ProfWin*)confwin;
ui_focus_win(window);
mucconfwin_show_form(confwin);
confwin_show_form(confwin);
win_println(window, THEME_DEFAULT, '-', "");
win_println(window, THEME_DEFAULT, '-', "Use '/form submit' to save changes.");
if (confwin->submit != NULL) {
win_println(window, THEME_DEFAULT, '-', "Use '/form submit' to save changes.");
}
win_println(window, THEME_DEFAULT, '-', "Use '/form cancel' to cancel changes.");
win_println(window, THEME_DEFAULT, '-', "See '/form help' for more information.");
win_println(window, THEME_DEFAULT, '-', "");
}
void
mucconfwin_field_help(ProfMucConfWin *confwin, char *tag)
confwin_field_help(ProfConfWin *confwin, char *tag)
{
assert(confwin != NULL);
@ -187,7 +189,7 @@ mucconfwin_field_help(ProfMucConfWin *confwin, char *tag)
}
void
mucconfwin_form_help(ProfMucConfWin *confwin)
confwin_form_help(ProfConfWin *confwin)
{
assert(confwin != NULL);
@ -200,7 +202,7 @@ mucconfwin_form_help(ProfMucConfWin *confwin)
}
static void
_mucconfwin_form_field(ProfWin *window, char *tag, FormField *field)
_confwin_form_field(ProfWin *window, char *tag, FormField *field)
{
win_print(window, THEME_AWAY, '-', "[%s] ", tag);
win_append(window, THEME_DEFAULT, "%s", field->label);
@ -258,7 +260,7 @@ _mucconfwin_form_field(ProfWin *window, char *tag, FormField *field)
if (value == NULL) {
win_appendln(window, THEME_OFFLINE, "FALSE");
} else {
if (g_strcmp0(value, "0") == 0) {
if (g_strcmp0(value, "0") == 0 || g_strcmp0(value, "false") == 0) {
win_appendln(window, THEME_OFFLINE, "FALSE");
} else {
win_appendln(window, THEME_ONLINE, "TRUE");
@ -331,7 +333,7 @@ _mucconfwin_form_field(ProfWin *window, char *tag, FormField *field)
}
char*
mucconfwin_get_string(ProfMucConfWin *confwin)
confwin_get_string(ProfConfWin *confwin)
{
assert(confwin != NULL);

View File

@ -1282,12 +1282,12 @@ cons_time_setting(void)
cons_show("Time MUC (/time) : %s", pref_time_muc);
prefs_free_string(pref_time_muc);
char *pref_time_mucconf = prefs_get_string(PREF_TIME_MUCCONFIG);
if (g_strcmp0(pref_time_mucconf, "off") == 0)
cons_show("Time MUC config (/time) : OFF");
char *pref_time_conf = prefs_get_string(PREF_TIME_CONFIG);
if (g_strcmp0(pref_time_conf, "off") == 0)
cons_show("Time config (/time) : OFF");
else
cons_show("Time MUC config (/time) : %s", pref_time_mucconf);
prefs_free_string(pref_time_mucconf);
cons_show("Time config (/time) : %s", pref_time_conf);
prefs_free_string(pref_time_conf);
char *pref_time_private = prefs_get_string(PREF_TIME_PRIVATE);
if (g_strcmp0(pref_time_private, "off") == 0)

View File

@ -632,8 +632,8 @@ ui_win_has_unsaved_form(int num)
{
ProfWin *window = wins_get_by_num(num);
if (window->type == WIN_MUC_CONFIG) {
ProfMucConfWin *confwin = (ProfMucConfWin*)window;
if (window->type == WIN_CONFIG) {
ProfConfWin *confwin = (ProfConfWin*)window;
assert(confwin->memcheck == PROFCONFWIN_MEMCHECK);
return confwin->form->modified;
} else {
@ -651,13 +651,13 @@ ui_focus_win(ProfWin *window)
}
ProfWin *old_current = wins_get_current();
if (old_current->type == WIN_MUC_CONFIG) {
ProfMucConfWin *confwin = (ProfMucConfWin*)old_current;
if (old_current->type == WIN_CONFIG) {
ProfConfWin *confwin = (ProfConfWin*)old_current;
cmd_ac_remove_form_fields(confwin->form);
}
if (window->type == WIN_MUC_CONFIG) {
ProfMucConfWin *confwin = (ProfMucConfWin*)window;
if (window->type == WIN_CONFIG) {
ProfConfWin *confwin = (ProfConfWin*)window;
cmd_ac_add_form_fields(confwin->form);
}
@ -681,8 +681,8 @@ void
ui_close_win(int index)
{
ProfWin *window = wins_get_by_num(index);
if (window && window->type == WIN_MUC_CONFIG) {
ProfMucConfWin *confwin = (ProfMucConfWin*)window;
if (window && window->type == WIN_CONFIG) {
ProfConfWin *confwin = (ProfConfWin*)window;
if (confwin->form) {
cmd_ac_remove_form_fields(confwin->form);
}
@ -1135,7 +1135,7 @@ ui_handle_room_config_submit_result(const char *const roomjid)
GString *form_recipient = g_string_new(roomjid);
g_string_append(form_recipient, " config");
form_window = (ProfWin*) wins_get_muc_conf(form_recipient->str);
form_window = (ProfWin*) wins_get_conf(form_recipient->str);
g_string_free(form_recipient, TRUE);
if (form_window) {
@ -1167,7 +1167,7 @@ ui_handle_room_config_submit_result_error(const char *const roomjid, const char
GString *form_recipient = g_string_new(roomjid);
g_string_append(form_recipient, " config");
form_window = (ProfWin*) wins_get_muc_conf(form_recipient->str);
form_window = (ProfWin*) wins_get_conf(form_recipient->str);
g_string_free(form_recipient, TRUE);
if (form_window) {

View File

@ -544,7 +544,7 @@ _display_name(StatusBarTab *tab)
} else {
fullname = strdup(tab->identifier);
}
} else if (tab->window_type == WIN_MUC_CONFIG) {
} else if (tab->window_type == WIN_CONFIG) {
char *pref = prefs_get_string(PREF_STATUSBAR_ROOM);
GString *display_str = g_string_new("");
if (g_strcmp0("room", pref) == 0) {

View File

@ -217,13 +217,13 @@ void privwin_room_kicked(ProfPrivateWin *privwin, const char *const actor, const
void privwin_room_banned(ProfPrivateWin *privwin, const char *const actor, const char *const reason);
void privwin_room_joined(ProfPrivateWin *privwin);
// MUC room config window
void mucconfwin_handle_configuration(ProfMucConfWin *confwin, DataForm *form);
void mucconfwin_show_form(ProfMucConfWin *confwin);
void mucconfwin_show_form_field(ProfMucConfWin *confwin, DataForm *form, char *tag);
void mucconfwin_form_help(ProfMucConfWin *confwin);
void mucconfwin_field_help(ProfMucConfWin *confwin, char *tag);
char* mucconfwin_get_string(ProfMucConfWin *confwin);
// config window
void confwin_handle_configuration(ProfConfWin *confwin, DataForm *form);
void confwin_show_form(ProfConfWin *confwin);
void confwin_show_form_field(ProfConfWin *confwin, DataForm *form, char *tag);
void confwin_form_help(ProfConfWin *confwin);
void confwin_field_help(ProfConfWin *confwin, char *tag);
char* confwin_get_string(ProfConfWin *confwin);
// xml console
void xmlwin_show(ProfXMLWin *xmlwin, const char *const msg);
@ -346,7 +346,7 @@ ProfWin* win_create_console(void);
ProfWin* win_create_xmlconsole(void);
ProfWin* win_create_chat(const char *const barejid);
ProfWin* win_create_muc(const char *const roomjid);
ProfWin* win_create_muc_config(const char *const title, DataForm *form);
ProfWin* win_create_config(const char *const title, DataForm *form, ProfConfWinCallback submit, ProfConfWinCallback cancel, const void *userdata);
ProfWin* win_create_private(const char *const fulljid);
ProfWin* win_create_plugin(const char *const plugin_name, const char *const tag);
void win_update_virtual(ProfWin *window);
@ -377,6 +377,11 @@ void win_show_info(ProfWin *window, PContact contact);
void win_clear(ProfWin *window);
char* win_get_tab_identifier(ProfWin *window);
char* win_to_string(ProfWin *window);
void win_command_list_error(ProfWin *window, const char *const error);
void win_command_exec_error(ProfWin *window, const char *const command, const char *const error, ...);
void win_handle_command_list(ProfWin *window, GSList *cmds);
void win_handle_command_exec_status(ProfWin *window, const char *const type, const char *const value);
void win_handle_command_exec_result_note(ProfWin *window, const char *const type, const char *const value);
// desktop notifications
void notifier_initialise(void);

View File

@ -128,7 +128,7 @@ typedef enum {
WIN_CONSOLE,
WIN_CHAT,
WIN_MUC,
WIN_MUC_CONFIG,
WIN_CONFIG,
WIN_PRIVATE,
WIN_XML,
WIN_PLUGIN
@ -172,12 +172,18 @@ typedef struct prof_muc_win_t {
char *message_char;
} ProfMucWin;
typedef struct prof_mucconf_win_t {
typedef struct prof_conf_win_t ProfConfWin;
typedef void (*ProfConfWinCallback)(ProfConfWin *);
struct prof_conf_win_t {
ProfWin window;
char *roomjid;
DataForm *form;
unsigned long memcheck;
} ProfMucConfWin;
ProfConfWinCallback submit;
ProfConfWinCallback cancel;
const void *userdata;
};
typedef struct prof_private_win_t {
ProfWin window;

View File

@ -203,13 +203,16 @@ win_create_muc(const char *const roomjid)
}
ProfWin*
win_create_muc_config(const char *const roomjid, DataForm *form)
win_create_config(const char *const roomjid, DataForm *form, ProfConfWinCallback submit, ProfConfWinCallback cancel, const void *userdata)
{
ProfMucConfWin *new_win = malloc(sizeof(ProfMucConfWin));
new_win->window.type = WIN_MUC_CONFIG;
ProfConfWin *new_win = malloc(sizeof(ProfConfWin));
new_win->window.type = WIN_CONFIG;
new_win->window.layout = _win_create_simple_layout();
new_win->roomjid = strdup(roomjid);
new_win->form = form;
new_win->submit = submit;
new_win->cancel = cancel;
new_win->userdata = userdata;
new_win->memcheck = PROFCONFWIN_MEMCHECK;
@ -289,8 +292,8 @@ win_get_title(ProfWin *window)
assert(mucwin->memcheck == PROFMUCWIN_MEMCHECK);
return strdup(mucwin->roomjid);
}
if (window->type == WIN_MUC_CONFIG) {
ProfMucConfWin *confwin = (ProfMucConfWin*) window;
if (window->type == WIN_CONFIG) {
ProfConfWin *confwin = (ProfConfWin*) window;
assert(confwin->memcheck == PROFCONFWIN_MEMCHECK);
GString *title = g_string_new(confwin->roomjid);
g_string_append(title, " config");
@ -338,10 +341,10 @@ win_get_tab_identifier(ProfWin *window)
ProfMucWin *mucwin = (ProfMucWin*)window;
return strdup(mucwin->roomjid);
}
case WIN_MUC_CONFIG:
case WIN_CONFIG:
{
ProfMucConfWin *mucconfwin = (ProfMucConfWin*)window;
return strdup(mucconfwin->roomjid);
ProfConfWin *confwin = (ProfConfWin*)window;
return strdup(confwin->roomjid);
}
case WIN_PRIVATE:
{
@ -383,10 +386,10 @@ win_to_string(ProfWin *window)
ProfMucWin *mucwin = (ProfMucWin*)window;
return mucwin_get_string(mucwin);
}
case WIN_MUC_CONFIG:
case WIN_CONFIG:
{
ProfMucConfWin *mucconfwin = (ProfMucConfWin*)window;
return mucconfwin_get_string(mucconfwin);
ProfConfWin *confwin = (ProfConfWin*)window;
return confwin_get_string(confwin);
}
case WIN_PRIVATE:
{
@ -491,11 +494,11 @@ win_free(ProfWin* window)
free(mucwin->message_char);
break;
}
case WIN_MUC_CONFIG:
case WIN_CONFIG:
{
ProfMucConfWin *mucconf = (ProfMucConfWin*)window;
free(mucconf->roomjid);
form_destroy(mucconf->form);
ProfConfWin *conf = (ProfConfWin*)window;
free(conf->roomjid);
form_destroy(conf->form);
break;
}
case WIN_PRIVATE:
@ -1389,8 +1392,8 @@ _win_print(ProfWin *window, const char show_char, int pad_indent, GDateTime *tim
case WIN_MUC:
time_pref = prefs_get_string(PREF_TIME_MUC);
break;
case WIN_MUC_CONFIG:
time_pref = prefs_get_string(PREF_TIME_MUCCONFIG);
case WIN_CONFIG:
time_pref = prefs_get_string(PREF_TIME_CONFIG);
break;
case WIN_PRIVATE:
time_pref = prefs_get_string(PREF_TIME_PRIVATE);
@ -1724,3 +1727,60 @@ win_sub_newline_lazy(WINDOW *win)
wmove(win, cury+1, 0);
}
}
void
win_command_list_error(ProfWin *window, const char *const error)
{
assert(window != NULL);
win_println(window, THEME_ERROR, '!', "Error retrieving command list: %s", error);
}
void
win_command_exec_error(ProfWin *window, const char *const command, const char *const error, ...)
{
assert(window != NULL);
va_list arg;
va_start(arg, error);
GString *msg = g_string_new(NULL);
g_string_vprintf(msg, error, arg);
win_println(window, THEME_ERROR, '!', "Error executing command %s: %s", command, msg->str);
g_string_free(msg, TRUE);
va_end(arg);
}
void
win_handle_command_list(ProfWin *window, GSList *cmds)
{
assert(window != NULL);
if (cmds) {
win_println(window, THEME_DEFAULT, '!', "Ad hoc commands:");
GSList *curr_cmd = cmds;
while (curr_cmd) {
const char *cmd = curr_cmd->data;
win_println(window, THEME_DEFAULT, '!', " %s", cmd);
curr_cmd = g_slist_next(curr_cmd);
}
win_println(window, THEME_DEFAULT, '!', "");
} else {
win_println(window, THEME_DEFAULT, '!', "No commands found");
win_println(window, THEME_DEFAULT, '!', "");
}
}
void
win_handle_command_exec_status(ProfWin *window, const char *const command, const char *const value)
{
assert(window != NULL);
win_println(window, THEME_DEFAULT, '!', "%s %s", command, value);
}
void
win_handle_command_exec_result_note(ProfWin *window, const char *const type, const char *const value)
{
assert(window != NULL);
win_println(window, THEME_DEFAULT, '!', value);
}

View File

@ -139,16 +139,16 @@ wins_get_chat_unsubscribed(void)
return result;
}
ProfMucConfWin*
wins_get_muc_conf(const char *const roomjid)
ProfConfWin*
wins_get_conf(const char *const roomjid)
{
GList *values = g_hash_table_get_values(windows);
GList *curr = values;
while (curr) {
ProfWin *window = curr->data;
if (window->type == WIN_MUC_CONFIG) {
ProfMucConfWin *confwin = (ProfMucConfWin*)window;
if (window->type == WIN_CONFIG) {
ProfConfWin *confwin = (ProfConfWin*)window;
if (g_strcmp0(confwin->roomjid, roomjid) == 0) {
g_list_free(values);
return confwin;
@ -364,7 +364,7 @@ wins_get_by_num(int i)
}
ProfWin*
wins_get_by_string(char *str)
wins_get_by_string(const char *str)
{
if (g_strcmp0(str, "console") == 0) {
ProfWin *conswin = wins_get_console();
@ -584,7 +584,7 @@ wins_close_by_num(int i)
autocomplete_remove(wins_close_ac, pluginwin->tag);
break;
}
case WIN_MUC_CONFIG:
case WIN_CONFIG:
default:
break;
}
@ -657,12 +657,12 @@ wins_new_muc(const char *const roomjid)
}
ProfWin*
wins_new_muc_config(const char *const roomjid, DataForm *form)
wins_new_config(const char *const roomjid, DataForm *form, ProfConfWinCallback submit, ProfConfWinCallback cancel, const void *userdata)
{
GList *keys = g_hash_table_get_keys(windows);
int result = _wins_get_next_available_num(keys);
g_list_free(keys);
ProfWin *newwin = win_create_muc_config(roomjid, form);
ProfWin *newwin = win_create_config(roomjid, form, submit, cancel, userdata);
g_hash_table_insert(windows, GINT_TO_POINTER(result), newwin);
return newwin;
}
@ -812,7 +812,7 @@ wins_get_prune_wins(void)
ProfWin *window = curr->data;
if (win_unread(window) == 0 &&
window->type != WIN_MUC &&
window->type != WIN_MUC_CONFIG &&
window->type != WIN_CONFIG &&
window->type != WIN_XML &&
window->type != WIN_CONSOLE) {
result = g_slist_append(result, window);

View File

@ -42,7 +42,7 @@ void wins_init(void);
ProfWin* wins_new_xmlconsole(void);
ProfWin* wins_new_chat(const char *const barejid);
ProfWin* wins_new_muc(const char *const roomjid);
ProfWin* wins_new_muc_config(const char *const roomjid, DataForm *form);
ProfWin* wins_new_config(const char *const roomjid, DataForm *form, ProfConfWinCallback submit, ProfConfWinCallback cancel, const void *userdata);
ProfWin* wins_new_private(const char *const fulljid);
ProfWin* wins_new_plugin(const char *const plugin_name, const char *const tag);
@ -56,7 +56,7 @@ ProfWin* wins_get_console(void);
ProfChatWin* wins_get_chat(const char *const barejid);
GList* wins_get_chat_unsubscribed(void);
ProfMucWin* wins_get_muc(const char *const roomjid);
ProfMucConfWin* wins_get_muc_conf(const char *const roomjid);
ProfConfWin* wins_get_conf(const char *const roomjid);
ProfPrivateWin* wins_get_private(const char *const fulljid);
ProfPluginWin* wins_get_plugin(const char *const tag);
ProfXMLWin* wins_get_xmlconsole(void);
@ -68,7 +68,7 @@ ProfWin* wins_get_current(void);
void wins_set_current_by_num(int i);
ProfWin* wins_get_by_num(int i);
ProfWin* wins_get_by_string(char *str);
ProfWin* wins_get_by_string(const char *str);
ProfWin* wins_get_next(void);
ProfWin* wins_get_previous(void);

View File

@ -88,6 +88,11 @@ typedef struct privilege_set_t {
char *privilege;
} ProfPrivilegeSet;
typedef struct command_config_data_t {
char *sessionid;
char *command;
} CommandConfigData;
static int _iq_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, void *const userdata);
static void _error_handler(xmpp_stanza_t *const stanza);
@ -120,6 +125,8 @@ static int _caps_response_for_jid_id_handler(xmpp_stanza_t *const stanza, void *
static int _caps_response_legacy_id_handler(xmpp_stanza_t *const stanza, void *const userdata);
static int _auto_pong_id_handler(xmpp_stanza_t *const stanza, void *const userdata);
static int _room_list_id_handler(xmpp_stanza_t *const stanza, void *const userdata);
static int _command_list_result_handler(xmpp_stanza_t *const stanza, void *const userdata);
static int _command_exec_response_handler(xmpp_stanza_t *const stanza, void *const userdata);
static void _iq_free_room_data(ProfRoomInfoData *roominfo);
static void _iq_free_affiliation_set(ProfPrivilegeSet *affiliation_set);
@ -319,7 +326,7 @@ iq_room_list_request(gchar *conferencejid, gchar *filter)
xmpp_ctx_t * const ctx = connection_get_ctx();
char *id = connection_create_stanza_id("confreq");
xmpp_stanza_t *iq = stanza_create_disco_items_iq(ctx, id, conferencejid);
xmpp_stanza_t *iq =