X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fcommon%2Fsyncableobject.h;h=201c002c6b1fcbe947d9199efb82598b15e5fb32;hp=04ba44ba560abc9fc25cca2e1f3ff00a69ba55ee;hb=e89cfe68c0b4d117ce79d0d38fcc085de77a3083;hpb=d1b6499b0b848d4287efae89107576548533502c diff --git a/src/common/syncableobject.h b/src/common/syncableobject.h index 04ba44ba..201c002c 100644 --- a/src/common/syncableobject.h +++ b/src/common/syncableobject.h @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2005-08 by the Quassel IRC Team * + * Copyright (C) 2005-09 by the Quassel Project * * devel@quassel-irc.org * * * * This program is free software; you can redistribute it and/or modify * @@ -18,53 +18,81 @@ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ -#ifndef _SYNCABLEOBJECT_H_ -#define _SYNCABLEOBJECT_H_ +#ifndef SYNCABLEOBJECT_H +#define SYNCABLEOBJECT_H #include #include #include #include +#include "signalproxy.h" + class SyncableObject : public QObject { Q_OBJECT - public: - SyncableObject(QObject *parent = 0); - SyncableObject(const SyncableObject &other, QObject *parent = 0); +public: + SyncableObject(QObject *parent = 0); + SyncableObject(const QString &objectName, QObject *parent = 0); + SyncableObject(const SyncableObject &other, QObject *parent = 0); + + void synchronize(SignalProxy *proxy); + + //! 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); - //! 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(); + virtual bool isInitialized() const; - //! Initialize the object's state from a given QVariantMap. - /** \see toVariantMap() for important information concerning this method. - */ - virtual void fromVariantMap(const QVariantMap &map); + virtual const QMetaObject *syncMetaObject() const { return metaObject(); }; - virtual bool isInitialized() const; + inline void setAllowClientUpdates(bool allow) { _allowClientUpdates = allow; } + inline bool allowClientUpdates() const { return _allowClientUpdates; } - public slots: - virtual void setInitialized(); +public slots: + virtual void setInitialized(); + void requestUpdate(const QVariantMap &properties); + virtual void update(const QVariantMap &properties); - signals: - void initDone(); - void updatedRemotely(); +protected: + void sync_call__(SignalProxy::ProxyMode modeType, const char *funcname, ...); - private: - bool setInitValue(const QString &property, const QVariant &value); + void renameObject(const QString &newName); + SyncableObject &operator=(const SyncableObject &other); - bool _initialized; +signals: + void initDone(); + void updatedRemotely(); + void updated(const QVariantMap &properties); + void updateRequested(const QVariantMap &properties); + void objectRenamed(QString newName, QString oldName); +private: + bool setInitValue(const QString &property, const QVariant &value); + + bool _initialized; + bool _allowClientUpdates; + + QList _signalProxies; }; +#define so_sync(...) sync_call__(SignalProxy::Server, __func__, __VA_ARGS__); +#define so_request(...) sync_call__(SignalProxy::Client, __func__, __VA_ARGS__); +#define so_arg_cast(x) const_cast(reinterpret_cast(&x)) + + #endif