summaryrefslogtreecommitdiffstats
path: root/ark
diff options
context:
space:
mode:
Diffstat (limited to 'ark')
-rw-r--r--ark/zip.cpp76
-rw-r--r--ark/zip.h4
2 files changed, 63 insertions, 17 deletions
diff --git a/ark/zip.cpp b/ark/zip.cpp
index 598f5fd..b95c7d5 100644
--- a/ark/zip.cpp
+++ b/ark/zip.cpp
@@ -28,6 +28,7 @@
// TQt includes
#include <tqdir.h>
+#include <tqtextcodec.h>
// KDE includes
#include <kdebug.h>
@@ -41,6 +42,7 @@
#include "zip.h"
#include "arkwidget.h"
#include "settings.h"
+#include "filelistview.h"
ZipArch::ZipArch( ArkWidget *_gui, const TQString & _fileName )
@@ -52,24 +54,7 @@ ZipArch::ZipArch( ArkWidget *_gui, const TQString & _fileName )
verifyUncompressUtilityIsAvailable( m_unarchiver_program );
m_headerString = "----";
- m_fixYear = 7;
- m_fixMonth = 8;
- m_fixDay = 9;
- m_fixTime = 10;
- m_dateCol = 5;
m_numCols = 7;
-
- m_archCols.append( new ArchColumns( 1, TQRegExp( "[0-9]+" ) ) );
- m_archCols.append( new ArchColumns( 2, TQRegExp( "[^\\s]+" ) ) );
- m_archCols.append( new ArchColumns( 3, TQRegExp( "[0-9]+" ) ) );
- m_archCols.append( new ArchColumns( 4, TQRegExp( "[0-9.]+%" ) ) );
- m_archCols.append( new ArchColumns( 7, TQRegExp( "[0-9]{4}" ), 4 ) );
- m_archCols.append( new ArchColumns( 8, TQRegExp( "[01][0-9]" ), 2 ) );
- m_archCols.append( new ArchColumns( 9, TQRegExp( "[0-3][0-9]" ), 2 ) );
- m_archCols.append( new ArchColumns( 10, TQRegExp( "[0-9:]+" ), 6 ) );
- m_archCols.append( new ArchColumns( 6, TQRegExp( "[a-fA-F0-9]+ {2}" ) ) );
- m_archCols.append( new ArchColumns( 0, TQRegExp( "[^\\n]+" ), 4096 ) );
-
}
void ZipArch::setHeaders()
@@ -314,4 +299,61 @@ void ZipArch::test()
}
}
+bool ZipArch::processLine( const TQCString &line )
+{
+ TQTextCodec *codec = TQTextCodec::codecForLocale();
+ TQString tqunicode_line = codec->toUnicode( line );
+
+ // Header structure:
+ // Length Method Size Cmpr Date Time CRC-32 Name
+ // -------- ------ ------- ---- ---------- ----- -------- ----
+
+ TQRegExp lineRx { "^"
+ "\\s*" "(" "[0-9]+" ")" // 1 Length
+ "\\s+" "(" "\\S+" ")" // 2 Method
+ "\\s+" "(" "[0-9]+" ")" // 3 Size
+ "\\s+" "(" "[0-9.]+%" ")" // 4 Compression rate
+ "\\s+" "(" "[0-9\\-]+" ")" // 5 Date
+ "\\s+" "(" "[0-9:]+" ")" // 6 Time
+ "\\s+" "(" "[a-fA-F0-9]+" ")" // 7 CRC-32
+ " " "(" "[^\\n]+" ")" // 8 Name
+ "\\n?$"
+ };
+ if( lineRx.search(tqunicode_line) == -1 ) {
+ kdDebug(1601) << "processLine failed to match unzip line: " << line << endl;
+ return false;
+ }
+
+ // unzip-6 can be configured at build time to return date in either of three
+ // formats:
+ // - MM-DD-YYYY (the default on *nix systems)
+ // - DD-MM-YYYY (not used by default)
+ // - YYYY-MM-DD (used in several linux distribution e.g. debian)
+ // Unfortunately there is no easy way to query unzip which format it does
+ // use, so we will have to guestimate here. Also since the DMY is not widely
+ // used and in general case indistinguishable from MDY we will ignore it and
+ // concentrate on distinguishing between MDY and YMD. Luckily unzip-6 unlike
+ // unzip-5 uses 4 digits for years, so it will be relatively painless.
+ TQString date = lineRx.cap(5);
+ TQString time = lineRx.cap(6);
+ TQRegExp mdyDateRx{"^([01][0-9])-([0-3][0-9])-([0-9]{4,})$"};
+
+ if(mdyDateRx.search(date) != -1) {
+ date = mdyDateRx.cap(3) + "-" + mdyDateRx.cap(1) + "-" + mdyDateRx.cap(2);
+ }
+ TQString timestamp = date + " " + time;
+
+ TQStringList l;
+ l << lineRx.cap(8); // FILENAME_COLUMN
+ l << lineRx.cap(1); // SIZE_COLUMN
+ l << lineRx.cap(2); // METHOD_COLUMN
+ l << lineRx.cap(3); // PACKED_COLUMN
+ l << lineRx.cap(4); // RATIO_COLUMN
+ l << timestamp; // TIMESTAMP_COLUMN
+ l << lineRx.cap(7); // CRC_COLUMN
+ m_gui->fileList()->addItem(l);
+
+ return true;
+}
+
#include "zip.moc"
diff --git a/ark/zip.h b/ark/zip.h
index 760030c..bae27f7 100644
--- a/ark/zip.h
+++ b/ark/zip.h
@@ -54,6 +54,10 @@ class ZipArch : public Arch
virtual void unarchFileInternal();
virtual bool passwordRequired();
virtual void createPassword();
+
+ protected:
+ virtual bool processLine( const TQCString &line );
+
private:
void setHeaders();
};