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 {
69 void setAttachment (
const QString &key,
const SerializablePointer &value);
70 SerializablePointer getAttachment (
const QString &key)
const;
71 SerializablePointer removeAttachment (
const QString &key);
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);
86 static SerializablePointer createInstance (
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: qibusattribute.cpp:3
Definition: qibusobject.h:18
Definition: qibusserializable.h:40
Definition: qibuspointer.h:10