[Xfce4-commits] r22840 - in xarchiver/branches/xarchiver-psybsd: . libxarchiver po src

Stephan Arts stephan at xfce.org
Sun Aug 20 22:03:26 UTC 2006


Author: stephan
Date: 2006-08-20 22:03:24 +0000 (Sun, 20 Aug 2006)
New Revision: 22840

Added:
   xarchiver/branches/xarchiver-psybsd/src/add_dialog.c
   xarchiver/branches/xarchiver-psybsd/src/add_dialog.h
Modified:
   xarchiver/branches/xarchiver-psybsd/TODO
   xarchiver/branches/xarchiver-psybsd/libxarchiver/archive-support-gnu-tar.c
   xarchiver/branches/xarchiver-psybsd/libxarchiver/archive-support-gnu-tar.h
   xarchiver/branches/xarchiver-psybsd/libxarchiver/archive-support-zip.c
   xarchiver/branches/xarchiver-psybsd/libxarchiver/archive-support-zip.h
   xarchiver/branches/xarchiver-psybsd/libxarchiver/archive-support.c
   xarchiver/branches/xarchiver-psybsd/libxarchiver/archive-support.h
   xarchiver/branches/xarchiver-psybsd/libxarchiver/archive.h
   xarchiver/branches/xarchiver-psybsd/libxarchiver/internals.c
   xarchiver/branches/xarchiver-psybsd/po/nl.po
   xarchiver/branches/xarchiver-psybsd/src/Makefile.am
   xarchiver/branches/xarchiver-psybsd/src/extract_dialog.h
   xarchiver/branches/xarchiver-psybsd/src/main.c
   xarchiver/branches/xarchiver-psybsd/src/main_window.c
   xarchiver/branches/xarchiver-psybsd/src/main_window.h
   xarchiver/branches/xarchiver-psybsd/src/main_window_menu_bar.c
   xarchiver/branches/xarchiver-psybsd/src/main_window_menu_bar.h
   xarchiver/branches/xarchiver-psybsd/src/main_window_tool_bar.c
Log:
Added extract options
Fixed .tar (.Z .gz and .bz2) add and remove (latter is untested)


Modified: xarchiver/branches/xarchiver-psybsd/TODO
===================================================================
--- xarchiver/branches/xarchiver-psybsd/TODO	2006-08-20 18:54:48 UTC (rev 22839)
+++ xarchiver/branches/xarchiver-psybsd/TODO	2006-08-20 22:03:24 UTC (rev 22840)
@@ -26,6 +26,9 @@
     (Can be replaced by an internal libmime)
 +-+-+-+
 
+  Increase performance
++-+-+-+ 
+
   Implement multi-threading (for libarchive support)
 +-+-+-+
 

Modified: xarchiver/branches/xarchiver-psybsd/libxarchiver/archive-support-gnu-tar.c
===================================================================
--- xarchiver/branches/xarchiver-psybsd/libxarchiver/archive-support-gnu-tar.c	2006-08-20 18:54:48 UTC (rev 22839)
+++ xarchiver/branches/xarchiver-psybsd/libxarchiver/archive-support-gnu-tar.c	2006-08-20 22:03:24 UTC (rev 22840)
@@ -19,6 +19,7 @@
 #define EXO_API_SUBJECT_TO_CHANGE
 
 #include <glib.h>
+#include <glib/gstdio.h>
 
 #include <glib-object.h>
 #include <thunar-vfs/thunar-vfs.h>
@@ -29,11 +30,33 @@
 
 #include "internals.h"
 
+enum
+{
+	LXA_ARCHIVE_SUPPORT_GNU_TAR_EXTRACT_OVERWRITE = 1,
+	LXA_ARCHIVE_SUPPORT_GNU_TAR_EXTRACT_TOUCH,
+	LXA_ARCHIVE_SUPPORT_GNU_TAR_EXTRACT_STRIP
+};
+
 void
 lxa_archive_support_gnu_tar_init(LXAArchiveSupportGnuTar *support);
 void
 lxa_archive_support_gnu_tar_class_init(LXAArchiveSupportGnuTarClass *supportclass);
 
+void
+lxa_archive_support_gnu_tar_compress_watch(GPid pid, gint status, gpointer data);
+void
+lxa_archive_support_gnu_tar_decompress_watch(GPid pid, gint status, gpointer data);
+
+gboolean
+lxa_archive_support_gnu_tar_compress_parse_output(GIOChannel *ioc, GIOCondition cond, gpointer data);
+gboolean
+lxa_archive_support_gnu_tar_decompress_parse_output(GIOChannel *ioc, GIOCondition cond, gpointer data);
+
+void
+lxa_archive_support_gnu_tar_set_property(GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec);
+void
+lxa_archive_support_gnu_tar_get_property(GObject *object, guint prop_id, GValue *value, GParamSpec *pspec);
+
 GType
 lxa_archive_support_gnu_tar_get_type ()
 {
@@ -90,10 +113,34 @@
 void
 lxa_archive_support_gnu_tar_class_init(LXAArchiveSupportGnuTarClass *supportclass)
 {
-	/* TODO
-	 * Implement properties.
-	 *
-	 */
+	GObjectClass *object_class = G_OBJECT_CLASS (supportclass);
+	GParamSpec *pspec = NULL;
+
+	object_class->set_property = lxa_archive_support_gnu_tar_set_property;
+	object_class->get_property = lxa_archive_support_gnu_tar_get_property;
+
+	pspec = g_param_spec_boolean("extract-overwrite",
+		_("Overwrite existing files"),
+		_("Overwrite existing files on extraction"),
+		FALSE,
+		G_PARAM_READWRITE);
+	g_object_class_install_property(object_class, LXA_ARCHIVE_SUPPORT_GNU_TAR_EXTRACT_OVERWRITE, pspec);
+
+	pspec = g_param_spec_boolean("extract-touch",
+		"Touch files",
+		"Touch files",
+		FALSE,
+		G_PARAM_READWRITE);
+	g_object_class_install_property(object_class, LXA_ARCHIVE_SUPPORT_GNU_TAR_EXTRACT_TOUCH, pspec);
+
+	pspec = g_param_spec_uint("extract-strip",
+		"Strip directories",
+		"Strip directories",
+		0,
+		128,
+		0,
+		G_PARAM_READWRITE);
+	g_object_class_install_property(object_class, LXA_ARCHIVE_SUPPORT_GNU_TAR_EXTRACT_STRIP, pspec);
 }
 
 LXAArchiveSupport*
@@ -107,115 +154,327 @@
 }
 
 gint
-lxa_archive_support_gnu_tar_add(LXAArchiveSupport *support, LXAArchive *archive, GSList *filenames)
+lxa_archive_support_gnu_tar_add(LXAArchive *archive, GSList *filenames)
 {
-	if(!LXA_IS_ARCHIVE_SUPPORT_GNU_TAR(support))
+	if(!LXA_IS_ARCHIVE_SUPPORT_GNU_TAR(archive->support))
 	{
 		g_critical("Support is not GNU TAR");
 		return -1;
 	}
 
-	if(!lxa_archive_support_mime_supported(support, archive->mime))
+	if(!lxa_archive_support_mime_supported(archive->support, archive->mime))
 	{
 		return 1;
 	}
 	else
 	{
 		gchar *command = NULL;
-		gchar *files = lxa_concat_filenames(filenames);
-		if(g_file_test(archive->path, G_FILE_TEST_EXISTS))
+		archive->files = lxa_concat_filenames(filenames);
+		lxa_archive_set_status(archive, LXA_ARCHIVESTATUS_ADD);
+		if(!g_file_test(archive->path, G_FILE_TEST_EXISTS))
 		{
 			if(!g_strcasecmp((gchar *)archive->mime, "application/x-tar"))
-				command = g_strconcat(LXA_ARCHIVE_SUPPORT_GNU_TAR(support)->app_name, " -rf ", archive->path, " ", files, NULL);
+				command = g_strconcat(LXA_ARCHIVE_SUPPORT_GNU_TAR(archive->support)->app_name, " -cf ", archive->path, " ", archive->files, NULL);
 			if(!g_strcasecmp((gchar *)archive->mime, "application/x-tarz"))
-				command = g_strconcat(LXA_ARCHIVE_SUPPORT_GNU_TAR(support)->app_name, " -Zrf ", archive->path, " ", files, NULL);
+				command = g_strconcat(LXA_ARCHIVE_SUPPORT_GNU_TAR(archive->support)->app_name, " -Zcf ", archive->path, " ", archive->files, NULL);
 			if(!g_strcasecmp((gchar *)archive->mime, "application/x-compressed-tar"))
-				command = g_strconcat(LXA_ARCHIVE_SUPPORT_GNU_TAR(support)->app_name, " -zrf ", archive->path, " ", files, NULL);
+				command = g_strconcat(LXA_ARCHIVE_SUPPORT_GNU_TAR(archive->support)->app_name, " -zcf ", archive->path, " ", archive->files, NULL);
 			if(!g_strcasecmp((gchar *)archive->mime, "application/x-bzip-compressed-tar"))
-				command = g_strconcat(LXA_ARCHIVE_SUPPORT_GNU_TAR(support)->app_name, " -jrf ", archive->path, " ", files, NULL);
+				command = g_strconcat(LXA_ARCHIVE_SUPPORT_GNU_TAR(archive->support)->app_name, " -jcf ", archive->path, " ", archive->files, NULL);
+			if(command)
+				lxa_execute(command, archive, NULL, NULL, NULL, NULL);
 		} else
 		{
 			if(!g_strcasecmp((gchar *)archive->mime, "application/x-tar"))
-				command = g_strconcat(LXA_ARCHIVE_SUPPORT_GNU_TAR(support)->app_name, " -cf ", archive->path, " ", files, NULL);
+			{
+				command = g_strconcat(LXA_ARCHIVE_SUPPORT_GNU_TAR(archive->support)->app_name, " -rf ", archive->path, " ", archive->files, NULL);
+				lxa_execute(command, archive, NULL, NULL, NULL, NULL);
+				g_free(command);
+				return 0;
+			}
+			archive->tmp_file = g_strconcat(lxa_tmp_dir, "/xarchiver-XXXXXX" , NULL);
+			g_mkstemp(archive->tmp_file);
+			g_unlink(archive->tmp_file);
 			if(!g_strcasecmp((gchar *)archive->mime, "application/x-tarz"))
-				command = g_strconcat(LXA_ARCHIVE_SUPPORT_GNU_TAR(support)->app_name, " -Zcf ", archive->path, " ", files, NULL);
+				command = g_strconcat("uncompress -c ", archive->path, NULL);
 			if(!g_strcasecmp((gchar *)archive->mime, "application/x-compressed-tar"))
-				command = g_strconcat(LXA_ARCHIVE_SUPPORT_GNU_TAR(support)->app_name, " -zcf ", archive->path, " ", files, NULL);
+				command = g_strconcat("gunzip -c ", archive->path, NULL);
 			if(!g_strcasecmp((gchar *)archive->mime, "application/x-bzip-compressed-tar"))
-				command = g_strconcat(LXA_ARCHIVE_SUPPORT_GNU_TAR(support)->app_name, " -jcf ", archive->path, " ", files, NULL);
+				command = g_strconcat("bunzip -c ", archive->path, NULL);
+			lxa_execute(command, archive, lxa_archive_support_gnu_tar_decompress_watch, NULL, lxa_archive_support_gnu_tar_decompress_parse_output, NULL);
+			g_free(command);
 		}
-		if(command)
-			lxa_execute(command, archive, NULL, NULL, NULL, NULL);
 	}
 	return 0;
 }
 
 gint
-lxa_archive_support_gnu_tar_extract(LXAArchiveSupport *support, LXAArchive *archive, gchar *dest_path, GSList *filenames)
+lxa_archive_support_gnu_tar_extract(LXAArchive *archive, gchar *dest_path, GSList *filenames)
 {
-	if(!LXA_IS_ARCHIVE_SUPPORT_GNU_TAR(support))
+	if(!LXA_IS_ARCHIVE_SUPPORT_GNU_TAR(archive->support))
 	{
 		g_critical("Support is not GNU TAR");
 		return -1;
 	}
 
-	if(!lxa_archive_support_mime_supported(support, archive->mime))
+	if(!lxa_archive_support_mime_supported(archive->support, archive->mime))
 	{
 		return 1;
 	}
 	else
 	{
 		gchar *command = NULL;
-		gchar *files = lxa_concat_filenames(filenames);
+		archive->files = lxa_concat_filenames(filenames);
+		lxa_archive_set_status(archive, LXA_ARCHIVESTATUS_EXTRACT);
 		if(g_file_test(archive->path, G_FILE_TEST_EXISTS))
 		{
 			if(!g_strcasecmp((gchar *)archive->mime, "application/x-tar"))
-				command = g_strconcat(LXA_ARCHIVE_SUPPORT_GNU_TAR(support)->app_name, " -xf ", archive->path, " -C ", dest_path, " ", files, NULL);
+			{
+				command = g_strconcat(LXA_ARCHIVE_SUPPORT_GNU_TAR(archive->support)->app_name, " -xf ", archive->path,
+						" -C ", dest_path, 
+						LXA_ARCHIVE_SUPPORT_GNU_TAR(archive->support)->_extr_overwrite?" --overwrite ":" ",
+						LXA_ARCHIVE_SUPPORT_GNU_TAR(archive->support)->_extr_touch?" --touch ":" ",
+						archive->files, NULL);
+			}
 			if(!g_strcasecmp((gchar *)archive->mime, "application/x-tarz"))
-				command = g_strconcat(LXA_ARCHIVE_SUPPORT_GNU_TAR(support)->app_name, " -Zxf ", archive->path, " -C ", dest_path, " ", files, NULL);
+			{
+				command = g_strconcat(LXA_ARCHIVE_SUPPORT_GNU_TAR(archive->support)->app_name, " -Zxf ", archive->path,
+						" -C ", dest_path, 
+						LXA_ARCHIVE_SUPPORT_GNU_TAR(archive->support)->_extr_overwrite?" --overwrite ":" ",
+						LXA_ARCHIVE_SUPPORT_GNU_TAR(archive->support)->_extr_touch?" --touch ":" ",
+						archive->files, NULL);
+			}
 			if(!g_strcasecmp((gchar *)archive->mime, "application/x-compressed-tar"))
-				command = g_strconcat(LXA_ARCHIVE_SUPPORT_GNU_TAR(support)->app_name, " -zxf ", archive->path, " -C ", dest_path, " ", files, NULL);
+			{
+				command = g_strconcat(LXA_ARCHIVE_SUPPORT_GNU_TAR(archive->support)->app_name, " -zxf ", archive->path,
+						" -C ", dest_path, 
+						LXA_ARCHIVE_SUPPORT_GNU_TAR(archive->support)->_extr_overwrite?" --overwrite ":" ",
+						LXA_ARCHIVE_SUPPORT_GNU_TAR(archive->support)->_extr_touch?" --touch ":" ",
+						archive->files, NULL);
+			}
 			if(!g_strcasecmp((gchar *)archive->mime, "application/x-bzip-compressed-tar"))
-				command = g_strconcat(LXA_ARCHIVE_SUPPORT_GNU_TAR(support)->app_name, " -jxf ", archive->path, " -C ", dest_path, " ", files, NULL);
+			{
+				command = g_strconcat(LXA_ARCHIVE_SUPPORT_GNU_TAR(archive->support)->app_name, " -jxf ", archive->path,
+						" -C ", dest_path, 
+						LXA_ARCHIVE_SUPPORT_GNU_TAR(archive->support)->_extr_overwrite?" --overwrite ":" ",
+						LXA_ARCHIVE_SUPPORT_GNU_TAR(archive->support)->_extr_touch?" --touch ":" ",
+						archive->files, NULL);
+			}
 		} else
 			return 1;
 		if(command)
+		{
 			lxa_execute(command, archive, NULL, NULL, NULL, NULL);
+			g_free(command);
+		}
 	}
 	return 0;
 }
 
 gint
-lxa_archive_support_gnu_tar_remove(LXAArchiveSupport *support, LXAArchive *archive, GSList *filenames)
+lxa_archive_support_gnu_tar_remove(LXAArchive *archive, GSList *filenames)
 {
-	if(!LXA_IS_ARCHIVE_SUPPORT_GNU_TAR(support))
+	if(!LXA_IS_ARCHIVE_SUPPORT_GNU_TAR(archive->support))
 	{
 		g_critical("Support is not GNU TAR");
 		return -1;
 	}
 
-	if(!lxa_archive_support_mime_supported(support, archive->mime))
+	if(!lxa_archive_support_mime_supported(archive->support, archive->mime))
 	{
 		return 1;
 	}
 	else
 	{
 		gchar *command = NULL;
-		gchar *files = lxa_concat_filenames(filenames);
+		archive->files = lxa_concat_filenames(filenames);
+		lxa_archive_set_status(archive, LXA_ARCHIVESTATUS_REMOVE);
 		if(g_file_test(archive->path, G_FILE_TEST_EXISTS))
 		{
 			if(!g_strcasecmp((gchar *)archive->mime, "application/x-tar"))
-				command = g_strconcat(LXA_ARCHIVE_SUPPORT_GNU_TAR(support)->app_name, " -f ", archive->path, " --delete ", files, NULL);
+			{
+				command = g_strconcat(LXA_ARCHIVE_SUPPORT_GNU_TAR(archive->support)->app_name, " -f ", archive->path, " --delete ", archive->files, NULL);
+				lxa_execute(command, archive, NULL, NULL, NULL, NULL);
+				g_free(command);
+				return 0;
+			}
+			archive->tmp_file = g_strconcat(lxa_tmp_dir, "/xarchiver-XXXXXX" , NULL);
+			g_mkstemp(archive->tmp_file);
+			g_unlink(archive->tmp_file);
 			if(!g_strcasecmp((gchar *)archive->mime, "application/x-tarz"))
-				command = g_strconcat(LXA_ARCHIVE_SUPPORT_GNU_TAR(support)->app_name, " -Zf ", archive->path, " --delete ", files, NULL);
+				command = g_strconcat("uncompress -c ", archive->path, NULL);
 			if(!g_strcasecmp((gchar *)archive->mime, "application/x-compressed-tar"))
-				command = g_strconcat(LXA_ARCHIVE_SUPPORT_GNU_TAR(support)->app_name, " -zf ", archive->path, " --delete ", files, NULL);
+				command = g_strconcat("gunzip -c ", archive->path, NULL);
 			if(!g_strcasecmp((gchar *)archive->mime, "application/x-bzip-compressed-tar"))
-				command = g_strconcat(LXA_ARCHIVE_SUPPORT_GNU_TAR(support)->app_name, " -jf ", archive->path, " --delete ", files, NULL);
+				command = g_strconcat("bunzip -c ", archive->path, NULL);
+			lxa_execute(command, archive, lxa_archive_support_gnu_tar_decompress_watch, NULL, lxa_archive_support_gnu_tar_decompress_parse_output, NULL);
+			g_free(command);
 		} else
 			return 1;
-		if(command)
-			lxa_execute(command, archive, NULL, NULL, NULL, NULL);
 	}
 	return 0;
 }
+
+void
+lxa_archive_support_gnu_tar_decompress_watch(GPid pid, gint status, gpointer data)
+{
+	LXAArchive *archive = data;
+	archive->child_pid = 0;
+
+}
+
+void
+lxa_archive_support_gnu_tar_compress_watch(GPid pid, gint status, gpointer data)
+{
+	LXAArchive *archive = data;
+	archive->child_pid = 0;
+	gchar *command = NULL;
+
+	if(!g_strcasecmp((gchar *)archive->mime, "application/x-tarz"))
+		command = g_strconcat("compress -c ", archive->tmp_file, NULL);
+	if(!g_strcasecmp((gchar *)archive->mime, "application/x-compressed-tar"))
+		command = g_strconcat("gzip -c ", archive->tmp_file, NULL);
+	if(!g_strcasecmp((gchar *)archive->mime, "application/x-bzip-compressed-tar"))
+		command = g_strconcat("bzip -c ", archive->tmp_file, NULL);
+	lxa_execute(command, archive, NULL, NULL, lxa_archive_support_gnu_tar_compress_parse_output, NULL);
+}
+
+gboolean
+lxa_archive_support_gnu_tar_decompress_parse_output(GIOChannel *ioc, GIOCondition cond, gpointer data)
+{
+	FILE *out_file = NULL;
+	LXAArchive *archive = data;
+	gchar *buf = g_new0(gchar, 1024);
+	guint read = 0;
+	GError *error = NULL;
+	gchar *command = NULL;
+
+	if(cond & (G_IO_PRI | G_IO_IN))
+	{
+		out_file = fopen(archive->tmp_file, "ab");
+		if(!out_file)
+			g_critical("Could not open file");
+
+		while(g_io_channel_read_chars(ioc, buf, 1024, &read, &error) == G_IO_STATUS_NORMAL)
+		{
+			if(read)
+			{
+				fwrite(buf, 1, read, out_file);
+			}
+			read = 0;
+		}
+		fclose(out_file);
+	}
+	g_free(buf);
+	if(cond & (G_IO_ERR | G_IO_HUP | G_IO_NVAL) )
+	{
+#ifdef DEBUG
+		g_debug("shutting down ioc");
+#endif
+		g_io_channel_shutdown ( ioc,TRUE,NULL );
+		g_io_channel_unref (ioc);
+
+		if(!(cond & G_IO_ERR))
+		{
+			switch(archive->status)
+			{
+				case(LXA_ARCHIVESTATUS_ADD):
+					g_unlink(archive->path);
+					command = g_strconcat(LXA_ARCHIVE_SUPPORT_GNU_TAR(archive->support)->app_name, " -rf ", archive->tmp_file, " ", archive->files, NULL);
+					lxa_execute(command, archive, lxa_archive_support_gnu_tar_compress_watch, NULL, NULL, NULL);
+					g_free(command);
+					break;
+				case(LXA_ARCHIVESTATUS_REMOVE):
+					g_unlink(archive->path);
+					command = g_strconcat(LXA_ARCHIVE_SUPPORT_GNU_TAR(archive->support)->app_name, " -f ", archive->tmp_file, " --delete ", archive->files, NULL);
+					lxa_execute(command, archive, lxa_archive_support_gnu_tar_compress_watch, NULL, NULL, NULL);
+					g_free(command);
+					break;
+				default:
+					break;
+			}
+		}
+		return FALSE; 
+	}
+	return TRUE;
+}
+
+gboolean
+lxa_archive_support_gnu_tar_compress_parse_output(GIOChannel *ioc, GIOCondition cond, gpointer data)
+{
+	FILE *out_file = NULL;
+	LXAArchive *archive = data;
+	gchar *buf = g_new0(gchar, 1024);
+	guint read = 0;
+	GError *error = NULL;
+
+	if(cond & (G_IO_PRI | G_IO_IN))
+	{
+		out_file = fopen(archive->path, "ab");
+		if(!out_file)
+			g_critical("Could not open file");
+
+		while(g_io_channel_read_chars(ioc, buf, 1024, &read, &error) == G_IO_STATUS_NORMAL)
+		{
+			if(read)
+			{
+				fwrite(buf, 1, read, out_file);
+			}
+			read = 0;
+		}
+		fclose(out_file);
+	}
+	g_free(buf);
+	if(cond & (G_IO_ERR | G_IO_HUP | G_IO_NVAL) )
+	{
+#ifdef DEBUG
+		g_debug("shutting down ioc");
+#endif
+		g_io_channel_shutdown ( ioc,TRUE,NULL );
+		g_io_channel_unref (ioc);
+		if(archive->tmp_file)
+			g_unlink(archive->tmp_file);
+		return FALSE;
+	}
+	return TRUE;
+}
+
+void
+lxa_archive_support_gnu_tar_set_property(GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec)
+{
+	switch(prop_id)
+	{
+		case LXA_ARCHIVE_SUPPORT_GNU_TAR_EXTRACT_OVERWRITE:
+			LXA_ARCHIVE_SUPPORT_GNU_TAR(object)->_extr_overwrite = g_value_get_boolean(value);
+			break;
+		case LXA_ARCHIVE_SUPPORT_GNU_TAR_EXTRACT_TOUCH:
+			LXA_ARCHIVE_SUPPORT_GNU_TAR(object)->_extr_touch = g_value_get_boolean(value);
+			break;
+		case LXA_ARCHIVE_SUPPORT_GNU_TAR_EXTRACT_STRIP:
+			LXA_ARCHIVE_SUPPORT_GNU_TAR(object)->_extr_strip = g_value_get_uint(value);
+			break;
+		default:
+			G_OBJECT_WARN_INVALID_PROPERTY_ID(object,prop_id,pspec);
+			break;
+	}
+}
+
+void
+lxa_archive_support_gnu_tar_get_property(GObject *object, guint prop_id, GValue *value, GParamSpec *pspec)
+{
+	switch(prop_id)
+	{
+		case LXA_ARCHIVE_SUPPORT_GNU_TAR_EXTRACT_OVERWRITE:
+			g_value_set_boolean(value, LXA_ARCHIVE_SUPPORT_GNU_TAR(object)->_extr_overwrite);
+			break;
+		case LXA_ARCHIVE_SUPPORT_GNU_TAR_EXTRACT_TOUCH:
+			g_value_set_boolean(value, LXA_ARCHIVE_SUPPORT_GNU_TAR(object)->_extr_touch);
+			break;
+		case LXA_ARCHIVE_SUPPORT_GNU_TAR_EXTRACT_STRIP:
+			g_value_set_uint(value, LXA_ARCHIVE_SUPPORT_GNU_TAR(object)->_extr_strip);
+			break;
+		default:
+			G_OBJECT_WARN_INVALID_PROPERTY_ID(object,prop_id,pspec);
+			break;
+	}
+}

Modified: xarchiver/branches/xarchiver-psybsd/libxarchiver/archive-support-gnu-tar.h
===================================================================
--- xarchiver/branches/xarchiver-psybsd/libxarchiver/archive-support-gnu-tar.h	2006-08-20 18:54:48 UTC (rev 22839)
+++ xarchiver/branches/xarchiver-psybsd/libxarchiver/archive-support-gnu-tar.h	2006-08-20 22:03:24 UTC (rev 22840)
@@ -47,6 +47,9 @@
 {
 	LXAArchiveSupport parent;
 	gchar *app_name;
+	gboolean _extr_overwrite;
+	gboolean _extr_touch;
+	guint    _extr_strip;
 };
 
 typedef struct _LXAArchiveSupportGnuTarClass LXAArchiveSupportGnuTarClass;
@@ -59,9 +62,9 @@
 GType                lxa_archive_support_gnu_tar_get_type(void);
 LXAArchiveSupport *  lxa_archive_support_gnu_tar_new();
 
-gint                 lxa_archive_support_gnu_tar_add(LXAArchiveSupport *, LXAArchive *, GSList *);
-gint                 lxa_archive_support_gnu_tar_extract(LXAArchiveSupport *, LXAArchive *, gchar *, GSList *);
-gint                 lxa_archive_support_gnu_tar_remove(LXAArchiveSupport *, LXAArchive *, GSList *);
+gint                 lxa_archive_support_gnu_tar_add(LXAArchive *, GSList *);
+gint                 lxa_archive_support_gnu_tar_extract(LXAArchive *, gchar *, GSList *);
+gint                 lxa_archive_support_gnu_tar_remove(LXAArchive *, GSList *);
 
 G_END_DECLS
 

Modified: xarchiver/branches/xarchiver-psybsd/libxarchiver/archive-support-zip.c
===================================================================
--- xarchiver/branches/xarchiver-psybsd/libxarchiver/archive-support-zip.c	2006-08-20 18:54:48 UTC (rev 22839)
+++ xarchiver/branches/xarchiver-psybsd/libxarchiver/archive-support-zip.c	2006-08-20 22:03:24 UTC (rev 22840)
@@ -28,11 +28,25 @@
 
 #include "internals.h"
 
+enum
+{
+	LXA_ARCHIVE_SUPPORT_ZIP_EXTRACT_OVERWRITE = 1,
+	LXA_ARCHIVE_SUPPORT_ZIP_EXTRACT_FRESHEN_EXISTING,
+	LXA_ARCHIVE_SUPPORT_ZIP_EXTRACT_UPDATE_EXISTING,
+	LXA_ARCHIVE_SUPPORT_ZIP_ADD_COMPRESSION_LEVEL,
+	LXA_ARCHIVE_SUPPORT_ZIP_PASSWORD,
+};
+
 void
 lxa_archive_support_zip_init(LXAArchiveSupportZip *support);
 void
 lxa_archive_support_zip_class_init(LXAArchiveSupportZipClass *supportclass);
 
+void
+lxa_archive_support_zip_set_property(GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec);
+void
+lxa_archive_support_zip_get_property(GObject *object, guint prop_id, GValue *value, GParamSpec *pspec);
+
 GType
 lxa_archive_support_zip_get_type ()
 {
@@ -75,10 +89,18 @@
 void
 lxa_archive_support_zip_class_init(LXAArchiveSupportZipClass *supportclass)
 {
-	/*
-	GObjectClass *gobject_class = G_OBJECT_CLASS (supportclass);
-	LXAArchiveSupportZipClass *klass = LXA_ARCHIVE_SUPPORT_ZIP_CLASS (supportclass);
-	*/
+	GObjectClass *object_class = G_OBJECT_CLASS (supportclass);
+	GParamSpec *pspec = NULL;
+
+	object_class->set_property = lxa_archive_support_zip_set_property;
+	object_class->get_property = lxa_archive_support_zip_get_property;
+
+	pspec = g_param_spec_boolean("extract-overwrite",
+		_("Overwrite existing files"),
+		_("Overwrite existing files on extraction"),
+		FALSE,
+		G_PARAM_READWRITE);
+	g_object_class_install_property(object_class, LXA_ARCHIVE_SUPPORT_ZIP_EXTRACT_OVERWRITE, pspec);
 }
 
 LXAArchiveSupport*
@@ -92,15 +114,15 @@
 }
 
 gint
-lxa_archive_support_zip_add(LXAArchiveSupport *support, LXAArchive *archive, GSList *filenames)
+lxa_archive_support_zip_add(LXAArchive *archive, GSList *filenames)
 {
-	if(!LXA_IS_ARCHIVE_SUPPORT_ZIP(support))
+	if(!LXA_IS_ARCHIVE_SUPPORT_ZIP(archive->support))
 	{
 		g_critical("Support is not zip");
 		return -1;
 	}
 
-	if(!lxa_archive_support_mime_supported(support, archive->mime))
+	if(!lxa_archive_support_mime_supported(archive->support, archive->mime))
 	{
 		return 1;
 	}
@@ -119,15 +141,15 @@
 }
 
 gint
-lxa_archive_support_zip_extract(LXAArchiveSupport *support, LXAArchive *archive, gchar *dest_path, GSList *filenames)
+lxa_archive_support_zip_extract(LXAArchive *archive, gchar *dest_path, GSList *filenames)
 {
-	if(!LXA_IS_ARCHIVE_SUPPORT_ZIP(support))
+	if(!LXA_IS_ARCHIVE_SUPPORT_ZIP(archive->support))
 	{
 		g_critical("Support is not Zip");
 		return -1;
 	}
 
-	if(!lxa_archive_support_mime_supported(support, archive->mime))
+	if(!lxa_archive_support_mime_supported(archive->support, archive->mime))
 	{
 		return 1;
 	}
@@ -151,15 +173,15 @@
 }
 
 gint
-lxa_archive_support_zip_remove(LXAArchiveSupport *support, LXAArchive *archive, GSList *filenames)
+lxa_archive_support_zip_remove(LXAArchive *archive, GSList *filenames)
 {
-	if(!LXA_IS_ARCHIVE_SUPPORT_ZIP(support))
+	if(!LXA_IS_ARCHIVE_SUPPORT_ZIP(archive->support))
 	{
 		g_critical("Support is not zip");
 		return -1;
 	}
 
-	if(!lxa_archive_support_mime_supported(support, archive->mime))
+	if(!lxa_archive_support_mime_supported(archive->support, archive->mime))
 	{
 		return 1;
 	}
@@ -176,3 +198,31 @@
 	}
 	return 0;
 }
+
+void
+lxa_archive_support_zip_get_property(GObject *object, guint prop_id, GValue *value, GParamSpec *pspec)
+{
+	switch(prop_id)
+	{
+		case LXA_ARCHIVE_SUPPORT_ZIP_EXTRACT_OVERWRITE:
+			g_value_set_boolean(value, LXA_ARCHIVE_SUPPORT_ZIP(object)->_extr_overwrite);
+			break;
+		default:
+			G_OBJECT_WARN_INVALID_PROPERTY_ID(object,prop_id,pspec);
+			break;
+	}
+}
+
+void
+lxa_archive_support_zip_set_property(GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec)
+{
+	switch(prop_id)
+	{
+		case LXA_ARCHIVE_SUPPORT_ZIP_EXTRACT_OVERWRITE:
+			LXA_ARCHIVE_SUPPORT_ZIP(object)->_extr_overwrite = g_value_get_boolean(value);
+			break;
+		default:
+			G_OBJECT_WARN_INVALID_PROPERTY_ID(object,prop_id,pspec);
+			break;
+	}
+}

Modified: xarchiver/branches/xarchiver-psybsd/libxarchiver/archive-support-zip.h
===================================================================
--- xarchiver/branches/xarchiver-psybsd/libxarchiver/archive-support-zip.h	2006-08-20 18:54:48 UTC (rev 22839)
+++ xarchiver/branches/xarchiver-psybsd/libxarchiver/archive-support-zip.h	2006-08-20 22:03:24 UTC (rev 22840)
@@ -46,6 +46,7 @@
 struct _LXAArchiveSupportZip
 {
 	LXAArchiveSupport parent;
+	gboolean _extr_overwrite;
 };
 
 typedef struct _LXAArchiveSupportZipClass LXAArchiveSupportZipClass;
@@ -58,9 +59,9 @@
 GType                lxa_archive_support_zip_get_type(void);
 LXAArchiveSupport *  lxa_archive_support_zip_new();
 
-gint                 lxa_archive_support_zip_add(LXAArchiveSupport *, LXAArchive *, GSList *);
-gint                 lxa_archive_support_zip_extract(LXAArchiveSupport *, LXAArchive *, gchar *, GSList *);
-gint                 lxa_archive_support_zip_remove(LXAArchiveSupport *, LXAArchive *, GSList *);
+gint                 lxa_archive_support_zip_add(LXAArchive *, GSList *);
+gint                 lxa_archive_support_zip_extract(LXAArchive *, gchar *, GSList *);
+gint                 lxa_archive_support_zip_remove(LXAArchive *, GSList *);
 
 G_END_DECLS
 

Modified: xarchiver/branches/xarchiver-psybsd/libxarchiver/archive-support.c
===================================================================
--- xarchiver/branches/xarchiver-psybsd/libxarchiver/archive-support.c	2006-08-20 18:54:48 UTC (rev 22839)
+++ xarchiver/branches/xarchiver-psybsd/libxarchiver/archive-support.c	2006-08-20 22:03:24 UTC (rev 22840)
@@ -181,7 +181,8 @@
 	if(support->add)
 	{
 		lxa_archive_set_status(archive, LXA_ARCHIVESTATUS_ADD);
-		return support->add(support, archive, files);
+		archive->support = support;
+		return support->add(archive, files);
 	}
 	else
 		g_critical("ADD NOT IMPLEMENTED BY SUPPORT OBJECT '%s'", support->id);
@@ -194,7 +195,8 @@
 	if(support->extract)
 	{
 		lxa_archive_set_status(archive, LXA_ARCHIVESTATUS_EXTRACT);
-		return support->extract(support, archive, dest_path, files);
+		archive->support = support;
+		return support->extract(archive, dest_path, files);
 	}
 	else
 		g_critical("EXTRACT NOT IMPLEMENTED BY SUPPORT OBJECT '%s'", support->id);
@@ -207,7 +209,8 @@
 	if(support->remove)
 	{
 		lxa_archive_set_status(archive, LXA_ARCHIVESTATUS_REMOVE);
-		return support->remove(support, archive, files);
+		archive->support = support;
+		return support->remove(archive, files);
 	}
 	else
 		g_critical("REMOVE NOT IMPLEMENTED BY SUPPORT OBJECT '%s'", support->id);

Modified: xarchiver/branches/xarchiver-psybsd/libxarchiver/archive-support.h
===================================================================
--- xarchiver/branches/xarchiver-psybsd/libxarchiver/archive-support.h	2006-08-20 18:54:48 UTC (rev 22839)
+++ xarchiver/branches/xarchiver-psybsd/libxarchiver/archive-support.h	2006-08-20 22:03:24 UTC (rev 22840)
@@ -57,9 +57,9 @@
  * 
  * should be called instead.
  */
-	gint        (*add)(LXAArchiveSupport *support, LXAArchive *archive, GSList *files);
-	gint        (*extract)(LXAArchiveSupport *support, LXAArchive *archive, gchar *dest_path, GSList *files);
-	gint        (*remove)(LXAArchiveSupport *support, LXAArchive *archive, GSList *files);
+	gint        (*add)(LXAArchive *archive, GSList *files);
+	gint        (*extract)(LXAArchive *archive, gchar *dest_path, GSList *files);
+	gint        (*remove)(LXAArchive *archive, GSList *files);
 };
 
 typedef struct _LXAArchiveSupportClass LXAArchiveSupportClass;

Modified: xarchiver/branches/xarchiver-psybsd/libxarchiver/archive.h
===================================================================
--- xarchiver/branches/xarchiver-psybsd/libxarchiver/archive.h	2006-08-20 18:54:48 UTC (rev 22839)
+++ xarchiver/branches/xarchiver-psybsd/libxarchiver/archive.h	2006-08-20 22:03:24 UTC (rev 22840)
@@ -62,6 +62,9 @@
 	LXAArchiveStatus       status;
 	LXAArchiveStatus       old_status;
 	GPid                   child_pid;
+	gpointer               support;
+	gchar                 *tmp_file;
+	gchar                 *files;
 };
 
 typedef struct _LXAArchiveClass LXAArchiveClass;

Modified: xarchiver/branches/xarchiver-psybsd/libxarchiver/internals.c
===================================================================
--- xarchiver/branches/xarchiver-psybsd/libxarchiver/internals.c	2006-08-20 18:54:48 UTC (rev 22839)
+++ xarchiver/branches/xarchiver-psybsd/libxarchiver/internals.c	2006-08-20 22:03:24 UTC (rev 22840)
@@ -34,6 +34,8 @@
 	LXAArchive *archive = data;
 	archive->child_pid = 0;
 	lxa_archive_set_status(archive, LXA_ARCHIVESTATUS_IDLE);
+	if(archive->files)
+		g_free(archive->files);
 }
 
 gint

Modified: xarchiver/branches/xarchiver-psybsd/po/nl.po
===================================================================
--- xarchiver/branches/xarchiver-psybsd/po/nl.po	2006-08-20 18:54:48 UTC (rev 22839)
+++ xarchiver/branches/xarchiver-psybsd/po/nl.po	2006-08-20 22:03:24 UTC (rev 22840)
@@ -7,7 +7,7 @@
 msgstr ""
 "Project-Id-Version: xarchiver 0.3.9psybsd\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2006-08-19 01:15+0200\n"
+"POT-Creation-Date: 2006-08-20 23:45+0200\n"
 "PO-Revision-Date: 2006-07-20 16:36+0200\n"
 "Last-Translator: Stephan Arts <psybsd at gmail.com>\n"
 "Language-Team: Dutch <vertaling at vrijschrift.org>\n"
@@ -16,31 +16,64 @@
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
-#: ../src/main.c:49
+#: ../libxarchiver/archive-support-gnu-tar.c:123
+#: ../libxarchiver/archive-support-zip.c:100
+msgid "Overwrite existing files"
+msgstr "Bestaande bestanden overschrijven"
+
+#: ../libxarchiver/archive-support-gnu-tar.c:124
+#: ../libxarchiver/archive-support-zip.c:101
+msgid "Overwrite existing files on extraction"
+msgstr "Bestaande bestanden overschrijven tijdens uitpakken"
+
+#: ../src/main.c:47
 msgid "[destination path]"
 msgstr "[bestemmings map]"
 
-#: ../src/main.c:57
+#: ../src/main.c:55
 msgid "[archive path] [file1] [file2] ... [fileN]"
 msgstr "[archief map] [bestand1] [bestand2] ... [bestandN]"
 
-#: ../src/main.c:61
+#: ../src/main.c:59
 msgid "[file1] [file2] ... [fileN]"
 msgstr "[bestand1] [bestand2] ... [bestandN]"
 
-#: ../src/main.c:106
+#: ../src/main.c:62
+msgid "Version information"
+msgstr "Versie informatie"
+
+#: ../src/main.c:108
 msgid "[archive name]"
 msgstr "[archief naam]"
 
-#: ../src/main.c:159
+#: ../src/main.c:112
+#, c-format
+msgid ""
+"%s: %s\n"
+"Try xarchiver --help to see a full list of available command line options.\n"
+msgstr ""
+"%s: %s\n"
+"Probeer xarchiver --help om een volledige lijst te zien met beschikbare "
+"opties.\n"
+
+#: ../src/main.c:175
 msgid "Could not create archive, MIME-type unsupported"
 msgstr "Kan archief niet maken, MIME-type wordt niet ondersteund"
 
+#. Could not open archive (mime type not supported or file did not exsit)
+#: ../src/main.c:190
+#, fuzzy
+msgid "Could not open archive, MIME-type unsupported or file did not exist"
+msgstr ""
+"Kan archief niet openen, MIME-type wordt niet ondersteund of bestand bestaat "
+"niet"
+
 #: ../src/new_dialog.c:85
 msgid "Create new archive"
 msgstr "Maak nieuw archief"
 
-#: ../src/extract_dialog.c:78
+#: ../src/extract_dialog.c:78 ../src/main_window_menu_bar.c:117
+#: ../src/main_window_tool_bar.c:87
 msgid "Extract"
 msgstr "Uitpakken"
 
@@ -48,11 +81,22 @@
 msgid "Extract archive"
 msgstr "Archief uitpakken"
 
-#~ msgid "_Archive"
-#~ msgstr "_Archief"
+#: ../src/main_window_menu_bar.c:75
+msgid "_Archive"
+msgstr "_Archief"
 
-#~ msgid "A_ction"
-#~ msgstr "A_ctie"
+#: ../src/main_window_menu_bar.c:76
+msgid "A_ction"
+msgstr "A_ctie"
 
-#~ msgid "_Help"
-#~ msgstr "_Help"
+#: ../src/main_window_menu_bar.c:77
+msgid "_Help"
+msgstr "_Help"
+
+#: ../src/main_window_menu_bar.c:112 ../src/main_window_tool_bar.c:84
+msgid "Add"
+msgstr "Toevoegen"
+
+#: ../src/main_window_tool_bar.c:90
+msgid "Delete"
+msgstr "Verwijderen"

Modified: xarchiver/branches/xarchiver-psybsd/src/Makefile.am
===================================================================
--- xarchiver/branches/xarchiver-psybsd/src/Makefile.am	2006-08-20 18:54:48 UTC (rev 22839)
+++ xarchiver/branches/xarchiver-psybsd/src/Makefile.am	2006-08-20 22:03:24 UTC (rev 22840)
@@ -5,7 +5,9 @@
 	main_window.c main_window.h \
 	main_window_menu_bar.c main_window_menu_bar.h \
 	main_window_tool_bar.c main_window_tool_bar.h \
+	main_window_status_bar.c main_window_status_bar.h \
 	new_dialog.c new_dialog.h \
+	add_dialog.c add_dialog.h \
 	extract_dialog.c extract_dialog.h
 
 xarchiver_CFLAGS = \

Added: xarchiver/branches/xarchiver-psybsd/src/add_dialog.c
===================================================================
--- xarchiver/branches/xarchiver-psybsd/src/add_dialog.c	                        (rev 0)
+++ xarchiver/branches/xarchiver-psybsd/src/add_dialog.c	2006-08-20 22:03:24 UTC (rev 22840)
@@ -0,0 +1,89 @@
+/*
+ *  Copyright (c) 2006 Stephan Arts <psybsd at gmail.com>
+ *
+ *  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 Library 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#include <config.h>
+#include <glib.h>
+#include <gtk/gtk.h>
+#include <libxarchiver/libxarchiver.h>
+#include "add_dialog.h"
+
+static void
+xa_add_dialog_class_init(XAAddDialogClass *archive_class);
+
+static void
+xa_add_dialog_init(XAAddDialog *archive);
+
+GType
+xa_add_dialog_get_type ()
+{
+	static GType xa_add_dialog_type = 0;
+
+ 	if (!xa_add_dialog_type)
+	{
+ 		static const GTypeInfo xa_add_dialog_info = 
+		{
+			sizeof (XAAddDialogClass),
+			(GBaseInitFunc) NULL,
+			(GBaseFinalizeFunc) NULL,
+			(GClassInitFunc) xa_add_dialog_class_init,
+			(GClassFinalizeFunc) NULL,
+			NULL,
+			sizeof (XAAddDialog),
+			0,
+			(GInstanceInitFunc) xa_add_dialog_init,
+			NULL
+		};
+
+		xa_add_dialog_type = g_type_register_static (GTK_TYPE_DIALOG, "XAAddDialog", &xa_add_dialog_info, 0);
+	}
+	return xa_add_dialog_type;
+}
+
+static void
+xa_add_dialog_class_init(XAAddDialogClass *dialog_class)
+{
+}
+
+static void
+xa_add_dialog_init(XAAddDialog *dialog)
+{
+/*
+	GtkWidget *hbox = gtk_hbox_new(FALSE, 10);
+	gtk_box_pack_start (GTK_BOX (hbox),gtk_label_new (_("Archive type:")),FALSE, FALSE, 0);
+	
+	gtk_widget_show_all(hbox);
+	gtk_box_pack_end(GTK_BOX(GTK_DIALOG(dialog)->vbox), hbox, FALSE, TRUE, 0);
+*/
+	gtk_dialog_add_buttons(GTK_DIALOG(dialog), 
+			GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
+			GTK_STOCK_ADD, GTK_RESPONSE_OK,
+			NULL);
+	gtk_dialog_set_default_response(GTK_DIALOG(dialog), GTK_RESPONSE_OK);
+}
+
+GtkWidget *
+xa_add_dialog_new()
+{
+	GtkWidget *dialog;
+
+	dialog = g_object_new(xa_add_dialog_get_type(),
+			"title", _("Add file(s) to archive"),
+			NULL);
+
+	return dialog;
+}

Added: xarchiver/branches/xarchiver-psybsd/src/add_dialog.h
===================================================================
--- xarchiver/branches/xarchiver-psybsd/src/add_dialog.h	                        (rev 0)
+++ xarchiver/branches/xarchiver-psybsd/src/add_dialog.h	2006-08-20 22:03:24 UTC (rev 22840)
@@ -0,0 +1,58 @@
+/*
+ *  Copyright (c) 2006 Stephan Arts <psybsd at gmail.com>
+ *
+ *  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 Library 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __XARCHIVER_ADD_DIALOG_H__
+#define __XARCHIVER_ADD_DIALOG_H__
+G_BEGIN_DECLS
+
+#define XA_ADD_DIALOG(obj)         ( \
+		G_TYPE_CHECK_INSTANCE_CAST ((obj),    \
+			xa_add_dialog_get_type(),      \
+			XAAddDialog))
+
+#define XA_IS_ADD_DIALOG(obj)      ( \
+		G_TYPE_CHECK_INSTANCE_TYPE ((obj),    \
+			xa_add_dialog_get_type()))
+
+#define XA_ADD_DIALOG_CLASS(class) ( \
+		G_TYPE_CHECK_CLASS_CAST ((class),     \
+			xa_add_dialog_get_type(),      \
+			XAAddDialogClass))
+
+#define XA_IS_ADD_DIALOG_CLASS(class) ( \
+		G_TYPE_CHECK_CLASS_TYPE ((class),        \
+			xa_add_dialog_get_type()))
+
+typedef struct _XAAddDialog XAAddDialog;
+
+struct _XAAddDialog
+{
+	GtkDialog parent;
+};
+
+typedef struct _XAAddDialogClass XAAddDialogClass;
+
+struct _XAAddDialogClass
+{
+	GtkDialogClass parent;
+};
+
+GtkWidget *xa_add_dialog_new();
+
+G_END_DECLS
+#endif /* __XARCHIVER_ADD_DIALOG_H__ */

Modified: xarchiver/branches/xarchiver-psybsd/src/extract_dialog.h
===================================================================
--- xarchiver/branches/xarchiver-psybsd/src/extract_dialog.h	2006-08-20 18:54:48 UTC (rev 22839)
+++ xarchiver/branches/xarchiver-psybsd/src/extract_dialog.h	2006-08-20 22:03:24 UTC (rev 22840)
@@ -50,7 +50,7 @@
 
 struct _XAExtractArchiveDialogClass
 {
-	GtkFileChooserDialog parent_class;
+	GtkFileChooserDialogClass parent_class;
 };
 
 GtkWidget *xa_extract_archive_dialog_new();

Modified: xarchiver/branches/xarchiver-psybsd/src/main.c
===================================================================
--- xarchiver/branches/xarchiver-psybsd/src/main.c	2006-08-20 18:54:48 UTC (rev 22839)
+++ xarchiver/branches/xarchiver-psybsd/src/main.c	2006-08-20 22:03:24 UTC (rev 22840)
@@ -23,21 +23,19 @@
 #include <gtk/gtk.h>
 
 #include "new_dialog.h"
+#include "add_dialog.h"
 #include "extract_dialog.h"
 #include "main.h"
+#include "main_window.h"
 
-gboolean new_archive  = FALSE;
+gboolean version = FALSE;
 
 gboolean extract_archive  = FALSE;
 gchar *extract_archive_path = NULL;
 
-gboolean add_archive  = FALSE;
-
+gboolean new_archive  = FALSE;
 gchar *add_archive_path = NULL;
 
-gchar **_argv;
-gint _argc;
-
 gpointer command;
 
 gint opened_archives = 0;
@@ -60,6 +58,10 @@
 		NULL,
 		N_("[file1] [file2] ... [fileN]")
 	},
+	{ "version", 'v', G_OPTION_FLAG_IN_MAIN, G_OPTION_ARG_NONE, &version,
+		N_("Version information"),
+		NULL
+	},
 	{ NULL }
 };
 
@@ -103,12 +105,26 @@
 	g_thread_init(NULL);
 
 
-	gtk_init_with_args(&argc, &argv, _("[archive name]"), entries, PACKAGE, &cli_error);
+	if(!gtk_init_with_args(&argc, &argv, _("[archive name]"), entries, PACKAGE, &cli_error))
+	{
+		if ( cli_error != NULL )
+		{
+			g_print (_("%s: %s\nTry xarchiver --help to see a full list of available command line options.\n"), PACKAGE, cli_error->message);
+			g_error_free (cli_error);
+			return 1;
+		}
+	}
 
 	thunar_vfs_init();
 
 	lxa_init();
 
+	if(version)
+	{
+		g_print("%s\n", PACKAGE_STRING);
+		return 0;
+	}
+
 	if(extract_archive_path || extract_archive)
 	{
 		if(argc == 1)
@@ -171,6 +187,10 @@
 			if(lxa_open_archive(add_archive_path, &lpArchive))
 			{
 				/* Could not open archive (mime type not supported or file did not exsit)*/
+				dialog = gtk_message_dialog_new (NULL,GTK_DIALOG_MODAL,GTK_MESSAGE_ERROR,GTK_BUTTONS_OK,_("Could not open archive, MIME-type unsupported or file did not exist"));
+				gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_YES);
+				gtk_dialog_run (GTK_DIALOG (dialog) );
+				gtk_widget_destroy (GTK_WIDGET (dialog) );
 				return 1;
 			}
 			else

Modified: xarchiver/branches/xarchiver-psybsd/src/main_window.c
===================================================================
--- xarchiver/branches/xarchiver-psybsd/src/main_window.c	2006-08-20 18:54:48 UTC (rev 22839)
+++ xarchiver/branches/xarchiver-psybsd/src/main_window.c	2006-08-20 22:03:24 UTC (rev 22840)
@@ -22,6 +22,7 @@
 #include <libxarchiver/libxarchiver.h>
 #include "main_window_menu_bar.h"
 #include "main_window_tool_bar.h"
+#include "main_window_status_bar.h"
 #include "main_window.h"
 
 static void
@@ -68,13 +69,16 @@
 	window->main_vbox = gtk_vbox_new(FALSE, 0);
 	window->menubar = xa_main_window_menu_bar_new();
 	window->toolbar = xa_main_window_tool_bar_new();
+	window->statusbar = xa_main_window_status_bar_new();
 
 	gtk_box_pack_start(GTK_BOX(window->main_vbox), window->menubar, 0, FALSE, FALSE);
 	gtk_box_pack_start(GTK_BOX(window->main_vbox), window->toolbar, 0, FALSE, FALSE);
+	gtk_box_pack_end(GTK_BOX(window->main_vbox), window->statusbar, 0, FALSE, FALSE);
 
 	gtk_widget_show(window->main_vbox);
 	gtk_widget_show_all(window->menubar);
 	gtk_widget_show_all(window->toolbar);
+	gtk_widget_show_all(window->statusbar);
 
 	gtk_container_add(GTK_CONTAINER(window), window->main_vbox);
 }

Modified: xarchiver/branches/xarchiver-psybsd/src/main_window.h
===================================================================
--- xarchiver/branches/xarchiver-psybsd/src/main_window.h	2006-08-20 18:54:48 UTC (rev 22839)
+++ xarchiver/branches/xarchiver-psybsd/src/main_window.h	2006-08-20 22:03:24 UTC (rev 22840)
@@ -46,6 +46,7 @@
 	GtkWidget *main_vbox;
 	GtkWidget *menubar;
 	GtkWidget *toolbar;
+	GtkWidget *statusbar;
 };
 
 typedef struct _XAMainWindowClass XAMainWindowClass;

Modified: xarchiver/branches/xarchiver-psybsd/src/main_window_menu_bar.c
===================================================================
--- xarchiver/branches/xarchiver-psybsd/src/main_window_menu_bar.c	2006-08-20 18:54:48 UTC (rev 22839)
+++ xarchiver/branches/xarchiver-psybsd/src/main_window_menu_bar.c	2006-08-20 22:03:24 UTC (rev 22840)
@@ -23,6 +23,10 @@
 #include "main_window_menu_bar.h"
 #include "main_window.h"
 
+#include "add_dialog.h"
+#include "new_dialog.h"
+#include "extract_dialog.h"
+
 static void
 xa_main_window_menu_bar_class_init(XAMainWindowMenuBarClass *);
 
@@ -66,6 +70,7 @@
 	GtkAccelGroup *accel_group = gtk_accel_group_new();
 
 	GtkWidget *tmp_image;
+	GtkWidget *separator;
 
 	menubar->menu_item_archive = gtk_menu_item_new_with_mnemonic(_("_Archive"));
 	menubar->menu_item_action = gtk_menu_item_new_with_mnemonic(_("A_ction"));
@@ -85,28 +90,43 @@
 
 /* Archive menu */
 	menubar->menu_item_new = gtk_image_menu_item_new_from_stock("gtk-new", accel_group);
+	gtk_container_add(GTK_CONTAINER(menubar->menu_archive), menubar->menu_item_new);
+
 	menubar->menu_item_open = gtk_image_menu_item_new_from_stock("gtk-open", accel_group);
+	gtk_container_add(GTK_CONTAINER(menubar->menu_archive), menubar->menu_item_open);
+
+	separator = gtk_separator_menu_item_new();
+	gtk_container_add(GTK_CONTAINER(menubar->menu_archive), separator);
+
+	menubar->menu_item_properties = gtk_image_menu_item_new_from_stock("gtk-properties", accel_group);
+	gtk_container_add(GTK_CONTAINER(menubar->menu_archive), menubar->menu_item_properties);
+
+	separator = gtk_separator_menu_item_new();
+	gtk_container_add(GTK_CONTAINER(menubar->menu_archive), separator);
+
 	menubar->menu_item_quit = gtk_image_menu_item_new_from_stock("gtk-quit", accel_group);
-
-	gtk_container_add(GTK_CONTAINER(menubar->menu_archive), menubar->menu_item_new);
-	gtk_container_add(GTK_CONTAINER(menubar->menu_archive), menubar->menu_item_open);
 	gtk_container_add(GTK_CONTAINER(menubar->menu_archive), menubar->menu_item_quit);
 
 /* Action menu */
 	tmp_image = xa_main_window_find_image("add_button.png", GTK_ICON_SIZE_MENU);
 	menubar->menu_item_add = gtk_image_menu_item_new_with_mnemonic(_("Add"));
 	gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menubar->menu_item_add), tmp_image);
+	gtk_container_add(GTK_CONTAINER(menubar->menu_action), menubar->menu_item_add);
 
 	tmp_image = xa_main_window_find_image("extract_button.png", GTK_ICON_SIZE_MENU);
 	menubar->menu_item_extract = gtk_image_menu_item_new_with_mnemonic(_("Extract"));
 	gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menubar->menu_item_extract), tmp_image);
+	gtk_container_add(GTK_CONTAINER(menubar->menu_action), menubar->menu_item_extract);
 
 	menubar->menu_item_remove = gtk_image_menu_item_new_from_stock("gtk-delete", accel_group);
-
-	gtk_container_add(GTK_CONTAINER(menubar->menu_action), menubar->menu_item_add);
-	gtk_container_add(GTK_CONTAINER(menubar->menu_action), menubar->menu_item_extract);
 	gtk_container_add(GTK_CONTAINER(menubar->menu_action), menubar->menu_item_remove);
 
+	separator = gtk_separator_menu_item_new();
+	gtk_container_add(GTK_CONTAINER(menubar->menu_action), separator);
+
+	menubar->menu_item_settings = gtk_image_menu_item_new_from_stock("gtk-preferences", accel_group);
+	gtk_container_add(GTK_CONTAINER(menubar->menu_action), menubar->menu_item_settings);
+
 /* Help menu */
 	menubar->menu_item_about = gtk_image_menu_item_new_from_stock("gtk-about", accel_group);
 	gtk_container_add(GTK_CONTAINER(menubar->menu_help), menubar->menu_item_about);

Modified: xarchiver/branches/xarchiver-psybsd/src/main_window_menu_bar.h
===================================================================
--- xarchiver/branches/xarchiver-psybsd/src/main_window_menu_bar.h	2006-08-20 18:54:48 UTC (rev 22839)
+++ xarchiver/branches/xarchiver-psybsd/src/main_window_menu_bar.h	2006-08-20 22:03:24 UTC (rev 22840)
@@ -48,6 +48,7 @@
 	/* contents of 'archive' menu */
 	GtkWidget *menu_item_new;
 	GtkWidget *menu_item_open;
+	GtkWidget *menu_item_properties;
 	GtkWidget *menu_item_quit;
 
 	GtkWidget *menu_item_action;
@@ -57,6 +58,7 @@
 	GtkWidget *menu_item_add;
 	GtkWidget *menu_item_extract;
 	GtkWidget *menu_item_remove;
+	GtkWidget *menu_item_settings;
 
 	GtkWidget *menu_item_help;
 	GtkWidget *menu_help;

Modified: xarchiver/branches/xarchiver-psybsd/src/main_window_tool_bar.c
===================================================================
--- xarchiver/branches/xarchiver-psybsd/src/main_window_tool_bar.c	2006-08-20 18:54:48 UTC (rev 22839)
+++ xarchiver/branches/xarchiver-psybsd/src/main_window_tool_bar.c	2006-08-20 22:03:24 UTC (rev 22840)
@@ -23,6 +23,10 @@
 #include "main_window_tool_bar.h"
 #include "main_window.h"
 
+#include "add_dialog.h"
+#include "new_dialog.h"
+#include "extract_dialog.h"
+
 static void
 xa_main_window_tool_bar_class_init(XAMainWindowToolBarClass *);
 



More information about the Xfce4-commits mailing list