From 88e74ce7ce3bd064303bc6b5199c44b5f772a2e5 Mon Sep 17 00:00:00 2001 From: Antonio Diaz Diaz Date: Thu, 23 Aug 2018 00:28:09 +0200 Subject: [PATCH] Add support for Lzip Signed-off-by: Antonio Diaz Diaz --- doc/en/archives.docbook | 2 +- doc/en/features.docbook | 2 +- doc/en/introduction.docbook | 4 +-- doc/en/konfigurator.docbook | 22 +++++++++++- doc/en/vfs.docbook | 2 +- doc/krusader.1 | 4 +-- iso/kiso.cpp | 21 +++++++----- krArc/krarc.cpp | 38 +++++++++++++++++---- krusader/Dialogs/packgui.cpp | 1 + krusader/Konfigurator/kgarchives.cpp | 4 ++- krusader/Konfigurator/kgdependencies.cpp | 17 +++++----- krusader/Konfigurator/kggeneral.cpp | 1 + krusader/Konfigurator/kgprotocols.cpp | 4 ++- krusader/Konfigurator/krresulttable.cpp | 3 ++ krusader/Panel/krbriefview.cpp | 1 + krusader/Panel/krdetailedview.cpp | 4 ++- krusader/Panel/krviewitem.cpp | 1 + krusader/Search/krsearchmod.cpp | 3 +- krusader/VFS/arc_vfs.cpp | 43 ++++++++++++++++++------ krusader/VFS/krarchandler.cpp | 32 ++++++++++++++---- krusader/defaults.h | 2 ++ 21 files changed, 158 insertions(+), 53 deletions(-) diff --git a/doc/en/archives.docbook b/doc/en/archives.docbook index 4cbd645..7288062 100644 --- a/doc/en/archives.docbook +++ b/doc/en/archives.docbook @@ -8,7 +8,7 @@ The &vfs-lnk; allows you to browse archives as if it was a directory. Currently &krusader; supports the following archives types: ace, arj, bzip2, deb, gzip, iso, - lha, rar, rpm, tar, zip and 7-zip and supports the following + lha, lzip, rar, rpm, tar, zip and 7-zip and supports the following passworded archives: arj, ace, rar and zip. Passwords can be stored in &tdewallet;. Please note that the archive support first needs to be properly diff --git a/doc/en/features.docbook b/doc/en/features.docbook index b1a454c..6659caf 100644 --- a/doc/en/features.docbook +++ b/doc/en/features.docbook @@ -106,7 +106,7 @@ Archive Handling: browsing, unpack, pack, testing. Supported &archives-lnk; : ace, - arj, bzip2, deb, gzip, iso, lha, rar, rpm, tar, zip and + arj, bzip2, deb, gzip, iso, lha, lzip, rar, rpm, tar, zip and 7-zip. diff --git a/doc/en/introduction.docbook b/doc/en/introduction.docbook index 3873d90..3cb3889 100644 --- a/doc/en/introduction.docbook +++ b/doc/en/introduction.docbook @@ -14,7 +14,7 @@ module, viewer/editor, directory synchronization, file content comparisons, powerful batch renaming and much, much more. &krusader; supports archive formats: ace, arj, bzip2, deb, gzip, iso, lha, - rar, rpm, tar, zip and 7-zip and handles other + lzip, rar, rpm, tar, zip and 7-zip and handles other &tdeioslaves1-url; such as smb:// or fish://. &krusader; is almost completely customizable and therefore very user-friendly. @@ -95,7 +95,7 @@ ISO,rpm,tar.gz) between these data sources/containers effortlessly. &krusader; currently supports VFSs for all popular and some specialized types of archives (ace, arj, - bzip2, gzip, iso, lha, rar, tar, zip and 7-zip), configuration + bzip2, gzip, iso, lha, lzip, rar, tar, zip and 7-zip), configuration packages (rpm, deb), and traditional remote file system types (&FTP;, NFS, Samba, FISH, SFTP). &krusader; also includes a built-in diff --git a/doc/en/konfigurator.docbook b/doc/en/konfigurator.docbook index ab23a78..170f0d4 100644 --- a/doc/en/konfigurator.docbook +++ b/doc/en/konfigurator.docbook @@ -1070,7 +1070,7 @@ HTML_PARSING--> certain archive is grayed-out, it means that &krusader; could not find the appropriate executables in the configured path. The next archives are supported: ace, - arj, bzip2, deb, gzip, iso, lha, rar, rpm, tar, zip and + arj, bzip2, deb, gzip, iso, lha, lzip, rar, rpm, tar, zip and 7-zip. + + + + lzip + + + + + + /usr/bin/lzip + + + + @@ -1874,6 +1888,9 @@ HTML_PARSING--> application/x-lha + + application/x-lzip + application/x-rar @@ -1900,6 +1917,9 @@ HTML_PARSING--> application/x-tgz + + application/x-tlz + diff --git a/doc/en/vfs.docbook b/doc/en/vfs.docbook index 8acb910..22ff092 100644 --- a/doc/en/vfs.docbook +++ b/doc/en/vfs.docbook @@ -26,7 +26,7 @@ Archive VFS: allows to browse archives in VFS as it was a directory (ace, arj, bzip2, deb, - gzip, iso, lha, rar, rpm, tar, zip and 7-zip). + gzip, iso, lha, lzip, rar, rpm, tar, zip and 7-zip). diff --git a/doc/krusader.1 b/doc/krusader.1 index 6e0e5f2..8d5a1a2 100644 --- a/doc/krusader.1 +++ b/doc/krusader.1 @@ -13,7 +13,7 @@ mounted filesystem support, FTP, advanced search module, viewer/editor, directory synchronisation, file content comparisons, powerful batch renaming and much much more. It supports the following archive formats: ace, arj, bzip2, deb, -gzip, iso, lha, rar, rpm, tar, zip and 7-zip +gzip, iso, lha, lzip, rar, rpm, tar, zip and 7-zip and can handle other KIOSlaves such as smb:// or fish:// It is (almost) completely customizable, very user friendly, fast and looks great on your desktop! :-) @@ -102,7 +102,7 @@ Powerful internal viewer and editor. Advanced search module that can search in archives. -Supports: ace, arj, bzip2, deb, gzip, iso, lha, rar, rpm, tar, zip and 7-zip. +Supports: ace, arj, bzip2, deb, gzip, iso, lha, lzip, rar, rpm, tar, zip and 7-zip. Directory comparison and filtering. diff --git a/iso/kiso.cpp b/iso/kiso.cpp index 1e8f192..7e5ec32 100644 --- a/iso/kiso.cpp +++ b/iso/kiso.cpp @@ -125,6 +125,8 @@ KIso::KIso( const TQString& filename, const TQString & _mimetype ) mimetype = "application/x-gzip"; else if ( mimetype == "application/x-tbz" ) // that's a bzipped2 tar file, so ask for bz2 filter mimetype = "application/x-bzip2"; + else if ( mimetype == "application/x-tlz" ) // that's a lzipped tar file, so ask for lzip filter + mimetype = "application/x-lzip"; else if ( mimetype == "application/x-txz" ) // that's a xzipped tar file, so ask for xz filter mimetype = "application/x-xz"; else @@ -136,22 +138,23 @@ KIso::KIso( const TQString& filename, const TQString & _mimetype ) unsigned char firstByte = file.getch(); unsigned char secondByte = file.getch(); unsigned char thirdByte = file.getch(); + unsigned char fourthByte = file.getch(); if ( firstByte == 0037 && secondByte == 0213 ) mimetype = "application/x-gzip"; else if ( firstByte == 'B' && secondByte == 'Z' && thirdByte == 'h' ) mimetype = "application/x-bzip2"; - else if ( firstByte == 'P' && secondByte == 'K' && thirdByte == 3 ) - { - unsigned char fourthByte = file.getch(); - if ( fourthByte == 4 ) + else if ( firstByte == 'L' && secondByte == 'Z' && + thirdByte == 'I' && fourthByte == 'P' ) + mimetype = "application/x-lzip"; + else if ( firstByte == 'P' && secondByte == 'K' && + thirdByte == 3 && fourthByte == 4 ) mimetype = "application/x-zip"; - } - else if ( firstByte == 0xfd && secondByte == '7' && thirdByte == 'z' ) + else if ( firstByte == 0xfd && secondByte == '7' && + thirdByte == 'z' && fourthByte == 'X' ) { - unsigned char fourthByte = file.getch(); unsigned char fifthByte = file.getch(); unsigned char sixthByte = file.getch(); - if ( fourthByte == 'X' && fifthByte == 'Z' && sixthByte == 0) + if ( fifthByte == 'Z' && sixthByte == 0) mimetype = "application/x-xz"; } } @@ -171,7 +174,7 @@ void KIso::prepareDevice( const TQString & filename, else { if("application/x-gzip" == mimetype || "application/x-bzip2" == mimetype || - "application/x-xz" == mimetype) + "application/x-lzip" == mimetype || "application/x-xz" == mimetype) forced = true; TQIODevice *dev = KFilterDev::deviceForFile( filename, mimetype, forced ); diff --git a/krArc/krarc.cpp b/krArc/krarc.cpp index e94c135..83c32ae 100644 --- a/krArc/krarc.cpp +++ b/krArc/krarc.cpp @@ -313,7 +313,9 @@ void tdeio_krarcProtocol::get(const KURL& url, int tries ){ KMimeType::Ptr mt = KMimeType::findByURL( arcTempDir+file, 0, false /* NOT local URL */ ); emit mimeType( mt->name() ); proc << getCmd << convertName( arcFile->url().path() )+" "; - if( arcType != "gzip" && arcType != "bzip2" && arcType != "xz") proc << convertFileName( file ); + if( arcType != "gzip" && arcType != "bzip2" && + arcType != "lzip" && arcType != "xz" ) + proc << convertFileName( file ); connect(&proc,TQT_SIGNAL(receivedStdout(TDEProcess*,char*,int)), this,TQT_SLOT(receivedData(TDEProcess*,char*,int)) ); } @@ -324,7 +326,8 @@ void tdeio_krarcProtocol::get(const KURL& url, int tries ){ if( !extArcReady && !decompressToFile ) { if( !proc.normalExit() || !checkStatus( proc.exitStatus() ) || - ( arcType != "bzip2" && arcType != "xz" && expectedSize != decompressedLen ) ) { + ( arcType != "bzip2" && arcType != "lzip" && + arcType != "xz" && expectedSize != decompressedLen ) ) { if( encrypted && tries ) { invalidatePassword(); get( url, tries - 1 ); @@ -679,6 +682,8 @@ bool tdeio_krarcProtocol::setArcFile(const KURL& url){ arcType = "bzip2"; else if( arcType == "tgz" ) arcType = "gzip"; + else if( arcType == "tlz" ) + arcType = "lzip"; else if( arcType == "txz" ) arcType = "xz"; @@ -707,7 +712,7 @@ bool tdeio_krarcProtocol::initDirDict(const KURL&url, bool forced){ KrShellProcess proc; KTempFile temp( TQString(), "tmp" ); temp.setAutoDelete(true); - if (arcType != "bzip2" && arcType != "xz") { + if( arcType != "bzip2" && arcType != "lzip" && arcType != "xz" ) { if( arcType == "rpm" ) proc << listCmd << convertName( arcPath ) <<" > " << temp.name(); else @@ -739,7 +744,7 @@ bool tdeio_krarcProtocol::initDirDict(const KURL&url, bool forced){ root->append(entry); - if (arcType == "bzip2" || arcType == "xz"){ + if( arcType == "bzip2" || arcType == "lzip" || arcType == "xz" ) { KRDEBUG("Got me here..."); parseLine(0,"",temp.file()); return true; @@ -1062,6 +1067,14 @@ void tdeio_krarcProtocol::parseLine(int lineNo, TQString line, TQFile*) { mode = arcFile->mode(); size = arcFile->size(); } + if( arcType == "lzip" ){ + if( !lineNo ) return; //ignore the first line + size = nextWord(line).toULong(); // uncompressed size + fullName = arcFile->name(); + if( fullName.endsWith(".lz") ) + fullName.truncate(fullName.length() - 3); + mode = arcFile->mode(); + } if(arcType == "lha"){ // permissions perm = nextWord(line); @@ -1311,6 +1324,13 @@ bool tdeio_krarcProtocol::initArcParameters() { copyCmd = TQString(); delCmd = TQString(); putCmd = TQString(); + } else if(arcType == "lzip") { + cmd = fullPathName( "lzip" ); + listCmd = cmd + " -l "; + getCmd = cmd + " -dc "; + copyCmd = TQString(); + delCmd = TQString(); + putCmd = TQString(); } else if(arcType == "arj"){ cmd = fullPathName( "arj" ); listCmd = fullPathName( "arj" ) + " v -y -v "; @@ -1398,7 +1418,8 @@ bool tdeio_krarcProtocol::checkStatus( int exitCode ) { if( arcType == "zip" || arcType == "rar" || arcType == "7z" ) return exitCode == 0 || exitCode == 1; - else if( arcType == "ace" || arcType == "bzip2" || arcType == "lha" || arcType == "rpm" || arcType == "arj" ) + else if( arcType == "ace" || arcType == "bzip2" || arcType == "lha" || + arcType == "lzip" || arcType == "rpm" || arcType == "arj" ) return exitCode == 0; else if( arcType == "gzip"|| arcType == "xz" ) return exitCode == 0 || exitCode == 2; @@ -1420,6 +1441,7 @@ TQString tdeio_krarcProtocol::detectArchive( bool &encrypted, TQString fileName {"ace", 7, "**ACE**" }, {"bzip2",0, "\x42\x5a\x68\x39\x31" }, {"gzip", 0, "\x1f\x8b"}, + {"lzip", 0, "\x4c\x5a\x49\x50\x01" }, {"deb", 0, "!\ndebian-binary " }, {"7z", 0, "7z\xbc\xaf\x27\x1c" }, {"xz", 0, "\xfd" "7zXZ\x00"} }; @@ -1451,14 +1473,16 @@ TQString tdeio_krarcProtocol::detectArchive( bool &encrypted, TQString fileName if( j == detectionString.length() ) { TQString type = autoDetectParams[ i ].type; - if( type == "bzip2" || type == "gzip" ) { + if( type == "bzip2" || type == "gzip" || type == "lzip" ) { KTar tapeArchive( fileName ); if( tapeArchive.open( IO_ReadOnly ) ) { tapeArchive.close(); if( type == "bzip2" ) type = "tbz"; - else + else if( type == "gzip" ) type = "tgz"; + else + type = "tlz"; } } else if( type == "zip" ) diff --git a/krusader/Dialogs/packgui.cpp b/krusader/Dialogs/packgui.cpp index e479060..c374b4b 100644 --- a/krusader/Dialogs/packgui.cpp +++ b/krusader/Dialogs/packgui.cpp @@ -63,6 +63,7 @@ PackGUI::PackGUI(TQString defaultName, TQString defaultPath, int noOfFiles, TQSt if (PS("tar")) typeData->insertItem("tar"); if (PS("tar") && PS("gzip")) typeData->insertItem("tar.gz"); if (PS("tar") && PS("bzip2")) typeData->insertItem("tar.bz2"); + if (PS("tar") && PS("lzip")) typeData->insertItem("tar.lz"); if (PS("tar") && PS("xz")) typeData->insertItem("tar.xz"); if (PS("zip")) typeData->insertItem("zip"); if (PS("rar")) typeData->insertItem("rar"); diff --git a/krusader/Konfigurator/kgarchives.cpp b/krusader/Konfigurator/kgarchives.cpp index f31d719..b856dd6 100644 --- a/krusader/Konfigurator/kgarchives.cpp +++ b/krusader/Konfigurator/kgarchives.cpp @@ -59,6 +59,7 @@ KgArchives::KgArchives( bool first, TQWidget* parent, const char* name ) : {{"Archives","Do Tar", _DoTar, i18n( "Tar" ), false, ""}, {"Archives","Do GZip", _DoGZip, i18n( "GZip" ), false, ""}, {"Archives","Do BZip2", _DoBZip2, i18n( "BZip2" ), false, ""}, + {"Archives","Do LZip", _DoLZip, i18n( "LZip" ), false, ""}, {"Archives","Do UnZip", _DoUnZip, i18n( "Zip" ), false, ""}, {"Archives","Do UnRar", _DoUnRar, i18n( "Rar" ), false, ""}, {"Archives","Do Unarj", _DoArj, i18n( "Arj" ), false, ""}, @@ -70,7 +71,7 @@ KgArchives::KgArchives( bool first, TQWidget* parent, const char* name ) : {"Archives","Do Xz", _DoXz, i18n( "Xz" ), false, ""} }; - cbs = createCheckBoxGroup( 3, 0, packers, 12, generalGrp ); + cbs = createCheckBoxGroup( 3, 0, packers, 13, generalGrp ); generalGrid->addWidget( cbs, 1, 0 ); addLabel( generalGrid, 2, 0, i18n( "The archives that are \"greyed-out\" were unavailable on your\nsystem last time Krusader checked. If you wish Krusader to\nsearch again, click the 'Auto Configure' button." ), @@ -126,6 +127,7 @@ void KgArchives::disableNonExistingPackers() cbs->find( "Do Tar" )->setEnabled(PS("tar")); cbs->find( "Do GZip" )->setEnabled(PS("gzip")); cbs->find( "Do BZip2" )->setEnabled(PS("bzip2")); + cbs->find( "Do LZip" )->setEnabled(PS("lzip")); cbs->find( "Do UnZip" )->setEnabled(PS("unzip")); cbs->find( "Do Lha" )->setEnabled(PS("lha")); cbs->find( "Do RPM" )->setEnabled(PS("rpm") || PS("cpio")); diff --git a/krusader/Konfigurator/kgdependencies.cpp b/krusader/Konfigurator/kgdependencies.cpp index 25da574..aa24908 100644 --- a/krusader/Konfigurator/kgdependencies.cpp +++ b/krusader/Konfigurator/kgdependencies.cpp @@ -86,14 +86,15 @@ KgDependencies::KgDependencies( bool first, TQWidget* parent, const char* name addApplication( "dpkg", archGrid1, 4, packers_tab, PAGE_PACKERS ); addApplication( "gzip", archGrid1, 5, packers_tab, PAGE_PACKERS ); addApplication( "lha", archGrid1, 6, packers_tab, PAGE_PACKERS ); - addApplication( "rar", archGrid1, 7, packers_tab, PAGE_PACKERS ); - addApplication( "tar", archGrid1, 8, packers_tab, PAGE_PACKERS ); - addApplication( "unace", archGrid1, 9, packers_tab, PAGE_PACKERS ); - addApplication( "unarj", archGrid1,10, packers_tab, PAGE_PACKERS ); - addApplication( "unrar", archGrid1,11, packers_tab, PAGE_PACKERS ); - addApplication( "unzip", archGrid1,12, packers_tab, PAGE_PACKERS ); - addApplication( "zip", archGrid1,13, packers_tab, PAGE_PACKERS ); - addApplication( "xz", archGrid1,14, packers_tab, PAGE_PACKERS ); + addApplication( "lzip", archGrid1, 7, packers_tab, PAGE_PACKERS ); + addApplication( "rar", archGrid1, 8, packers_tab, PAGE_PACKERS ); + addApplication( "tar", archGrid1, 9, packers_tab, PAGE_PACKERS ); + addApplication( "unace", archGrid1,10, packers_tab, PAGE_PACKERS ); + addApplication( "unarj", archGrid1,11, packers_tab, PAGE_PACKERS ); + addApplication( "unrar", archGrid1,12, packers_tab, PAGE_PACKERS ); + addApplication( "unzip", archGrid1,13, packers_tab, PAGE_PACKERS ); + addApplication( "zip", archGrid1,14, packers_tab, PAGE_PACKERS ); + addApplication( "xz", archGrid1,15, packers_tab, PAGE_PACKERS ); // ---------------------------- CHECKSUM TAB ------------------------------------- TQWidget *checksum_tab = new TQWidget( tabWidget, "tab_4" ); diff --git a/krusader/Konfigurator/kggeneral.cpp b/krusader/Konfigurator/kggeneral.cpp index f2a9f36..d8fd37d 100644 --- a/krusader/Konfigurator/kggeneral.cpp +++ b/krusader/Konfigurator/kggeneral.cpp @@ -131,6 +131,7 @@ TQFrame *line2 = createLine( generalGrp, "line2" ); TQStringList defaultAtomicExtensions; defaultAtomicExtensions += ".tar.gz"; defaultAtomicExtensions += ".tar.bz2"; + defaultAtomicExtensions += ".tar.lz"; defaultAtomicExtensions += ".moc.cpp"; defaultAtomicExtensions += ".tar.xz"; diff --git a/krusader/Konfigurator/kgprotocols.cpp b/krusader/Konfigurator/kgprotocols.cpp index 6ba7942..4f3134b 100644 --- a/krusader/Konfigurator/kgprotocols.cpp +++ b/krusader/Konfigurator/kgprotocols.cpp @@ -49,13 +49,15 @@ TQString KgProtocols::defaultKrarcMimes = "application/x-7z,application/x-7z-com "application/x-debian-package," "application/x-gzip,application/x-jar," "application/x-lha,application/x-lha-compressed," + "application/x-lzip," "application/x-rar," "application/x-rpm," "application/x-xz," "application/x-zip"; TQString KgProtocols::defaultTarMimes = "application/x-tar,application/x-tarz," "application/x-compressed-tar," - "application/x-tbz,application/x-tgz,application/x-txz"; + "application/x-tbz,application/x-tgz," + "application/x-tlz,application/x-txz"; KgProtocols::KgProtocols( bool first, TQWidget* parent, const char* name ) : KonfiguratorPage( first, parent, name ) diff --git a/krusader/Konfigurator/krresulttable.cpp b/krusader/Konfigurator/krresulttable.cpp index 0ab4280..abc0c55 100644 --- a/krusader/Konfigurator/krresulttable.cpp +++ b/krusader/Konfigurator/krresulttable.cpp @@ -102,6 +102,7 @@ KrArchiverResultTable::KrArchiverResultTable(TQWidget* parent) Archiver* tar = new Archiver("tar", "http://www.gnu.org", PS("tar"), true, true); Archiver* gzip = new Archiver("gzip", "http://www.gnu.org", PS("gzip"), true, true); Archiver* bzip2 = new Archiver("bzip2", "http://www.gnu.org", PS("bzip2"), true, true); + Archiver* lzip = new Archiver("lzip", "http://www.nongnu.org/lzip/lzip.html", PS("lzip"), true, true); Archiver* lha = new Archiver("lha", "http://www.gnu.org", PS("lha"), true, true); Archiver* zip = new Archiver("zip", "http://www.info-zip.org", PS("zip"), true, false); Archiver* unzip = new Archiver("unzip", "http://www.info-zip.org", PS("unzip"), false, true); @@ -139,6 +140,7 @@ KrArchiverResultTable::KrArchiverResultTable(TQWidget* parent) addRow(tar, _grid); addRow(gzip, _grid); addRow(bzip2, _grid); + addRow(lzip, _grid); addRow(lha, _grid); addRow(zip, _grid); addRow(unzip, _grid); @@ -155,6 +157,7 @@ KrArchiverResultTable::KrArchiverResultTable(TQWidget* parent) delete tar; delete gzip; delete bzip2; + delete lzip; delete lha; delete zip; delete unzip; diff --git a/krusader/Panel/krbriefview.cpp b/krusader/Panel/krbriefview.cpp index 571fc44..9edc906 100644 --- a/krusader/Panel/krbriefview.cpp +++ b/krusader/Panel/krbriefview.cpp @@ -1318,6 +1318,7 @@ void KrBriefView::initProperties() { TQStringList defaultAtomicExtensions; defaultAtomicExtensions += ".tar.gz"; defaultAtomicExtensions += ".tar.bz2"; + defaultAtomicExtensions += ".tar.lz"; defaultAtomicExtensions += ".moc.cpp"; defaultAtomicExtensions += ".tar.xz"; TQStringList atomicExtensions = krConfig->readListEntry("Atomic Extensions", defaultAtomicExtensions); diff --git a/krusader/Panel/krdetailedview.cpp b/krusader/Panel/krdetailedview.cpp index c3db5b9..98c8750 100644 --- a/krusader/Panel/krdetailedview.cpp +++ b/krusader/Panel/krdetailedview.cpp @@ -1029,7 +1029,8 @@ void KrDetailedView::keyPressEvent( TQKeyEvent * e ) { if( KRarcHandler::arcSupported( type ) ) { KURL url = i->VF->vfile_getUrl(); - if( type == "-tar" || type == "-tgz" || type == "-tbz" ) + if( type == "-tar" || type == "-tgz" || + type == "-tbz" || type == "-tlz" ) url.setProtocol( "tar" ); else url.setProtocol( "krarc" ); @@ -1413,6 +1414,7 @@ void KrDetailedView::initProperties() { TQStringList defaultAtomicExtensions; defaultAtomicExtensions += ".tar.gz"; defaultAtomicExtensions += ".tar.bz2"; + defaultAtomicExtensions += ".tar.lz"; defaultAtomicExtensions += ".moc.cpp"; defaultAtomicExtensions += ".tar.xz"; TQStringList atomicExtensions = krConfig->readListEntry("Atomic Extensions", defaultAtomicExtensions); diff --git a/krusader/Panel/krviewitem.cpp b/krusader/Panel/krviewitem.cpp index cdb9ed9..4f4fcb4 100644 --- a/krusader/Panel/krviewitem.cpp +++ b/krusader/Panel/krviewitem.cpp @@ -11,6 +11,7 @@ TQString atomicExtensions[] = { ".tar.gz", ".tar.bz2", + ".tar.lz", ".moc.cpp", ".tar.xz", }; diff --git a/krusader/Search/krsearchmod.cpp b/krusader/Search/krsearchmod.cpp index 1ce477b..3777cf6 100644 --- a/krusader/Search/krsearchmod.cpp +++ b/krusader/Search/krsearchmod.cpp @@ -173,7 +173,8 @@ void KRSearchMod::scanLocalDir( KURL urlToScan ) TQString realType = KRarcHandler::getType( encrypted, url.path(), mime ); if( !encrypted ) { - if ( realType == "-tbz" || realType == "-tgz" || realType == "tarz" || realType == "-tar" ) + if ( realType == "-tbz" || realType == "-tgz" || realType == "-tlz" || + realType == "tarz" || realType == "-tar" ) archiveURL.setProtocol( "tar" ); else archiveURL.setProtocol( "krarc" ); diff --git a/krusader/VFS/arc_vfs.cpp b/krusader/VFS/arc_vfs.cpp index cd0f168..1b4a269 100755 --- a/krusader/VFS/arc_vfs.cpp +++ b/krusader/VFS/arc_vfs.cpp @@ -102,6 +102,15 @@ arc_vfs::arc_vfs(TQString origin,TQString type,TQObject* panel,bool write): ignoreLines = -1; isWritable = false; } + if( type == "lzip" ){ + cmd = KrServices::fullPathName ( "lzip" ); + listCmd = " -l "; + delCmd = ""; + addCmd = cmd + " -c "; + getCmd = " -dc "; + ignoreLines = -1; + isWritable = false; + } if(type == "-tar"){ cmd = KrServices::fullPathName( "tar" ); listCmd = " -tvf"; @@ -124,6 +133,14 @@ arc_vfs::arc_vfs(TQString origin,TQString type,TQObject* panel,bool write): addCmd = cmd+" -uvjf"; getCmd = " -xjvf"; isWritable = false; + } + if(type == "-tlz"){ + cmd = KrServices::fullPathName( "tar" ); + listCmd = " -tvf"; // tar detects format automatically + delCmd = ""; + addCmd = ""; // compressed tar archives can't be modified + getCmd = " -xvf"; + isWritable = false; } if(type == "-zip"){ password = KRarcHandler::getPassword(arcFile,type); @@ -233,7 +250,7 @@ bool arc_vfs::getDirs(){ temp.open(IO_ReadOnly); char buf[1000]; TQString line; - if(vfs_type == "gzip" || vfs_type == "-zip" ) + if( vfs_type == "gzip" || vfs_type == "lzip" || vfs_type == "-zip" ) temp.readLine(line,10000); // skip the first line - it's garbage if( vfs_type == "-rar" ){ while(temp.readLine(line,10000) != -1) @@ -399,7 +416,8 @@ KURL::List* arc_vfs::vfs_getFiles(TQStringList* names){ krApp, TQT_SLOT(incProgress(TDEProcess*,char*,int)) ); proc << cmd << getCmd << "\""+arcFile+"\""; - if( vfs_type == "gzip" || vfs_type == "zip2" ) proc << ">"; + if( vfs_type == "gzip" || vfs_type == "zip2" || vfs_type == "lzip" ) + proc << ">"; for(unsigned int i=0 ; i < files.count() ; ){ proc << (prefix+*files.at(i++)); if ( i%MAX_FILES==0 || i==files.count() ){ @@ -595,7 +613,8 @@ void arc_vfs::repack(){ } // finaly repack tmpDir - if( vfs_isWritable() || vfs_type=="gzip" || vfs_type=="zip2" ){ + if( vfs_isWritable() || vfs_type == "gzip" || + vfs_type == "zip2" || vfs_type == "lzip" ){ TQStringList filesToPack; getFilesToPack(&filesToPack); if( !filesToPack.isEmpty() ){ @@ -604,7 +623,7 @@ void arc_vfs::repack(){ connect(&addProc,TQT_SIGNAL(receivedStdout(TDEProcess*,char*,int)), krApp, TQT_SLOT(incProgress(TDEProcess*,char*,int)) ); - if( vfs_type=="gzip" || vfs_type=="zip2" ){ + if( vfs_type == "gzip" || vfs_type == "zip2" || vfs_type == "lzip" ){ addProc << addCmd << *filesToPack.at(0)<< ">" << "\""+arcFile+"\""; addProc.start(TDEProcess::NotifyOnExit); while( addProc.isRunning() ) tqApp->processEvents(); @@ -752,16 +771,19 @@ void arc_vfs::parseLine(TQString line, TQFile* temp){ mode_t mode = 0; - // parse gziped files - if(vfs_type == "gzip"){ + // parse gziped and lzipped files + if( vfs_type == "gzip" || vfs_type == "lzip" ) { KDE_struct_stat stat_p; KDE_stat(arcFile.local8Bit(),&stat_p); - nextWord(line); - size = nextWord(line).toLong(); - nextWord(line); + if( vfs_type == "gzip" ) nextWord(line); // gzip compressed size + size = nextWord(line).toLong(); // uncompressed size + if( vfs_type == "lzip" ) nextWord(line); // lzip compressed size + nextWord(line); // ratio or saved name = nextWord(line,'\n'); if(name.contains('/')) name = name.mid(name.findRev('/')+1,name.length()); + if( vfs_type == "lzip" && name.endsWith(".lz") ) + name.truncate(name.length() - 3); perm = KRpermHandler::mode2TQString(stat_p.st_mode) ; owner = KRpermHandler::user2uid(qfi.owner()); group = KRpermHandler::group2gid(qfi.group()); @@ -783,7 +805,8 @@ void arc_vfs::parseLine(TQString line, TQFile* temp){ } // parse tar files - if(vfs_type == "-tar" || vfs_type == "-tbz" || vfs_type == "-tgz" ){ + if(vfs_type == "-tar" || vfs_type == "-tbz" || + vfs_type == "-tgz" || vfs_type == "-tlz" ){ perm = nextWord(line); TQString temp = nextWord(line); owner = temp.left(temp.findRev('/')).toInt(); diff --git a/krusader/VFS/krarchandler.cpp b/krusader/VFS/krarchandler.cpp index 1e744f2..616b465 100644 --- a/krusader/VFS/krarchandler.cpp +++ b/krusader/VFS/krarchandler.cpp @@ -46,7 +46,7 @@ #include "../krservices.h" #include "../Dialogs/krpleasewait.h" -static TQStringList arcProtocols = TQStringList::split(";", "tar;bzip;bzip2;gzip;krarc;zip;xz"); +static TQStringList arcProtocols = TQStringList::split(";", "tar;bzip;bzip2;gzip;krarc;lzip;zip;xz"); TDEWallet::Wallet * KRarcHandler::wallet = 0; @@ -57,6 +57,7 @@ TQStringList KRarcHandler::supportedPackers() { if ( KrServices::cmdExist( "tar" ) ) packers.append( "tar" ); if ( KrServices::cmdExist( "gzip" ) ) packers.append( "gzip" ); if ( KrServices::cmdExist( "bzip2" ) ) packers.append( "bzip2" ); + if ( KrServices::cmdExist( "lzip" ) ) packers.append( "lzip" ); if ( KrServices::cmdExist( "unzip" ) ) packers.append( "unzip" ); if ( KrServices::cmdExist( "zip" ) ) packers.append( "zip" ); if ( KrServices::cmdExist( "lha" ) ) packers.append( "lha" ); @@ -91,6 +92,8 @@ bool KRarcHandler::arcSupported( TQString type ) { return true; else if ( type == "-tgz" && lst.contains( "tar" ) ) return true; + else if ( type == "-tlz" && lst.contains( "tar" ) ) + return true; else if ( type == "-txz" && lst.contains( "tar" ) ) return true; else if ( type == "tarz" && lst.contains( "tar" ) ) @@ -99,6 +102,8 @@ bool KRarcHandler::arcSupported( TQString type ) { return true; else if ( type == "zip2" && lst.contains( "bzip2" ) ) return true; + else if ( type == "lzip" && lst.contains( "lzip" ) ) + return true; else if ( type == "-lha" && lst.contains( "lha" ) ) return true; else if ( type == "-ace" && lst.contains( "unace" ) ) @@ -130,9 +135,11 @@ bool KRarcHandler::arcHandled( TQString type ) { ( type == "tarz" && krConfig->readBoolEntry( "Do GZip" , _DoGZip ) ) || ( type == "-tar" && krConfig->readBoolEntry( "Do Tar" , _DoTar ) ) || ( type == "-tbz" && krConfig->readBoolEntry( "Do BZip2", _DoBZip2 ) ) || + ( type == "-tlz" && krConfig->readBoolEntry( "Do LZip" , _DoLZip ) ) || ( type == "-txz" && krConfig->readBoolEntry( "Do Xz" , _DoXz ) ) || ( type == "gzip" && krConfig->readBoolEntry( "Do GZip" , _DoGZip ) ) || ( type == "zip2" && krConfig->readBoolEntry( "Do BZip2", _DoBZip2 ) ) || + ( type == "lzip" && krConfig->readBoolEntry( "Do LZip" , _DoLZip ) ) || ( type == "-zip" && krConfig->readBoolEntry( "Do UnZip", _DoUnZip ) ) || ( type == "-lha" && krConfig->readBoolEntry( "Do Lha" , _DoUnZip ) ) || ( type == "-rar" && krConfig->readBoolEntry( "Do UnRar", _DoUnRar ) ) || @@ -155,8 +162,9 @@ long KRarcHandler::arcFileCount( TQString archive, TQString type, TQString passw // first check if supported if ( !arcSupported( type ) ) return 0; - // bzip, gzip and xz archives contain only one file - if ( type == "zip2" || type == "gzip" || type == "-xz") return 1L; + // bzip, gzip, lzip and xz archives contain only one file + if ( type == "zip2" || type == "gzip" || type == "lzip" || type == "-xz" ) + return 1L; // set the right lister to do the job TQString lister; @@ -166,6 +174,7 @@ long KRarcHandler::arcFileCount( TQString archive, TQString type, TQString passw else if ( type == "-tgz" ) lister = KrServices::fullPathName( "tar" ) + " -tvzf"; else if ( type == "tarz" ) lister = KrServices::fullPathName( "tar" ) + " -tvzf"; else if ( type == "-tbz" ) lister = KrServices::fullPathName( "tar" ) + " -tjvf"; + else if ( type == "-tlz" ) lister = KrServices::fullPathName( "tar" ) + " -tvf"; else if ( type == "-txz" ) lister = KrServices::fullPathName( "tar" ) + " -tJvf"; else if ( type == "-lha" ) lister = KrServices::fullPathName( "lha" ) + " l"; else if ( type == "-rar" ) lister = KrServices::fullPathName( KrServices::cmdExist( "rar" ) ? "rar" : "unrar" ) + " l -v"; @@ -250,9 +259,11 @@ bool KRarcHandler::unpack( TQString archive, TQString type, TQString password, T else if ( type == "-tgz" ) packer = KrServices::fullPathName( "tar" ) + " -xvzf"; else if ( type == "tarz" ) packer = KrServices::fullPathName( "tar" ) + " -xvzf"; else if ( type == "-tbz" ) packer = KrServices::fullPathName( "tar" ) + " -xjvf"; + else if ( type == "-tlz" ) packer = KrServices::fullPathName( "tar" ) + " -xvf"; else if ( type == "-txz" ) packer = KrServices::fullPathName( "tar" ) + " -xJvf"; else if ( type == "gzip" ) packer = KrServices::fullPathName( "gzip" ) + " -cd"; else if ( type == "zip2" ) packer = KrServices::fullPathName( "bzip2" ) + " -cdk"; + else if ( type == "lzip" ) packer = KrServices::fullPathName( "lzip" ) + " -cd"; else if ( type == "-lha" ) packer = KrServices::fullPathName( "lha" ) + " xf"; else if ( type == "-rar" ) packer = KrServices::fullPathName( KrServices::cmdExist( "rar" ) ? "rar" : "unrar" ) + " -y x"; else if ( type == "-ace" ) packer = KrServices::fullPathName( "unace" ) + " x"; @@ -309,7 +320,7 @@ bool KRarcHandler::unpack( TQString archive, TQString type, TQString password, T // unpack the files KrShellProcess proc; proc << packer << " " + KrServices::quote( archive ); - if( type == "zip2" || type=="gzip" ){ + if( type == "zip2" || type=="gzip" || type=="lzip" ){ TQString arcname = archive.mid(archive.findRev("/")+1); if( arcname.contains(".") ) arcname = arcname.left(arcname.findRev(".")); proc << ">" << KrServices::quote( dest+"/"+arcname ); @@ -365,9 +376,11 @@ bool KRarcHandler::test( TQString archive, TQString type, TQString password, lon else if ( type == "-tgz" ) packer = KrServices::fullPathName( "tar" ) + " -tvzf"; else if ( type == "tarz" ) packer = KrServices::fullPathName( "tar" ) + " -tvzf"; else if ( type == "-tbz" ) packer = KrServices::fullPathName( "tar" ) + " -tjvf"; + else if ( type == "-tlz" ) packer = KrServices::fullPathName( "tar" ) + " -tvf"; else if ( type == "-txz" ) packer = KrServices::fullPathName( "tar" ) + " -tJvf"; else if ( type == "gzip" ) packer = KrServices::fullPathName( "gzip" ) + " -tv"; else if ( type == "zip2" ) packer = KrServices::fullPathName( "bzip2" ) + " -tv"; + else if ( type == "lzip" ) packer = KrServices::fullPathName( "lzip" ) + " -tv"; else if ( type == "-rar" ) packer = KrServices::fullPathName( KrServices::cmdExist( "rar" ) ? "rar" : "unrar" ) + " t"; else if ( type == "-ace" ) packer = KrServices::fullPathName( "unace" ) + " t"; else if ( type == "-lha" ) packer = KrServices::fullPathName( "lha" ) + " t"; @@ -424,6 +437,7 @@ bool KRarcHandler::pack( TQStringList fileNames, TQString type, TQString dest, l else if ( type == "tar" ) { packer = KrServices::fullPathName( "tar" ) + " -cvf"; type = "-tar"; } else if ( type == "tar.gz" ) { packer = KrServices::fullPathName( "tar" ) + " -cvzf"; type = "-tgz"; } else if ( type == "tar.bz2" ) { packer = KrServices::fullPathName( "tar" ) + " -cvjf"; type = "-tbz"; } + else if ( type == "tar.lz" ) { packer = KrServices::fullPathName( "tar" ) + " -cv --lzip -f"; type = "-tlz"; } else if ( type == "tar.xz" ) { packer = KrServices::fullPathName( "tar" ) + " -cvJf"; type = "-txz"; } else if ( type == "rar" ) { packer = KrServices::fullPathName( "rar" ) + " -r a"; type = "-rar"; } else if ( type == "lha" ) { packer = KrServices::fullPathName( "lha" ) + " a"; type = "-lha"; } @@ -627,7 +641,8 @@ bool KRarcHandler::checkStatus( TQString type, int exitCode ) { return exitCode == 0 || exitCode == 1; else if( type == "-ace" || type == "zip2" || type == "-lha" || type == "-rpm" || type == "cpio" || type == "-tar" || type == "tarz" || type == "-tbz" || type == "-tgz" || type == "-arj" || - type == "-deb" || type == "-txz") + type == "lzip" || type == "-tlz" || + type == "-deb" || type == "-txz" ) return exitCode == 0; else if (type == "gzip" || type == "-xz") return exitCode == 0 || exitCode == 2; @@ -649,6 +664,7 @@ TQString KRarcHandler::detectArchive( bool &encrypted, TQString fileName, bool c {"ace", 7, "**ACE**" }, {"bzip2",0, "\x42\x5a\x68\x39\x31" }, {"gzip", 0, "\x1f\x8b"}, + {"lzip", 0, "\x4c\x5a\x49\x50\x01" }, {"deb", 0, "!\ndebian-binary " }, {"7z", 0, "7z\xbc\xaf\x27\x1c" }, {"xz", 0, "\xfd" "7zXZ\x00" } }; @@ -680,14 +696,16 @@ TQString KRarcHandler::detectArchive( bool &encrypted, TQString fileName, bool c if( j == detectionString.length() ) { TQString type = autoDetectParams[ i ].type; - if( type == "bzip2" || type == "gzip" ) { + if( type == "bzip2" || type == "gzip" || type == "lzip" ) { KTar tapeArchive( fileName ); if( tapeArchive.open( IO_ReadOnly ) ) { tapeArchive.close(); if( type == "bzip2" ) type = "tbz"; - else + else if( type == "gzip" ) type = "tgz"; + else + type = "tlz"; } } else if( type == "zip" ) diff --git a/krusader/defaults.h b/krusader/defaults.h index 309449b..2b2ddb1 100644 --- a/krusader/defaults.h +++ b/krusader/defaults.h @@ -173,6 +173,8 @@ #define _DoUnZip true // Do BZip2 /////////// #define _DoBZip2 true +// Do LZip //////////// +#define _DoLZip true // Do Rar ///////////// #define _DoRar true // Do UnRar ///////////