diff options
author | James Booth <boothj5@gmail.com> | 2016-06-30 23:58:04 +0100 |
---|---|---|
committer | James Booth <boothj5@gmail.com> | 2016-06-30 23:58:04 +0100 |
commit | 3bd3de036f68b107e9b599f44adcaf0842c708b0 (patch) | |
tree | 120cd28b037011e2adbda75aa5f6dc18bcf4d6c1 /src | |
parent | bb33522e4d52d13b0814690b63c5d397c1828ed2 (diff) | |
download | profani-tty-3bd3de036f68b107e9b599f44adcaf0842c708b0.tar.gz |
Use hash table to store plugins
Diffstat (limited to 'src')
-rw-r--r-- | src/command/cmd_ac.c | 8 | ||||
-rw-r--r-- | src/command/cmd_funcs.c | 22 | ||||
-rw-r--r-- | src/plugins/plugins.c | 219 | ||||
-rw-r--r-- | src/plugins/plugins.h | 3 |
4 files changed, 143 insertions, 109 deletions
diff --git a/src/command/cmd_ac.c b/src/command/cmd_ac.c index a4cd788e..da466b76 100644 --- a/src/command/cmd_ac.c +++ b/src/command/cmd_ac.c @@ -1894,13 +1894,13 @@ _plugins_autocomplete(ProfWin *window, const char *const input) if (strncmp(input, "/plugins unload ", 16) == 0) { if (plugins_unload_ac == NULL) { plugins_unload_ac = autocomplete_new(); - GSList *plugins = plugins_loaded_list(); - GSList *curr = plugins; + GList *plugins = plugins_loaded_list(); + GList *curr = plugins; while (curr) { autocomplete_add(plugins_unload_ac, curr->data); - curr = g_slist_next(curr); + curr = g_list_next(curr); } - g_slist_free(plugins); + g_list_free(plugins); } result = autocomplete_param_with_ac(input, "/plugins unload", plugins_unload_ac, TRUE); if (result) { diff --git a/src/command/cmd_funcs.c b/src/command/cmd_funcs.c index 40944874..70365a60 100644 --- a/src/command/cmd_funcs.c +++ b/src/command/cmd_funcs.c @@ -6053,19 +6053,19 @@ cmd_plugins(ProfWin *window, const char *const command, gchar **args) return TRUE; } else { - GSList *plugins = plugins_get_list(); - GSList *curr = plugins; - if (curr == NULL) { + GList *plugins = plugins_loaded_list(); + if (plugins == NULL) { cons_show("No plugins installed."); - } else { - cons_show("Installed plugins:"); - while (curr) { - ProfPlugin *plugin = curr->data; - cons_show(" %s", plugin->name); - curr = g_slist_next(curr); - } + return TRUE; + } + + GList *curr = plugins; + cons_show("Installed plugins:"); + while (curr) { + cons_show(" %s", curr->data); + curr = g_list_next(curr); } - g_slist_free(curr); + g_list_free(plugins); return TRUE; } diff --git a/src/plugins/plugins.c b/src/plugins/plugins.c index 59aa27a9..2166729a 100644 --- a/src/plugins/plugins.c +++ b/src/plugins/plugins.c @@ -60,12 +60,12 @@ #include "ui/ui.h" -static GSList* plugins; +static GHashTable *plugins; void plugins_init(void) { - plugins = NULL; + plugins = g_hash_table_new_full(g_str_hash, g_str_equal, free, NULL); callbacks_init(); autocompleters_init(); @@ -91,7 +91,7 @@ plugins_init(void) if (g_str_has_suffix(filename, ".py")) { ProfPlugin *plugin = python_plugin_create(filename); if (plugin) { - plugins = g_slist_append(plugins, plugin); + g_hash_table_insert(plugins, strdup(filename), plugin); loaded = TRUE; } } @@ -100,7 +100,7 @@ plugins_init(void) if (g_str_has_suffix(filename, ".so")) { ProfPlugin *plugin = c_plugin_create(filename); if (plugin) { - plugins = g_slist_append(plugins, plugin); + g_hash_table_insert(plugins, strdup(filename), plugin); loaded = TRUE; } } @@ -113,12 +113,15 @@ plugins_init(void) } // initialise plugins - GSList *curr = plugins; + GList *values = g_hash_table_get_values(plugins); + GList *curr = values; while (curr) { ProfPlugin *plugin = curr->data; plugin->init_func(plugin, PACKAGE_VERSION, PACKAGE_STATUS, NULL, NULL); - curr = g_slist_next(curr); + curr = g_list_next(curr); } + g_list_free(values); + } prefs_free_plugins(plugins_pref); @@ -127,24 +130,14 @@ plugins_init(void) } gboolean -_find_by_name(gconstpointer pluginp, gconstpointer namep) -{ - char *name = (char*)namep; - ProfPlugin *plugin = (ProfPlugin*)pluginp; - - return g_strcmp0(name, plugin->name); -} - -gboolean plugins_load(const char *const name) { - GSList *found = g_slist_find_custom(plugins, name, (GCompareFunc)_find_by_name); - if (found) { + ProfPlugin *plugin = g_hash_table_lookup(plugins, name); + if (plugin) { log_info("Failed to load plugin: %s, plugin already loaded", name); return FALSE; } - ProfPlugin *plugin = NULL; #ifdef HAVE_PYTHON if (g_str_has_suffix(name, ".py")) { plugin = python_plugin_create(name); @@ -156,7 +149,7 @@ plugins_load(const char *const name) } #endif if (plugin) { - plugins = g_slist_append(plugins, plugin); + g_hash_table_insert(plugins, strdup(name), plugin); if (connection_get_status() == JABBER_CONNECTED) { const char *account_name = session_get_account_name(); const char *fulljid = connection_get_fulljid(); @@ -179,12 +172,6 @@ plugins_unload(const char *const name) return FALSE; } -GSList * -plugins_get_list(void) -{ - return plugins; -} - static gchar* _get_plugins_dir(void) { @@ -205,7 +192,7 @@ _plugins_unloaded_list_dir(const gchar *const dir, GSList **result) const gchar *plugin = g_dir_read_name(plugins_dir); while (plugin) { - GSList *found = g_slist_find_custom(plugins, plugin, (GCompareFunc)_find_by_name); + ProfPlugin *found = g_hash_table_lookup(plugins, plugin); if ((g_str_has_suffix(plugin, ".so") || g_str_has_suffix(plugin, ".py")) && !found) { *result = g_slist_append(*result, strdup(plugin)); } @@ -225,18 +212,10 @@ plugins_unloaded_list(void) return result; } -GSList* +GList* plugins_loaded_list(void) { - GSList *result = NULL; - GSList *curr = plugins; - while (curr) { - ProfPlugin *plugin = curr->data; - result = g_slist_append(result, plugin->name); - curr = g_slist_next(curr); - } - - return result; + return g_hash_table_get_keys(plugins); } char * @@ -261,45 +240,53 @@ plugins_win_process_line(char *win, const char * const line) void plugins_on_start(void) { - GSList *curr = plugins; + GList *values = g_hash_table_get_values(plugins); + GList *curr = values; while (curr) { ProfPlugin *plugin = curr->data; plugin->on_start_func(plugin); - curr = g_slist_next(curr); + curr = g_list_next(curr); } + g_list_free(values); } void plugins_on_shutdown(void) { - GSList *curr = plugins; + GList *values = g_hash_table_get_values(plugins); + GList *curr = values; while (curr) { ProfPlugin *plugin = curr->data; plugin->on_shutdown_func(plugin); - curr = g_slist_next(curr); + curr = g_list_next(curr); } + g_list_free(values); } void plugins_on_connect(const char * const account_name, const char * const fulljid) { - GSList *curr = plugins; + GList *values = g_hash_table_get_values(plugins); + GList *curr = values; while (curr) { ProfPlugin *plugin = curr->data; plugin->on_connect_func(plugin, account_name, fulljid); - curr = g_slist_next(curr); + curr = g_list_next(curr); } + g_list_free(values); } void plugins_on_disconnect(const char * const account_name, const char * const fulljid) { - GSList *curr = plugins; + GList *values = g_hash_table_get_values(plugins); + GList *curr = values; while (curr) { ProfPlugin *plugin = curr->data; plugin->on_disconnect_func(plugin, account_name, fulljid); - curr = g_slist_next(curr); + curr = g_list_next(curr); } + g_list_free(values); } char* @@ -308,7 +295,8 @@ plugins_pre_chat_message_display(const char * const jid, const char *message) char *new_message = NULL; char *curr_message = strdup(message); - GSList *curr = plugins; + GList *values = g_hash_table_get_values(plugins); + GList *curr = values; while (curr) { ProfPlugin *plugin = curr->data; new_message = plugin->pre_chat_message_display(plugin, jid, curr_message); @@ -317,8 +305,9 @@ plugins_pre_chat_message_display(const char * const jid, const char *message) curr_message = strdup(new_message); free(new_message); } - curr = g_slist_next(curr); + curr = g_list_next(curr); } + g_list_free(values); return curr_message; } @@ -326,12 +315,14 @@ plugins_pre_chat_message_display(const char * const jid, const char *message) void plugins_post_chat_message_display(const char * const jid, const char *message) { - GSList *curr = plugins; + GList *values = g_hash_table_get_values(plugins); + GList *curr = values; while (curr) { ProfPlugin *plugin = curr->data; plugin->post_chat_message_display(plugin, jid, message); - curr = g_slist_next(curr); + curr = g_list_next(curr); } + g_list_free(values); } char* @@ -340,7 +331,8 @@ plugins_pre_chat_message_send(const char * const jid, const char *message) char *new_message = NULL; char *curr_message = strdup(message); - GSList *curr = plugins; + GList *values = g_hash_table_get_values(plugins); + GList *curr = values; while (curr) { ProfPlugin *plugin = curr->data; new_message = plugin->pre_chat_message_send(plugin, jid, curr_message); @@ -349,8 +341,9 @@ plugins_pre_chat_message_send(const char * const jid, const char *message) curr_message = strdup(new_message); free(new_message); } - curr = g_slist_next(curr); + curr = g_list_next(curr); } + g_list_free(values); return curr_message; } @@ -358,12 +351,14 @@ plugins_pre_chat_message_send(const char * const jid, const char *message) void plugins_post_chat_message_send(const char * const jid, const char *message) { - GSList *curr = plugins; + GList *values = g_hash_table_get_values(plugins); + GList *curr = values; while (curr) { ProfPlugin *plugin = curr->data; plugin->post_chat_message_send(plugin, jid, message); - curr = g_slist_next(curr); + curr = g_list_next(curr); } + g_list_free(values); } char* @@ -372,7 +367,8 @@ plugins_pre_room_message_display(const char * const room, const char * const nic char *new_message = NULL; char *curr_message = strdup(message); - GSList *curr = plugins; + GList *values = g_hash_table_get_values(plugins); + GList *curr = values; while (curr) { ProfPlugin *plugin = curr->data; new_message = plugin->pre_room_message_display(plugin, room, nick, curr_message); @@ -381,8 +377,9 @@ plugins_pre_room_message_display(const char * const room, const char * const nic curr_message = strdup(new_message); free(new_message); } - curr = g_slist_next(curr); + curr = g_list_next(curr); } + g_list_free(values); return curr_message; } @@ -390,12 +387,14 @@ plugins_pre_room_message_display(const char * const room, const char * const nic void plugins_post_room_message_display(const char * const room, const char * const nick, const char *message) { - GSList *curr = plugins; + GList *values = g_hash_table_get_values(plugins); + GList *curr = values; while (curr) { ProfPlugin *plugin = curr->data; plugin->post_room_message_display(plugin, room, nick, message); - curr = g_slist_next(curr); + curr = g_list_next(curr); } + g_list_free(values); } char* @@ -404,7 +403,8 @@ plugins_pre_room_message_send(const char * const room, const char *message) char *new_message = NULL; char *curr_message = strdup(message); - GSList *curr = plugins; + GList *values = g_hash_table_get_values(plugins); + GList *curr = values; while (curr) { ProfPlugin *plugin = curr->data; new_message = plugin->pre_room_message_send(plugin, room, curr_message); @@ -413,8 +413,9 @@ plugins_pre_room_message_send(const char * const room, const char *message) curr_message = strdup(new_message); free(new_message); } - curr = g_slist_next(curr); + curr = g_list_next(curr); } + g_list_free(values); return curr_message; } @@ -422,12 +423,14 @@ plugins_pre_room_message_send(const char * const room, const char *message) void plugins_post_room_message_send(const char * const room, const char *message) { - GSList *curr = plugins; + GList *values = g_hash_table_get_values(plugins); + GList *curr = values; while (curr) { ProfPlugin *plugin = curr->data; plugin->post_room_message_send(plugin, room, message); - curr = g_slist_next(curr); + curr = g_list_next(curr); } + g_list_free(values); } void @@ -441,12 +444,14 @@ plugins_on_room_history_message(const char *const room, const char *const nick, timestamp_str = g_time_val_to_iso8601(×tamp_tv); } - GSList *curr = plugins; + GList *values = g_hash_table_get_values(plugins); + GList *curr = values; while (curr) { ProfPlugin *plugin = curr->data; plugin->on_room_history_message(plugin, room, nick, message, timestamp_str); - curr = g_slist_next(curr); + curr = g_list_next(curr); } + g_list_free(values); free(timestamp_str); } @@ -458,7 +463,8 @@ plugins_pre_priv_message_display(const char * const jid, const char *message) char *new_message = NULL; char *curr_message = strdup(message); - GSList *curr = plugins; + GList *values = g_hash_table_get_values(plugins); + GList *curr = values; while (curr) { ProfPlugin *plugin = curr->data; new_message = plugin->pre_priv_message_display(plugin, jidp->barejid, jidp->resourcepart, curr_message); @@ -467,8 +473,9 @@ plugins_pre_priv_message_display(const char * const jid, const char *message) curr_message = strdup(new_message); free(new_message); } - curr = g_slist_next(curr); + curr = g_list_next(curr); } + g_list_free(values); jid_destroy(jidp); return curr_message; @@ -479,12 +486,14 @@ plugins_post_priv_message_display(const char * const jid, const char *message) { Jid *jidp = jid_create(jid); - GSList *curr = plugins; + GList *values = g_hash_table_get_values(plugins); + GList *curr = values; while (curr) { ProfPlugin *plugin = curr->data; plugin->post_priv_message_display(plugin, jidp->barejid, jidp->resourcepart, message); - curr = g_slist_next(curr); + curr = g_list_next(curr); } + g_list_free(values); jid_destroy(jidp); } @@ -496,7 +505,8 @@ plugins_pre_priv_message_send(const char * const jid, const char * const message char *new_message = NULL; char *curr_message = strdup(message); - GSList *curr = plugins; + GList *values = g_hash_table_get_values(plugins); + GList *curr = values; while (curr) { ProfPlugin *plugin = curr->data; new_message = plugin->pre_priv_message_send(plugin, jidp->barejid, jidp->resourcepart, curr_message); @@ -505,8 +515,9 @@ plugins_pre_priv_message_send(const char * const jid, const char * const message curr_message = strdup(new_message); free(new_message); } - curr = g_slist_next(curr); + curr = g_list_next(curr); } + g_list_free(values); jid_destroy(jidp); return curr_message; @@ -517,12 +528,14 @@ plugins_post_priv_message_send(const char * const jid, const char * const messag { Jid *jidp = jid_create(jid); - GSList *curr = plugins; + GList *values = g_hash_table_get_values(plugins); + GList *curr = values; while (curr) { ProfPlugin *plugin = curr->data; plugin->post_priv_message_send(plugin, jidp->barejid, jidp->resourcepart, message); - curr = g_slist_next(curr); + curr = g_list_next(curr); } + g_list_free(values); jid_destroy(jidp); } @@ -533,7 +546,8 @@ plugins_on_message_stanza_send(const char *const text) char *new_stanza = NULL; char *curr_stanza = strdup(text); - GSList *curr = plugins; + GList *values = g_hash_table_get_values(plugins); + GList *curr = values; while (curr) { ProfPlugin *plugin = curr->data; new_stanza = plugin->on_message_stanza_send(plugin, curr_stanza); @@ -542,8 +556,9 @@ plugins_on_message_stanza_send(const char *const text) curr_stanza = strdup(new_stanza); free(new_stanza); } - curr = g_slist_next(curr); + curr = g_list_next(curr); } + g_list_free(values); return curr_stanza; } @@ -553,15 +568,17 @@ plugins_on_message_stanza_receive(const char *const text) { gboolean cont = TRUE; - GSList *curr = plugins; + GList *values = g_hash_table_get_values(plugins); + GList *curr = values; while (curr) { ProfPlugin *plugin = curr->data; gboolean res = plugin->on_message_stanza_receive(plugin, text); if (res == FALSE) { cont = FALSE; } - curr = g_slist_next(curr); + curr = g_list_next(curr); } + g_list_free(values); return cont; } @@ -572,7 +589,8 @@ plugins_on_presence_stanza_send(const char *const text) char *new_stanza = NULL; char *curr_stanza = strdup(text); - GSList *curr = plugins; + GList *values = g_hash_table_get_values(plugins); + GList *curr = values; while (curr) { ProfPlugin *plugin = curr->data; new_stanza = plugin->on_presence_stanza_send(plugin, curr_stanza); @@ -581,8 +599,9 @@ plugins_on_presence_stanza_send(const char *const text) curr_stanza = strdup(new_stanza); free(new_stanza); } - curr = g_slist_next(curr); + curr = g_list_next(curr); } + g_list_free(values); return curr_stanza; } @@ -592,15 +611,17 @@ plugins_on_presence_stanza_receive(const char *const text) { gboolean cont = TRUE; - GSList *curr = plugins; + GList *values = g_hash_table_get_values(plugins); + GList *curr = values; while (curr) { ProfPlugin *plugin = curr->data; gboolean res = plugin->on_presence_stanza_receive(plugin, text); if (res == FALSE) { cont = FALSE; } - curr = g_slist_next(curr); + curr = g_list_next(curr); } + g_list_free(values); return cont; } @@ -611,7 +632,8 @@ plugins_on_iq_stanza_send(const char *const text) char *new_stanza = NULL; char *curr_stanza = strdup(text); - GSList *curr = plugins; + GList *values = g_hash_table_get_values(plugins); + GList *curr = values; while (curr) { ProfPlugin *plugin = curr->data; new_stanza = plugin->on_iq_stanza_send(plugin, curr_stanza); @@ -620,8 +642,9 @@ plugins_on_iq_stanza_send(const char *const text) curr_stanza = strdup(new_stanza); free(new_stanza); } - curr = g_slist_next(curr); + curr = g_list_next(curr); } + g_list_free(values); return curr_stanza; } @@ -631,15 +654,17 @@ plugins_on_iq_stanza_receive(const char *const text) { gboolean cont = TRUE; - GSList *curr = plugins; + GList *values = g_hash_table_get_values(plugins); + GList *curr = values; while (curr) { ProfPlugin *plugin = curr->data; gboolean res = plugin->on_iq_stanza_receive(plugin, text); if (res == FALSE) { cont = FALSE; } - curr = g_slist_next(curr); + curr = g_list_next(curr); } + g_list_free(values); return cont; } @@ -647,45 +672,53 @@ plugins_on_iq_stanza_receive(const char *const text) void plugins_on_contact_offline(const char *const barejid, const char *const resource, const char *const status) { - GSList *curr = plugins; + GList *values = g_hash_table_get_values(plugins); + GList *curr = values; while (curr) { ProfPlugin *plugin = curr->data; plugin->on_contact_offline(plugin, barejid, resource, status); - curr = g_slist_next(curr); + curr = g_list_next(curr); } + g_list_free(values); } void plugins_on_contact_presence(const char *const barejid, const char *const resource, const char *const presence, const char *const status, const int priority) { - GSList *curr = plugins; + GList *values = g_hash_table_get_values(plugins); + GList *curr = values; while (curr) { ProfPlugin *plugin = curr->data; plugin->on_contact_presence(plugin, barejid, resource, presence, status, priority); - curr = g_slist_next(curr); + curr = g_list_next(curr); } + g_list_free(values); } void plugins_on_chat_win_focus(const char *const barejid) { - GSList *curr = plugins; + GList *values = g_hash_table_get_values(plugins); + GList *curr = values; while (curr) { ProfPlugin *plugin = curr->data; plugin->on_chat_win_focus(plugin, barejid); - curr = g_slist_next(curr); + curr = g_list_next(curr); } + g_list_free(values); } void plugins_on_room_win_focus(const char *const roomjid) { - GSList *curr = plugins; + GList *values = g_hash_table_get_values(plugins); + GList *curr = values; while (curr) { ProfPlugin *plugin = curr->data; plugin->on_room_win_focus(plugin, roomjid); - curr = g_slist_next(curr); + curr = g_list_next(curr); } + g_list_free(values); } GList* @@ -697,7 +730,8 @@ plugins_get_disco_features(void) void plugins_shutdown(void) { - GSList *curr = plugins; + GList *values = g_hash_table_get_values(plugins); + GList *curr = values; while (curr) { #ifdef HAVE_PYTHON @@ -711,8 +745,9 @@ plugins_shutdown(void) } #endif - curr = g_slist_next(curr); + curr = g_list_next(curr); } + g_list_free(values); #ifdef HAVE_PYTHON python_shutdown(); #endif diff --git a/src/plugins/plugins.h b/src/plugins/plugins.h index a5b10a3e..13bb6e2f 100644 --- a/src/plugins/plugins.h +++ b/src/plugins/plugins.h @@ -98,9 +98,8 @@ typedef struct prof_plugin_t { } ProfPlugin; void plugins_init(void); -GSList* plugins_get_list(void); GSList *plugins_unloaded_list(void); -GSList *plugins_loaded_list(void); +GList *plugins_loaded_list(void); char* plugins_autocomplete(const char *const input); void plugins_reset_autocomplete(void); void plugins_shutdown(void); |