networkevent.h
logger.h
message.h
+ protocol.h
types.h
util.h)
#include "internalconnection.h"
+using namespace Protocol;
+
template<class T>
class PeerMessageEvent : public QEvent
{
}
-void InternalConnection::dispatch(const SignalProxy::SyncMessage &msg)
+void InternalConnection::dispatch(const SyncMessage &msg)
{
dispatch(SyncMessageEvent, msg);
}
-void InternalConnection::dispatch(const SignalProxy::RpcCall &msg)
+void InternalConnection::dispatch(const RpcCall &msg)
{
dispatch(RpcCallEvent, msg);
}
-void InternalConnection::dispatch(const SignalProxy::InitRequest &msg)
+void InternalConnection::dispatch(const InitRequest &msg)
{
dispatch(InitRequestEvent, msg);
}
-void InternalConnection::dispatch(const SignalProxy::InitData &msg)
+void InternalConnection::dispatch(const InitData &msg)
{
dispatch(InitDataEvent, msg);
}
{
switch ((int)event->type()) {
case SyncMessageEvent: {
- PeerMessageEvent<SignalProxy::SyncMessage> *e = static_cast<PeerMessageEvent<SignalProxy::SyncMessage> *>(event);
+ PeerMessageEvent<SyncMessage> *e = static_cast<PeerMessageEvent<SyncMessage> *>(event);
handle(e->message);
break;
}
case RpcCallEvent: {
- PeerMessageEvent<SignalProxy::RpcCall> *e = static_cast<PeerMessageEvent<SignalProxy::RpcCall> *>(event);
+ PeerMessageEvent<RpcCall> *e = static_cast<PeerMessageEvent<RpcCall> *>(event);
handle(e->message);
break;
}
case InitRequestEvent: {
- PeerMessageEvent<SignalProxy::InitRequest> *e = static_cast<PeerMessageEvent<SignalProxy::InitRequest> *>(event);
+ PeerMessageEvent<InitRequest> *e = static_cast<PeerMessageEvent<InitRequest> *>(event);
handle(e->message);
break;
}
case InitDataEvent: {
- PeerMessageEvent<SignalProxy::InitData> *e = static_cast<PeerMessageEvent<SignalProxy::InitData> *>(event);
+ PeerMessageEvent<InitData> *e = static_cast<PeerMessageEvent<InitData> *>(event);
handle(e->message);
break;
}
#include <QTcpSocket>
+#include "protocol.h"
#include "signalproxy.h"
class QEvent;
int lag() const;
- void dispatch(const SignalProxy::SyncMessage &msg);
- void dispatch(const SignalProxy::RpcCall &msg);
- void dispatch(const SignalProxy::InitRequest &msg);
- void dispatch(const SignalProxy::InitData &msg);
+ void dispatch(const Protocol::SyncMessage &msg);
+ void dispatch(const Protocol::RpcCall &msg);
+ void dispatch(const Protocol::InitRequest &msg);
+ void dispatch(const Protocol::InitData &msg);
public slots:
void close(const QString &reason = QString());
--- /dev/null
+/***************************************************************************
+ * Copyright (C) 2005-2013 by the Quassel Project *
+ * devel@quassel-irc.org *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) version 3. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the *
+ * Free Software Foundation, Inc., *
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
+ ***************************************************************************/
+
+#ifndef PROTOCOL_H_
+#define PROTOCOL_H_
+
+#include <QByteArray>
+#include <QDateTime>
+#include <QVariantList>
+
+namespace Protocol {
+
+/*** handled by SignalProxy ***/
+
+class SyncMessage
+{
+public:
+ inline SyncMessage(const QByteArray &className, const QString &objectName, const QByteArray &slotName, const QVariantList ¶ms)
+ : _className(className), _objectName(objectName), _slotName(slotName), _params(params) {}
+
+ inline QByteArray className() const { return _className; }
+ inline QString objectName() const { return _objectName; }
+ inline QByteArray slotName() const { return _slotName; }
+
+ inline QVariantList params() const { return _params; }
+
+private:
+ QByteArray _className;
+ QString _objectName;
+ QByteArray _slotName;
+ QVariantList _params;
+};
+
+
+class RpcCall
+{
+public:
+ inline RpcCall(const QByteArray &slotName, const QVariantList ¶ms)
+ : _slotName(slotName), _params(params) {}
+
+ inline QByteArray slotName() const { return _slotName; }
+ inline QVariantList params() const { return _params; }
+
+private:
+ QByteArray _slotName;
+ QVariantList _params;
+};
+
+
+class InitRequest
+{
+public:
+ inline InitRequest(const QByteArray &className, const QString &objectName)
+ : _className(className), _objectName(objectName) {}
+
+ inline QByteArray className() const { return _className; }
+ inline QString objectName() const { return _objectName; }
+
+private:
+ QByteArray _className;
+ QString _objectName;
+};
+
+
+class InitData
+{
+public:
+ inline InitData(const QByteArray &className, const QString &objectName, const QVariantMap &initData)
+ : _className(className), _objectName(objectName), _initData(initData) {}
+
+ inline QByteArray className() const { return _className; }
+ inline QString objectName() const { return _objectName; }
+
+ inline QVariantMap initData() const { return _initData; }
+
+private:
+ QByteArray _className;
+ QString _objectName;
+ QVariantMap _initData;
+};
+
+
+/*** handled by RemoteConnection ***/
+
+class HeartBeat
+{
+public:
+ inline HeartBeat(const QDateTime ×tamp) : _timestamp(timestamp) {}
+
+ inline QDateTime timestamp() const { return _timestamp; }
+
+private:
+ QDateTime _timestamp;
+};
+
+
+class HeartBeatReply
+{
+public:
+ inline HeartBeatReply(const QDateTime ×tamp) : _timestamp(timestamp) {}
+
+ inline QDateTime timestamp() const { return _timestamp; }
+
+private:
+ QDateTime _timestamp;
+};
+
+
+};
+
+#endif
#include "legacyconnection.h"
+using namespace Protocol;
+
LegacyConnection::LegacyConnection(QTcpSocket *socket, QObject *parent)
: RemoteConnection(socket, parent),
_blockSize(0),
QByteArray className = params.takeFirst().toByteArray();
QString objectName = params.takeFirst().toString();
QByteArray slotName = params.takeFirst().toByteArray();
- handle(SignalProxy::SyncMessage(className, objectName, slotName, params));
+ handle(Protocol::SyncMessage(className, objectName, slotName, params));
break;
}
case RpcCall: {
return;
}
QByteArray slotName = params.takeFirst().toByteArray();
- handle(SignalProxy::RpcCall(slotName, params));
+ handle(Protocol::RpcCall(slotName, params));
break;
}
case InitRequest: {
}
QByteArray className = params[0].toByteArray();
QString objectName = params[1].toString();
- handle(SignalProxy::InitRequest(className, objectName));
+ handle(Protocol::InitRequest(className, objectName));
break;
}
case InitData: {
QByteArray className = params[0].toByteArray();
QString objectName = params[1].toString();
QVariantMap initData = params[2].toMap();
- handle(SignalProxy::InitData(className, objectName, initData));
+ handle(Protocol::InitData(className, objectName, initData));
break;
}
case HeartBeat: {
// so we assume it's sent today, which works in exactly the same cases as it did in the old implementation
QDateTime dateTime = QDateTime::currentDateTimeUtc();
dateTime.setTime(params[0].toTime());
- handle(RemoteConnection::HeartBeat(dateTime));
+ handle(Protocol::HeartBeat(dateTime));
break;
}
case HeartBeatReply: {
// so we assume it's sent today, which works in exactly the same cases as it did in the old implementation
QDateTime dateTime = QDateTime::currentDateTimeUtc();
dateTime.setTime(params[0].toTime());
- handle(RemoteConnection::HeartBeatReply(dateTime));
+ handle(Protocol::HeartBeatReply(dateTime));
break;
}
}
-void LegacyConnection::dispatch(const SignalProxy::SyncMessage &msg)
+void LegacyConnection::dispatch(const Protocol::SyncMessage &msg)
{
dispatchPackedFunc(QVariantList() << (qint16)Sync << msg.className() << msg.objectName() << msg.slotName() << msg.params());
}
-void LegacyConnection::dispatch(const SignalProxy::RpcCall &msg)
+void LegacyConnection::dispatch(const Protocol::RpcCall &msg)
{
dispatchPackedFunc(QVariantList() << (qint16)RpcCall << msg.slotName() << msg.params());
}
-void LegacyConnection::dispatch(const SignalProxy::InitRequest &msg)
+void LegacyConnection::dispatch(const Protocol::InitRequest &msg)
{
dispatchPackedFunc(QVariantList() << (qint16)InitRequest << msg.className() << msg.objectName());
}
-void LegacyConnection::dispatch(const SignalProxy::InitData &msg)
+void LegacyConnection::dispatch(const Protocol::InitData &msg)
{
dispatchPackedFunc(QVariantList() << (qint16)InitData << msg.className() << msg.objectName() << msg.initData());
}
-void LegacyConnection::dispatch(const RemoteConnection::HeartBeat &msg)
+void LegacyConnection::dispatch(const Protocol::HeartBeat &msg)
{
dispatchPackedFunc(QVariantList() << (qint16)HeartBeat << msg.timestamp().time());
}
-void LegacyConnection::dispatch(const RemoteConnection::HeartBeatReply &msg)
+void LegacyConnection::dispatch(const Protocol::HeartBeatReply &msg)
{
dispatchPackedFunc(QVariantList() << (qint16)HeartBeatReply << msg.timestamp().time());
}
void setSignalProxy(SignalProxy *proxy);
- void dispatch(const SignalProxy::SyncMessage &msg);
- void dispatch(const SignalProxy::RpcCall &msg);
- void dispatch(const SignalProxy::InitRequest &msg);
- void dispatch(const SignalProxy::InitData &msg);
+ void dispatch(const Protocol::SyncMessage &msg);
+ void dispatch(const Protocol::RpcCall &msg);
+ void dispatch(const Protocol::InitRequest &msg);
+ void dispatch(const Protocol::InitData &msg);
- void dispatch(const RemoteConnection::HeartBeat &msg);
- void dispatch(const RemoteConnection::HeartBeatReply &msg);
+ void dispatch(const Protocol::HeartBeat &msg);
+ void dispatch(const Protocol::HeartBeatReply &msg);
// FIXME: this is only used for the auth phase and should be replaced by something more generic
void writeSocketData(const QVariant &item);
#include "remoteconnection.h"
+using namespace Protocol;
+
RemoteConnection::RemoteConnection(QTcpSocket *socket, QObject *parent)
: SignalProxy::AbstractPeer(parent),
_socket(socket),
#include <QDateTime>
#include <QTcpSocket>
+#include "protocol.h"
#include "signalproxy.h"
class QTimer;
void transferProgress(int current, int max);
protected:
- class HeartBeat;
- class HeartBeatReply;
-
SignalProxy *signalProxy() const;
template<class T>
void handle(const T &protoMessage);
- void handle(const HeartBeat &heartBeat);
- void handle(const HeartBeatReply &heartBeatReply);
-
- virtual void dispatch(const HeartBeat &msg) = 0;
- virtual void dispatch(const HeartBeatReply &msg) = 0;
+ // These protocol messages get handled internally and won't reach SignalProxy
+ void handle(const Protocol::HeartBeat &heartBeat);
+ void handle(const Protocol::HeartBeatReply &heartBeatReply);
+ virtual void dispatch(const Protocol::HeartBeat &msg) = 0;
+ virtual void dispatch(const Protocol::HeartBeatReply &msg) = 0;
private slots:
void sendHeartBeat();
};
-// These protocol messages get handled internally and won't reach SignalProxy
-
-class RemoteConnection::HeartBeat
-{
-public:
- inline HeartBeat(const QDateTime ×tamp) : _timestamp(timestamp) {}
-
- inline QDateTime timestamp() const { return _timestamp; }
-
-private:
- QDateTime _timestamp;
-};
-
-
-class RemoteConnection::HeartBeatReply
-{
-public:
- inline HeartBeatReply(const QDateTime ×tamp) : _timestamp(timestamp) {}
-
- inline QDateTime timestamp() const { return _timestamp; }
-
-private:
- QDateTime _timestamp;
-};
-
-
// Template methods we need in the header
template<class T> inline
void RemoteConnection::handle(const T &protoMessage)
#include <QEvent>
#include <QCoreApplication>
+#include "protocol.h"
#include "syncableobject.h"
#include "util.h"
+using namespace Protocol;
+
class RemovePeerEvent : public QEvent
{
public:
params << QVariant(argTypes[i], _a[i+1]);
}
- proxy()->dispatch(SignalProxy::RpcCall(signal.signature, params));
+ proxy()->dispatch(RpcCall(signal.signature, params));
}
_id -= _slots.count();
}
}
-void SignalProxy::handle(SignalProxy::AbstractPeer *peer, const SignalProxy::SyncMessage &syncMessage)
+void SignalProxy::handle(SignalProxy::AbstractPeer *peer, const SyncMessage &syncMessage)
{
if (!_syncSlave.contains(syncMessage.className()) || !_syncSlave[syncMessage.className()].contains(syncMessage.objectName())) {
qWarning() << QString("no registered receiver for sync call: %1::%2 (objectName=\"%3\"). Params are:").arg(syncMessage.className(), syncMessage.slotName(), syncMessage.objectName())
}
-void SignalProxy::handle(SignalProxy::AbstractPeer *peer, const SignalProxy::InitRequest &initRequest)
+void SignalProxy::handle(SignalProxy::AbstractPeer *peer, const InitRequest &initRequest)
{
if (!_syncSlave.contains(initRequest.className())) {
qWarning() << "SignalProxy::handleInitRequest() received initRequest for unregistered Class:"
}
-void SignalProxy::handle(SignalProxy::AbstractPeer *peer, const SignalProxy::InitData &initData)
+void SignalProxy::handle(SignalProxy::AbstractPeer *peer, const InitData &initData)
{
Q_UNUSED(peer)
}
-void SignalProxy::handle(SignalProxy::AbstractPeer *peer, const SignalProxy::RpcCall &rpcCall)
+void SignalProxy::handle(SignalProxy::AbstractPeer *peer, const RpcCall &rpcCall)
{
Q_UNUSED(peer)
#include <QByteArray>
#include <QTimer>
+#include "protocol.h"
+
class SyncableObject;
struct QMetaObject;
+
class SignalProxy : public QObject
{
Q_OBJECT
public:
class AbstractPeer;
- class SyncMessage;
- class RpcCall;
- class InitRequest;
- class InitData;
-
enum ProxyMode {
Server,
Client
template<class T>
void dispatch(const T &protoMessage);
- void handle(AbstractPeer *peer, const SyncMessage &syncMessage);
- void handle(AbstractPeer *peer, const RpcCall &rpcCall);
- void handle(AbstractPeer *peer, const InitRequest &initRequest);
- void handle(AbstractPeer *peer, const InitData &initData);
+ void handle(AbstractPeer *peer, const Protocol::SyncMessage &syncMessage);
+ void handle(AbstractPeer *peer, const Protocol::RpcCall &rpcCall);
+ void handle(AbstractPeer *peer, const Protocol::InitRequest &initRequest);
+ void handle(AbstractPeer *peer, const Protocol::InitData &initData);
bool invokeSlot(QObject *receiver, int methodId, const QVariantList ¶ms, QVariant &returnValue);
bool invokeSlot(QObject *receiver, int methodId, const QVariantList ¶ms = QVariantList());
{
class MethodDescriptor
{
-public:
+ public:
MethodDescriptor(const QMetaMethod &method);
MethodDescriptor() : _returnType(-1), _minArgCount(-1), _receiverMode(SignalProxy::Client) {}
inline int minArgCount() const { return _minArgCount; }
inline SignalProxy::ProxyMode receiverMode() const { return _receiverMode; }
-private:
+ private:
QByteArray _methodName;
QList<int> _argTypes;
int _returnType;
virtual int lag() const = 0;
public slots:
- virtual void dispatch(const SyncMessage &msg) = 0;
- virtual void dispatch(const RpcCall &msg) = 0;
- virtual void dispatch(const InitRequest &msg) = 0;
- virtual void dispatch(const InitData &msg) = 0;
+ virtual void dispatch(const Protocol::SyncMessage &msg) = 0;
+ virtual void dispatch(const Protocol::RpcCall &msg) = 0;
+ virtual void dispatch(const Protocol::InitRequest &msg) = 0;
+ virtual void dispatch(const Protocol::InitData &msg) = 0;
virtual void close(const QString &reason = QString()) = 0;
void lagUpdated(int msecs);
};
-
-// ==================================================
-// Protocol Messages
-// ==================================================
-class SignalProxy::SyncMessage
-{
-public:
- inline SyncMessage(const QByteArray &className, const QString &objectName, const QByteArray &slotName, const QVariantList ¶ms)
- : _className(className), _objectName(objectName), _slotName(slotName), _params(params) {}
-
- inline QByteArray className() const { return _className; }
- inline QString objectName() const { return _objectName; }
- inline QByteArray slotName() const { return _slotName; }
-
- inline QVariantList params() const { return _params; }
-
-private:
- QByteArray _className;
- QString _objectName;
- QByteArray _slotName;
- QVariantList _params;
-};
-
-
-class SignalProxy::RpcCall
-{
-public:
- inline RpcCall(const QByteArray &slotName, const QVariantList ¶ms)
- : _slotName(slotName), _params(params) {}
-
- inline QByteArray slotName() const { return _slotName; }
- inline QVariantList params() const { return _params; }
-
-private:
- QByteArray _slotName;
- QVariantList _params;
-};
-
-
-class SignalProxy::InitRequest
-{
-public:
- inline InitRequest(const QByteArray &className, const QString &objectName)
- : _className(className), _objectName(objectName) {}
-
- inline QByteArray className() const { return _className; }
- inline QString objectName() const { return _objectName; }
-
-private:
- QByteArray _className;
- QString _objectName;
-};
-
-
-class SignalProxy::InitData
-{
-public:
- inline InitData(const QByteArray &className, const QString &objectName, const QVariantMap &initData)
- : _className(className), _objectName(objectName), _initData(initData) {}
-
- inline QByteArray className() const { return _className; }
- inline QString objectName() const { return _objectName; }
-
- inline QVariantMap initData() const { return _initData; }
-
-private:
- QByteArray _className;
- QString _objectName;
- QVariantMap _initData;
-};
-
#endif