else
requestInit(obj);
}
+
+ obj->synchronize(this);
}
void SignalProxy::detachObject(QObject *obj) {
}
}
+void SignalProxy::syncCall(const SyncableObject *obj, SignalProxy::ProxyMode modeType, const char *funcname, va_list ap) {
+ if(modeType != _proxyMode)
+ return;
+
+ ExtendedMetaObject *eMeta = extendedMetaObject(obj);
+
+ QVariantList params;
+
+ params << eMeta->metaObject()->className()
+ << obj->objectName()
+ << QByteArray(funcname);
+
+
+ const QList<int> &argTypes = eMeta->argTypes(eMeta->methodId(QByteArray(funcname)));
+
+ 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(funcname);
+ qWarning() << " - make sure all your data types are known by the Qt MetaSystem";
+ return;
+ }
+ params << QVariant(argTypes[i], va_arg(ap, void *));
+ }
+}
+
void SignalProxy::disconnectDevice(QIODevice *dev, const QString &reason) {
if(!reason.isEmpty())
qWarning() << qPrintable(reason);
// ==================================================
SignalProxy::ExtendedMetaObject::ExtendedMetaObject(const QMetaObject *meta)
: _meta(meta),
- _updatedRemotelyId(-1)
+ _updatedRemotelyId(_meta->indexOfSignal("updatedRemotely()"))
{
}
-const QList<int> &SignalProxy::ExtendedMetaObject::argTypes(int methodId) {
- if(!_argTypes.contains(methodId)) {
- QList<QByteArray> paramTypes = _meta->method(methodId).parameterTypes();
- QList<int> argTypes;
- for(int i = 0; i < paramTypes.count(); i++) {
- argTypes.append(QMetaType::type(paramTypes[i]));
- }
- _argTypes[methodId] = argTypes;
- }
- return _argTypes[methodId];
-}
-
-const int &SignalProxy::ExtendedMetaObject::returnType(int methodId) {
- if(!_returnType.contains(methodId)) {
- _returnType[methodId] = QMetaType::type(_meta->method(methodId).typeName());
- }
- return _returnType[methodId];
-}
-
-const int &SignalProxy::ExtendedMetaObject::minArgCount(int methodId) {
- if(!_minArgCount.contains(methodId)) {
- QString signature(_meta->method(methodId).signature());
- _minArgCount[methodId] = _meta->method(methodId).parameterTypes().count() - signature.count("=");
+const SignalProxy::ExtendedMetaObject::MethodDescriptor &SignalProxy::ExtendedMetaObject::methodDescriptor(int methodId) {
+ if(!_methods.contains(methodId)) {
+ _methods[methodId] = MethodDescriptor(_meta->method(methodId));
}
- return _minArgCount[methodId];
+ return _methods[methodId];
}
-const QByteArray &SignalProxy::ExtendedMetaObject::methodName(int methodId) {
- if(!_methodNames.contains(methodId)) {
- _methodNames[methodId] = methodName(_meta->method(methodId));
+int SignalProxy::ExtendedMetaObject::methodId(const QByteArray &methodName) {
+ if(_methodIds.contains(methodName)) {
+ return _methodIds[methodName];
+ } else {
+ for(int i = _meta->methodOffset(); i < _meta->methodCount(); i++) {
+ if(ExtendedMetaObject::methodName(_meta->method(i)) == methodName) {
+ _methodIds[methodName] = i;
+ return i;
+ }
+ }
}
- return _methodNames[methodId];
+ Q_ASSERT(false);
+ return -1;
}
const QHash<QByteArray, int> &SignalProxy::ExtendedMetaObject::syncMap() {
return _receiveMap;
}
-int SignalProxy::ExtendedMetaObject::updatedRemotelyId() {
- if(_updatedRemotelyId == -1) {
- _updatedRemotelyId = _meta->indexOfSignal("updatedRemotely()");
- }
- return _updatedRemotelyId;
-}
-
QByteArray SignalProxy::ExtendedMetaObject::methodName(const QMetaMethod &method) {
QByteArray sig(method.signature());
return sig.left(sig.indexOf("("));
return methodname;
}
+SignalProxy::ExtendedMetaObject::MethodDescriptor::MethodDescriptor(const QMetaMethod &method)
+ : _methodName(SignalProxy::ExtendedMetaObject::methodName(method)),
+ _returnType(QMetaType::type(method.typeName()))
+{
+ // determine argTypes
+ QList<QByteArray> paramTypes = method.parameterTypes();
+ QList<int> argTypes;
+ for(int i = 0; i < paramTypes.count(); i++) {
+ argTypes.append(QMetaType::type(paramTypes[i]));
+ }
+ _argTypes = argTypes;
+
+ // determine minArgCount
+ QString signature(method.signature());
+ _minArgCount = method.parameterTypes().count() - signature.count("=");
+}
+