1
1
/***************************************************************************
2
* Copyright (C) 2005-2013 by the Quassel Project *
2
* Copyright (C) 2005-2014 by the Quassel Project *
3
3
* devel@quassel-irc.org *
5
5
* This program is free software; you can redistribute it and/or modify *
147
148
params << QVariant(argTypes[i], _a[i+1]);
150
proxy()->dispatch(RpcCall(signal.signature, params));
151
if (argTypes.size() >= 1 && argTypes[0] == qMetaTypeId<PeerPtr>() && proxy()->proxyMode() == SignalProxy::Server) {
152
Peer *peer = params[0].value<PeerPtr>();
153
proxy()->dispatch(peer, RpcCall(signal.signature, params));
155
proxy()->dispatch(RpcCall(signal.signature, params));
152
157
_id -= _slots.count();
511
void SignalProxy::dispatch(Peer *peer, const T &protoMessage)
513
if (peer && peer->isOpen())
514
peer->dispatch(protoMessage);
516
QCoreApplication::postEvent(this, new ::RemovePeerEvent(peer));
505
520
void SignalProxy::handle(Peer *peer, const SyncMessage &syncMessage)
507
if (!_syncSlave.contains(syncMessage.className()) || !_syncSlave[syncMessage.className()].contains(syncMessage.objectName())) {
508
qWarning() << QString("no registered receiver for sync call: %1::%2 (objectName=\"%3\"). Params are:").arg(syncMessage.className(), syncMessage.slotName(), syncMessage.objectName())
509
<< syncMessage.params();
522
if (!_syncSlave.contains(syncMessage.className) || !_syncSlave[syncMessage.className].contains(syncMessage.objectName)) {
523
qWarning() << QString("no registered receiver for sync call: %1::%2 (objectName=\"%3\"). Params are:").arg(syncMessage.className, syncMessage.slotName, syncMessage.objectName)
524
<< syncMessage.params;
513
SyncableObject *receiver = _syncSlave[syncMessage.className()][syncMessage.objectName()];
528
SyncableObject *receiver = _syncSlave[syncMessage.className][syncMessage.objectName];
514
529
ExtendedMetaObject *eMeta = extendedMetaObject(receiver);
515
if (!eMeta->slotMap().contains(syncMessage.slotName())) {
516
qWarning() << QString("no matching slot for sync call: %1::%2 (objectName=\"%3\"). Params are:").arg(syncMessage.className(), syncMessage.slotName(), syncMessage.objectName())
517
<< syncMessage.params();
530
if (!eMeta->slotMap().contains(syncMessage.slotName)) {
531
qWarning() << QString("no matching slot for sync call: %1::%2 (objectName=\"%3\"). Params are:").arg(syncMessage.className, syncMessage.slotName, syncMessage.objectName)
532
<< syncMessage.params;
521
int slotId = eMeta->slotMap()[syncMessage.slotName()];
536
int slotId = eMeta->slotMap()[syncMessage.slotName];
522
537
if (proxyMode() != eMeta->receiverMode(slotId)) {
523
538
qWarning("SignalProxy::handleSync(): invokeMethod for \"%s\" failed. Wrong ProxyMode!", eMeta->methodName(slotId).constData());
527
542
QVariant returnValue((QVariant::Type)eMeta->returnType(slotId));
528
if (!invokeSlot(receiver, slotId, syncMessage.params(), returnValue)) {
543
if (!invokeSlot(receiver, slotId, syncMessage.params, returnValue, peer)) {
529
544
qWarning("SignalProxy::handleSync(): invokeMethod for \"%s\" failed ", eMeta->methodName(slotId).constData());
534
549
int receiverId = eMeta->receiveMap()[slotId];
535
550
QVariantList returnParams;
536
551
if (eMeta->argTypes(receiverId).count() > 1)
537
returnParams << syncMessage.params();
552
returnParams << syncMessage.params;
538
553
returnParams << returnValue;
539
peer->dispatch(SyncMessage(syncMessage.className(), syncMessage.objectName(), eMeta->methodName(receiverId), returnParams));
554
peer->dispatch(SyncMessage(syncMessage.className, syncMessage.objectName, eMeta->methodName(receiverId), returnParams));
542
557
// send emit update signal
547
562
void SignalProxy::handle(Peer *peer, const InitRequest &initRequest)
549
if (!_syncSlave.contains(initRequest.className())) {
564
if (!_syncSlave.contains(initRequest.className)) {
550
565
qWarning() << "SignalProxy::handleInitRequest() received initRequest for unregistered Class:"
551
<< initRequest.className();
566
<< initRequest.className;
555
if (!_syncSlave[initRequest.className()].contains(initRequest.objectName())) {
570
if (!_syncSlave[initRequest.className].contains(initRequest.objectName)) {
556
571
qWarning() << "SignalProxy::handleInitRequest() received initRequest for unregistered Object:"
557
<< initRequest.className() << initRequest.objectName();
572
<< initRequest.className << initRequest.objectName;
561
SyncableObject *obj = _syncSlave[initRequest.className()][initRequest.objectName()];
562
peer->dispatch(InitData(initRequest.className(), initRequest.objectName(), initData(obj)));
576
SyncableObject *obj = _syncSlave[initRequest.className][initRequest.objectName];
577
peer->dispatch(InitData(initRequest.className, initRequest.objectName, initData(obj)));
570
if (!_syncSlave.contains(initData.className())) {
585
if (!_syncSlave.contains(initData.className)) {
571
586
qWarning() << "SignalProxy::handleInitData() received initData for unregistered Class:"
572
<< initData.className();
587
<< initData.className;
576
if (!_syncSlave[initData.className()].contains(initData.objectName())) {
591
if (!_syncSlave[initData.className].contains(initData.objectName)) {
577
592
qWarning() << "SignalProxy::handleInitData() received initData for unregistered Object:"
578
<< initData.className() << initData.objectName();
593
<< initData.className << initData.objectName;
582
SyncableObject *obj = _syncSlave[initData.className()][initData.objectName()];
583
setInitData(obj, initData.initData());
597
SyncableObject *obj = _syncSlave[initData.className][initData.objectName];
598
setInitData(obj, initData.initData);
587
602
void SignalProxy::handle(Peer *peer, const RpcCall &rpcCall)
591
604
QObject *receiver;
593
SlotHash::const_iterator slot = _attachedSlots.constFind(rpcCall.slotName());
594
while (slot != _attachedSlots.constEnd() && slot.key() == rpcCall.slotName()) {
606
SlotHash::const_iterator slot = _attachedSlots.constFind(rpcCall.slotName);
607
while (slot != _attachedSlots.constEnd() && slot.key() == rpcCall.slotName) {
595
608
receiver = (*slot).first;
596
609
methodId = (*slot).second;
597
if (!invokeSlot(receiver, methodId, rpcCall.params())) {
610
if (!invokeSlot(receiver, methodId, rpcCall.params, peer)) {
598
611
ExtendedMetaObject *eMeta = extendedMetaObject(receiver);
599
612
qWarning("SignalProxy::handleSignal(): invokeMethod for \"%s\" failed ", eMeta->methodName(methodId).constData());
606
bool SignalProxy::invokeSlot(QObject *receiver, int methodId, const QVariantList ¶ms, QVariant &returnValue)
619
bool SignalProxy::invokeSlot(QObject *receiver, int methodId, const QVariantList ¶ms, QVariant &returnValue, Peer *peer)
608
621
ExtendedMetaObject *eMeta = extendedMetaObject(receiver);
609
622
const QList<int> args = eMeta->argTypes(methodId);
631
644
qWarning() << "SignalProxy::invokeSlot(): incompatible param types to invoke" << eMeta->methodName(methodId);
634
_a[i+1] = const_cast<void *>(params[i].constData());
647
// if first arg is a PeerPtr, replace it by the address of the peer originally receiving the RpcCall
648
if (peer && i == 0 && args[0] == qMetaTypeId<PeerPtr>()) {
649
QVariant v = QVariant::fromValue<PeerPtr>(peer);
650
_a[1] = const_cast<void*>(v.constData());
652
_a[i+1] = const_cast<void *>(params[i].constData());
637
655
if (returnValue.type() != QVariant::Invalid)
655
bool SignalProxy::invokeSlot(QObject *receiver, int methodId, const QVariantList ¶ms)
673
bool SignalProxy::invokeSlot(QObject *receiver, int methodId, const QVariantList ¶ms, Peer *peer)
658
return invokeSlot(receiver, methodId, params, ret);
676
return invokeSlot(receiver, methodId, params, ret, peer);
723
741
params << QVariant(argTypes[i], va_arg(ap, void *));
726
dispatch(SyncMessage(eMeta->metaObject()->className(), obj->objectName(), QByteArray(funcname), params));
744
if (argTypes.size() >= 1 && argTypes[0] == qMetaTypeId<PeerPtr>() && proxyMode() == SignalProxy::Server) {
745
Peer *peer = params[0].value<PeerPtr>();
746
dispatch(peer, SyncMessage(eMeta->metaObject()->className(), obj->objectName(), QByteArray(funcname), params));
748
dispatch(SyncMessage(eMeta->metaObject()->className(), obj->objectName(), QByteArray(funcname), params));