diff options
Diffstat (limited to 'src/corelib/io')
37 files changed, 289 insertions, 215 deletions
diff --git a/src/corelib/io/qbuffer.h b/src/corelib/io/qbuffer.h index 1b2758d040..233c702213 100644 --- a/src/corelib/io/qbuffer.h +++ b/src/corelib/io/qbuffer.h @@ -51,8 +51,8 @@ class Q_CORE_EXPORT QBuffer : public QIODevice public: #ifndef QT_NO_QOBJECT - explicit QBuffer(QObject *parent = 0); - QBuffer(QByteArray *buf, QObject *parent = 0); + explicit QBuffer(QObject *parent = Q_NULLPTR); + QBuffer(QByteArray *buf, QObject *parent = Q_NULLPTR); #else QBuffer(); explicit QBuffer(QByteArray *buf); diff --git a/src/corelib/io/qdatastream.h b/src/corelib/io/qdatastream.h index 436bf8dd57..b87dbe4784 100644 --- a/src/corelib/io/qdatastream.h +++ b/src/corelib/io/qdatastream.h @@ -83,10 +83,11 @@ public: Qt_5_3 = Qt_5_2, Qt_5_4 = 16, Qt_5_5 = Qt_5_4, -#if QT_VERSION >= 0x050600 + Qt_5_6 = Qt_5_5, +#if QT_VERSION >= 0x050700 #error Add the datastream version for this Qt version and update Qt_DefaultCompiledVersion #endif - Qt_DefaultCompiledVersion = Qt_5_5 + Qt_DefaultCompiledVersion = Qt_5_6 }; enum ByteOrder { diff --git a/src/corelib/io/qdebug.cpp b/src/corelib/io/qdebug.cpp index 357d63137c..8676fe0259 100644 --- a/src/corelib/io/qdebug.cpp +++ b/src/corelib/io/qdebug.cpp @@ -334,6 +334,7 @@ QDebug &QDebug::resetFormat() stream->space = true; if (stream->context.version > 1) stream->flags = 0; + stream->setVerbosity(Stream::defaultVerbosity); return *this; } @@ -424,6 +425,32 @@ QDebug &QDebug::resetFormat() */ /*! + \fn int QDebug::verbosity() const + \since 5.6 + + Returns the verbosity of the debug stream. + + Streaming operators can check the value to decide whether + verbose output is desired and print more information depending on the + level. Higher values indicate that more information is desired. + + The allowed range is from 0 to 7. The default value is 2. + + \sa setVerbosity() +*/ + +/*! + \fn void QDebug::setVerbosity(int verbosityLevel) + \since 5.6 + + Sets the verbosity of the stream to \a verbosityLevel. + + The allowed range is from 0 to 7. The default value is 2. + + \sa verbosity() +*/ + +/*! \fn QDebug &QDebug::operator<<(QChar t) Writes the character, \a t, to the stream and returns a reference to the diff --git a/src/corelib/io/qdebug.h b/src/corelib/io/qdebug.h index 59bd32e9a4..9391799624 100644 --- a/src/corelib/io/qdebug.h +++ b/src/corelib/io/qdebug.h @@ -53,9 +53,14 @@ class Q_CORE_EXPORT QDebug friend class QMessageLogger; friend class QDebugStateSaverPrivate; struct Stream { - Stream(QIODevice *device) : ts(device), ref(1), type(QtDebugMsg), space(true), message_output(false), flags(0) {} - Stream(QString *string) : ts(string, QIODevice::WriteOnly), ref(1), type(QtDebugMsg), space(true), message_output(false), flags(0) {} - Stream(QtMsgType t) : ts(&buffer, QIODevice::WriteOnly), ref(1), type(t), space(true), message_output(true), flags(0) {} + enum { defaultVerbosity = 2, verbosityShift = 29, verbosityMask = 0x7 }; + + Stream(QIODevice *device) : ts(device), ref(1), type(QtDebugMsg), + space(true), message_output(false), flags(defaultVerbosity << verbosityShift) {} + Stream(QString *string) : ts(string, QIODevice::WriteOnly), ref(1), type(QtDebugMsg), + space(true), message_output(false), flags(defaultVerbosity << verbosityShift) {} + Stream(QtMsgType t) : ts(&buffer, QIODevice::WriteOnly), ref(1), type(t), + space(true), message_output(true), flags(defaultVerbosity << verbosityShift) {} QTextStream ts; QString buffer; int ref; @@ -64,7 +69,7 @@ class Q_CORE_EXPORT QDebug bool message_output; QMessageLogContext context; - enum FormatFlag { + enum FormatFlag { // Note: Bits 29..31 are reserved for the verbose level introduced in 5.6. NoQuotes = 0x1 }; @@ -72,7 +77,15 @@ class Q_CORE_EXPORT QDebug bool testFlag(FormatFlag flag) const { return (context.version > 1) ? (flags & flag) : false; } void setFlag(FormatFlag flag) { if (context.version > 1) { flags |= flag; } } void unsetFlag(FormatFlag flag) { if (context.version > 1) { flags &= ~flag; } } - + int verbosity() const + { return context.version > 1 ? (flags >> verbosityShift) & verbosityMask : int(Stream::defaultVerbosity); } + void setVerbosity(int v) + { + if (context.version > 1) { + flags &= ~(verbosityMask << verbosityShift); + flags |= (v & verbosityMask) << verbosityShift; + } + } // added in 5.4 int flags; } *stream; @@ -96,6 +109,8 @@ public: inline QDebug &space() { stream->space = true; stream->ts << ' '; return *this; } inline QDebug &nospace() { stream->space = false; return *this; } inline QDebug &maybeSpace() { if (stream->space) stream->ts << ' '; return *this; } + int verbosity() const { return stream->verbosity(); } + void setVerbosity(int verbosityLevel) { stream->setVerbosity(verbosityLevel); } bool autoInsertSpaces() const { return stream->space; } void setAutoInsertSpaces(bool b) { stream->space = b; } diff --git a/src/corelib/io/qdir.cpp b/src/corelib/io/qdir.cpp index 6687ff846c..2ae865a534 100644 --- a/src/corelib/io/qdir.cpp +++ b/src/corelib/io/qdir.cpp @@ -1828,6 +1828,8 @@ QFileInfoList QDir::drives() underlying operating system. If you want to display paths to the user using their operating system's separator use toNativeSeparators(). + + \sa listSeparator() */ QChar QDir::separator() { @@ -1839,6 +1841,16 @@ QChar QDir::separator() } /*! + \fn QDir::listSeparator() + \since 5.6 + + Returns the native path list separator: ':' under Unix + and ';' under Windows. + + \sa separator() +*/ + +/*! Sets the application's current working directory to \a path. Returns \c true if the directory was successfully changed; otherwise returns \c false. diff --git a/src/corelib/io/qdir.h b/src/corelib/io/qdir.h index e622011f98..ab3a331229 100644 --- a/src/corelib/io/qdir.h +++ b/src/corelib/io/qdir.h @@ -101,11 +101,10 @@ public: QDir &operator=(const QDir &); QDir &operator=(const QString &path); #ifdef Q_COMPILER_RVALUE_REFS - inline QDir &operator=(QDir &&other) - { qSwap(d_ptr, other.d_ptr); return *this; } + QDir &operator=(QDir &&other) Q_DECL_NOTHROW { swap(other); return *this; } #endif - inline void swap(QDir &other) + void swap(QDir &other) Q_DECL_NOTHROW { qSwap(d_ptr, other.d_ptr); } void setPath(const QString &path); @@ -177,7 +176,16 @@ public: static QFileInfoList drives(); - static QChar separator(); + Q_DECL_CONSTEXPR static inline QChar listSeparator() Q_DECL_NOTHROW + { +#if defined(Q_OS_WIN) + return QLatin1Char(';'); +#else + return QLatin1Char(':'); +#endif + } + + static QChar separator(); // ### Qt6: Make it inline static bool setCurrent(const QString &path); static inline QDir current() { return QDir(currentPath()); } diff --git a/src/corelib/io/qfile.h b/src/corelib/io/qfile.h index 35a73680af..4eac710d4c 100644 --- a/src/corelib/io/qfile.h +++ b/src/corelib/io/qfile.h @@ -134,7 +134,7 @@ protected: #ifdef QT_NO_QOBJECT QFile(QFilePrivate &dd); #else - QFile(QFilePrivate &dd, QObject *parent = 0); + QFile(QFilePrivate &dd, QObject *parent = Q_NULLPTR); #endif private: diff --git a/src/corelib/io/qfiledevice.cpp b/src/corelib/io/qfiledevice.cpp index 3ee0e33573..4c5ed0aef6 100644 --- a/src/corelib/io/qfiledevice.cpp +++ b/src/corelib/io/qfiledevice.cpp @@ -481,7 +481,7 @@ bool QFileDevicePrivate::putCharHelper(char c) #else // Cutoff for code that doesn't only touch the buffer. - int writeBufferSize = writeBuffer.size(); + qint64 writeBufferSize = writeBuffer.size(); if ((openMode & QIODevice::Unbuffered) || writeBufferSize + 1 >= QFILE_WRITEBUFFER_SIZE #ifdef Q_OS_WIN || ((openMode & QIODevice::Text) && c == '\n' && writeBufferSize + 2 >= QFILE_WRITEBUFFER_SIZE) diff --git a/src/corelib/io/qfiledevice.h b/src/corelib/io/qfiledevice.h index e9320d8d31..afa42bd86b 100644 --- a/src/corelib/io/qfiledevice.h +++ b/src/corelib/io/qfiledevice.h @@ -119,7 +119,7 @@ protected: QFileDevice(QFileDevicePrivate &dd); #else explicit QFileDevice(QObject *parent); - QFileDevice(QFileDevicePrivate &dd, QObject *parent = 0); + QFileDevice(QFileDevicePrivate &dd, QObject *parent = Q_NULLPTR); #endif qint64 readData(char *data, qint64 maxlen) Q_DECL_OVERRIDE; diff --git a/src/corelib/io/qfileinfo.h b/src/corelib/io/qfileinfo.h index 58cf9a5c0f..59d12c3883 100644 --- a/src/corelib/io/qfileinfo.h +++ b/src/corelib/io/qfileinfo.h @@ -62,11 +62,10 @@ public: QFileInfo &operator=(const QFileInfo &fileinfo); #ifdef Q_COMPILER_RVALUE_REFS - inline QFileInfo&operator=(QFileInfo &&other) - { qSwap(d_ptr, other.d_ptr); return *this; } + QFileInfo &operator=(QFileInfo &&other) Q_DECL_NOTHROW { swap(other); return *this; } #endif - inline void swap(QFileInfo &other) + void swap(QFileInfo &other) Q_DECL_NOTHROW { qSwap(d_ptr, other.d_ptr); } bool operator==(const QFileInfo &fileinfo) const; diff --git a/src/corelib/io/qfileselector.h b/src/corelib/io/qfileselector.h index 967d5eee75..9ee3588780 100644 --- a/src/corelib/io/qfileselector.h +++ b/src/corelib/io/qfileselector.h @@ -44,7 +44,7 @@ class Q_CORE_EXPORT QFileSelector : public QObject { Q_OBJECT public: - explicit QFileSelector(QObject *parent = 0); + explicit QFileSelector(QObject *parent = Q_NULLPTR); ~QFileSelector(); QString select(const QString &filePath) const; diff --git a/src/corelib/io/qfilesystemwatcher.h b/src/corelib/io/qfilesystemwatcher.h index 13d1782913..095b50d1e5 100644 --- a/src/corelib/io/qfilesystemwatcher.h +++ b/src/corelib/io/qfilesystemwatcher.h @@ -49,8 +49,8 @@ class Q_CORE_EXPORT QFileSystemWatcher : public QObject Q_DECLARE_PRIVATE(QFileSystemWatcher) public: - QFileSystemWatcher(QObject *parent = 0); - QFileSystemWatcher(const QStringList &paths, QObject *parent = 0); + QFileSystemWatcher(QObject *parent = Q_NULLPTR); + QFileSystemWatcher(const QStringList &paths, QObject *parent = Q_NULLPTR); ~QFileSystemWatcher(); bool addPath(const QString &file); diff --git a/src/corelib/io/qfilesystemwatcher_fsevents.mm b/src/corelib/io/qfilesystemwatcher_fsevents.mm index 8a028c91e1..7656530a46 100644 --- a/src/corelib/io/qfilesystemwatcher_fsevents.mm +++ b/src/corelib/io/qfilesystemwatcher_fsevents.mm @@ -56,25 +56,6 @@ QT_BEGIN_NAMESPACE -namespace { -class RaiiAutoreleasePool -{ - Q_DISABLE_COPY(RaiiAutoreleasePool) - -public: - RaiiAutoreleasePool() - : pool([[NSAutoreleasePool alloc] init]) - {} - - ~RaiiAutoreleasePool() - { [pool release]; } - -private: - NSAutoreleasePool *pool; -}; -#define Q_AUTORELEASE_POOL(pool) RaiiAutoreleasePool pool; Q_UNUSED(pool); -} - static void callBackFunction(ConstFSEventStreamRef streamRef, void *clientCallBackInfo, size_t numEvents, @@ -82,7 +63,7 @@ static void callBackFunction(ConstFSEventStreamRef streamRef, const FSEventStreamEventFlags eventFlags[], const FSEventStreamEventId eventIds[]) { - Q_AUTORELEASE_POOL(pool) + QMacAutoReleasePool pool; char **paths = static_cast<char **>(eventPaths); QFseventsFileSystemWatcherEngine *engine = static_cast<QFseventsFileSystemWatcherEngine *>(clientCallBackInfo); @@ -297,7 +278,7 @@ void QFseventsFileSystemWatcherEngine::doEmitDirectoryChanged(const QString &pat void QFseventsFileSystemWatcherEngine::restartStream() { - Q_AUTORELEASE_POOL(pool) + QMacAutoReleasePool pool; QMutexLocker locker(&lock); stopStream(); startStream(); @@ -328,7 +309,7 @@ QFseventsFileSystemWatcherEngine::QFseventsFileSystemWatcherEngine(QObject *pare QFseventsFileSystemWatcherEngine::~QFseventsFileSystemWatcherEngine() { - Q_AUTORELEASE_POOL(pool) + QMacAutoReleasePool pool; if (stream) FSEventStreamStop(stream); @@ -344,7 +325,7 @@ QStringList QFseventsFileSystemWatcherEngine::addPaths(const QStringList &paths, QStringList *files, QStringList *directories) { - Q_AUTORELEASE_POOL(pool) + QMacAutoReleasePool pool; if (stream) { DEBUG("Flushing, last id is %llu", FSEventStreamGetLatestEventId(stream)); @@ -432,7 +413,7 @@ QStringList QFseventsFileSystemWatcherEngine::removePaths(const QStringList &pat QStringList *files, QStringList *directories) { - Q_AUTORELEASE_POOL(pool) + QMacAutoReleasePool pool; QMutexLocker locker(&lock); @@ -489,7 +470,7 @@ QStringList QFseventsFileSystemWatcherEngine::removePaths(const QStringList &pat bool QFseventsFileSystemWatcherEngine::startStream() { Q_ASSERT(stream == 0); - Q_AUTORELEASE_POOL(pool) + QMacAutoReleasePool pool; if (stream) // This shouldn't happen, but let's be nice and handle it. stopStream(); diff --git a/src/corelib/io/qiodevice.cpp b/src/corelib/io/qiodevice.cpp index b908ae3145..f0d3250cd2 100644 --- a/src/corelib/io/qiodevice.cpp +++ b/src/corelib/io/qiodevice.cpp @@ -39,6 +39,7 @@ #include "qfile.h" #include "qstringlist.h" #include "qdir.h" +#include "private/qbytearray_p.h" #include <algorithm> @@ -692,12 +693,13 @@ bool QIODevice::seek(qint64 pos) bool QIODevice::atEnd() const { Q_D(const QIODevice); + const bool result = (d->openMode == NotOpen || (d->buffer.isEmpty() + && bytesAvailable() == 0)); #if defined QIODEVICE_DEBUG printf("%p QIODevice::atEnd() returns %s, d->openMode == %d, d->pos == %lld\n", this, - (d->openMode == NotOpen || d->pos == size()) ? "true" : "false", int(d->openMode), - d->pos); + result ? "true" : "false", int(d->openMode), d->pos); #endif - return d->openMode == NotOpen || (d->buffer.isEmpty() && bytesAvailable() == 0); + return result; } /*! @@ -941,9 +943,9 @@ QByteArray QIODevice::read(qint64 maxSize) Q_UNUSED(d); #endif - if (quint64(maxSize) >= QByteArray::MaxSize) { + if (maxSize >= MaxByteArraySize) { checkWarnMessage(this, "read", "maxSize argument exceeds QByteArray size limit"); - maxSize = QByteArray::MaxSize - 1; + maxSize = MaxByteArraySize - 1; } qint64 readBytes = 0; @@ -990,40 +992,31 @@ QByteArray QIODevice::readAll() #endif QByteArray result; - qint64 readBytes = 0; - const bool sequential = d->isSequential(); - - // flush internal read buffer - if (!(d->openMode & Text) && !d->buffer.isEmpty()) { - if (quint64(d->buffer.size()) >= QByteArray::MaxSize) - return QByteArray(); - result = d->buffer.readAll(); - readBytes = result.size(); - if (!sequential) - d->pos += readBytes; - } - - qint64 theSize; - if (sequential || (theSize = size()) == 0) { + qint64 readBytes = (d->isSequential() ? Q_INT64_C(0) : size()); + if (readBytes == 0) { // Size is unknown, read incrementally. + qint64 readChunkSize = qMax(d->buffer.size(), QIODEVICE_BUFFERSIZE); qint64 readResult; do { - if (quint64(readBytes) + QIODEVICE_BUFFERSIZE > QByteArray::MaxSize) { + if (readBytes + readChunkSize >= MaxByteArraySize) { // If resize would fail, don't read more, return what we have. break; } - result.resize(readBytes + QIODEVICE_BUFFERSIZE); - readResult = read(result.data() + readBytes, QIODEVICE_BUFFERSIZE); - if (readResult > 0 || readBytes == 0) + result.resize(readBytes + readChunkSize); + readResult = read(result.data() + readBytes, readChunkSize); + if (readResult > 0 || readBytes == 0) { readBytes += readResult; + readChunkSize = QIODEVICE_BUFFERSIZE; + } } while (readResult > 0); } else { // Read it all in one go. // If resize fails, don't read anything. - if (quint64(readBytes + theSize - d->pos) > QByteArray::MaxSize) + readBytes -= d->pos; + if (readBytes >= MaxByteArraySize) return QByteArray(); - result.resize(int(readBytes + theSize - d->pos)); - readBytes += read(result.data() + readBytes, result.size() - readBytes); + result.resize(readBytes); + readBytes = read(result.data(), readBytes); } if (readBytes <= 0) @@ -1178,9 +1171,9 @@ QByteArray QIODevice::readLine(qint64 maxSize) Q_UNUSED(d); #endif - if (quint64(maxSize) >= QByteArray::MaxSize) { + if (maxSize >= MaxByteArraySize) { qWarning("QIODevice::read: maxSize argument exceeds QByteArray size limit"); - maxSize = QByteArray::MaxSize - 1; + maxSize = MaxByteArraySize - 1; } result.resize(int(maxSize)); @@ -1188,7 +1181,7 @@ QByteArray QIODevice::readLine(qint64 maxSize) if (!result.size()) { // If resize fails or maxSize == 0, read incrementally if (maxSize == 0) - maxSize = QByteArray::MaxSize - 1; + maxSize = MaxByteArraySize - 1; // The first iteration needs to leave an extra byte for the terminating null result.resize(1); diff --git a/src/corelib/io/qiodevice.h b/src/corelib/io/qiodevice.h index 4f45805fca..b62c8d266c 100644 --- a/src/corelib/io/qiodevice.h +++ b/src/corelib/io/qiodevice.h @@ -140,7 +140,7 @@ protected: #ifdef QT_NO_QOBJECT QIODevice(QIODevicePrivate &dd); #else - QIODevice(QIODevicePrivate &dd, QObject *parent = 0); + QIODevice(QIODevicePrivate &dd, QObject *parent = Q_NULLPTR); #endif virtual qint64 readData(char *data, qint64 maxlen) = 0; virtual qint64 readLineData(char *data, qint64 maxlen); diff --git a/src/corelib/io/qprocess.cpp b/src/corelib/io/qprocess.cpp index 1842541644..218e8b959c 100644 --- a/src/corelib/io/qprocess.cpp +++ b/src/corelib/io/qprocess.cpp @@ -110,7 +110,6 @@ QT_BEGIN_NAMESPACE \ingroup io \ingroup misc \ingroup shared - \mainclass \reentrant \since 4.6 @@ -898,6 +897,49 @@ void QProcessPrivate::cleanup() /*! \internal +*/ +void QProcessPrivate::setError(QProcess::ProcessError error, const QString &description) +{ + processError = error; + if (description.isEmpty()) { + switch (error) { + case QProcess::FailedToStart: + errorString = QProcess::tr("Process failed to start"); + break; + case QProcess::Crashed: + errorString = QProcess::tr("Process crashed"); + break; + case QProcess::Timedout: + errorString = QProcess::tr("Process operation timed out"); + break; + case QProcess::ReadError: + errorString = QProcess::tr("Error reading from process"); + break; + case QProcess::WriteError: + errorString = QProcess::tr("Error writing to process"); + break; + case QProcess::UnknownError: + errorString.clear(); + break; + } + } else { + errorString = description; + } +} + +/*! + \internal +*/ +void QProcessPrivate::setErrorAndEmit(QProcess::ProcessError error, const QString &description) +{ + Q_Q(QProcess); + Q_ASSERT(error != QProcess::UnknownError); + setError(error, description); + emit q->error(processError); +} + +/*! + \internal Returns true if we emitted readyRead(). */ bool QProcessPrivate::tryReadFromChannel(Channel *channel) @@ -919,9 +961,7 @@ bool QProcessPrivate::tryReadFromChannel(Channel *channel) return false; } if (readBytes == -1) { - processError = QProcess::ReadError; - q->setErrorString(QProcess::tr("Error reading from process")); - emit q->error(processError); + setErrorAndEmit(QProcess::ReadError); #if defined QPROCESS_DEBUG qDebug("QProcessPrivate::tryReadFromChannel(%d), failed to read from the process", channel - &stdinChannel); #endif @@ -1005,9 +1045,7 @@ bool QProcessPrivate::_q_canWrite() stdinChannel.buffer.nextDataBlockSize()); if (written < 0) { closeChannel(&stdinChannel); - processError = QProcess::WriteError; - q->setErrorString(QProcess::tr("Error writing to process")); - emit q->error(processError); + setErrorAndEmit(QProcess::WriteError); return false; } @@ -1076,9 +1114,7 @@ bool QProcessPrivate::_q_processDied() if (crashed) { exitStatus = QProcess::CrashExit; - processError = QProcess::Crashed; - q->setErrorString(QProcess::tr("Process crashed")); - emit q->error(processError); + setErrorAndEmit(QProcess::Crashed); } else { #ifdef QPROCESS_USE_SPAWN // if we're using posix_spawn, waitForStarted always succeeds. @@ -1086,8 +1122,8 @@ bool QProcessPrivate::_q_processDied() // 127 if anything prevents the target program from starting. // http://pubs.opengroup.org/onlinepubs/009695399/functions/posix_spawn.html if (exitStatus == QProcess::NormalExit && exitCode == 127) { - processError = QProcess::FailedToStart; - q->setErrorString(QProcess::tr("Process failed to start (spawned process exited with code 127)")); + setError(QProcess::FailedToStart, + QProcess::tr("Process failed to start (spawned process exited with code 127)")); } #endif } @@ -1131,8 +1167,7 @@ bool QProcessPrivate::_q_startupNotification() } q->setProcessState(QProcess::NotRunning); - processError = QProcess::FailedToStart; - emit q->error(processError); + setErrorAndEmit(QProcess::FailedToStart); #ifdef Q_OS_UNIX // make sure the process manager removes this entry waitForDeadChild(); @@ -1911,12 +1946,12 @@ qint64 QProcess::readData(char *data, qint64 maxlen) return 1; } - qint64 bytesToRead = qint64(qMin(readBuffer->size(), (int)maxlen)); + qint64 bytesToRead = qMin(readBuffer->size(), maxlen); qint64 readSoFar = 0; while (readSoFar < bytesToRead) { const char *ptr = readBuffer->readPointer(); - int bytesToReadFromThisBlock = qMin<qint64>(bytesToRead - readSoFar, - readBuffer->nextDataBlockSize()); + qint64 bytesToReadFromThisBlock = qMin(bytesToRead - readSoFar, + readBuffer->nextDataBlockSize()); memcpy(data + readSoFar, ptr, bytesToReadFromThisBlock); readSoFar += bytesToReadFromThisBlock; readBuffer->free(bytesToReadFromThisBlock); @@ -1940,9 +1975,7 @@ qint64 QProcess::writeData(const char *data, qint64 len) #if defined(Q_OS_WINCE) Q_UNUSED(data); Q_UNUSED(len); - d->processError = QProcess::WriteError; - setErrorString(tr("Error writing to process")); - emit error(d->processError); + d->setErrorAndEmit(QProcess::WriteError); return -1; #endif @@ -2221,9 +2254,7 @@ void QProcess::start(const QString &command, OpenMode mode) QStringList args = parseCombinedArgString(command); if (args.isEmpty()) { Q_D(QProcess); - d->processError = QProcess::FailedToStart; - setErrorString(tr("No program defined")); - emit error(d->processError); + d->setErrorAndEmit(QProcess::FailedToStart, tr("No program defined")); return; } diff --git a/src/corelib/io/qprocess.h b/src/corelib/io/qprocess.h index 078217ea0b..81b3ac81d0 100644 --- a/src/corelib/io/qprocess.h +++ b/src/corelib/io/qprocess.h @@ -60,9 +60,12 @@ public: QProcessEnvironment(); QProcessEnvironment(const QProcessEnvironment &other); ~QProcessEnvironment(); +#ifdef Q_COMPILER_RVALUE_REFS + QProcessEnvironment &operator=(QProcessEnvironment && other) Q_DECL_NOTHROW { swap(other); return *this; } +#endif QProcessEnvironment &operator=(const QProcessEnvironment &other); - inline void swap(QProcessEnvironment &other) { qSwap(d, other.d); } + void swap(QProcessEnvironment &other) Q_DECL_NOTHROW { qSwap(d, other.d); } bool operator==(const QProcessEnvironment &other) const; inline bool operator!=(const QProcessEnvironment &other) const @@ -104,15 +107,21 @@ public: WriteError, UnknownError }; + Q_ENUM(ProcessError) + enum ProcessState { NotRunning, Starting, Running }; + Q_ENUM(ProcessState) + enum ProcessChannel { StandardOutput, StandardError }; + Q_ENUM(ProcessChannel) + enum ProcessChannelMode { SeparateChannels, MergedChannels, @@ -120,16 +129,21 @@ public: ForwardedOutputChannel, ForwardedErrorChannel }; + Q_ENUM(ProcessChannelMode) + enum InputChannelMode { ManagedInputChannel, ForwardedInputChannel }; + Q_ENUM(InputChannelMode) + enum ExitStatus { NormalExit, CrashExit }; + Q_ENUM(ExitStatus) - explicit QProcess(QObject *parent = 0); + explicit QProcess(QObject *parent = Q_NULLPTR); virtual ~QProcess(); void start(const QString &program, const QStringList &arguments, OpenMode mode = ReadWrite); @@ -208,7 +222,7 @@ public: #if defined(Q_QDOC) = QString() #endif - , qint64 *pid = 0); + , qint64 *pid = Q_NULLPTR); #if !defined(Q_QDOC) static bool startDetached(const QString &program, const QStringList &arguments); // ### Qt6: merge overloads #endif diff --git a/src/corelib/io/qprocess_p.h b/src/corelib/io/qprocess_p.h index f6bd64fb87..fc6b5345d1 100644 --- a/src/corelib/io/qprocess_p.h +++ b/src/corelib/io/qprocess_p.h @@ -383,6 +383,8 @@ public: qint64 writeToStdin(const char *data, qint64 maxlen); void cleanup(); + void setError(QProcess::ProcessError error, const QString &description = QString()); + void setErrorAndEmit(QProcess::ProcessError error, const QString &description = QString()); #ifdef Q_OS_BLACKBERRY QList<QSocketNotifier *> defaultNotifiers() const; diff --git a/src/corelib/io/qprocess_unix.cpp b/src/corelib/io/qprocess_unix.cpp index 0fc9464f52..0d6ef9e60f 100644 --- a/src/corelib/io/qprocess_unix.cpp +++ b/src/corelib/io/qprocess_unix.cpp @@ -93,7 +93,6 @@ QT_END_NAMESPACE #include <qfile.h> #include <qfileinfo.h> #include <qlist.h> -#include <qhash.h> #include <qmutex.h> #include <qsemaphore.h> #include <qsocketnotifier.h> @@ -204,8 +203,8 @@ bool QProcessPrivate::openChannel(Channel &channel) channel.pipe[1] = -1; if ( (channel.pipe[0] = qt_safe_open(fname, O_RDONLY)) != -1) return true; // success - - q->setErrorString(QProcess::tr("Could not open input redirection for reading")); + setErrorAndEmit(QProcess::FailedToStart, + QProcess::tr("Could not open input redirection for reading")); } else { int mode = O_WRONLY | O_CREAT; if (channel.append) @@ -217,12 +216,9 @@ bool QProcessPrivate::openChannel(Channel &channel) if ( (channel.pipe[1] = qt_safe_open(fname, mode, 0666)) != -1) return true; // success - q->setErrorString(QProcess::tr("Could not open output redirection for writing")); + setErrorAndEmit(QProcess::FailedToStart, + QProcess::tr("Could not open input redirection for reading")); } - - // could not open file - processError = QProcess::FailedToStart; - emit q->error(processError); cleanup(); return false; } else { @@ -331,9 +327,7 @@ void QProcessPrivate::startProcess() !openChannel(stdoutChannel) || !openChannel(stderrChannel) || qt_create_pipe(childStartedPipe) != 0) { - processError = QProcess::FailedToStart; - q->setErrorString(qt_error_string(errno)); - emit q->error(processError); + setErrorAndEmit(QProcess::FailedToStart, qt_error_string(errno)); cleanup(); return; } @@ -406,7 +400,7 @@ void QProcessPrivate::startProcess() char **path = 0; int pathc = 0; if (!program.contains(QLatin1Char('/'))) { - const QString pathEnv = QString::fromLocal8Bit(::getenv("PATH")); + const QString pathEnv = QString::fromLocal8Bit(qgetenv("PATH")); if (!pathEnv.isEmpty()) { QStringList pathEntries = pathEnv.split(QLatin1Char(':'), QString::SkipEmptyParts); if (!pathEntries.isEmpty()) { @@ -459,9 +453,8 @@ void QProcessPrivate::startProcess() qDebug("fork failed: %s", qPrintable(qt_error_string(lastForkErrno))); #endif q->setProcessState(QProcess::NotRunning); - processError = QProcess::FailedToStart; - q->setErrorString(QProcess::tr("Resource error (fork failure): %1").arg(qt_error_string(lastForkErrno))); - emit q->error(processError); + setErrorAndEmit(QProcess::FailedToStart, + QProcess::tr("Resource error (fork failure): %1").arg(qt_error_string(lastForkErrno))); cleanup(); return; } @@ -809,8 +802,6 @@ void QProcessPrivate::killProcess() bool QProcessPrivate::waitForStarted(int msecs) { - Q_Q(QProcess); - #if defined (QPROCESS_DEBUG) qDebug("QProcessPrivate::waitForStarted(%d) waiting for child to start (fd = %d)", msecs, childStartedPipe[0]); @@ -820,8 +811,7 @@ bool QProcessPrivate::waitForStarted(int msecs) FD_ZERO(&fds); FD_SET(childStartedPipe[0], &fds); if (qt_select_msecs(childStartedPipe[0] + 1, &fds, 0, msecs) == 0) { - processError = QProcess::Timedout; - q->setErrorString(QProcess::tr("Process operation timed out")); + setError(QProcess::Timedout); #if defined (QPROCESS_DEBUG) qDebug("QProcessPrivate::waitForStarted(%d) == false (timed out)", msecs); #endif @@ -848,7 +838,6 @@ QList<QSocketNotifier *> QProcessPrivate::defaultNotifiers() const bool QProcessPrivate::waitForReadyRead(int msecs) { - Q_Q(QProcess); #if defined (QPROCESS_DEBUG) qDebug("QProcessPrivate::waitForReadyRead(%d)", msecs); #endif @@ -891,8 +880,7 @@ bool QProcessPrivate::waitForReadyRead(int msecs) break; } if (ret == 0) { - processError = QProcess::Timedout; - q->setErrorString(QProcess::tr("Process operation timed out")); + setError(QProcess::Timedout); return false; } @@ -928,7 +916,6 @@ bool QProcessPrivate::waitForReadyRead(int msecs) bool QProcessPrivate::waitForBytesWritten(int msecs) { - Q_Q(QProcess); #if defined (QPROCESS_DEBUG) qDebug("QProcessPrivate::waitForBytesWritten(%d)", msecs); #endif @@ -973,8 +960,7 @@ bool QProcessPrivate::waitForBytesWritten(int msecs) } if (ret == 0) { - processError = QProcess::Timedout; - q->setErrorString(QProcess::tr("Process operation timed out")); + setError(QProcess::Timedout); return false; } @@ -1003,7 +989,6 @@ bool QProcessPrivate::waitForBytesWritten(int msecs) bool QProcessPrivate::waitForFinished(int msecs) { - Q_Q(QProcess); #if defined (QPROCESS_DEBUG) qDebug("QProcessPrivate::waitForFinished(%d)", msecs); #endif @@ -1047,8 +1032,7 @@ bool QProcessPrivate::waitForFinished(int msecs) break; } if (ret == 0) { - processError = QProcess::Timedout; - q->setErrorString(QProcess::tr("Process operation timed out")); + setError(QProcess::Timedout); return false; } @@ -1191,7 +1175,7 @@ bool QProcessPrivate::startDetached(const QString &program, const QStringList &a argv[arguments.size() + 1] = 0; if (!program.contains(QLatin1Char('/'))) { - const QString path = QString::fromLocal8Bit(::getenv("PATH")); + const QString path = QString::fromLocal8Bit(qgetenv("PATH")); if (!path.isEmpty()) { QStringList pathEntries = path.split(QLatin1Char(':')); for (int k = 0; k < pathEntries.size(); ++k) { diff --git a/src/corelib/io/qprocess_win.cpp b/src/corelib/io/qprocess_win.cpp index cef961ecbd..5c9db05eff 100644 --- a/src/corelib/io/qprocess_win.cpp +++ b/src/corelib/io/qprocess_win.cpp @@ -217,7 +217,8 @@ bool QProcessPrivate::openChannel(Channel &channel) if (channel.pipe[0] != INVALID_Q_PIPE) return true; - q->setErrorString(QProcess::tr("Could not open input redirection for reading")); + setErrorAndEmit(QProcess::FailedToStart, + QProcess::tr("Could not open input redirection for reading")); } else { // open in write mode channel.pipe[0] = INVALID_Q_PIPE; @@ -237,12 +238,9 @@ bool QProcessPrivate::openChannel(Channel &channel) return true; } - q->setErrorString(QProcess::tr("Could not open output redirection for writing")); + setErrorAndEmit(QProcess::FailedToStart, + QProcess::tr("Could not open output redirection for writing")); } - - // could not open file - processError = QProcess::FailedToStart; - emit q->error(processError); cleanup(); return false; } else { @@ -504,9 +502,10 @@ void QProcessPrivate::startProcess() environment.isEmpty() ? 0 : envlist.data(), workingDirectory.isEmpty() ? 0 : (wchar_t*)QDir::toNativeSeparators(workingDirectory).utf16(), &startupInfo, pid); + QString errorString; if (!success) { // Capture the error string before we do CloseHandle below - q->setErrorString(QProcess::tr("Process failed to start: %1").arg(qt_error_string())); + errorString = QProcess::tr("Process failed to start: %1").arg(qt_error_string()); } if (stdinChannel.pipe[0] != INVALID_Q_PIPE) { @@ -524,8 +523,7 @@ void QProcessPrivate::startProcess() if (!success) { cleanup(); - processError = QProcess::FailedToStart; - emit q->error(processError); + setErrorAndEmit(QProcess::FailedToStart, errorString); q->setProcessState(QProcess::NotRunning); return; } @@ -595,16 +593,13 @@ void QProcessPrivate::killProcess() bool QProcessPrivate::waitForStarted(int) { - Q_Q(QProcess); - if (processStarted()) return true; if (processError == QProcess::FailedToStart) return false; - processError = QProcess::Timedout; - q->setErrorString(QProcess::tr("Process operation timed out")); + setError(QProcess::Timedout); return false; } @@ -636,8 +631,6 @@ bool QProcessPrivate::drainOutputPipes() bool QProcessPrivate::waitForReadyRead(int msecs) { - Q_Q(QProcess); - QIncrementalSleepTimer timer(msecs); forever { @@ -652,7 +645,7 @@ bool QProcessPrivate::waitForReadyRead(int msecs) if (!pid) return false; - if (WaitForSingleObject(pid->hProcess, 0) == WAIT_OBJECT_0) { + if (WaitForSingleObjectEx(pid->hProcess, 0, false) == WAIT_OBJECT_0) { bool readyReadEmitted = drainOutputPipes(); _q_processDied(); return readyReadEmitted; @@ -663,15 +656,12 @@ bool QProcessPrivate::waitForReadyRead(int msecs) break; } - processError = QProcess::Timedout; - q->setErrorString(QProcess::tr("Process operation timed out")); + setError(QProcess::Timedout); return false; } bool QProcessPrivate::waitForBytesWritten(int msecs) { - Q_Q(QProcess); - QIncrementalSleepTimer timer(msecs); forever { @@ -721,7 +711,7 @@ bool QProcessPrivate::waitForBytesWritten(int msecs) // Wait for the process to signal any change in its state, // such as incoming data, or if the process died. - if (WaitForSingleObject(pid->hProcess, 0) == WAIT_OBJECT_0) { + if (WaitForSingleObjectEx(pid->hProcess, 0, false) == WAIT_OBJECT_0) { _q_processDied(); return false; } @@ -731,14 +721,12 @@ bool QProcessPrivate::waitForBytesWritten(int msecs) break; } - processError = QProcess::Timedout; - q->setErrorString(QProcess::tr("Process operation timed out")); + setError(QProcess::Timedout); return false; } bool QProcessPrivate::waitForFinished(int msecs) { - Q_Q(QProcess); #if defined QPROCESS_DEBUG qDebug("QProcessPrivate::waitForFinished(%d)", msecs); #endif @@ -770,8 +758,7 @@ bool QProcessPrivate::waitForFinished(int msecs) break; } - processError = QProcess::Timedout; - q->setErrorString(QProcess::tr("Process operation timed out")); + setError(QProcess::Timedout); return false; } @@ -814,13 +801,10 @@ qint64 QProcessPrivate::writeToStdin(const char *data, qint64 maxlen) bool QProcessPrivate::waitForWrite(int msecs) { - Q_Q(QProcess); - if (!stdinChannel.writer || stdinChannel.writer->waitForWrite(msecs)) return true; - processError = QProcess::Timedout; - q->setErrorString(QProcess::tr("Process operation timed out")); + setError(QProcess::Timedout); return false; } diff --git a/src/corelib/io/qprocess_wince.cpp b/src/corelib/io/qprocess_wince.cpp index 53767758c2..807472b7b2 100644 --- a/src/corelib/io/qprocess_wince.cpp +++ b/src/corelib/io/qprocess_wince.cpp @@ -138,8 +138,7 @@ void QProcessPrivate::startProcess() if (!success) { cleanup(); - processError = QProcess::FailedToStart; - emit q->error(processError); + setErrorAndEmit(QProcess::FailedToStart); q->setProcessState(QProcess::NotRunning); return; } @@ -210,8 +209,7 @@ bool QProcessPrivate::waitForStarted(int) if (processError == QProcess::FailedToStart) return false; - processError = QProcess::Timedout; - q->setErrorString(QProcess::tr("Process operation timed out")); + setError(QProcess::Timedout); return false; } @@ -251,8 +249,7 @@ bool QProcessPrivate::waitForFinished(int msecs) if (timer.hasTimedOut()) break; } - processError = QProcess::Timedout; - q->setErrorString(QProcess::tr("Process operation timed out")); + setError(QProcess::Timedout); return false; } diff --git a/src/corelib/io/qresource.cpp b/src/corelib/io/qresource.cpp index 4b85645a90..345f0bd65d 100644 --- a/src/corelib/io/qresource.cpp +++ b/src/corelib/io/qresource.cpp @@ -35,7 +35,6 @@ #include "qresource_p.h" #include "qresource_iterator_p.h" #include "qset.h" -#include "qhash.h" #include "qmutex.h" #include "qdebug.h" #include "qlocale.h" @@ -791,6 +790,7 @@ QStringList QResourceRoot::children(int node) const offset += 4; const int child_off = (tree[offset+0] << 24) + (tree[offset+1] << 16) + (tree[offset+2] << 8) + (tree[offset+3] << 0); + ret.reserve(child_count); for(int i = child_off; i < child_off+child_count; ++i) ret << name(i); } diff --git a/src/corelib/io/qsavefile.h b/src/corelib/io/qsavefile.h index 3f5f09bf5c..085378ed4e 100644 --- a/src/corelib/io/qsavefile.h +++ b/src/corelib/io/qsavefile.h @@ -58,7 +58,7 @@ class Q_CORE_EXPORT QSaveFile : public QFileDevice public: explicit QSaveFile(const QString &name); - explicit QSaveFile(QObject *parent = 0); + explicit QSaveFile(QObject *parent = Q_NULLPTR); explicit QSaveFile(const QString &name, QObject *parent); ~QSaveFile(); diff --git a/src/corelib/io/qsettings.cpp b/src/corelib/io/qsettings.cpp index 413f5693f0..b61cba7f7d 100644 --- a/src/corelib/io/qsettings.cpp +++ b/src/corelib/io/qsettings.cpp @@ -299,7 +299,7 @@ QSettingsPrivate *QSettingsPrivate::create(const QString &fileName, QSettings::F } #endif -void QSettingsPrivate::processChild(QString key, ChildSpec spec, QMap<QString, QString> &result) +void QSettingsPrivate::processChild(QStringRef key, ChildSpec spec, QStringList &result) { if (spec != AllKeys) { int slashPos = key.indexOf(QLatin1Char('/')); @@ -312,7 +312,7 @@ void QSettingsPrivate::processChild(QString key, ChildSpec spec, QMap<QString, Q key.truncate(slashPos); } } - result.insert(key, QString()); + result.append(key.toString()); } void QSettingsPrivate::beginGroupOrArray(const QSettingsGroup &group) @@ -357,6 +357,7 @@ void QSettingsPrivate::requestUpdate() QStringList QSettingsPrivate::variantListToStringList(const QVariantList &l) { QStringList result; + result.reserve(l.count()); QVariantList::const_iterator it = l.constBegin(); for (; it != l.constEnd(); ++it) result.append(variantToString(*it)); @@ -374,7 +375,9 @@ QVariant QSettingsPrivate::stringListToVariantList(const QStringList &l) outStringList[i].remove(0, 1); } else { QVariantList variantList; - for (int j = 0; j < l.count(); ++j) + const int stringCount = l.count(); + variantList.reserve(stringCount); + for (int j = 0; j < stringCount; ++j) variantList.append(stringToVariant(l.at(j))); return variantList; } @@ -1052,12 +1055,12 @@ static void initDefaultPaths(QMutexLocker *locker) // Non XDG platforms (OS X, iOS, Blackberry, Android...) have used this code path erroneously // for some time now. Moving away from that would require migrating existing settings. QString userPath; - char *env = getenv("XDG_CONFIG_HOME"); - if (env == 0) { + QByteArray env = qgetenv("XDG_CONFIG_HOME"); + if (env.isEmpty()) { userPath = QDir::homePath(); userPath += QLatin1Char('/'); userPath += QLatin1String(".config"); - } else if (*env == '/') { + } else if (env.startsWith('/')) { userPath = QFile::decodeName(env); } else { userPath = QDir::homePath(); @@ -1269,7 +1272,7 @@ bool QConfFileSettingsPrivate::get(const QString &key, QVariant *value) const QStringList QConfFileSettingsPrivate::children(const QString &prefix, ChildSpec spec) const { - QMap<QString, QString> result; + QStringList result; ParsedSettingsMap::const_iterator j; QSettingsKey thePrefix(prefix, caseSensitivity); @@ -1289,14 +1292,14 @@ QStringList QConfFileSettingsPrivate::children(const QString &prefix, ChildSpec &confFile->originalKeys)->lowerBound( thePrefix); while (j != confFile->originalKeys.constEnd() && j.key().startsWith(thePrefix)) { if (!confFile->removedKeys.contains(j.key())) - processChild(j.key().originalCaseKey().mid(startPos), spec, result); + processChild(j.key().originalCaseKey().midRef(startPos), spec, result); ++j; } j = const_cast<const ParsedSettingsMap *>( &confFile->addedKeys)->lowerBound(thePrefix); while (j != confFile->addedKeys.constEnd() && j.key().startsWith(thePrefix)) { - processChild(j.key().originalCaseKey().mid(startPos), spec, result); + processChild(j.key().originalCaseKey().midRef(startPos), spec, result); ++j; } @@ -1304,7 +1307,10 @@ QStringList QConfFileSettingsPrivate::children(const QString &prefix, ChildSpec break; } } - return result.keys(); + std::sort(result.begin(), result.end()); + result.erase(std::unique(result.begin(), result.end()), + result.end()); + return result; } void QConfFileSettingsPrivate::clear() diff --git a/src/corelib/io/qsettings.h b/src/corelib/io/qsettings.h index f7a7bdbb19..8f41273ffa 100644 --- a/src/corelib/io/qsettings.h +++ b/src/corelib/io/qsettings.h @@ -105,13 +105,13 @@ public: #ifndef QT_NO_QOBJECT explicit QSettings(const QString &organization, - const QString &application = QString(), QObject *parent = 0); + const QString &application = QString(), QObject *parent = Q_NULLPTR); QSettings(Scope scope, const QString &organization, - const QString &application = QString(), QObject *parent = 0); + const QString &application = QString(), QObject *parent = Q_NULLPTR); QSettings(Format format, Scope scope, const QString &organization, - const QString &application = QString(), QObject *parent = 0); - QSettings(const QString &fileName, Format format, QObject *parent = 0); - explicit QSettings(QObject *parent = 0); + const QString &application = QString(), QObject *parent = Q_NULLPTR); + QSettings(const QString &fileName, Format format, QObject *parent = Q_NULLPTR); + explicit QSettings(QObject *parent = Q_NULLPTR); #else explicit QSettings(const QString &organization, const QString &application = QString()); diff --git a/src/corelib/io/qsettings_mac.cpp b/src/corelib/io/qsettings_mac.cpp index 51321c49e7..1ad198b990 100644 --- a/src/corelib/io/qsettings_mac.cpp +++ b/src/corelib/io/qsettings_mac.cpp @@ -491,7 +491,7 @@ bool QMacSettingsPrivate::get(const QString &key, QVariant *value) const QStringList QMacSettingsPrivate::children(const QString &prefix, ChildSpec spec) const { - QMap<QString, QString> result; + QStringList result; int startPos = prefix.size(); for (int i = 0; i < numDomains; ++i) { @@ -505,7 +505,7 @@ QStringList QMacSettingsPrivate::children(const QString &prefix, ChildSpec spec) QString currentKey = qtKey(static_cast<CFStringRef>(CFArrayGetValueAtIndex(cfarray, k))); if (currentKey.startsWith(prefix)) - processChild(currentKey.mid(startPos), spec, result); + processChild(currentKey.midRef(startPos), spec, result); } } } @@ -513,7 +513,10 @@ QStringList QMacSettingsPrivate::children(const QString &prefix, ChildSpec spec) if (!fallbacks) break; } - return result.keys(); + std::sort(result.begin(), result.end()); + result.erase(std::unique(result.begin(), result.end()), + result.end()); + return result; } void QMacSettingsPrivate::clear() diff --git a/src/corelib/io/qsettings_p.h b/src/corelib/io/qsettings_p.h index 93d63fd411..534527ed5a 100644 --- a/src/corelib/io/qsettings_p.h +++ b/src/corelib/io/qsettings_p.h @@ -211,7 +211,7 @@ public: const QString &organization, const QString &application); static QSettingsPrivate *create(const QString &fileName, QSettings::Format format); - static void processChild(QString key, ChildSpec spec, QMap<QString, QString> &result); + static void processChild(QStringRef key, ChildSpec spec, QStringList &result); // Variant streaming functions static QStringList variantListToStringList(const QVariantList &l); diff --git a/src/corelib/io/qstandardpaths.cpp b/src/corelib/io/qstandardpaths.cpp index 74252d1f0a..04848a38e5 100644 --- a/src/corelib/io/qstandardpaths.cpp +++ b/src/corelib/io/qstandardpaths.cpp @@ -35,7 +35,6 @@ #include <qdir.h> #include <qfileinfo.h> -#include <qhash.h> #ifndef QT_BOOTSTRAPPED #include <qobject.h> @@ -523,13 +522,8 @@ QString QStandardPaths::findExecutable(const QString &executableName, const QStr QStringList searchPaths = paths; if (paths.isEmpty()) { QByteArray pEnv = qgetenv("PATH"); -#if defined(Q_OS_WIN) - const QLatin1Char pathSep(';'); -#else - const QLatin1Char pathSep(':'); -#endif // Remove trailing slashes, which occur on Windows. - const QStringList rawPaths = QString::fromLocal8Bit(pEnv.constData()).split(pathSep, QString::SkipEmptyParts); + const QStringList rawPaths = QString::fromLocal8Bit(pEnv.constData()).split(QDir::listSeparator(), QString::SkipEmptyParts); searchPaths.reserve(rawPaths.size()); foreach (const QString &rawPath, rawPaths) { QString cleanPath = QDir::cleanPath(rawPath); diff --git a/src/corelib/io/qstorageinfo.h b/src/corelib/io/qstorageinfo.h index 848278e69f..b9d694cb14 100644 --- a/src/corelib/io/qstorageinfo.h +++ b/src/corelib/io/qstorageinfo.h @@ -55,11 +55,10 @@ public: QStorageInfo &operator=(const QStorageInfo &other); #ifdef Q_COMPILER_RVALUE_REFS - inline QStorageInfo &operator=(QStorageInfo &&other) - { qSwap(d, other.d); return *this; } + QStorageInfo &operator=(QStorageInfo &&other) Q_DECL_NOTHROW { swap(other); return *this; } #endif - inline void swap(QStorageInfo &other) + inline void swap(QStorageInfo &other) Q_DECL_NOTHROW { qSwap(d, other.d); } void setPath(const QString &path); diff --git a/src/corelib/io/qstorageinfo_unix.cpp b/src/corelib/io/qstorageinfo_unix.cpp index d170e7c0c0..f82d0ff0a1 100644 --- a/src/corelib/io/qstorageinfo_unix.cpp +++ b/src/corelib/io/qstorageinfo_unix.cpp @@ -49,7 +49,7 @@ # include <sys/mount.h> # include <sys/vfs.h> # include <mntent.h> -#elif defined(Q_OS_LINUX) +#elif defined(Q_OS_LINUX) || defined(Q_OS_HURD) # include <mntent.h> # include <sys/statvfs.h> #elif defined(Q_OS_SOLARIS) @@ -145,7 +145,7 @@ private: QByteArray m_rootPath; QByteArray m_fileSystemType; QByteArray m_device; -#elif defined(Q_OS_LINUX) +#elif defined(Q_OS_LINUX) || defined(Q_OS_HURD) FILE *fp; mntent mnt; QByteArray buffer; @@ -287,10 +287,11 @@ inline QByteArray QStorageIterator::device() const return m_device; } -#elif defined(Q_OS_LINUX) +#elif defined(Q_OS_LINUX) || defined(Q_OS_HURD) static const char pathMounted[] = "/etc/mtab"; -static const int bufferSize = 3*PATH_MAX; // 2 paths (mount point+device) and metainfo +static const int bufferSize = 1024; // 2 paths (mount point+device) and metainfo; + // should be enough inline QStorageIterator::QStorageIterator() : buffer(QByteArray(bufferSize, 0)) diff --git a/src/corelib/io/qtemporaryfile.cpp b/src/corelib/io/qtemporaryfile.cpp index 556bc6e760..bdf4392275 100644 --- a/src/corelib/io/qtemporaryfile.cpp +++ b/src/corelib/io/qtemporaryfile.cpp @@ -236,9 +236,9 @@ QTemporaryFileEngine::~QTemporaryFileEngine() QFSFileEngine::close(); } -bool QTemporaryFileEngine::isReallyOpen() +bool QTemporaryFileEngine::isReallyOpen() const { - Q_D(QFSFileEngine); + Q_D(const QFSFileEngine); if (!((0 == d->fh) && (-1 == d->fd) #if defined Q_OS_WIN diff --git a/src/corelib/io/qtemporaryfile_p.h b/src/corelib/io/qtemporaryfile_p.h index 475298f264..341ae9bd3f 100644 --- a/src/corelib/io/qtemporaryfile_p.h +++ b/src/corelib/io/qtemporaryfile_p.h @@ -95,7 +95,7 @@ public: ~QTemporaryFileEngine(); - bool isReallyOpen(); + bool isReallyOpen() const; void setFileName(const QString &file); void setFileTemplate(const QString &fileTemplate); diff --git a/src/corelib/io/qtldurl.cpp b/src/corelib/io/qtldurl.cpp index 2e787a1bc5..d68d0ddf46 100644 --- a/src/corelib/io/qtldurl.cpp +++ b/src/corelib/io/qtldurl.cpp @@ -37,7 +37,6 @@ #include "private/qtldurl_p.h" #include "QtCore/qstring.h" #include "QtCore/qvector.h" -#include "QtCore/qhash.h" QT_BEGIN_NAMESPACE diff --git a/src/corelib/io/qurlquery.cpp b/src/corelib/io/qurlquery.cpp index 77d1ab3e24..2b695a4f7b 100644 --- a/src/corelib/io/qurlquery.cpp +++ b/src/corelib/io/qurlquery.cpp @@ -34,6 +34,7 @@ #include "qurlquery.h" #include "qurl_p.h" +#include <QtCore/qhashfunctions.h> #include <QtCore/qstringlist.h> QT_BEGIN_NAMESPACE @@ -407,6 +408,7 @@ bool QUrlQuery::operator ==(const QUrlQuery &other) const if (d == other.d) return true; if (d && other.d) + // keep in sync with qHash(QUrlQuery): return d->valueDelimiter == other.d->valueDelimiter && d->pairDelimiter == other.d->pairDelimiter && d->itemList == other.d->itemList; @@ -414,6 +416,25 @@ bool QUrlQuery::operator ==(const QUrlQuery &other) const } /*! + \since 5.6 + \relates QUrlQuery + + Returns the hash value for \a key, + using \a seed to seed the calculation. +*/ +uint qHash(const QUrlQuery &key, uint seed) Q_DECL_NOTHROW +{ + if (const QUrlQueryPrivate *d = key.d) { + QtPrivate::QHashCombine hash; + // keep in sync with operator==: + seed = hash(seed, d->valueDelimiter); + seed = hash(seed, d->pairDelimiter); + seed = hash(seed, d->itemList); + } + return seed; +} + +/*! Returns \c true if this QUrlQuery object contains no key-value pairs, such as after being default-constructed or after parsing an empty query string. @@ -621,6 +642,7 @@ QList<QPair<QString, QString> > QUrlQuery::queryItems(QUrl::ComponentFormattingO QList<QPair<QString, QString> > result; Map::const_iterator it = d->itemList.constBegin(); Map::const_iterator end = d->itemList.constEnd(); + result.reserve(d->itemList.count()); for ( ; it != end; ++it) result << qMakePair(d->recodeToUser(it->first, encoding), d->recodeToUser(it->second, encoding)); diff --git a/src/corelib/io/qurlquery.h b/src/corelib/io/qurlquery.h index 77a0b4a82d..ae3a79c119 100644 --- a/src/corelib/io/qurlquery.h +++ b/src/corelib/io/qurlquery.h @@ -44,6 +44,8 @@ QT_BEGIN_NAMESPACE +Q_CORE_EXPORT uint qHash(const QUrlQuery &key, uint seed = 0) Q_DECL_NOTHROW; + class QUrlQueryPrivate; class Q_CORE_EXPORT QUrlQuery { @@ -54,8 +56,7 @@ public: QUrlQuery(const QUrlQuery &other); QUrlQuery &operator=(const QUrlQuery &other); #ifdef Q_COMPILER_RVALUE_REFS - QUrlQuery &operator=(QUrlQuery &&other) - { qSwap(d, other.d); return *this; } + QUrlQuery &operator=(QUrlQuery &&other) Q_DECL_NOTHROW { swap(other); return *this; } #endif ~QUrlQuery(); @@ -63,7 +64,7 @@ public: bool operator!=(const QUrlQuery &other) const { return !(*this == other); } - void swap(QUrlQuery &other) { qSwap(d, other.d); } + void swap(QUrlQuery &other) Q_DECL_NOTHROW { qSwap(d, other.d); } bool isEmpty() const; bool isDetached() const; @@ -95,6 +96,7 @@ public: private: friend class QUrl; + friend Q_CORE_EXPORT uint qHash(const QUrlQuery &key, uint seed) Q_DECL_NOTHROW; QSharedDataPointer<QUrlQueryPrivate> d; public: typedef QSharedDataPointer<QUrlQueryPrivate> DataPtr; diff --git a/src/corelib/io/qwindowspipereader.cpp b/src/corelib/io/qwindowspipereader.cpp index 14aad0e193..2cc5741250 100644 --- a/src/corelib/io/qwindowspipereader.cpp +++ b/src/corelib/io/qwindowspipereader.cpp @@ -136,12 +136,12 @@ qint64 QWindowsPipeReader::read(char *data, qint64 maxlen) actualReadBufferSize--; readSoFar = 1; } else { - qint64 bytesToRead = qMin(qint64(actualReadBufferSize), maxlen); + qint64 bytesToRead = qMin(actualReadBufferSize, maxlen); readSoFar = 0; while (readSoFar < bytesToRead) { const char *ptr = readBuffer.readPointer(); - int bytesToReadFromThisBlock = qMin(bytesToRead - readSoFar, - qint64(readBuffer.nextDataBlockSize())); + qint64 bytesToReadFromThisBlock = qMin(bytesToRead - readSoFar, + readBuffer.nextDataBlockSize()); memcpy(data + readSoFar, ptr, bytesToReadFromThisBlock); readSoFar += bytesToReadFromThisBlock; readBuffer.free(bytesToReadFromThisBlock); diff --git a/src/corelib/io/qwindowspipereader_p.h b/src/corelib/io/qwindowspipereader_p.h index 2c32eeb9ce..c8a66d9511 100644 --- a/src/corelib/io/qwindowspipereader_p.h +++ b/src/corelib/io/qwindowspipereader_p.h @@ -96,7 +96,7 @@ private: QWinOverlappedIoNotifier *dataReadNotifier; qint64 readBufferMaxSize; QRingBuffer readBuffer; - int actualReadBufferSize; + qint64 actualReadBufferSize; bool stopped; bool readSequenceStarted; bool pipeBroken; |