Пример #1
0
static void
gs_editor_button_import_clicked_cb (GtkApplication *application, GsEditor *self)
{
	GtkFileFilter *filter;
	GtkWindow *window;
	GtkWidget *dialog;
	gint res;
	g_autoptr(GFile) file = NULL;

	/* import warning */
	window = GTK_WINDOW (gtk_builder_get_object (self->builder,
						     "window_main"));
	if (as_store_get_size (self->store) > 0) {
		dialog = gtk_message_dialog_new (window,
						 GTK_DIALOG_MODAL |
						 GTK_DIALOG_DESTROY_WITH_PARENT,
						 GTK_MESSAGE_WARNING,
						 GTK_BUTTONS_CANCEL,
						 /* TRANSLATORS: window title */
						 _("Unsaved changes"));
		gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog),
							  _("The application list is already loaded."));

		gtk_dialog_add_button (GTK_DIALOG (dialog),
				       /* TRANSLATORS: button text */
				       _("Merge documents"),
				       GTK_RESPONSE_ACCEPT);
		gtk_dialog_add_button (GTK_DIALOG (dialog),
				       /* TRANSLATORS: button text */
				       _("Throw away changes"),
				       GTK_RESPONSE_YES);
		res = gtk_dialog_run (GTK_DIALOG (dialog));
		gtk_widget_destroy (dialog);

		if (res == GTK_RESPONSE_CANCEL)
			return;
		if (res == GTK_RESPONSE_YES)
			as_store_remove_all (self->store);
	}

	/* import the new file */
	dialog = gtk_file_chooser_dialog_new (_("Open AppStream File"),
					      window,
					      GTK_FILE_CHOOSER_ACTION_OPEN,
					      _("_Cancel"), GTK_RESPONSE_CANCEL,
					      _("_Open"), GTK_RESPONSE_ACCEPT,
					      NULL);
	filter = gtk_file_filter_new ();
	gtk_file_filter_add_pattern (filter, "*.xml");
	gtk_file_chooser_set_filter (GTK_FILE_CHOOSER (dialog), filter);
	res = gtk_dialog_run (GTK_DIALOG (dialog));
	if (res != GTK_RESPONSE_ACCEPT) {
		gtk_widget_destroy (dialog);
		return;
	}
	file = gtk_file_chooser_get_file (GTK_FILE_CHOOSER (dialog));
	gs_editor_button_import_file (self, file);
	gtk_widget_destroy (dialog);
}
Пример #2
0
/**
 * asb_context_setup:
 * @ctx: A #AsbContext
 * @error: A #GError or %NULL
 *
 * Sets up the context ready for use.
 *
 * Returns: %TRUE for success, %FALSE otherwise
 *
 * Since: 0.1.0
 **/
gboolean
asb_context_setup (AsbContext *ctx, GError **error)
{
	AsbContextPrivate *priv = GET_PRIVATE (ctx);
	g_autofree gchar *icons_dir = NULL;
	g_autofree gchar *screenshot_dir1 = NULL;
	g_autofree gchar *screenshot_dir2 = NULL;

	/* required stuff set */
	if (priv->origin == NULL) {
		g_set_error_literal (error,
				     ASB_PLUGIN_ERROR,
				     ASB_PLUGIN_ERROR_FAILED,
				     "origin not set!");
		return FALSE;
	}
	if (priv->output_dir == NULL) {
		g_set_error_literal (error,
				     ASB_PLUGIN_ERROR,
				     ASB_PLUGIN_ERROR_FAILED,
				     "output_dir not set!");
		return FALSE;
	}
	if (priv->icons_dir == NULL) {
		g_set_error_literal (error,
				     ASB_PLUGIN_ERROR,
				     ASB_PLUGIN_ERROR_FAILED,
				     "icons_dir not set!");
		return FALSE;
	}
	if (priv->temp_dir == NULL) {
		g_set_error_literal (error,
				     ASB_PLUGIN_ERROR,
				     ASB_PLUGIN_ERROR_FAILED,
				     "temp_dir not set!");
		return FALSE;
	}
	if (priv->cache_dir == NULL) {
		g_set_error_literal (error,
				     ASB_PLUGIN_ERROR,
				     ASB_PLUGIN_ERROR_FAILED,
				     "cache_dir not set!");
		return FALSE;
	}

	/* create temp space */
	if (!asb_utils_ensure_exists (priv->output_dir, error))
		return FALSE;
	screenshot_dir1 = g_build_filename (priv->temp_dir, "screenshots", NULL);
	if (!asb_utils_ensure_exists_and_empty (screenshot_dir1, error))
		return FALSE;
	screenshot_dir2 = g_build_filename (priv->cache_dir, "screenshots", NULL);
	if (!asb_utils_ensure_exists (screenshot_dir2, error))
		return FALSE;
	if (priv->log_dir != NULL) {
		if (!asb_utils_ensure_exists (priv->log_dir, error))
			return FALSE;
	}

	/* icons is nuked; we can re-decompress from the -icons.tar.gz */
	if (!asb_utils_ensure_exists (priv->icons_dir, error))
		return FALSE;
	if (priv->flags & ASB_CONTEXT_FLAG_HIDPI_ICONS) {
		g_autofree gchar *icons_dir_hidpi = NULL;
		g_autofree gchar *icons_dir_lodpi = NULL;
		icons_dir_lodpi = g_build_filename (priv->icons_dir, "64x64", NULL);
		if (!asb_utils_ensure_exists (icons_dir_lodpi, error))
			return FALSE;
		icons_dir_hidpi = g_build_filename (priv->icons_dir, "128x128", NULL);
		if (!asb_utils_ensure_exists (icons_dir_hidpi, error))
			return FALSE;
	}

	/* decompress the icons */
	if (priv->old_metadata != NULL) {
		g_autofree gchar *icons_fn = NULL;
		icons_fn = g_strdup_printf ("%s/%s-icons.tar.gz",
					    priv->old_metadata,
					    priv->basename);
		if (g_file_test (icons_fn, G_FILE_TEST_EXISTS)) {
			if (!asb_utils_explode (icons_fn,
						priv->icons_dir,
						NULL,
						error))
				return FALSE;
		}
	}

	/* load plugins */
	if (!asb_plugin_loader_setup (priv->plugin_loader, error))
		return FALSE;

	/* get a cache of the file globs */
	priv->file_globs = asb_plugin_loader_get_globs (priv->plugin_loader);

	/* add old metadata */
	if (priv->old_metadata != NULL) {
		g_autofree gchar *builder_id = NULL;
		g_autofree gchar *fn_failed = NULL;
		g_autofree gchar *fn_ignore = NULL;
		g_autofree gchar *fn_old = NULL;
		g_autoptr(GFile) file_failed = NULL;
		g_autoptr(GFile) file_ignore = NULL;
		g_autoptr(GFile) file_old = NULL;

		builder_id = asb_utils_get_builder_id ();
		fn_old = g_strdup_printf ("%s/%s.xml.gz",
					  priv->old_metadata,
					  priv->basename);
		file_old = g_file_new_for_path (fn_old);
		if (g_file_query_exists (file_old, NULL)) {
			if (!as_store_from_file (priv->store_old, file_old,
						 NULL, NULL, error))
				return FALSE;
			/* check builder-id matches */
			if (g_strcmp0 (as_store_get_builder_id (priv->store_old),
				       builder_id) != 0) {
				g_debug ("builder ID does not match: %s:%s",
					 as_store_get_builder_id (priv->store_old),
					 builder_id);
				as_store_remove_all (priv->store_old);
			}
		}
		fn_ignore = g_strdup_printf ("%s/%s-ignore.xml.gz",
					     priv->old_metadata,
					     priv->basename);
		file_ignore = g_file_new_for_path (fn_ignore);
		if (g_file_query_exists (file_ignore, NULL)) {
			if (!as_store_from_file (priv->store_ignore, file_ignore,
						 NULL, NULL, error))
				return FALSE;
			/* check builder-id matches */
			if (g_strcmp0 (as_store_get_builder_id (priv->store_ignore),
				       builder_id) != 0) {
				g_debug ("builder ID does not match: %s:%s",
					 as_store_get_builder_id (priv->store_ignore),
					 builder_id);
				as_store_remove_all (priv->store_ignore);
			}
		}
		fn_failed = g_strdup_printf ("%s/%s-failed.xml.gz",
					     priv->old_metadata,
					     priv->basename);
		file_failed = g_file_new_for_path (fn_failed);
		if (g_file_query_exists (file_failed, NULL)) {
			if (!as_store_from_file (priv->store_failed, file_failed,
						 NULL, NULL, error))
				return FALSE;
			/* check builder-id matches */
			if (g_strcmp0 (as_store_get_builder_id (priv->store_failed),
				       builder_id) != 0) {
				g_debug ("builder ID does not match: %s:%s",
					 as_store_get_builder_id (priv->store_failed),
					 builder_id);
				as_store_remove_all (priv->store_failed);
			}
		}
	}

	return TRUE;
}