view src/uri_utils.c @ 2916:ae6cdcd69d9f default tip

Merge with upstream/master.
author Matti Hamalainen <ccr@tnsp.org>
date Tue, 14 May 2019 11:46:50 +0300
parents 95507e596256
children
line wrap: on
line source

/*
 * Copyright (C) 2008 - 2016 The Geeqie Team
 *
 * Authors: John Ellis, Vladimir Nadvornik, Laurent Monin
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License along
 * with this program; if not, write to the Free Software Foundation, Inc.,
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 */

#include "main.h"
#include "uri_utils.h"

#include "filedata.h"
#include "ui_fileops.h"
#include "ui_utildlg.h"

void warning_dialog_dnd_uri_error(GList *uri_error_list)
{
	GList *work = uri_error_list;
	guint count = g_list_length(work);
	gchar *msg = g_strdup_printf("Failed to convert %d dropped item(s) to files\n", count);
	if(count < 10)
		{
		while (work)
			{
			gchar *prev = msg;
			msg = g_strdup_printf("%s\n%s", prev, (gchar *)work->data);
			work = work->next;
			g_free(prev);
			}
		}
	warning_dialog(_("Drag and Drop failed"), msg, GTK_STOCK_DIALOG_WARNING, NULL);
	g_free(msg);
}

gchar **uris_from_pathlist(GList *list)
{
	GList *work;
	guint i = 0;
	guint num = g_list_length(list);
	gchar **uris = g_new0(gchar *, num + 1);

	work = list;
	while (work)
		{
		const gchar *path = work->data;
		gchar *local_path = path_from_utf8(path);
		uris[i] = g_filename_to_uri(local_path, NULL, NULL);
		g_free(local_path);

		i++;
		work = work->next;
		}

	uris[i] = NULL;
	return uris;
}

gchar **uris_from_filelist(GList *list)
{
	GList *path_list = filelist_to_path_list(list);
	gchar **ret = uris_from_pathlist(path_list);
	string_list_free(path_list);
	return ret;
}

gboolean uri_selection_data_set_uris_from_filelist(GtkSelectionData *selection_data, GList *list)
{
	gchar **uris = uris_from_filelist(list);
	gboolean ret = gtk_selection_data_set_uris(selection_data, uris);
	if (!ret)
		{
		char *str = g_strjoinv("\r\n", uris);
		ret = gtk_selection_data_set_text(selection_data, str, -1);
		g_free(str);
		}

	g_strfreev(uris);
	return ret;
}

GList *uri_pathlist_from_uris(gchar **uris, GList **uri_error_list)
{
	GList *list = NULL;
	guint i = 0;
	GError *error = NULL;

	while (uris[i])
		{
		gchar *local_path = g_filename_from_uri(uris[i], NULL, &error);
		if (error)
			{
			DEBUG_1("g_filename_from_uri failed on uri \"%s\"", uris[i]);
			DEBUG_1("   error %d: %s", error->code, error->message);
			if (error->code == G_CONVERT_ERROR_BAD_URI)
				{
				GError *retry_error = NULL;
				gchar *escaped = g_uri_escape_string(uris[i], ":/", TRUE);
				local_path = g_filename_from_uri(escaped, NULL, &retry_error);
				if(retry_error)
					{
					DEBUG_1("manually escaped uri \"%s\" also failed g_filename_from_uri", escaped);
					DEBUG_1("   error %d: %s", retry_error->code, retry_error->message);
					g_error_free(retry_error);
					}
				g_free(escaped);
				}
			g_error_free(error);
			error = NULL;
			if (!local_path)
				{
				*uri_error_list = g_list_prepend(*uri_error_list, g_strdup(uris[i]));
				i++;
				continue;
				}
			}
		gchar *path = path_to_utf8(local_path);
		g_free(local_path);
		list = g_list_prepend(list, path);
		i++;
		}

	*uri_error_list = g_list_reverse(*uri_error_list);
	return g_list_reverse(list);
}

GList *uri_filelist_from_uris(gchar **uris, GList **uri_error_list)
{
	GList *path_list = uri_pathlist_from_uris(uris, uri_error_list);
	GList *filelist = filelist_from_path_list(path_list);
	string_list_free(path_list);
	return filelist;
}

GList *uri_filelist_from_gtk_selection_data(GtkSelectionData *selection_data)
{
	GList *errors = NULL;
	gchar **uris = gtk_selection_data_get_uris(selection_data);
	GList *ret = uri_filelist_from_uris(uris, &errors);
	if(errors)
		{
		warning_dialog_dnd_uri_error(errors);
		string_list_free(errors);
		}
	g_strfreev(uris);
	return ret;
}



/* vim: set shiftwidth=8 softtabstop=0 cindent cinoptions={1s: */