diff options
Diffstat (limited to 'src/corelib/io')
30 files changed, 319 insertions, 268 deletions
diff --git a/src/corelib/io/qbuffer.cpp b/src/corelib/io/qbuffer.cpp index 5377eb21e3..200d6a0c0c 100644 --- a/src/corelib/io/qbuffer.cpp +++ b/src/corelib/io/qbuffer.cpp @@ -54,8 +54,8 @@ public: QByteArray *buf; QByteArray defaultBuf; - virtual qint64 peek(char *data, qint64 maxSize); - virtual QByteArray peek(qint64 maxSize); + virtual qint64 peek(char *data, qint64 maxSize) Q_DECL_OVERRIDE; + virtual QByteArray peek(qint64 maxSize) Q_DECL_OVERRIDE; #ifndef QT_NO_QOBJECT // private slots diff --git a/src/corelib/io/qbuffer.h b/src/corelib/io/qbuffer.h index 24b05aad13..56c80f8a7d 100644 --- a/src/corelib/io/qbuffer.h +++ b/src/corelib/io/qbuffer.h @@ -67,22 +67,22 @@ public: inline void setData(const char *data, int len); const QByteArray &data() const; - bool open(OpenMode openMode); + bool open(OpenMode openMode) Q_DECL_OVERRIDE; - void close(); - qint64 size() const; - qint64 pos() const; - bool seek(qint64 off); - bool atEnd() const; - bool canReadLine() const; + void close() Q_DECL_OVERRIDE; + qint64 size() const Q_DECL_OVERRIDE; + qint64 pos() const Q_DECL_OVERRIDE; + bool seek(qint64 off) Q_DECL_OVERRIDE; + bool atEnd() const Q_DECL_OVERRIDE; + bool canReadLine() const Q_DECL_OVERRIDE; protected: #ifndef QT_NO_QOBJECT - void connectNotify(const QMetaMethod &); - void disconnectNotify(const QMetaMethod &); + void connectNotify(const QMetaMethod &) Q_DECL_OVERRIDE; + void disconnectNotify(const QMetaMethod &) Q_DECL_OVERRIDE; #endif - qint64 readData(char *data, qint64 maxlen); - qint64 writeData(const char *data, qint64 len); + qint64 readData(char *data, qint64 maxlen) Q_DECL_OVERRIDE; + qint64 writeData(const char *data, qint64 len) Q_DECL_OVERRIDE; private: Q_DECLARE_PRIVATE(QBuffer) diff --git a/src/corelib/io/qdatastream.cpp b/src/corelib/io/qdatastream.cpp index beaafe4762..60f04ce4f1 100644 --- a/src/corelib/io/qdatastream.cpp +++ b/src/corelib/io/qdatastream.cpp @@ -525,6 +525,7 @@ void QDataStream::setByteOrder(ByteOrder bo) \value Qt_5_2 Version 15 (Qt 5.2) \value Qt_5_3 Same as Qt_5_2 \value Qt_5_4 Version 16 (Qt 5.4) + \value Qt_5_5 Same as Qt_5_4 \omitvalue Qt_DefaultCompiledVersion \sa setVersion(), version() diff --git a/src/corelib/io/qdatastream.h b/src/corelib/io/qdatastream.h index 75ffa11543..8e1d777011 100644 --- a/src/corelib/io/qdatastream.h +++ b/src/corelib/io/qdatastream.h @@ -82,10 +82,11 @@ public: Qt_5_2 = 15, Qt_5_3 = Qt_5_2, Qt_5_4 = 16, -#if QT_VERSION >= 0x050500 + Qt_5_5 = Qt_5_4, +#if QT_VERSION >= 0x050600 #error Add the datastream version for this Qt version and update Qt_DefaultCompiledVersion #endif - Qt_DefaultCompiledVersion = Qt_5_4 + Qt_DefaultCompiledVersion = Qt_5_5 }; enum ByteOrder { diff --git a/src/corelib/io/qdebug.cpp b/src/corelib/io/qdebug.cpp index 5c77ccdcbf..050a48bd65 100644 --- a/src/corelib/io/qdebug.cpp +++ b/src/corelib/io/qdebug.cpp @@ -148,6 +148,28 @@ QDebug::~QDebug() } /*! + \internal +*/ +void QDebug::putUcs4(uint ucs4) +{ + maybeQuote('\''); + if (ucs4 < 0x20) { + stream->ts << hex << "\\x" << ucs4 << reset; + } else if (ucs4 < 0x80) { + stream->ts << char(ucs4); + } else { + stream->ts << hex << qSetPadChar(QLatin1Char('0')); + if (ucs4 < 0x10000) + stream->ts << qSetFieldWidth(4) << "\\u"; + else + stream->ts << qSetFieldWidth(8) << "\\U"; + stream->ts << ucs4 << reset; + } + maybeQuote('\''); +} + + +/*! \fn QDebug::swap(QDebug &other) \since 5.0 diff --git a/src/corelib/io/qdebug.h b/src/corelib/io/qdebug.h index 4edb3057fb..4295800f1a 100644 --- a/src/corelib/io/qdebug.h +++ b/src/corelib/io/qdebug.h @@ -76,6 +76,8 @@ class Q_CORE_EXPORT QDebug // added in 5.4 int flags; } *stream; + + void putUcs4(uint ucs4); public: inline QDebug(QIODevice *device) : stream(new Stream(device)) {} inline QDebug(QString *string) : stream(new Stream(string)) {} @@ -98,11 +100,15 @@ public: inline QDebug &noquote() { stream->setFlag(Stream::NoQuotes); return *this; } inline QDebug &maybeQuote(char c = '"') { if (!(stream->testFlag(Stream::NoQuotes))) stream->ts << c; return *this; } - inline QDebug &operator<<(QChar t) { maybeQuote('\''); stream->ts << t; maybeQuote('\''); return maybeSpace(); } + inline QDebug &operator<<(QChar t) { putUcs4(t.unicode()); return maybeSpace(); } inline QDebug &operator<<(bool t) { stream->ts << (t ? "true" : "false"); return maybeSpace(); } inline QDebug &operator<<(char t) { stream->ts << t; return maybeSpace(); } inline QDebug &operator<<(signed short t) { stream->ts << t; return maybeSpace(); } inline QDebug &operator<<(unsigned short t) { stream->ts << t; return maybeSpace(); } +#ifdef Q_COMPILER_UNICODE_STRINGS + inline QDebug &operator<<(char16_t t) { return *this << QChar(t); } + inline QDebug &operator<<(char32_t t) { putUcs4(t); return maybeSpace(); } +#endif inline QDebug &operator<<(signed int t) { stream->ts << t; return maybeSpace(); } inline QDebug &operator<<(unsigned int t) { stream->ts << t; return maybeSpace(); } inline QDebug &operator<<(signed long t) { stream->ts << t; return maybeSpace(); } @@ -117,6 +123,9 @@ public: inline QDebug &operator<<(QLatin1String t) { maybeQuote(); stream->ts << t; maybeQuote(); return maybeSpace(); } inline QDebug &operator<<(const QByteArray & t) { maybeQuote(); stream->ts << t; maybeQuote(); return maybeSpace(); } inline QDebug &operator<<(const void * t) { stream->ts << t; return maybeSpace(); } +#ifdef Q_COMPILER_NULLPTR + inline QDebug &operator<<(std::nullptr_t) { stream->ts << "(nullptr)"; return maybeSpace(); } +#endif inline QDebug &operator<<(QTextStreamFunction f) { stream->ts << f; return *this; diff --git a/src/corelib/io/qfile.h b/src/corelib/io/qfile.h index 75f246da96..3c44ee3397 100644 --- a/src/corelib/io/qfile.h +++ b/src/corelib/io/qfile.h @@ -63,7 +63,7 @@ public: #endif ~QFile(); - QString fileName() const; + QString fileName() const Q_DECL_OVERRIDE; void setFileName(const QString &name); #if defined(Q_OS_DARWIN) @@ -116,18 +116,18 @@ public: bool copy(const QString &newName); static bool copy(const QString &fileName, const QString &newName); - bool open(OpenMode flags); + bool open(OpenMode flags) Q_DECL_OVERRIDE; bool open(FILE *f, OpenMode ioFlags, FileHandleFlags handleFlags=DontCloseHandle); bool open(int fd, OpenMode ioFlags, FileHandleFlags handleFlags=DontCloseHandle); - qint64 size() const; + qint64 size() const Q_DECL_OVERRIDE; - bool resize(qint64 sz); + bool resize(qint64 sz) Q_DECL_OVERRIDE; static bool resize(const QString &filename, qint64 sz); - Permissions permissions() const; + Permissions permissions() const Q_DECL_OVERRIDE; static Permissions permissions(const QString &filename); - bool setPermissions(Permissions permissionSpec); + bool setPermissions(Permissions permissionSpec) Q_DECL_OVERRIDE; static bool setPermissions(const QString &filename, Permissions permissionSpec); protected: diff --git a/src/corelib/io/qfiledevice.h b/src/corelib/io/qfiledevice.h index b79b0055fa..ca12bb0411 100644 --- a/src/corelib/io/qfiledevice.h +++ b/src/corelib/io/qfiledevice.h @@ -86,19 +86,19 @@ public: FileError error() const; void unsetError(); - virtual void close(); + virtual void close() Q_DECL_OVERRIDE; - bool isSequential() const; + bool isSequential() const Q_DECL_OVERRIDE; int handle() const; virtual QString fileName() const; - qint64 pos() const; - bool seek(qint64 offset); - bool atEnd() const; + qint64 pos() const Q_DECL_OVERRIDE; + bool seek(qint64 offset) Q_DECL_OVERRIDE; + bool atEnd() const Q_DECL_OVERRIDE; bool flush(); - qint64 size() const; + qint64 size() const Q_DECL_OVERRIDE; virtual bool resize(qint64 sz); virtual Permissions permissions() const; @@ -122,9 +122,9 @@ protected: QFileDevice(QFileDevicePrivate &dd, QObject *parent = 0); #endif - qint64 readData(char *data, qint64 maxlen); - qint64 writeData(const char *data, qint64 len); - qint64 readLineData(char *data, qint64 maxlen); + qint64 readData(char *data, qint64 maxlen) Q_DECL_OVERRIDE; + qint64 writeData(const char *data, qint64 len) Q_DECL_OVERRIDE; + qint64 readLineData(char *data, qint64 maxlen) Q_DECL_OVERRIDE; private: Q_DISABLE_COPY(QFileDevice) diff --git a/src/corelib/io/qfiledevice_p.h b/src/corelib/io/qfiledevice_p.h index 891a5e4be4..da29c51468 100644 --- a/src/corelib/io/qfiledevice_p.h +++ b/src/corelib/io/qfiledevice_p.h @@ -64,7 +64,7 @@ protected: inline bool ensureFlushed() const; - bool putCharHelper(char c); + bool putCharHelper(char c) Q_DECL_OVERRIDE; void setError(QFileDevice::FileError err); void setError(QFileDevice::FileError err, const QString &errorString); diff --git a/src/corelib/io/qfileselector.cpp b/src/corelib/io/qfileselector.cpp index 5d1d5dfe23..95fa970b2d 100644 --- a/src/corelib/io/qfileselector.cpp +++ b/src/corelib/io/qfileselector.cpp @@ -335,7 +335,7 @@ void QFileSelectorPrivate::updateSelectors() if (envSelectors.count()) sharedData->staticSelectors << envSelectors; - if (!qgetenv(env_override).isEmpty()) + if (!qEnvironmentVariableIsEmpty(env_override)) return; sharedData->staticSelectors << sharedData->preloadedStatics; //Potential for static selectors from other modules diff --git a/src/corelib/io/qfilesystemwatcher_inotify_p.h b/src/corelib/io/qfilesystemwatcher_inotify_p.h index a9bc8486dc..506f571e2b 100644 --- a/src/corelib/io/qfilesystemwatcher_inotify_p.h +++ b/src/corelib/io/qfilesystemwatcher_inotify_p.h @@ -64,8 +64,8 @@ public: static QInotifyFileSystemWatcherEngine *create(QObject *parent); - QStringList addPaths(const QStringList &paths, QStringList *files, QStringList *directories); - QStringList removePaths(const QStringList &paths, QStringList *files, QStringList *directories); + QStringList addPaths(const QStringList &paths, QStringList *files, QStringList *directories) Q_DECL_OVERRIDE; + QStringList removePaths(const QStringList &paths, QStringList *files, QStringList *directories) Q_DECL_OVERRIDE; private Q_SLOTS: void readFromInotify(); diff --git a/src/corelib/io/qfilesystemwatcher_polling_p.h b/src/corelib/io/qfilesystemwatcher_polling_p.h index f39d72d5d8..3833869806 100644 --- a/src/corelib/io/qfilesystemwatcher_polling_p.h +++ b/src/corelib/io/qfilesystemwatcher_polling_p.h @@ -104,8 +104,8 @@ class QPollingFileSystemWatcherEngine : public QFileSystemWatcherEngine public: QPollingFileSystemWatcherEngine(QObject *parent); - QStringList addPaths(const QStringList &paths, QStringList *files, QStringList *directories); - QStringList removePaths(const QStringList &paths, QStringList *files, QStringList *directories); + QStringList addPaths(const QStringList &paths, QStringList *files, QStringList *directories) Q_DECL_OVERRIDE; + QStringList removePaths(const QStringList &paths, QStringList *files, QStringList *directories) Q_DECL_OVERRIDE; private Q_SLOTS: void timeout(); diff --git a/src/corelib/io/qfsfileengine_iterator_p.h b/src/corelib/io/qfsfileengine_iterator_p.h index cc5b36fc57..35cb89673c 100644 --- a/src/corelib/io/qfsfileengine_iterator_p.h +++ b/src/corelib/io/qfsfileengine_iterator_p.h @@ -62,11 +62,11 @@ public: QFSFileEngineIterator(QDir::Filters filters, const QStringList &filterNames); ~QFSFileEngineIterator(); - QString next(); - bool hasNext() const; + QString next() Q_DECL_OVERRIDE; + bool hasNext() const Q_DECL_OVERRIDE; - QString currentFileName() const; - QFileInfo currentFileInfo() const; + QString currentFileName() const Q_DECL_OVERRIDE; + QFileInfo currentFileInfo() const Q_DECL_OVERRIDE; private: void advance() const; diff --git a/src/corelib/io/qfsfileengine_p.h b/src/corelib/io/qfsfileengine_p.h index 3963a9cb11..f843a870b8 100644 --- a/src/corelib/io/qfsfileengine_p.h +++ b/src/corelib/io/qfsfileengine_p.h @@ -69,46 +69,46 @@ public: explicit QFSFileEngine(const QString &file); ~QFSFileEngine(); - bool open(QIODevice::OpenMode openMode); + bool open(QIODevice::OpenMode openMode) Q_DECL_OVERRIDE; bool open(QIODevice::OpenMode flags, FILE *fh); - bool close(); - bool flush(); - bool syncToDisk(); - qint64 size() const; - qint64 pos() const; - bool seek(qint64); - bool isSequential() const; - bool remove(); - bool copy(const QString &newName); - bool rename(const QString &newName); - bool renameOverwrite(const QString &newName); - bool link(const QString &newName); - bool mkdir(const QString &dirName, bool createParentDirectories) const; - bool rmdir(const QString &dirName, bool recurseParentDirectories) const; - bool setSize(qint64 size); - bool caseSensitive() const; - bool isRelativePath() const; - QStringList entryList(QDir::Filters filters, const QStringList &filterNames) const; - FileFlags fileFlags(FileFlags type) const; - bool setPermissions(uint perms); - QString fileName(FileName file) const; - uint ownerId(FileOwner) const; - QString owner(FileOwner) const; - QDateTime fileTime(FileTime time) const; - void setFileName(const QString &file); - int handle() const; + bool close() Q_DECL_OVERRIDE; + bool flush() Q_DECL_OVERRIDE; + bool syncToDisk() Q_DECL_OVERRIDE; + qint64 size() const Q_DECL_OVERRIDE; + qint64 pos() const Q_DECL_OVERRIDE; + bool seek(qint64) Q_DECL_OVERRIDE; + bool isSequential() const Q_DECL_OVERRIDE; + bool remove() Q_DECL_OVERRIDE; + bool copy(const QString &newName) Q_DECL_OVERRIDE; + bool rename(const QString &newName) Q_DECL_OVERRIDE; + bool renameOverwrite(const QString &newName) Q_DECL_OVERRIDE; + bool link(const QString &newName) Q_DECL_OVERRIDE; + bool mkdir(const QString &dirName, bool createParentDirectories) const Q_DECL_OVERRIDE; + bool rmdir(const QString &dirName, bool recurseParentDirectories) const Q_DECL_OVERRIDE; + bool setSize(qint64 size) Q_DECL_OVERRIDE; + bool caseSensitive() const Q_DECL_OVERRIDE; + bool isRelativePath() const Q_DECL_OVERRIDE; + QStringList entryList(QDir::Filters filters, const QStringList &filterNames) const Q_DECL_OVERRIDE; + FileFlags fileFlags(FileFlags type) const Q_DECL_OVERRIDE; + bool setPermissions(uint perms) Q_DECL_OVERRIDE; + QString fileName(FileName file) const Q_DECL_OVERRIDE; + uint ownerId(FileOwner) const Q_DECL_OVERRIDE; + QString owner(FileOwner) const Q_DECL_OVERRIDE; + QDateTime fileTime(FileTime time) const Q_DECL_OVERRIDE; + void setFileName(const QString &file) Q_DECL_OVERRIDE; + int handle() const Q_DECL_OVERRIDE; #ifndef QT_NO_FILESYSTEMITERATOR - Iterator *beginEntryList(QDir::Filters filters, const QStringList &filterNames); - Iterator *endEntryList(); + Iterator *beginEntryList(QDir::Filters filters, const QStringList &filterNames) Q_DECL_OVERRIDE; + Iterator *endEntryList() Q_DECL_OVERRIDE; #endif - qint64 read(char *data, qint64 maxlen); - qint64 readLine(char *data, qint64 maxlen); - qint64 write(const char *data, qint64 len); + qint64 read(char *data, qint64 maxlen) Q_DECL_OVERRIDE; + qint64 readLine(char *data, qint64 maxlen) Q_DECL_OVERRIDE; + qint64 write(const char *data, qint64 len) Q_DECL_OVERRIDE; - bool extension(Extension extension, const ExtensionOption *option = 0, ExtensionReturn *output = 0); - bool supportsExtension(Extension extension) const; + bool extension(Extension extension, const ExtensionOption *option = 0, ExtensionReturn *output = 0) Q_DECL_OVERRIDE; + bool supportsExtension(Extension extension) const Q_DECL_OVERRIDE; //FS only!! bool open(QIODevice::OpenMode flags, int fd); diff --git a/src/corelib/io/qiodevice.cpp b/src/corelib/io/qiodevice.cpp index 0709a93bad..36f88f2774 100644 --- a/src/corelib/io/qiodevice.cpp +++ b/src/corelib/io/qiodevice.cpp @@ -783,27 +783,20 @@ qint64 QIODevice::read(char *data, qint64 maxSize) CHECK_MAXLEN(read, qint64(-1)); qint64 readSoFar = 0; - bool moreToRead = true; - do { + bool madeBufferReadsOnly = true; + bool deviceAtEof = false; + char *readPtr = data; + forever { // Try reading from the buffer. - qint64 lastReadChunkSize = d->buffer.read(data, maxSize); - if (lastReadChunkSize > 0) { - *d->pPos += lastReadChunkSize; - readSoFar += lastReadChunkSize; - // fast exit when satisfied by buffer - if (lastReadChunkSize == maxSize && !(d->openMode & Text)) { - if (d->buffer.isEmpty()) { - d->buffer.clear(); - readData(data, 0); - } - return readSoFar; - } - - data += lastReadChunkSize; - maxSize -= lastReadChunkSize; + qint64 bufferReadChunkSize = d->buffer.read(data, maxSize); + if (bufferReadChunkSize > 0) { + *d->pPos += bufferReadChunkSize; + readSoFar += bufferReadChunkSize; + data += bufferReadChunkSize; + maxSize -= bufferReadChunkSize; #if defined QIODEVICE_DEBUG - printf("%p \treading %d bytes from buffer into position %d\n", this, lastReadChunkSize, - int(readSoFar) - lastReadChunkSize); + printf("%p \treading %d bytes from buffer into position %d\n", this, + bufferReadChunkSize, int(readSoFar) - bufferReadChunkSize); #endif } else { if (d->firstRead) { @@ -816,100 +809,84 @@ qint64 QIODevice::read(char *data, qint64 maxSize) d->pDevicePos = &d->seqDumpPos; } } + } - if (!maxSize) - return readSoFar; - - if ((d->openMode & Unbuffered) == 0 && maxSize < QIODEVICE_BUFFERSIZE) { - // In buffered mode, we try to fill up the QIODevice buffer before - // we do anything else. - // buffer is empty at this point, try to fill it - const int bytesToBuffer = QIODEVICE_BUFFERSIZE; - char *writePointer = d->buffer.reserve(bytesToBuffer); - - // Make sure the device is positioned correctly. - if (d->pos != d->devicePos && !d->isSequential() && !seek(d->pos)) - return readSoFar ? readSoFar : qint64(-1); - qint64 readFromDevice = readData(writePointer, bytesToBuffer); - d->buffer.chop(bytesToBuffer - (readFromDevice < 0 ? 0 : int(readFromDevice))); - - if (readFromDevice > 0) { - *d->pDevicePos += readFromDevice; + if (maxSize > 0 && !deviceAtEof) { + qint64 readFromDevice = 0; + // Make sure the device is positioned correctly. + if (d->pos == d->devicePos || d->isSequential() || seek(d->pos)) { + madeBufferReadsOnly = false; // fix readData attempt + if (maxSize >= QIODEVICE_BUFFERSIZE || (d->openMode & Unbuffered)) { + // Read big chunk directly to output buffer + readFromDevice = readData(data, maxSize); + deviceAtEof = (readFromDevice != maxSize); #if defined QIODEVICE_DEBUG - printf("%p \treading %d from device into buffer\n", this, int(readFromDevice)); + printf("%p \treading %d bytes from device (total %d)\n", this, + int(readFromDevice), int(readSoFar)); #endif - - if (!d->buffer.isEmpty()) { - lastReadChunkSize = d->buffer.read(data, maxSize); - readSoFar += lastReadChunkSize; - data += lastReadChunkSize; - maxSize -= lastReadChunkSize; - *d->pPos += lastReadChunkSize; + if (readFromDevice > 0) { + readSoFar += readFromDevice; + data += readFromDevice; + maxSize -= readFromDevice; + *d->pPos += readFromDevice; + *d->pDevicePos += readFromDevice; + } + } else { + const int bytesToBuffer = QIODEVICE_BUFFERSIZE; + // Try to fill QIODevice buffer by single read + readFromDevice = readData(d->buffer.reserve(bytesToBuffer), bytesToBuffer); + deviceAtEof = (readFromDevice != bytesToBuffer); + d->buffer.chop(bytesToBuffer - qMax(0, int(readFromDevice))); + if (readFromDevice > 0) { + *d->pDevicePos += readFromDevice; #if defined QIODEVICE_DEBUG - printf("%p \treading %d bytes from buffer at position %d\n", this, - lastReadChunkSize, int(readSoFar)); + printf("%p \treading %d from device into buffer\n", this, + int(readFromDevice)); #endif + continue; } } + } else { + readFromDevice = -1; } - } - // If we need more, try reading from the device. - if (maxSize > 0) { - // Make sure the device is positioned correctly. - if (d->pos != d->devicePos && !d->isSequential() && !seek(d->pos)) - return readSoFar ? readSoFar : qint64(-1); - qint64 readFromDevice = readData(data, maxSize); -#if defined QIODEVICE_DEBUG - printf("%p \treading %d bytes from device (total %d)\n", this, int(readFromDevice), int(readSoFar)); -#endif - if (readFromDevice == -1 && readSoFar == 0) { + if (readFromDevice < 0 && readSoFar == 0) { // error and we haven't read anything: return immediately - return -1; - } - if (readFromDevice > 0) { - lastReadChunkSize += int(readFromDevice); - readSoFar += readFromDevice; - data += readFromDevice; - maxSize -= readFromDevice; - *d->pPos += readFromDevice; - *d->pDevicePos += readFromDevice; + return qint64(-1); } } - // Best attempt has been made to read data, don't try again except for text mode adjustment below - moreToRead = false; - if (readSoFar && d->openMode & Text) { - char *readPtr = data - lastReadChunkSize; + if ((d->openMode & Text) && readPtr < data) { const char *endPtr = data; - if (readPtr < endPtr) { - // optimization to avoid initial self-assignment - while (*readPtr != '\r') { - if (++readPtr == endPtr) - return readSoFar; - } + // optimization to avoid initial self-assignment + while (*readPtr != '\r') { + if (++readPtr == endPtr) + break; + } - char *writePtr = readPtr; + char *writePtr = readPtr; - while (readPtr < endPtr) { - char ch = *readPtr++; - if (ch != '\r') - *writePtr++ = ch; - else { - --readSoFar; - --data; - ++maxSize; - } + while (readPtr < endPtr) { + char ch = *readPtr++; + if (ch != '\r') + *writePtr++ = ch; + else { + --readSoFar; + --data; + ++maxSize; } - - // Make sure we get more data if there is room for more. This - // is very important for when someone seeks to the start of a - // '\r\n' and reads one character - they should get the '\n'. - moreToRead = (readPtr != writePtr); } + + // Make sure we get more data if there is room for more. This + // is very important for when someone seeks to the start of a + // '\r\n' and reads one character - they should get the '\n'. + readPtr = data; + continue; } - } while (moreToRead); + + break; + } #if defined QIODEVICE_DEBUG printf("%p \treturning %d, d->pos == %d, d->buffer.size() == %d\n", this, @@ -917,8 +894,10 @@ qint64 QIODevice::read(char *data, qint64 maxSize) debugBinaryString(data - readSoFar, readSoFar); #endif - if (d->buffer.isEmpty()) + if (madeBufferReadsOnly && d->buffer.isEmpty()) { + d->buffer.clear(); readData(data, 0); + } return readSoFar; } diff --git a/src/corelib/io/qnoncontiguousbytedevice_p.h b/src/corelib/io/qnoncontiguousbytedevice_p.h index c05ae11b0f..1be28ff4b3 100644 --- a/src/corelib/io/qnoncontiguousbytedevice_p.h +++ b/src/corelib/io/qnoncontiguousbytedevice_p.h @@ -101,11 +101,11 @@ class QNonContiguousByteDeviceByteArrayImpl : public QNonContiguousByteDevice public: QNonContiguousByteDeviceByteArrayImpl(QByteArray *ba); ~QNonContiguousByteDeviceByteArrayImpl(); - const char* readPointer(qint64 maximumLength, qint64 &len); - bool advanceReadPointer(qint64 amount); - bool atEnd(); - bool reset(); - qint64 size(); + const char* readPointer(qint64 maximumLength, qint64 &len) Q_DECL_OVERRIDE; + bool advanceReadPointer(qint64 amount) Q_DECL_OVERRIDE; + bool atEnd() Q_DECL_OVERRIDE; + bool reset() Q_DECL_OVERRIDE; + qint64 size() Q_DECL_OVERRIDE; protected: QByteArray* byteArray; qint64 currentPosition; @@ -116,11 +116,11 @@ class QNonContiguousByteDeviceRingBufferImpl : public QNonContiguousByteDevice public: QNonContiguousByteDeviceRingBufferImpl(QSharedPointer<QRingBuffer> rb); ~QNonContiguousByteDeviceRingBufferImpl(); - const char* readPointer(qint64 maximumLength, qint64 &len); - bool advanceReadPointer(qint64 amount); - bool atEnd(); - bool reset(); - qint64 size(); + const char* readPointer(qint64 maximumLength, qint64 &len) Q_DECL_OVERRIDE; + bool advanceReadPointer(qint64 amount) Q_DECL_OVERRIDE; + bool atEnd() Q_DECL_OVERRIDE; + bool reset() Q_DECL_OVERRIDE; + qint64 size() Q_DECL_OVERRIDE; protected: QSharedPointer<QRingBuffer> ringBuffer; qint64 currentPosition; @@ -133,11 +133,11 @@ class QNonContiguousByteDeviceIoDeviceImpl : public QNonContiguousByteDevice public: QNonContiguousByteDeviceIoDeviceImpl(QIODevice *d); ~QNonContiguousByteDeviceIoDeviceImpl(); - const char* readPointer(qint64 maximumLength, qint64 &len); - bool advanceReadPointer(qint64 amount); - bool atEnd(); - bool reset(); - qint64 size(); + const char* readPointer(qint64 maximumLength, qint64 &len) Q_DECL_OVERRIDE; + bool advanceReadPointer(qint64 amount) Q_DECL_OVERRIDE; + bool atEnd() Q_DECL_OVERRIDE; + bool reset() Q_DECL_OVERRIDE; + qint64 size() Q_DECL_OVERRIDE; protected: QIODevice* device; QByteArray* currentReadBuffer; @@ -155,11 +155,11 @@ class QNonContiguousByteDeviceBufferImpl : public QNonContiguousByteDevice public: QNonContiguousByteDeviceBufferImpl(QBuffer *b); ~QNonContiguousByteDeviceBufferImpl(); - const char* readPointer(qint64 maximumLength, qint64 &len); - bool advanceReadPointer(qint64 amount); - bool atEnd(); - bool reset(); - qint64 size(); + const char* readPointer(qint64 maximumLength, qint64 &len) Q_DECL_OVERRIDE; + bool advanceReadPointer(qint64 amount) Q_DECL_OVERRIDE; + bool atEnd() Q_DECL_OVERRIDE; + bool reset() Q_DECL_OVERRIDE; + qint64 size() Q_DECL_OVERRIDE; protected: QBuffer* buffer; QByteArray byteArray; @@ -172,13 +172,13 @@ class QByteDeviceWrappingIoDevice : public QIODevice public: QByteDeviceWrappingIoDevice (QNonContiguousByteDevice *bd); ~QByteDeviceWrappingIoDevice (); - virtual bool isSequential () const; - virtual bool atEnd () const; - virtual bool reset (); - virtual qint64 size () const; + virtual bool isSequential () const Q_DECL_OVERRIDE; + virtual bool atEnd () const Q_DECL_OVERRIDE; + virtual bool reset () Q_DECL_OVERRIDE; + virtual qint64 size () const Q_DECL_OVERRIDE; protected: - virtual qint64 readData ( char * data, qint64 maxSize ); - virtual qint64 writeData ( const char * data, qint64 maxSize ); + virtual qint64 readData ( char * data, qint64 maxSize ) Q_DECL_OVERRIDE; + virtual qint64 writeData ( const char * data, qint64 maxSize ) Q_DECL_OVERRIDE; QNonContiguousByteDevice *byteDevice; }; diff --git a/src/corelib/io/qprocess.h b/src/corelib/io/qprocess.h index 8d90177c8b..af3db4ecf6 100644 --- a/src/corelib/io/qprocess.h +++ b/src/corelib/io/qprocess.h @@ -182,8 +182,8 @@ public: qint64 processId() const; bool waitForStarted(int msecs = 30000); - bool waitForReadyRead(int msecs = 30000); - bool waitForBytesWritten(int msecs = 30000); + bool waitForReadyRead(int msecs = 30000) Q_DECL_OVERRIDE; + bool waitForBytesWritten(int msecs = 30000) Q_DECL_OVERRIDE; bool waitForFinished(int msecs = 30000); QByteArray readAllStandardOutput(); @@ -193,12 +193,12 @@ public: QProcess::ExitStatus exitStatus() const; // QIODevice - qint64 bytesAvailable() const; - qint64 bytesToWrite() const; - bool isSequential() const; - bool canReadLine() const; - void close(); - bool atEnd() const; + qint64 bytesAvailable() const Q_DECL_OVERRIDE; + qint64 bytesToWrite() const Q_DECL_OVERRIDE; + bool isSequential() const Q_DECL_OVERRIDE; + bool canReadLine() const Q_DECL_OVERRIDE; + void close() Q_DECL_OVERRIDE; + bool atEnd() const Q_DECL_OVERRIDE; static int execute(const QString &program, const QStringList &arguments); static int execute(const QString &command); @@ -254,8 +254,8 @@ protected: virtual void setupChildProcess(); // QIODevice - qint64 readData(char *data, qint64 maxlen); - qint64 writeData(const char *data, qint64 len); + qint64 readData(char *data, qint64 maxlen) Q_DECL_OVERRIDE; + qint64 writeData(const char *data, qint64 len) Q_DECL_OVERRIDE; private: Q_DECLARE_PRIVATE(QProcess) diff --git a/src/corelib/io/qprocess_unix.cpp b/src/corelib/io/qprocess_unix.cpp index cc154cfbc5..cfee5f1d46 100644 --- a/src/corelib/io/qprocess_unix.cpp +++ b/src/corelib/io/qprocess_unix.cpp @@ -165,7 +165,7 @@ public: QProcessManager(); ~QProcessManager(); - void run(); + void run() Q_DECL_OVERRIDE; void catchDeadChildren(); void add(pid_t pid, QProcess *process); void remove(QProcess *process); diff --git a/src/corelib/io/qresource.cpp b/src/corelib/io/qresource.cpp index ed6bfb4e0d..d9b51cd288 100644 --- a/src/corelib/io/qresource.cpp +++ b/src/corelib/io/qresource.cpp @@ -873,10 +873,16 @@ public: inline QDynamicBufferResourceRoot(const QString &_root) : root(_root), buffer(0) { } inline ~QDynamicBufferResourceRoot() { } inline const uchar *mappingBuffer() const { return buffer; } - virtual QString mappingRoot() const { return root; } - virtual ResourceRootType type() const { return Resource_Buffer; } + virtual QString mappingRoot() const Q_DECL_OVERRIDE { return root; } + virtual ResourceRootType type() const Q_DECL_OVERRIDE { return Resource_Buffer; } + + // size == -1 means "unknown" + bool registerSelf(const uchar *b, int size) + { + // 5 int "pointers" + if (size >= 0 && size < 20) + return false; - bool registerSelf(const uchar *b) { //setup the data now int offset = 0; @@ -903,6 +909,10 @@ public: (b[offset+2] << 8) + (b[offset+3] << 0); offset += 4; + // Some sanity checking for sizes. This is _not_ a security measure. + if (size >= 0 && (tree_offset >= size || data_offset >= size || name_offset >= size)) + return false; + if(version == 0x01) { buffer = b; setSource(b+tree_offset, b+name_offset, b+data_offset); @@ -950,7 +960,7 @@ public: } } QString mappingFile() const { return fileName; } - virtual ResourceRootType type() const { return Resource_File; } + virtual ResourceRootType type() const Q_DECL_OVERRIDE { return Resource_File; } bool registerSelf(const QString &f) { bool fromMM = false; @@ -1009,7 +1019,7 @@ public: } fromMM = false; } - if(data && QDynamicBufferResourceRoot::registerSelf(data)) { + if (data && QDynamicBufferResourceRoot::registerSelf(data, data_len)) { if(fromMM) { unmapPointer = data; unmapLength = data_len; @@ -1124,7 +1134,7 @@ QResource::registerResource(const uchar *rccData, const QString &resourceRoot) } QDynamicBufferResourceRoot *root = new QDynamicBufferResourceRoot(r); - if(root->registerSelf(rccData)) { + if (root->registerSelf(rccData, -1)) { root->ref.ref(); QMutexLocker lock(resourceMutex()); resourceList()->append(root); diff --git a/src/corelib/io/qresource_iterator_p.h b/src/corelib/io/qresource_iterator_p.h index 451773ec63..dce298fb44 100644 --- a/src/corelib/io/qresource_iterator_p.h +++ b/src/corelib/io/qresource_iterator_p.h @@ -57,10 +57,10 @@ public: QResourceFileEngineIterator(QDir::Filters filters, const QStringList &filterNames); ~QResourceFileEngineIterator(); - QString next(); - bool hasNext() const; + QString next() Q_DECL_OVERRIDE; + bool hasNext() const Q_DECL_OVERRIDE; - QString currentFileName() const; + QString currentFileName() const Q_DECL_OVERRIDE; private: mutable QStringList entries; diff --git a/src/corelib/io/qresource_p.h b/src/corelib/io/qresource_p.h index 030d1587e5..11b2836215 100644 --- a/src/corelib/io/qresource_p.h +++ b/src/corelib/io/qresource_p.h @@ -58,52 +58,52 @@ public: explicit QResourceFileEngine(const QString &path); ~QResourceFileEngine(); - virtual void setFileName(const QString &file); + virtual void setFileName(const QString &file) Q_DECL_OVERRIDE; - virtual bool open(QIODevice::OpenMode flags) ; - virtual bool close(); - virtual bool flush(); - virtual qint64 size() const; - virtual qint64 pos() const; + virtual bool open(QIODevice::OpenMode flags) Q_DECL_OVERRIDE ; + virtual bool close() Q_DECL_OVERRIDE; + virtual bool flush() Q_DECL_OVERRIDE; + virtual qint64 size() const Q_DECL_OVERRIDE; + virtual qint64 pos() const Q_DECL_OVERRIDE; virtual bool atEnd() const; - virtual bool seek(qint64); - virtual qint64 read(char *data, qint64 maxlen); - virtual qint64 write(const char *data, qint64 len); + virtual bool seek(qint64) Q_DECL_OVERRIDE; + virtual qint64 read(char *data, qint64 maxlen) Q_DECL_OVERRIDE; + virtual qint64 write(const char *data, qint64 len) Q_DECL_OVERRIDE; - virtual bool remove(); - virtual bool copy(const QString &newName); - virtual bool rename(const QString &newName); - virtual bool link(const QString &newName); + virtual bool remove() Q_DECL_OVERRIDE; + virtual bool copy(const QString &newName) Q_DECL_OVERRIDE; + virtual bool rename(const QString &newName) Q_DECL_OVERRIDE; + virtual bool link(const QString &newName) Q_DECL_OVERRIDE; - virtual bool isSequential() const; + virtual bool isSequential() const Q_DECL_OVERRIDE; - virtual bool isRelativePath() const; + virtual bool isRelativePath() const Q_DECL_OVERRIDE; - virtual bool mkdir(const QString &dirName, bool createParentDirectories) const; - virtual bool rmdir(const QString &dirName, bool recurseParentDirectories) const; + virtual bool mkdir(const QString &dirName, bool createParentDirectories) const Q_DECL_OVERRIDE; + virtual bool rmdir(const QString &dirName, bool recurseParentDirectories) const Q_DECL_OVERRIDE; - virtual bool setSize(qint64 size); + virtual bool setSize(qint64 size) Q_DECL_OVERRIDE; - virtual QStringList entryList(QDir::Filters filters, const QStringList &filterNames) const; + virtual QStringList entryList(QDir::Filters filters, const QStringList &filterNames) const Q_DECL_OVERRIDE; - virtual bool caseSensitive() const; + virtual bool caseSensitive() const Q_DECL_OVERRIDE; - virtual FileFlags fileFlags(FileFlags type) const; + virtual FileFlags fileFlags(FileFlags type) const Q_DECL_OVERRIDE; - virtual bool setPermissions(uint perms); + virtual bool setPermissions(uint perms) Q_DECL_OVERRIDE; - virtual QString fileName(QAbstractFileEngine::FileName file) const; + virtual QString fileName(QAbstractFileEngine::FileName file) const Q_DECL_OVERRIDE; - virtual uint ownerId(FileOwner) const; - virtual QString owner(FileOwner) const; + virtual uint ownerId(FileOwner) const Q_DECL_OVERRIDE; + virtual QString owner(FileOwner) const Q_DECL_OVERRIDE; - virtual QDateTime fileTime(FileTime time) const; + virtual QDateTime fileTime(FileTime time) const Q_DECL_OVERRIDE; - virtual Iterator *beginEntryList(QDir::Filters filters, const QStringList &filterNames); - virtual Iterator *endEntryList(); + virtual Iterator *beginEntryList(QDir::Filters filters, const QStringList &filterNames) Q_DECL_OVERRIDE; + virtual Iterator *endEntryList() Q_DECL_OVERRIDE; - bool extension(Extension extension, const ExtensionOption *option = 0, ExtensionReturn *output = 0); - bool supportsExtension(Extension extension) const; + bool extension(Extension extension, const ExtensionOption *option = 0, ExtensionReturn *output = 0) Q_DECL_OVERRIDE; + bool supportsExtension(Extension extension) const Q_DECL_OVERRIDE; }; QT_END_NAMESPACE diff --git a/src/corelib/io/qsettings.h b/src/corelib/io/qsettings.h index 4986c06896..1ce2865c63 100644 --- a/src/corelib/io/qsettings.h +++ b/src/corelib/io/qsettings.h @@ -177,7 +177,7 @@ public: protected: #ifndef QT_NO_QOBJECT - bool event(QEvent *event); + bool event(QEvent *event) Q_DECL_OVERRIDE; #endif private: diff --git a/src/corelib/io/qsettings_p.h b/src/corelib/io/qsettings_p.h index 715f13530a..0525fab77a 100644 --- a/src/corelib/io/qsettings_p.h +++ b/src/corelib/io/qsettings_p.h @@ -270,17 +270,17 @@ public: QConfFileSettingsPrivate(const QString &fileName, QSettings::Format format); ~QConfFileSettingsPrivate(); - void remove(const QString &key); - void set(const QString &key, const QVariant &value); - bool get(const QString &key, QVariant *value) const; + void remove(const QString &key) Q_DECL_OVERRIDE; + void set(const QString &key, const QVariant &value) Q_DECL_OVERRIDE; + bool get(const QString &key, QVariant *value) const Q_DECL_OVERRIDE; - QStringList children(const QString &prefix, ChildSpec spec) const; + QStringList children(const QString &prefix, ChildSpec spec) const Q_DECL_OVERRIDE; - void clear(); - void sync(); - void flush(); - bool isWritable() const; - QString fileName() const; + void clear() Q_DECL_OVERRIDE; + void sync() Q_DECL_OVERRIDE; + void flush() Q_DECL_OVERRIDE; + bool isWritable() const Q_DECL_OVERRIDE; + QString fileName() const Q_DECL_OVERRIDE; bool readIniFile(const QByteArray &data, UnparsedSettingsMap *unparsedIniSections); static bool readIniSection(const QSettingsKey §ion, const QByteArray &data, diff --git a/src/corelib/io/qstorageinfo_p.h b/src/corelib/io/qstorageinfo_p.h index 9c8e51f475..dea25d440d 100644 --- a/src/corelib/io/qstorageinfo_p.h +++ b/src/corelib/io/qstorageinfo_p.h @@ -73,14 +73,14 @@ public: protected: #if defined(Q_OS_WIN) && !defined(Q_OS_WINCE) && !defined(Q_OS_WINRT) - void retreiveVolumeInfo(); - void retreiveDiskFreeSpace(); + void retrieveVolumeInfo(); + void retrieveDiskFreeSpace(); #elif defined(Q_OS_MAC) void retrievePosixInfo(); void retrieveUrlProperties(bool initRootPath = false); void retrieveLabel(); #elif defined(Q_OS_UNIX) - void retreiveVolumeInfo(); + void retrieveVolumeInfo(); #endif public: diff --git a/src/corelib/io/qstorageinfo_unix.cpp b/src/corelib/io/qstorageinfo_unix.cpp index e82737c51c..bec7420dc7 100644 --- a/src/corelib/io/qstorageinfo_unix.cpp +++ b/src/corelib/io/qstorageinfo_unix.cpp @@ -401,11 +401,11 @@ void QStorageInfoPrivate::doStat() if (rootPath.isEmpty()) return; - retreiveVolumeInfo(); + retrieveVolumeInfo(); name = retrieveLabel(device); } -void QStorageInfoPrivate::retreiveVolumeInfo() +void QStorageInfoPrivate::retrieveVolumeInfo() { QT_STATFSBUF statfs_buf; int result; diff --git a/src/corelib/io/qstorageinfo_win.cpp b/src/corelib/io/qstorageinfo_win.cpp index 8c276b2798..51a268f58c 100644 --- a/src/corelib/io/qstorageinfo_win.cpp +++ b/src/corelib/io/qstorageinfo_win.cpp @@ -114,12 +114,12 @@ void QStorageInfoPrivate::doStat() if (rootPath.isEmpty()) return; - retreiveVolumeInfo(); + retrieveVolumeInfo(); device = getDevice(rootPath); - retreiveDiskFreeSpace(); + retrieveDiskFreeSpace(); } -void QStorageInfoPrivate::retreiveVolumeInfo() +void QStorageInfoPrivate::retrieveVolumeInfo() { const UINT oldmode = ::SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOOPENFILEERRORBOX); @@ -151,7 +151,7 @@ void QStorageInfoPrivate::retreiveVolumeInfo() ::SetErrorMode(oldmode); } -void QStorageInfoPrivate::retreiveDiskFreeSpace() +void QStorageInfoPrivate::retrieveDiskFreeSpace() { const UINT oldmode = ::SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOOPENFILEERRORBOX); diff --git a/src/corelib/io/qtemporaryfile.cpp b/src/corelib/io/qtemporaryfile.cpp index 4a9aafcf0b..c96d0504f4 100644 --- a/src/corelib/io/qtemporaryfile.cpp +++ b/src/corelib/io/qtemporaryfile.cpp @@ -222,6 +222,7 @@ static bool createFileFromTemplate(NativeFileHandle &file, } Q_ASSERT(false); + return false; } //************* QTemporaryFileEngine diff --git a/src/corelib/io/qtemporaryfile.h b/src/corelib/io/qtemporaryfile.h index 908cc231af..f21f87fd21 100644 --- a/src/corelib/io/qtemporaryfile.h +++ b/src/corelib/io/qtemporaryfile.h @@ -71,7 +71,7 @@ public: // ### Hides open(flags) bool open() { return open(QIODevice::ReadWrite); } - QString fileName() const; + QString fileName() const Q_DECL_OVERRIDE; QString fileTemplate() const; void setFileTemplate(const QString &name); #if QT_DEPRECATED_SINCE(5,1) @@ -85,7 +85,7 @@ public: static QTemporaryFile *createNativeFile(QFile &file); protected: - bool open(OpenMode flags); + bool open(OpenMode flags) Q_DECL_OVERRIDE; private: friend class QFile; diff --git a/src/corelib/io/qtextstream.cpp b/src/corelib/io/qtextstream.cpp index 089a915a36..18cf58d397 100644 --- a/src/corelib/io/qtextstream.cpp +++ b/src/corelib/io/qtextstream.cpp @@ -827,6 +827,21 @@ inline void QTextStreamPrivate::write(const QString &data) /*! \internal */ +inline void QTextStreamPrivate::write(QChar ch) +{ + if (string) { + // ### What about seek()?? + string->append(ch); + } else { + writeBuffer += ch; + if (writeBuffer.size() > QTEXTSTREAM_BUFFERSIZE) + flushWriteBuffer(); + } +} + +/*! + \internal +*/ inline bool QTextStreamPrivate::getChar(QChar *ch) { if ((string && stringOffset == string->size()) @@ -865,6 +880,17 @@ inline void QTextStreamPrivate::ungetChar(QChar ch) /*! \internal */ +inline void QTextStreamPrivate::putChar(QChar ch) +{ + if (params.fieldWidth > 0) + putString(QString(ch)); + else + write(ch); +} + +/*! + \internal +*/ inline void QTextStreamPrivate::putString(const QString &s, bool number) { QString tmp = s; @@ -2232,7 +2258,7 @@ QTextStream &QTextStream::operator<<(QChar c) { Q_D(QTextStream); CHECK_VALID_STREAM(*this); - d->putString(QString(c)); + d->putChar(c); return *this; } @@ -2245,7 +2271,7 @@ QTextStream &QTextStream::operator<<(char c) { Q_D(QTextStream); CHECK_VALID_STREAM(*this); - d->putString(QString(QChar::fromLatin1(c))); + d->putChar(QChar::fromLatin1(c)); return *this; } diff --git a/src/corelib/io/qtextstream_p.h b/src/corelib/io/qtextstream_p.h index 5f99f44cc2..b7281e42ad 100644 --- a/src/corelib/io/qtextstream_p.h +++ b/src/corelib/io/qtextstream_p.h @@ -166,7 +166,9 @@ public: bool getReal(double *f); inline void write(const QString &data); + inline void write(QChar ch); inline void putString(const QString &ch, bool number = false); + inline void putChar(QChar ch); void putNumber(qulonglong number, bool negative); // buffers |