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

Giuseppe Torelli colossus at xfce.org
Thu Aug 9 23:38:30 CEST 2007


Author: colossus
Date: 2007-08-09 21:38:30 +0000 (Thu, 09 Aug 2007)
New Revision: 25961

Modified:
   xarchiver/trunk/src/interface.c
   xarchiver/trunk/src/rar.c
   xarchiver/trunk/src/rar.h
   xarchiver/trunk/src/window.c
   xarchiver/trunk/src/window.h
   xarchiver/trunk/src/zip.c
Log:
Archive navigation works for rar also.
Added code for detecting changes in the location entry.


Modified: xarchiver/trunk/src/interface.c
===================================================================
--- xarchiver/trunk/src/interface.c	2007-08-07 21:30:12 UTC (rev 25960)
+++ xarchiver/trunk/src/interface.c	2007-08-09 21:38:30 UTC (rev 25961)
@@ -391,7 +391,7 @@
 
 	location_entry = gtk_entry_new();
 	gtk_box_pack_start (GTK_BOX (hbox1), location_entry, TRUE, TRUE, 0);
-
+	g_signal_connect (G_OBJECT (location_entry), "activate",	G_CALLBACK (xa_location_entry_activated), NULL);
 	gtk_widget_show_all(toolbar2);
 
 	/* Create the notebook widget */

Modified: xarchiver/trunk/src/rar.c
===================================================================
--- xarchiver/trunk/src/rar.c	2007-08-07 21:30:12 UTC (rev 25960)
+++ xarchiver/trunk/src/rar.c	2007-08-09 21:38:30 UTC (rev 25961)
@@ -17,17 +17,19 @@
  */
 
 #include "config.h"
+#include <string.h>
 #include "rar.h"
 
 extern gboolean unrar;
-static gboolean RarOpen (GIOChannel *ioc, GIOCondition cond, gpointer data);
-GtkTreeIter iter;
+extern void xa_create_liststore ( XArchive *archive, gchar *columns_names[]);
+static void xa_get_rar_line_content (gchar *line, gpointer data);
 
-void OpenRar ( XArchive *archive )
+void xa_open_rar (XArchive *archive)
 {
-	jump_header = FALSE;
+	unsigned short int i;
 	gchar *command = NULL;
 	gchar *rar = NULL;
+	jump_header = read_filename = last_line = FALSE;
 
 	if (unrar)
 	{
@@ -40,123 +42,152 @@
 		archive->can_add = archive->has_sfx = TRUE;
 	}
 
-	command = g_strconcat ( rar," vl -c- " , archive->escaped_path, NULL );
+	command = g_strconcat ( rar," v " , archive->escaped_path, NULL );
 	archive->can_extract = archive->has_test = archive->has_properties = TRUE;
 	archive->dummy_size = 0;
     archive->nr_of_files = 0;
     archive->nr_of_dirs = 0;
-	archive->parse_output = RarOpen;
+    archive->nc = 9;
+	archive->parse_output = xa_get_rar_line_content;
 	archive->format ="RAR";
 	xa_spawn_async_process (archive,command,0);
 	g_free ( command );
+
 	if ( archive->child_pid == 0 )
 		return;
 
-	char *names[]= {(_("Filename")),(_("Original")),(_("Compressed")),(_("Ratio")),(_("Date")),(_("Time")),(_("Permissions"))};
-	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,G_TYPE_STRING};
-    archive->has_passwd = FALSE;
-	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,G_TYPE_STRING};
+	archive->column_types = g_malloc0(sizeof(types));
+	for (i = 0; i < 11; i++)
+		archive->column_types[i] = types[i];
+
+	char *names[]= {(_("Original")),(_("Compressed")),(_("Ratio")),(_("Date")),(_("Time")),(_("Permissions")),(_("CRC")),(_("Method")),(_("Version"))};
+    xa_create_liststore (archive,names);
 }
 
-static gboolean RarOpen (GIOChannel *ioc, GIOCondition cond, gpointer data)
+void xa_get_rar_line_content (gchar *line, gpointer data)
 {
 	XArchive *archive = data;
-	gchar **fields = NULL;
-	gchar *line = NULL;
-	GIOStatus status = G_IO_STATUS_NORMAL;
-	unsigned short int x;
+	XEntry *entry;
 
-	if (cond & (G_IO_IN | G_IO_PRI) )
+	gpointer item[9];
+	unsigned short int i = 0;
+	unsigned int linesize,n,a;
+	gboolean encrypted,dir;
+
+	encrypted = dir = FALSE;
+
+	if (last_line)
+		return;
+
+	if (jump_header == FALSE)
 	{
-		do
+		if (line[0] == '-')
 		{
-			/* This to avoid inserting in the list RAR's 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 , "--------" , 8) == 0)
-				{
-					jump_header = TRUE;
-					odd_line = TRUE;
-				}
-				g_free (line);
-				break;
-			}
-			if (jump_header && odd_line)
-			{
-				/* Now read the filename */
-				status = g_io_channel_read_line ( ioc, &line, NULL, NULL, NULL );
-				if ( line == NULL )
-					break;
-				/* This to avoid inserting in the liststore the last line of Rar output */
-				if (strncmp (line, "--------", 8) == 0 || strncmp (line, "\x0a",1) == 0)
-				{
-					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;
-				}
-				gtk_list_store_append (archive->liststore, &iter);
-				archive->cmd_line_output = g_list_append (archive->cmd_line_output,g_strdup(line));
-				line[ strlen(line) - 1 ] = '\000';
-				if (line[0] == '*')
-					archive->has_passwd = TRUE;
-				/* This to avoid the white space or the * before the first char of the filename */
-				line++;
-				gtk_list_store_set (archive->liststore, &iter,0,line,-1);
-				/* Restore the pointer before freeing it */
-				line--;
-				g_free (line);
-				odd_line = ! odd_line;
-				break;
-			}
-			else
-			{
-				/* Now read the rest of the data */
-				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,6);
-				if (fields[5] == NULL)
-					break;
-				if ( strstr (fields[5] , "d") == NULL && strstr (fields[5] , "D") == NULL )
-					archive->nr_of_files++;
-				else
-					archive->nr_of_dirs++;
-				for (x = 0; x < 6; x++)
-				{
-					if (x == 0 || x == 1)
-						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);
-				}
-				while ( gtk_events_pending() )
-					gtk_main_iteration();
-				archive->dummy_size += strtoll(fields[0],NULL,0);
-				g_strfreev ( fields );
-				g_free (line);
-				odd_line = ! odd_line;
-			}
+			jump_header = TRUE;
+			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) )
+	if (read_filename == FALSE)
 	{
-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;
+		linesize = strlen(line);
+		if(line[0] == '*')
+			encrypted = TRUE;
+		else if (line[0] == '-')
+		{
+			last_line = TRUE;
+			return;
+		}
+		line[linesize - 1] = '\0';
+		filename = g_strdup(line+1);
+		read_filename = TRUE;
 	}
-	return TRUE;
+	else
+	{
+		/* size */
+		for(n=0; n < linesize && line[n] == ' '; n++);
+		a = n;
+		for(; n < linesize && line[n] != ' '; n++);
+		line[n]='\0';
+		item[i] = line + a;
+		i++;
+		n++;
+		
+		/* Packed */
+		for(; n < linesize && line[n] == ' '; n++);
+		a = n;
+		for(; n < linesize && line[n] != ' '; n++);
+		line[n]='\0';
+		item[i] = line + a;
+		i++;
+		n++;
+
+		/* Ratio */
+		for(; n < linesize && line[n] == ' '; n++);
+		a = n;
+		for(; n < linesize && line[n] != ' '; n++);
+		line[n] = '\0';
+		item[i] = line + a;
+		i++;
+		n++;
+
+		/* Date */
+		for(; n < linesize && line[n] == ' '; n++);
+		a = n;
+		for(; n < linesize && line[n] != ' '; n++);
+		line[n] = '\0';
+		item[i] = line + a;
+		i++;
+		n++;
+
+		/* Time */
+		for(; n < linesize && line[n] == ' '; n++);
+		a = n;
+		for(; n < linesize && line[n] != ' '; n++);
+		line[n] = '\0';
+		item[i] = line + a;
+		i++;
+		n++;
+
+		/* Attr */
+		for(; n < linesize && line[n] == ' '; n++);
+		a = n;
+		for(; n < linesize && line[n] != ' '; n++);
+		line[n] = '\0';
+		item[i] = line + a;
+		i++;
+		n++;
+
+		/* CRC */
+		for(; n < linesize && line[n] == ' '; n++);
+		a = n;
+		for(; n < linesize && line[n] != ' '; n++);
+		line[n] = '\0';
+		item[i] = line + a;
+		i++;
+		n++;
+
+		/* Method */
+		for(; n < linesize && line[n] == ' '; n++);
+		a = n;
+		for(; n < linesize && line[n] != ' '; n++);
+		line[n] = '\0';
+		item[i] = line + a;
+		i++;
+		n++;
+
+		/* version */
+		for(; n < linesize && line[n] == ' '; n++);
+		a = n;
+		for(; n < linesize && line[n] != ' ' && line[n] != '\n'; n++);
+		line[n] = '\0';
+		item[i] = line + a;
+		i++;
+		n++;
+
+		entry = xa_set_archive_entries_for_each_row (archive,filename,encrypted,item);
+		g_free(filename);
+		read_filename = FALSE;
+	}
 }

Modified: xarchiver/trunk/src/rar.h
===================================================================
--- xarchiver/trunk/src/rar.h	2007-08-07 21:30:12 UTC (rev 25960)
+++ xarchiver/trunk/src/rar.h	2007-08-09 21:38:30 UTC (rev 25961)
@@ -20,12 +20,11 @@
 #define RAR_H
 
 #include <gtk/gtk.h>
-#include <string.h>
 #include <stdlib.h>
 #include "string_utils.h"
 #include "support.h"
 #include "archive.h"
-
-gboolean jump_header , odd_line;
-void OpenRar ( XArchive *archive );
+gboolean jump_header,read_filename, last_line;
+gchar *filename;
+void xa_open_rar ( XArchive *archive );
 #endif

Modified: xarchiver/trunk/src/window.c
===================================================================
--- xarchiver/trunk/src/window.c	2007-08-07 21:30:12 UTC (rev 25960)
+++ xarchiver/trunk/src/window.c	2007-08-09 21:38:30 UTC (rev 25961)
@@ -117,7 +117,7 @@
 			switch ( archive->type )
 			{
 				case XARCHIVETYPE_RAR:
-			    OpenRar ( archive );
+			    xa_open_rar ( archive );
 				break;
 
 				case XARCHIVETYPE_TAR:
@@ -358,7 +358,7 @@
 		break;
 
 		case XARCHIVETYPE_RAR:
-		OpenRar (archive[current_page]);
+		xa_open_rar (archive[current_page]);
 		break;
 
 		case XARCHIVETYPE_RPM:
@@ -2197,6 +2197,20 @@
 	gtk_widget_show (comment_window);
 }
 
+void xa_location_entry_activated (GtkEntry *entry, gpointer  user_data)
+{
+	gchar *parent = NULL;
+	gint current_page;
+	gint idx;
+
+	parent = xa_get_parent_dir ((const gchar*)gtk_entry_get_text(entry));
+	current_page = gtk_notebook_get_current_page(notebook);
+	idx = xa_find_archive_index (current_page);
+	g_print ("parent: %s\t loc.entry: %s\n",parent,archive[idx]->location_entry_path);
+	//xa_update_window_with_archive_entries(archive[idx],parent);
+	g_free (parent);
+}
+
 void xa_treeview_row_activated(GtkTreeView *tree_view,GtkTreePath *path,GtkTreeViewColumn *column,gpointer user_data)
 {
 	gint current_page;

Modified: xarchiver/trunk/src/window.h
===================================================================
--- xarchiver/trunk/src/window.h	2007-08-07 21:30:12 UTC (rev 25960)
+++ xarchiver/trunk/src/window.h	2007-08-09 21:38:30 UTC (rev 25961)
@@ -108,6 +108,7 @@
 gchar *xa_open_file_dialog ();
 gchar *xa_open_sfx_file_selector ();
 void xa_activate_link (GtkAboutDialog *about, const gchar *link, gpointer data);
+void xa_location_entry_activated (GtkEntry *entry,gpointer  user_data);
 void xa_treeview_row_activated(GtkTreeView *tree_view,GtkTreePath *path,GtkTreeViewColumn *column,gpointer user_data);
 gchar *name;
 gchar *permissions;

Modified: xarchiver/trunk/src/zip.c
===================================================================
--- xarchiver/trunk/src/zip.c	2007-08-07 21:30:12 UTC (rev 25960)
+++ xarchiver/trunk/src/zip.c	2007-08-09 21:38:30 UTC (rev 25961)
@@ -25,7 +25,7 @@
 extern void xa_create_liststore ( XArchive *archive, gchar *columns_names[]);
 static void xa_get_zip_line_content (gchar *line, gpointer data);
 
-void xa_open_zip ( XArchive *archive )
+void xa_open_zip (XArchive *archive)
 {
 	unsigned short int i;
 



More information about the Xfce4-commits mailing list