From 943dec51638b2b9d94208e77884e60300f808b0d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jaakko=20Kera=CC=88nen?= Date: Fri, 6 Oct 2017 08:32:12 +0300 Subject: [PATCH] FS|RemoteFeed: Send only relevant metadata about files A file object's namespace contains a bunch of functions etc. that are not relevant for sharing over the network. --- doomsday/apps/server/src/remotefeeduser.cpp | 8 +++++++ doomsday/apps/server/src/remoteuser.cpp | 2 ++ .../src/filesys/remotefeedprotocol.cpp | 22 +++++++++++++++++-- .../libcore/src/filesys/remotefeedrelay.cpp | 5 ++++- 4 files changed, 34 insertions(+), 3 deletions(-) diff --git a/doomsday/apps/server/src/remotefeeduser.cpp b/doomsday/apps/server/src/remotefeeduser.cpp index e98c7fc9db..2e054864dd 100644 --- a/doomsday/apps/server/src/remotefeeduser.cpp +++ b/doomsday/apps/server/src/remotefeeduser.cpp @@ -32,6 +32,7 @@ DENG2_PIMPL(RemoteFeedUser) Impl(Public *i, Socket *s) : Base(i), socket(s) { + LOG_NET_MSG("Setting up RemoteFeedUser %p") << thisPublic; QObject::connect(s, &Socket::messagesReady, [this] () { receiveMessages(); }); QObject::connect(s, &Socket::disconnected, [this] () { @@ -40,6 +41,9 @@ DENG2_PIMPL(RemoteFeedUser) i->userDisconnected(self()); } }); + + // We took over an open socket, there may already be messages waiting. + receiveMessages(); } void receiveMessages() @@ -52,6 +56,8 @@ DENG2_PIMPL(RemoteFeedUser) std::unique_ptr message(socket->receive()); std::unique_ptr packet(protocol.interpret(*message)); + LOG_NET_MSG("received packet '%s'") << packet->type(); + if (protocol.recognize(*packet) == RemoteFeedProtocol::Query) { handleQuery(packet->as()); @@ -84,6 +90,7 @@ DENG2_PIMPL(RemoteFeedUser) { LOG_NET_WARNING("%s not found!") << query.path(); } + LOG_NET_MSG("%s") << response->metadata().asText(); break; case RemoteFeedQueryPacket::FileContents: @@ -91,6 +98,7 @@ DENG2_PIMPL(RemoteFeedUser) break; } + LOG_NET_MSG("Sending response %i") << query.id(); socket->sendPacket(*response); } }; diff --git a/doomsday/apps/server/src/remoteuser.cpp b/doomsday/apps/server/src/remoteuser.cpp index 5e48c65ff8..6f20b525f1 100644 --- a/doomsday/apps/server/src/remoteuser.cpp +++ b/doomsday/apps/server/src/remoteuser.cpp @@ -252,6 +252,8 @@ String RemoteUser::name() const Socket *RemoteUser::takeSocket() { Socket *sock = d->socket; + QObject::disconnect(sock, SIGNAL(disconnected()), this, SLOT(socketDisconnected())); + QObject::disconnect(sock, SIGNAL(messagesReady()), this, SLOT(handleIncomingPackets())); d->socket = 0; d->state = Disconnected; // not signaled return sock; diff --git a/doomsday/sdk/libcore/src/filesys/remotefeedprotocol.cpp b/doomsday/sdk/libcore/src/filesys/remotefeedprotocol.cpp index dbac315c26..f35c769b08 100644 --- a/doomsday/sdk/libcore/src/filesys/remotefeedprotocol.cpp +++ b/doomsday/sdk/libcore/src/filesys/remotefeedprotocol.cpp @@ -19,6 +19,7 @@ #include "de/RemoteFeedProtocol" #include "de/TextValue" #include "de/RecordValue" +#include "de/Folder" namespace de { @@ -78,9 +79,26 @@ RemoteFeedMetadataPacket::RemoteFeedMetadataPacket() void RemoteFeedMetadataPacket::addFile(File const &file) { - std::unique_ptr fileMeta(new Record(file.objectNamespace())); + auto const &ns = file.objectNamespace(); + auto const status = file.status(); - // TODO: Omit irrelevant/local information? + std::unique_ptr fileMeta(new Record); + + fileMeta->addTime ("modifiedAt", status.modifiedAt); + fileMeta->addNumber("type", status.type()); + if (status.type() == File::Status::FOLDER) + { + fileMeta->addNumber("size", file.as().contents().size()); + } + else + { + fileMeta->addNumber("size", status.size); + } + if (ns.hasSubrecord("package")) + { + fileMeta->add("package", new Record(ns["package"].valueAsRecord(), + Record::IgnoreDoubleUnderscoreMembers)); + } _metadata.add(new TextValue(file.name()), new RecordValue(fileMeta.release(), RecordValue::OwnsRecord)); diff --git a/doomsday/sdk/libcore/src/filesys/remotefeedrelay.cpp b/doomsday/sdk/libcore/src/filesys/remotefeedrelay.cpp index cd7bd37976..52580ccb0a 100644 --- a/doomsday/sdk/libcore/src/filesys/remotefeedrelay.cpp +++ b/doomsday/sdk/libcore/src/filesys/remotefeedrelay.cpp @@ -86,7 +86,7 @@ DENG2_PIMPL(RemoteFeedRelay) virtual void handleError(QString errorMessage) { - LOG_NET_ERROR("Error accessing remote file repository \"%s\" (%s) " DENG2_CHAR_MDASH + LOG_NET_ERROR("Error accessing remote file repository \"%s\": %s " DENG2_CHAR_MDASH "files from repository may not be available") << address << errorMessage; @@ -105,6 +105,7 @@ DENG2_PIMPL(RemoteFeedRelay) } else { + qDebug() << "[RemoteFeedRelay] Query" << query.id << "is deferred"; deferredQueries.append(query); } } @@ -187,6 +188,8 @@ DENG2_PIMPL(RemoteFeedRelay) { DENG2_ASSERT(query.isValid()); + qDebug() << "transmitting query" << query.id << query.path; + RemoteFeedQueryPacket packet; packet.setId(query.id); packet.setPath(query.path);