ibus-qt  1.3.3
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 \
16 public: \
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 
35 namespace IBus {
36 
37 class Serializable;
38 typedef Pointer<Serializable> SerializablePointer;
39 
40 class 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 
50 protected:
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 
67 public:
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 
73 protected:
74  virtual bool serialize (QDBusArgument &argument);
75  virtual bool deserialize (const QDBusArgument &argument);
76 
77 private:
78  QMap <QString, SerializablePointer> m_attachments;
79 
80 /* static */
81 protected:
82  static void registerObject (const QString &name, NewInstanceFunc _new);
83  static void unregisterObject (const QString &name);
84 
85 private:
86  static SerializablePointer createInstance (const QString &name);
87  static QHash<QString, NewInstanceFunc *> type_table;
88 
89  IBUS_SERIALIZABLE
90 };
91 
92 template<typename T>
93 QVariant &
94 qVariantFromSerializable (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 
107 template<typename T>
108 QDBusVariant &
109 qDBusVariantFromSerializable (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 
124 template<typename T>
125 QDBusVariant
126 qDBusVariantFromSerializable (const Pointer<T> &p)
127 {
128  QDBusVariant variant;
129  return qDBusVariantFromSerializable (p, variant);
130 }
131 
132 template<typename T>
134 qDBusVariantToSerializable (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 
157 template<typename T>
158 QDBusArgument& operator<< (QDBusArgument& argument, const Pointer<T> &p)
159 {
160  QDBusVariant variant;
161  argument << qDBusVariantFromSerializable<T> (p, variant);
162  return argument;
163 }
164 
165 template<typename T>
166 const 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 
180 Q_DECLARE_METATYPE (IBus::SerializablePointer);
181 
182 #endif
Definition: qibusserializable.h:51
Definition: qibusattribute.cpp:3
Definition: qibusobject.h:18
Definition: qibusserializable.h:40
Definition: qibuspointer.h:10