QServiceProxy::QServiceProxy(const QByteArray& metadata, ObjectEndPoint* endPoint, QObject* parent) : QObject(parent) { Q_ASSERT(endPoint); d = new QServiceProxyPrivate(); d->metadata = metadata; d->meta = 0; d->endPoint = endPoint; 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 { QMetaMethodBuilder b = builder.addSignal("errorUnrecoverableIPCFault(QService::UnrecoverableIPCError)"); // After all methods are filled in, otherwise qvector won't be big enough localSignals.fill(false, builder.methodCount()); localSignals.replace(b.index(), true); // Call activate locally d->meta = builder.toMetaObject(); } }
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); } }
bool Test::addSlot(const QString &slot) { if (d->slotId2Name.key(slot, -1) != -1) return false; QDataStream istream(d->metadata); QMetaObjectBuilder builder; QMap<QByteArray, const QMetaObject*> refs; builder.deserialize(istream, refs); int metaIndex = builder.addSlot(slot.toLocal8Bit()).index(); d->slotId2Name.insert(metaIndex + d->meta->methodOffset(), slot); if (d->meta) free(d->meta); d->meta = builder.toMetaObject(); QDataStream ostream(&d->metadata, QIODevice::WriteOnly); builder.serialize(ostream); return true; }
bool Test::addSignal(const QString &signal) { if (d->signalName2Id.value(signal, -1) != -1) return false; QDataStream istream(d->metadata); QMetaObjectBuilder builder; QMap<QByteArray, const QMetaObject*> refs; builder.deserialize(istream, refs); int metaIndex = builder.addSignal(signal.toLocal8Bit()).index() + d->meta->methodOffset(); d->signalName2Id.insert(signal, metaIndex); if (d->meta) free(d->meta); d->meta = builder.toMetaObject(); QDataStream ostream(&d->metadata, QIODevice::WriteOnly); builder.serialize(ostream); return true; }
bool Test::removeSlot(const QString &slot) { if (d->slotId2Name.key(slot, -1) == -1) return false; QDataStream istream(d->metadata); QMetaObjectBuilder builder; QMap<QByteArray, const QMetaObject*> refs; builder.deserialize(istream, refs); int metaIndex = d->slotId2Name.key(slot); builder.removeMethod(metaIndex - d->meta->methodOffset()); d->slotId2Name.remove(metaIndex); if (d->meta) free(d->meta); d->meta = builder.toMetaObject(); QDataStream ostream(&d->metadata, QIODevice::WriteOnly); builder.serialize(ostream); return true; }
bool Test::removeSignal(const QString &signal) { if (d->signalName2Id.value(signal, -1) == -1) return false; QDataStream istream(d->metadata); QMetaObjectBuilder builder; QMap<QByteArray, const QMetaObject*> refs; builder.deserialize(istream, refs); int metaIndex = d->signalName2Id.value(signal) - d->meta->methodOffset(); d->signalName2Id.remove(signal); builder.removeMethod(metaIndex); if (d->meta) free(d->meta); d->meta = builder.toMetaObject(); QDataStream ostream(&d->metadata, QIODevice::WriteOnly); builder.serialize(ostream); return true; }