QServiceProxy::QServiceProxy(const QByteArray& metadata, ObjectEndPoint* endPoint, QObject* parent) : QServiceProxyBase(endPoint, parent) { Q_ASSERT(endPoint); d = new QServiceProxyPrivate(); d->metadata = metadata; d->meta = 0; d->endPoint = endPoint; d->localToRemote = 0; d->remoteToLocal = 0; QDataStream stream(d->metadata); QMetaObjectBuilder builder; QMap<QByteArray, const QMetaObject*> refs; builder.deserialize(stream, refs); if (stream.status() != QDataStream::Ok) { qWarning() << "Invalid metaObject for service received"; } else { QMetaObject *remote = builder.toMetaObject(); builder.setSuperClass(QServiceProxyBase::metaObject()); QMetaObject *local = builder.toMetaObject(); d->remoteToLocal = new int[local->methodCount()]; d->localToRemote = new int[local->methodCount()]; for (int i = 0; i < local->methodCount(); i++){ const QMetaMethod m = local->method(i); int r = remote->indexOfMethod(m.methodSignature().constData()); d->localToRemote[i] = r; if (r > 0) d->remoteToLocal[r] = i; } #if defined(QT_SFW_IPC_DEBUG) && defined(QT_SFW_IPC_DEBUG_VERBOSE) QString mapping = QString::fromLatin1("%%% QWE Doing lookup table for ") + endPoint->objectName(); for (int i = 0; i < local->methodCount(); i++){ const QMetaMethod m = local->method(i); int r = d->localToRemote[i]; mapping.append(QString::fromLatin1("\n%%%Mapping %1 from %2 to %3").arg(QString::fromLatin1(m.signature())).arg(i).arg(r)); } QServiceDebugLog::instance()->appendToLog(mapping); #endif d->meta = local; endPoint->setLookupTable(d->localToRemote, d->remoteToLocal); } }