diff options
author | kh1 <karsten.heimrich@nokia.com> | 2011-11-23 15:39:58 +0100 |
---|---|---|
committer | Tim Jenssen <tim.jenssen@nokia.com> | 2011-11-23 20:21:31 +0100 |
commit | e99d393cd5604f4572a7e8c3ef7eecab1cd9b6ba (patch) | |
tree | f215404f934f1d4d2a0f81579d0104433721168a /installerbuilder/libinstaller | |
parent | cdaf1d17337600e01017fa2a53fba6f5771dc20f (diff) |
Some more code cosmetics.
Change-Id: If2a8d8ada04a0a9c89e6e7b52ff66565a12e1ac1
Reviewed-by: Tim Jenssen <tim.jenssen@nokia.com>
Diffstat (limited to 'installerbuilder/libinstaller')
-rw-r--r-- | installerbuilder/libinstaller/3rdparty/p7zip_9.04/lib7z_facade.cpp | 744 |
1 files changed, 422 insertions, 322 deletions
diff --git a/installerbuilder/libinstaller/3rdparty/p7zip_9.04/lib7z_facade.cpp b/installerbuilder/libinstaller/3rdparty/p7zip_9.04/lib7z_facade.cpp index 88ee905dd..de84cabfa 100644 --- a/installerbuilder/libinstaller/3rdparty/p7zip_9.04/lib7z_facade.cpp +++ b/installerbuilder/libinstaller/3rdparty/p7zip_9.04/lib7z_facade.cpp @@ -37,15 +37,17 @@ #include <common/errors.h> #include <common/fileutils.h> -#include <QCoreApplication> -#include <QDebug> -#include <QDir> -#include <QFileInfo> -#include <QIODevice> -#include <QPointer> -#include <QString> -#include <QStringList> -#include <QTemporaryFile> +#include <QtCore/QCoreApplication> +#include <QtCore/QDebug> +#include <QtCore/QDir> +#include <QtCore/QFileInfo> +#include <QtCore/QIODevice> +#include <QtCore/QMutex> +#include <QtCore/QMutexLocker> +#include <QtCore/QPointer> +#include <QtCore/QString> +#include <QtCore/QStringList> +#include <QtCore/QTemporaryFile> #ifdef _MSC_VER #pragma warning(disable:4297) @@ -97,120 +99,135 @@ using namespace Lib7z; using namespace NWindows; namespace { +/** +* RAII class to create a directory (tryCreate()) and delete it on destruction unless released. +*/ +struct DirectoryGuard { + explicit DirectoryGuard(const QString &path) + : m_path(path), + m_created(false), + m_released(false) + { + const QRegExp re(QLatin1String("\\\\|/")); + const QLatin1String sep("/"); + m_path.replace(re, sep); + } + + ~DirectoryGuard() + { + if (!m_created || m_released) + return; + QDir dir(m_path); + if (!dir.rmdir(m_path)) + qWarning() << "Could not delete directory " << m_path; + } + /** - * RAII class to create a directory (tryCreate()) and delete it on destruction unless released. - */ - struct DirectoryGuard { - explicit DirectoryGuard(const QString &path) - : m_path(path), - m_created(false), - m_released(false) + * Tries to create the directorie structure. + * Returns a list of every directory created. + */ + QStringList tryCreate() { + if (m_path.isEmpty()) + return QStringList(); + + const QFileInfo fi(m_path); + if (fi.exists() && fi.isDir()) + return QStringList(); + if (fi.exists() && !fi.isDir()) + throw SevenZipException(QObject::tr("Path exists but is not a folder: %1").arg(m_path)); + + QStringList created; + + QDir toCreate(m_path); + while (!toCreate.exists()) { - const QRegExp re(QLatin1String("\\\\|/")); - const QLatin1String sep("/"); - m_path.replace(re, sep); - } - ~DirectoryGuard() { - if (!m_created || m_released) - return; - QDir dir(m_path); - if (!dir.rmdir(m_path)) - qWarning() << "Could not delete directory " << m_path; + QString p = toCreate.absolutePath(); + created.push_front(p); + p = p.section(QLatin1Char('/'), 0, -2); + toCreate = QDir(p); } - /** - * Tries to create the directorie structure. - * Returns a list of every directory created. - */ - QStringList tryCreate() { - if (m_path.isEmpty()) - return QStringList(); - - const QFileInfo fi(m_path); - if (fi.exists() && fi.isDir()) - return QStringList(); - if (fi.exists() && !fi.isDir()) - throw SevenZipException(QObject::tr("Path exists but is not a folder: %1").arg(m_path)); - - QStringList created; - - QDir toCreate(m_path); - while (!toCreate.exists()) - { - QString p = toCreate.absolutePath(); - created.push_front(p); - p = p.section(QLatin1Char('/'), 0, -2); - toCreate = QDir(p); - } - - QDir dir(m_path); - m_created = dir.mkpath(m_path); - if (!m_created) - throw SevenZipException(QObject::tr("Could not create folder: %1").arg(m_path)); + QDir dir(m_path); + m_created = dir.mkpath(m_path); + if (!m_created) + throw SevenZipException(QObject::tr("Could not create folder: %1").arg(m_path)); - return created; - } + return created; + } - void release() { - m_released = true; - } + void release() { + m_released = true; + } - QString m_path; - bool m_created; - bool m_released; - }; + QString m_path; + bool m_created; + bool m_released; +}; } -static void throwIfNotOK(HRESULT result, const QString &msg) { +static void throwIfNotOK(HRESULT result, const QString &msg) +{ if (result != S_OK) throw SevenZipException(msg); } -static UString QString2UString(const QString &str) { +static UString QString2UString(const QString &str) +{ return str.toStdWString().c_str(); } -static QString UString2QString(const UString& str) { +static QString UString2QString(const UString& str) +{ return QString::fromStdWString(static_cast<const wchar_t*>(str)); } -static QString generateTempFileName() { +static QString generateTempFileName() +{ QTemporaryFile tmp; if (!tmp.open()) - throw SevenZipException(QObject::tr("Could not create temporary file")); + throw SevenZipException(QObject::tr("Could not create temporary file")); return QDir::toNativeSeparators(tmp.fileName()); } /* -static QStringList UStringVector2QStringList(const UStringVector& vec) { - QStringList res; - for (int i = 0; i < vec.Size(); ++i) - res += UString2QString(vec[i]); - return res; +static QStringList UStringVector2QStringList(const UStringVector& vec) +{ +QStringList res; +for (int i = 0; i < vec.Size(); ++i) +res += UString2QString(vec[i]); +return res; } */ -static NCOM::CPropVariant readProperty(IInArchive* archive, int index, int propId) { +static NCOM::CPropVariant readProperty(IInArchive* archive, int index, int propId) +{ NCOM::CPropVariant prop; - throwIfNotOK(archive->GetProperty(index, propId, &prop), QObject::tr("Could not retrieve property %1 for item %2").arg(QString::number(propId), QString::number(index))); + throwIfNotOK(archive->GetProperty(index, propId, &prop), QObject::tr("Could not retrieve property %1 " + "for item %2").arg(QString::number(propId), QString::number(index))); return prop; } + static bool IsFileTimeZero(const FILETIME *lpFileTime) { - return (lpFileTime->dwLowDateTime == 0) && (lpFileTime->dwHighDateTime == 0); + return (lpFileTime->dwLowDateTime == 0) && (lpFileTime->dwHighDateTime == 0); } static bool IsDST(const QDateTime& datetime = QDateTime()) { - const time_t seconds = static_cast< time_t >(datetime.isValid() ? datetime.toTime_t() : QDateTime::currentDateTime().toTime_t()); + const time_t seconds = static_cast< time_t >(datetime.isValid() ? datetime.toTime_t() + : QDateTime::currentDateTime().toTime_t()); const tm* const t = localtime(&seconds); return t->tm_isdst; } -static QDateTime getDateTimeProperty(IInArchive* archive, int index, int propId, const QDateTime& defaultValue) { +static + QDateTime getDateTimeProperty(IInArchive* archive, int index, int propId, const QDateTime& defaultValue) +{ const NCOM::CPropVariant prop = readProperty(archive, index, propId); - if (prop.vt != VT_FILETIME) - throw SevenZipException(QObject::tr("Property %1 for item %2 not of type VT_FILETIME but %3").arg(QString::number(propId), QString::number(index), QString::number(prop.vt))); + if (prop.vt != VT_FILETIME) { + throw SevenZipException(QObject::tr("Property %1 for item %2 not of type VT_FILETIME but %3") + .arg(QString::number(propId), QString::number(index), QString::number(prop.vt))); + } if (IsFileTimeZero(&prop.filetime)) return defaultValue; @@ -234,14 +251,16 @@ static QDateTime getDateTimeProperty(IInArchive* archive, int index, int propId, return result; } -static quint64 getUInt64Property(IInArchive* archive, int index, int propId, quint64 defaultValue=0) { +static quint64 getUInt64Property(IInArchive* archive, int index, int propId, quint64 defaultValue=0) +{ const NCOM::CPropVariant prop = readProperty(archive, index, propId); if (prop.vt == VT_EMPTY) return defaultValue; return static_cast<quint64>(ConvertPropVariantToUInt64(prop)); } -static quint32 getUInt32Property(IInArchive* archive, int index, int propId, quint32 defaultValue=0) { +static quint32 getUInt32Property(IInArchive* archive, int index, int propId, quint32 defaultValue=0) +{ const NCOM::CPropVariant prop = readProperty(archive, index, propId); if (prop.vt == VT_EMPTY) return defaultValue; @@ -252,8 +271,7 @@ static QFile::Permissions getPermissions(IInArchive* archive, int index, bool* h { quint32 attributes = getUInt32Property(archive, index, kpidAttrib, 0); QFile::Permissions permissions = 0; - if (attributes & FILE_ATTRIBUTE_UNIX_EXTENSION) - { + if (attributes & FILE_ATTRIBUTE_UNIX_EXTENSION) { if (hasPermissions != 0) *hasPermissions = true; // filter the unix permissions @@ -261,133 +279,144 @@ static QFile::Permissions getPermissions(IInArchive* archive, int index, bool* h permissions |= static_cast< QFile::Permissions >((attributes & 0700) << 2); // owner rights permissions |= static_cast< QFile::Permissions >((attributes & 0070) << 1); // group permissions |= static_cast< QFile::Permissions >((attributes & 0007) << 0); // and world rights - } - else if (hasPermissions != 0) + } else if (hasPermissions != 0) { *hasPermissions = false; + } return permissions; } namespace Lib7z { - - class QIODeviceSequentialOutStream : public ISequentialOutStream, public CMyUnknownImp { - public: - MY_UNKNOWN_IMP +class QIODeviceSequentialOutStream : public ISequentialOutStream, public CMyUnknownImp +{ +public: + MY_UNKNOWN_IMP explicit QIODeviceSequentialOutStream(QIODevice* device); - ~QIODeviceSequentialOutStream(); + ~QIODeviceSequentialOutStream(); - /* reimp */ STDMETHOD(Write)(const void* data, UInt32 size, UInt32* processedSize); + /* reimp */ STDMETHOD(Write)(const void* data, UInt32 size, UInt32* processedSize); - private: - QPointer<QIODevice> m_device; - const bool closeOnDestroy; - }; +private: + QPointer<QIODevice> m_device; + const bool closeOnDestroy; +}; +QIODeviceSequentialOutStream::QIODeviceSequentialOutStream(QIODevice* device) + : ISequentialOutStream(), + CMyUnknownImp(), + m_device(device), + closeOnDestroy(!device->isOpen()) +{ + assert(m_device); + if (closeOnDestroy) + m_device->open(QIODevice::WriteOnly); +} - QIODeviceSequentialOutStream::QIODeviceSequentialOutStream(QIODevice* device) - : ISequentialOutStream(), - CMyUnknownImp(), - m_device(device), - closeOnDestroy(!device->isOpen()) +QIODeviceSequentialOutStream::~QIODeviceSequentialOutStream() +{ + if (closeOnDestroy) { - assert(m_device); - if (closeOnDestroy) - m_device->open(QIODevice::WriteOnly); + m_device->close(); + delete m_device; } +} - QIODeviceSequentialOutStream::~QIODeviceSequentialOutStream() - { - if (closeOnDestroy) - { - m_device->close(); - delete m_device; - } +HRESULT QIODeviceSequentialOutStream::Write(const void* data, UInt32 size, UInt32* processedSize) +{ + if (!m_device) { + if (processedSize) + *processedSize = 0; + return E_FAIL; } - - HRESULT QIODeviceSequentialOutStream::Write(const void* data, UInt32 size, UInt32* processedSize) { - if (!m_device) { + if (closeOnDestroy && !m_device->isOpen()) { + const bool opened = m_device->open(QIODevice::WriteOnly); + if (!opened) { if (processedSize) *processedSize = 0; - return E_FAIL; - } - if (closeOnDestroy && !m_device->isOpen()) { - const bool opened = m_device->open(QIODevice::WriteOnly); - if (!opened) { - if (processedSize) - *processedSize = 0; - return E_FAIL; - } + return E_FAIL; } - - const qint64 written = m_device->write(reinterpret_cast<const char*>(data), size); - if (processedSize) - *processedSize = written; - return written >= 0 ? S_OK : E_FAIL; } - class QIODeviceInStream : public IInStream, public CMyUnknownImp { - public: - MY_UNKNOWN_IMP + const qint64 written = m_device->write(reinterpret_cast<const char*>(data), size); + if (processedSize) + *processedSize = written; + return written >= 0 ? S_OK : E_FAIL; +} - explicit QIODeviceInStream(QIODevice* device) : IInStream(), CMyUnknownImp(), m_device(device) { - assert(m_device); - assert(!m_device->isSequential()); - } +class QIODeviceInStream : public IInStream, public CMyUnknownImp +{ +public: + MY_UNKNOWN_IMP - /* reimp */ STDMETHOD(Read)(void* data, UInt32 size, UInt32* processedSize) { - assert(m_device); - assert(m_device->isReadable()); - const qint64 actual = m_device->read(reinterpret_cast<char*>(data), size); - Q_ASSERT(actual != 0 || m_device->atEnd()); - if (processedSize) - *processedSize = actual; - return actual >= 0 ? S_OK : E_FAIL; - } + explicit QIODeviceInStream(QIODevice* device) : IInStream(), CMyUnknownImp(), m_device(device) + { + assert(m_device); + assert(!m_device->isSequential()); + } - /* reimp */ STDMETHOD(Seek)(Int64 offset, UInt32 seekOrigin, UInt64* newPosition) { - assert(m_device); - assert(!m_device->isSequential()); - assert(m_device->isReadable()); - if (seekOrigin > STREAM_SEEK_END) - return STG_E_INVALIDFUNCTION; - UInt64 np = 0; - switch(seekOrigin) { - case STREAM_SEEK_SET: - np = offset; - break; - case STREAM_SEEK_CUR: - np = m_device->pos() + offset; - break; - case STREAM_SEEK_END: - np = m_device->size() + offset; - break; - default: - return STG_E_INVALIDFUNCTION; - } + /* reimp */ STDMETHOD(Read)(void* data, UInt32 size, UInt32* processedSize) + { + assert(m_device); + assert(m_device->isReadable()); + const qint64 actual = m_device->read(reinterpret_cast<char*>(data), size); + Q_ASSERT(actual != 0 || m_device->atEnd()); + if (processedSize) + *processedSize = actual; + return actual >= 0 ? S_OK : E_FAIL; + } - np = qBound(static_cast<UInt64>(0), np, static_cast<UInt64>(m_device->size() - 1)); - const bool ok = m_device->seek(np); - if (newPosition) - *newPosition = np; - return ok ? S_OK : E_FAIL; + /* reimp */ STDMETHOD(Seek)(Int64 offset, UInt32 seekOrigin, UInt64* newPosition) + { + assert(m_device); + assert(!m_device->isSequential()); + assert(m_device->isReadable()); + if (seekOrigin > STREAM_SEEK_END) + return STG_E_INVALIDFUNCTION; + UInt64 np = 0; + switch(seekOrigin) { + case STREAM_SEEK_SET: + np = offset; + break; + case STREAM_SEEK_CUR: + np = m_device->pos() + offset; + break; + case STREAM_SEEK_END: + np = m_device->size() + offset; + break; + default: + return STG_E_INVALIDFUNCTION; } - private: - QPointer<QIODevice> m_device; - }; + np = qBound(static_cast<UInt64>(0), np, static_cast<UInt64>(m_device->size() - 1)); + const bool ok = m_device->seek(np); + if (newPosition) + *newPosition = np; + return ok ? S_OK : E_FAIL; + } + +private: + QPointer<QIODevice> m_device; +}; } -File::File() : permissions(0), uncompressedSize(0), compressedSize(0), isDirectory(false) { +File::File() + : permissions(0) + , uncompressedSize(0) + , compressedSize(0) + , isDirectory(false) +{ } -QVector<File> File::subtreeInPreorder() const { +QVector<File> File::subtreeInPreorder() const +{ QVector<File> res; res += *this; - Q_FOREACH(const File& child, children) + Q_FOREACH (const File& child, children) res += child.subtreeInPreorder(); return res; } -bool File::operator<(const File& other) const { +bool File::operator<(const File& other) const +{ if (path != other.path) return path < other.path; if (mtime != other.mtime) @@ -403,17 +432,21 @@ bool File::operator<(const File& other) const { return false; } -bool File::operator==(const File& other) const { +bool File::operator==(const File& other) const +{ return mtime == other.mtime - && path == other.path - && uncompressedSize == other.uncompressedSize - && compressedSize == other.compressedSize - && isDirectory == other.isDirectory - && children == other.children - && (permissions == other.permissions || permissions == static_cast< QFile::Permissions >(-1) || other.permissions == static_cast< QFile::Permissions >(-1)); + && path == other.path + && uncompressedSize == other.uncompressedSize + && compressedSize == other.compressedSize + && isDirectory == other.isDirectory + && children == other.children + && (permissions == other.permissions + || permissions == static_cast< QFile::Permissions >(-1) + || other.permissions == static_cast< QFile::Permissions >(-1)); } -QByteArray Lib7z::formatKeyValuePairs(const QVariantList& l) { +QByteArray Lib7z::formatKeyValuePairs(const QVariantList& l) +{ assert(l.size() % 2 == 0); QByteArray res; for (QVariantList::ConstIterator it = l.constBegin(); it != l.constEnd(); ++it) { @@ -426,78 +459,104 @@ QByteArray Lib7z::formatKeyValuePairs(const QVariantList& l) { return res; } -class Job::Private { +class Job::Private +{ public: - Private() : error(Lib7z::NoError) {} + Private() + : error(Lib7z::NoError) + {} + int error; QString errorString; }; -Job::Job(QObject* parent) : QObject(parent), QRunnable(), d(new Private) { +Job::Job(QObject* parent) + : QObject(parent) + , QRunnable() + , d(new Private) +{ } -Job::~Job() { +Job::~Job() +{ delete d; } -void Job::emitResult() { +void Job::emitResult() +{ emit finished(this); } -void Job::setError(int code) { +void Job::setError(int code) +{ d->error = code; } -void Job::setErrorString(const QString &str) { +void Job::setErrorString(const QString &str) +{ d->errorString = str; } -void Job::emitProgress(qint64 completed, qint64 total) { +void Job::emitProgress(qint64 completed, qint64 total) +{ emit progress(completed, total); } -int Job::error() const { +int Job::error() const +{ return d->error; } -bool Job::hasError() const { +bool Job::hasError() const +{ return d->error != NoError; } -void Job::run() { +void Job::run() +{ doStart(); } -QString Job::errorString() const { +QString Job::errorString() const +{ return d->errorString; } -void Job::start() { +void Job::start() +{ QMetaObject::invokeMethod(this, "doStart", Qt::QueuedConnection); } -class ListArchiveJob::Private { +class ListArchiveJob::Private +{ public: QPointer<QIODevice> archive; QVector<File> files; }; -ListArchiveJob::ListArchiveJob(QObject* parent) : Job(parent), d(new Private) { +ListArchiveJob::ListArchiveJob(QObject* parent) + : Job(parent) + , d(new Private) +{ } -ListArchiveJob::~ListArchiveJob() { +ListArchiveJob::~ListArchiveJob() +{ delete d; } -QIODevice* ListArchiveJob::archive() const { +QIODevice* ListArchiveJob::archive() const +{ return d->archive; } -void ListArchiveJob::setArchive(QIODevice* device) { +void ListArchiveJob::setArchive(QIODevice* device) +{ d->archive = device; } -QVector<File> ListArchiveJob::index() const { +QVector<File> ListArchiveJob::index() const +{ return d->files; } @@ -506,14 +565,15 @@ class OpenArchiveInfo private: OpenArchiveInfo(QIODevice* device) : codecs(new CCodecs), - stream(new QIODeviceInStream(device)) + stream(new QIODeviceInStream(device)) { throwIfNotOK(codecs->Load(), QObject::tr("Could not load codecs")); if (!codecs->FindFormatForArchiveType(L"", formatIndices)) throw SevenZipException(QObject::tr("Could not retrieve default format")); - throwIfNotOK(archiveLink.Open2(codecs.get(), formatIndices, false, stream, UString(), 0), QObject::tr("Could not open archive")); + throwIfNotOK(archiveLink.Open2(codecs.get(), formatIndices, false, stream, UString(), 0), + QObject::tr("Could not open archive")); if (archiveLink.Arcs.Size() == 0) throw SevenZipException(QObject::tr("No CArc found")); @@ -555,7 +615,8 @@ void OpenArchiveInfoCleaner::deviceDestroyed(QObject* dev) delete OpenArchiveInfo::instances.take(device); } -QVector<File> Lib7z::listArchive(QIODevice* archive) { +QVector<File> Lib7z::listArchive(QIODevice* archive) +{ assert(archive); try { const OpenArchiveInfo* const openArchive = OpenArchiveInfo::instance(archive); @@ -567,12 +628,14 @@ QVector<File> Lib7z::listArchive(QIODevice* archive) { IInArchive* const arch = arc.Archive; UInt32 numItems = 0; - throwIfNotOK(arch->GetNumberOfItems(&numItems), QObject::tr("Could not retrieve number of items in archive")); + throwIfNotOK(arch->GetNumberOfItems(&numItems), QObject::tr("Could not retrieve number of items " + "in archive")); flat.reserve(flat.size() + numItems); for (uint item = 0; item < numItems; ++item) { UString s; - throwIfNotOK(arc.GetItemPath(item, s), QObject::tr("Could not retrieve path of archive item %1").arg(item)); + throwIfNotOK(arc.GetItemPath(item, s), QObject::tr("Could not retrieve path of archive item " + "%1").arg(item)); File f; f.archiveIndex.setX(i); f.archiveIndex.setY(item); @@ -589,17 +652,17 @@ QVector<File> Lib7z::listArchive(QIODevice* archive) { return flat; } catch (const SevenZipException& e) { throw e; - } - catch(const char *err) { + } catch (const char *err) { throw SevenZipException(err); - } - catch (...) { - throw SevenZipException(QObject::tr("Unknown exception caught (%1)").arg(QString::fromLatin1(Q_FUNC_INFO))); + } catch (...) { + throw SevenZipException(QObject::tr("Unknown exception caught (%1)") + .arg(QString::fromLatin1(Q_FUNC_INFO))); } return QVector<File>(); // never reached } -void ListArchiveJob::doStart() { +void ListArchiveJob::doStart() +{ try { if (!d->archive) throw SevenZipException(tr("Could not list archive: QIODevice already destroyed")); @@ -614,16 +677,17 @@ void ListArchiveJob::doStart() { emitResult(); } -class Lib7z::ExtractCallbackImpl : public IArchiveExtractCallback, public CMyUnknownImp { +class Lib7z::ExtractCallbackImpl : public IArchiveExtractCallback, public CMyUnknownImp +{ public: MY_UNKNOWN_IMP - explicit ExtractCallbackImpl(ExtractCallback* qq) + explicit ExtractCallbackImpl(ExtractCallback* qq) : q(qq), - currentIndex(0), - arc(0), - total(0), - completed(0), - device(0) + currentIndex(0), + arc(0), + total(0), + completed(0), + device(0) { } @@ -642,21 +706,19 @@ public: /* reimp */ STDMETHOD(GetStream)(UInt32 index, ISequentialOutStream** outStream, Int32 askExtractMode) { Q_UNUSED(askExtractMode) - *outStream = 0; - if (device != 0) - { + *outStream = 0; + if (device != 0) { CMyComPtr<ISequentialOutStream> stream = new QIODeviceSequentialOutStream(device); *outStream = stream.Detach(); return S_OK; - } - else if (!targetDir.isEmpty()) - { + } else if (!targetDir.isEmpty()) { assert(arc); currentIndex = index; UString s; - throwIfNotOK(arc->GetItemPath(index, s), QObject::tr("Could not retrieve path of archive item %1").arg(index)); + throwIfNotOK(arc->GetItemPath(index, s), QObject::tr("Could not retrieve path of archive item " + "%1").arg(index)); const QString path = UString2QString(s).replace(QLatin1Char('\\'), QLatin1Char('/')); const QFileInfo fi(QString::fromLatin1("%1/%2").arg(targetDir, path)); @@ -666,9 +728,7 @@ public: bool isDir = false; IsArchiveItemFolder(arc->Archive, index, isDir); if (isDir) - { QDir(fi.absolutePath()).mkdir(fi.fileName()); - } // this makes sure that all directories created get removed as well for (QStringList::const_iterator it = directories.begin(); it != directories.end(); ++it) @@ -679,9 +739,9 @@ public: q->setCurrentFile(fi.absoluteFilePath()); - if (!isDir) - { - CMyComPtr< ISequentialOutStream > stream = new QIODeviceSequentialOutStream(new QFile(fi.absoluteFilePath())); + if (!isDir) { + CMyComPtr< ISequentialOutStream > stream = new QIODeviceSequentialOutStream(new QFile(fi + .absoluteFilePath())); *outStream = stream; stream.Detach(); } @@ -692,22 +752,23 @@ public: return E_FAIL; } - /* reimp */ STDMETHOD(PrepareOperation)(Int32 askExtractMode) { + /* reimp */ STDMETHOD(PrepareOperation)(Int32 askExtractMode) + { Q_UNUSED(askExtractMode) return S_OK; } - /* reimp */ STDMETHOD(SetOperationResult)(Int32 resultEOperationResult) { + /* reimp */ STDMETHOD(SetOperationResult)(Int32 resultEOperationResult) + { Q_UNUSED(resultEOperationResult) - if (!targetDir.isEmpty() ) - { + if (!targetDir.isEmpty()) { bool hasPerm; const QFile::Permissions permissions = getPermissions(arc->Archive, currentIndex, &hasPerm); - if (hasPerm) - { + if (hasPerm) { UString s; - throwIfNotOK(arc->GetItemPath(currentIndex, s), QObject::tr("Could not retrieve path of archive item %1").arg(currentIndex)); + throwIfNotOK(arc->GetItemPath(currentIndex, s), QObject::tr("Could not retrieve path of " + "archive item %1").arg(currentIndex)); const QString path = UString2QString(s).replace(QLatin1Char('\\'), QLatin1Char('/')); const QFileInfo fi(QString::fromLatin1("%1/%2").arg(targetDir, path)); QFile::setPermissions(fi.absoluteFilePath(), permissions); @@ -716,37 +777,41 @@ public: const quint32 attributes = getUInt32Property(arc->Archive, currentIndex, kpidAttrib, 0); struct stat stat_info; stat_info.st_mode = attributes >> 16; - if (S_ISLNK(stat_info.st_mode)) - { + if (S_ISLNK(stat_info.st_mode)) { QFile f(fi.absoluteFilePath()); f.open(QIODevice::ReadOnly); const QByteArray path = f.readAll(); f.close(); f.remove(); #ifdef Q_OS_WIN - if (!CreateHardLinkWrapper( fi.absoluteFilePath(), QLatin1String(path))) - throw SevenZipException(QObject::tr("Could not create file system lik at %1").arg(fi.absoluteFilePath())); + if (!CreateHardLinkWrapper(fi.absoluteFilePath(), QLatin1String(path))) { + throw SevenZipException(QObject::tr("Could not create file system lik at %1") + .arg(fi.absoluteFilePath())); + } #else - if (!QFile::link(QString::fromLatin1(path), fi.absoluteFilePath())) - throw SevenZipException(QObject::tr("Could not create softlink at %1").arg(fi.absoluteFilePath())); + if (!QFile::link(QString::fromLatin1(path), fi.absoluteFilePath())) { + throw SevenZipException(QObject::tr("Could not create softlink at %1") + .arg(fi.absoluteFilePath())); + } #endif } } - } + } return S_OK; } - /* reimp */ STDMETHOD(SetTotal)(UInt64 t) { + /* reimp */ STDMETHOD(SetTotal)(UInt64 t) + { total = t; return S_OK; } - /* reimp */ STDMETHOD(SetCompleted)(const UInt64* c) { + /* reimp */ STDMETHOD(SetCompleted)(const UInt64* c) + { completed = *c; - if (total > 0) { + if (total > 0) return q->setCompleted(completed, total); - } return S_OK; } @@ -766,27 +831,34 @@ private: }; -class Lib7z::ExtractCallbackPrivate { +class Lib7z::ExtractCallbackPrivate +{ public: - explicit ExtractCallbackPrivate(ExtractCallback* qq) { + explicit ExtractCallbackPrivate(ExtractCallback* qq) + { impl = new ExtractCallbackImpl(qq); } CMyComPtr<ExtractCallbackImpl> impl; }; -ExtractCallback::ExtractCallback() : d(new ExtractCallbackPrivate(this)) { +ExtractCallback::ExtractCallback() + : d(new ExtractCallbackPrivate(this)) +{ } -ExtractCallback::~ExtractCallback() { +ExtractCallback::~ExtractCallback() +{ delete d; } -ExtractCallbackImpl* ExtractCallback::impl() { +ExtractCallbackImpl* ExtractCallback::impl() +{ return d->impl; } -const ExtractCallbackImpl* ExtractCallback::impl() const { +const ExtractCallbackImpl* ExtractCallback::impl() const +{ return d->impl; } @@ -814,23 +886,29 @@ bool ExtractCallback::prepareForFile(const QString&) return true; } -class Lib7z::ExtractCallbackJobImpl : public ExtractCallback { - public: - explicit ExtractCallbackJobImpl(ExtractItemJob* j) : ExtractCallback(), job(j) {} - private: - /* reimp */ HRESULT setCompleted(quint64 c, quint64 t) { - emit job->progress(c, t); - return S_OK; - } +class Lib7z::ExtractCallbackJobImpl : public ExtractCallback +{ +public: + explicit ExtractCallbackJobImpl(ExtractItemJob* j) + : ExtractCallback() + , job(j) + {} + +private: + /* reimp */ HRESULT setCompleted(quint64 c, quint64 t) + { + emit job->progress(c, t); + return S_OK; + } - ExtractItemJob* const job; + ExtractItemJob* const job; }; class Lib7z::UpdateCallbackImpl : public IUpdateCallbackUI2, public CMyUnknownImp { public: MY_UNKNOWN_IMP - explicit UpdateCallbackImpl(UpdateCallback* qq) + explicit UpdateCallbackImpl(UpdateCallback* qq) : q(qq) { } @@ -838,15 +916,15 @@ public: { } /** - * \reimp - */ + * \reimp + */ HRESULT SetTotal(UInt64) { return S_OK; } /** - * \reimp - */ + * \reimp + */ HRESULT SetCompleted(const UInt64*) { return S_OK; @@ -915,8 +993,8 @@ public: } /** - * \reimp - */ + * \reimp + */ HRESULT SetOperationResult(Int32) { // TODO! @@ -970,7 +1048,6 @@ UpdateCallbackImpl* UpdateCallback::impl() return d->impl(); } - void UpdateCallback::setSource(const QStringList &dir) { d->impl()->setSource(dir); @@ -981,18 +1058,16 @@ void UpdateCallback::setTarget(QIODevice* target) d->impl()->setTarget(target); } -class ExtractItemJob::Private { +class ExtractItemJob::Private +{ public: Private(ExtractItemJob* qq) : q(qq), - target(0), - callback(new ExtractCallbackJobImpl(q)) + target(0), + callback(new ExtractCallbackJobImpl(q)) { } - ~Private() { - } - ExtractItemJob* q; File item; QPointer<QIODevice> archive; @@ -1001,34 +1076,44 @@ public: ExtractCallback* callback; }; -ExtractItemJob::ExtractItemJob(QObject* parent) : Job(parent), d(new Private(this)) { +ExtractItemJob::ExtractItemJob(QObject* parent) + : Job(parent) + , d(new Private(this)) +{ } -ExtractItemJob::~ExtractItemJob() { +ExtractItemJob::~ExtractItemJob() +{ delete d; } -File ExtractItemJob::item() const { +File ExtractItemJob::item() const +{ return d->item; } -void ExtractItemJob::setItem(const File& item) { +void ExtractItemJob::setItem(const File& item) +{ d->item = item; } -QIODevice* ExtractItemJob::archive() const { +QIODevice* ExtractItemJob::archive() const +{ return d->archive; } -void ExtractItemJob::setArchive(QIODevice* archive) { +void ExtractItemJob::setArchive(QIODevice* archive) +{ d->archive = archive; } -QString ExtractItemJob::targetDirectory() const { +QString ExtractItemJob::targetDirectory() const +{ return d->targetDirectory; } -void ExtractItemJob::setTargetDirectory(const QString &dir) { +void ExtractItemJob::setTargetDirectory(const QString &dir) +{ d->targetDirectory = dir; d->target = 0; } @@ -1092,25 +1177,23 @@ void Lib7z::createArchive(QIODevice* archive, const QStringList &sourceDirectori QInstaller::blockingCopy(&file, archive, file.size()); } QFile file(tempFile); - if (!file.remove()) - qWarning("%s: Could not remove temporary file %s: %s", Q_FUNC_INFO, qPrintable(tempFile), qPrintable(file.errorString())); - } - catch(const char *err) - { + if (!file.remove()) { + qWarning("%s: Could not remove temporary file %s: %s", Q_FUNC_INFO, qPrintable(tempFile), + qPrintable(file.errorString())); + } + } catch (const char *err) { std::cout << err << std::endl; throw SevenZipException(err); - } - catch (const QInstaller::Error &err) - { - throw SevenZipException(err.message()); - } - catch(...) - { - throw SevenZipException(QObject::tr("Unknown exception caught (%1)").arg(QString::fromLatin1(Q_FUNC_INFO))); + } catch (const QInstaller::Error &err) { + throw SevenZipException(err.message()); + } catch (...) { + throw SevenZipException(QObject::tr("Unknown exception caught (%1)") + .arg(QString::fromLatin1(Q_FUNC_INFO))); } } -void Lib7z::extractArchive(QIODevice* archive, const File& item, QIODevice* target, ExtractCallback* callback) { +void Lib7z::extractArchive(QIODevice* archive, const File& item, QIODevice* target, ExtractCallback* callback) +{ assert(archive); assert(target); @@ -1122,33 +1205,42 @@ void Lib7z::extractArchive(QIODevice* archive, const File& item, QIODevice* targ const OpenArchiveInfo* const openArchive = OpenArchiveInfo::instance(archive); const int arcIdx = item.archiveIndex.x(); - if (arcIdx < 0 || arcIdx >= openArchive->archiveLink.Arcs.Size()) - throw SevenZipException(QObject::tr("CArc index %1 out of bounds [0, %2]").arg(openArchive->archiveLink.Arcs.Size() - 1)); + if (arcIdx < 0 || arcIdx >= openArchive->archiveLink.Arcs.Size()) { + throw SevenZipException(QObject::tr("CArc index %1 out of bounds [0, %2]") + .arg(openArchive->archiveLink.Arcs.Size() - 1)); + } const CArc& arc = openArchive->archiveLink.Arcs[arcIdx]; IInArchive* const parchive = arc.Archive; const UInt32 itemIdx = item.archiveIndex.y(); UInt32 numItems = 0; - throwIfNotOK(parchive->GetNumberOfItems(&numItems), QObject::tr("Could not retrieve number of items in archive")); - if (itemIdx >= numItems) - throw SevenZipException(QObject::tr("Item index %1 out of bounds [0, %2]").arg(itemIdx).arg(numItems - 1)); + throwIfNotOK(parchive->GetNumberOfItems(&numItems), QObject::tr("Could not retrieve number of items " + "in archive")); + if (itemIdx >= numItems) { + throw SevenZipException(QObject::tr("Item index %1 out of bounds [0, %2]").arg(itemIdx) + .arg(numItems - 1)); + } UString s; - throwIfNotOK(arc.GetItemPath(itemIdx, s), QObject::tr("Could not retrieve path of archive item %1").arg(itemIdx)); + throwIfNotOK(arc.GetItemPath(itemIdx, s), QObject::tr("Could not retrieve path of archive item %1") + .arg(itemIdx)); assert(item.path == UString2QString(s).replace(QLatin1Char('\\'), QLatin1Char('/'))); callback->setTarget(target); const LONG extractResult = parchive->Extract(&itemIdx, 1, /*testmode=*/1, callback->impl()); //TODO: how to interpret result? throwIfNotOK(extractResult, QObject::tr("Extracting %1 failed.").arg(item.path)); - } catch(const char *err) { + } catch (const char *err) { throw SevenZipException(err); } catch (...) { - throw SevenZipException(QObject::tr("Unknown exception caught (%1)").arg(QString::fromLatin1(Q_FUNC_INFO))); + throw SevenZipException(QObject::tr("Unknown exception caught (%1)") + .arg(QString::fromLatin1(Q_FUNC_INFO))); } } -void Lib7z::extractArchive(QIODevice* archive, const File& item, const QString &targetDirectory, ExtractCallback* callback) { +void Lib7z::extractArchive(QIODevice* archive, const File& item, const QString &targetDirectory, + ExtractCallback* callback) +{ assert(archive); std::auto_ptr<ExtractCallback> dummyCallback(callback ? 0 : new ExtractCallback); @@ -1159,8 +1251,10 @@ void Lib7z::extractArchive(QIODevice* archive, const File& item, const QString & DirectoryGuard outDir(fi.absolutePath()); outDir.tryCreate(); QFile out(fi.absoluteFilePath()); - if (!out.open(QIODevice::WriteOnly)) //TODO use tmp file - throw SevenZipException(QObject::tr("Could not create output file for writing: %1").arg(fi.absoluteFilePath())); + if (!out.open(QIODevice::WriteOnly)) { //TODO use tmp file + throw SevenZipException(QObject::tr("Could not create output file for writing: %1") + .arg(fi.absoluteFilePath())); + } if (item.permissions) out.setPermissions(item.permissions); callback->setTarget(&out); @@ -1190,7 +1284,8 @@ void Lib7z::extractArchive(QIODevice* archive, const QString &targetDirectory, E IInArchive* const arch = arc.Archive; callback->impl()->setArchive(&arc); const LONG extractResult = arch->Extract(0, static_cast< UInt32 >(-1), false, callback->impl()); - throwIfNotOK(extractResult, QObject::tr("Extraction failed.")); //TODO is it possible to get a more detailed error? + //TODO is it possible to get a more detailed error? + throwIfNotOK(extractResult, QObject::tr("Extraction failed.")); } outDir.release(); @@ -1205,7 +1300,8 @@ bool Lib7z::isSupportedArchive(const QString &archive) return isSupportedArchive(&file); } -bool Lib7z::isSupportedArchive(QIODevice* archive) { +bool Lib7z::isSupportedArchive(QIODevice* archive) +{ assert(archive); assert(!archive->isSequential()); const qint64 initialPos = archive->pos(); @@ -1219,26 +1315,30 @@ bool Lib7z::isSupportedArchive(QIODevice* archive) { throw SevenZipException(QObject::tr("Could not retrieve default format")); CArchiveLink archiveLink; - const CMyComPtr<IInStream> stream = new QIODeviceInStream(archive); //CMyComPtr is needed, otherwise it crashes in OpenStream() + //CMyComPtr is needed, otherwise it crashes in OpenStream() + const CMyComPtr<IInStream> stream = new QIODeviceInStream(archive); - const HRESULT result = archiveLink.Open2(codecs.get(), formatIndices, /*stdInMode*/false, stream, UString(), 0); + const HRESULT result = archiveLink.Open2(codecs.get(), formatIndices, /*stdInMode*/false, stream, + UString(), 0); archive->seek(initialPos); return result == S_OK; } catch (const SevenZipException& e) { archive->seek(initialPos); throw e; - } catch(const char *err) { + } catch (const char *err) { archive->seek(initialPos); throw SevenZipException(err); - } catch(...) { + } catch (...) { archive->seek(initialPos); - throw SevenZipException(QObject::tr("Unknown exception caught (%1)").arg(QString::fromLatin1(Q_FUNC_INFO))); + throw SevenZipException(QObject::tr("Unknown exception caught (%1)") + .arg(QString::fromLatin1(Q_FUNC_INFO))); } return false; // never reached } -void ExtractItemJob::doStart() { +void ExtractItemJob::doStart() +{ try { if (!d->archive) throw SevenZipException(tr("Could not list archive: QIODevice not set or already destroyed")); |