00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef QIMSYSABSTRACTIPCOBJECT_H
00022 #define QIMSYSABSTRACTIPCOBJECT_H
00023
00024 #include <QObject>
00025 #include <QMetaType>
00026 #include <QDataStream>
00027 #ifndef QIMSYS_NO_DBUS
00028 #include <QDBusAbstractInterface>
00029 #include <QDBusArgument>
00030 #include <QDBusError>
00031 #include <QDBusMetaType>
00032 #include <QDBusReply>
00033 #else
00034 #include <QVariant>
00035 #endif // QIMSYS_NO_DBUS
00036
00037 #include "qimsysglobal.h"
00038 #include "dbus.h"
00039
00040 class QIMSYS_EXPORT QimsysAbstractIpcObject : public QObject
00041 {
00042 Q_OBJECT
00043 Q_DISABLE_COPY(QimsysAbstractIpcObject)
00044 public:
00045 enum Type {
00046 Server,
00047 Client,
00048 };
00049
00050 explicit QimsysAbstractIpcObject(QObject *parent = 0, Type type = Client);
00051 ~QimsysAbstractIpcObject();
00052
00053 Type type() const;
00054
00055 virtual bool init();
00056
00057 virtual bool hasError() const;
00058
00059 protected:
00060 virtual QimsysAbstractIpcObject *server() const = 0;
00061
00062 QObject *proxy() const;
00063
00064 private:
00065 class Private;
00066 Private *d;
00067 };
00068
00069
00070 #define Q_DECLARE_METAENUM(T) \
00071 Q_DECLARE_METATYPE(T) \
00072 inline QDataStream &operator<<(QDataStream &s, T value) \
00073 { \
00074 s << static_cast<qint32>(value); \
00075 return s; \
00076 } \
00077 \
00078 inline QDataStream &operator>>(QDataStream &s, T &value) \
00079 { \
00080 qint32 v = 0; \
00081 s >> v; \
00082 value = static_cast<T>(v); \
00083 return s; \
00084 }
00085
00086 #ifndef QIMSYS_NO_DBUS
00087 #define Q_DECLARE_DBUS_METAENUM(T) \
00088 Q_DECLARE_METAENUM(T) \
00089 \
00090 DBUSARGUMENT_OUT(T value, \
00091 arg.beginStructure(); \
00092 arg << static_cast<int>(value); \
00093 arg.endStructure(); \
00094 ) \
00095 \
00096 DBUSARGUMENT_IN(T &value, \
00097 arg.beginStructure(); \
00098 value = static_cast<T>(qdbus_cast<int>(arg)); \
00099 arg.endStructure(); \
00100 )
00101 #endif // QIMSYS_NO_DBUS
00102
00103 #define getProp(C, T, V, ...) \
00104 T C::V() const \
00105 {\
00106 qimsysDebugIn(); \
00107 T ret; \
00108 switch(type()) { \
00109 case Server: \
00110 ret = d->V; \
00111 break; \
00112 case Client: \
00113 if (proxy()) \
00114 ret = proxy()->property(#V).value<T>(); \
00115 else \
00116 qimsysWarning() << this << "is not initialized."; \
00117 break; \
00118 } \
00119 __VA_ARGS__ \
00120 qimsysDebugOut() << ret; \
00121 return ret; \
00122 }
00123
00124 #define setProp(C, T, v, V, ...) \
00125 void C::V(T v) \
00126 { \
00127 qimsysDebugIn() << v; \
00128 __VA_ARGS__ \
00129 switch(type()) { \
00130 case Server: \
00131 if(d->v == v) break; \
00132 d->v = v; \
00133 emit v##Changed(d->v); \
00134 break; \
00135 case Client: \
00136 if (proxy()) \
00137 proxy()->setProperty(#v, qVariantFromValue(v)); \
00138 else \
00139 qimsysWarning() << this << "is not initialized."; \
00140 break; \
00141 } \
00142 qimsysDebugOut(); \
00143 }
00144
00145 #endif // QIMSYSABSTRACTIPCOBJECT_H