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;
 

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

Reply via email to