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

Giuseppe Torelli colossus at xfce.org
Sat Aug 11 22:34:54 CEST 2007


Author: colossus
Date: 2007-08-11 20:34:54 +0000 (Sat, 11 Aug 2007)
New Revision: 25970

Modified:
   xarchiver/trunk/src/bzip2.c
   xarchiver/trunk/src/deb.c
   xarchiver/trunk/src/gzip.c
   xarchiver/trunk/src/lzma.c
   xarchiver/trunk/src/rar.c
   xarchiver/trunk/src/tar.c
   xarchiver/trunk/src/tar.h
   xarchiver/trunk/src/window.c
Log:
Archive navigation works for tar too.


Modified: xarchiver/trunk/src/bzip2.c
===================================================================
--- xarchiver/trunk/src/bzip2.c	2007-08-11 18:49:51 UTC (rev 25969)
+++ xarchiver/trunk/src/bzip2.c	2007-08-11 20:34:54 UTC (rev 25970)
@@ -46,7 +46,7 @@
 		archive->nr_of_files = 0;
 		archive->nr_of_dirs = 0;
 		archive->format = "TAR.BZIP2";
-		archive->parse_output = TarOpen;
+		archive->parse_output = xa_get_tar_line_content;
 		xa_spawn_async_process (archive,command,0);
 
 		g_free (command);

Modified: xarchiver/trunk/src/deb.c
===================================================================
--- xarchiver/trunk/src/deb.c	2007-08-11 18:49:51 UTC (rev 25969)
+++ xarchiver/trunk/src/deb.c	2007-08-11 20:34:54 UTC (rev 25970)
@@ -77,7 +77,7 @@
 	archive->nr_of_files = 0;
 	archive->nr_of_dirs = 0;
 	archive->format = "DEB";
-	archive->parse_output = TarOpen;
+	archive->parse_output = xa_get_tar_line_content;
 	xa_spawn_async_process (archive,command,0);
 	g_free (command);
 

Modified: xarchiver/trunk/src/gzip.c
===================================================================
--- xarchiver/trunk/src/gzip.c	2007-08-11 18:49:51 UTC (rev 25969)
+++ xarchiver/trunk/src/gzip.c	2007-08-11 20:34:54 UTC (rev 25970)
@@ -43,7 +43,7 @@
 		archive->nr_of_files = 0;
 		archive->nr_of_dirs = 0;
 		archive->format ="TAR.GZIP";
-		archive->parse_output = TarOpen;
+		archive->parse_output = xa_get_tar_line_content;
 
 		xa_spawn_async_process (archive,command,0);
 

Modified: xarchiver/trunk/src/lzma.c
===================================================================
--- xarchiver/trunk/src/lzma.c	2007-08-11 18:49:51 UTC (rev 25969)
+++ xarchiver/trunk/src/lzma.c	2007-08-11 20:34:54 UTC (rev 25970)
@@ -50,7 +50,7 @@
 		archive->nr_of_files = 0;
 		archive->nr_of_dirs = 0;
 		archive->format ="TAR.LZMA";
-		archive->parse_output = TarOpen;
+		archive->parse_output = xa_get_tar_line_content;
 
 		xa_spawn_async_process (archive,command,0);
 

Modified: xarchiver/trunk/src/rar.c
===================================================================
--- xarchiver/trunk/src/rar.c	2007-08-11 18:49:51 UTC (rev 25969)
+++ xarchiver/trunk/src/rar.c	2007-08-11 20:34:54 UTC (rev 25970)
@@ -193,6 +193,8 @@
 
 		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-11 18:49:51 UTC (rev 25969)
+++ xarchiver/trunk/src/tar.c	2007-08-11 20:34:54 UTC (rev 25970)
@@ -18,13 +18,16 @@
  */
 
 #include "config.h"
+#include <string.h>
 #include "tar.h"
-#include "string_utils.h"
 
-void OpenTar ( XArchive *archive )
+extern void xa_create_liststore ( XArchive *archive, gchar *columns_names[]);
+
+void xa_open_tar (XArchive *archive)
 {
 	gchar *command;
 	gchar *tar;
+	unsigned short int i;
 
 	tar = g_find_program_in_path ("gtar");
 	if (tar == NULL)
@@ -36,9 +39,9 @@
 	archive->dummy_size = 0;
 	archive->nr_of_files = 0;
 	archive->nr_of_dirs = 0;
+	archive->nc = 6;
+	archive->parse_output = xa_get_tar_line_content;
 	archive->format ="TAR";
-	archive->parse_output = TarOpen;
-
 	xa_spawn_async_process (archive,command,0);
 
 	g_free (command);
@@ -47,80 +50,103 @@
 	if (archive->child_pid == 0)
 		return;
 
-	char *names[]= {(""),(_("Filename")),(_("Permissions")),(_("Symbolic Link")),(_("Owner/Group")),(_("Size")),(_("Date")),(_("Time"))};
 	GType types[]= {G_TYPE_STRING,G_TYPE_STRING,G_TYPE_STRING,G_TYPE_STRING,G_TYPE_STRING,G_TYPE_UINT64,G_TYPE_STRING,G_TYPE_STRING};
-	xa_create_liststore ( 8, names , (GType *)types, archive );
+	archive->column_types = g_malloc0(sizeof(types));
+	for (i = 0; i < 8; i++)
+		archive->column_types[i] = types[i];
+
+	char *names[]= {(_("Points to")),(_("Permissions")),(_("Owner/Group")),(_("Size")),(_("Date")),(_("Time"))};
+	xa_create_liststore (archive,names);
 }
 
-gboolean TarOpen (GIOChannel *ioc, GIOCondition cond, gpointer data)
+void xa_get_tar_line_content (gchar *line, gpointer data)
 {
 	XArchive *archive = data;
-	gchar **fields;
+	XEntry *entry;
 	gchar *filename;
-	gchar *line = NULL;
-	gchar *temp = NULL;
-	GtkTreeIter iter;
-	GIOStatus status = G_IO_STATUS_NORMAL;
+	gpointer item[6];
+	gsize linesize = 0;
+	gint n = 0, a = 0;
+	gboolean dir = FALSE;
 
-	if (cond & (G_IO_IN | G_IO_PRI) )
-	{
-		do
-		{
-			status = g_io_channel_read_line ( ioc, &line, NULL, NULL, NULL );
-			if ( line == NULL )
-				break;
+	linesize = strlen(line);
 
-			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);
+	/* Permissions */
+	line[10] = '\0';
+	item[1] = line;
+	
+	/* Owner */
+	for(n=13; n < linesize; ++n)
+		if(line[n] == ' ')
+			break;
+	line[n] = '\0';
+	item[2] = line+11;
 
-			if ( strstr(fields[0] , "d") == NULL )
-				archive->nr_of_files++;
-			else
-				archive->nr_of_dirs++;
+	/* Size */	
+	for(++n; n < linesize; ++n)
+		if(line[n] >= '0' && line[n] <= '9')
+			break;
+	a = n;
 
-			temp = g_strrstr (filename,"->");
-			if (temp)
-			{
-				gtk_list_store_set (archive->liststore, &iter,2,g_strstrip(&temp[3]),-1);
-				temp = g_strstrip(g_strndup(filename, strlen(filename) - strlen(temp) ));
-				gtk_list_store_set (archive->liststore, &iter,0,temp,-1);
-				g_free (temp);
-			}
-			else
-			{
-				gtk_list_store_set (archive->liststore, &iter,2,NULL,-1);
-				gtk_list_store_set (archive->liststore, &iter,1,filename,-1);
-			}
+	for(; n < linesize; ++n)
+		if(line[n] == ' ')
+			break;
 
-			gtk_list_store_set (archive->liststore, &iter,2,fields[0],-1);
-			gtk_list_store_set (archive->liststore, &iter,4,fields[1],-1);
-			gtk_list_store_set (archive->liststore, &iter,5,strtoll(fields[2],NULL,0),-1);
-			gtk_list_store_set (archive->liststore, &iter,6,fields[3],-1);
-			gtk_list_store_set (archive->liststore, &iter,7,fields[4],-1);
+	line[n] = '\0';
+	item[3] = line + a;
+	archive->dummy_size += strtoll(item[3],NULL,0);
+	a = ++n;
 
-			while (gtk_events_pending() )
-				gtk_main_iteration();
+	/* Date */	
+	for(; n < linesize; n++)
+		if(line[n] == ' ')
+			break;
 
-			archive->dummy_size += strtoll(fields[2],NULL,0);
-			g_strfreev ( fields );
-			g_free (line);
-		}
-		while (status == G_IO_STATUS_NORMAL);
+	line[n] = '\0';
+	item[4] = line + a;
 
-		if (status == G_IO_STATUS_ERROR || status == G_IO_STATUS_EOF)
-			goto done;
+	/* Time */
+	a = ++n;
+	for (; n < linesize; n++)
+		if (line[n] == ' ')
+			break;
+
+	line[n] = '\0';
+	item[5] = line + a;
+	n++;
+	line[linesize-1] = '\0';
+
+	filename = line + n;
+	
+	/* Symbolic link */
+	gchar *temp = g_strrstr (filename,"->"); 
+	if (temp ) 
+	{
+		gint len = strlen(filename) - strlen(temp);
+		item[0] = (filename +=3) + len;
 	}
-	else if (cond & (G_IO_ERR | G_IO_HUP | G_IO_NVAL) )
+	else
+		item[0] = NULL;
+
+	if(line[0] == 'd')
 	{
-done:	g_io_channel_shutdown ( ioc,TRUE,NULL );
-		g_io_channel_unref (ioc);
-		gtk_tree_view_set_model (GTK_TREE_VIEW(archive->treeview), archive->model);
-		g_object_unref (archive->model);
-		return FALSE;
+		dir = TRUE;
+		/* Work around for gtar, which does
+		 * not output / with directories */
+
+		if(line[linesize-2] != '/')
+			filename = g_strconcat(line + n, "/", NULL); 
+		else
+			filename = g_strdup(line + n); 
 	}
-	return TRUE;
+	else
+	{
+		archive->nr_of_files++;
+		filename = g_strdup(line + n); 
+	}
+
+	entry = xa_set_archive_entries_for_each_row (archive,filename,FALSE,item);
+	g_free(filename);
 }
 
 gboolean isTar ( FILE *ptr )

Modified: xarchiver/trunk/src/tar.h
===================================================================
--- xarchiver/trunk/src/tar.h	2007-08-11 18:49:51 UTC (rev 25969)
+++ xarchiver/trunk/src/tar.h	2007-08-11 20:34:54 UTC (rev 25970)
@@ -20,14 +20,13 @@
 #define TAR_H
 
 #include <gtk/gtk.h>
-#include <string.h>
 #include <stdlib.h>
 #include "string_utils.h"
 #include "support.h"
 #include "archive.h"
 
-void OpenTar ( XArchive *archive );
-gboolean TarOpen (GIOChannel *ioc, GIOCondition cond, gpointer data);
+void xa_open_tar ( XArchive *archive );
+void xa_get_tar_line_content (gchar *line, gpointer data);
 gboolean isTar ( FILE *ptr );
 #endif
 

Modified: xarchiver/trunk/src/window.c
===================================================================
--- xarchiver/trunk/src/window.c	2007-08-11 18:49:51 UTC (rev 25969)
+++ xarchiver/trunk/src/window.c	2007-08-11 20:34:54 UTC (rev 25970)
@@ -121,7 +121,7 @@
 				break;
 
 				case XARCHIVETYPE_TAR:
-				OpenTar ( archive );
+				xa_open_tar ( archive );
 				break;
 
 				case XARCHIVETYPE_TAR_BZ2:
@@ -366,7 +366,7 @@
 		break;
 
 		case XARCHIVETYPE_TAR:
-		OpenTar (archive[current_page]);
+		xa_open_tar (archive[current_page]);
 		break;
 
 		case XARCHIVETYPE_ZIP:
@@ -1160,8 +1160,6 @@
 	/* First column: icon + text */
 	column = gtk_tree_view_column_new();
 	renderer = gtk_cell_renderer_pixbuf_new();
-	//GTK_ICON_SIZE_LARGE_TOOLBAR = 3;
-	//GTK_ICON_SIZE_SMALL_TOOLBAR = 2;
 	g_object_set(G_OBJECT(renderer), "stock-size", (3 - gtk_combo_box_get_active(GTK_COMBO_BOX(prefs_window->combo_icon_size))), NULL);
 	gtk_tree_view_column_pack_start(column, renderer, FALSE);
 	gtk_tree_view_column_set_attributes(column, renderer, "icon-name",0,NULL);



More information about the Xfce4-commits mailing list