- switch(callType) {
- case RpcCall:
- if(params.empty())
- qWarning() << "SignalProxy::receivePeerSignal(): received empty RPC-Call";
- else
- handleSignal(params.takeFirst().toByteArray(), params);
- break;
-
- case Sync:
- handleSync(sender, params);
- break;
-
- case InitRequest:
- handleInitRequest(sender, params);
- break;
-
- case InitData:
- handleInitData(sender, params);
- break;
-
- case HeartBeat:
- receiveHeartBeat(sender, params);
- break;
-
- case HeartBeatReply:
- receiveHeartBeatReply(sender, params);
- break;
-
- default:
- qWarning() << "SignalProxy::receivePeerSignal(): received undefined CallType" << callType << params;
- }
-}
-
-void SignalProxy::handleSync(QIODevice *sender, QVariantList params) {
- if(params.count() < 3) {
- qWarning() << "received invalid Sync call" << params;
- return;
- }
-
- QByteArray className = params.takeFirst().toByteArray();
- QString objectName = params.takeFirst().toString();
- QByteArray signal = params.takeFirst().toByteArray();
-
- if(!_syncSlave.contains(className) || !_syncSlave[className].contains(objectName)) {
- qWarning() << QString("no registered receiver for sync call: %1::%2 (objectName=\"%3\"). Params are:").arg(QString(className)).arg(QString(signal)).arg(objectName)
- << params;
- return;
- }
-
- SyncableObject *receiver = _syncSlave[className][objectName];
- if(!syncMap(receiver).contains(signal)) {
- qWarning() << QString("no matching slot for sync call: %1::%2 (objectName=\"%3\"). Params are:").arg(QString(className)).arg(QString(signal)).arg(objectName)
- << params;
- return;
- }
-
- int slotId = syncMap(receiver)[signal];
-
- QVariant returnValue((QVariant::Type)returnType(receiver, slotId));
- if(!invokeSlot(receiver, slotId, params, returnValue)) {
- qWarning("SignalProxy::handleSync(): invokeMethod for \"%s\" failed ", methodName(receiver, slotId).constData());
- return;
- }
-
- if(returnValue.type() != QVariant::Invalid && receiveMap(receiver).contains(slotId)) {
- int receiverId = receiveMap(receiver)[slotId];
- QVariantList returnParams;
- returnParams << className
- << objectName
- << QByteArray(receiver->metaObject()->method(receiverId).signature());
- if(argTypes(receiver, receiverId).count() > 1)
- returnParams << params;
- returnParams << returnValue;
- dispatchSignal(sender, Sync, returnParams);
- }
-
- // send emit update signal
- invokeSlot(receiver, updatedRemotelyId(receiver));
-}
-
-void SignalProxy::handleInitRequest(QIODevice *sender, const QVariantList ¶ms) {
- if(params.count() != 2) {
- qWarning() << "SignalProxy::handleInitRequest() received initRequest with invalid param Count:"
- << params;
- return;
- }
-
- QByteArray className(params[0].toByteArray());
- QString objectName(params[1].toString());
-
- if(!_syncSlave.contains(className)) {
- qWarning() << "SignalProxy::handleInitRequest() received initRequest for unregistered Class:"
- << className;
- return;
- }
-
- if(!_syncSlave[className].contains(objectName)) {
- qWarning() << "SignalProxy::handleInitRequest() received initRequest for unregistered Object:"
- << className << objectName;
- return;
- }
-
- SyncableObject *obj = _syncSlave[className][objectName];
-
- QVariantList params_;
- params_ << className
- << objectName
- << initData(obj);
-
- dispatchSignal(sender, InitData, params_);
-}
-
-void SignalProxy::handleInitData(QIODevice *sender, const QVariantList ¶ms) {
- Q_UNUSED(sender)
- if(params.count() != 3) {
- qWarning() << "SignalProxy::handleInitData() received initData with invalid param Count:"
- << params;
- return;
- }
-
- QByteArray className(params[0].toByteArray());
- QString objectName(params[1].toString());
- QVariantMap propertyMap(params[2].toMap());
-
- if(!_syncSlave.contains(className)) {
- qWarning() << "SignalProxy::handleInitData() received initData for unregistered Class:"
- << className;
- return;
- }
-
- if(!_syncSlave[className].contains(objectName)) {
- qWarning() << "SignalProxy::handleInitData() received initData for unregistered Object:"
- << className << objectName;
- return;
- }
-
- SyncableObject *obj = _syncSlave[className][objectName];
- setInitData(obj, propertyMap);
-}
-
-void SignalProxy::handleSignal(const QByteArray &funcName, const QVariantList ¶ms) {
- QObject* receiver;
- int methodId;
- SlotHash::const_iterator slot = _attachedSlots.constFind(funcName);
- while(slot != _attachedSlots.constEnd() && slot.key() == funcName) {
- receiver = (*slot).first;
- methodId = (*slot).second;
- if(!invokeSlot(receiver, methodId, params))
- qWarning("SignalProxy::handleSignal(): invokeMethod for \"%s\" failed ", methodName(receiver, methodId).constData());
- slot++;
- }
-}
-
-bool SignalProxy::invokeSlot(QObject *receiver, int methodId, const QVariantList ¶ms, QVariant &returnValue) {
- const QList<int> args = argTypes(receiver, methodId);
- const int numArgs = params.count() < args.count()
- ? params.count()
- : args.count();
-
- if(minArgCount(receiver, methodId) > params.count()) {
- qWarning() << "SignalProxy::invokeSlot(): not enough params to invoke" << methodName(receiver, methodId);
- return false;
- }
-
- void *_a[] = {0, // return type...
- 0, 0, 0, 0 , 0, // and 10 args - that's the max size qt can handle with signals and slots
- 0, 0, 0, 0 , 0};
-
- // check for argument compatibility and build params array
- for(int i = 0; i < numArgs; i++) {
- if(!params[i].isValid()) {
- qWarning() << "SignalProxy::invokeSlot(): received invalid data for argument number" << i << "of method" << QString("%1::%2()").arg(receiver->metaObject()->className()).arg(receiver->metaObject()->method(methodId).signature());
- qWarning() << " - make sure all your data types are known by the Qt MetaSystem";
- return false;
- }
- if(args[i] != QMetaType::type(params[i].typeName())) {
- qWarning() << "SignalProxy::invokeSlot(): incompatible param types to invoke" << methodName(receiver, methodId);
- return false;
- }
- _a[i+1] = const_cast<void *>(params[i].constData());
- }
-
- if(returnValue.type() != QVariant::Invalid)
- _a[0] = const_cast<void *>(returnValue.constData());
-
- Qt::ConnectionType type = QThread::currentThread() == receiver->thread()
- ? Qt::DirectConnection
- : Qt::QueuedConnection;
-
- if (type == Qt::DirectConnection) {
- return receiver->qt_metacall(QMetaObject::InvokeMetaMethod, methodId, _a) < 0;
- } else {
- qWarning() << "Queued Connections are not implemented yet";
- // note to self: qmetaobject.cpp:990 ff
- return false;
- }
-