ibus-qt 1.3.4
Loading...
Searching...
No Matches
qibusserializable.h
1#ifndef __Q_IBUS_SERIALIZABLE_H_
2#define __Q_IBUS_SERIALIZABLE_H_
3
4#include <QDebug>
5#include "qibusobject.h"
6#include <QDBusArgument>
7#include <QDBusVariant>
8#include <QHash>
9#include <QMap>
10
11#define INIT_PRIO_HIGH __attribute__((init_priority(1000)))
12// #define INIT_PRIO_LOW __attribute__((init_priority(2000)))
13#define INIT_PRIO_LOW
14
15#define IBUS_SERIALIZABLE \
16public: \
17 static Serializable *newInstance (void); \
18 static MetaTypeInfo staticMetaTypeInfo; \
19 virtual const MetaTypeInfo *metaTypeInfo (void) const;
20
21#define IBUS_DECLARE_SERIALIZABLE(classname, name) \
22 Serializable * \
23 classname::newInstance (void) \
24 { \
25 return (Serializable *) new classname (); \
26 } \
27 const Serializable::MetaTypeInfo * \
28 classname::metaTypeInfo (void) const \
29 { \
30 return & (classname::staticMetaTypeInfo); \
31 } \
32 Serializable::MetaTypeInfo \
33 classname::staticMetaTypeInfo INIT_PRIO_LOW (QString(#name), classname::newInstance);
34
35namespace IBus {
36
37class Serializable;
38typedef Pointer<Serializable> SerializablePointer;
39
40class Serializable : public Object
41{
42 Q_OBJECT;
43
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);
47
48 typedef Serializable * (NewInstanceFunc) (void);
49
50protected:
52 {
53 public:
54 MetaTypeInfo(const QString &name, NewInstanceFunc _new) : m_className (name) {
55 Serializable::registerObject (m_className, _new);
56 }
57 ~MetaTypeInfo (void) {
58 Serializable::unregisterObject (m_className);
59 }
60 const QString &className (void) const {
61 return m_className;
62 }
63 private:
64 QString m_className;
65 };
66
67public:
68 Serializable () {}
69 void setAttachment (const QString &key, const SerializablePointer &value);
70 SerializablePointer getAttachment (const QString &key) const;
71 SerializablePointer removeAttachment (const QString &key);
72
73protected:
74 virtual bool serialize (QDBusArgument &argument);
75 virtual bool deserialize (const QDBusArgument &argument);
76
77private:
78 QMap <QString, SerializablePointer> m_attachments;
79
80/* static */
81protected:
82 static void registerObject (const QString &name, NewInstanceFunc _new);
83 static void unregisterObject (const QString &name);
84
85private:
86 static SerializablePointer createInstance (const QString &name);
87 static QHash<QString, NewInstanceFunc *> type_table;
88
89 IBUS_SERIALIZABLE
90};
91
92template<typename T>
93QVariant &
94qVariantFromSerializable (const Pointer<T> &p, QVariant & variant)
95{
96 QDBusArgument argument;
97
98 argument.beginStructure ();
99 argument << p->metaTypeInfo ()->className ();
100 p->serialize (argument);
101 argument.endStructure ();
102
103 variant.setValue (argument);
104 return variant;
105}
106
107template<typename T>
108QDBusVariant &
109qDBusVariantFromSerializable (const Pointer<T> &p, QDBusVariant &dbus_variant)
110{
111 QVariant variant;
112 QDBusArgument argument;
113
114 argument.beginStructure ();
115 argument << p->metaTypeInfo ()->className ();
116 p->serialize (argument);
117 argument.endStructure ();
118 variant.setValue (argument);
119 dbus_variant.setVariant (variant);
120
121 return dbus_variant;
122}
123
124template<typename T>
125QDBusVariant
126qDBusVariantFromSerializable (const Pointer<T> &p)
127{
128 QDBusVariant variant;
129 return qDBusVariantFromSerializable (p, variant);
130}
131
132template<typename T>
133Pointer<T>
134qDBusVariantToSerializable (const QDBusVariant &variant)
135{
136
137 Pointer<T> p;
138 QString name;
139
140 const QDBusArgument argument = variant.variant().value<QDBusArgument> ();
141
142 if (argument.currentType () != QDBusArgument::StructureType) {
143 return p;
144 }
145
146 argument.beginStructure ();
147 argument >> name;
148 p = Serializable::createInstance (name);
149 if (!p.isNull () && !p->deserialize (argument)) {
150 p = NULL;
151 }
152 argument.endStructure ();
153
154 return p;
155}
156
157template<typename T>
158QDBusArgument& operator<< (QDBusArgument& argument, const Pointer<T> &p)
159{
160 QDBusVariant variant;
161 argument << qDBusVariantFromSerializable<T> (p, variant);
162 return argument;
163}
164
165template<typename T>
166const QDBusArgument& operator>> (const QDBusArgument& argument, Pointer<T> &p)
167{
168 Q_ASSERT ((argument.currentType () == QDBusArgument::VariantType));
169
170 QDBusVariant variant;
171 argument >> variant;
172
173 p = qDBusVariantToSerializable<T> (variant);
174
175 return argument;
176}
177
178};
179
180Q_DECLARE_METATYPE (IBus::SerializablePointer);
181
182#endif
Definition qibusobject.h:19
Definition qibuspointer.h:11
Definition qibusserializable.h:52
Definition qibusserializable.h:41
Definition qibusattribute.cpp:3