changeset 904:1698baa37871

Move uri_*() functions to separate files: uri_utils.[ch]
author zas_
date Sun, 20 Jul 2008 15:16:05 +0000
parents c93823609f15
children b945b83e8108
files src/Makefile.am src/collect-table.c src/dupe.c src/img-view.c src/info.c src/layout_image.c src/pan-view.c src/search.c src/ui_bookmark.c src/ui_bookmark.h src/ui_pathsel.c src/uri_utils.c src/uri_utils.h src/view_dir.c src/view_file_icon.c src/view_file_list.c
diffstat 16 files changed, 309 insertions(+), 273 deletions(-) [+]
line wrap: on
line diff
--- a/src/Makefile.am	Sun Jul 20 15:04:40 2008 +0000
+++ b/src/Makefile.am	Sun Jul 20 15:16:05 2008 +0000
@@ -203,6 +203,8 @@
 	thumb_standard.h	\
 	trash.c		\
 	trash.h		\
+	uri_utils.c	\
+	uri_utils.h	\
 	utilops.c	\
 	utilops.h	\
 	view_dir.c	\
--- a/src/collect-table.c	Sun Jul 20 15:04:40 2008 +0000
+++ b/src/collect-table.c	Sun Jul 20 15:16:05 2008 +0000
@@ -28,10 +28,10 @@
 #include "menu.h"
 #include "print.h"
 #include "utilops.h"
-#include "ui_bookmark.h"
 #include "ui_fileops.h"
 #include "ui_menu.h"
 #include "ui_tree_edit.h"
+#include "uri_utils.h"
 
 #include "icons/marker.xpm"
 #define MARKER_WIDTH 26
--- a/src/dupe.c	Sun Jul 20 15:04:40 2008 +0000
+++ b/src/dupe.c	Sun Jul 20 15:16:05 2008 +0000
@@ -30,11 +30,11 @@
 #include "print.h"
 #include "thumb.h"
 #include "utilops.h"
-#include "ui_bookmark.h"
 #include "ui_fileops.h"
 #include "ui_menu.h"
 #include "ui_misc.h"
 #include "ui_tree_edit.h"
+#include "uri_utils.h"
 #include "window.h"
 
 #include <gdk/gdkkeysyms.h> /* for keyboard values */
--- a/src/img-view.c	Sun Jul 20 15:04:40 2008 +0000
+++ b/src/img-view.c	Sun Jul 20 15:16:05 2008 +0000
@@ -31,9 +31,9 @@
 #include "print.h"
 #include "slideshow.h"
 #include "utilops.h"
-#include "ui_bookmark.h"
 #include "ui_fileops.h"
 #include "ui_menu.h"
+#include "uri_utils.h"
 #include "window.h"
 
 #include <gdk/gdkkeysyms.h> /* for keyboard values */
--- a/src/info.c	Sun Jul 20 15:04:40 2008 +0000
+++ b/src/info.c	Sun Jul 20 15:16:05 2008 +0000
@@ -21,9 +21,9 @@
 #include "image.h"
 #include "image-load.h"
 #include "pixbuf-renderer.h"
-#include "ui_bookmark.h"
 #include "ui_fileops.h"
 #include "ui_misc.h"
+#include "uri_utils.h"
 #include "window.h"
 
 #include <pwd.h>
--- a/src/layout_image.c	Sun Jul 20 15:04:40 2008 +0000
+++ b/src/layout_image.c	Sun Jul 20 15:16:05 2008 +0000
@@ -28,9 +28,9 @@
 #include "pixbuf_util.h"
 #include "utilops.h"
 #include "slideshow.h"
-#include "ui_bookmark.h"
 #include "ui_fileops.h"
 #include "ui_menu.h"
+#include "uri_utils.h"
 
 #include <gdk/gdkkeysyms.h> /* for keyboard values */
 
--- a/src/pan-view.c	Sun Jul 20 15:04:40 2008 +0000
+++ b/src/pan-view.c	Sun Jul 20 15:16:05 2008 +0000
@@ -26,11 +26,11 @@
 #include "pan-types.h"
 #include "thumb.h"
 #include "utilops.h"
-#include "ui_bookmark.h"
 #include "ui_fileops.h"
 #include "ui_menu.h"
 #include "ui_tabcomp.h"
 #include "ui_utildlg.h"
+#include "uri_utils.h"
 #include "window.h"
 
 #include <gdk/gdkkeysyms.h> /* for keyboard values */
--- a/src/search.c	Sun Jul 20 15:04:40 2008 +0000
+++ b/src/search.c	Sun Jul 20 15:16:05 2008 +0000
@@ -37,6 +37,7 @@
 #include "ui_spinner.h"
 #include "ui_tabcomp.h"
 #include "ui_tree_edit.h"
+#include "uri_utils.h"
 #include "window.h"
 
 #include <gdk/gdkkeysyms.h> /* for keyboard values */
--- a/src/ui_bookmark.c	Sun Jul 20 15:04:40 2008 +0000
+++ b/src/ui_bookmark.c	Sun Jul 20 15:16:05 2008 +0000
@@ -28,13 +28,13 @@
 #include "filedata.h"
 #include "history_list.h"
 
-#include "secure_save.h"
 #include "ui_bookmark.h"
 #include "ui_fileops.h"
 #include "ui_menu.h"
 #include "ui_misc.h"
 #include "ui_utildlg.h"
 #include "ui_tabcomp.h"
+#include "uri_utils.h"
 
 
 
@@ -951,256 +951,3 @@
 
 	g_free(new_text);
 }
-
-/*
- *-----------------------------------------------------------------------------
- * drag and drop uri utils
- *-----------------------------------------------------------------------------
- */
-
-/* the following characters are allowed to be unencoded for pathnames:
- *     $ & + , / : = @
- */
-static gint escape_char_list[] = {
-	1, 1, 1, 1, 1, 1, 1, 1, 1, 1,	/*   0 */
-	1, 1, 1, 1, 1, 1, 1, 1, 1, 1,	/*  10 */
-	1, 1, 1, 1, 1, 1, 1, 1, 1, 1,	/*  20 */
-/*	     spc !  "  #  $  %  &  '	       */
-	1, 1, 0, 0, 1, 1, 0, 1, 0, 0,	/*  30 */
-/*	(  )  *  +  ,  -  .  /  0  1	       */
-	0, 0, 0, 0, 0, 0, 0, 0, 0, 0,	/*  40 */
-/*	2  3  4  5  6  7  8  9  :  ;	       */
-	0, 0, 0, 0, 0, 0, 0, 0, 0, 1,	/*  50 */
-/*	<  =  >  ?  @  A  B  C  D  E	       */
-	1, 0, 1, 1, 0, 0, 0, 0, 0, 0,	/*  60 */
-	0, 0, 0, 0, 0, 0, 0, 0, 0, 0,	/*  70 */
-	0, 0, 0, 0, 0, 0, 0, 0, 0, 0,	/*  80 */
-/*	Z  [  \  ]  ^  _  `  a  b  c	       */
-	0, 1, 1, 1, 1, 0, 1, 0, 0, 0,	/*  90 */
-	0, 0, 0, 0, 0, 0, 0, 0, 0, 0,	/* 100 */
-	0, 0, 0, 0, 0, 0, 0, 0, 0, 0,	/* 110 */
-/*	x  y  z  {  |  }  ~ del      	       */
-	0, 0, 0, 1, 1, 1, 0, 0		/* 120, 127 is end */
-};
-
-static gchar *hex_char = "0123456789ABCDEF";
-
-static gint escape_test(guchar c)
-{
-	if (c < 32 || c > 127) return TRUE;
-	return (escape_char_list[c] != 0);
-}
-
-static const gchar *escape_code(guchar c)
-{
-	static gchar text[4];
-
-	text[0] = '%';
-	text[1] = hex_char[c>>4];
-	text[2] = hex_char[c%16];
-	text[3] = '\0';
-
-	return text;
-}
-
-gchar *uri_text_escape(const gchar *text)
-{
-	GString *string;
-	gchar *result;
-	const gchar *p;
-
-	if (!text) return NULL;
-
-	string = g_string_new("");
-
-	p = text;
-	while (*p != '\0')
-		{
-		if (escape_test(*p))
-			{
-			g_string_append(string, escape_code(*p));
-			}
-		else
-			{
-			g_string_append_c(string, *p);
-			}
-		p++;
-		}
-
-	result = string->str;
-	g_string_free(string, FALSE);
-
-	/* dropped filenames are expected to be utf-8 compatible */
-	if (!g_utf8_validate(result, -1, NULL))
-		{
-		gchar *tmp;
-
-		tmp = g_locale_to_utf8(result, -1, NULL, NULL, NULL);
-		if (tmp)
-			{
-			g_free(result);
-			result = tmp;
-			}
-		}
-
-	return result;
-}
-
-/* this operates on the passed string, decoding escaped characters */
-void uri_text_decode(gchar *text)
-{
-	if (strchr(text, '%'))
-		{
-		gchar *w;
-		gchar *r;
-
-		w = r = text;
-
-		while (*r != '\0')
-			{
-			if (*r == '%' && *(r + 1) != '\0' && *(r + 2) != '\0')
-				{
-				gchar t[3];
-				gint n;
-
-				r++;
-				t[0] = *r;
-				r++;
-				t[1] = *r;
-				t[2] = '\0';
-				n = (gint)strtol(t, NULL, 16);
-				if (n > 0 && n < 256)
-					{
-					*w = (gchar)n;
-					}
-				else
-					{
-					/* invalid number, rewind and ignore this escape */
-					r -= 2;
-					*w = *r;
-					}
-				}
-			else if (w != r)
-				{
-				*w = *r;
-				}
-			r++;
-			w++;
-			}
-		if (*w != '\0') *w = '\0';
-		}
-}
-
-static void uri_list_parse_encoded_chars(GList *list)
-{
-	GList *work = list;
-
-	while (work)
-		{
-		gchar *text = work->data;
-
-		uri_text_decode(text);
-
-		work = work->next;
-		}
-}
-
-GList *uri_list_from_text(gchar *data, gint files_only)
-{
-	GList *list = NULL;
-	gint b, e;
-
-	b = e = 0;
-
-	while (data[b] != '\0')
-		{
-		while (data[e] != '\r' && data[e] != '\n' && data[e] != '\0') e++;
-		if (strncmp(data + b, "file:", 5) == 0)
-			{
-			gchar *path;
-			b += 5;
-			while (data[b] == '/' && data[b+1] == '/') b++;
-			path = g_strndup(data + b, e - b);
-			list = g_list_append(list, path_to_utf8(path));
-			g_free(path);
-			}
-		else if (!files_only && strncmp(data + b, "http:", 5) == 0)
-			{
-			list = g_list_append(list, g_strndup(data + b, e - b));
-			}
-		else if (!files_only && strncmp(data + b, "ftp:", 3) == 0)
-			{
-			list = g_list_append(list, g_strndup(data + b, e - b));
-			}
-		while (data[e] == '\r' || data[e] == '\n') e++;
-		b = e;
-		}
-
-	uri_list_parse_encoded_chars(list);
-
-	return list;
-}
-
-GList *uri_filelist_from_text(gchar *data, gint files_only)
-{
-	GList *path_list = uri_list_from_text(data, files_only);
-	GList *filelist = filelist_from_path_list(path_list);
-	string_list_free(path_list);
-	return filelist;
-}
-
-gchar *uri_text_from_list(GList *list, gint *len, gint plain_text)
-{
-	gchar *uri_text = NULL;
-	GString *string;
-	GList *work;
-
-	if (!list)
-		{
-		if (len) *len = 0;
-		return NULL;
-		}
-
-	string = g_string_new("");
-
-	work = list;
-	while (work)
-		{
-		const gchar *name8;	/* dnd filenames are in utf-8 */
-
-		name8 = work->data;
-
-		if (!plain_text)
-			{
-			gchar *escaped;
-
-			escaped = uri_text_escape(name8);
-			g_string_append(string, "file:");
-			g_string_append(string, escaped);
-			g_free(escaped);
-
-			g_string_append(string, "\r\n");
-			}
-		else
-			{
-			g_string_append(string, name8);
-			if (work->next) g_string_append(string, "\n");
-			}
-
-		work = work->next;
-		}
-
-	uri_text = string->str;
-	if (len) *len = string->len;
-	g_string_free(string, FALSE);
-
-	return uri_text;
-}
-
-gchar *uri_text_from_filelist(GList *list, gint *len, gint plain_text)
-{
-	GList *path_list = filelist_to_path_list(list);
-	gchar *ret = uri_text_from_list(path_list, len, plain_text);
-	string_list_free(path_list);
-	return ret;
-}
--- a/src/ui_bookmark.h	Sun Jul 20 15:04:40 2008 +0000
+++ b/src/ui_bookmark.h	Sun Jul 20 15:16:05 2008 +0000
@@ -36,15 +36,5 @@
 void history_combo_append_history(GtkWidget *widget, const gchar *text);
 
 
-/* dnd data parsers (uris) */
-
-gchar *uri_text_escape(const gchar *text);
-void uri_text_decode(gchar *text);
-
-GList *uri_list_from_text(gchar *data, gint files_only);
-GList *uri_filelist_from_text(gchar *data, gint files_only);
-gchar *uri_text_from_list(GList *list, gint *len, gint plain_text);
-gchar *uri_text_from_filelist(GList *list, gint *len, gint plain_text);
-
 
 #endif
--- a/src/ui_pathsel.c	Sun Jul 20 15:04:40 2008 +0000
+++ b/src/ui_pathsel.c	Sun Jul 20 15:16:05 2008 +0000
@@ -39,6 +39,7 @@
 #include "ui_utildlg.h"
 #include "ui_tabcomp.h"
 #include "ui_tree_edit.h"
+#include "uri_utils.h"
 
 
 #define DEST_WIDTH 250
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/uri_utils.c	Sun Jul 20 15:16:05 2008 +0000
@@ -0,0 +1,270 @@
+/*
+ * Geeqie
+ * Copyright (C) 2008 The Geeqie Team
+ *
+ * Authors: John Ellis, Vladimir Nadvornik, Laurent Monin
+ *
+ *
+ * This software is released under the GNU General Public License (GNU GPL).
+ * Please read the included file COPYING for more information.
+ * This software comes with no warranty of any kind, use at your own risk!
+ */
+
+#include "main.h"
+#include "uri_utils.h"
+
+#include "filedata.h"
+#include "ui_fileops.h"
+
+/*
+ *-----------------------------------------------------------------------------
+ * drag and drop uri utils
+ *-----------------------------------------------------------------------------
+ */
+
+/* the following characters are allowed to be unencoded for pathnames:
+ *     $ & + , / : = @
+ */
+static gint escape_char_list[] = {
+	1, 1, 1, 1, 1, 1, 1, 1, 1, 1,	/*   0 */
+	1, 1, 1, 1, 1, 1, 1, 1, 1, 1,	/*  10 */
+	1, 1, 1, 1, 1, 1, 1, 1, 1, 1,	/*  20 */
+/*	     spc !  "  #  $  %  &  '	       */
+	1, 1, 0, 0, 1, 1, 0, 1, 0, 0,	/*  30 */
+/*	(  )  *  +  ,  -  .  /  0  1	       */
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0,	/*  40 */
+/*	2  3  4  5  6  7  8  9  :  ;	       */
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 1,	/*  50 */
+/*	<  =  >  ?  @  A  B  C  D  E	       */
+	1, 0, 1, 1, 0, 0, 0, 0, 0, 0,	/*  60 */
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0,	/*  70 */
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0,	/*  80 */
+/*	Z  [  \  ]  ^  _  `  a  b  c	       */
+	0, 1, 1, 1, 1, 0, 1, 0, 0, 0,	/*  90 */
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0,	/* 100 */
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0,	/* 110 */
+/*	x  y  z  {  |  }  ~ del      	       */
+	0, 0, 0, 1, 1, 1, 0, 0		/* 120, 127 is end */
+};
+
+static gchar *hex_char = "0123456789ABCDEF";
+
+static gint escape_test(guchar c)
+{
+	if (c < 32 || c > 127) return TRUE;
+	return (escape_char_list[c] != 0);
+}
+
+static const gchar *escape_code(guchar c)
+{
+	static gchar text[4];
+
+	text[0] = '%';
+	text[1] = hex_char[c>>4];
+	text[2] = hex_char[c%16];
+	text[3] = '\0';
+
+	return text;
+}
+
+gchar *uri_text_escape(const gchar *text)
+{
+	GString *string;
+	gchar *result;
+	const gchar *p;
+
+	if (!text) return NULL;
+
+	string = g_string_new("");
+
+	p = text;
+	while (*p != '\0')
+		{
+		if (escape_test(*p))
+			{
+			g_string_append(string, escape_code(*p));
+			}
+		else
+			{
+			g_string_append_c(string, *p);
+			}
+		p++;
+		}
+
+	result = string->str;
+	g_string_free(string, FALSE);
+
+	/* dropped filenames are expected to be utf-8 compatible */
+	if (!g_utf8_validate(result, -1, NULL))
+		{
+		gchar *tmp;
+
+		tmp = g_locale_to_utf8(result, -1, NULL, NULL, NULL);
+		if (tmp)
+			{
+			g_free(result);
+			result = tmp;
+			}
+		}
+
+	return result;
+}
+
+/* this operates on the passed string, decoding escaped characters */
+void uri_text_decode(gchar *text)
+{
+	if (strchr(text, '%'))
+		{
+		gchar *w;
+		gchar *r;
+
+		w = r = text;
+
+		while (*r != '\0')
+			{
+			if (*r == '%' && *(r + 1) != '\0' && *(r + 2) != '\0')
+				{
+				gchar t[3];
+				gint n;
+
+				r++;
+				t[0] = *r;
+				r++;
+				t[1] = *r;
+				t[2] = '\0';
+				n = (gint)strtol(t, NULL, 16);
+				if (n > 0 && n < 256)
+					{
+					*w = (gchar)n;
+					}
+				else
+					{
+					/* invalid number, rewind and ignore this escape */
+					r -= 2;
+					*w = *r;
+					}
+				}
+			else if (w != r)
+				{
+				*w = *r;
+				}
+			r++;
+			w++;
+			}
+		if (*w != '\0') *w = '\0';
+		}
+}
+
+static void uri_list_parse_encoded_chars(GList *list)
+{
+	GList *work = list;
+
+	while (work)
+		{
+		gchar *text = work->data;
+
+		uri_text_decode(text);
+
+		work = work->next;
+		}
+}
+
+GList *uri_list_from_text(gchar *data, gint files_only)
+{
+	GList *list = NULL;
+	gint b, e;
+
+	b = e = 0;
+
+	while (data[b] != '\0')
+		{
+		while (data[e] != '\r' && data[e] != '\n' && data[e] != '\0') e++;
+		if (strncmp(data + b, "file:", 5) == 0)
+			{
+			gchar *path;
+			b += 5;
+			while (data[b] == '/' && data[b+1] == '/') b++;
+			path = g_strndup(data + b, e - b);
+			list = g_list_append(list, path_to_utf8(path));
+			g_free(path);
+			}
+		else if (!files_only && strncmp(data + b, "http:", 5) == 0)
+			{
+			list = g_list_append(list, g_strndup(data + b, e - b));
+			}
+		else if (!files_only && strncmp(data + b, "ftp:", 3) == 0)
+			{
+			list = g_list_append(list, g_strndup(data + b, e - b));
+			}
+		while (data[e] == '\r' || data[e] == '\n') e++;
+		b = e;
+		}
+
+	uri_list_parse_encoded_chars(list);
+
+	return list;
+}
+
+GList *uri_filelist_from_text(gchar *data, gint files_only)
+{
+	GList *path_list = uri_list_from_text(data, files_only);
+	GList *filelist = filelist_from_path_list(path_list);
+	string_list_free(path_list);
+	return filelist;
+}
+
+gchar *uri_text_from_list(GList *list, gint *len, gint plain_text)
+{
+	gchar *uri_text = NULL;
+	GString *string;
+	GList *work;
+
+	if (!list)
+		{
+		if (len) *len = 0;
+		return NULL;
+		}
+
+	string = g_string_new("");
+
+	work = list;
+	while (work)
+		{
+		const gchar *name8;	/* dnd filenames are in utf-8 */
+
+		name8 = work->data;
+
+		if (!plain_text)
+			{
+			gchar *escaped;
+
+			escaped = uri_text_escape(name8);
+			g_string_append(string, "file:");
+			g_string_append(string, escaped);
+			g_free(escaped);
+
+			g_string_append(string, "\r\n");
+			}
+		else
+			{
+			g_string_append(string, name8);
+			if (work->next) g_string_append(string, "\n");
+			}
+
+		work = work->next;
+		}
+
+	uri_text = string->str;
+	if (len) *len = string->len;
+	g_string_free(string, FALSE);
+
+	return uri_text;
+}
+
+gchar *uri_text_from_filelist(GList *list, gint *len, gint plain_text)
+{
+	GList *path_list = filelist_to_path_list(list);
+	gchar *ret = uri_text_from_list(path_list, len, plain_text);
+	string_list_free(path_list);
+	return ret;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/uri_utils.h	Sun Jul 20 15:16:05 2008 +0000
@@ -0,0 +1,25 @@
+/*
+ * Geeqie
+ * Copyright (C) 2008 The Geeqie Team
+ *
+ * Author: John Ellis, Vladimir Nadvornik, Laurent Monin
+ *
+ * This software is released under the GNU General Public License (GNU GPL).
+ * Please read the included file COPYING for more information.
+ * This software comes with no warranty of any kind, use at your own risk!
+ */
+
+#ifndef URI_UTILS_H
+#define URI_UTILS_H
+
+/* dnd data parsers (uris) */
+
+gchar *uri_text_escape(const gchar *text);
+void uri_text_decode(gchar *text);
+
+GList *uri_list_from_text(gchar *data, gint files_only);
+GList *uri_filelist_from_text(gchar *data, gint files_only);
+gchar *uri_text_from_list(GList *list, gint *len, gint plain_text);
+gchar *uri_text_from_filelist(GList *list, gint *len, gint plain_text);
+
+#endif /* URI_UTILS_H */
--- a/src/view_dir.c	Sun Jul 20 15:04:40 2008 +0000
+++ b/src/view_dir.c	Sun Jul 20 15:16:05 2008 +0000
@@ -18,11 +18,11 @@
 #include "filedata.h"
 #include "layout_image.h"
 #include "layout_util.h"
-#include "ui_bookmark.h"
 #include "ui_fileops.h"
 #include "ui_tree_edit.h"
 #include "ui_menu.h"
 #include "utilops.h"
+#include "uri_utils.h"
 #include "view_dir_list.h"
 #include "view_dir_tree.h"
 
--- a/src/view_file_icon.c	Sun Jul 20 15:04:40 2008 +0000
+++ b/src/view_file_icon.c	Sun Jul 20 15:16:05 2008 +0000
@@ -27,10 +27,10 @@
 #include "menu.h"
 #include "thumb.h"
 #include "utilops.h"
-#include "ui_bookmark.h"
 #include "ui_fileops.h"
 #include "ui_menu.h"
 #include "ui_tree_edit.h"
+#include "uri_utils.h"
 #include "view_file.h"
 
 #include <gdk/gdkkeysyms.h> /* for keyboard values */
--- a/src/view_file_list.c	Sun Jul 20 15:04:40 2008 +0000
+++ b/src/view_file_list.c	Sun Jul 20 15:16:05 2008 +0000
@@ -23,10 +23,10 @@
 #include "menu.h"
 #include "thumb.h"
 #include "utilops.h"
-#include "ui_bookmark.h"
 #include "ui_fileops.h"
 #include "ui_menu.h"
 #include "ui_tree_edit.h"
+#include "uri_utils.h"
 #include "view_file.h"
 
 #include <gdk/gdkkeysyms.h> /* for keyboard values */