-void SignalProxy::handleSync(AbstractPeer *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];
- ExtendedMetaObject *eMeta = extendedMetaObject(receiver);
- if(!eMeta->syncMap().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 = eMeta->syncMap()[signal];
-
- QVariant returnValue((QVariant::Type)eMeta->returnType(slotId));
- if(!invokeSlot(receiver, slotId, params, returnValue)) {
- qWarning("SignalProxy::handleSync(): invokeMethod for \"%s\" failed ", eMeta->methodName(slotId).constData());
- return;
- }
-
- if(returnValue.type() != QVariant::Invalid && eMeta->receiveMap().contains(slotId)) {
- int receiverId = eMeta->receiveMap()[slotId];
- QVariantList returnParams;
- returnParams << className
- << objectName
- << QByteArray(receiver->metaObject()->method(receiverId).signature());
- if(eMeta->argTypes(receiverId).count() > 1)
- returnParams << params;
- returnParams << returnValue;
- sender->dispatchSignal(Sync, returnParams);
- }
-
- // send emit update signal
- invokeSlot(receiver, eMeta->updatedRemotelyId());
-}