-void SignalProxy::sendHeartBeat() {
- dispatchSignal(SignalProxy::HeartBeat, QVariantList() << QTime::currentTime());
- QHash<QIODevice *, peerInfo>::iterator peerIter = _peers.begin();
- QHash<QIODevice *, peerInfo>::iterator peerIterEnd = _peers.end();
- while(peerIter != peerIterEnd) {
- if(peerIter->sentHeartBeats > 0) {
- updateLag(peerIter.key(), _heartBeatTimer.interval());
- }
- if(peerIter->sentHeartBeats > 1) {
- QAbstractSocket *socket = qobject_cast<QAbstractSocket *>(peerIter.key());
- qWarning() << "SignalProxy: Disconnecting peer:"
- << (socket ? qPrintable(socket->peerAddress().toString()) : "local client")
- << "(didn't receive a heartbeat for over" << peerIter->sentHeartBeats * _heartBeatTimer.interval() / 1000 << "seconds)";
- peerIter.key()->close();
- } else {
- peerIter->sentHeartBeats++;
+
+// ==================================================
+// ExtendedMetaObject
+// ==================================================
+SignalProxy::ExtendedMetaObject::ExtendedMetaObject(const QMetaObject *meta, bool checkConflicts)
+ : _meta(meta),
+ _updatedRemotelyId(_meta->indexOfSignal("updatedRemotely()"))
+{
+ for (int i = 0; i < _meta->methodCount(); i++) {
+ if (_meta->method(i).methodType() != QMetaMethod::Slot)
+ continue;
+
+#if QT_VERSION >= 0x050000
+ if (_meta->method(i).methodSignature().contains('*'))
+#else
+ if (QByteArray(_meta->method(i).signature()).contains('*'))
+#endif
+ continue; // skip methods with ptr params
+
+ QByteArray method = methodName(_meta->method(i));
+ if (method.startsWith("init"))
+ continue; // skip initializers
+
+ if (_methodIds.contains(method)) {
+ /* funny... moc creates for methods containing default parameters multiple metaMethod with separate methodIds.
+ we don't care... we just need the full fledged version
+ */
+ const QMetaMethod ¤t = _meta->method(_methodIds[method]);
+ const QMetaMethod &candidate = _meta->method(i);
+ if (current.parameterTypes().count() > candidate.parameterTypes().count()) {
+ int minCount = candidate.parameterTypes().count();
+ QList<QByteArray> commonParams = current.parameterTypes().mid(0, minCount);
+ if (commonParams == candidate.parameterTypes())
+ continue; // we already got the full featured version
+ }
+ else {
+ int minCount = current.parameterTypes().count();
+ QList<QByteArray> commonParams = candidate.parameterTypes().mid(0, minCount);
+ if (commonParams == current.parameterTypes()) {
+ _methodIds[method] = i; // use the new one
+ continue;
+ }
+ }
+ if (checkConflicts) {
+ qWarning() << "class" << meta->className() << "contains overloaded methods which is currently not supported!";
+#if QT_VERSION >= 0x050000
+ qWarning() << " - " << _meta->method(i).methodSignature() << "conflicts with" << _meta->method(_methodIds[method]).methodSignature();
+#else
+ qWarning() << " - " << _meta->method(i).signature() << "conflicts with" << _meta->method(_methodIds[method]).signature();
+#endif
+ }
+ continue;
+ }
+ _methodIds[method] = i;