From 2f52bd2ed26cc151fa90ed9e06b1ea9990f9fc7c Mon Sep 17 00:00:00 2001 From: Aaron Seigo Date: Mon, 1 Dec 2014 11:54:37 +0100 Subject: send revision updates from resource to client this includes an initial revision message on connect --- client/resourceaccess.cpp | 45 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) (limited to 'client/resourceaccess.cpp') diff --git a/client/resourceaccess.cpp b/client/resourceaccess.cpp index 4042219..e73c773 100644 --- a/client/resourceaccess.cpp +++ b/client/resourceaccess.cpp @@ -3,6 +3,7 @@ #include "common/console.h" #include "common/commands.h" #include "common/handshake_generated.h" +#include "common/revisionupdate_generated.h" #include #include @@ -26,6 +27,9 @@ ResourceAccess::ResourceAccess(const QString &resourceName, QObject *parent) this, &ResourceAccess::disconnected); connect(m_socket, SIGNAL(error(QLocalSocket::LocalSocketError)), this, SLOT(connectionError(QLocalSocket::LocalSocketError))); + connect(m_socket, &QIODevice::readyRead, + this, &ResourceAccess::readResourceMessage); + } ResourceAccess::~ResourceAccess() @@ -109,3 +113,44 @@ void ResourceAccess::connectionError(QLocalSocket::LocalSocketError error) } } +void ResourceAccess::readResourceMessage() +{ + if (!m_socket->isValid()) { + return; + } + + m_partialMessageBuffer += m_socket->readAll(); + + // should be scheduled rather than processed all at once + while (processMessageBuffer()) {} +} + +bool ResourceAccess::processMessageBuffer() +{ + static const int headerSize = (sizeof(int) * 2); + Console::main()->log(QString("processing %1").arg(m_partialMessageBuffer.size())); + if (m_partialMessageBuffer.size() < headerSize) { + return false; + } + + const int commandId = *(int*)m_partialMessageBuffer.constData(); + const int size = *(int*)(m_partialMessageBuffer.constData() + sizeof(int)); + + if (size > m_partialMessageBuffer.size() - headerSize) { + return false; + } + + switch (commandId) { + case Commands::RevisionUpdateCommand: { + auto buffer = Toynadi::GetRevisionUpdate(m_partialMessageBuffer.constData() + headerSize); + Console::main()->log(QString(" Revision updated to: %1").arg(buffer->revision())); + emit revisionChanged(buffer->revision()); + break; + } + default: + break; + } + + m_partialMessageBuffer.remove(0, headerSize + size); + return m_partialMessageBuffer.size() >= headerSize; +} -- cgit v1.2.3