diff options
author | Joerg Bornemann <joerg.bornemann@digia.com> | 2012-12-04 11:41:15 +0100 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2012-12-04 12:42:11 +0100 |
commit | 5277586c68e3232b5132bf65270f104c054a0409 (patch) | |
tree | 3bedfb178abee6e474af358e1c11ff3cf37c28e5 /tools | |
parent | 056d9b57cee7476cdb6e901334c9f8e3992f5105 (diff) |
dumpcpp: use temporary file as class implementation buffer
Instead of writing vast amounts of data into a QByteArray, we're using
a temporary file as clipboard. This enables us to handle much larger
import tables without worrying about running out of RAM.
Task-number: QTBUG-28325
Change-Id: Ied9567651cd859400ba3ed9a45cbbaac603300b6
Reviewed-by: Miikka Heikkinen <miikka.heikkinen@digia.com>
Diffstat (limited to 'tools')
-rw-r--r-- | tools/dumpcpp/main.cpp | 31 |
1 files changed, 28 insertions, 3 deletions
diff --git a/tools/dumpcpp/main.cpp b/tools/dumpcpp/main.cpp index 8fe7818..1af4518 100644 --- a/tools/dumpcpp/main.cpp +++ b/tools/dumpcpp/main.cpp @@ -46,6 +46,7 @@ #include <QTextStream> #include <QSettings> #include <QStringList> +#include <QTemporaryFile> #include <QUuid> #include <QWidget> #include <QFileInfo> @@ -570,6 +571,24 @@ uint nameToBuiltinType(const QByteArray &name) return tp < uint(QMetaType::User) ? tp : uint(QMetaType::UnknownType); } +void copyFileToStream(QFile *file, QTextStream *stream) +{ + file->seek(0); + QByteArray buffer; + const int bufferSize = 4096 * 1024; + buffer.resize(bufferSize); + while (!file->atEnd()) { + const int bytesRead = static_cast<int>(file->read(buffer.data(), bufferSize)); + if (bytesRead < bufferSize) { + buffer.resize(bytesRead); + *stream << buffer; + buffer.resize(bufferSize); + } else { + *stream << buffer; + } + } +} + void generateTypeInfo(QTextStream &out, const QByteArray &typeName) { if (QtPrivate::isBuiltinType(typeName)) { @@ -1009,8 +1028,12 @@ bool generateTypeLibrary(const QByteArray &typeLib, const QByteArray &outname, O QMetaObject *namespaceObject = qax_readEnumInfo(typelib, 0); - QByteArray classImplBuffer; - QTextStream classImplOut(&classImplBuffer, QIODevice::WriteOnly); + QTemporaryFile classImplFile; + if (!classImplFile.open()) { + qWarning("dumpcpp: Cannot open temporary file."); + return false; + } + QTextStream classImplOut(&classImplFile); QFile implFile(cppFile + QLatin1String(".cpp")); QTextStream implOut(&implFile); if (!(category & (NoMetaObject|NoImplementation))) { @@ -1386,7 +1409,9 @@ bool generateTypeLibrary(const QByteArray &typeLib, const QByteArray &outname, O implOut << "#undef QT_MOC_LITERAL" << endl << endl; - implOut << classImplBuffer << endl; + classImplOut.flush(); + copyFileToStream(&classImplFile, &implOut); + implOut << endl; } qax_deleteMetaObject(namespaceObject); |