summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlexander Golubev <fatzer2@gmail.com>2016-08-26 19:11:14 (GMT)
committer Michele Calgaro <michele.calgaro@yahoo.it>2016-09-03 02:48:04 (GMT)
commite5a3116cffdf87b13912803006311262219aeb7b (patch)
treee6cf8f119ecc137c141755c3568590f7309224bb
parentd8d57cf6e803e70b62f3c630f6d54d9cc5350776 (diff)
downloadtdeutils-e5a3116c.zip
tdeutils-e5a3116c.tar.gz
Ark: [rar module] fix suppport for buggy rar versions
Rar versions from 5.0 till 5.3, not including the last one were added extra spaces to short directory/file names. This behaviour resulted in appearing of additional entries for directories and may be some other issues. Also slightly rework internal rar version parsing/storing and fix some comments.
-rw-r--r--ark/filelistview.cpp2
-rw-r--r--ark/rar.cpp28
-rw-r--r--ark/rar.h4
3 files changed, 26 insertions, 8 deletions
diff --git a/ark/filelistview.cpp b/ark/filelistview.cpp
index f1c941f..c1e6f3f 100644
--- a/ark/filelistview.cpp
+++ b/ark/filelistview.cpp
@@ -394,7 +394,7 @@ FileListView::item(const TQString& filename) const
// Iterate over the current tree level siblings
while (flvi)
{
- if (flvi->fileName() == *pathIt || flvi->fileName() == (*pathIt).stripWhiteSpace()) {
+ if (flvi->fileName() == *pathIt) {
++pathIt;
if (pathIt != pathEnd) {
flvi = (FileLVI*) flvi->firstChild();
diff --git a/ark/rar.cpp b/ark/rar.cpp
index 02600d5..6799b64 100644
--- a/ark/rar.cpp
+++ b/ark/rar.cpp
@@ -55,7 +55,11 @@
#include "arkutils.h"
#include "filelistview.h"
-#define VERSION_5 5
+// MMmmppbb ; M-major, m-minor, p-patch b-(100-beta)
+#define VERSION_MAJOR 1000000
+#define VERSION_MINOR 10000
+#define VERSION_PATCH 100
+#define VERSION_5 (5*VERSION_MAJOR - VERSION_PATCH + 1 ) // consider betas
RarArch::RarArch( ArkWidget *_gui, const TQString & _fileName )
: Arch( _gui, _fileName ), m_isFirstLine(false), m_version(0)
@@ -95,11 +99,19 @@ bool RarArch::processLine( const TQCString &line )
// Look for rar/unrar version first
if (!m_version)
{
- TQRegExp versionRegExp (TQString::fromLatin1 ("RAR\\s(\\d+)\\.(\\S+)\\s.*"));
+ TQRegExp versionRegExp (TQString::fromLatin1 ("RAR\\s(\\d+)\\.(\\d+)\\s(beta (\\d+))?\\s+Copyright.*"));
if (versionRegExp.exactMatch (uline))
{
- m_version = versionRegExp.capturedTexts()[1].toShort ();
+ // Rar displays verion in form of "M.mp (beta b)?"
+ m_version = versionRegExp.cap(1).toShort() * VERSION_MAJOR;
+ m_version += versionRegExp.cap(2).toShort()/10 * VERSION_MINOR;
+ m_version += versionRegExp.cap(2).toShort()%10 * VERSION_PATCH;
+
+ if (!versionRegExp.cap(4).isEmpty()) { // beta versions should go befor release ones
+ m_version -= VERSION_PATCH;
+ m_version += versionRegExp.cap(4).toShort();
+ }
if (m_version < VERSION_5) {
m_headerString = "-------------------------------------------------------------------------------";
@@ -150,6 +162,10 @@ bool RarArch::processLine( const TQCString &line )
if (parsedData.size() >= 8 && nameRegExp.exactMatch (uline)) {
m_entryFilename = nameRegExp.capturedTexts()[2];
+ if(m_version < 5*VERSION_MAJOR+3*VERSION_MINOR) { // workaround bug with extra spaces in rar<5.3.0
+ m_entryFilename = m_entryFilename.stripWhiteSpace();
+ }
+
entry << m_entryFilename; // filename
entry << parsedData[ 1 ]; // size
entry << parsedData[ 2 ]; // packed
@@ -163,13 +179,13 @@ bool RarArch::processLine( const TQCString &line )
return false;
}
}
-
+
// send to GUI
// Use addOrUpdateItem() rather than addItem() due to recent RAR version
// place directories in archive after their content.
FileLVI *item = m_gui->fileList()->addOrUpdateItem( entry );
-
- // But archives packaged with older versions of ark may have directories
+
+ // But archives packaged with older versions of rar may have directories
// entries first, so make sure they will get an appropriate icon
if (item && entry[5].find('d', 0, false) != -1) {
// check attr's for d (case insensitive to handle windows archives)
diff --git a/ark/rar.h b/ark/rar.h
index fadb3e9..1476214 100644
--- a/ark/rar.h
+++ b/ark/rar.h
@@ -24,6 +24,8 @@
#ifndef RAR_H
#define RAR_H
+#include <stdint.h>
+
#include "arch.h"
class TQString;
@@ -65,7 +67,7 @@ class RarArch : public Arch
* Therefore, the variables below are needed.
*/
bool m_isFirstLine;
- short m_version;
+ uint32_t m_version;
TQString m_entryFilename;
};