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);
_______________________________________________
Xfce4-commits mailing list
[email protected]
http://foo-projects.org/mailman/listinfo/xfce4-commits