1 #ifndef __Q_IBUS_SERIALIZABLE_H_
2 #define __Q_IBUS_SERIALIZABLE_H_
5 #include "qibusobject.h"
6 #include <QDBusArgument>
7 #include <QDBusVariant>
11 #define INIT_PRIO_HIGH __attribute__((init_priority(1000)))
15 #define IBUS_SERIALIZABLE \
17 static Serializable *newInstance (void); \
18 static MetaTypeInfo staticMetaTypeInfo; \
19 virtual const MetaTypeInfo *metaTypeInfo (void) const;
21 #define IBUS_DECLARE_SERIALIZABLE(classname, name) \
23 classname::newInstance (void) \
25 return (Serializable *) new classname (); \
27 const Serializable::MetaTypeInfo * \
28 classname::metaTypeInfo (void) const \
30 return & (classname::staticMetaTypeInfo); \
32 Serializable::MetaTypeInfo \
33 classname::staticMetaTypeInfo INIT_PRIO_LOW (QString(#name), classname::newInstance);
38 typedef Pointer<Serializable> SerializablePointer;
44 template<
typename T>
friend QDBusVariant & qDBusVariantFromSerializable (
const Pointer<T> &p, QDBusVariant & dbus_variant);
45 template<
typename T>
friend QDBusVariant qDBusVariantFromSerializable (
const Pointer<T> &p);
46 template<
typename T>
friend Pointer<T> qDBusVariantToSerializable (
const QDBusVariant &variant);
54 MetaTypeInfo(
const QString &name, NewInstanceFunc _new) : m_className (name) {
55 Serializable::registerObject (m_className, _new);
58 Serializable::unregisterObject (m_className);
60 const QString &className (
void)
const {
74 virtual bool serialize (QDBusArgument &argument);
75 virtual bool deserialize (
const QDBusArgument &argument);
78 QMap <QString, SerializablePointer> m_attachments;
82 static void registerObject (
const QString &name, NewInstanceFunc _new);
83 static void unregisterObject (
const QString &name);
87 static QHash<QString, NewInstanceFunc *> type_table;
94 qVariantFromSerializable (
const Pointer<T> &p, QVariant & variant)
96 QDBusArgument argument;
98 argument.beginStructure ();
99 argument << p->metaTypeInfo ()->className ();
100 p->serialize (argument);
101 argument.endStructure ();
103 variant.setValue (argument);
109 qDBusVariantFromSerializable (
const Pointer<T> &p, QDBusVariant &dbus_variant)
112 QDBusArgument argument;
114 argument.beginStructure ();
115 argument << p->metaTypeInfo ()->className ();
116 p->serialize (argument);
117 argument.endStructure ();
118 variant.setValue (argument);
119 dbus_variant.setVariant (variant);
126 qDBusVariantFromSerializable (
const Pointer<T> &p)
128 QDBusVariant variant;
129 return qDBusVariantFromSerializable (p, variant);
134 qDBusVariantToSerializable (
const QDBusVariant &variant)
140 const QDBusArgument argument = variant.variant().value<QDBusArgument> ();
142 if (argument.currentType () != QDBusArgument::StructureType) {
146 argument.beginStructure ();
148 p = Serializable::createInstance (name);
149 if (!p.isNull () && !p->deserialize (argument)) {
152 argument.endStructure ();
158 QDBusArgument& operator<< (QDBusArgument& argument, const Pointer<T> &p)
160 QDBusVariant variant;
161 argument << qDBusVariantFromSerializable<T> (p, variant);
166 const QDBusArgument& operator>> (
const QDBusArgument& argument, Pointer<T> &p)
168 Q_ASSERT ((argument.currentType () == QDBusArgument::VariantType));
170 QDBusVariant variant;
173 p = qDBusVariantToSerializable<T> (variant);
Definition: qibusobject.h:18
Definition: qibusserializable.h:40
Definition: qibuspointer.h:10