+void SignalProxy::objectRenamed(const QString &newname, const QString &oldname) {
+ SyncableObject *syncObject = qobject_cast<SyncableObject *>(sender());
+ const QMetaObject *meta = syncObject->metaObject();
+ const QByteArray className(meta->className());
+ objectRenamed(className, newname, oldname);
+
+ if(proxyMode() == Client)
+ return;
+
+ QVariantList params;
+ params << "__objectRenamed__" << className << newname << oldname;
+ dispatchSignal(RpcCall, params);
+}
+
+void SignalProxy::objectRenamed(const QByteArray &classname, const QString &newname, const QString &oldname) {
+ if(_syncSlave.contains(classname) && _syncSlave[classname].contains(oldname) && oldname != newname) {
+ SyncableObject *obj = _syncSlave[classname][newname] = _syncSlave[classname].take(oldname);
+ requestInit(obj);
+ }
+}
+
+void SignalProxy::setArgTypes(QObject* obj, int methodId) {
+ const QMetaObject *meta = metaObject(obj);
+ QList<QByteArray> p = meta->method(methodId).parameterTypes();
+ QList<int> argTypes;
+ int ct = p.count();
+ for(int i=0; i<ct; i++)
+ argTypes.append(QMetaType::type(p.value(i)));
+
+ Q_ASSERT(!_classInfo[meta]->argTypes.contains(methodId));
+ _classInfo[meta]->argTypes[methodId] = argTypes;
+}
+
+const QList<int> &SignalProxy::argTypes(QObject *obj, int methodId) {
+ const QMetaObject *meta = metaObject(obj);
+ Q_ASSERT(_classInfo.contains(meta));
+ if(!_classInfo[meta]->argTypes.contains(methodId))
+ setArgTypes(obj, methodId);
+ return _classInfo[meta]->argTypes[methodId];
+}
+
+void SignalProxy::setReturnType(QObject *obj, int methodId) {
+ const QMetaObject *meta = metaObject(obj);
+ int returnType = QMetaType::type(meta->method(methodId).typeName());
+
+ Q_ASSERT(!_classInfo[meta]->returnType.contains(methodId));
+ _classInfo[meta]->returnType[methodId] = returnType;
+}
+
+const int &SignalProxy::returnType(QObject *obj, int methodId) {
+ const QMetaObject *meta = metaObject(obj);
+ Q_ASSERT(_classInfo.contains(meta));
+ if(!_classInfo[meta]->returnType.contains(methodId))
+ setReturnType(obj, methodId);
+ return _classInfo[meta]->returnType[methodId];
+}
+
+void SignalProxy::setMinArgCount(QObject *obj, int methodId) {
+ const QMetaObject *meta = metaObject(obj);
+ QString signature(meta->method(methodId).signature());
+ int minCount = meta->method(methodId).parameterTypes().count() - signature.count("=");
+ Q_ASSERT(!_classInfo[meta]->minArgCount.contains(methodId));
+ _classInfo[meta]->minArgCount[methodId] = minCount;
+}
+
+const int &SignalProxy::minArgCount(QObject *obj, int methodId) {
+ const QMetaObject *meta = metaObject(obj);
+ Q_ASSERT(_classInfo.contains(meta));
+ if(!_classInfo[meta]->minArgCount.contains(methodId))
+ setMinArgCount(obj, methodId);
+ return _classInfo[meta]->minArgCount[methodId];
+}
+
+void SignalProxy::setMethodName(QObject *obj, int methodId) {
+ const QMetaObject *meta = metaObject(obj);
+ QByteArray method(::methodName(meta->method(methodId)));
+ Q_ASSERT(!_classInfo[meta]->methodNames.contains(methodId));
+ _classInfo[meta]->methodNames[methodId] = method;
+}
+
+const QByteArray &SignalProxy::methodName(QObject *obj, int methodId) {
+ const QMetaObject *meta = metaObject(obj);
+ Q_ASSERT(_classInfo.contains(meta));
+ if(!_classInfo[meta]->methodNames.contains(methodId))
+ setMethodName(obj, methodId);
+ return _classInfo[meta]->methodNames[methodId];
+}
+
+
+void SignalProxy::setSyncMap(SyncableObject *obj) {
+ const QMetaObject *meta = obj->syncMetaObject();
+ QHash<QByteArray, int> syncMap;
+
+ QList<int> slotIndexes;
+ for(int i = 0; i < meta->methodCount(); i++) {
+ if(meta->method(i).methodType() == QMetaMethod::Slot)
+ slotIndexes << i;
+ }
+
+ // we're faking sync pairs for sync replies
+ QByteArray slotSignature;
+ foreach(int slotIdx, slotIndexes) {
+ slotSignature = QByteArray(meta->method(slotIdx).signature());
+ if(!slotSignature.startsWith("receive"))
+ continue;
+ syncMap[slotSignature] = slotIdx;
+ }
+
+ QMetaMethod signal, slot;
+ int matchIdx;
+ for(int signalIdx = 0; signalIdx < meta->methodCount(); signalIdx++) {
+ signal = meta->method(signalIdx);
+ if(signal.methodType() != QMetaMethod::Signal)
+ continue;
+
+ matchIdx = -1;
+ foreach(int slotIdx, slotIndexes) {
+ slot = meta->method(slotIdx);
+ if(methodsMatch(signal, slot)) {
+ matchIdx = slotIdx;
+ break;
+ }
+ }
+ if(matchIdx != -1) {
+ slotIndexes.removeAt(slotIndexes.indexOf(matchIdx));
+ syncMap[QByteArray(signal.signature())] = matchIdx;