diff -r -u xarchiver-0.5.0.orig/src/add_dialog.c xarchiver-0.5.0/src/add_dialog.c --- xarchiver-0.5.0.orig/src/add_dialog.c 2008-11-06 17:07:39 -0600 +++ xarchiver-0.5.0/src/add_dialog.c 2008-11-06 17:14:54 -0600 @@ -238,7 +238,7 @@ flag = TRUE; gtk_widget_set_sensitive(add_dialog->solid_archive,flag); - if (archive->type != XARCHIVETYPE_TAR && archive->type != XARCHIVETYPE_TAR_GZ && archive->type != XARCHIVETYPE_TAR_LZMA && archive->type != XARCHIVETYPE_TAR_BZ2) + if (archive->type != XARCHIVETYPE_TAR && archive->type != XARCHIVETYPE_TAR_GZ && archive->type != XARCHIVETYPE_TAR_LZMA && archive->type != XARCHIVETYPE_TAR_BZ2 && archive->type != XARCHIVETYPE_TAR_LZOP) { flag = TRUE; if (archive->type == XARCHIVETYPE_7ZIP) @@ -300,7 +300,7 @@ g_signal_connect (G_OBJECT (add_dialog->compression_value),"value-changed",G_CALLBACK (fix_adjustment_value), NULL); gtk_tooltips_set_tip (add_dialog->option_tooltip,add_dialog->compression_scale, compression_msg, NULL ); - if (archive->type == XARCHIVETYPE_TAR || archive->type == XARCHIVETYPE_TAR_GZ || archive->type == XARCHIVETYPE_TAR_LZMA || archive->type == XARCHIVETYPE_TAR_BZ2) + if (archive->type == XARCHIVETYPE_TAR || archive->type == XARCHIVETYPE_TAR_GZ || archive->type == XARCHIVETYPE_TAR_LZMA || archive->type == XARCHIVETYPE_TAR_BZ2 || archive->type == XARCHIVETYPE_TAR_LZOP) flag = FALSE; else flag = TRUE; diff -r -u xarchiver-0.5.0.orig/src/archive.h xarchiver-0.5.0/src/archive.h --- xarchiver-0.5.0.orig/src/archive.h 2008-11-06 17:07:39 -0600 +++ xarchiver-0.5.0/src/archive.h 2008-11-06 17:40:10 -0600 @@ -30,12 +30,14 @@ XARCHIVETYPE_BZIP2, XARCHIVETYPE_GZIP, XARCHIVETYPE_LZMA, + XARCHIVETYPE_LZOP, XARCHIVETYPE_RAR, XARCHIVETYPE_RPM, XARCHIVETYPE_TAR, XARCHIVETYPE_TAR_BZ2, XARCHIVETYPE_TAR_GZ, XARCHIVETYPE_TAR_LZMA, + XARCHIVETYPE_TAR_LZOP, XARCHIVETYPE_ZIP, XARCHIVETYPE_LHA, XARCHIVETYPE_COUNT diff -r -u xarchiver-0.5.0.orig/src/bzip2.c xarchiver-0.5.0/src/bzip2.c --- xarchiver-0.5.0.orig/src/bzip2.c 2008-11-06 17:07:39 -0600 +++ xarchiver-0.5.0/src/bzip2.c 2008-11-06 17:53:50 -0600 @@ -54,6 +54,15 @@ archive->extract = extract[archive->type]; xa_open_tar_compressed_file(archive); } + else if (g_str_has_suffix(archive->escaped_path,".tar.lzop") || g_str_has_suffix (archive->escaped_path,".tzo")) + { + archive->type = XARCHIVETYPE_TAR_LZOP; + archive->format = "TAR.LZOP"; + archive->delete = delete[archive->type]; + archive->add = add[archive->type]; + archive->extract = extract[archive->type]; + xa_open_tar_compressed_file(archive); + } else { struct stat my_stat; @@ -68,12 +77,18 @@ executable = "bzip2 "; len = 4; } - else + else if (archive->type == XARCHIVETYPE_LZMA) { archive->format = "LZMA"; executable = "lzma "; len = 5; } + else if (archive->type == XARCHIVETYPE_LZOP) + { + archive->format = "LZOP"; + executable = "lzop "; + len = 5; + } /* else fail? */ archive->can_add = archive->has_test = archive->has_sfx = FALSE; archive->has_properties = archive->can_extract = TRUE; archive->nc = 3; @@ -144,8 +159,11 @@ if (archive->type == XARCHIVETYPE_TAR_BZ2) command = g_strconcat(tar," tfjv ",archive->escaped_path,NULL); - else + else if (archive->type == XARCHIVETYPE_TAR_LZMA) command = g_strconcat(tar," tv --use-compress-program=lzma -f ",archive->escaped_path,NULL); + else if (archive->type == XARCHIVETYPE_TAR_LZOP) + command = g_strconcat(tar," tv --use-compress-program=lzop -f ",archive->escaped_path,NULL); + /* else fail? */ archive->has_properties = archive->can_add = archive->can_extract = TRUE; archive->has_test = archive->has_sfx = FALSE; @@ -180,11 +198,17 @@ executable = "bzip2 "; len = 4; } - else + else if (archive->type == XARCHIVETYPE_LZMA) { executable = "lzma "; len = 5; } + else if (archive->type == XARCHIVETYPE_LZOP) + { + executable = "lzop "; + len = 5; + } + /* else fail? */ filename = xa_remove_path_from_archive_name(archive->escaped_path); dot = strrchr(filename,'.'); if (G_LIKELY(dot)) diff -r -u xarchiver-0.5.0.orig/src/extract_dialog.c xarchiver-0.5.0/src/extract_dialog.c --- xarchiver-0.5.0.orig/src/extract_dialog.c 2008-11-06 17:07:39 -0600 +++ xarchiver-0.5.0/src/extract_dialog.c 2008-11-06 17:37:14 -0600 @@ -223,7 +223,7 @@ else gtk_widget_set_size_request (dialog_data->dialog1,-1,370); - if (archive->type == XARCHIVETYPE_BZIP2 || archive->type == XARCHIVETYPE_GZIP || archive->type == XARCHIVETYPE_LZMA) + if (archive->type == XARCHIVETYPE_BZIP2 || archive->type == XARCHIVETYPE_GZIP || archive->type == XARCHIVETYPE_LZMA || archive->type == XARCHIVETYPE_LZOP) gtk_window_set_title (GTK_WINDOW (dialog_data->dialog1),_("Decompress file")); else gtk_window_set_title (GTK_WINDOW (dialog_data->dialog1),_("Extract files")); @@ -244,11 +244,11 @@ else gtk_widget_set_sensitive (dialog_data->selected_radio,FALSE); - if ( (xa_main_window == NULL && is_tar_compressed(archive->type)) || archive->type == XARCHIVETYPE_GZIP || archive->type == XARCHIVETYPE_LZMA || archive->type == XARCHIVETYPE_BZIP2 || archive->type == XARCHIVETYPE_RPM) + if ( (xa_main_window == NULL && is_tar_compressed(archive->type)) || archive->type == XARCHIVETYPE_GZIP || archive->type == XARCHIVETYPE_LZMA || archive->type == XARCHIVETYPE_BZIP2 || archive->type == XARCHIVETYPE_RPM || archive->type == XARCHIVETYPE_LZOP) flag = FALSE; gtk_widget_set_sensitive (dialog_data->extract_full,flag); - if (archive->type != XARCHIVETYPE_TAR && archive->type != XARCHIVETYPE_TAR_GZ && archive->type != XARCHIVETYPE_TAR_LZMA && archive->type != XARCHIVETYPE_TAR_BZ2 && archive->type != XARCHIVETYPE_DEB) + if (archive->type != XARCHIVETYPE_TAR && archive->type != XARCHIVETYPE_TAR_GZ && archive->type != XARCHIVETYPE_TAR_LZMA && archive->type != XARCHIVETYPE_TAR_BZ2 && archive->type != XARCHIVETYPE_DEB && archive->type != XARCHIVETYPE_TAR_LZOP) flag = FALSE; else flag = TRUE; @@ -303,7 +303,7 @@ case GTK_RESPONSE_CANCEL: case GTK_RESPONSE_DELETE_EVENT: done = TRUE; - if (xa_main_window && (archive->type == XARCHIVETYPE_GZIP || archive->type == XARCHIVETYPE_LZMA || archive->type == XARCHIVETYPE_BZIP2)) + if (xa_main_window && (archive->type == XARCHIVETYPE_GZIP || archive->type == XARCHIVETYPE_LZMA || archive->type == XARCHIVETYPE_BZIP2 || archive->type == XARCHIVETYPE_LZOP)) { gtk_widget_set_sensitive (Stop_button,FALSE); xa_set_button_state (1,1,GTK_WIDGET_IS_SENSITIVE(save1),GTK_WIDGET_IS_SENSITIVE(close1),0,0,0,0,0,0,0); @@ -814,6 +814,11 @@ archive->type = XARCHIVETYPE_TAR_LZMA; archive->extract = extract[XARCHIVETYPE_TAR_LZMA]; } + else if (g_str_has_suffix(archive->escaped_path,".tar.lzop")|| g_str_has_suffix (archive->escaped_path,".tzo")) + { + archive->type = XARCHIVETYPE_TAR_LZOP; + archive->extract = extract[XARCHIVETYPE_TAR_LZOP]; + } (*archive->extract)(archive,NULL); xa_clean_archive_structure(archive); return NULL; diff -r -u xarchiver-0.5.0.orig/src/main.c xarchiver-0.5.0/src/main.c --- xarchiver-0.5.0.orig/src/main.c 2008-11-06 17:07:39 -0600 +++ xarchiver-0.5.0/src/main.c 2008-11-06 17:43:48 -0600 @@ -294,9 +294,10 @@ open_archive[XARCHIVETYPE_LZMA] = &xa_open_bzip2_lzma; open_archive[XARCHIVETYPE_RAR] = &xa_open_rar; open_archive[XARCHIVETYPE_RPM] = &xa_open_rpm; - open_archive[XARCHIVETYPE_TAR] = open_archive[XARCHIVETYPE_TAR_BZ2] = open_archive[XARCHIVETYPE_TAR_GZ] = open_archive[XARCHIVETYPE_TAR_LZMA] = &xa_open_tar; + open_archive[XARCHIVETYPE_TAR] = open_archive[XARCHIVETYPE_TAR_BZ2] = open_archive[XARCHIVETYPE_TAR_GZ] = open_archive[XARCHIVETYPE_TAR_LZMA] = open_archive[XARCHIVETYPE_TAR_LZOP] = &xa_open_tar; open_archive[XARCHIVETYPE_ZIP] = &xa_open_zip; open_archive[XARCHIVETYPE_LHA] = &xa_open_lha; + open_archive[XARCHIVETYPE_LZOP] = &xa_open_bzip2_lzma; delete[0] = 0; delete[XARCHIVETYPE_7ZIP] = &xa_7zip_delete; @@ -307,9 +308,11 @@ delete[XARCHIVETYPE_LZMA] = 0; delete[XARCHIVETYPE_RAR] = &xa_rar_delete; delete[XARCHIVETYPE_RPM] = 0; - delete[XARCHIVETYPE_TAR] = delete[XARCHIVETYPE_TAR_BZ2] = delete[XARCHIVETYPE_TAR_GZ] = delete[XARCHIVETYPE_TAR_LZMA] = &xa_tar_delete; + delete[XARCHIVETYPE_TAR] = delete[XARCHIVETYPE_TAR_BZ2] = delete[XARCHIVETYPE_TAR_GZ] = delete[XARCHIVETYPE_TAR_LZMA] = delete[XARCHIVETYPE_TAR_LZOP] = &xa_tar_delete; delete[XARCHIVETYPE_ZIP] = &xa_zip_delete; delete[XARCHIVETYPE_LHA] = &xa_lha_delete; + delete[XARCHIVETYPE_LZOP] = 0; + add[0] = 0; add[XARCHIVETYPE_7ZIP] = &xa_7zip_add; @@ -318,9 +321,10 @@ add[XARCHIVETYPE_BZIP2] = add[XARCHIVETYPE_GZIP] = add[XARCHIVETYPE_LZMA] = &xa_tar_add; add[XARCHIVETYPE_RAR] = &xa_rar_add; add[XARCHIVETYPE_RPM] = 0; - add[XARCHIVETYPE_TAR] = add[XARCHIVETYPE_TAR_BZ2] = add[XARCHIVETYPE_TAR_GZ] = add[XARCHIVETYPE_TAR_LZMA] = &xa_tar_add; + add[XARCHIVETYPE_TAR] = add[XARCHIVETYPE_TAR_BZ2] = add[XARCHIVETYPE_TAR_GZ] = add[XARCHIVETYPE_TAR_LZMA] = add[XARCHIVETYPE_TAR_LZOP] = &xa_tar_add; add[XARCHIVETYPE_ZIP] = &xa_zip_add; add[XARCHIVETYPE_LHA] = &xa_lha_add; + add[XARCHIVETYPE_LZOP] = &xa_tar_add; extract[0] = 0; extract[XARCHIVETYPE_7ZIP] = &xa_7zip_extract; @@ -329,9 +333,10 @@ extract[XARCHIVETYPE_BZIP2] = extract[XARCHIVETYPE_GZIP] = extract[XARCHIVETYPE_LZMA] = &xa_tar_extract; extract[XARCHIVETYPE_RAR] = &xa_rar_extract; extract[XARCHIVETYPE_RPM] = &xa_rpm_extract; - extract[XARCHIVETYPE_TAR] = extract[XARCHIVETYPE_TAR_BZ2] = extract[XARCHIVETYPE_TAR_GZ] = extract[XARCHIVETYPE_TAR_LZMA] = &xa_tar_extract; + extract[XARCHIVETYPE_TAR] = extract[XARCHIVETYPE_TAR_BZ2] = extract[XARCHIVETYPE_TAR_GZ] = extract[XARCHIVETYPE_TAR_LZMA] = extract[XARCHIVETYPE_TAR_LZOP] = &xa_tar_extract; extract[XARCHIVETYPE_ZIP] = &xa_zip_extract; extract[XARCHIVETYPE_LHA] = &xa_lha_extract; + extract[XARCHIVETYPE_LZOP] = &xa_tar_extract; test[0] = 0; test[XARCHIVETYPE_7ZIP] = &xa_7zip_test; @@ -339,9 +344,10 @@ test[XARCHIVETYPE_DEB] = test[XARCHIVETYPE_BZIP2] = test[XARCHIVETYPE_GZIP] = test[XARCHIVETYPE_LZMA] = 0; test[XARCHIVETYPE_RAR] = &xa_rar_test; test[XARCHIVETYPE_RPM] = 0; - test[XARCHIVETYPE_TAR] = test[XARCHIVETYPE_TAR_BZ2] = test[XARCHIVETYPE_TAR_GZ] = test[XARCHIVETYPE_TAR_LZMA] = 0; + test[XARCHIVETYPE_TAR] = test[XARCHIVETYPE_TAR_BZ2] = test[XARCHIVETYPE_TAR_GZ] = test[XARCHIVETYPE_TAR_LZMA] = test[XARCHIVETYPE_TAR_LZOP] = 0; test[XARCHIVETYPE_ZIP] = &xa_zip_test; test[XARCHIVETYPE_LHA] = &xa_lha_test; + test[XARCHIVETYPE_LZOP] = 0; absolute_path = g_find_program_in_path("arj"); if ( absolute_path ) @@ -382,6 +388,14 @@ g_free (absolute_path); } + absolute_path = g_find_program_in_path("lzop"); + if ( absolute_path ) + { + ArchiveType = g_list_append(ArchiveType, "lzop"); + ArchiveSuffix = g_list_append(ArchiveSuffix, "*.lzop"); + g_free (absolute_path); + } + absolute_path = g_find_program_in_path("lha"); if (absolute_path) { @@ -442,6 +456,11 @@ ArchiveType = g_list_append(ArchiveType, "tar.lzma"); ArchiveSuffix = g_list_append(ArchiveSuffix, "*.tlz"); } + if ( g_list_find ( ArchiveType , "lzop") ) + { + ArchiveType = g_list_append(ArchiveType, "tar.lzop"); + ArchiveSuffix = g_list_append(ArchiveSuffix, "*.tzo"); + } } else tar = "gtar"; @@ -505,6 +524,8 @@ archive->type = XARCHIVETYPE_TAR_GZ; else if ( g_str_has_suffix ( archive->escaped_path , ".tar.lzma") || g_str_has_suffix ( archive->escaped_path , ".tlz") ) archive->type = XARCHIVETYPE_TAR_LZMA; + else if ( g_str_has_suffix ( archive->escaped_path , ".tar.lzop") || g_str_has_suffix ( archive->escaped_path , ".tzo") ) + archive->type = XARCHIVETYPE_TAR_LZOP; return (archive); } diff -r -u xarchiver-0.5.0.orig/src/new_dialog.c xarchiver-0.5.0/src/new_dialog.c --- xarchiver-0.5.0.orig/src/new_dialog.c 2008-11-06 17:07:39 -0600 +++ xarchiver-0.5.0/src/new_dialog.c 2008-11-06 17:33:36 -0600 @@ -209,6 +209,8 @@ type = XARCHIVETYPE_GZIP; else if (strcmp ( ComboArchiveType,"lzma") == 0) type = XARCHIVETYPE_LZMA; + else if (strcmp ( ComboArchiveType,"lzop") == 0) + type = XARCHIVETYPE_LZOP; else if (strcmp ( ComboArchiveType,"rar") == 0) type = XARCHIVETYPE_RAR; else if (strcmp ( ComboArchiveType,"tar") == 0) @@ -219,6 +221,8 @@ type = XARCHIVETYPE_TAR_GZ; else if (strcmp ( ComboArchiveType,"tar.lzma") == 0) type = XARCHIVETYPE_TAR_LZMA; + else if (strcmp ( ComboArchiveType,"tar.lzop") == 0) + type = XARCHIVETYPE_TAR_LZOP; else if (strcmp ( ComboArchiveType,"jar") == 0 || strcmp ( ComboArchiveType,"zip") == 0 ) type = XARCHIVETYPE_ZIP; else if (strcmp ( ComboArchiveType,"rpm") == 0) diff -r -u xarchiver-0.5.0.orig/src/tar.c xarchiver-0.5.0/src/tar.c --- xarchiver-0.5.0.orig/src/tar.c 2008-11-06 17:07:39 -0600 +++ xarchiver-0.5.0/src/tar.c 2008-11-06 17:45:45 -0600 @@ -241,6 +241,17 @@ "--use-compress-program=lzma -cvvf ",archive->escaped_path, files->str , NULL ); break; + + case XARCHIVETYPE_TAR_LZOP: + if ( g_file_test ( archive->escaped_path , G_FILE_TEST_EXISTS ) ) + xa_add_delete_bzip2_gzip_lzma_compressed_tar (files,archive,1); + else + command = g_strconcat (tar, " ", + archive->add_recurse ? "" : "--no-recursion ", + archive->remove_files ? "--remove-files " : "", + "--use-compress-program=lzop -cvvf ",archive->escaped_path, + files->str , NULL ); + break; default: command = NULL; @@ -351,11 +362,35 @@ } break; + case XARCHIVETYPE_TAR_LZOP: + if (archive->full_path == 1) + { + command = g_strconcat (tar, " --use-compress-program=lzop -xvf " , archive->escaped_path, + #ifdef __FreeBSD__ + archive->overwrite ? " " : " -k", + #else + archive->overwrite ? " --overwrite" : " --keep-old-files", + #endif + archive->tar_touch ? " --touch" : "", + " -C ",archive->extraction_path," ",names->str,NULL); + } + else + { + result = xa_extract_tar_without_directories ( "tar --use-compress-program=lzop -xvf ",archive,names->str); + command = NULL; + } + break; + case XARCHIVETYPE_LZMA: result = lzma_bzip2_extract(archive,NULL); command = NULL; break; + case XARCHIVETYPE_LZOP: + result = lzma_bzip2_extract(archive,NULL); + command = NULL; + break; + case XARCHIVETYPE_BZIP2: result = lzma_bzip2_extract(archive,NULL); command = NULL; @@ -398,6 +433,10 @@ executable = "lzma -f "; filename = "dummy.lzma"; break; + case XARCHIVETYPE_TAR_LZOP: + executable = "lzop -f "; + filename = "dummy.lzop"; + break; default: break; @@ -438,7 +477,7 @@ gboolean is_tar_compressed (gint type) { - return (type == XARCHIVETYPE_TAR_BZ2 || type == XARCHIVETYPE_TAR_GZ || type == XARCHIVETYPE_TAR_LZMA); + return (type == XARCHIVETYPE_TAR_BZ2 || type == XARCHIVETYPE_TAR_GZ || type == XARCHIVETYPE_TAR_LZMA || type == XARCHIVETYPE_TAR_LZOP); } gboolean xa_extract_tar_without_directories (gchar *string,XArchive *archive,gchar *files_to_extract) diff -r -u xarchiver-0.5.0.orig/src/window.c xarchiver-0.5.0/src/window.c --- xarchiver-0.5.0.orig/src/window.c 2008-11-06 17:07:39 -0600 +++ xarchiver-0.5.0/src/window.c 2008-11-06 17:32:34 -0600 @@ -1124,6 +1124,8 @@ xx = XARCHIVETYPE_GZIP; else if (memcmp ( magic,"\x5d\x00\x00\x80",4) == 0) xx = XARCHIVETYPE_LZMA; + else if (memcmp ( magic,"\211LZO",4) == 0) + xx = XARCHIVETYPE_LZOP; else if (memcmp ( magic,"\xed\xab\xee\xdb",4) == 0) xx = XARCHIVETYPE_RPM; else if (memcmp ( magic,"\x37\x7a\xbc\xaf\x27\x1c",6) == 0) @@ -1459,6 +1461,7 @@ case XARCHIVETYPE_GZIP: case XARCHIVETYPE_BZIP2: case XARCHIVETYPE_LZMA: + case XARCHIVETYPE_LZOP: case XARCHIVETYPE_RPM: pos = 3; break; @@ -1477,6 +1480,7 @@ case XARCHIVETYPE_TAR_GZ: case XARCHIVETYPE_TAR_BZ2: case XARCHIVETYPE_TAR_LZMA: + case XARCHIVETYPE_TAR_LZOP: case XARCHIVETYPE_TAR: case XARCHIVETYPE_ZIP: pos = 5; @@ -1520,6 +1524,7 @@ case XARCHIVETYPE_GZIP: case XARCHIVETYPE_BZIP2: case XARCHIVETYPE_LZMA: + case XARCHIVETYPE_LZOP: case XARCHIVETYPE_RPM: pos = 3; break; @@ -1538,6 +1543,7 @@ case XARCHIVETYPE_TAR_GZ: case XARCHIVETYPE_TAR_BZ2: case XARCHIVETYPE_TAR_LZMA: + case XARCHIVETYPE_TAR_LZOP: case XARCHIVETYPE_TAR: case XARCHIVETYPE_ZIP: pos = 5;