IRCProtocol::IRCProtocol() { // m_transportFeatures.push_back("jabber:iq:register"); m_transportFeatures.push_back("http://jabber.org/protocol/disco#info"); m_transportFeatures.push_back("http://jabber.org/protocol/caps"); m_transportFeatures.push_back("http://jabber.org/protocol/commands"); m_transportFeatures.push_back("http://jabber.org/protocol/muc"); m_buddyFeatures.push_back("http://jabber.org/protocol/disco#info"); m_buddyFeatures.push_back("http://jabber.org/protocol/caps"); m_buddyFeatures.push_back("http://jabber.org/protocol/commands"); adhocCommand command = { "IRC Nickserv password configuration", false, createConfigHandler }; GlooxAdhocHandler::instance()->registerAdhocCommandHandler("transport_irc_config", command); m_irchelper = purple_plugins_find_with_id(IRCHELPER_ID); if (m_irchelper) { if (!purple_plugin_load(m_irchelper)) m_irchelper = NULL; } std::cout << "IRCHELPER " << m_irchelper << "\n"; }
static gboolean ssl_init(void) { PurplePlugin *plugin; PurpleSslOps *ops; if (_ssl_initialized) return FALSE; plugin = purple_plugins_find_with_id("core-ssl"); if (plugin != NULL && !purple_plugin_is_loaded(plugin)) purple_plugin_load(plugin); ops = purple_ssl_get_ops(); if ((ops == NULL) || (ops->init == NULL) || (ops->uninit == NULL) || (ops->connectfunc == NULL) || (ops->close == NULL) || (ops->read == NULL) || (ops->write == NULL)) { return FALSE; } return (_ssl_initialized = ops->init()); }
static void install_selected_file_cb(gpointer handle, const char *filename) { /* Try to init the selected file. * If it succeeds, try to make a copy of the file in $USERDIR/plugins/. * If the copy succeeds, unload and destroy the plugin in the original * location and init+load the new one. * Select the plugin in the plugin list. */ char *path; PurplePlugin *plugin; g_return_if_fail(plugins.window); plugin = purple_plugin_probe(filename); if (!plugin) { purple_notify_error(handle, _("Error loading plugin"), _("The selected file is not a valid plugin."), _("Please open the debug window and try again to see the exact error message."), NULL); return; } if (g_list_find(gnt_tree_get_rows(GNT_TREE(plugins.tree)), plugin)) { purple_plugin_load(plugin); gnt_tree_set_choice(GNT_TREE(plugins.tree), plugin, purple_plugin_is_loaded(plugin)); gnt_tree_set_selected(GNT_TREE(plugins.tree), plugin); return; } path = g_build_filename(purple_user_dir(), "plugins", NULL); if (purple_build_dir(path, S_IRUSR | S_IWUSR | S_IXUSR) == 0) { char *content = NULL; gsize length = 0; if (g_file_get_contents(filename, &content, &length, NULL)) { char *file = g_path_get_basename(filename); g_free(path); path = g_build_filename(purple_user_dir(), "plugins", file, NULL); if (purple_util_write_data_to_file_absolute(path, content, length)) { purple_plugin_destroy(plugin); plugin = purple_plugin_probe(path); if (!plugin) { purple_debug_warning("gntplugin", "This is really strange. %s can be loaded, but %s can't!\n", filename, path); g_unlink(path); plugin = purple_plugin_probe(filename); } } else { } } g_free(content); } g_free(path); purple_plugin_load(plugin); if (plugin->info->type == PURPLE_PLUGIN_LOADER) { GList *cur; for (cur = PURPLE_PLUGIN_LOADER_INFO(plugin)->exts; cur != NULL; cur = cur->next) purple_plugins_probe(cur->data); return; } if (plugin->info->type != PURPLE_PLUGIN_STANDARD || (plugin->info->flags & PURPLE_PLUGIN_FLAG_INVISIBLE) || plugin->error) return; gnt_tree_add_choice(GNT_TREE(plugins.tree), plugin, gnt_tree_create_row(GNT_TREE(plugins.tree), plugin->info->name), NULL, NULL); gnt_tree_set_choice(GNT_TREE(plugins.tree), plugin, purple_plugin_is_loaded(plugin)); gnt_tree_set_row_flags(GNT_TREE(plugins.tree), plugin, GNT_TEXT_FLAG_BOLD); gnt_tree_set_selected(GNT_TREE(plugins.tree), plugin); }
gboolean purple_plugin_load(PurplePlugin *plugin) { #ifdef PURPLE_PLUGINS GList *dep_list = NULL; GList *l; g_return_val_if_fail(plugin != NULL, FALSE); if (purple_plugin_is_loaded(plugin)) return TRUE; if (purple_plugin_is_unloadable(plugin)) return FALSE; g_return_val_if_fail(plugin->error == NULL, FALSE); /* * Go through the list of the plugin's dependencies. * * First pass: Make sure all the plugins needed are probed. */ for (l = plugin->info->dependencies; l != NULL; l = l->next) { const char *dep_name = (const char *)l->data; PurplePlugin *dep_plugin; dep_plugin = purple_plugins_find_with_id(dep_name); if (dep_plugin == NULL) { char *tmp; tmp = g_strdup_printf(_("The required plugin %s was not found. " "Please install this plugin and try again."), dep_name); purple_notify_error(NULL, NULL, _("Unable to load the plugin"), tmp, NULL); g_free(tmp); g_list_free(dep_list); return FALSE; } dep_list = g_list_append(dep_list, dep_plugin); } /* Second pass: load all the required plugins. */ for (l = dep_list; l != NULL; l = l->next) { PurplePlugin *dep_plugin = (PurplePlugin *)l->data; if (!purple_plugin_is_loaded(dep_plugin)) { if (!purple_plugin_load(dep_plugin)) { char *tmp; tmp = g_strdup_printf(_("The required plugin %s was unable to load."), plugin->info->name); purple_notify_error(NULL, NULL, _("Unable to load your plugin."), tmp, NULL); g_free(tmp); g_list_free(dep_list); return FALSE; } } } /* Third pass: note that other plugins are dependencies of this plugin. * This is done separately in case we had to bail out earlier. */ for (l = dep_list; l != NULL; l = l->next) { PurplePlugin *dep_plugin = (PurplePlugin *)l->data; dep_plugin->dependent_plugins = g_list_prepend(dep_plugin->dependent_plugins, (gpointer)plugin->info->id); } g_list_free(dep_list); if (plugin->native_plugin) { if (plugin->info->load != NULL && !plugin->info->load(plugin)) return FALSE; } else { PurplePlugin *loader; PurplePluginLoaderInfo *loader_info; loader = find_loader_for_plugin(plugin); if (loader == NULL) return FALSE; loader_info = PURPLE_PLUGIN_LOADER_INFO(loader); if (loader_info->load != NULL) { if (!loader_info->load(plugin)) return FALSE; } } loaded_plugins = g_list_insert_sorted(loaded_plugins, plugin, compare_plugins); plugin->loaded = TRUE; purple_signal_emit(purple_plugins_get_handle(), "plugin-load", plugin); return TRUE; #else return TRUE; #endif /* !PURPLE_PLUGINS */ }
void purple_plugins_probe(const char *ext) { #ifdef PURPLE_PLUGINS GDir *dir; const gchar *file; gchar *path; PurplePlugin *plugin; GList *cur; const char *search_path; if (!g_module_supported()) return; /* Probe plugins */ for (cur = search_paths; cur != NULL; cur = cur->next) { search_path = cur->data; dir = g_dir_open(search_path, 0, NULL); if (dir != NULL) { while ((file = g_dir_read_name(dir)) != NULL) { path = g_build_filename(search_path, file, NULL); if (ext == NULL || has_file_extension(file, ext)) purple_plugin_probe(path); g_free(path); } g_dir_close(dir); } } /* See if we have any plugins waiting to load */ while (load_queue != NULL) { plugin = (PurplePlugin *)load_queue->data; load_queue = g_list_remove(load_queue, plugin); if (plugin == NULL || plugin->info == NULL) continue; if (plugin->info->type == PURPLE_PLUGIN_LOADER) { /* We'll just load this right now. */ if (!purple_plugin_load(plugin)) { purple_plugin_destroy(plugin); continue; } plugin_loaders = g_list_append(plugin_loaders, plugin); for (cur = PURPLE_PLUGIN_LOADER_INFO(plugin)->exts; cur != NULL; cur = cur->next) { purple_plugins_probe(cur->data); } } else if (plugin->info->type == PURPLE_PLUGIN_PROTOCOL) { /* We'll just load this right now. */ if (!purple_plugin_load(plugin)) { purple_plugin_destroy(plugin); continue; } /* Make sure we don't load two PRPLs with the same name? */ if (purple_find_prpl(plugin->info->id)) { /* Nothing to see here--move along, move along */ purple_plugin_destroy(plugin); continue; } protocol_plugins = g_list_insert_sorted(protocol_plugins, plugin, (GCompareFunc)compare_prpl); } } #endif /* PURPLE_PLUGINS */ }