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

Reply via email to