-SignalProxy::SyncRelay::SyncRelay(SignalProxy::ExtendedMetaObject *eMeta, SignalProxy *parent)
- : Relay(parent),
- _eMeta(eMeta)
-{
- QByteArray signature;
- for(int i = 0; i < eMeta->metaObject()->methodCount(); i++ ) {
- signature = eMeta->metaObject()->method(i).signature();
- if(!eMeta->syncMap().contains(signature))
- continue;
-
- if((proxy()->proxyMode() == SignalProxy::Server && !signature.contains("Requested")) ||
- (proxy()->proxyMode() == SignalProxy::Client && signature.contains("Requested"))) {
- _signalIds << i;
- }
- }
- _signalCount = _signalIds.count();
-}
-
-void SignalProxy::SyncRelay::synchronize(SyncableObject *object) {
- if(object->syncMetaObject() != _eMeta->metaObject()) {
- qWarning() << Q_FUNC_INFO << "can't use SyncRelay of class" << _eMeta->metaObject()->className()
- << "for SyncableObject" << object << "with syncMetaObject of class" << object->syncMetaObject()->className();
- return;
- }
-
- QSet<int>::const_iterator sigIter = _signalIds.constBegin();
- while(sigIter != _signalIds.constEnd()) {
- QMetaObject::connect(object, *sigIter, this, QObject::staticMetaObject.methodCount() + *sigIter);
- sigIter++;
- }
-}
-
-int SignalProxy::SyncRelay::qt_metacall(QMetaObject::Call _c, int _id, void **_a) {
- _id = QObject::qt_metacall(_c, _id, _a);
- if(_id < 0)
- return _id;
-
- if(_c == QMetaObject::InvokeMetaMethod) {
- if(!_signalIds.contains(_id)) {
- qWarning() << Q_FUNC_INFO << "_id" << _id << "is not a valid SyncMethod!";
- return _id;
- }
-
- QVariantList params;
-
- params << _eMeta->metaObject()->className()
- << sender()->objectName()
- << _eMeta->metaObject()->method(_id).signature();
-
- const QList<int> &argTypes = _eMeta->argTypes(_id);
- for(int i = 0; i < argTypes.size(); i++) {
- if(argTypes[i] == 0) {
- qWarning() << Q_FUNC_INFO << "received invalid data for argument number" << i << "of signal" << QString("%1::%2").arg(_eMeta->metaObject()->className()).arg(_eMeta->metaObject()->method(_id).signature());
- qWarning() << " - make sure all your data types are known by the Qt MetaSystem";
- return _id;
- }
- params << QVariant(argTypes[i], _a[i+1]);
- }
-
- proxy()->dispatchSignal(SignalProxy::Sync, params);
- }
- _id -= _signalCount;
- return _id;
-}
-
-