00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #ifndef __DBUSXX_INTERFACE_H
00026 #define __DBUSXX_INTERFACE_H
00027
00028 #include <string>
00029 #include <map>
00030 #include "api.h"
00031 #include "util.h"
00032 #include "types.h"
00033
00034 #include "message.h"
00035
00036 namespace DBus {
00037
00038
00039 struct DXXAPI PropertyData
00040 {
00041 bool read;
00042 bool write;
00043 std::string sig;
00044 Variant value;
00045 };
00046
00047 typedef std::map<std::string, PropertyData> PropertyTable;
00048
00049 class IntrospectedInterface;
00050
00051 class ObjectAdaptor;
00052 class InterfaceAdaptor;
00053 class SignalMessage;
00054
00055 typedef std::map<std::string, InterfaceAdaptor *> InterfaceAdaptorTable;
00056
00057 class DXXAPI AdaptorBase
00058 {
00059 public:
00060
00061 virtual const ObjectAdaptor *object() const = 0 ;
00062
00063 protected:
00064
00065 InterfaceAdaptor *find_interface(const std::string &name);
00066
00067 virtual ~AdaptorBase()
00068 {}
00069
00070 virtual void _emit_signal(SignalMessage &) = 0;
00071
00072 InterfaceAdaptorTable _interfaces;
00073 };
00074
00075
00076
00077
00078 class ObjectProxy;
00079 class InterfaceProxy;
00080 class CallMessage;
00081
00082 typedef std::map<std::string, InterfaceProxy *> InterfaceProxyTable;
00083
00084 class DXXAPI ProxyBase
00085 {
00086 public:
00087
00088 virtual const ObjectProxy *object() const = 0 ;
00089
00090 protected:
00091
00092 InterfaceProxy *find_interface(const std::string &name);
00093
00094 virtual ~ProxyBase()
00095 {}
00096
00097 virtual Message _invoke_method(CallMessage &) = 0;
00098
00099 virtual bool _invoke_method_noreply(CallMessage &call) = 0;
00100
00101 InterfaceProxyTable _interfaces;
00102 };
00103
00104 class DXXAPI Interface
00105 {
00106 public:
00107
00108 Interface(const std::string &name);
00109
00110 virtual ~Interface();
00111
00112 inline const std::string &name() const;
00113
00114 private:
00115
00116 std::string _name;
00117 };
00118
00119
00120
00121
00122 const std::string &Interface::name() const
00123 {
00124 return _name;
00125 }
00126
00127
00128
00129
00130 typedef std::map< std::string, Slot<Message, const CallMessage &> > MethodTable;
00131
00132 class DXXAPI InterfaceAdaptor : public Interface, public virtual AdaptorBase
00133 {
00134 public:
00135
00136 InterfaceAdaptor(const std::string &name);
00137
00138 Message dispatch_method(const CallMessage &);
00139
00140 void emit_signal(const SignalMessage &);
00141
00142 Variant *get_property(const std::string &name);
00143
00144 void set_property(const std::string &name, Variant &value);
00145
00146 virtual IntrospectedInterface *const introspect() const
00147 {
00148 return NULL;
00149 }
00150
00151 protected:
00152
00153 MethodTable _methods;
00154 PropertyTable _properties;
00155 };
00156
00157
00158
00159
00160 typedef std::map< std::string, Slot<void, const SignalMessage &> > SignalTable;
00161
00162 class DXXAPI InterfaceProxy : public Interface, public virtual ProxyBase
00163 {
00164 public:
00165
00166 InterfaceProxy(const std::string &name);
00167
00168 Message invoke_method(const CallMessage &);
00169
00170 bool invoke_method_noreply(const CallMessage &call);
00171
00172 bool dispatch_signal(const SignalMessage &);
00173
00174 protected:
00175
00176 SignalTable _signals;
00177 };
00178
00179 # define register_method(interface, method, callback) \
00180 InterfaceAdaptor::_methods[ #method ] = \
00181 new ::DBus::Callback< interface, ::DBus::Message, const ::DBus::CallMessage &>(this, & interface :: callback);
00182
00183 # define bind_property(variable, type, can_read, can_write) \
00184 InterfaceAdaptor::_properties[ #variable ].read = can_read; \
00185 InterfaceAdaptor::_properties[ #variable ].write = can_write; \
00186 InterfaceAdaptor::_properties[ #variable ].sig = type; \
00187 variable.bind(InterfaceAdaptor::_properties[ #variable ]);
00188
00189 # define connect_signal(interface, signal, callback) \
00190 InterfaceProxy::_signals[ #signal ] = \
00191 new ::DBus::Callback< interface, void, const ::DBus::SignalMessage &>(this, & interface :: callback);
00192
00193 }
00194
00195 #endif//__DBUSXX_INTERFACE_H