Author: colossus
Date: 2006-08-04 13:09:17 +0000 (Fri, 04 Aug 2006)
New Revision: 22651

Modified:
   xarchiver/trunk/src/archive.h
   xarchiver/trunk/src/callbacks.c
   xarchiver/trunk/src/callbacks.h
   xarchiver/trunk/src/extract_dialog.c
   xarchiver/trunk/src/extract_dialog.h
Log:
Changed the code for handling extraction with no path for tar archives.
Fixed a bug with detection of zip and arj encrypted archives introduced with 
revision 22638.


Modified: xarchiver/trunk/src/archive.h
===================================================================
--- xarchiver/trunk/src/archive.h       2006-08-04 13:02:53 UTC (rev 22650)
+++ xarchiver/trunk/src/archive.h       2006-08-04 13:09:17 UTC (rev 22651)
@@ -66,7 +66,6 @@
        gboolean solid_archive;
        gboolean remove_files;
        unsigned short int compression_level;
-       unsigned short int tar_strip_value;
        gchar *passwd;
        gint nr_of_files;
        gint nr_of_dirs;

Modified: xarchiver/trunk/src/callbacks.c
===================================================================
--- xarchiver/trunk/src/callbacks.c     2006-08-04 13:02:53 UTC (rev 22650)
+++ xarchiver/trunk/src/callbacks.c     2006-08-04 13:09:17 UTC (rev 22651)
@@ -917,6 +917,8 @@
        unsigned int extended_header_CRC;
        unsigned char arj_flag;
 
+       fseek ( stream, 0 , SEEK_SET );
+       fseek ( stream, 6 , SEEK_SET );
        if ( type == XARCHIVETYPE_ZIP )
        {
                while ( memcmp ( magic,"\x50\x4b\x03\x04",4 ) == 0  || memcmp ( 
magic,"\x50\x4b\x05\x06",4 ) == 0 )
@@ -1160,6 +1162,12 @@
        archive->full_path = 0;
        archive->overwrite = 1;
        
+       gtk_tree_model_get (model, &iter, 0, &dummy_name, -1);
+       dir = EscapeBadChars ( dummy_name , 1 );
+       names = g_string_new (" ");
+       g_string_append ( names , dir );
+       archive->parse_output = 0;
+
        if (archive->type == XARCHIVETYPE_ISO)
        {
                gtk_tree_model_get (model, &iter,
@@ -1172,25 +1180,31 @@
                ViewFileFromArchive (archive->child_pid , 0 , name);
                g_free (permissions);
        }
+       else if (archive->type == XARCHIVETYPE_TAR || archive->type == 
XARCHIVETYPE_TAR_BZ2 || archive->type == XARCHIVETYPE_TAR_GZ)
+       {
+               gchar *option = NULL;
+               gchar *digit;
+               digit = g_strdup_printf ("%d", CountCharacter (names->str , 
'/') );
+               if (archive->type == XARCHIVETYPE_TAR)
+                       option = " -xvf ";
+               else if (archive->type == XARCHIVETYPE_TAR_BZ2)
+                       option = " -xvjf ";
+               else if (archive->type == XARCHIVETYPE_TAR_GZ)
+                       option = " -xvzf ";
+               command = g_strconcat ("tar 
--strip-components=",digit,option,archive->escaped_path," -C 
/tmp",names->str,NULL);
+               g_free (digit);
+       }
        else
-       {
-               gtk_tree_model_get (model, &iter, 0, &dummy_name, -1);
-               dir = EscapeBadChars ( dummy_name , 1 );
-               names = g_string_new (" ");
-               g_string_append ( names , dir );
-
-               archive->parse_output = 0;
                command = xa_extract_single_files ( archive , names, "/tmp");
-               SpawnAsyncProcess ( archive , command , 0, 0);
-               g_free ( command );
-               g_string_free (names,TRUE);
+       SpawnAsyncProcess ( archive , command , 0, 0);
+       g_free (command);
+       if ( archive->child_pid == 0 )
+               return;
 
-               if ( archive->child_pid == 0 )
-                       return;
-               g_child_watch_add ( archive->child_pid , (GChildWatchFunc) 
ViewFileFromArchive , dummy_name );
-       }
-               archive->full_path = full_path;
-               archive->overwrite = overwrite;
+       g_string_free (names,TRUE);
+       g_child_watch_add ( archive->child_pid , (GChildWatchFunc) 
ViewFileFromArchive , dummy_name );
+       archive->full_path = full_path;
+       archive->overwrite = overwrite;
 }
 
 GChildWatchFunc *ViewFileFromArchive (GPid pid , gint status , gchar *data)
@@ -1563,7 +1577,7 @@
        g_free (name);
 }
 
-void xa_run_command ( gchar *command , gboolean watch_child_flag )
+gboolean xa_run_command ( gchar *command , gboolean watch_child_flag )
 {
        int status;
        gboolean waiting = TRUE;
@@ -1573,7 +1587,7 @@
        archive->parse_output = 0;
        SpawnAsyncProcess ( archive , command , 0, 1);
        if ( archive->child_pid == 0 )
-               return;
+               return FALSE;
        gtk_widget_show ( viewport2 );
        
        while (waiting)
@@ -1587,6 +1601,7 @@
        }
        if (watch_child_flag)
                xa_watch_child (archive->child_pid, status, archive);
+       return TRUE;
 }
 
 void Update_StatusBar ( gchar *msg)
@@ -1800,7 +1815,6 @@
                gtk_tree_model_get (model, &iter, 0, &name, -1);
 
                extract_path = extract_local_path ( no_uri_path , name );
-               archive->tar_strip_value = CountCharacter ( name, '/' );
                g_free (name);
                g_free ( no_uri_path );
                if (extract_path != NULL)

Modified: xarchiver/trunk/src/callbacks.h
===================================================================
--- xarchiver/trunk/src/callbacks.h     2006-08-04 13:02:53 UTC (rev 22650)
+++ xarchiver/trunk/src/callbacks.h     2006-08-04 13:09:17 UTC (rev 22651)
@@ -115,7 +115,7 @@
 void ConcatenateFileNames (GtkTreeModel *model, GtkTreePath *treepath, 
GtkTreeIter *iter, GString *data);
 void ConcatenateFileNames2 (gchar *filename , GString *data);
 void xa_cat_filenames (GtkTreeModel *model, GtkTreePath *treepath, GtkTreeIter 
*iter, GString *data);
-void xa_run_command ( gchar *command , gboolean watch_child_flag );
+gboolean xa_run_command ( gchar *command , gboolean watch_child_flag );
 void OffDeleteandViewButtons();
 void OffTooltipPadlock();
 void Update_StatusBar (gchar *msg);

Modified: xarchiver/trunk/src/extract_dialog.c
===================================================================
--- xarchiver/trunk/src/extract_dialog.c        2006-08-04 13:02:53 UTC (rev 
22650)
+++ xarchiver/trunk/src/extract_dialog.c        2006-08-04 13:09:17 UTC (rev 
22651)
@@ -23,7 +23,6 @@
 #include "callbacks.h"
 #include "support.h"
 
-gchar *strip_string = NULL;
 gboolean ISO_stop_flag = FALSE;
 
 Extract_dialog_data *xa_create_extract_dialog (gint selected , XArchive 
*archive)
@@ -153,14 +152,11 @@
        gtk_widget_show (dialog_data->overwrite_check);
        gtk_box_pack_start (GTK_BOX (dialog_data->vbox4), 
dialog_data->overwrite_check, FALSE, FALSE, 0);
 
-       if (archive->type == XARCHIVETYPE_RAR || archive->type == 
XARCHIVETYPE_ZIP || archive->type == XARCHIVETYPE_ARJ || archive->type == 
XARCHIVETYPE_7ZIP || archive->type == XARCHIVETYPE_ISO) 
-       {
-               dialog_data->extract_full = gtk_check_button_new_with_mnemonic 
(_("Extract files with full path"));
-               gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON 
(dialog_data->extract_full), archive->full_path);
-               gtk_widget_show (dialog_data->extract_full);
-               gtk_tooltips_set_tip 
(dialog_data->option_tooltip,dialog_data->extract_full , _("The archive's 
directory structure is recreated in the extraction directory."), NULL );
-               gtk_box_pack_start (GTK_BOX (dialog_data->vbox4), 
dialog_data->extract_full, FALSE, FALSE, 0);
-       }
+       dialog_data->extract_full = gtk_check_button_new_with_mnemonic 
(_("Extract files with full path"));
+       gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON 
(dialog_data->extract_full), archive->full_path);
+       gtk_widget_show (dialog_data->extract_full);
+       gtk_tooltips_set_tip 
(dialog_data->option_tooltip,dialog_data->extract_full , _("The archive's 
directory structure is recreated in the extraction directory."), NULL );
+       gtk_box_pack_start (GTK_BOX (dialog_data->vbox4), 
dialog_data->extract_full, FALSE, FALSE, 0);
 
        if (archive->type == XARCHIVETYPE_TAR || archive->type == 
XARCHIVETYPE_TAR_GZ || archive->type == XARCHIVETYPE_TAR_BZ2)
        {
@@ -174,29 +170,6 @@
                gtk_widget_show (dialog_data->hbox6);
                gtk_box_pack_start (GTK_BOX (dialog_data->vbox4), 
dialog_data->hbox6, FALSE, FALSE, 0);
 
-               dialog_data->strip = gtk_check_button_new_with_mnemonic 
(_("Strip directories:"));
-               gtk_widget_show (dialog_data->strip);
-               gtk_box_pack_start (GTK_BOX (dialog_data->hbox6), 
dialog_data->strip, FALSE, FALSE, 0);
-               gtk_tooltips_set_tip 
(dialog_data->option_tooltip,dialog_data->strip , _("This option extracts the 
files without the directory in which they are contained. You have to specify 
the number of directories to strip."), NULL );
-
-               dialog_data->strip_entry = gtk_entry_new ();
-               gtk_widget_set_size_request (dialog_data->strip_entry, 24, -1);
-               gtk_entry_set_max_length (GTK_ENTRY (dialog_data->strip_entry), 
2);
-
-               if ( ! archive->full_path )
-               {
-                       gchar *strip_text;
-                       strip_text = g_strdup_printf ( 
"%d",archive->tar_strip_value);
-                       gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON 
(dialog_data->strip), TRUE);
-                       gtk_entry_set_text (GTK_ENTRY 
(dialog_data->strip_entry), strip_text );
-                       g_free (strip_text);
-                       gtk_widget_set_sensitive (dialog_data->strip_entry , 
TRUE);
-               }
-               else
-                       gtk_widget_set_sensitive (dialog_data->strip_entry , 
FALSE);
-               gtk_widget_show (dialog_data->strip_entry);
-               gtk_box_pack_start (GTK_BOX (dialog_data->hbox6), 
dialog_data->strip_entry, FALSE, FALSE, 0);
-               g_signal_connect ( (gpointer) dialog_data->strip, "toggled", 
G_CALLBACK (show_hide_strip_entry) , dialog_data );
        }
        else
                dialog_data->touch = NULL;
@@ -297,15 +270,6 @@
                gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (data->fresh), 
FALSE);
 }
 
-void show_hide_strip_entry (GtkToggleButton *button, Extract_dialog_data *data)
-{
-       gboolean active = FALSE;
-       if (gtk_toggle_button_get_active (button) )
-               active = TRUE;
-       gtk_widget_set_sensitive (data->strip_entry, active);
-       gtk_widget_grab_focus (data->strip_entry);
-}
-
 gchar *xa_parse_extract_dialog_options ( XArchive *archive , 
Extract_dialog_data *dialog_data, GtkTreeSelection *selection)
 {
        gchar *command = NULL;
@@ -370,23 +334,8 @@
                        if ( dialog_data->touch != NULL)
                                archive->tar_touch = 
gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON ( dialog_data->touch ));
                        
-                       if ( dialog_data->strip != NULL)
-                       {
-                               archive->full_path = ! 
gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON ( dialog_data->strip ));
-                               archive->tar_strip_value = atoi 
(gtk_entry_get_text (GTK_ENTRY(dialog_data->strip_entry)) );
-                               gchar *digit;
-                               digit = g_strdup_printf ("%d", 
archive->tar_strip_value );
-                               strip_string = g_strconcat ( 
"--strip-components=" , digit , " " , NULL );
-                               g_free (digit);
-                       }
-                       else
-                       {
-                               if (dialog_data->extract_full != NULL)
-                               {
-                                       archive->full_path = 
gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON ( dialog_data->extract_full ));
-                                       archive->tar_strip_value = 0;
-                               }
-                       }
+                       if (dialog_data->extract_full != NULL)
+                               archive->full_path = 
gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON ( dialog_data->extract_full ));
 
                        if (dialog_data->fresh != NULL)
                                archive->freshen = 
gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON ( dialog_data->fresh ));
@@ -423,27 +372,48 @@
                                        break;
 
                                        case XARCHIVETYPE_TAR:
-                                       command = g_strconcat (tar, " 
",archive->full_path ? "" : strip_string,
-                                                                               
        "-xvf ", archive->escaped_path,
+                                       if (archive->full_path == 1)
+                                       {
+                                               command = g_strconcat (tar, " 
-xvf ", archive->escaped_path,
                                                                                
        archive->overwrite ? " --overwrite" : " --keep-old-files",
                                                                                
        archive->tar_touch ? " --touch" : "",
                                                                                
        " -C " , extract_path , NULL );
+                                       }
+                                       else
+                                       {
+                                               
xa_extract_tar_without_directories ( "tar -xvf " , archive->escaped_path, 
archive->overwrite,archive->tar_touch,extract_path );
+                                               command = NULL;
+                                       }
                                        break;
 
                                        case XARCHIVETYPE_TAR_BZ2:
-                                       command = g_strconcat (tar, " 
",archive->full_path ? "" : strip_string,
-                                                                               
        "-xvjf " , archive->escaped_path,
+                                       if (archive->full_path == 1)
+                                       {
+                                               command = g_strconcat (tar, " 
-xvjf " , archive->escaped_path,
                                                                                
        archive->overwrite ? " --overwrite" : " --keep-old-files",
                                                                                
        archive->tar_touch ? " --touch" : "",
                                                                                
        " -C " , extract_path , NULL );
+                                       }
+                                       else
+                                       {
+                                               
xa_extract_tar_without_directories ( "tar -xvjf " , archive->escaped_path, 
archive->overwrite,archive->tar_touch,extract_path );
+                                               command = NULL;
+                                       }
                                        break;
 
                                        case XARCHIVETYPE_TAR_GZ:
-                                       command = g_strconcat (tar, " 
",archive->full_path ? "" : strip_string,
-                                                                               
        "-xvzf " , archive->escaped_path,
+                                       if (archive->full_path == 1)
+                                       {
+                                               command = g_strconcat (tar, " 
-xvzf " , archive->escaped_path,
                                                                                
        archive->overwrite ? " --overwrite" : " --keep-old-files",
                                                                                
        archive->tar_touch ? " --touch" : "",
                                                                                
        " -C " , extract_path , NULL );
+                                       }
+                                       else
+                                       {
+                                               
xa_extract_tar_without_directories ( "tar -xvzf " , archive->escaped_path, 
archive->overwrite,archive->tar_touch,extract_path );
+                                               command = NULL;
+                                       }
                                        break;
 
                     case XARCHIVETYPE_ZIP:
@@ -550,15 +520,7 @@
        gchar *command;
        gchar *tar;
 
-       if ( archive->full_path == 0)
-       {
-               archive->tar_strip_value = CountCharacter ( files->str , '/');
-               gchar *digit;
-               digit = g_strdup_printf ( "%d" , archive->tar_strip_value );
-               strip_string = g_strconcat ( "--strip-components=" , digit , " 
" , NULL );
-               g_free (digit);
-       }
-       gchar *msg = g_strdup_printf( _("Extracting files to %s") , path);
+       gchar *msg = g_strdup_printf( _("Extracting archive to %s") , path);
        Update_StatusBar (msg);
        g_free (msg);
        tar = g_find_program_in_path ("gtar");
@@ -583,27 +545,48 @@
                break;
 
                case XARCHIVETYPE_TAR:
-           command = g_strconcat (tar, " ",archive->full_path ? "" : 
strip_string,
-                                                               "-xvf " , 
archive->escaped_path,
+               if (archive->full_path == 1)
+               {
+                       command = g_strconcat (tar, " -xvf " , 
archive->escaped_path,
                                                                
archive->overwrite ? " --overwrite" : " --keep-old-files",
                                                                
archive->tar_touch ? " --touch" : "",
                                                                " -C " , path , 
files->str , NULL );
+               }
+               else
+               {
+                       xa_extract_tar_without_directories ( "tar -xvf " , 
archive->escaped_path, archive->overwrite,archive->tar_touch,path );
+                       command = NULL;
+               }
                break;
 
                case XARCHIVETYPE_TAR_BZ2:
-               command = g_strconcat (tar, " ",archive->full_path ? "" : 
strip_string,
-                                                               "-xjvf " , 
archive->escaped_path,
+               if (archive->full_path == 1)
+               {
+                       command = g_strconcat (tar, " -xjvf " , 
archive->escaped_path,
                                                                
archive->overwrite ? " --overwrite" : " --keep-old-files",
                                                                
archive->tar_touch ? " --touch" : "",
                                                                " -C " , path , 
files->str , NULL );
+               }
+               else
+               {
+                       xa_extract_tar_without_directories ( "tar -xjvf " , 
archive->escaped_path, archive->overwrite,archive->tar_touch,path );
+                       command = NULL;
+               }
                break;
 
                case XARCHIVETYPE_TAR_GZ:
-        command = g_strconcat (tar, " ",archive->full_path ? "" : strip_string,
-                                                               "-xzvf " , 
archive->escaped_path,
+               if (archive->full_path == 1)
+               {
+                       command = g_strconcat (tar, " -xzvf " , 
archive->escaped_path,
                                                                
archive->overwrite ? " --overwrite" : " --keep-old-files",
                                                                
archive->tar_touch ? " --touch" : "",
                                                                " -C " , path , 
files->str , NULL );
+               }
+               else
+               {
+                       xa_extract_tar_without_directories ( "tar -xzvf " , 
archive->escaped_path, archive->overwrite,archive->tar_touch,path );
+                       command = NULL;
+               }
                break;
 
                case XARCHIVETYPE_ZIP:
@@ -695,11 +678,81 @@
                command = NULL;
     }
        g_free (tar);
-    if ( strip_string != NULL)
+       return command;
+}
+
+gboolean xa_extract_tar_without_directories ( gchar *string, gchar 
*escaped_path, gboolean overwrite, gboolean tar_touch, gchar *extract_path )
+{
+       gchar tmp_dir[14];
+       gchar *command = NULL;
+       gchar *name = NULL;
+       gchar *permission = NULL;
+       GtkTreeSelection *selection;
+       GString *names;
+       gboolean end = FALSE;
+       GtkTreeIter iter;
+       GList *row_list;
+
+       names = g_string_new ("");
+       selection = gtk_tree_view_get_selection ( GTK_TREE_VIEW (treeview1) );
+       row_list = gtk_tree_selection_get_selected_rows (selection, &model);
+       
+       if (row_list != NULL)
        {
-               g_free ( strip_string );
-               strip_string = NULL;
+               while (row_list)
+               {
+                       gtk_tree_model_get_iter(model, &iter, row_list->data);
+                       gtk_tree_model_get (model, &iter,
+                                                               0, &name,
+                                                               1, &permission,
+                                                               -1);
+                       gtk_tree_path_free (row_list->data);
+
+                       if (strstr (permission ,"d") == NULL)
+                               ConcatenateFileNames2 ( name , names );
+                       g_free (permission);
+                       row_list = row_list->next;
+               }
+               g_list_free (row_list);
        }
-    return command;
+       else
+       {       
+               end = gtk_tree_model_get_iter_first (model , &iter);
+               while (end)
+               {
+                       gtk_tree_model_get (model, &iter,       0, &name,
+                                                                               
                1, &permission, -1);
+                       if (strstr (permission ,"d") == NULL)
+                               ConcatenateFileNames2 ( name , names );
+                       g_free (permission);
+                       end = gtk_tree_model_iter_next (model,&iter);
+               }
+       }
+
+       strcpy (tmp_dir,"/tmp/xa-XXXXXX");
+       if ( mkdtemp ( tmp_dir ) == 0)
+       {
+               response = ShowGtkMessageDialog (GTK_WINDOW 
(MainWindow),GTK_DIALOG_MODAL,GTK_MESSAGE_ERROR,GTK_BUTTONS_OK,_("Can't create 
temporary directory in /tmp:"),g_strerror(errno) );
+                       return FALSE;
+       }
+       chdir (tmp_dir);
+
+       archive->tmp = g_strdup (tmp_dir);
+       command = g_strconcat ( string, escaped_path,
+                                                                               
overwrite ? " --overwrite" : " --keep-old-files",
+                                                                               
tar_touch ? " --touch" : "",
+                                                                               
" -C " , tmp_dir , names->str, NULL );
+       xa_run_command (command , 0);
+       g_free (command);
+
+       command = g_strconcat ( "mv -f ", names->str, " " , extract_path , NULL 
);
+       xa_run_command (command , 0);
+       g_free (command);
+
+       command = g_strconcat ( "rm -rf ", tmp_dir , NULL );
+       xa_run_command (command , 1);
+       g_free (command);
+
+       g_string_free (names, TRUE);
+       return TRUE;
 }
-

Modified: xarchiver/trunk/src/extract_dialog.h
===================================================================
--- xarchiver/trunk/src/extract_dialog.h        2006-08-04 13:02:53 UTC (rev 
22650)
+++ xarchiver/trunk/src/extract_dialog.h        2006-08-04 13:09:17 UTC (rev 
22651)
@@ -49,8 +49,6 @@
        GtkWidget *touch;
        GtkWidget *fresh;
        GtkWidget *update;
-       GtkWidget *strip;
-       GtkWidget *strip_entry;
        GtkWidget *hbox5;
        GtkWidget *hbox6;
        GtkWidget *label_password;
@@ -68,9 +66,8 @@
 Extract_dialog_data *xa_create_extract_dialog (gint selected ,XArchive 
*archive);
 void fresh_update_toggled_cb (GtkToggleButton *button, Extract_dialog_data 
*data);
 void update_fresh_toggled_cb (GtkToggleButton *button, Extract_dialog_data 
*data);
-void show_hide_strip_entry (GtkToggleButton *button, Extract_dialog_data 
*data);
 gchar *xa_parse_extract_dialog_options ( XArchive *archive , 
Extract_dialog_data *dialog_data, GtkTreeSelection *selection);
 gchar *xa_extract_single_files ( XArchive *archive , GString *files, gchar 
*path);
-
+gboolean xa_extract_tar_without_directories ( gchar *string, gchar 
*escaped_path, gboolean overwrite, gboolean tar_touch, gchar *extract_path );
 #endif
 

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

Reply via email to