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