diff options
Diffstat (limited to 'src')
25 files changed, 208 insertions, 408 deletions
diff --git a/src/backend/meson.build b/src/backend/meson.build index b25453a..c8be5da 100644 --- a/src/backend/meson.build +++ b/src/backend/meson.build @@ -1,3 +1,13 @@ +backend_config_h = configuration_data() +backend_config_h.set('HAVE_CONFIG_ENV', get_option('config-env')) +backend_config_h.set('HAVE_CONFIG_GNOME', get_option('config-gnome')) +backend_config_h.set('HAVE_CONFIG_KDE', get_option('config-kde')) +backend_config_h.set('HAVE_CONFIG_OSX', get_option('config-osx') and with_platform_darwin) +backend_config_h.set('HAVE_CONFIG_SYSCONFIG', get_option('config-sysconfig')) +backend_config_h.set('HAVE_CONFIG_WINDOWS', get_option('config-windows') and with_platform_windows) +backend_config_h.set('HAVE_PACRUNNER_DUKTAPE', get_option('pacrunner-duktape')) +configure_file(output: 'px-backend-config.h', configuration: backend_config_h) + px_backend_sources = [ 'px-manager.c', 'px-manager.h', @@ -11,7 +21,7 @@ px_backend_deps = [ curl_dep, gio_dep, glib_dep, - peas_dep, + ws2_32_dep, ] px_backend_c_args = [ @@ -20,6 +30,8 @@ px_backend_c_args = [ px_backend_inc = include_directories('.') +subdir('plugins') + px_backend = shared_library( 'pxbackend-@0@'.format(api_version), px_backend_sources, @@ -33,5 +45,3 @@ px_backend_dep = declare_dependency( link_with: px_backend, dependencies: px_backend_deps ) - -subdir('plugins')
\ No newline at end of file diff --git a/src/backend/plugins/config-env/config-env.c b/src/backend/plugins/config-env/config-env.c index d7f5a73..6a326e0 100644 --- a/src/backend/plugins/config-env/config-env.c +++ b/src/backend/plugins/config-env/config-env.c @@ -19,7 +19,7 @@ * SPDX-License-Identifier: LGPL-2.1-or-later */ -#include <libpeas/peas.h> +#include <gio/gio.h> #include "config-env.h" @@ -27,7 +27,6 @@ #include "px-plugin-config.h" static void px_config_iface_init (PxConfigInterface *iface); -G_MODULE_EXPORT void peas_register_types (PeasObjectModule *module); struct _PxConfigEnv { GObject parent_instance; @@ -161,14 +160,8 @@ px_config_env_get_config (PxConfig *config, static void px_config_iface_init (PxConfigInterface *iface) { + iface->name = "config-env"; + iface->priority = PX_CONFIG_PRIORITY_FIRST; iface->is_available = px_config_env_is_available; iface->get_config = px_config_env_get_config; } - -G_MODULE_EXPORT void -peas_register_types (PeasObjectModule *module) -{ - peas_object_module_register_extension_type (module, - PX_TYPE_CONFIG, - PX_CONFIG_TYPE_ENV); -} diff --git a/src/backend/plugins/config-env/config-env.plugin b/src/backend/plugins/config-env/config-env.plugin deleted file mode 100644 index 2dfbdf3..0000000 --- a/src/backend/plugins/config-env/config-env.plugin +++ /dev/null @@ -1,3 +0,0 @@ -[Plugin] -Module=config-env -Name=Environment Variables
\ No newline at end of file diff --git a/src/backend/plugins/config-env/meson.build b/src/backend/plugins/config-env/meson.build index 471ecc0..00f3cc3 100644 --- a/src/backend/plugins/config-env/meson.build +++ b/src/backend/plugins/config-env/meson.build @@ -2,33 +2,8 @@ plugin_name = 'config-env' if get_option(plugin_name) -plugin_src = [ - '@0@.c'.format(plugin_name), +px_backend_sources += [ + 'plugins/@0@/@0@.c'.format(plugin_name), ] -plugin_data = [ - '@0@.plugin'.format(plugin_name), -] - -plugin_lib = shared_module( - plugin_name, - sources: plugin_src, - include_directories: px_backend_inc, - c_args: px_backend_c_args, - dependencies: [px_backend_dep], - install_dir: join_paths(px_plugins_dir, plugin_name), - install: true, - name_suffix: module_suffix, -) - -# Starting with Meson 0.64 this can be replaced with fs.copyfile -custom_target( - '@0@-data'.format(plugin_name), - input: plugin_data, - output: plugin_data, - command: ['cp', '@INPUT@', '@OUTDIR@'], - install_dir: join_paths(px_plugins_dir, plugin_name), - install: true, -) - endif
\ No newline at end of file diff --git a/src/backend/plugins/config-gnome/config-gnome.c b/src/backend/plugins/config-gnome/config-gnome.c index 426769c..29cb34a 100644 --- a/src/backend/plugins/config-gnome/config-gnome.c +++ b/src/backend/plugins/config-gnome/config-gnome.c @@ -19,7 +19,7 @@ * SPDX-License-Identifier: LGPL-2.1-or-later */ -#include <libpeas/peas.h> +#include <gio/gio.h> #include "config-gnome.h" @@ -43,7 +43,6 @@ typedef enum { } GnomeProxyMode; static void px_config_iface_init (PxConfigInterface *iface); -void peas_register_types (PeasObjectModule *module); G_DEFINE_FINAL_TYPE_WITH_CODE (PxConfigGnome, px_config_gnome, @@ -173,6 +172,9 @@ px_config_gnome_get_config (PxConfig *config, g_autofree char *proxy = NULL; GnomeProxyMode mode; + if (!self->available) + return; + if (px_manager_is_ignore (uri, g_settings_get_strv (self->proxy_settings, "ignore-hosts"))) return; @@ -235,14 +237,8 @@ px_config_gnome_get_config (PxConfig *config, static void px_config_iface_init (PxConfigInterface *iface) { + iface->name = "config-gnome"; + iface->priority = PX_CONFIG_PRIORITY_DEFAULT; iface->is_available = px_config_gnome_is_available; iface->get_config = px_config_gnome_get_config; } - -void -peas_register_types (PeasObjectModule *module) -{ - peas_object_module_register_extension_type (module, - PX_TYPE_CONFIG, - PX_CONFIG_TYPE_GNOME); -} diff --git a/src/backend/plugins/config-gnome/config-gnome.plugin b/src/backend/plugins/config-gnome/config-gnome.plugin deleted file mode 100644 index 5121ceb..0000000 --- a/src/backend/plugins/config-gnome/config-gnome.plugin +++ /dev/null @@ -1,3 +0,0 @@ -[Plugin] -Module=config-gnome -Name=GNOME Settings
\ No newline at end of file diff --git a/src/backend/plugins/config-gnome/meson.build b/src/backend/plugins/config-gnome/meson.build index 08acc1c..e6a9b20 100644 --- a/src/backend/plugins/config-gnome/meson.build +++ b/src/backend/plugins/config-gnome/meson.build @@ -2,33 +2,8 @@ plugin_name = 'config-gnome' if get_option(plugin_name) -plugin_src = [ - '@0@.c'.format(plugin_name), +px_backend_sources += [ + 'plugins/@0@/@0@.c'.format(plugin_name), ] -plugin_data = [ - '@0@.plugin'.format(plugin_name), -] - -plugin_lib = shared_module( - plugin_name, - plugin_src, - include_directories: px_backend_inc, - c_args: px_backend_c_args, - dependencies: [peas_dep, px_backend_dep], - install_dir: join_paths(px_plugins_dir, plugin_name), - install: true, - name_suffix: module_suffix, -) - -# Starting with Meson 0.64 this can be replaced with fs.copyfile -custom_target( - '@0@-data'.format(plugin_name), - input: plugin_data, - output: plugin_data, - command: ['cp', '@INPUT@', '@OUTDIR@'], - install_dir: join_paths(px_plugins_dir, plugin_name), - install: true, -) - endif
\ No newline at end of file diff --git a/src/backend/plugins/config-kde/config-kde.c b/src/backend/plugins/config-kde/config-kde.c index 56c83c0..d0e8ad8 100644 --- a/src/backend/plugins/config-kde/config-kde.c +++ b/src/backend/plugins/config-kde/config-kde.c @@ -19,7 +19,7 @@ * SPDX-License-Identifier: LGPL-2.1-or-later */ -#include <libpeas/peas.h> +#include <gio/gio.h> #include "config-kde.h" @@ -27,7 +27,6 @@ #include "px-manager.h" static void px_config_iface_init (PxConfigInterface *iface); -G_MODULE_EXPORT void peas_register_types (PeasObjectModule *module); typedef enum { KDE_PROXY_TYPE_NONE = 0, @@ -256,6 +255,9 @@ px_config_kde_get_config (PxConfig *config, const char *scheme = g_uri_get_scheme (uri); g_autofree char *proxy = NULL; + if (!self->available) + return; + if (!self->proxy_type) return; @@ -293,14 +295,8 @@ px_config_kde_get_config (PxConfig *config, static void px_config_iface_init (PxConfigInterface *iface) { + iface->name = "config-kde"; + iface->priority = PX_CONFIG_PRIORITY_DEFAULT; iface->is_available = px_config_kde_is_available; iface->get_config = px_config_kde_get_config; } - -G_MODULE_EXPORT void -peas_register_types (PeasObjectModule *module) -{ - peas_object_module_register_extension_type (module, - PX_TYPE_CONFIG, - PX_CONFIG_TYPE_KDE); -} diff --git a/src/backend/plugins/config-kde/config-kde.plugin b/src/backend/plugins/config-kde/config-kde.plugin deleted file mode 100644 index d03d2a8..0000000 --- a/src/backend/plugins/config-kde/config-kde.plugin +++ /dev/null @@ -1,3 +0,0 @@ -[Plugin] -Module=config-kde -Name=KDE
\ No newline at end of file diff --git a/src/backend/plugins/config-kde/meson.build b/src/backend/plugins/config-kde/meson.build index ef4adfe..b34d78d 100644 --- a/src/backend/plugins/config-kde/meson.build +++ b/src/backend/plugins/config-kde/meson.build @@ -2,33 +2,8 @@ plugin_name = 'config-kde' if get_option(plugin_name) -plugin_src = [ - '@0@.c'.format(plugin_name), +px_backend_sources += [ + 'plugins/@0@/@0@.c'.format(plugin_name), ] -plugin_data = [ - '@0@.plugin'.format(plugin_name), -] - -plugin_lib = shared_module( - plugin_name, - sources: plugin_src, - include_directories: px_backend_inc, - c_args: px_backend_c_args, - dependencies: [px_backend_dep], - install_dir: join_paths(px_plugins_dir, plugin_name), - install: true, - name_suffix: module_suffix, -) - -# Starting with Meson 0.64 this can be replaced with fs.copyfile -custom_target( - '@0@-data'.format(plugin_name), - input: plugin_data, - output: plugin_data, - command: ['cp', '@INPUT@', '@OUTDIR@'], - install_dir: join_paths(px_plugins_dir, plugin_name), - install: true, -) - endif
\ No newline at end of file diff --git a/src/backend/plugins/config-osx/config-osx.c b/src/backend/plugins/config-osx/config-osx.c index 8a9e6e4..16813a0 100644 --- a/src/backend/plugins/config-osx/config-osx.c +++ b/src/backend/plugins/config-osx/config-osx.c @@ -19,16 +19,20 @@ * SPDX-License-Identifier: LGPL-2.1-or-later */ -#include <libpeas/peas.h> #include <SystemConfiguration/SystemConfiguration.h> +#include <gio/gio.h> + #include "config-osx.h" #include "px-plugin-config.h" #include "px-manager.h" static void px_config_iface_init (PxConfigInterface *iface); -G_MODULE_EXPORT void peas_register_types (PeasObjectModule *module); + +struct _PxConfigOsX { + GObject parent_instance; +}; G_DEFINE_FINAL_TYPE_WITH_CODE (PxConfigOsX, px_config_osx, @@ -330,14 +334,8 @@ px_config_osx_get_config (PxConfig *self, static void px_config_iface_init (PxConfigInterface *iface) { + iface->name = "config-osx"; + iface->priority = PX_CONFIG_PRIORITY_DEFAULT; iface->is_available = px_config_osx_is_available; iface->get_config = px_config_osx_get_config; } - -G_MODULE_EXPORT void -peas_register_types (PeasObjectModule *module) -{ - peas_object_module_register_extension_type (module, - PX_TYPE_CONFIG, - PX_CONFIG_TYPE_OSX); -} diff --git a/src/backend/plugins/config-osx/config-osx.h b/src/backend/plugins/config-osx/config-osx.h index 544329f..797b51e 100644 --- a/src/backend/plugins/config-osx/config-osx.h +++ b/src/backend/plugins/config-osx/config-osx.h @@ -22,7 +22,6 @@ #pragma once #include <glib.h> -#include <libpeas/peas.h> G_BEGIN_DECLS @@ -30,10 +29,6 @@ G_BEGIN_DECLS G_DECLARE_FINAL_TYPE (PxConfigOsX, px_config_osx, PX, CONFIG_OSX, GObject) -struct _PxConfigOsX { - GObject parent_instance; -}; - G_END_DECLS diff --git a/src/backend/plugins/config-osx/config-osx.plugin b/src/backend/plugins/config-osx/config-osx.plugin deleted file mode 100644 index 61c4a2a..0000000 --- a/src/backend/plugins/config-osx/config-osx.plugin +++ /dev/null @@ -1,3 +0,0 @@ -[Plugin] -Module=config-osx -Name=OS X
\ No newline at end of file diff --git a/src/backend/plugins/config-osx/meson.build b/src/backend/plugins/config-osx/meson.build index eac98e8..f801d90 100644 --- a/src/backend/plugins/config-osx/meson.build +++ b/src/backend/plugins/config-osx/meson.build @@ -1,39 +1,16 @@ plugin_name = 'config-osx' -if host_machine.system() == 'darwin' +if get_option(plugin_name) and with_platform_darwin -if get_option(plugin_name) - -plugin_src = [ - '@0@.c'.format(plugin_name), +foundation_dep = dependency('Foundation') +system_configuration_dep = dependency('SystemConfiguration') +px_backend_deps += [ + foundation_dep, + system_configuration_dep, ] -plugin_data = [ - '@0@.plugin'.format(plugin_name), +px_backend_sources += [ + 'plugins/@0@/@0@.c'.format(plugin_name), ] -plugin_lib = shared_module( - plugin_name, - plugin_src, - include_directories: px_backend_inc, - c_args: px_backend_c_args, - dependencies: [px_backend_dep], - install_dir: join_paths(px_plugins_dir, plugin_name), - install: true, - name_suffix: module_suffix -) - -# Starting with Meson 0.64 this can be replaced with fs.copyfile -custom_target( - '@0@-data'.format(plugin_name), - input: plugin_data, - output: plugin_data, - command: ['cp', '@INPUT@', '@OUTDIR@'], - build_by_default: true, - install_dir: join_paths(px_plugins_dir, plugin_name), - install: true, -) - -endif - endif diff --git a/src/backend/plugins/config-sysconfig/config-sysconfig.c b/src/backend/plugins/config-sysconfig/config-sysconfig.c index 1adc1e8..c640f1c 100644 --- a/src/backend/plugins/config-sysconfig/config-sysconfig.c +++ b/src/backend/plugins/config-sysconfig/config-sysconfig.c @@ -19,7 +19,7 @@ * SPDX-License-Identifier: LGPL-2.1-or-later */ -#include <libpeas/peas.h> +#include <gio/gio.h> #include "config-sysconfig.h" @@ -41,7 +41,6 @@ struct _PxConfigSysConfig { }; static void px_config_iface_init (PxConfigInterface *iface); -G_MODULE_EXPORT void peas_register_types (PeasObjectModule *module); G_DEFINE_FINAL_TYPE_WITH_CODE (PxConfigSysConfig, px_config_sysconfig, @@ -246,14 +245,8 @@ px_config_sysconfig_get_config (PxConfig *config, static void px_config_iface_init (PxConfigInterface *iface) { + iface->name = "config-sysconfig"; + iface->priority = PX_CONFIG_PRIORITY_LAST; iface->is_available = px_config_sysconfig_is_available; iface->get_config = px_config_sysconfig_get_config; } - -G_MODULE_EXPORT void -peas_register_types (PeasObjectModule *module) -{ - peas_object_module_register_extension_type (module, - PX_TYPE_CONFIG, - PX_CONFIG_TYPE_SYSCONFIG); -} diff --git a/src/backend/plugins/config-sysconfig/config-sysconfig.plugin b/src/backend/plugins/config-sysconfig/config-sysconfig.plugin deleted file mode 100644 index 0697fa2..0000000 --- a/src/backend/plugins/config-sysconfig/config-sysconfig.plugin +++ /dev/null @@ -1,3 +0,0 @@ -[Plugin] -Module=config-sysconfig -Name=sysconfig
\ No newline at end of file diff --git a/src/backend/plugins/config-sysconfig/meson.build b/src/backend/plugins/config-sysconfig/meson.build index 1aef00b..6d6789b 100644 --- a/src/backend/plugins/config-sysconfig/meson.build +++ b/src/backend/plugins/config-sysconfig/meson.build @@ -2,34 +2,8 @@ plugin_name = 'config-sysconfig' if get_option(plugin_name) -plugin_src = [ - '@0@.c'.format(plugin_name), +px_backend_sources += [ + 'plugins/@0@/@0@.c'.format(plugin_name), ] -plugin_data = [ - '@0@.plugin'.format(plugin_name), -] - -plugin_lib = shared_module( - plugin_name, - plugin_src, - include_directories: px_backend_inc, - c_args: px_backend_c_args, - dependencies: [px_backend_dep], - install_dir: join_paths(px_plugins_dir, plugin_name), - install: true, - name_suffix: module_suffix, -) - -# Starting with Meson 0.64 this can be replaced with fs.copyfile -custom_target( - '@0@-data'.format(plugin_name), - input: plugin_data, - output: plugin_data, - command: ['cp', '@INPUT@', '@OUTDIR@'], - build_by_default: true, - install_dir: join_paths(px_plugins_dir, plugin_name), - install: true, -) - endif diff --git a/src/backend/plugins/config-windows/config-windows.c b/src/backend/plugins/config-windows/config-windows.c index 5bffde6..cc9c92d 100644 --- a/src/backend/plugins/config-windows/config-windows.c +++ b/src/backend/plugins/config-windows/config-windows.c @@ -21,7 +21,8 @@ #include <windows.h> #include <winreg.h> -#include <libpeas/peas.h> + +#include <gio/gio.h> #include "config-windows.h" @@ -38,7 +39,6 @@ struct _PxConfigWindows { }; static void px_config_iface_init (PxConfigInterface *iface); -void peas_register_types (PeasObjectModule *module); G_DEFINE_FINAL_TYPE_WITH_CODE (PxConfigWindows, px_config_windows, @@ -245,14 +245,8 @@ px_config_windows_get_config (PxConfig *self, static void px_config_iface_init (PxConfigInterface *iface) { + iface->name = "config-windows"; + iface->priority = PX_CONFIG_PRIORITY_DEFAULT; iface->is_available = px_config_windows_is_available; iface->get_config = px_config_windows_get_config; } - -G_MODULE_EXPORT void -peas_register_types (PeasObjectModule *module) -{ - peas_object_module_register_extension_type (module, - PX_TYPE_CONFIG, - PX_CONFIG_TYPE_WINDOWS); -} diff --git a/src/backend/plugins/config-windows/config-windows.plugin b/src/backend/plugins/config-windows/config-windows.plugin deleted file mode 100644 index 04a589b..0000000 --- a/src/backend/plugins/config-windows/config-windows.plugin +++ /dev/null @@ -1,3 +0,0 @@ -[Plugin] -Module=config-windows -Name=Windows
\ No newline at end of file diff --git a/src/backend/plugins/config-windows/meson.build b/src/backend/plugins/config-windows/meson.build index 2e592b5..302a33e 100644 --- a/src/backend/plugins/config-windows/meson.build +++ b/src/backend/plugins/config-windows/meson.build @@ -1,39 +1,9 @@ plugin_name = 'config-windows' -if host_machine.system() == 'windows' +if get_option(plugin_name) and with_platform_windows -if get_option(plugin_name) - -plugin_src = [ - '@0@.c'.format(plugin_name), -] - -plugin_data = [ - '@0@.plugin'.format(plugin_name), +px_backend_sources += [ + 'plugins/@0@/@0@.c'.format(plugin_name), ] -plugin_lib = shared_module( - plugin_name, - plugin_src, - include_directories: px_backend_inc, - c_args: px_backend_c_args, - dependencies: [px_backend_dep], - install_dir: join_paths(px_plugins_dir, plugin_name), - install: true, - name_suffix: module_suffix, -) - -# Starting with Meson 0.64 this can be replaced with fs.copyfile -custom_target( - '@0@-data'.format(plugin_name), - input: plugin_data, - output: plugin_data, - command: ['cp', '@INPUT@', '@OUTDIR@'], - build_by_default: true, - install_dir: join_paths(px_plugins_dir, plugin_name), - install: true, -) - -endif - endif
\ No newline at end of file diff --git a/src/backend/plugins/pacrunner-duktape/meson.build b/src/backend/plugins/pacrunner-duktape/meson.build index ef4a470..f391b6d 100644 --- a/src/backend/plugins/pacrunner-duktape/meson.build +++ b/src/backend/plugins/pacrunner-duktape/meson.build @@ -3,35 +3,15 @@ plugin_name = 'pacrunner-duktape' if get_option(plugin_name) duktape_dep = dependency('duktape') +m_dep = cc.find_library('m', required : false) -plugin_src = [ - '@0@.c'.format(plugin_name), +px_backend_sources += [ + 'plugins/@0@/@0@.c'.format(plugin_name), ] -plugin_data = [ - '@0@.plugin'.format(plugin_name), +px_backend_deps += [ + duktape_dep, + m_dep ] -plugin_lib = shared_module( - plugin_name, - plugin_src, - include_directories: px_backend_inc, - c_args: px_backend_c_args, - dependencies: [px_backend_dep, duktape_dep, ws2_32_dep], - install_dir: join_paths(px_plugins_dir, plugin_name), - install: true, - name_suffix: module_suffix, -) - -# Starting with Meson 0.64 this can be replaced with fs.copyfile -custom_target( - '@0@-data'.format(plugin_name), - input: plugin_data, - output: plugin_data, - command: ['cp', '@INPUT@', '@OUTDIR@'], - build_by_default: true, - install_dir: join_paths(px_plugins_dir, plugin_name), - install: true, -) - endif
\ No newline at end of file diff --git a/src/backend/plugins/pacrunner-duktape/pacrunner-duktape.c b/src/backend/plugins/pacrunner-duktape/pacrunner-duktape.c index 51c2592..3676e48 100644 --- a/src/backend/plugins/pacrunner-duktape/pacrunner-duktape.c +++ b/src/backend/plugins/pacrunner-duktape/pacrunner-duktape.c @@ -19,7 +19,7 @@ * SPDX-License-Identifier: LGPL-2.1-or-later */ -#include <libpeas/peas.h> +#include <gio/gio.h> #include <unistd.h> #ifdef __WIN32__ @@ -40,7 +40,6 @@ struct _PxPacRunnerDuktape { }; static void px_pacrunner_iface_init (PxPacRunnerInterface *iface); -void peas_register_types (PeasObjectModule *module); G_DEFINE_FINAL_TYPE_WITH_CODE (PxPacRunnerDuktape, px_pacrunner_duktape, @@ -200,11 +199,3 @@ px_pacrunner_iface_init (PxPacRunnerInterface *iface) iface->set_pac = px_pacrunner_duktape_set_pac; iface->run = px_pacrunner_duktape_run; } - -void -peas_register_types (PeasObjectModule *module) -{ - peas_object_module_register_extension_type (module, - PX_TYPE_PACRUNNER, - PX_PACRUNNER_TYPE_DUKTAPE); -} diff --git a/src/backend/plugins/pacrunner-duktape/pacrunner-duktape.plugin b/src/backend/plugins/pacrunner-duktape/pacrunner-duktape.plugin deleted file mode 100644 index efb10f0..0000000 --- a/src/backend/plugins/pacrunner-duktape/pacrunner-duktape.plugin +++ /dev/null @@ -1,3 +0,0 @@ -[Plugin] -Module=pacrunner-duktape -Name=Duktape
\ No newline at end of file diff --git a/src/backend/px-manager.c b/src/backend/px-manager.c index ecc477e..1eab303 100644 --- a/src/backend/px-manager.c +++ b/src/backend/px-manager.c @@ -20,19 +20,50 @@ */ #include "config.h" +#include "px-backend-config.h" + +#include <glib.h> +#include <glib-object.h> +#include <gio/gio.h> #include "px-manager.h" #include "px-plugin-config.h" #include "px-plugin-pacrunner.h" +#ifdef HAVE_CONFIG_ENV +#include <plugins/config-env/config-env.h> +#endif + +#ifdef HAVE_CONFIG_GNOME +#include <plugins/config-gnome/config-gnome.h> +#endif + +#ifdef HAVE_CONFIG_KDE +#include <plugins/config-kde/config-kde.h> +#endif + +#ifdef HAVE_CONFIG_OSX +#include <plugins/config-osx/config-osx.h> +#endif + +#ifdef HAVE_CONFIG_SYSCONFIG +#include <plugins/config-sysconfig/config-sysconfig.h> +#endif + +#ifdef HAVE_CONFIG_WINDOWS +#include <plugins/config-windows/config-windows.h> +#endif + +#ifdef HAVE_PACRUNNER_DUKTAPE +#include <plugins/pacrunner-duktape/pacrunner-duktape.h> +#endif + #ifdef HAVE_CURL #include <curl/curl.h> #endif -#include <libpeas/peas.h> enum { PROP_0, - PROP_PLUGINS_DIR, PROP_CONFIG_PLUGIN, PROP_CONFIG_OPTION, LAST_PROP @@ -48,14 +79,12 @@ static GParamSpec *obj_properties[LAST_PROP]; struct _PxManager { GObject parent_instance; - PeasEngine *engine; - PeasExtensionSet *config_set; - PeasExtensionSet *pacrunner_set; + GList *config_plugins; + GList *pacrunner_plugins; GNetworkMonitor *network_monitor; #ifdef HAVE_CURL CURL *curl; #endif - char *plugins_dir; char *config_plugin; char *config_option; @@ -85,11 +114,48 @@ px_manager_on_network_changed (GNetworkMonitor *monitor, g_clear_pointer (&self->pac_data, g_bytes_unref); } +static gint +config_order_compare (gconstpointer a, + gconstpointer b) +{ + PxConfig *config_a = (PxConfig *)a; + PxConfig *config_b = (PxConfig *)b; + PxConfigInterface *ifc_a = PX_CONFIG_GET_IFACE (config_a); + PxConfigInterface *ifc_b = PX_CONFIG_GET_IFACE (config_b); + + if (ifc_a->priority < ifc_b->priority) + return -1; + + if (ifc_a->priority == ifc_b->priority) + return 0; + + return 1; +} + +static void +px_manager_add_config_plugin (PxManager *self, + GType type) +{ + PxConfig *config = g_object_new (type, "config-option", self->config_option, NULL); + PxConfigInterface *ifc = PX_CONFIG_GET_IFACE (config); + + if (!self->config_plugin || g_strcmp0 (ifc->name, self->config_plugin) == 0) + self->config_plugins = g_list_insert_sorted (self->config_plugins, config, config_order_compare); +} + +static void +px_manager_add_pacrunner_plugin (PxManager *self, + GType type) +{ + PxPacRunner *pacrunner = g_object_new (type, NULL); + + self->pacrunner_plugins = g_list_append (self->pacrunner_plugins, pacrunner); +} + static void px_manager_constructed (GObject *object) { PxManager *self = PX_MANAGER (object); - const GList *list; if (g_getenv ("PX_DEBUG")) { const gchar *g_messages_debug; @@ -107,38 +173,37 @@ px_manager_constructed (GObject *object) } } - self->engine = peas_engine_get_default (); - - peas_engine_add_search_path (self->engine, self->plugins_dir, NULL); - - self->config_set = peas_extension_set_new (self->engine, PX_TYPE_CONFIG, "config-option", self->config_option, NULL); - self->pacrunner_set = peas_extension_set_new (self->engine, PX_TYPE_PACRUNNER, NULL); - - list = peas_engine_get_plugin_list (self->engine); - for (; list && list->data; list = list->next) { - PeasPluginInfo *info = PEAS_PLUGIN_INFO (list->data); - PeasExtension *extension = peas_extension_set_get_extension (self->config_set, info); - gboolean available = TRUE; - - /* In case user requested a specific module, just load that one */ - if (self->config_plugin && g_str_has_prefix (peas_plugin_info_get_module_name (info), "config-")) { - if (g_strcmp0 (peas_plugin_info_get_module_name (info), self->config_plugin) == 0) - peas_engine_load_plugin (self->engine, info); - } else { - peas_engine_load_plugin (self->engine, info); - } - - extension = peas_extension_set_get_extension (self->config_set, info); - if (extension) { - PxConfigInterface *ifc = PX_CONFIG_GET_IFACE (extension); +#ifdef HAVE_CONFIG_ENV + px_manager_add_config_plugin (self, PX_CONFIG_TYPE_ENV); +#endif +#ifdef HAVE_CONFIG_GNOME + px_manager_add_config_plugin (self, PX_CONFIG_TYPE_GNOME); +#endif +#ifdef HAVE_CONFIG_KDE + px_manager_add_config_plugin (self, PX_CONFIG_TYPE_KDE); +#endif +#ifdef HAVE_CONFIG_OSX + px_manager_add_config_plugin (self, PX_CONFIG_TYPE_OSX); +#endif +#ifdef HAVE_CONFIG_SYSCONFIG + px_manager_add_config_plugin (self, PX_CONFIG_TYPE_SYSCONFIG); +#endif +#ifdef HAVE_CONFIG_WINDOWS + px_manager_add_config_plugin (self, PX_CONFIG_TYPE_WINDOWS); +#endif - available = ifc->is_available (PX_CONFIG (extension)); - } + g_debug ("Active config plugins:\n"); + for (GList *list = self->config_plugins; list && list->data; list = list->next) { + PxConfig *config = list->data; + PxConfigInterface *ifc = PX_CONFIG_GET_IFACE (config); - if (!available) - peas_engine_unload_plugin (self->engine, info); + g_debug (" - %s\n", ifc->name); } +#ifdef HAVE_PACRUNNER_DUKTAPE + px_manager_add_pacrunner_plugin (self, PX_PACRUNNER_TYPE_DUKTAPE); +#endif + self->pac_data = NULL; self->network_monitor = g_network_monitor_get_default (); @@ -151,19 +216,14 @@ static void px_manager_dispose (GObject *object) { PxManager *self = PX_MANAGER (object); - const GList *list; - list = peas_engine_get_plugin_list (self->engine); - for (; list && list->data; list = list->next) { - PeasPluginInfo *info = PEAS_PLUGIN_INFO (list->data); + for (GList *list = self->config_plugins; list && list->data; list = list->next) + g_clear_object (&list->data); - if (peas_plugin_info_is_loaded (info)) - peas_engine_unload_plugin (self->engine, info); - } + for (GList *list = self->pacrunner_plugins; list && list->data; list = list->next) + g_clear_object (&list->data); g_clear_pointer (&self->config_plugin, g_free); - g_clear_pointer (&self->plugins_dir, g_free); - g_clear_object (&self->engine); G_OBJECT_CLASS (px_manager_parent_class)->dispose (object); } @@ -177,9 +237,6 @@ px_manager_set_property (GObject *object, PxManager *self = PX_MANAGER (object); switch (prop_id) { - case PROP_PLUGINS_DIR: - self->plugins_dir = g_strdup (g_value_get_string (value)); - break; case PROP_CONFIG_PLUGIN: self->config_plugin = g_strdup (g_value_get_string (value)); break; @@ -198,8 +255,6 @@ px_manager_get_property (GObject *object, GParamSpec *pspec) { switch (prop_id) { - case PROP_PLUGINS_DIR: - break; case PROP_CONFIG_PLUGIN: break; default: @@ -218,12 +273,6 @@ px_manager_class_init (PxManagerClass *klass) object_class->set_property = px_manager_set_property; object_class->get_property = px_manager_get_property; - obj_properties[PROP_PLUGINS_DIR] = g_param_spec_string ("plugins-dir", - NULL, - NULL, - NULL, - G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS); - obj_properties[PROP_CONFIG_PLUGIN] = g_param_spec_string ("config-plugin", NULL, NULL, @@ -277,7 +326,7 @@ px_manager_new_with_options (const char *optname1, PxManager * px_manager_new (void) { - return px_manager_new_with_options ("plugins-dir", PX_PLUGINS_DIR, NULL); + return px_manager_new_with_options (NULL); } #ifdef HAVE_CURL @@ -345,29 +394,6 @@ px_manager_pac_download (PxManager *self, #endif } -struct ConfigData { - GStrvBuilder *builder; - GUri *uri; -}; - -/** - * Strategy: - * - Traverse through all plugins in extension set and ask for configuration data. - * - A plugin can either return the proxy server for given uri OR nothing! for direc access. - */ -static void -get_config (PeasExtensionSet *set, - PeasPluginInfo *info, - PeasExtension *extension, - gpointer data) -{ - PxConfigInterface *ifc = PX_CONFIG_GET_IFACE (extension); - struct ConfigData *config_data = data; - - g_debug ("%s: Asking plugin '%s' for configuration", __FUNCTION__, peas_plugin_info_get_module_name (info)); - ifc->get_config (PX_CONFIG (extension), config_data->uri, config_data->builder); -} - /** * px_manager_get_configuration: * @self: a px manager @@ -384,37 +410,31 @@ px_manager_get_configuration (PxManager *self, GError **error) { g_autoptr (GStrvBuilder) builder = g_strv_builder_new (); - struct ConfigData config_data = { - .uri = uri, - .builder = builder, - }; - peas_extension_set_foreach (self->config_set, get_config, &config_data); + for (GList *list = self->config_plugins; list && list->data; list = list->next) { + PxConfig *config = PX_CONFIG (list->data); + PxConfigInterface *ifc = PX_CONFIG_GET_IFACE (config); + + ifc->get_config (config, uri, builder); + } return g_strv_builder_end (builder); } -struct PacData { - GBytes *pac; - GUri *uri; - GStrvBuilder *builder; -}; - static void -px_manager_run_pac (PeasExtensionSet *set, - PeasPluginInfo *info, - PeasExtension *extension, - gpointer data) +px_manager_run_pac (PxPacRunner *pacrunner, + GBytes *pac, + GUri *uri, + GStrvBuilder *builder) { - PxPacRunnerInterface *ifc = PX_PAC_RUNNER_GET_IFACE (extension); - struct PacData *pac_data = data; + PxPacRunnerInterface *ifc = PX_PAC_RUNNER_GET_IFACE (pacrunner); g_auto (GStrv) proxies_split = NULL; char *pac_response; - if (!ifc->set_pac (PX_PAC_RUNNER (extension), pac_data->pac)) + if (!ifc->set_pac (PX_PAC_RUNNER (pacrunner), pac)) return; - pac_response = ifc->run (PX_PAC_RUNNER (extension), pac_data->uri); + pac_response = ifc->run (PX_PAC_RUNNER (pacrunner), uri); /* Split line to handle multiple proxies */ proxies_split = g_strsplit (pac_response, ";", -1); @@ -422,7 +442,7 @@ px_manager_run_pac (PeasExtensionSet *set, for (int idx = 0; idx < g_strv_length (proxies_split); idx++) { char *line = g_strstrip (proxies_split[idx]); g_auto (GStrv) word_split = g_strsplit (line, " ", -1); - g_autoptr (GUri) uri = NULL; + g_autoptr (GUri) proxy_uri = NULL; char *method; char *server; @@ -435,12 +455,12 @@ px_manager_run_pac (PeasExtensionSet *set, server = word_split[1]; uri_string = g_strconcat ("http://", server, NULL); - uri = g_uri_parse (uri_string, G_URI_FLAGS_PARSE_RELAXED, NULL); - if (!uri) + proxy_uri = g_uri_parse (uri_string, G_URI_FLAGS_PARSE_RELAXED, NULL); + if (!proxy_uri) continue; if (g_ascii_strncasecmp (method, "proxy", 5) == 0) { - proxy_string = g_uri_to_string (uri); + proxy_string = g_uri_to_string (proxy_uri); } else if (g_ascii_strncasecmp (method, "socks4a", 7) == 0) { proxy_string = g_strconcat ("socks4a://", server, NULL); } else if (g_ascii_strncasecmp (method, "socks4", 6) == 0) { @@ -451,10 +471,10 @@ px_manager_run_pac (PeasExtensionSet *set, proxy_string = g_strconcat ("socks://", server, NULL); } - px_strv_builder_add_proxy (pac_data->builder, proxy_string); + px_strv_builder_add_proxy (builder, proxy_string); } else { /* Syntax not found, returning direct */ - px_strv_builder_add_proxy (pac_data->builder, "direct://"); + px_strv_builder_add_proxy (builder, "direct://"); } } } @@ -562,12 +582,13 @@ px_manager_get_proxies_sync (PxManager *self, g_debug ("%s: Config[%d] = %s", __FUNCTION__, idx, config[idx]); if (px_manager_expand_wpad (self, conf_url) || px_manager_expand_pac (self, conf_url)) { - struct PacData pac_data = { - .pac = self->pac_data, - .uri = uri, - .builder = builder, - }; - peas_extension_set_foreach (self->pacrunner_set, px_manager_run_pac, &pac_data); + GList *list; + + for (list = self->pacrunner_plugins; list && list->data; list = list->next) { + PxPacRunner *pacrunner = PX_PAC_RUNNER (list->data); + + px_manager_run_pac (pacrunner, self->pac_data, uri, builder); + } } else if (!g_str_has_prefix (g_uri_get_scheme (conf_url), "wpad") && !g_str_has_prefix (g_uri_get_scheme (conf_url), "pac+")) { px_strv_builder_add_proxy (builder, g_uri_to_string (conf_url)); } diff --git a/src/backend/px-plugin-config.h b/src/backend/px-plugin-config.h index aac62a0..6958df6 100644 --- a/src/backend/px-plugin-config.h +++ b/src/backend/px-plugin-config.h @@ -29,9 +29,17 @@ G_BEGIN_DECLS G_DECLARE_INTERFACE (PxConfig, px_config, PX, CONFIG, GObject) +enum { + PX_CONFIG_PRIORITY_FIRST, + PX_CONFIG_PRIORITY_DEFAULT, + PX_CONFIG_PRIORITY_LAST, +}; + struct _PxConfigInterface { GTypeInterface parent_iface; + const char *name; + gint priority; gboolean (*is_available) (PxConfig *self); void (*get_config) (PxConfig *self, GUri *uri, GStrvBuilder *builder); |