summaryrefslogtreecommitdiffstats
path: root/client/resourceaccess.cpp
diff options
context:
space:
mode:
authorAaron Seigo <aseigo@kde.org>2014-12-01 11:54:37 +0100
committerAaron Seigo <aseigo@kde.org>2014-12-01 12:01:13 +0100
commit2f52bd2ed26cc151fa90ed9e06b1ea9990f9fc7c (patch)
treee125101f32ad78a679c63f9c08571d3b11cd691f /client/resourceaccess.cpp
parentaf38dcdf3a836a1b94064a617acac387a2de6539 (diff)
downloadsink-2f52bd2ed26cc151fa90ed9e06b1ea9990f9fc7c.tar.gz
sink-2f52bd2ed26cc151fa90ed9e06b1ea9990f9fc7c.zip
send revision updates from resource to client
this includes an initial revision message on connect
Diffstat (limited to 'client/resourceaccess.cpp')
-rw-r--r--client/resourceaccess.cpp45
1 files changed, 45 insertions, 0 deletions
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 @@
3#include "common/console.h" 3#include "common/console.h"
4#include "common/commands.h" 4#include "common/commands.h"
5#include "common/handshake_generated.h" 5#include "common/handshake_generated.h"
6#include "common/revisionupdate_generated.h"
6 7
7#include <QDebug> 8#include <QDebug>
8#include <QProcess> 9#include <QProcess>
@@ -26,6 +27,9 @@ ResourceAccess::ResourceAccess(const QString &resourceName, QObject *parent)
26 this, &ResourceAccess::disconnected); 27 this, &ResourceAccess::disconnected);
27 connect(m_socket, SIGNAL(error(QLocalSocket::LocalSocketError)), 28 connect(m_socket, SIGNAL(error(QLocalSocket::LocalSocketError)),
28 this, SLOT(connectionError(QLocalSocket::LocalSocketError))); 29 this, SLOT(connectionError(QLocalSocket::LocalSocketError)));
30 connect(m_socket, &QIODevice::readyRead,
31 this, &ResourceAccess::readResourceMessage);
32
29} 33}
30 34
31ResourceAccess::~ResourceAccess() 35ResourceAccess::~ResourceAccess()
@@ -109,3 +113,44 @@ void ResourceAccess::connectionError(QLocalSocket::LocalSocketError error)
109 } 113 }
110} 114}
111 115
116void ResourceAccess::readResourceMessage()
117{
118 if (!m_socket->isValid()) {
119 return;
120 }
121
122 m_partialMessageBuffer += m_socket->readAll();
123
124 // should be scheduled rather than processed all at once
125 while (processMessageBuffer()) {}
126}
127
128bool ResourceAccess::processMessageBuffer()
129{
130 static const int headerSize = (sizeof(int) * 2);
131 Console::main()->log(QString("processing %1").arg(m_partialMessageBuffer.size()));
132 if (m_partialMessageBuffer.size() < headerSize) {
133 return false;
134 }
135
136 const int commandId = *(int*)m_partialMessageBuffer.constData();
137 const int size = *(int*)(m_partialMessageBuffer.constData() + sizeof(int));
138
139 if (size > m_partialMessageBuffer.size() - headerSize) {
140 return false;
141 }
142
143 switch (commandId) {
144 case Commands::RevisionUpdateCommand: {
145 auto buffer = Toynadi::GetRevisionUpdate(m_partialMessageBuffer.constData() + headerSize);
146 Console::main()->log(QString(" Revision updated to: %1").arg(buffer->revision()));
147 emit revisionChanged(buffer->revision());
148 break;
149 }
150 default:
151 break;
152 }
153
154 m_partialMessageBuffer.remove(0, headerSize + size);
155 return m_partialMessageBuffer.size() >= headerSize;
156}