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

Giuseppe Torelli colossus at xfce.org
Wed Aug 15 12:20:42 CEST 2007


Author: colossus
Date: 2007-08-15 10:20:42 +0000 (Wed, 15 Aug 2007)
New Revision: 25985

Modified:
   xarchiver/trunk/src/arj.c
   xarchiver/trunk/src/arj.h
   xarchiver/trunk/src/lha.c
   xarchiver/trunk/src/rar.c
   xarchiver/trunk/src/rar.h
   xarchiver/trunk/src/window.c
Log:
Archive navigation works for arj too.


Modified: xarchiver/trunk/src/arj.c
===================================================================
--- xarchiver/trunk/src/arj.c	2007-08-15 09:53:27 UTC (rev 25984)
+++ xarchiver/trunk/src/arj.c	2007-08-15 10:20:42 UTC (rev 25985)
@@ -18,139 +18,134 @@
 
 #include "config.h"
 #include "arj.h"
-#include "string_utils.h"
 
-GtkTreeIter iter;
-gboolean jump_header = FALSE;
-unsigned short int arj_line = 0;
+extern gboolean unrar;
+extern void xa_create_liststore (XArchive *archive, gchar *columns_names[]);
+void xa_get_arj_line_content (gchar *line, gpointer data);
 
-static gboolean ArjOpen (GIOChannel *ioc, GIOCondition cond, gpointer data);
-
-void OpenArj (XArchive *archive)
+void xa_open_arj (XArchive *archive)
 {
-    jump_header = FALSE;
+	unsigned short int i;
+    jump_header = encrypted = last_line = FALSE;
+	arj_line = 0;
 	gchar *command = g_strconcat ("arj v ",archive->escaped_path, NULL);
 	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->parse_output = ArjOpen;
+	archive->nr_of_files = 0;
+	archive->nr_of_dirs = 0;
+	archive->nc = 8;
 	archive->format ="ARJ";
+	archive->parse_output = xa_get_arj_line_content;
 	xa_spawn_async_process (archive,command,0);
 	g_free (command);
 	if (archive->child_pid == 0)
 		return;
 
-	char *names[]= {(_("Filename")),(_("Original")),(_("Compressed")),(_("Ratio")),(_("Date")),(_("Time")),(_("Attributes"))};
-	GType types[]= {G_TYPE_STRING,G_TYPE_UINT64,G_TYPE_UINT64,G_TYPE_STRING,G_TYPE_STRING,G_TYPE_STRING,G_TYPE_STRING,G_TYPE_STRING,G_TYPE_STRING};
-	xa_create_liststore ( 7, 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,G_TYPE_STRING,G_TYPE_STRING,G_TYPE_STRING};
+	archive->column_types = g_malloc0(sizeof(types));
+	for (i = 0; i < 10; i++)
+		archive->column_types[i] = types[i];
+
+	char *names[]= {(_("Original")),(_("Compressed")),(_("Ratio")),(_("Date")),(_("Time")),(_("Attributes")),("GUA"),("BPMGS")};
+	xa_create_liststore (archive,names);
 }
 
-static gboolean ArjOpen (GIOChannel *ioc, GIOCondition cond, gpointer data)
+void xa_get_arj_line_content (gchar *line, gpointer data)
 {
 	XArchive *archive = data;
-	gchar **fields = NULL;
-	gchar *line = NULL;
-	gchar *filename = NULL;
-	GtkTreeIter iter;
-	GIOStatus status = G_IO_STATUS_NORMAL;
-	unsigned short int x;
+	XEntry *entry;
+	gpointer item[8];
+	unsigned int linesize,n,a;
+	gboolean dir = FALSE;
 
-	if (cond & (G_IO_IN | G_IO_PRI) )
+	if (last_line)
+		return;
+
+	if (arj_line == 3)
 	{
-		do
-		{
-			/* This to avoid inserting in the liststore arj copyright message */
-			if (jump_header == FALSE )
-			{
-				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));
-				if (strncmp (line , "----------" , 10) == 0)
-				{
-					jump_header = TRUE;
-					arj_line = 1;
-				}
-				g_free (line);
-				break;
-			}
-			if (arj_line == 1)
-			{
-				/* This to avoid reading the last line of arj output */
-				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));
-				if (strncmp (line, "----------", 10) == 0)
-				{
-					g_free (line);
-					status = g_io_channel_read_line ( ioc, &line, NULL, NULL, NULL );
-					if (line != NULL)
-					{
-						archive->cmd_line_output = g_list_append (archive->cmd_line_output,g_strdup(line));
-						g_free (line);
-					}
-					break;
-				}
-				filename = get_last_field (line,2);
-				gtk_list_store_append (archive->liststore, &iter);
-				gtk_list_store_set (archive->liststore, &iter,0,filename,-1);
-				g_free (line);
-			}
-			else if (arj_line == 2)
-			{
-				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));
-				fields = split_line (line,8);
-				if (g_str_has_prefix(fields[7] , "d") == FALSE)
-					archive->nr_of_files++;
-    			for ( x = 2; x < 8; x++)
-    			{
-            		if ( x == 2 || x == 3)
-	                    gtk_list_store_set (archive->liststore, &iter,x-1,strtoll(fields[x],NULL,0),-1);
-            		else
-                    	gtk_list_store_set (archive->liststore, &iter,x-1,fields[x],-1);
-				}
-				archive->dummy_size += strtoll(fields[2],NULL,0);
-				g_strfreev (fields);
-				g_free (line);
-			}
-			else if (arj_line == 3)
-			{
-            	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);
-			}
-			else if (arj_line == 4)
-            {
-            	status = g_io_channel_read_line ( ioc, &line, NULL, NULL, NULL );
-                if ( line == NULL)
-					break;
+		arj_line++;
+		return;
+	}
+	if (arj_line == 4)
+	{
+		arj_line = 1;	
+		return;
+	}
 
-				archive->cmd_line_output = g_list_append (archive->cmd_line_output,g_strdup(line));
-                g_free (line);
-				arj_line = 1;
-                break;
-			}
-            arj_line++;
+	if (jump_header == FALSE)
+	{
+		if (line[0] == '-')
+		{
+			jump_header = TRUE;
+			arj_line = 1;
+			return;
 		}
-        while (status == G_IO_STATUS_NORMAL);
-
-        if (status == G_IO_STATUS_ERROR || status == G_IO_STATUS_EOF)
-        	goto done;
+		return;
 	}
-    else if (cond & (G_IO_ERR | G_IO_HUP | G_IO_NVAL) )
-    {
-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;
+	if (arj_line == 1)
+	{
+		linesize = strlen(line);
+		if(line[0] == '*')
+			encrypted = TRUE;
+		else if (line[0] == '-')
+		{
+			last_line = TRUE;
+			return;
+		}
+		line[linesize - 1] = '\0';
+		filename = g_strdup(line+5);
+		arj_line++;
+		return;
 	}
-	return TRUE;
+	else if (arj_line == 2)
+	{
+		linesize = strlen(line);
+		/* Size */
+		for(n=12; n < linesize && line[n] == ' '; n++);
+		a = n;
+		for(; n < linesize && line[n] != ' '; n++);
+		line[n]='\0';
+		item[0] = line + a;
+		archive->dummy_size += strtoll(item[0],NULL,0);
+		n++;
+		
+		/* Compressed */
+		for(; n < linesize && line[n] == ' '; n++);
+		a = n;
+		for(; n < linesize && line[n] != ' '; n++);
+		line[n]='\0';
+		item[1] = line + a;
+		n++;
+
+		/* Ratio */
+    	line[40] = '\0';
+    	item[2] = line + 35;
+
+		/* Date */
+		line[49] = '\0';
+		item[3] = line + 41;
+
+		/* Time */
+		line[58] = '\0';
+		item[4] = line + 50;
+
+		/* Permissions */
+		line[69] = '\0';
+		item[5] = line + 59;
+		if ((line+59)[0] != 'd')
+			archive->nr_of_files++;
+
+		/* GUA */
+		line[73] = '\0';
+		item[6] = line + 70;
+
+		/* BPMGS */
+		line[77] = '\0';
+		item[7] = line + 74;
+
+		entry = xa_set_archive_entries_for_each_row (archive,filename,encrypted,item);
+		g_free(filename);
+		arj_line++;
+		encrypted = FALSE;
+	}
 }

Modified: xarchiver/trunk/src/arj.h
===================================================================
--- xarchiver/trunk/src/arj.h	2007-08-15 09:53:27 UTC (rev 25984)
+++ xarchiver/trunk/src/arj.h	2007-08-15 10:20:42 UTC (rev 25985)
@@ -25,6 +25,8 @@
 #include "string_utils.h"
 #include "support.h"
 #include "archive.h"
-
-void OpenArj ( XArchive *archive );
+gboolean jump_header, encrypted, last_line;
+unsigned short int arj_line;
+gchar *filename;
+void xa_open_arj (XArchive *archive);
 #endif

Modified: xarchiver/trunk/src/lha.c
===================================================================
--- xarchiver/trunk/src/lha.c	2007-08-15 09:53:27 UTC (rev 25984)
+++ xarchiver/trunk/src/lha.c	2007-08-15 10:20:42 UTC (rev 25985)
@@ -92,6 +92,7 @@
 	line[22] = '\0';
 	item[1] = line + 11;
 
+	//TODO verify the len of the size column with a big archive
 	/* Size */
 	for(n = 23;n < linesize;n++)
 	if(line[n] != ' ')

Modified: xarchiver/trunk/src/rar.c
===================================================================
--- xarchiver/trunk/src/rar.c	2007-08-15 09:53:27 UTC (rev 25984)
+++ xarchiver/trunk/src/rar.c	2007-08-15 10:20:42 UTC (rev 25985)
@@ -17,7 +17,6 @@
  */
 
 #include "config.h"
-#include <string.h>
 #include "rar.h"
 
 extern gboolean unrar;
@@ -69,7 +68,6 @@
 {
 	XArchive *archive = data;
 	XEntry *entry;
-
 	gpointer item[9];
 	unsigned short int i = 0;
 	unsigned int linesize,n,a;

Modified: xarchiver/trunk/src/rar.h
===================================================================
--- xarchiver/trunk/src/rar.h	2007-08-15 09:53:27 UTC (rev 25984)
+++ xarchiver/trunk/src/rar.h	2007-08-15 10:20:42 UTC (rev 25985)
@@ -20,6 +20,7 @@
 #define RAR_H
 
 #include <gtk/gtk.h>
+#include <string.h>
 #include <stdlib.h>
 #include "string_utils.h"
 #include "support.h"

Modified: xarchiver/trunk/src/window.c
===================================================================
--- xarchiver/trunk/src/window.c	2007-08-15 09:53:27 UTC (rev 25984)
+++ xarchiver/trunk/src/window.c	2007-08-15 10:20:42 UTC (rev 25985)
@@ -145,7 +145,7 @@
 				break;
 
 				case XARCHIVETYPE_ARJ:
-				OpenArj (archive);
+				xa_open_arj (archive);
 				break;
 
 				case XARCHIVETYPE_LHA:
@@ -334,7 +334,7 @@
 	switch ( archive[current_page]->type )
 	{
 		case XARCHIVETYPE_ARJ:
-		OpenArj (archive[current_page]);
+		xa_open_arj (archive[current_page]);
 		break;
 
 		case XARCHIVETYPE_DEB:



More information about the Xfce4-commits mailing list