/** * anjuta_profile_to_xml : * @profile: a #AnjutaProfile object. * * Return a string in xml format containing the list of saved plugins. * * Return value: a newly-allocated string that must be freed with g_free(). */ static gchar* anjuta_profile_to_xml (AnjutaProfile *profile) { GList *node; GString *str; AnjutaProfilePriv *priv; g_return_val_if_fail (ANJUTA_IS_PROFILE (profile), FALSE); priv = profile->priv; str = g_string_new ("<?xml version=\"1.0\"?>\n<anjuta>\n"); for (node = priv->plugins; node != NULL; node = g_list_next (node)) { AnjutaPluginDescription *desc; gboolean user_activatable = TRUE; gchar *name = NULL, *plugin_id = NULL; if (g_hash_table_lookup (priv->plugins_to_exclude_from_sync, node->data)) { /* Do not save plugin in the exclude list */ continue; } desc = (AnjutaPluginDescription *)node->data; if (anjuta_plugin_description_get_boolean (desc, "Anjuta Plugin", "UserActivatable", &user_activatable) && !user_activatable) { /* Do not save plugins that are auto activated */ continue; } /* Do not use the _locale_ version because it's not in UI */ anjuta_plugin_description_get_string (desc, "Anjuta Plugin", "Name", &name); DEBUG_PRINT("Saving plugin: %s", name); if (!name) name = g_strdup ("Unknown"); if (anjuta_plugin_description_get_string (desc, "Anjuta Plugin", "Location", &plugin_id)) { g_string_append (str, " <plugin name=\""); g_string_append (str, name); g_string_append (str, "\" mandatory=\"no\">\n"); g_string_append (str, " <require group=\"Anjuta Plugin\"\n"); g_string_append (str, " attribute=\"Location\"\n"); g_string_append (str, " value=\""); g_string_append (str, plugin_id); g_string_append (str, "\"/>\n"); g_string_append (str, " </plugin>\n"); g_free (plugin_id); } g_free (name); } g_string_append (str, "</anjuta>\n"); return g_string_free (str, FALSE); }
static IAnjutaVcs* get_vcs_plugin(AnjutaFileManager* file_manager, const gchar* root_uri) { typedef struct { const gchar* file; const gchar* name; } VcsSystem; VcsSystem vcs_systems[] = { {".svn", "Subversion"}, {".git", "Git"}, {NULL, NULL} }; gint i; const gchar* vcs_system = NULL; IAnjutaVcs* ivcs = NULL; for (i = 0; vcs_systems[i].name != NULL; i++) { gchar* vcs_uri = g_build_filename (root_uri, vcs_systems[i].file, NULL); GFile* vcs_file = g_file_new_for_uri (vcs_uri); if (g_file_query_exists(vcs_file, NULL)) { vcs_system = vcs_systems[i].name; } g_free (vcs_uri); g_object_unref (vcs_file); if (vcs_system) break; } if (vcs_system) { /* Load current language editor support plugins */ AnjutaPluginManager* plugin_manager = anjuta_shell_get_plugin_manager (ANJUTA_PLUGIN(file_manager)->shell, NULL); GList* plugin_descs = anjuta_plugin_manager_query (plugin_manager, "Anjuta Plugin", "Interfaces", "IAnjutaVcs", "Vcs", "System", vcs_system, NULL); if (plugin_descs) { gchar* plugin_id; anjuta_plugin_description_get_string (plugin_descs->data, "Anjuta Plugin", "Location", &plugin_id); ivcs = IANJUTA_VCS(anjuta_plugin_manager_get_plugin_by_id (plugin_manager, plugin_id)); g_list_free (plugin_descs); } } return ivcs; }
static void on_wizard_clicked (GtkButton *menuitem, Starter *starter) { AnjutaPluginManager *plugin_manager; AnjutaPluginDescription *desc; desc = g_object_get_data (G_OBJECT (menuitem), "__plugin_desc"); plugin_manager = anjuta_shell_get_plugin_manager (starter->priv->shell, NULL); if (desc) { gchar *id; GObject *plugin; if (anjuta_plugin_description_get_string (desc, "Anjuta Plugin", "Location", &id)) { plugin = anjuta_plugin_manager_get_plugin_by_id (plugin_manager, id); ianjuta_wizard_activate (IANJUTA_WIZARD (plugin), NULL); } } }
gboolean anjuta_pm_project_load (AnjutaPmProject *project, GFile *file, GError **error) { AnjutaPluginManager *plugin_manager; GList *desc; IAnjutaProjectBackend *backend; gint found = 0; GValue value = {0, }; g_return_val_if_fail (file != NULL, FALSE); DEBUG_PRINT ("loading gbf backend…\n"); plugin_manager = anjuta_shell_get_plugin_manager (project->plugin->shell, NULL); if (!anjuta_plugin_manager_is_active_plugin (plugin_manager, "IAnjutaProjectBackend")) { GList *descs = NULL; descs = anjuta_plugin_manager_query (plugin_manager, "Anjuta Plugin", "Interfaces", "IAnjutaProjectBackend", NULL); backend = NULL; for (desc = g_list_first (descs); desc != NULL; desc = g_list_next (desc)) { AnjutaPluginDescription *backend_desc; gchar *location = NULL; IAnjutaProjectBackend *plugin; gint backend_val; backend_desc = (AnjutaPluginDescription *)desc->data; anjuta_plugin_description_get_string (backend_desc, "Anjuta Plugin", "Location", &location); plugin = (IAnjutaProjectBackend *)anjuta_plugin_manager_get_plugin_by_id (plugin_manager, location); g_free (location); backend_val = ianjuta_project_backend_probe (plugin, file, NULL); if (backend_val > found) { /* Backend found */; backend = plugin; found = backend_val; } } g_list_free (descs); } else { /* A backend is already loaded, use it */ backend = IANJUTA_PROJECT_BACKEND (anjuta_shell_get_object (project->plugin->shell, "IAnjutaProjectBackend", NULL)); g_object_ref (backend); } if (!backend) { /* FIXME: Set err */ g_warning ("no backend available for this project\n"); return FALSE; } DEBUG_PRINT ("%s", "Creating new gbf project\n"); project->project = ianjuta_project_backend_new_project (backend, file, NULL); if (!project->project) { /* FIXME: Set err */ g_warning ("project creation failed\n"); return FALSE; } g_signal_connect (G_OBJECT (project->project), "file-changed", G_CALLBACK (on_file_changed), project); g_signal_connect (G_OBJECT (project->project), "node-loaded", G_CALLBACK (on_node_loaded), project); g_signal_connect (G_OBJECT (project->project), "node-changed", G_CALLBACK (on_node_changed), project); project->root = ianjuta_project_get_root (project->project, NULL); /* Export project root shell variable */ g_value_init (&value, G_TYPE_OBJECT); g_value_set_object (&value, project->project); anjuta_shell_add_value (project->plugin->shell, IANJUTA_PROJECT_MANAGER_CURRENT_PROJECT, &value, NULL); g_value_unset(&value); g_value_init (&value, G_TYPE_STRING); g_value_set_string (&value, ANJUTA_PLUGIN_PROJECT_MANAGER (project->plugin)->project_root_uri); anjuta_shell_add_value (project->plugin->shell, IANJUTA_PROJECT_MANAGER_PROJECT_ROOT_URI, &value, NULL); g_value_unset(&value); ianjuta_project_load_node (project->project, project->root, NULL); return TRUE; }
AnjutaPluginHandle* anjuta_plugin_handle_new (const gchar *plugin_desc_path) { AnjutaPluginHandle *plugin_handle; AnjutaPluginDescription *desc; char *str; gboolean enable; gchar *contents = NULL; gboolean success = TRUE; /* Load file content */ if (g_file_get_contents (plugin_desc_path, &contents, NULL, NULL)) { desc = anjuta_plugin_description_new_from_string (contents, NULL); g_free (contents); if (!desc) { g_warning ("Bad plugin file: %s\n", plugin_desc_path); return NULL; } } else { return NULL; } plugin_handle = g_object_new (ANJUTA_TYPE_PLUGIN_HANDLE, NULL); /* Initialize plugin handle */ plugin_handle->priv->description = desc; plugin_handle->priv->user_activatable = TRUE; plugin_handle->priv->resident = TRUE; plugin_handle->priv->path = g_path_get_dirname (plugin_desc_path); if (anjuta_plugin_description_get_string (desc, "Anjuta Plugin", "Location", &str)) { plugin_handle->priv->id = str; } else { g_warning ("Couldn't find 'Location'"); success = FALSE; } if (anjuta_plugin_description_get_locale_string (desc, "Anjuta Plugin", "Name", &str)) { plugin_handle->priv->name = str; } else { g_warning ("couldn't find 'Name' attribute."); success = FALSE; } if (anjuta_plugin_description_get_locale_string (desc, "Anjuta Plugin", "Description", &str)) { plugin_handle->priv->about = str; } else { g_warning ("Couldn't find 'Description' attribute."); success = FALSE; } if (anjuta_plugin_description_get_string (desc, "Anjuta Plugin", "Icon", &str)) { plugin_handle->priv->icon_path = get_icon_path (str); g_free (str); } if (anjuta_plugin_description_get_string (desc, "Anjuta Plugin", "Dependencies", &str)) { plugin_handle->priv->dependency_names = property_to_list (str); g_free (str); } if (anjuta_plugin_description_get_string (desc, "Anjuta Plugin", "Interfaces", &str)) { plugin_handle->priv->interfaces = property_to_list (str); g_free (str); } if (anjuta_plugin_description_get_boolean (desc, "Anjuta Plugin", "UserActivatable", &enable)) { plugin_handle->priv->user_activatable = enable; /* DEBUG_PRINT ("Plugin '%s' is not user activatable", plugin_handle->priv->name? plugin_handle->priv->name : "Unknown"); */ } if (anjuta_plugin_description_get_string (desc, "Anjuta Plugin", "Resident", &str)) { if (str && strcasecmp (str, "no") == 0) { plugin_handle->priv->resident = FALSE; } g_free (str); } if (anjuta_plugin_description_get_string (desc, "Anjuta Plugin", "Language", &str)) { plugin_handle->priv->language = str; } if (!success) { g_object_unref (plugin_handle); plugin_handle = NULL; } return plugin_handle; }
static gboolean project_import_generate_file (AnjutaPluginDescription *backend, ProjectImportDialog *import_dialog, GFile *project_file) { /* Of course we could do some more intelligent stuff here * and check which plugins are really needed */ GFile* source_file = NULL; gchar *backend_id = NULL; GError* error = NULL; if (!anjuta_plugin_description_get_string (backend, "Project", "Supported-Project-Types", &backend_id)) { if (!strcmp (backend_id, "automake")) source_file = g_file_new_for_path (AM_PROJECT_FILE); else if (!strcmp (backend_id, "make")) source_file = g_file_new_for_path (MKFILE_PROJECT_FILE); else if (!strcmp (backend_id, "directory")) source_file = g_file_new_for_path (DIRECTORY_PROJECT_FILE); } g_free (backend_id); if (source_file != NULL) { /* Use a default project file */ if (!g_file_copy (source_file, project_file, G_FILE_COPY_NONE, NULL, NULL, NULL, &error)) { if (error->domain == G_IO_ERROR && error->code == G_IO_ERROR_EXISTS) { gchar *prjfile = g_file_get_parse_name (project_file); if (anjuta_util_dialog_boolean_question (GTK_WINDOW (import_dialog), FALSE, _("A file named \"%s\" already exists. " "Do you want to replace it?"), prjfile)) { g_error_free (error); error = NULL; g_file_copy (source_file, project_file, G_FILE_COPY_OVERWRITE, NULL, NULL, NULL, &error); } g_free (prjfile); } } if (!error) { time_t ctime = time(NULL); GFileInfo* file_info = g_file_info_new(); g_file_info_set_attribute_uint64(file_info, "time::modified", ctime); g_file_info_set_attribute_uint64(file_info, "time::created", ctime); g_file_info_set_attribute_uint64(file_info, "time::access", ctime); g_file_set_attributes_from_info (project_file, file_info, G_FILE_QUERY_INFO_NONE, NULL, NULL); g_object_unref (G_OBJECT(file_info));; } } else { /* For unknown project backend we use the directory project file and * replace the backend plugin with the right one */ gchar *content; gsize length; source_file = g_file_new_for_path (DIRECTORY_PROJECT_FILE); if (g_file_load_contents (source_file, NULL, &content, &length, NULL, &error)) { GString *buffer; const gchar *pos; const gchar *plugin; const gchar *end_plugin; gssize len; buffer = g_string_new_len (content, length); pos = buffer->str; len = buffer->len; for (;;) { plugin = g_strstr_len (pos, len, "<plugin "); if (plugin == NULL) break; end_plugin = g_strstr_len (plugin, len - (plugin - pos), "</plugin>"); if (end_plugin == NULL) break; if (g_strstr_len (plugin, end_plugin - plugin, "\"IAnjutaProjectBackend\"") != NULL) break; pos = end_plugin + 9; len -= (end_plugin + 9 - pos); } if ((plugin == NULL) || (end_plugin == NULL)) { g_set_error (&error, ianjuta_project_backend_error_quark(),0, "Unable to find backend plugin"); } else { /* Replace directory backend with right one */ GString *str; GFileOutputStream *stream; gchar *name = NULL; gchar *plugin_id = NULL; anjuta_plugin_description_get_string (backend, "Anjuta Plugin", "Name", &name); anjuta_plugin_description_get_string (backend, "Anjuta Plugin", "Location", &plugin_id); str = g_string_new (NULL); g_string_printf (str, "<plugin name= \"%s\"\n" " mandatory=\"yes\">\n" " <require group=\"Anjuta Plugin\"\n" " attribute=\"Location\"\n" " value=\"%s\"/>\n" " <require group=\"Anjuta Plugin\"\n" " attribute=\"Interfaces\"\n" " value=\"IAnjutaProjectBackend\"/>\n" " ", name, plugin_id); g_string_erase (buffer, plugin - buffer->str, end_plugin - plugin); g_string_insert_len (buffer, plugin - buffer->str, str->str, str->len); g_string_free (str, TRUE); stream = g_file_create (project_file, G_FILE_CREATE_NONE, NULL, &error); if (stream == NULL && error->domain == G_IO_ERROR && error->code == G_IO_ERROR_EXISTS) { gchar *prjfile = g_file_get_parse_name (project_file); if (anjuta_util_dialog_boolean_question (GTK_WINDOW (import_dialog), FALSE, _("A file named \"%s\" already exists. " "Do you want to replace it?"), prjfile)) { g_error_free (error); error = NULL; stream = g_file_replace (project_file, NULL, FALSE, G_FILE_CREATE_REPLACE_DESTINATION, NULL, &error); } g_free (prjfile); } if (stream != NULL) { gsize written; g_output_stream_write_all (G_OUTPUT_STREAM (stream), buffer->str, buffer->len, &written, NULL, &error); g_output_stream_close (G_OUTPUT_STREAM (stream), NULL, NULL); } } g_string_free (buffer, TRUE); g_free (content); } } g_object_unref (source_file); if (error) { gchar *prjfile; prjfile = g_file_get_parse_name (project_file); /* show the dialog since it may be hidden */ gtk_widget_show (GTK_WIDGET (import_dialog)); anjuta_util_dialog_error (GTK_WINDOW (import_dialog), _("A file named \"%s\" cannot be written: %s. " "Check if you have write access to the project directory."), prjfile, error->message); g_free (prjfile); g_error_free (error); return FALSE; } return TRUE; }
static gboolean project_import_import_project (AnjutaProjectImportPlugin *import_plugin, ProjectImportDialog *import_dialog, GFile *source_dir) { AnjutaPluginManager *plugin_manager; GList *descs = NULL; GList *desc; AnjutaPluginDescription *backend; gchar *name, *project_file_name; /* Search for all valid project backend */ plugin_manager = anjuta_shell_get_plugin_manager (ANJUTA_PLUGIN(import_plugin)->shell, NULL); descs = anjuta_plugin_manager_query (plugin_manager, "Anjuta Plugin", "Interfaces", "IAnjutaProjectBackend", NULL); for (desc = g_list_first (descs); desc != NULL;) { IAnjutaProjectBackend *plugin; gchar *location = NULL; GList *next; backend = (AnjutaPluginDescription *)desc->data; anjuta_plugin_description_get_string (backend, "Anjuta Plugin", "Location", &location); plugin = (IAnjutaProjectBackend *)anjuta_plugin_manager_get_plugin_by_id (plugin_manager, location); g_free (location); next = g_list_next (desc); /* Probe the project directory to find if the backend can handle it */ if (ianjuta_project_backend_probe (plugin, source_dir, NULL) <= 0) { /* Remove invalid backend */ descs = g_list_delete_link (descs, desc); } desc = next; } if (descs == NULL) { backend = NULL; } else if (g_list_next (descs) == NULL) { backend = (AnjutaPluginDescription *)descs->data; } else { /* Several backend are possible, ask the user to select one */ gchar *path = project_import_dialog_get_name (import_dialog); gchar* message = g_strdup_printf (_("Please select a project backend to open %s."), path); g_free (path); backend = anjuta_plugin_manager_select (plugin_manager, _("Open With"), message, descs); g_free (message); } g_list_free (descs); if (backend == NULL) { gchar *path = project_import_dialog_get_name (import_dialog); /* show the dialog since it may be hidden */ gtk_widget_show (GTK_WIDGET (import_dialog)); anjuta_util_dialog_error (GTK_WINDOW (import_dialog), _("Could not find a valid project backend for the " "given directory (%s). Please select a different " "directory, or try upgrading to a newer version of " "Anjuta."), path); g_free (path); return FALSE; } name = project_import_dialog_get_name (import_dialog); project_file_name = g_strconcat (name, ".", "anjuta", NULL); GFile *project_file = g_file_get_child (source_dir, project_file_name); g_free (name); g_free (project_file_name); IAnjutaFileLoader* loader; if (!project_import_generate_file (backend, import_dialog, project_file)) { g_object_unref (project_file); return FALSE; } loader = anjuta_shell_get_interface (ANJUTA_PLUGIN (import_plugin)->shell, IAnjutaFileLoader, NULL); if (!loader) { g_warning("No IAnjutaFileLoader interface! Cannot open project file!"); g_object_unref (project_file); return TRUE; } ianjuta_file_loader_load (loader, project_file, FALSE, NULL); g_object_unref (project_file); return TRUE; }