diff options
-rw-r--r-- | src/libs/installer/protocol.h | 3 | ||||
-rw-r--r-- | src/libs/installer/remotefileengine.cpp | 98 | ||||
-rw-r--r-- | src/libs/installer/remotefileengine.h | 71 | ||||
-rw-r--r-- | src/libs/installer/remoteserverconnection.cpp | 19 | ||||
-rw-r--r-- | tests/auto/installer/clientserver/tst_clientserver.cpp | 2 |
5 files changed, 123 insertions, 70 deletions
diff --git a/src/libs/installer/protocol.h b/src/libs/installer/protocol.h index 8279cc640..4011e3ed8 100644 --- a/src/libs/installer/protocol.h +++ b/src/libs/installer/protocol.h @@ -166,6 +166,9 @@ const char QAbstractFileEngineSize[] = "QAbstractFileEngine::size"; const char QAbstractFileEngineSupportsExtension[] = "QAbstractFileEngine::supportsExtension"; const char QAbstractFileEngineExtension[] = "QAbstractFileEngine::extension"; const char QAbstractFileEngineWrite[] = "QAbstractFileEngine::write"; +const char QAbstractFileEngineSyncToDisk[] = "QAbstractFileEngine::syncToDisk"; +const char QAbstractFileEngineRenameOverwrite[] = "QAbstractFileEngine::renameOverwrite"; +const char QAbstractFileEngineFileTime[] = "QAbstractFileEngine::fileTime"; } // namespace Protocol } // namespace QInstaller diff --git a/src/libs/installer/remotefileengine.cpp b/src/libs/installer/remotefileengine.cpp index 776f8301e..02469be34 100644 --- a/src/libs/installer/remotefileengine.cpp +++ b/src/libs/installer/remotefileengine.cpp @@ -144,9 +144,20 @@ bool RemoteFileEngine::atEnd() const QAbstractFileEngine::Iterator* RemoteFileEngine::beginEntryList(QDir::Filters filters, const QStringList &filterNames) { - QStringList entries = entryList(filters, filterNames); - entries.removeAll(QString()); - return new RemoteFileEngineIterator(filters, filterNames, entries); + if (connectToServer()) { + QStringList entries = entryList(filters, filterNames); + entries.removeAll(QString()); + return new RemoteFileEngineIterator(filters, filterNames, entries); + } + return m_fileEngine.beginEntryList(filters, filterNames); + +} + +QAbstractFileEngine::Iterator* RemoteFileEngine::endEntryList() +{ + if (connectToServer()) + return 0; // right now all other implementations return 0 too + return m_fileEngine.endEntryList(); } /*! @@ -219,14 +230,8 @@ QString RemoteFileEngine::errorString() const */ bool RemoteFileEngine::extension(Extension extension, const ExtensionOption *eo, ExtensionReturn *er) { - return false; - if (extension == UnMapExtension || extension == MapExtension) + if (connectToServer()) return false; - - if (connectToServer()) { - return callRemoteMethod<bool>(QString::fromLatin1(Protocol::QAbstractFileEngineExtension), - static_cast<qint32> (extension)); - } return m_fileEngine.extension(extension, eo, er); } @@ -460,8 +465,7 @@ qint64 RemoteFileEngine::size() const */ bool RemoteFileEngine::supportsExtension(Extension extension) const { - return false; - if (extension == UnMapExtension || extension == MapExtension) + if ((const_cast<RemoteFileEngine *>(this))->connectToServer()) return false; return m_fileEngine.supportsExtension(extension); } @@ -471,18 +475,18 @@ bool RemoteFileEngine::supportsExtension(Extension extension) const */ qint64 RemoteFileEngine::read(char *data, qint64 maxlen) { - if (!connectToServer()) - return m_fileEngine.read(data, maxlen); + if (connectToServer()) { + QPair<qint64, QByteArray> result = callRemoteMethod<QPair<qint64, QByteArray> > + (QString::fromLatin1(Protocol::QAbstractFileEngineRead), maxlen); - QPair<qint64, QByteArray> result = callRemoteMethod<QPair<qint64, QByteArray> > - (QString::fromLatin1(Protocol::QAbstractFileEngineRead), maxlen); + if (result.first <= 0) + return result.first; - if (result.first <= 0) + QDataStream dataStream(result.second); + dataStream.readRawData(data, result.first); return result.first; - - QDataStream dataStream(result.second); - dataStream.readRawData(data, result.first); - return result.first; + } + return m_fileEngine.read(data, maxlen); } /*! @@ -490,18 +494,18 @@ qint64 RemoteFileEngine::read(char *data, qint64 maxlen) */ qint64 RemoteFileEngine::readLine(char *data, qint64 maxlen) { - if (!connectToServer()) - return m_fileEngine.readLine(data, maxlen); + if (connectToServer()) { + QPair<qint64, QByteArray> result = callRemoteMethod<QPair<qint64, QByteArray> > + (QString::fromLatin1(Protocol::QAbstractFileEngineReadLine), maxlen); - QPair<qint64, QByteArray> result = callRemoteMethod<QPair<qint64, QByteArray> > - (QString::fromLatin1(Protocol::QAbstractFileEngineReadLine), maxlen); + if (result.first <= 0) + return result.first; - if (result.first <= 0) + QDataStream dataStream(result.second); + dataStream.readRawData(data, result.first); return result.first; - - QDataStream dataStream(result.second); - dataStream.readRawData(data, result.first); - return result.first; + } + return m_fileEngine.readLine(data, maxlen); } /*! @@ -509,11 +513,37 @@ qint64 RemoteFileEngine::readLine(char *data, qint64 maxlen) */ qint64 RemoteFileEngine::write(const char *data, qint64 len) { - if (!connectToServer()) - return m_fileEngine.write(data, len); + if (connectToServer()) { + QByteArray ba(data, len); + return callRemoteMethod<qint64>(QString::fromLatin1(Protocol::QAbstractFileEngineWrite), ba); + } + return m_fileEngine.write(data, len); +} + +bool RemoteFileEngine::syncToDisk() +{ + if (connectToServer()) + return callRemoteMethod<bool>(QString::fromLatin1(Protocol::QAbstractFileEngineSyncToDisk)); + return m_fileEngine.syncToDisk(); +} + +bool RemoteFileEngine::renameOverwrite(const QString &newName) +{ + if (connectToServer()) { + return callRemoteMethod<bool> + (QString::fromLatin1(Protocol::QAbstractFileEngineRenameOverwrite), newName); + } + return m_fileEngine.renameOverwrite(newName); +} - QByteArray ba(data, len); - return callRemoteMethod<qint64>(QString::fromLatin1(Protocol::QAbstractFileEngineWrite), ba); +QDateTime RemoteFileEngine::fileTime(FileTime time) const +{ + if ((const_cast<RemoteFileEngine *>(this))->connectToServer()) { + return callRemoteMethod<QDateTime> + (QString::fromLatin1(Protocol::QAbstractFileEngineFileTime), + static_cast<qint32> (time)); + } + return m_fileEngine.fileTime(time); } } // namespace QInstaller diff --git a/src/libs/installer/remotefileengine.h b/src/libs/installer/remotefileengine.h index 3e57d963a..79d8fda68 100644 --- a/src/libs/installer/remotefileengine.h +++ b/src/libs/installer/remotefileengine.h @@ -66,39 +66,50 @@ public: RemoteFileEngine(); ~RemoteFileEngine(); + bool open(QIODevice::OpenMode mode) Q_DECL_OVERRIDE; + 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 offset) 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 = FileInfoAll) const Q_DECL_OVERRIDE; + bool setPermissions(uint perms) Q_DECL_OVERRIDE; + QString fileName(FileName file = DefaultName) const Q_DECL_OVERRIDE; + uint ownerId(FileOwner owner) const Q_DECL_OVERRIDE; + QString owner(FileOwner owner) const Q_DECL_OVERRIDE; + QDateTime fileTime(FileTime time) const Q_DECL_OVERRIDE; + void setFileName(const QString &fileName) Q_DECL_OVERRIDE; + int handle() const Q_DECL_OVERRIDE; bool atEnd() const; - Iterator *beginEntryList(QDir::Filters filters, const QStringList &filterNames); - bool caseSensitive() const; - bool close(); - bool copy(const QString &newName); - QStringList entryList(QDir::Filters filters, const QStringList &filterNames) const; + uchar *map(qint64, qint64, QFile::MemoryMapFlags) { return 0; } + bool unmap(uchar *) { return true; } + + Iterator *beginEntryList(QDir::Filters filters, const QStringList &filterNames) Q_DECL_OVERRIDE; + Iterator *endEntryList() Q_DECL_OVERRIDE; + + 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; + QFile::FileError error() const; QString errorString() const; - bool extension(Extension extension, const ExtensionOption *option = 0, ExtensionReturn *output = 0); - FileFlags fileFlags(FileFlags type = FileInfoAll) const; - QString fileName(FileName file = DefaultName) const; - bool flush(); - int handle() const; - bool isRelativePath() const; - bool isSequential() const; - bool link(const QString &newName); - bool mkdir(const QString &dirName, bool createParentDirectories) const; - bool open(QIODevice::OpenMode mode); - QString owner(FileOwner owner) const; - uint ownerId(FileOwner owner) const; - qint64 pos() const; - qint64 read(char *data, qint64 maxlen); - qint64 readLine(char *data, qint64 maxlen); - bool remove(); - bool rename(const QString &newName); - bool rmdir(const QString &dirName, bool recurseParentDirectories) const; - bool seek(qint64 offset); - void setFileName(const QString &fileName); - bool setPermissions(uint perms); - bool setSize(qint64 size); - qint64 size() const; - bool supportsExtension(Extension extension) const; - qint64 write(const char *data, qint64 len); + + bool extension(Extension extension, const ExtensionOption *option = 0, + ExtensionReturn *output = 0) Q_DECL_OVERRIDE; + bool supportsExtension(Extension extension) const Q_DECL_OVERRIDE; private: QFSFileEngine m_fileEngine; diff --git a/src/libs/installer/remoteserverconnection.cpp b/src/libs/installer/remoteserverconnection.cpp index 9a2f2e7b0..6acde1d7b 100644 --- a/src/libs/installer/remoteserverconnection.cpp +++ b/src/libs/installer/remoteserverconnection.cpp @@ -507,16 +507,23 @@ void RemoteServerConnection::handleQFSFileEngine(const QString &command, QDataSt sendData(stream, m_engine->setSize(size)); } else if (command == QLatin1String(Protocol::QAbstractFileEngineSize)) { sendData(stream, m_engine->size()); - } else if (command == QLatin1String(Protocol::QAbstractFileEngineSupportsExtension)) { - // Implemented client side - } else if (command == QLatin1String(Protocol::QAbstractFileEngineExtension)) { - qint32 extension; - data >>extension; - sendData(stream, m_engine->extension(static_cast<QAbstractFileEngine::Extension> (extension))); + } else if ((command == QLatin1String(Protocol::QAbstractFileEngineSupportsExtension)) + || (command == QLatin1String(Protocol::QAbstractFileEngineExtension))) { + // Implemented client side. } else if (command == QLatin1String(Protocol::QAbstractFileEngineWrite)) { QByteArray content; data >> content; sendData(stream, m_engine->write(content.data(), content.size())); + } else if (command == QLatin1String(Protocol::QAbstractFileEngineSyncToDisk)) { + sendData(stream, m_engine->syncToDisk()); + } else if (command == QLatin1String(Protocol::QAbstractFileEngineRenameOverwrite)) { + QString newFilename; + data >> newFilename; + sendData(stream, m_engine->renameOverwrite(newFilename)); + } else if (command == QLatin1String(Protocol::QAbstractFileEngineFileTime)) { + qint32 filetime; + data >> filetime; + sendData(stream, m_engine->fileTime(static_cast<QAbstractFileEngine::FileTime> (filetime))); } else if (!command.isEmpty()) { qDebug() << "Unknown QAbstractFileEngine command:" << command; } diff --git a/tests/auto/installer/clientserver/tst_clientserver.cpp b/tests/auto/installer/clientserver/tst_clientserver.cpp index 8cddb771c..fa4722136 100644 --- a/tests/auto/installer/clientserver/tst_clientserver.cpp +++ b/tests/auto/installer/clientserver/tst_clientserver.cpp @@ -317,12 +317,14 @@ private slots: file.open(QIODevice::ReadWrite); const QByteArray ba = file.readLine(); file.seek(0); + QCOMPARE(file.atEnd(), false); QByteArray ba2(32 * 1024 * 1024, '\0'); file.readLine(ba2.data(), ba2.size()); file.resize(0); file.write(QProcess::systemEnvironment().join(QLatin1String("\n")).toLocal8Bit()); + QCOMPARE(file.atEnd(), true); } }; |