[Xfce4-commits] r25977 - xarchiver/trunk/src

Giuseppe Torelli colossus at xfce.org
Sun Aug 12 18:42:57 CEST 2007


Author: colossus
Date: 2007-08-12 16:42:57 +0000 (Sun, 12 Aug 2007)
New Revision: 25977

Modified:
   xarchiver/trunk/src/7zip.c
   xarchiver/trunk/src/7zip.h
   xarchiver/trunk/src/main.c
   xarchiver/trunk/src/rar.c
   xarchiver/trunk/src/tar.c
   xarchiver/trunk/src/window.c
Log:
Archive navigation works for 7zip too.


Modified: xarchiver/trunk/src/7zip.c
===================================================================
--- xarchiver/trunk/src/7zip.c	2007-08-12 14:22:28 UTC (rev 25976)
+++ xarchiver/trunk/src/7zip.c	2007-08-12 16:42:57 UTC (rev 25977)
@@ -17,71 +17,144 @@
  */
 
 #include "config.h"
+#include <string.h>
 #include "7zip.h"
 
-static gboolean SevenZipOpen (GIOChannel *ioc, GIOCondition cond, gpointer data);
-void Open7Zip ( XArchive *archive)
+extern gboolean sevenzr;
+extern void xa_create_liststore ( XArchive *archive, gchar *columns_names[]);
+gchar *exe;
+
+void xa_open_7zip (XArchive *archive)
 {
-    jump_header = FALSE;
-	gchar *command = g_strconcat ( "7za l " , archive->escaped_path, NULL );
+	jump_header = last_line = FALSE;
+	unsigned short int i = 0;
+
+	if (sevenzr)
+		exe = "7zr ";
+	else
+		exe = "7za ";
+
+	gchar *command = g_strconcat ( exe,"l " , archive->escaped_path, NULL );
+	g_print (command);
 	archive->has_sfx = archive->has_properties = archive->can_add = archive->can_extract = archive->has_test = TRUE;
 	archive->dummy_size = 0;
-    archive->nr_of_files = 0;
-    archive->nr_of_dirs = 0;
+	archive->nr_of_files = 0;
+	archive->nr_of_dirs = 0;
 	archive->format ="7-ZIP";
-	archive->parse_output = SevenZipOpen;
+	archive->nc = 5;
+	archive->parse_output = xa_get_7zip_line_content;
 	xa_spawn_async_process (archive,command,0);
 	g_free ( command );
 	if ( archive->child_pid == 0 )
 		return;
 
-	char *names[]= {(_("Filename")),(_("Original")),(_("Compressed")),(_("Attr")),(_("Time")),(_("Date"))};
-	GType types[]= {G_TYPE_STRING,G_TYPE_UINT64,G_TYPE_UINT64,G_TYPE_STRING,G_TYPE_STRING,G_TYPE_STRING};
-	xa_create_liststore ( 6, names , (GType *)types, archive );
+	GType types[]= {G_TYPE_STRING,G_TYPE_STRING,G_TYPE_UINT64,G_TYPE_UINT64,G_TYPE_STRING,G_TYPE_STRING,G_TYPE_STRING};
+	archive->column_types = g_malloc0(sizeof(types));
+	for (i = 0; i < 7; i++)
+		archive->column_types[i] = types[i];
+
+	char *names[]= {(_("Original")),(_("Compressed")),(_("Attr")),(_("Time")),(_("Date"))};
+	xa_create_liststore (archive,names);
 }
 
-static gboolean SevenZipOpen (GIOChannel *ioc, GIOCondition cond, gpointer data)
+void xa_get_7zip_line_content (gchar *line, gpointer data)
 {
 	XArchive *archive = data;
-	gchar **fields = NULL;
-	gchar *filename = NULL;
-	gchar *line = NULL;
-	GtkTreeIter iter;
-	GIOStatus status = G_IO_STATUS_NORMAL;
-	unsigned short int x;
+	XEntry *entry;
+	gchar *filename;
+	gpointer item[5];
+	unsigned short int i = 0;
+	gint linesize = 0,n = 0,a = 0;
+	gboolean dir = FALSE;
 
-	if (cond & (G_IO_IN | G_IO_PRI) )
+	if (last_line)
+		return;
+
+	if (jump_header == FALSE)
 	{
-		do
+		if (line[0] == '-')
 		{
-			/* This to avoid inserting in the liststore 7zip's message */
-			if (jump_header == FALSE )
-			{
-				for ( x = 0; x <= 7; x++)
-				{
-					status = g_io_channel_read_line ( ioc, &line, NULL, NULL, NULL );
-					archive->cmd_line_output = g_list_append (archive->cmd_line_output,g_strdup(line));
-					g_free (line);
-				}
-				jump_header = TRUE;
-			}
-			status = g_io_channel_read_line ( ioc, &line, NULL, NULL, NULL );
-			if ( line == NULL )
-				break;
+			jump_header = TRUE;
+			return;
+		}
+		return;
+	}
+	if (line[0] == '-')
+	{
+		last_line = TRUE;
+		return;
+	}
+	
+	linesize = strlen(line);
 
-			/* This to avoid inserting the last line of output */
-			if (strncmp (line, "-----------------", 17) == 0 || strncmp (line, "\x0a",1) == 0)
-			{
-				archive->cmd_line_output = g_list_append (archive->cmd_line_output,g_strdup(line));
-				g_free (line);
-				status = g_io_channel_read_line ( ioc, &line, NULL, NULL, NULL );
-				if (line == NULL)
-					break;
-				archive->cmd_line_output = g_list_append (archive->cmd_line_output,g_strdup(line));
-				g_free (line);
-				break;
-			}
-			archive->cmd_line_output = g_list_append (archive->cmd_line_output,g_strdup(line));
+	/* Date */
+	line[10] = '\0';
+	item[4] = line;
+
+	/* Time */
+	for(n=13; n < linesize; ++n)
+		if(line[n] == ' ')
+			break;
+	line[n] = '\0';
+	item[3] = line + 11;
+	a = ++n;
+	
+	/* Permissions */
+	for(; n < linesize; n++)
+		if(line[n] == ' ')
+			break;
+	line[n] = '\0';
+	if ((line+a)[0] == 'D')
+		dir = TRUE;
+	else
+		archive->nr_of_files++;
+	item[2] = line + a;
+	
+	/* Size */
+	for(++n; n < linesize; ++n)
+		if(line[n] >= '0' && line[n] <= '9')
+			break;
+	a = n;
+
+	for(; n < linesize; ++n)
+		if(line[n] == ' ')
+			break;
+
+	line[n] = '\0';
+	item[0] = line + a;
+	archive->dummy_size += strtoll(item[0],NULL,0);
+
+	/* Compressed */
+	for(++n; n < linesize; ++n)
+		if(line[n] >= '0' && line[n] <= '9')
+			break;
+	a = n;
+
+	for(; n < linesize; ++n)
+		if(line[n] == ' ')
+			break;
+
+	line[n] = '\0';
+	item[1] = line + a;
+	n+= 2;
+
+	/* Filename */
+	line[linesize-1] = '\0';
+	filename = g_strdup(line + n);
+	
+	/* Work around for 7za which doesn't
+	* output / with directories */
+	if (dir)
+	{
+		gchar *filename_with_slash = g_strconcat (filename,"/",NULL);
+		g_free (filename);
+		filename = filename_with_slash;
+	}
+	
+	entry = xa_set_archive_entries_for_each_row (archive,filename,FALSE,item);
+	g_free(filename);
+
+	/* 		archive->cmd_line_output = g_list_append (archive->cmd_line_output,g_strdup(line));
 			fields = split_line ( line , 5 );
 			filename = get_last_field ( line , 6);
 			gtk_list_store_append (archive->liststore, &iter);
@@ -121,6 +194,6 @@
 		g_object_unref (archive->model);
 		return FALSE;
 	}
-	return TRUE;
+	return TRUE;*/
 }
 

Modified: xarchiver/trunk/src/7zip.h
===================================================================
--- xarchiver/trunk/src/7zip.h	2007-08-12 14:22:28 UTC (rev 25976)
+++ xarchiver/trunk/src/7zip.h	2007-08-12 16:42:57 UTC (rev 25977)
@@ -20,12 +20,12 @@
 #define SEVENZIP_H
 
 #include <gtk/gtk.h>
-#include <string.h>
 #include <stdlib.h>
 #include "string_utils.h"
 #include "support.h"
 #include "archive.h"
 
-gboolean jump_header;
-void Open7Zip ( XArchive *archive );
+gboolean jump_header, last_line;
+void xa_open_7zip (XArchive *archive);
+void xa_get_7zip_line_content (gchar *line, gpointer data);
 #endif

Modified: xarchiver/trunk/src/main.c
===================================================================
--- xarchiver/trunk/src/main.c	2007-08-12 14:22:28 UTC (rev 25976)
+++ xarchiver/trunk/src/main.c	2007-08-12 16:42:57 UTC (rev 25977)
@@ -34,6 +34,7 @@
 gboolean error_output, file_to_open, ask_and_extract, ask_and_add;
 gboolean cli = FALSE;
 gboolean unrar = FALSE;
+gboolean sevenzr = FALSE;
 extern gchar *current_open_directory;
 Prefs_dialog_data *prefs_window = NULL;
 
@@ -407,6 +408,7 @@
     	absolute_path = g_find_program_in_path("7zr");
     if (absolute_path)
     {
+    	sevenzr = TRUE;
         ArchiveType = g_list_prepend ( ArchiveType, "7z");
 	    ArchiveSuffix = g_list_prepend ( ArchiveSuffix, "*.7z");
 		g_free (absolute_path);

Modified: xarchiver/trunk/src/rar.c
===================================================================
--- xarchiver/trunk/src/rar.c	2007-08-12 14:22:28 UTC (rev 25976)
+++ xarchiver/trunk/src/rar.c	2007-08-12 16:42:57 UTC (rev 25977)
@@ -191,10 +191,10 @@
 		line[n] = '\0';
 		item[i] = line + a;
 
+		/* Work around for rar which doesn't
+		 * output / with directories */
 		if (dir)
 		{
-			/* Work around for rar which doesn't
-			 * output / with directories */
 			gchar *filename_with_slash = g_strconcat (filename,"/",NULL);
 			g_free (filename);
 			filename = filename_with_slash;

Modified: xarchiver/trunk/src/tar.c
===================================================================
--- xarchiver/trunk/src/tar.c	2007-08-12 14:22:28 UTC (rev 25976)
+++ xarchiver/trunk/src/tar.c	2007-08-12 16:42:57 UTC (rev 25977)
@@ -65,8 +65,7 @@
 	XEntry *entry;
 	gchar *filename;
 	gpointer item[6];
-	gsize linesize = 0;
-	gint n = 0, a = 0;
+	gint n = 0, a = 0 ,linesize = 0;
 	gboolean dir = FALSE;
 
 	linesize = strlen(line);

Modified: xarchiver/trunk/src/window.c
===================================================================
--- xarchiver/trunk/src/window.c	2007-08-12 14:22:28 UTC (rev 25976)
+++ xarchiver/trunk/src/window.c	2007-08-12 16:42:57 UTC (rev 25977)
@@ -117,39 +117,39 @@
 			switch ( archive->type )
 			{
 				case XARCHIVETYPE_RAR:
-			    xa_open_rar ( archive );
+			    xa_open_rar (archive);
 				break;
 
 				case XARCHIVETYPE_TAR:
-				xa_open_tar ( archive );
+				xa_open_tar (archive);
 				break;
 
 				case XARCHIVETYPE_TAR_BZ2:
-				xa_open_bzip2 ( archive );
+				xa_open_bzip2 (archive);
 				break;
 
 				case XARCHIVETYPE_TAR_GZ:
-				xa_open_gzip ( archive );
+				xa_open_gzip (archive);
 				break;
 
 				case XARCHIVETYPE_TAR_LZMA:
-				OpenLzma ( archive );
+				OpenLzma (archive);
 				break;
 
 				case XARCHIVETYPE_ZIP:
-				xa_open_zip ( archive );
+				xa_open_zip (archive);
 				break;
 
 				case XARCHIVETYPE_7ZIP:
-				Open7Zip ( archive );
+				xa_open_7zip (archive);
 				break;
 
 				case XARCHIVETYPE_ARJ:
-				OpenArj ( archive );
+				OpenArj (archive);
 				break;
 
 				case XARCHIVETYPE_LHA:
-				OpenLha ( archive );
+				OpenLha (archive);
 				break;
 
 				default:
@@ -374,7 +374,7 @@
 		break;
 
 		case XARCHIVETYPE_7ZIP:
-		Open7Zip (archive[current_page]);
+		xa_open_7zip (archive[current_page]);
 		break;
 
 		case XARCHIVETYPE_LHA:



More information about the Xfce4-commits mailing list