summaryrefslogtreecommitdiffstats
path: root/installerbuilder/common
diff options
context:
space:
mode:
authorkh1 <qt-info@nokia.com>2011-05-20 13:19:00 +0200
committerkh1 <qt-info@nokia.com>2011-05-20 13:19:00 +0200
commit4f947be928c03eea08e0c67faf5b5048c89d7833 (patch)
treee736469936e36f52e33a5e7154a0a89e579d95f0 /installerbuilder/common
parent7ccecfcb5ce5ab9bb3c827a780309ea577b3a5d8 (diff)
We need to keep the binary file in memory.
At some later point we map the resources into memory, but to access it the file needs to be opened still.
Diffstat (limited to 'installerbuilder/common')
-rw-r--r--installerbuilder/common/binaryformat.cpp36
-rw-r--r--installerbuilder/common/binaryformat.h1
2 files changed, 22 insertions, 15 deletions
diff --git a/installerbuilder/common/binaryformat.cpp b/installerbuilder/common/binaryformat.cpp
index ed2627d09..e82e67e50 100644
--- a/installerbuilder/common/binaryformat.cpp
+++ b/installerbuilder/common/binaryformat.cpp
@@ -757,6 +757,7 @@ static const uchar* addResourceFromBinary(QFile* file, const Range<qint64> &segm
BinaryContent::BinaryContent(const QString &path)
: file(new QFile(path))
+ , m_binaryFile(0)
, handler(components)
, m_magicmarker(0)
, dataBlockStart(0)
@@ -858,8 +859,9 @@ BinaryContent BinaryContent::readFromBinary(const QString &path)
throw Error(QObject::tr("Could not open binary %1: %2").arg(path, file->errorString()));
// check for supported binary, will throw if we can't find a marker
- const qint64 cookiePos = findMagicCookie(file, QInstaller::MagicCookie);
- const BinaryLayout layout = readBinaryLayout(file, cookiePos);
+ const BinaryLayout layout = readBinaryLayout(file, findMagicCookie(file, QInstaller::MagicCookie));
+
+ bool retry = true;
if (layout.magicMarker != MagicInstallerMarker) {
QString binaryDataPath = path;
QFileInfo fi(path + QLatin1String("/../../.."));
@@ -867,24 +869,27 @@ BinaryContent BinaryContent::readFromBinary(const QString &path)
binaryDataPath = fi.absoluteFilePath();
fi.setFile(binaryDataPath);
- bool retry = true;
- QFile binaryData(fi.absolutePath() + QLatin1Char('/') + fi.baseName() + QLatin1String(".dat"));
- if (binaryData.exists() && binaryData.open(QIODevice::ReadOnly)) {
+ c.m_binaryFile = QSharedPointer<QFile>(new QFile(fi.absolutePath() + QLatin1Char('/') + fi.baseName()
+ + QLatin1String(".dat")));
+ if (c.m_binaryFile->exists() && c.m_binaryFile->open(QIODevice::ReadOnly)) {
// check for supported binary data file, will throw if we can't find a marker
try {
- const qint64 cookiePosData = findMagicCookie(&binaryData, QInstaller::MagicCookieDat);
- readBinaryData(c, &binaryData, readBinaryLayout(&binaryData, cookiePosData));
+ const qint64 cookiePos = findMagicCookie(c.m_binaryFile.data(), QInstaller::MagicCookieDat);
+ readBinaryData(c, c.m_binaryFile.data(), readBinaryLayout(c.m_binaryFile.data(), cookiePos));
retry = false;
} catch (const Error &error) {
// this seems to be an unsupported dat file, try to read from original binary
+ c.m_binaryFile.clear();
verbose() << error.message();
}
+ } else {
+ c.m_binaryFile.clear();
}
- if (retry)
- readBinaryData(c, file, layout);
- } else {
- readBinaryData(c, file, layout);
}
+
+ if (retry)
+ readBinaryData(c, file, layout);
+
return c;
}
@@ -990,13 +995,14 @@ qint64 BinaryContent::magicmaker() const
*/
int BinaryContent::registerEmbeddedQResources()
{
- if (!file->isOpen()) {
- if (!file->open(QIODevice::ReadOnly))
- throw Error(QObject::tr("Could not open binary %1: %2").arg(file->fileName(), file->errorString()));
+ QFile *data = m_binaryFile.isNull() ? file.data() : m_binaryFile.data();
+ if (!data->isOpen() && !data->open(QIODevice::ReadOnly)) {
+ throw Error(QObject::tr("Could not open binary %1: %2").arg(data->fileName(),
+ data->errorString()));
}
foreach (const Range<qint64> &i, metadataResourceSegments)
- mappings.push_back(addResourceFromBinary(file.data(), i));
+ mappings.push_back(addResourceFromBinary(data, i));
return mappings.count();
}
diff --git a/installerbuilder/common/binaryformat.h b/installerbuilder/common/binaryformat.h
index 81a87b83d..3d0397678 100644
--- a/installerbuilder/common/binaryformat.h
+++ b/installerbuilder/common/binaryformat.h
@@ -202,6 +202,7 @@ private:
private:
QSharedPointer<QFile> file;
+ QSharedPointer<QFile> m_binaryFile;
QInstallerCreator::ComponentIndex components;
QInstallerCreator::BinaryFormatEngineHandler handler;
QVector<Range<qint64> > metadataResourceSegments;