X-Git-Url: https://git.quassel-irc.org/?a=blobdiff_plain;f=src%2Fcommon%2Fsyncableobject.h;h=7d5242b1d991e0a7818918daa11ac0a9d85ca310;hb=b8db3c55a7f66a8d6ecabf9039aabceff9ae4837;hp=04ba44ba560abc9fc25cca2e1f3ff00a69ba55ee;hpb=d1b6499b0b848d4287efae89107576548533502c;p=quassel.git diff --git a/src/common/syncableobject.h b/src/common/syncableobject.h index 04ba44ba..7d5242b1 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-2018 by the Quassel Project * * devel@quassel-irc.org * * * * This program is free software; you can redistribute it and/or modify * @@ -15,23 +15,51 @@ * 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_ -#define _SYNCABLEOBJECT_H_ +#pragma once + +#include "common-export.h" #include #include #include #include -class SyncableObject : public QObject { - Q_OBJECT +#include "signalproxy.h" + +/** + * This macro needs to be declared in syncable objects, next to the Q_OBJECT macro. + * + * @note: Specializations of a base syncable object for core/client must not use the macro; + * i.e., if you have Foo, ClientFoo and/or CoreFoo, the SYNCABLE_OBJECT macro would + * only be declared in the class declaration of Foo. + */ +#define SYNCABLE_OBJECT \ +public: \ + const QMetaObject* syncMetaObject() const final override { return &staticMetaObject; } \ + \ +private: + +#define SYNC(...) sync_call__(SignalProxy::Server, __func__, __VA_ARGS__); +#define REQUEST(...) sync_call__(SignalProxy::Client, __func__, __VA_ARGS__); + +#define SYNC_OTHER(x, ...) sync_call__(SignalProxy::Server, #x, __VA_ARGS__); +#define REQUEST_OTHER(x, ...) sync_call__(SignalProxy::Client, #x, __VA_ARGS__); - public: - SyncableObject(QObject *parent = 0); - SyncableObject(const SyncableObject &other, QObject *parent = 0); +#define ARG(x) const_cast(reinterpret_cast(&x)) +#define NO_ARG 0 + +class COMMON_EXPORT SyncableObject : public QObject +{ + Q_OBJECT + +public: + SyncableObject(QObject* parent = nullptr); + SyncableObject(const QString& objectName, QObject* parent = nullptr); + SyncableObject(const SyncableObject& other, QObject* parent = nullptr); + ~SyncableObject() override; //! Stores the object's state into a QVariantMap. /** The default implementation takes dynamic properties as well as getters that have @@ -49,22 +77,41 @@ class SyncableObject : public QObject { //! Initialize the object's state from a given QVariantMap. /** \see toVariantMap() for important information concerning this method. */ - virtual void fromVariantMap(const QVariantMap &map); + virtual void fromVariantMap(const QVariantMap& properties); virtual bool isInitialized() const; - public slots: + 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); + +protected: + void sync_call__(SignalProxy::ProxyMode modeType, const char* funcname, ...) const; + + void renameObject(const QString& newName); + SyncableObject& operator=(const SyncableObject& other); - signals: +signals: void initDone(); void updatedRemotely(); + void updated(); - private: - bool setInitValue(const QString &property, const QVariant &value); +private: + void synchronize(SignalProxy* proxy); + void stopSynchronize(SignalProxy* proxy); - bool _initialized; + bool setInitValue(const QString& property, const QVariant& value); -}; + bool _initialized{false}; + bool _allowClientUpdates{false}; + + QList _signalProxies; -#endif + friend class SignalProxy; +};