+ //! Reads a data item from a device that has been written by writeDataToDevice().
+ /** If not enough data bytes are available, the function returns false and the QVariant reference
+ * remains untouched.
+ */
+ static bool readDataFromDevice(QIODevice *dev, quint32 &blockSize, QVariant &item, bool compressed = false);
+
+ static QString methodBaseName(const QMetaMethod &method);
+
+ const QList<int> &argTypes(QObject *obj, int methodId);
+ const int &returnType(QObject *obj, int methodId);
+ const int &minArgCount(QObject *obj, int methodId);
+ const QByteArray &methodName(QObject *obj, int methodId);
+ const QHash<QByteArray, int> &syncMap(SyncableObject *obj);
+ const QHash<int, int> &receiveMap(SyncableObject *obj);
+ int updatedRemotelyId(SyncableObject *obj);
+
+ typedef QHash<int, QList<int> > ArgHash;
+ typedef QHash<int, QByteArray> MethodNameHash;
+ struct ClassInfo {
+ ArgHash argTypes;
+ QHash<int, int> returnType;
+ QHash<int, int> minArgCount;
+ MethodNameHash methodNames;
+ int updatedRemotelyId; // id of the updatedRemotely() signal - makes things faster
+ QHash<QByteArray, int> syncMap;
+ QHash<int, int> receiveMap;
+ };
+
+ void dumpProxyStats();
+
+protected:
+ void customEvent(QEvent *event);
+
+private slots:
+ void dataAvailable();
+ void detachSender();
+ void removePeerBySender();
+ void objectRenamed(const QString &newname, const QString &oldname);
+ void objectRenamed(const QByteArray &classname, const QString &newname, const QString &oldname);
+ void sendHeartBeat();
+ void receiveHeartBeat(AbstractPeer *peer, const QVariantList ¶ms);
+ void receiveHeartBeatReply(AbstractPeer *peer, const QVariantList ¶ms);
+
+signals:
+ void peerRemoved(QIODevice *dev);
+ void connected();
+ void disconnected();
+ void objectInitialized(SyncableObject *);
+ void lagUpdated(int lag);
+
+private:
+ void init();
+ void initServer();
+ void initClient();
+
+ const QMetaObject *metaObject(QObject *obj);
+ void createClassInfo(QObject *obj);
+ void setArgTypes(QObject *obj, int methodId);
+ void setReturnType(QObject *obj, int methodId);
+ void setMinArgCount(QObject *obj, int methodId);
+ void setMethodName(QObject *obj, int methodId);
+ void setSyncMap(SyncableObject *obj);
+ void setReceiveMap(SyncableObject *obj);
+ void setUpdatedRemotelyId(SyncableObject *obj);
+
+ bool methodsMatch(const QMetaMethod &signal, const QMetaMethod &slot) const;
+
+ void dispatchSignal(QIODevice *receiver, const RequestType &requestType, const QVariantList ¶ms);
+ void dispatchSignal(const RequestType &requestType, const QVariantList ¶ms);
+
+ void receivePackedFunc(AbstractPeer *sender, const QVariant &packedFunc);
+ void receivePeerSignal(AbstractPeer *sender, const RequestType &requestType, const QVariantList ¶ms);
+ void receivePeerSignal(SignalProxy *sender, const RequestType &requestType, const QVariantList ¶ms);
+ void handleSync(AbstractPeer *sender, QVariantList params);
+ void handleInitRequest(AbstractPeer *sender, const QVariantList ¶ms);
+ void handleInitData(AbstractPeer *sender, const QVariantList ¶ms);
+ void handleSignal(const QVariantList &data);
+
+ bool invokeSlot(QObject *receiver, int methodId, const QVariantList ¶ms, QVariant &returnValue);
+ bool invokeSlot(QObject *receiver, int methodId, const QVariantList ¶ms = QVariantList());