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