~ubuntu-branches/ubuntu/saucy/quassel/saucy-proposed

« back to all changes in this revision

Viewing changes to src/common/signalproxy.cpp

  • Committer: Bazaar Package Importer
  • Author(s): Scott Kitterman
  • Date: 2010-02-17 12:49:50 UTC
  • mto: This revision was merged to the branch mainline in revision 59.
  • Revision ID: james.westby@ubuntu.com-20100217124950-v9hajw5d2xa6fszn
Tags: upstream-0.6~beta1
ImportĀ upstreamĀ versionĀ 0.6~beta1

Show diffs side-by-side

added added

removed removed

Lines of Context:
120
120
    if(slotIter->sender == sender && (signalId == -1 || slotIter->signalId == signalId)) {
121
121
      slotIter = _slots.erase(slotIter);
122
122
      if(signalId != -1)
123
 
        break;
 
123
        break;
124
124
    } else {
125
125
      slotIter++;
126
126
    }
146
146
 
147
147
      const QList<int> &argTypes = eMeta->argTypes(signal.signalId);
148
148
      for(int i = 0; i < argTypes.size(); i++) {
149
 
        if(argTypes[i] == 0) {
150
 
          qWarning() << "SignalRelay::qt_metacall(): received invalid data for argument number" << i << "of signal" << QString("%1::%2").arg(caller->metaObject()->className()).arg(caller->metaObject()->method(_id).signature());
151
 
          qWarning() << "                            - make sure all your data types are known by the Qt MetaSystem";
152
 
          return _id;
153
 
        }
154
 
        params << QVariant(argTypes[i], _a[i+1]);
 
149
        if(argTypes[i] == 0) {
 
150
          qWarning() << "SignalRelay::qt_metacall(): received invalid data for argument number" << i << "of signal" << QString("%1::%2").arg(caller->metaObject()->className()).arg(caller->metaObject()->method(_id).signature());
 
151
          qWarning() << "                            - make sure all your data types are known by the Qt MetaSystem";
 
152
          return _id;
 
153
        }
 
154
        params << QVariant(argTypes[i], _a[i+1]);
155
155
      }
156
156
 
157
157
      proxy()->dispatchSignal(SignalProxy::RpcCall, params);
167
167
void SignalProxy::IODevicePeer::dispatchSignal(const RequestType &requestType, const QVariantList &params) {
168
168
  QVariantList packedFunc;
169
169
  packedFunc << (qint16)requestType
170
 
             << params;
 
170
             << params;
171
171
  dispatchPackedFunc(QVariant(packedFunc));
172
172
}
173
173
 
252
252
    if((*peer)->type() != AbstractPeer::IODevicePeer) {
253
253
      IODevicePeer *ioPeer = static_cast<IODevicePeer *>(*peer);
254
254
      if(ioPeer->isOpen()) {
255
 
        qWarning() << "SignalProxy: Cannot change proxy mode while connected";
256
 
        return;
 
255
        qWarning() << "SignalProxy: Cannot change proxy mode while connected";
 
256
        return;
257
257
      }
258
258
    }
259
259
    if((*peer)->type() != AbstractPeer::SignalProxyPeer) {
273
273
void SignalProxy::init() {
274
274
  _signalRelay = new SignalRelay(this);
275
275
  connect(&_heartBeatTimer, SIGNAL(timeout()), this, SLOT(sendHeartBeat()));
276
 
  _heartBeatTimer.start(30 * 1000);
 
276
  setHeartBeatInterval(30);
 
277
  setMaxHeartBeatCount(2);
 
278
  _heartBeatTimer.start();
277
279
  _secure = false;
278
280
  updateSecureState();
279
281
}
324
326
  return true;
325
327
}
326
328
 
 
329
void SignalProxy::setHeartBeatInterval(int secs) {
 
330
  if(secs != _heartBeatInterval) {
 
331
    _heartBeatInterval = secs;
 
332
    _heartBeatTimer.setInterval(secs * 1000);
 
333
  }
 
334
}
 
335
 
 
336
void SignalProxy::setMaxHeartBeatCount(int max) {
 
337
  _maxHeartBeatCount = max;
 
338
}
 
339
 
327
340
bool SignalProxy::addPeer(SignalProxy* proxy) {
328
341
  if(!proxy)
329
342
    return false;
537
550
    switch((*peer)->type()) {
538
551
    case AbstractPeer::IODevicePeer:
539
552
      {
540
 
        IODevicePeer *ioPeer = static_cast<IODevicePeer *>(*peer);
541
 
        if(ioPeer->isOpen())
542
 
          ioPeer->dispatchPackedFunc(packedFunc);
543
 
        else
544
 
          QCoreApplication::postEvent(this, new RemovePeerEvent(peer.key()));
 
553
        IODevicePeer *ioPeer = static_cast<IODevicePeer *>(*peer);
 
554
        if(ioPeer->isOpen())
 
555
          ioPeer->dispatchPackedFunc(packedFunc);
 
556
        else
 
557
          QCoreApplication::postEvent(this, new RemovePeerEvent(peer.key()));
545
558
      }
546
559
      break;
547
560
    case AbstractPeer::SignalProxyPeer:
634
647
 
635
648
  if(!_syncSlave.contains(className) || !_syncSlave[className].contains(objectName)) {
636
649
    qWarning() << QString("no registered receiver for sync call: %1::%2 (objectName=\"%3\"). Params are:").arg(QString(className)).arg(QString(slot)).arg(objectName)
637
 
               << params;
 
650
               << params;
638
651
    return;
639
652
  }
640
653
 
642
655
  ExtendedMetaObject *eMeta = extendedMetaObject(receiver);
643
656
  if(!eMeta->slotMap().contains(slot)) {
644
657
    qWarning() << QString("no matching slot for sync call: %1::%2 (objectName=\"%3\"). Params are:").arg(QString(className)).arg(QString(slot)).arg(objectName)
645
 
               << params;
 
658
               << params;
646
659
    return;
647
660
  }
648
661
 
663
676
    int receiverId = eMeta->receiveMap()[slotId];
664
677
    QVariantList returnParams;
665
678
    returnParams << className
666
 
                 << objectName
667
 
                 << eMeta->methodName(receiverId);
 
679
                 << objectName
 
680
                 << eMeta->methodName(receiverId);
668
681
    //QByteArray(receiver->metaObject()->method(receiverId).signature());
669
682
    if(eMeta->argTypes(receiverId).count() > 1)
670
683
      returnParams << params;
679
692
void SignalProxy::handleInitRequest(AbstractPeer *sender, const QVariantList &params) {
680
693
  if(params.count() != 2) {
681
694
    qWarning() << "SignalProxy::handleInitRequest() received initRequest with invalid param Count:"
682
 
               << params;
 
695
               << params;
683
696
    return;
684
697
  }
685
698
 
688
701
 
689
702
  if(!_syncSlave.contains(className)) {
690
703
    qWarning() << "SignalProxy::handleInitRequest() received initRequest for unregistered Class:"
691
 
               << className;
 
704
               << className;
692
705
    return;
693
706
  }
694
707
 
695
708
  if(!_syncSlave[className].contains(objectName)) {
696
709
    qWarning() << "SignalProxy::handleInitRequest() received initRequest for unregistered Object:"
697
 
               << className << objectName;
 
710
               << className << objectName;
698
711
    return;
699
712
  }
700
713
 
702
715
 
703
716
  QVariantList params_;
704
717
  params_ << className
705
 
          << objectName
706
 
          << initData(obj);
 
718
          << objectName
 
719
          << initData(obj);
707
720
 
708
721
  sender->dispatchSignal(InitData, params_);
709
722
}
712
725
  Q_UNUSED(sender)
713
726
  if(params.count() != 3) {
714
727
    qWarning() << "SignalProxy::handleInitData() received initData with invalid param Count:"
715
 
               << params;
 
728
               << params;
716
729
    return;
717
730
  }
718
731
 
722
735
 
723
736
  if(!_syncSlave.contains(className)) {
724
737
    qWarning() << "SignalProxy::handleInitData() received initData for unregistered Class:"
725
 
               << className;
 
738
               << className;
726
739
    return;
727
740
  }
728
741
 
729
742
  if(!_syncSlave[className].contains(objectName)) {
730
743
    qWarning() << "SignalProxy::handleInitData() received initData for unregistered Object:"
731
 
               << className << objectName;
 
744
               << className << objectName;
732
745
    return;
733
746
  }
734
747
 
768
781
  }
769
782
 
770
783
  void *_a[] = {0,              // return type...
771
 
                0, 0, 0, 0 , 0, // and 10 args - that's the max size qt can handle with signals and slots
772
 
                0, 0, 0, 0 , 0};
 
784
                0, 0, 0, 0 , 0, // and 10 args - that's the max size qt can handle with signals and slots
 
785
                0, 0, 0, 0 , 0};
773
786
 
774
787
  // check for argument compatibility and build params array
775
788
  for(int i = 0; i < numArgs; i++) {
884
897
    if(nbytes <= 4) {
885
898
      const char *data = rawItem.constData();
886
899
      if(nbytes < 4 || (data[0]!=0 || data[1]!=0 || data[2]!=0 || data[3]!=0)) {
887
 
        disconnectDevice(dev, tr("Peer sent corrupted compressed data!"));
888
 
        return false;
 
900
        disconnectDevice(dev, tr("Peer sent corrupted compressed data!"));
 
901
        return false;
889
902
      }
890
903
    }
891
904
 
912
925
 
913
926
  QVariantList params;
914
927
  params << obj->syncMetaObject()->className()
915
 
         << obj->objectName();
 
928
         << obj->objectName();
916
929
  dispatchSignal(InitRequest, params);
917
930
}
918
931
 
940
953
      IODevicePeer *ioPeer = static_cast<IODevicePeer *>(*peer);
941
954
      ioPeer->dispatchSignal(SignalProxy::HeartBeat, heartBeatParams);
942
955
      if(ioPeer->sentHeartBeats > 0) {
943
 
        updateLag(ioPeer, ioPeer->sentHeartBeats * _heartBeatTimer.interval());
 
956
        updateLag(ioPeer, ioPeer->sentHeartBeats * _heartBeatTimer.interval());
944
957
      }
945
 
      if(ioPeer->sentHeartBeats > 1)
 
958
      if(maxHeartBeatCount() >= 0 && ioPeer->sentHeartBeats >= maxHeartBeatCount())
946
959
        toClose.append(ioPeer);
947
960
      else
948
 
        ioPeer->sentHeartBeats++;
 
961
        ioPeer->sentHeartBeats++;
949
962
    }
950
963
    ++peer;
951
964
  }
1144
1157
    for(int i = 0; i < methodCount; i++) {
1145
1158
      requestSlot = _meta->method(i);
1146
1159
      if(requestSlot.methodType() != QMetaMethod::Slot)
1147
 
        continue;
 
1160
        continue;
1148
1161
 
1149
1162
      returnTypeName = requestSlot.typeName();
1150
1163
      if(QMetaType::Void == (QMetaType::Type)returnType(i))
1151
 
        continue;
 
1164
        continue;
1152
1165
 
1153
1166
      signature = QByteArray(requestSlot.signature());
1154
1167
      if(!signature.startsWith("request"))
1155
 
        continue;
 
1168
        continue;
1156
1169
 
1157
1170
      paramsPos = signature.indexOf('(');
1158
1171
      if(paramsPos == -1)
1159
 
        continue;
 
1172
        continue;
1160
1173
 
1161
1174
      methodName = signature.left(paramsPos);
1162
1175
      params = signature.mid(paramsPos);
1168
1181
      receiverId = _meta->indexOfSlot(signature);
1169
1182
 
1170
1183
      if(receiverId == -1) {
1171
 
        signature = QMetaObject::normalizedSignature(methodName + "(" + returnTypeName + ")");
1172
 
        receiverId = _meta->indexOfSlot(signature);
 
1184
        signature = QMetaObject::normalizedSignature(methodName + "(" + returnTypeName + ")");
 
1185
        receiverId = _meta->indexOfSlot(signature);
1173
1186
      }
1174
1187
 
1175
1188
      if(receiverId != -1) {
1176
 
        receiveMap[i] = receiverId;
 
1189
        receiveMap[i] = receiverId;
1177
1190
      }
1178
1191
    }
1179
1192
    _receiveMap = receiveMap;