diff options
Diffstat (limited to 'src/plugins')
-rw-r--r-- | src/plugins/c_plugins.c | 10 | ||||
-rw-r--r-- | src/plugins/c_plugins.h | 3 | ||||
-rw-r--r-- | src/plugins/plugins.c | 29 | ||||
-rw-r--r-- | src/plugins/plugins.h | 4 | ||||
-rw-r--r-- | src/plugins/python_plugins.c | 31 | ||||
-rw-r--r-- | src/plugins/python_plugins.h | 3 |
6 files changed, 41 insertions, 39 deletions
diff --git a/src/plugins/c_plugins.c b/src/plugins/c_plugins.c index ff05791d..7fe10905 100644 --- a/src/plugins/c_plugins.c +++ b/src/plugins/c_plugins.c @@ -113,10 +113,12 @@ c_plugin_create(const char *const filename) } void -c_init_hook(ProfPlugin *plugin, const char *const version, const char *const status) +c_init_hook(ProfPlugin *plugin, const char *const version, const char *const status, const char *const account_name, + const char *const fulljid) { void *f = NULL; - void (*func)(const char *const __version, const char *const __status); + void (*func)(const char *const __version, const char *const __status, const char *const __account_name, + const char *const __fulljid); assert(plugin && plugin->module); @@ -125,10 +127,10 @@ c_init_hook(ProfPlugin *plugin, const char *const version, const char *const sta return; } - func = (void (*)(const char *const, const char *const))f; + func = (void (*)(const char *const, const char *const, const char *const, const char *const))f; // FIXME maybe we want to make it boolean to see if it succeeded or not? - func(version, status); + func(version, status, account_name, fulljid); } void diff --git a/src/plugins/c_plugins.h b/src/plugins/c_plugins.h index 1517ecb2..a62e302f 100644 --- a/src/plugins/c_plugins.h +++ b/src/plugins/c_plugins.h @@ -43,7 +43,8 @@ ProfPlugin* c_plugin_create(const char *const filename); void c_plugin_destroy(ProfPlugin *plugin); void c_shutdown(void); -void c_init_hook(ProfPlugin *plugin, const char *const version, const char *const status); +void c_init_hook(ProfPlugin *plugin, const char *const version, const char *const status, const char *const account_name, + const char *const fulljid); void c_on_start_hook(ProfPlugin *plugin); void c_on_shutdown_hook(ProfPlugin *plugin); void c_on_connect_hook(ProfPlugin *plugin, const char *const account_name, const char *const fulljid); diff --git a/src/plugins/plugins.c b/src/plugins/plugins.c index e2d0bdf3..cb222a32 100644 --- a/src/plugins/plugins.c +++ b/src/plugins/plugins.c @@ -114,7 +114,7 @@ plugins_init(void) GSList *curr = plugins; while (curr) { ProfPlugin *plugin = curr->data; - plugin->init_func(plugin, PACKAGE_VERSION, PACKAGE_STATUS); + plugin->init_func(plugin, PACKAGE_VERSION, PACKAGE_STATUS, NULL, NULL); curr = g_slist_next(curr); } } @@ -155,7 +155,13 @@ plugins_load(const char *const name) #endif if (plugin) { plugins = g_slist_append(plugins, plugin); - plugin->init_func(plugin, PACKAGE_VERSION, PACKAGE_STATUS); + if (jabber_get_connection_status() == JABBER_CONNECTED) { + const char *account_name = jabber_get_account_name(); + const char *fulljid = jabber_get_fulljid(); + plugin->init_func(plugin, PACKAGE_VERSION, PACKAGE_STATUS, account_name, fulljid); + } else { + plugin->init_func(plugin, PACKAGE_VERSION, PACKAGE_STATUS, NULL, NULL); + } log_info("Loaded plugin: %s", name); return TRUE; } else { @@ -181,29 +187,30 @@ _get_plugins_dir(void) } void -_plugins_list_dir(const gchar *const dir, GSList **result) +_plugins_unloaded_list_dir(const gchar *const dir, GSList **result) { - GDir *plugins = g_dir_open(dir, 0, NULL); - if (plugins == NULL) { + GDir *plugins_dir = g_dir_open(dir, 0, NULL); + if (plugins_dir == NULL) { return; } - const gchar *plugin = g_dir_read_name(plugins); + const gchar *plugin = g_dir_read_name(plugins_dir); while (plugin) { - if (g_str_has_suffix(plugin, ".so") || g_str_has_suffix(plugin, ".py")) { + GSList *found = g_slist_find_custom(plugins, plugin, (GCompareFunc)_find_by_name); + if ((g_str_has_suffix(plugin, ".so") || g_str_has_suffix(plugin, ".py")) && !found) { *result = g_slist_append(*result, strdup(plugin)); } - plugin = g_dir_read_name(plugins); + plugin = g_dir_read_name(plugins_dir); } - g_dir_close(plugins); + g_dir_close(plugins_dir); } GSList* -plugins_file_list(void) +plugins_unloaded_list(void) { GSList *result = NULL; char *plugins_dir = _get_plugins_dir(); - _plugins_list_dir(plugins_dir, &result); + _plugins_unloaded_list_dir(plugins_dir, &result); free(plugins_dir); return result; diff --git a/src/plugins/plugins.h b/src/plugins/plugins.h index 85792674..d59bc280 100644 --- a/src/plugins/plugins.h +++ b/src/plugins/plugins.h @@ -47,7 +47,7 @@ typedef struct prof_plugin_t { lang_t lang; void *module; void (*init_func)(struct prof_plugin_t* plugin, const char * const version, - const char * const status); + const char * const status, const char *const account_name, const char *const fulljid); void (*on_start_func)(struct prof_plugin_t* plugin); void (*on_shutdown_func)(struct prof_plugin_t* plugin); @@ -99,7 +99,7 @@ typedef struct prof_plugin_t { void plugins_init(void); GSList* plugins_get_list(void); -GSList *plugins_file_list(void); +GSList *plugins_unloaded_list(void); char* plugins_autocomplete(const char *const input); void plugins_reset_autocomplete(void); void plugins_shutdown(void); diff --git a/src/plugins/python_plugins.c b/src/plugins/python_plugins.c index a73cc15b..7861f484 100644 --- a/src/plugins/python_plugins.c +++ b/src/plugins/python_plugins.c @@ -62,27 +62,17 @@ python_env_init(void) Py_Initialize(); PyEval_InitThreads(); python_api_init(); - GString *path = g_string_new(Py_GetPath()); - g_string_append(path, ":"); + GString *path = g_string_new("import sys\n"); + g_string_append(path, "sys.path.append(\""); gchar *plugins_dir = plugins_get_dir(); g_string_append(path, plugins_dir); - g_string_append(path, "/"); g_free(plugins_dir); + g_string_append(path, "/\")\n"); - PySys_SetPath(path->str); - g_string_free(path, TRUE); - - // add site packages paths - PyRun_SimpleString( - "import site\n" - "import sys\n" - "from distutils.sysconfig import get_python_lib\n" - "sys.path.append(get_python_lib())\n" - "for dir in site.getsitepackages():\n" - " sys.path.append(dir)\n" - ); + PyRun_SimpleString(path->str); + g_string_free(path, TRUE); allow_python_threads(); } @@ -138,10 +128,11 @@ python_plugin_create(const char *const filename) } void -python_init_hook(ProfPlugin *plugin, const char *const version, const char *const status) +python_init_hook(ProfPlugin *plugin, const char *const version, const char *const status, const char *const account_name, + const char *const fulljid) { disable_python_threads(); - PyObject *p_args = Py_BuildValue("ss", version, status); + PyObject *p_args = Py_BuildValue("ssss", version, status, account_name, fulljid); PyObject *p_function; PyObject *p_module = plugin->module; @@ -655,7 +646,7 @@ python_on_message_stanza_receive_hook(ProfPlugin *plugin, const char *const text PyObject *result = PyObject_CallObject(p_function, p_args); python_check_error(); Py_XDECREF(p_function); - if (PyBool_Check(result)) { + if (PyObject_IsTrue(result)) { allow_python_threads(); return TRUE; } else { @@ -720,7 +711,7 @@ python_on_presence_stanza_receive_hook(ProfPlugin *plugin, const char *const tex PyObject *result = PyObject_CallObject(p_function, p_args); python_check_error(); Py_XDECREF(p_function); - if (PyBool_Check(result)) { + if (PyObject_IsTrue(result)) { allow_python_threads(); return TRUE; } else { @@ -785,7 +776,7 @@ python_on_iq_stanza_receive_hook(ProfPlugin *plugin, const char *const text) PyObject *result = PyObject_CallObject(p_function, p_args); python_check_error(); Py_XDECREF(p_function); - if (PyBool_Check(result)) { + if (PyObject_IsTrue(result)) { allow_python_threads(); return TRUE; } else { diff --git a/src/plugins/python_plugins.h b/src/plugins/python_plugins.h index 6f81e2b8..71a62f1c 100644 --- a/src/plugins/python_plugins.h +++ b/src/plugins/python_plugins.h @@ -43,7 +43,8 @@ void python_check_error(void); void allow_python_threads(); void disable_python_threads(); -void python_init_hook(ProfPlugin *plugin, const char *const version, const char *const status); +void python_init_hook(ProfPlugin *plugin, const char *const version, const char *const status, + const char *const account_name, const char *const fulljid); void python_on_start_hook(ProfPlugin *plugin); void python_on_shutdown_hook(ProfPlugin *plugin); void python_on_connect_hook(ProfPlugin *plugin, const char *const account_name, const char *const fulljid); |