GSList * vpn_get_plugin_infos (void) { static gboolean plugins_loaded = FALSE; static GSList *plugins = NULL; GSList *p; if (G_LIKELY (plugins_loaded)) return plugins; plugins_loaded = TRUE; p = nm_vpn_plugin_info_list_load (); plugins = NULL; while (p) { NMVpnPluginInfo *plugin_info = NM_VPN_PLUGIN_INFO (p->data); GError *error = NULL; /* load the editor plugin, and preserve only those NMVpnPluginInfo that can * successfully load the plugin. */ if (nm_vpn_plugin_info_load_editor_plugin (plugin_info, &error)) { plugins = g_slist_prepend (plugins, plugin_info); g_info ("vpn: (%s,%s) loaded", nm_vpn_plugin_info_get_name (plugin_info), nm_vpn_plugin_info_get_filename (plugin_info)); } else { if ( !nm_vpn_plugin_info_get_plugin (plugin_info) && nm_vpn_plugin_info_lookup_property (plugin_info, NM_VPN_PLUGIN_INFO_KF_GROUP_GNOME, "properties")) { g_message ("vpn: (%s,%s) cannot load legacy-only plugin", nm_vpn_plugin_info_get_name (plugin_info), nm_vpn_plugin_info_get_filename (plugin_info)); } else if (g_error_matches (error, G_FILE_ERROR, G_FILE_ERROR_NOENT)) { g_message ("vpn: (%s,%s) file \"%s\" not found. Did you install the client package?", nm_vpn_plugin_info_get_name (plugin_info), nm_vpn_plugin_info_get_filename (plugin_info), nm_vpn_plugin_info_get_plugin (plugin_info)); } else { g_warning ("vpn: (%s,%s) could not load plugin: %s", nm_vpn_plugin_info_get_name (plugin_info), nm_vpn_plugin_info_get_filename (plugin_info), error->message); } g_clear_error (&error); g_object_unref (plugin_info); } p = g_slist_delete_link (p, p); } /* sort the list of plugins alphabetically. */ plugins = g_slist_sort (plugins, (GCompareFunc) _sort_vpn_plugins); return plugins; }
static void try_add_plugin (NMVpnManager *self, NMVpnPluginInfo *plugin_info) { NMVpnManagerPrivate *priv = NM_VPN_MANAGER_GET_PRIVATE (self); const char *program; program = nm_vpn_plugin_info_get_program (plugin_info); if (!program || !*program) return; /* Make sure we don't add dupes. * We don't really allow reload of the same file. What we do allow is however to * delete a file and re-add it. */ if (nm_vpn_plugin_info_list_find_by_filename (priv->plugins, nm_vpn_plugin_info_get_filename (plugin_info))) return; if (!nm_vpn_plugin_info_list_add (&priv->plugins, plugin_info, NULL)) return; }
NMVpnService * nm_vpn_service_new (NMVpnPluginInfo *plugin_info, GError **error) { NMVpnService *self; NMVpnServicePrivate *priv; g_return_val_if_fail (NM_IS_VPN_PLUGIN_INFO (plugin_info), NULL); g_return_val_if_fail (nm_vpn_plugin_info_get_filename (plugin_info), NULL); if (!nm_vpn_plugin_info_get_program (plugin_info)) { g_set_error (error, NM_VPN_PLUGIN_ERROR, NM_VPN_PLUGIN_ERROR_FAILED, "missing \"program\" entry"); return NULL; } self = (NMVpnService *) g_object_new (NM_TYPE_VPN_SERVICE, NULL); priv = NM_VPN_SERVICE_GET_PRIVATE (self); priv->plugin_info = g_object_ref (plugin_info); priv->proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM, G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES | G_DBUS_PROXY_FLAGS_DO_NOT_CONNECT_SIGNALS | G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START, NULL, nm_vpn_plugin_info_get_service (plugin_info), NM_VPN_DBUS_PLUGIN_PATH, NM_VPN_DBUS_PLUGIN_INTERFACE, NULL, error); if (!priv->proxy) { g_object_unref (self); return NULL; } g_signal_connect (priv->proxy, "notify::g-name-owner", G_CALLBACK (_name_owner_changed), self); _name_owner_changed (G_OBJECT (priv->proxy), NULL, self); return self; }