X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fcommon%2Fsyncableobject.h;h=1275cc321a72d053bb715bba63d19b2694e39115;hp=fda437f38ba008b556aa71f88377e9175a9be8e2;hb=464c6d26b82c25d78834383e3dc8996ec4544ba9;hpb=62b7bed21f011037a34d7a4ea797d79fbdeff687 diff --git a/src/common/syncableobject.h b/src/common/syncableobject.h index fda437f3..1275cc32 100644 --- a/src/common/syncableobject.h +++ b/src/common/syncableobject.h @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2005-09 by the Quassel Project * + * Copyright (C) 2005-2015 by the Quassel Project * * devel@quassel-irc.org * * * * This program is free software; you can redistribute it and/or modify * @@ -15,7 +15,7 @@ * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * - * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * ***************************************************************************/ #ifndef SYNCABLEOBJECT_H @@ -28,87 +28,88 @@ #include "signalproxy.h" -class SyncableObject : public QObject { - SYNCABLE_OBJECT - Q_OBJECT +#define SYNCABLE_OBJECT static const int _classNameOffset__; +#define INIT_SYNCABLE_OBJECT(x) const int x ::_classNameOffset__ = QByteArray(staticMetaObject.className()).length() + 2; + +#ifdef Q_CC_MSVC +# define SYNC(...) sync_call__(SignalProxy::Server, (__FUNCTION__ + _classNameOffset__), __VA_ARGS__); +# define REQUEST(...) sync_call__(SignalProxy::Client, (__FUNCTION__ + _classNameOffset__), __VA_ARGS__); +#else +# define SYNC(...) sync_call__(SignalProxy::Server, __func__, __VA_ARGS__); +# define REQUEST(...) sync_call__(SignalProxy::Client, __func__, __VA_ARGS__); +#endif //Q_CC_MSVC + +#define SYNC_OTHER(x, ...) sync_call__(SignalProxy::Server, #x, __VA_ARGS__); +#define REQUEST_OTHER(x, ...) sync_call__(SignalProxy::Client, #x, __VA_ARGS__); + +#define ARG(x) const_cast(reinterpret_cast(&x)) +#define NO_ARG 0 + +class SyncableObject : public QObject +{ + SYNCABLE_OBJECT + Q_OBJECT public: - SyncableObject(QObject *parent = 0); - SyncableObject(const QString &objectName, QObject *parent = 0); - SyncableObject(const SyncableObject &other, QObject *parent = 0); - ~SyncableObject(); - - //! Stores the object's state into a QVariantMap. - /** The default implementation takes dynamic properties as well as getters that have - * names starting with "init" and stores them in a QVariantMap. Override this method in - * derived classes in order to store the object state in a custom form. - * \note This is used by SignalProxy to transmit the state of the object to clients - * that request the initial object state. Later updates use a different mechanism - * and assume that the state is completely covered by properties and init* getters. - * DO NOT OVERRIDE THIS unless you know exactly what you do! - * - * \return The object's state in a QVariantMap - */ - virtual QVariantMap toVariantMap(); - - //! Initialize the object's state from a given QVariantMap. - /** \see toVariantMap() for important information concerning this method. - */ - virtual void fromVariantMap(const QVariantMap &properties); - - virtual bool isInitialized() const; - - virtual const QMetaObject *syncMetaObject() const { return metaObject(); }; - - inline void setAllowClientUpdates(bool allow) { _allowClientUpdates = allow; } - inline bool allowClientUpdates() const { return _allowClientUpdates; } + SyncableObject(QObject *parent = 0); + SyncableObject(const QString &objectName, QObject *parent = 0); + SyncableObject(const SyncableObject &other, QObject *parent = 0); + ~SyncableObject(); + + //! Stores the object's state into a QVariantMap. + /** The default implementation takes dynamic properties as well as getters that have + * names starting with "init" and stores them in a QVariantMap. Override this method in + * derived classes in order to store the object state in a custom form. + * \note This is used by SignalProxy to transmit the state of the object to clients + * that request the initial object state. Later updates use a different mechanism + * and assume that the state is completely covered by properties and init* getters. + * DO NOT OVERRIDE THIS unless you know exactly what you do! + * + * \return The object's state in a QVariantMap + */ + virtual QVariantMap toVariantMap(); + + //! Initialize the object's state from a given QVariantMap. + /** \see toVariantMap() for important information concerning this method. + */ + virtual void fromVariantMap(const QVariantMap &properties); + + virtual bool isInitialized() const; + + virtual const QMetaObject *syncMetaObject() const { return metaObject(); } + + inline void setAllowClientUpdates(bool allow) { _allowClientUpdates = allow; } + inline bool allowClientUpdates() const { return _allowClientUpdates; } public slots: - virtual void setInitialized(); - void requestUpdate(const QVariantMap &properties); - virtual void update(const QVariantMap &properties); + virtual void setInitialized(); + void requestUpdate(const QVariantMap &properties); + virtual void update(const QVariantMap &properties); protected: - void sync_call__(SignalProxy::ProxyMode modeType, const char *funcname, ...) const; + void sync_call__(SignalProxy::ProxyMode modeType, const char *funcname, ...) const; - void renameObject(const QString &newName); - SyncableObject &operator=(const SyncableObject &other); + void renameObject(const QString &newName); + SyncableObject &operator=(const SyncableObject &other); signals: - void initDone(); - void updatedRemotely(); - void updated(); + void initDone(); + void updatedRemotely(); + void updated(); private: - void synchronize(SignalProxy *proxy); - void stopSynchronize(SignalProxy *proxy); + void synchronize(SignalProxy *proxy); + void stopSynchronize(SignalProxy *proxy); - bool setInitValue(const QString &property, const QVariant &value); + bool setInitValue(const QString &property, const QVariant &value); - bool _initialized; - bool _allowClientUpdates; + bool _initialized; + bool _allowClientUpdates; - QList _signalProxies; + QList _signalProxies; - friend class SignalProxy; + friend class SignalProxy; }; -#define SYNCABLE_OBJECT static const int _classNameOffset__; -#define INIT_SYNCABLE_OBJECT(x) const int x ::_classNameOffset__ = QByteArray(staticMetaObject.className()).length() + 2; - -#ifdef Q_WS_WIN -# define SYNC(...) sync_call__(SignalProxy::Server, (__FUNCTION__ + _classNameOffset__), __VA_ARGS__); -# define REQUEST(...) sync_call__(SignalProxy::Client, (__FUNCTION__ + _classNameOffset__) , __VA_ARGS__); -#else -# define SYNC(...) sync_call__(SignalProxy::Server, __func__, __VA_ARGS__); -# define REQUEST(...) sync_call__(SignalProxy::Client, __func__, __VA_ARGS__); -#endif //Q_WS_WIN - -#define SYNC_OTHER(x, ...) sync_call__(SignalProxy::Server, #x, __VA_ARGS__); -#define REQUEST_OTHER(x, ...) sync_call__(SignalProxy::Client, #x, __VA_ARGS__); - - -#define ARG(x) const_cast(reinterpret_cast(&x)) -#define NO_ARG 0 #endif