diff options
Diffstat (limited to 'src/qml/qml/qqmlbundle.cpp')
-rw-r--r-- | src/qml/qml/qqmlbundle.cpp | 310 |
1 files changed, 0 insertions, 310 deletions
diff --git a/src/qml/qml/qqmlbundle.cpp b/src/qml/qml/qqmlbundle.cpp deleted file mode 100644 index 1034dd1b4c..0000000000 --- a/src/qml/qml/qqmlbundle.cpp +++ /dev/null @@ -1,310 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal -** -** This file is part of the QtQml module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL21$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 or version 3 as published by the Free -** Software Foundation and appearing in the file LICENSE.LGPLv21 and -** LICENSE.LGPLv3 included in the packaging of this file. Please review the -** following information to ensure the GNU Lesser General Public License -** requirements will be met: https://www.gnu.org/licenses/lgpl.html and -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "qqmlbundle_p.h" -#include <iostream> -#include <cstdlib> - -static const unsigned char qmlBundleHeaderData[] = { 255, 'q', 'm', 'l', 'd', 'i', 'r', 255 }; -static const unsigned int qmlBundleHeaderLength = 8; - -// -// Entries -// -QString QQmlBundle::FileEntry::fileName() const -{ - return QString((QChar *)&data[0], fileNameLength / sizeof(QChar)); -} - -bool QQmlBundle::FileEntry::isFileName(const QString &fileName) const -{ - return fileName.length() * sizeof(QChar) == (unsigned)fileNameLength && - 0 == ::memcmp(fileName.constData(), &data[0], fileNameLength); -} - -const char *QQmlBundle::FileEntry::contents() const { - return &data[fileNameLength]; -} - -quint32 QQmlBundle::FileEntry::fileSize() const -{ - return size - (sizeof(FileEntry) + fileNameLength); -} - - -// -// QQmlBundle -// -QQmlBundle::QQmlBundle(const QString &fileName) -: file(fileName), - buffer(0), - bufferSize(0), - opened(false), - headerWritten(false) -{ -} - -QQmlBundle::~QQmlBundle() -{ - close(); -} - -bool QQmlBundle::open(QIODevice::OpenMode mode) -{ - if (!opened) { - if (!file.open(mode)) - return false; - - bufferSize = file.size(); - buffer = file.map(0, bufferSize); - - if (bufferSize == 0 || - (bufferSize >= 8 && 0 == ::memcmp(buffer, qmlBundleHeaderData, qmlBundleHeaderLength))) { - opened = true; - headerWritten = false; - return true; - } else { - close(); - return false; - } - } - return true; -} - -void QQmlBundle::close() -{ - if (opened) { - opened = false; - headerWritten = false; - file.unmap(buffer); - file.close(); - } -} - -QList<const QQmlBundle::FileEntry *> QQmlBundle::files() const -{ - QList<const FileEntry *> files; - const char *ptr = (const char *) buffer + qmlBundleHeaderLength; - const char *end = (const char *) buffer + bufferSize; - - while (ptr < end) { - const Entry *cmd = (const Entry *) ptr; - - switch (static_cast<Entry::Kind>(cmd->kind)) { - case Entry::File: { - const FileEntry *f = reinterpret_cast<const FileEntry *>(cmd); - files.append(f); - } break; - - case Entry::Link: - case Entry::Skip: { - // Skip - } break; - - default: - // throw an error - return QList<const FileEntry *>(); - } // switch - - ptr += cmd->size; - Q_ASSERT(ptr <= end); // throw an error - } - return files; -} - -void QQmlBundle::remove(const FileEntry *entry) -{ - Q_ASSERT(entry->kind == Entry::File); // ### throw an error - Q_ASSERT(file.isWritable()); - const_cast<FileEntry *>(entry)->kind = Entry::Skip; -} - -int QQmlBundle::bundleHeaderLength() -{ - return qmlBundleHeaderLength; -} - -bool QQmlBundle::isBundleHeader(const char *data, int size) -{ - if ((unsigned int)size < qmlBundleHeaderLength) - return false; - - return 0 == ::memcmp(data, qmlBundleHeaderData, qmlBundleHeaderLength); -} - -// -// find a some empty space we can use to insert new entries. -// -const QQmlBundle::Entry *QQmlBundle::findInsertPoint(quint32 size, qint32 *offset) -{ - const char *ptr = (const char *) buffer + qmlBundleHeaderLength; - const char *end = (const char *) buffer + bufferSize; - - while (ptr < end) { - const Entry *cmd = (const Entry *) ptr; - - if (cmd->kind == Entry::Skip && size + sizeof(RawEntry) < cmd->size) { - *offset = ptr - ((const char *) buffer + qmlBundleHeaderLength); - return cmd; - } - - ptr += cmd->size; - Q_ASSERT(ptr <= end); // throw an error - } - - return 0; -} - -const QQmlBundle::FileEntry *QQmlBundle::find(const QString &fileName) const -{ - const char *ptr = (const char *) buffer + qmlBundleHeaderLength; - const char *end = (const char *) buffer + bufferSize; - - while (ptr < end) { - const Entry *cmd = (const Entry *) ptr; - - if (cmd->kind == Entry::File) { - const FileEntry *fileEntry = static_cast<const FileEntry *>(cmd); - - if (fileEntry->isFileName(fileName)) - return fileEntry; - } - - ptr += cmd->size; - Q_ASSERT(ptr <= end); // throw an error - } - - return 0; -} - -const QQmlBundle::FileEntry *QQmlBundle::link(const FileEntry *entry, const QString &linkName) const -{ - const char *ptr = (const char *) buffer + entry->link; - - while (ptr != (const char *)buffer) { - const Entry *cmd = (const Entry *) ptr; - Q_ASSERT(cmd->kind == Entry::Link); - - const FileEntry *fileEntry = static_cast<const FileEntry *>(cmd); - if (fileEntry->fileName() == linkName) - return fileEntry; - - ptr = (const char *) buffer + fileEntry->link; - } - - return 0; -} - -const QQmlBundle::FileEntry *QQmlBundle::find(const QChar *fileName, int length) const -{ - return find(QString::fromRawData(fileName, length)); -} - -bool QQmlBundle::add(const QString &name, const QString &fileName) -{ - if (!file.isWritable()) - return false; - else if (find(fileName)) - return false; - - QFile inputFile(fileName); - if (!inputFile.open(QFile::ReadOnly)) - return false; - - // ### use best-fit algorithm - if (!file.atEnd()) - file.seek(file.size()); - - FileEntry cmd; - const quint32 inputFileSize = inputFile.size(); - - cmd.kind = Entry::File; - cmd.link = 0; - cmd.size = sizeof(FileEntry) + name.length() * sizeof(QChar) + inputFileSize; - cmd.fileNameLength = name.length() * sizeof(QChar); - - if (bufferSize == 0 && headerWritten == false) { - file.write((const char *)qmlBundleHeaderData, qmlBundleHeaderLength); - headerWritten = true; - } - - file.write((const char *) &cmd, sizeof(FileEntry)); - file.write((const char *) name.constData(), name.length() * sizeof(QChar)); - - uchar *source = inputFile.map(0, inputFileSize); - file.write((const char *) source, inputFileSize); - inputFile.unmap(source); - return true; -} - -bool QQmlBundle::add(const QString &fileName) -{ - return add(fileName, fileName); -} - -bool QQmlBundle::addMetaLink(const QString &fileName, - const QString &linkName, - const QByteArray &data) -{ - if (!file.isWritable()) - return false; - - const FileEntry *fileEntry = find(fileName); - if (!fileEntry) - return false; - - // ### use best-fit algorithm - if (!file.atEnd()) - file.seek(file.size()); - - FileEntry cmd; - - const quint32 inputFileSize = data.size(); - - cmd.kind = Entry::Link; - cmd.link = fileEntry->link; - cmd.size = sizeof(FileEntry) + linkName.length() * sizeof(QChar) + inputFileSize; - cmd.fileNameLength = linkName.length() * sizeof(QChar); - - if (bufferSize == 0 && headerWritten == false) { - file.write((const char *)qmlBundleHeaderData, qmlBundleHeaderLength); - headerWritten = true; - } - - const_cast<FileEntry *>(fileEntry)->link = file.size(); - - file.write((const char *) &cmd, sizeof(FileEntry)); - file.write((const char *) linkName.constData(), linkName.length() * sizeof(QChar)); - file.write((const char *) data.constData(), inputFileSize); - return true; -} |