Author: colossus
Date: 2007-08-12 16:42:57 +0000 (Sun, 12 Aug 2007)
New Revision: 25977

Modified:
   xarchiver/trunk/src/7zip.c
   xarchiver/trunk/src/7zip.h
   xarchiver/trunk/src/main.c
   xarchiver/trunk/src/rar.c
   xarchiver/trunk/src/tar.c
   xarchiver/trunk/src/window.c
Log:
Archive navigation works for 7zip too.


Modified: xarchiver/trunk/src/7zip.c
===================================================================
--- xarchiver/trunk/src/7zip.c  2007-08-12 14:22:28 UTC (rev 25976)
+++ xarchiver/trunk/src/7zip.c  2007-08-12 16:42:57 UTC (rev 25977)
@@ -17,71 +17,144 @@
  */
 
 #include "config.h"
+#include <string.h>
 #include "7zip.h"
 
-static gboolean SevenZipOpen (GIOChannel *ioc, GIOCondition cond, gpointer 
data);
-void Open7Zip ( XArchive *archive)
+extern gboolean sevenzr;
+extern void xa_create_liststore ( XArchive *archive, gchar *columns_names[]);
+gchar *exe;
+
+void xa_open_7zip (XArchive *archive)
 {
-    jump_header = FALSE;
-       gchar *command = g_strconcat ( "7za l " , archive->escaped_path, NULL );
+       jump_header = last_line = FALSE;
+       unsigned short int i = 0;
+
+       if (sevenzr)
+               exe = "7zr ";
+       else
+               exe = "7za ";
+
+       gchar *command = g_strconcat ( exe,"l " , archive->escaped_path, NULL );
+       g_print (command);
        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->nr_of_files = 0;
+       archive->nr_of_dirs = 0;
        archive->format ="7-ZIP";
-       archive->parse_output = SevenZipOpen;
+       archive->nc = 5;
+       archive->parse_output = xa_get_7zip_line_content;
        xa_spawn_async_process (archive,command,0);
        g_free ( command );
        if ( archive->child_pid == 0 )
                return;
 
-       char *names[]= 
{(_("Filename")),(_("Original")),(_("Compressed")),(_("Attr")),(_("Time")),(_("Date"))};
-       GType types[]= 
{G_TYPE_STRING,G_TYPE_UINT64,G_TYPE_UINT64,G_TYPE_STRING,G_TYPE_STRING,G_TYPE_STRING};
-       xa_create_liststore ( 6, 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};
+       archive->column_types = g_malloc0(sizeof(types));
+       for (i = 0; i < 7; i++)
+               archive->column_types[i] = types[i];
+
+       char *names[]= 
{(_("Original")),(_("Compressed")),(_("Attr")),(_("Time")),(_("Date"))};
+       xa_create_liststore (archive,names);
 }
 
-static gboolean SevenZipOpen (GIOChannel *ioc, GIOCondition cond, gpointer 
data)
+void xa_get_7zip_line_content (gchar *line, gpointer data)
 {
        XArchive *archive = data;
-       gchar **fields = NULL;
-       gchar *filename = NULL;
-       gchar *line = NULL;
-       GtkTreeIter iter;
-       GIOStatus status = G_IO_STATUS_NORMAL;
-       unsigned short int x;
+       XEntry *entry;
+       gchar *filename;
+       gpointer item[5];
+       unsigned short int i = 0;
+       gint linesize = 0,n = 0,a = 0;
+       gboolean dir = FALSE;
 
-       if (cond & (G_IO_IN | G_IO_PRI) )
+       if (last_line)
+               return;
+
+       if (jump_header == FALSE)
        {
-               do
+               if (line[0] == '-')
                {
-                       /* This to avoid inserting in the liststore 7zip's 
message */
-                       if (jump_header == FALSE )
-                       {
-                               for ( x = 0; x <= 7; x++)
-                               {
-                                       status = g_io_channel_read_line ( ioc, 
&line, NULL, NULL, NULL );
-                                       archive->cmd_line_output = 
g_list_append (archive->cmd_line_output,g_strdup(line));
-                                       g_free (line);
-                               }
-                               jump_header = TRUE;
-                       }
-                       status = g_io_channel_read_line ( ioc, &line, NULL, 
NULL, NULL );
-                       if ( line == NULL )
-                               break;
+                       jump_header = TRUE;
+                       return;
+               }
+               return;
+       }
+       if (line[0] == '-')
+       {
+               last_line = TRUE;
+               return;
+       }
+       
+       linesize = strlen(line);
 
-                       /* This to avoid inserting the last line of output */
-                       if (strncmp (line, "-----------------", 17) == 0 || 
strncmp (line, "\x0a",1) == 0)
-                       {
-                               archive->cmd_line_output = g_list_append 
(archive->cmd_line_output,g_strdup(line));
-                               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;
-                       }
-                       archive->cmd_line_output = g_list_append 
(archive->cmd_line_output,g_strdup(line));
+       /* Date */
+       line[10] = '\0';
+       item[4] = line;
+
+       /* Time */
+       for(n=13; n < linesize; ++n)
+               if(line[n] == ' ')
+                       break;
+       line[n] = '\0';
+       item[3] = line + 11;
+       a = ++n;
+       
+       /* Permissions */
+       for(; n < linesize; n++)
+               if(line[n] == ' ')
+                       break;
+       line[n] = '\0';
+       if ((line+a)[0] == 'D')
+               dir = TRUE;
+       else
+               archive->nr_of_files++;
+       item[2] = line + a;
+       
+       /* Size */
+       for(++n; n < linesize; ++n)
+               if(line[n] >= '0' && line[n] <= '9')
+                       break;
+       a = n;
+
+       for(; n < linesize; ++n)
+               if(line[n] == ' ')
+                       break;
+
+       line[n] = '\0';
+       item[0] = line + a;
+       archive->dummy_size += strtoll(item[0],NULL,0);
+
+       /* Compressed */
+       for(++n; n < linesize; ++n)
+               if(line[n] >= '0' && line[n] <= '9')
+                       break;
+       a = n;
+
+       for(; n < linesize; ++n)
+               if(line[n] == ' ')
+                       break;
+
+       line[n] = '\0';
+       item[1] = line + a;
+       n+= 2;
+
+       /* Filename */
+       line[linesize-1] = '\0';
+       filename = g_strdup(line + n);
+       
+       /* Work around for 7za which doesn't
+       * output / with directories */
+       if (dir)
+       {
+               gchar *filename_with_slash = g_strconcat (filename,"/",NULL);
+               g_free (filename);
+               filename = filename_with_slash;
+       }
+       
+       entry = xa_set_archive_entries_for_each_row 
(archive,filename,FALSE,item);
+       g_free(filename);
+
+       /*              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);
@@ -121,6 +194,6 @@
                g_object_unref (archive->model);
                return FALSE;
        }
-       return TRUE;
+       return TRUE;*/
 }
 

Modified: xarchiver/trunk/src/7zip.h
===================================================================
--- xarchiver/trunk/src/7zip.h  2007-08-12 14:22:28 UTC (rev 25976)
+++ xarchiver/trunk/src/7zip.h  2007-08-12 16:42:57 UTC (rev 25977)
@@ -20,12 +20,12 @@
 #define SEVENZIP_H
 
 #include <gtk/gtk.h>
-#include <string.h>
 #include <stdlib.h>
 #include "string_utils.h"
 #include "support.h"
 #include "archive.h"
 
-gboolean jump_header;
-void Open7Zip ( XArchive *archive );
+gboolean jump_header, last_line;
+void xa_open_7zip (XArchive *archive);
+void xa_get_7zip_line_content (gchar *line, gpointer data);
 #endif

Modified: xarchiver/trunk/src/main.c
===================================================================
--- xarchiver/trunk/src/main.c  2007-08-12 14:22:28 UTC (rev 25976)
+++ xarchiver/trunk/src/main.c  2007-08-12 16:42:57 UTC (rev 25977)
@@ -34,6 +34,7 @@
 gboolean error_output, file_to_open, ask_and_extract, ask_and_add;
 gboolean cli = FALSE;
 gboolean unrar = FALSE;
+gboolean sevenzr = FALSE;
 extern gchar *current_open_directory;
 Prefs_dialog_data *prefs_window = NULL;
 
@@ -407,6 +408,7 @@
        absolute_path = g_find_program_in_path("7zr");
     if (absolute_path)
     {
+       sevenzr = TRUE;
         ArchiveType = g_list_prepend ( ArchiveType, "7z");
            ArchiveSuffix = g_list_prepend ( ArchiveSuffix, "*.7z");
                g_free (absolute_path);

Modified: xarchiver/trunk/src/rar.c
===================================================================
--- xarchiver/trunk/src/rar.c   2007-08-12 14:22:28 UTC (rev 25976)
+++ xarchiver/trunk/src/rar.c   2007-08-12 16:42:57 UTC (rev 25977)
@@ -191,10 +191,10 @@
                line[n] = '\0';
                item[i] = line + a;
 
+               /* Work around for rar which doesn't
+                * output / with directories */
                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-12 14:22:28 UTC (rev 25976)
+++ xarchiver/trunk/src/tar.c   2007-08-12 16:42:57 UTC (rev 25977)
@@ -65,8 +65,7 @@
        XEntry *entry;
        gchar *filename;
        gpointer item[6];
-       gsize linesize = 0;
-       gint n = 0, a = 0;
+       gint n = 0, a = 0 ,linesize = 0;
        gboolean dir = FALSE;
 
        linesize = strlen(line);

Modified: xarchiver/trunk/src/window.c
===================================================================
--- xarchiver/trunk/src/window.c        2007-08-12 14:22:28 UTC (rev 25976)
+++ xarchiver/trunk/src/window.c        2007-08-12 16:42:57 UTC (rev 25977)
@@ -117,39 +117,39 @@
                        switch ( archive->type )
                        {
                                case XARCHIVETYPE_RAR:
-                           xa_open_rar ( archive );
+                           xa_open_rar (archive);
                                break;
 
                                case XARCHIVETYPE_TAR:
-                               xa_open_tar ( archive );
+                               xa_open_tar (archive);
                                break;
 
                                case XARCHIVETYPE_TAR_BZ2:
-                               xa_open_bzip2 ( archive );
+                               xa_open_bzip2 (archive);
                                break;
 
                                case XARCHIVETYPE_TAR_GZ:
-                               xa_open_gzip ( archive );
+                               xa_open_gzip (archive);
                                break;
 
                                case XARCHIVETYPE_TAR_LZMA:
-                               OpenLzma ( archive );
+                               OpenLzma (archive);
                                break;
 
                                case XARCHIVETYPE_ZIP:
-                               xa_open_zip ( archive );
+                               xa_open_zip (archive);
                                break;
 
                                case XARCHIVETYPE_7ZIP:
-                               Open7Zip ( archive );
+                               xa_open_7zip (archive);
                                break;
 
                                case XARCHIVETYPE_ARJ:
-                               OpenArj ( archive );
+                               OpenArj (archive);
                                break;
 
                                case XARCHIVETYPE_LHA:
-                               OpenLha ( archive );
+                               OpenLha (archive);
                                break;
 
                                default:
@@ -374,7 +374,7 @@
                break;
 
                case XARCHIVETYPE_7ZIP:
-               Open7Zip (archive[current_page]);
+               xa_open_7zip (archive[current_page]);
                break;
 
                case XARCHIVETYPE_LHA:

_______________________________________________
Xfce4-commits mailing list
[email protected]
http://foo-projects.org/mailman/listinfo/xfce4-commits

Reply via email to