2 #include "silc-cmdqueue.h"
6 GHashTable *cmd_queues;
8 void silc_queue_init(void)
10 cmd_queues = g_hash_table_new(NULL, NULL);
13 static void cmd_list_remove_cb(char *cmd)
18 static int cmd_queue_remove_cb(void *key, GSList *list)
20 if ((list != NULL) && (list->next != NULL)) {
21 g_slist_foreach(list, (GFunc) cmd_list_remove_cb, NULL);
28 void silc_queue_deinit(void)
30 g_hash_table_foreach_remove(cmd_queues, (GHRFunc) cmd_queue_remove_cb, NULL);
31 g_hash_table_destroy(cmd_queues);
34 void silc_queue_flush(SilcClientConnection conn)
36 GSList *list = g_hash_table_lookup(cmd_queues, conn);
41 for (tmp = g_slist_next(list); tmp != NULL; tmp = g_slist_next(tmp))
42 silc_client_command_call(silc_client, conn, tmp->data);
44 g_slist_foreach(list, (GFunc) cmd_list_remove_cb, NULL);
45 /* free all but the first element ... */
46 g_slist_free(g_slist_remove_link(list, list));
50 void silc_queue_enable(SilcClientConnection conn)
52 GSList *list = g_hash_table_lookup(cmd_queues, conn);
55 g_hash_table_insert(cmd_queues, conn, g_slist_alloc());
58 void silc_queue_disable(SilcClientConnection conn)
60 GSList *list = g_hash_table_lookup(cmd_queues, conn);
63 silc_queue_flush(conn);
65 g_hash_table_remove(cmd_queues, conn);
69 bool silc_queue_command_call(SilcClient client,
70 SilcClientConnection conn,
71 const char *command_line, ...)
74 char *cmd = (char *) command_line;
75 GSList *list = g_hash_table_lookup(cmd_queues, conn);
76 bool need_free = FALSE;
78 va_start(ap, command_line);
80 if (command_line == NULL) {
81 char *tmp = va_arg(ap, char *);
92 for (tmp = va_arg(ap, char *); tmp != NULL; tmp = va_arg(ap, char *)) {
95 cmd = g_strconcat(cmd, " ", tmp, NULL);
103 if (!silc_term_utf8()) {
104 int len = silc_utf8_encoded_len(cmd, strlen(cmd), SILC_STRING_LOCALE);
105 char *message = silc_calloc(len + 1, sizeof(*cmd));
106 if (message == NULL) {
111 g_error("file %s: line %d: assertion `message != NULL' failed.",
116 silc_utf8_encode(cmd, strlen(cmd), SILC_STRING_LOCALE, message, len);
122 cmd = g_strdup(message);
127 /* queueing disabled -> immediate execution */
129 bool result = silc_client_command_call(client, conn, cmd);
137 g_hash_table_remove(cmd_queues, conn);
138 g_hash_table_insert(cmd_queues, conn, g_slist_append(list, g_strdup(cmd)));
146 bool silc_queue_get_state(SilcClientConnection conn) {
147 return g_hash_table_lookup(cmd_queues, conn) != NULL;