/***************************************************************************
- * Copyright (C) 2005-07 by the Quassel IRC Team *
+ * Copyright (C) 2005-08 by the Quassel Project *
* devel@quassel-irc.org *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
- * (at your option) any later version. *
+ * (at your option) version 3. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
- ***************************************************************************
- * SignalProxy has been inspired by QxtRPCPeer, part of libqxt, *
- * the Qt eXTension Library <http://www.libqxt.org>. We would like to *
- * thank Arvid "aep" Picciani and Adam "ahigerd" Higerd for providing *
- * QxtRPCPeer, valuable input and the genius idea to (ab)use Qt's *
- * Meta Object System for transmitting signals over the network. *
- * *
- * To make contribution back into libqxt possible, redistribution and *
- * modification of this file is additionally allowed under the terms of *
- * the Common Public License, version 1.0, as published by IBM. *
***************************************************************************/
#ifndef _SIGNALPROXY_H_
#include <QString>
#include <QByteArray>
+#include <QMutex>
+
class SignalRelay;
class QMetaObject;
bool attachSlot(const QByteArray& sigName, QObject *recv, const char *slot);
void synchronize(QObject *obj);
- void synchronizeAsMaster(QObject *obj);
- void synchronizeAsSlave(QObject *obj);
void setInitialized(QObject *obj);
bool initialized(QObject *obj);
void requestInit(QObject *obj);
-
+
void detachObject(QObject *obj);
void detachSignals(QObject *sender);
void detachSlots(QObject *receiver);
-
+ void stopSync(QObject *obj);
+
+ //! Writes a QVariant to a device.
+ /** The data item is prefixed with the resulting blocksize,
+ * so the corresponding function readDataFromDevice() can check if enough data is available
+ * at the device to reread the item.
+ */
static void writeDataToDevice(QIODevice *dev, const QVariant &item);
+
+ //! 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);
static QString methodBaseName(const QMetaMethod &method);
const QList<int> &argTypes(QObject *obj, int methodId);
+ bool hasUpdateSignal(QObject *obj);
const QByteArray &methodName(QObject *obj, int methodId);
- const QHash<int, int> &syncMap(QObject *obj);
+ const QHash<QByteArray, int> &syncMap(QObject *obj);
typedef QHash<int, QList<int> > ArgHash;
typedef QHash<int, QByteArray> MethodNameHash;
struct ClassInfo {
ArgHash argTypes;
MethodNameHash methodNames;
- QHash<int, int> syncMap;
+ QHash<QByteArray, int> syncMap;
+ bool hasUpdateSignal;
};
void dumpProxyStats();
void _detachSignals(QObject *sender);
void _detachSlots(QObject *receiver);
+ void _stopSync(QObject *obj);
+
+ void dumpSyncMap(QObject *object);
+
+ // Hash of used QIODevices
+ QHash<QIODevice*, quint32> _peerByteCount;
// containg a list of argtypes for fast access
QHash<const QMetaObject *, ClassInfo*> _classInfo;
typedef QHash<QString, QObject *> ObjectId;
QHash<QByteArray, ObjectId> _syncSlave;
- // Hash of used QIODevices
- QHash<QIODevice*, quint32> _peerByteCount;
ProxyMode _proxyMode;
-
+
+ // the slaveMutex protects both containers:
+ // - _syncSlaves for sync and init calls
+ // - _attachedSlots
+ QMutex slaveMutex;
+
friend class SignalRelay;
};