00001
00002
00003
00004
00005 #ifndef DBUSCXXINTERFACEPROXY_H
00006 #define DBUSCXXINTERFACEPROXY_H
00007
00008 #include <sigc++/sigc++.h>
00009
00010 #include <string>
00011 #include <map>
00012 #include <set>
00013
00014 #include <dbus-cxx/methodproxy.h>
00015 #include <dbus-cxx/signal_proxy.h>
00016
00017 namespace DBus {
00018
00019 class ObjectProxy;
00020
00027 class InterfaceProxy
00028 {
00029 protected:
00030 InterfaceProxy(const std::string& name);
00031
00032 public:
00033 typedef DBusCxxPointer<InterfaceProxy> pointer;
00034
00035 typedef DBusCxxWeakPointer<InterfaceProxy> weak_pointer;
00036
00037 typedef std::multimap<std::string, MethodProxyBase::pointer> Methods;
00038
00039 typedef std::set<signal_proxy_base::pointer> Signals;
00040
00041 static pointer create( const std::string& name = std::string() );
00042
00043 virtual ~InterfaceProxy();
00044
00045 ObjectProxy* object() const;
00046
00047 Path path() const;
00048
00049 DBusCxxPointer<Connection> connection() const;
00050
00051 const std::string& name() const;
00052
00053 void set_name( const std::string& new_name );
00054
00055 const Methods& methods() const;
00056
00058 MethodProxyBase::pointer method( const std::string& name ) const;
00059
00060 template <class T_return>
00061 DBusCxxPointer<MethodProxy<T_return> > create_method( const std::string& name )
00062 {
00063 DBusCxxPointer< MethodProxy<T_return> > method;
00064 method = MethodProxy<T_return>::create(name);
00065 this->add_method(method);
00066 return method;
00067 }
00068
00069 template <class T_return, class T_arg1>
00070 DBusCxxPointer<MethodProxy<T_return, T_arg1> > create_method( const std::string& name )
00071 {
00072 DBusCxxPointer< MethodProxy<T_return, T_arg1> > method;
00073 method = MethodProxy<T_return, T_arg1>::create(name);
00074 this->add_method(method);
00075 return method;
00076 }
00077
00078 template <class T_return, class T_arg1,class T_arg2>
00079 DBusCxxPointer<MethodProxy<T_return, T_arg1,T_arg2> > create_method( const std::string& name )
00080 {
00081 DBusCxxPointer< MethodProxy<T_return, T_arg1,T_arg2> > method;
00082 method = MethodProxy<T_return, T_arg1,T_arg2>::create(name);
00083 this->add_method(method);
00084 return method;
00085 }
00086
00087 template <class T_return, class T_arg1,class T_arg2,class T_arg3>
00088 DBusCxxPointer<MethodProxy<T_return, T_arg1,T_arg2,T_arg3> > create_method( const std::string& name )
00089 {
00090 DBusCxxPointer< MethodProxy<T_return, T_arg1,T_arg2,T_arg3> > method;
00091 method = MethodProxy<T_return, T_arg1,T_arg2,T_arg3>::create(name);
00092 this->add_method(method);
00093 return method;
00094 }
00095
00096 template <class T_return, class T_arg1,class T_arg2,class T_arg3,class T_arg4>
00097 DBusCxxPointer<MethodProxy<T_return, T_arg1,T_arg2,T_arg3,T_arg4> > create_method( const std::string& name )
00098 {
00099 DBusCxxPointer< MethodProxy<T_return, T_arg1,T_arg2,T_arg3,T_arg4> > method;
00100 method = MethodProxy<T_return, T_arg1,T_arg2,T_arg3,T_arg4>::create(name);
00101 this->add_method(method);
00102 return method;
00103 }
00104
00105 template <class T_return, class T_arg1,class T_arg2,class T_arg3,class T_arg4,class T_arg5>
00106 DBusCxxPointer<MethodProxy<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5> > create_method( const std::string& name )
00107 {
00108 DBusCxxPointer< MethodProxy<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5> > method;
00109 method = MethodProxy<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5>::create(name);
00110 this->add_method(method);
00111 return method;
00112 }
00113
00114 template <class T_return, class T_arg1,class T_arg2,class T_arg3,class T_arg4,class T_arg5,class T_arg6>
00115 DBusCxxPointer<MethodProxy<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6> > create_method( const std::string& name )
00116 {
00117 DBusCxxPointer< MethodProxy<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6> > method;
00118 method = MethodProxy<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6>::create(name);
00119 this->add_method(method);
00120 return method;
00121 }
00122
00123 template <class T_return, class T_arg1,class T_arg2,class T_arg3,class T_arg4,class T_arg5,class T_arg6,class T_arg7>
00124 DBusCxxPointer<MethodProxy<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6,T_arg7> > create_method( const std::string& name )
00125 {
00126 DBusCxxPointer< MethodProxy<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6,T_arg7> > method;
00127 method = MethodProxy<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6,T_arg7>::create(name);
00128 this->add_method(method);
00129 return method;
00130 }
00131
00132
00133
00135 bool add_method( MethodProxyBase::pointer method );
00136
00138 void remove_method( const std::string& name );
00139
00141 void remove_method( MethodProxyBase::pointer method );
00142
00144 bool has_method( const std::string& name ) const;
00145
00147 bool has_method( MethodProxyBase::pointer method ) const;
00148
00149 CallMessage::pointer create_call_message( const std::string& method_name ) const;
00150
00151 ReturnMessage::const_pointer call( CallMessage::const_pointer, int timeout_milliseconds=-1 ) const;
00152
00153 PendingCall::pointer call_async( CallMessage::const_pointer, int timeout_milliseconds=-1 ) const;
00154
00155 template <class T_return>
00156 DBusCxxPointer<signal_proxy<T_return> > create_signal( const std::string& sig_name )
00157 {
00158 DBusCxxPointer< signal_proxy<T_return> > sig;
00159 sig = signal_proxy<T_return>::create(this->path(), m_name, sig_name);
00160 this->add_signal(sig);
00161 return sig;
00162 }
00163
00164 template <class T_return, class T_arg1>
00165 DBusCxxPointer<signal_proxy<T_return, T_arg1> > create_signal( const std::string& sig_name )
00166 {
00167 DBusCxxPointer< signal_proxy<T_return, T_arg1> > sig;
00168 sig = signal_proxy<T_return, T_arg1>::create(this->path(), m_name, sig_name);
00169 this->add_signal(sig);
00170 return sig;
00171 }
00172
00173 template <class T_return, class T_arg1,class T_arg2>
00174 DBusCxxPointer<signal_proxy<T_return, T_arg1,T_arg2> > create_signal( const std::string& sig_name )
00175 {
00176 DBusCxxPointer< signal_proxy<T_return, T_arg1,T_arg2> > sig;
00177 sig = signal_proxy<T_return, T_arg1,T_arg2>::create(this->path(), m_name, sig_name);
00178 this->add_signal(sig);
00179 return sig;
00180 }
00181
00182 template <class T_return, class T_arg1,class T_arg2,class T_arg3>
00183 DBusCxxPointer<signal_proxy<T_return, T_arg1,T_arg2,T_arg3> > create_signal( const std::string& sig_name )
00184 {
00185 DBusCxxPointer< signal_proxy<T_return, T_arg1,T_arg2,T_arg3> > sig;
00186 sig = signal_proxy<T_return, T_arg1,T_arg2,T_arg3>::create(this->path(), m_name, sig_name);
00187 this->add_signal(sig);
00188 return sig;
00189 }
00190
00191 template <class T_return, class T_arg1,class T_arg2,class T_arg3,class T_arg4>
00192 DBusCxxPointer<signal_proxy<T_return, T_arg1,T_arg2,T_arg3,T_arg4> > create_signal( const std::string& sig_name )
00193 {
00194 DBusCxxPointer< signal_proxy<T_return, T_arg1,T_arg2,T_arg3,T_arg4> > sig;
00195 sig = signal_proxy<T_return, T_arg1,T_arg2,T_arg3,T_arg4>::create(this->path(), m_name, sig_name);
00196 this->add_signal(sig);
00197 return sig;
00198 }
00199
00200 template <class T_return, class T_arg1,class T_arg2,class T_arg3,class T_arg4,class T_arg5>
00201 DBusCxxPointer<signal_proxy<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5> > create_signal( const std::string& sig_name )
00202 {
00203 DBusCxxPointer< signal_proxy<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5> > sig;
00204 sig = signal_proxy<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5>::create(this->path(), m_name, sig_name);
00205 this->add_signal(sig);
00206 return sig;
00207 }
00208
00209 template <class T_return, class T_arg1,class T_arg2,class T_arg3,class T_arg4,class T_arg5,class T_arg6>
00210 DBusCxxPointer<signal_proxy<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6> > create_signal( const std::string& sig_name )
00211 {
00212 DBusCxxPointer< signal_proxy<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6> > sig;
00213 sig = signal_proxy<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6>::create(this->path(), m_name, sig_name);
00214 this->add_signal(sig);
00215 return sig;
00216 }
00217
00218 template <class T_return, class T_arg1,class T_arg2,class T_arg3,class T_arg4,class T_arg5,class T_arg6,class T_arg7>
00219 DBusCxxPointer<signal_proxy<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6,T_arg7> > create_signal( const std::string& sig_name )
00220 {
00221 DBusCxxPointer< signal_proxy<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6,T_arg7> > sig;
00222 sig = signal_proxy<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6,T_arg7>::create(this->path(), m_name, sig_name);
00223 this->add_signal(sig);
00224 return sig;
00225 }
00226
00227
00228
00229 const Signals& signals() const;
00230
00231 signal_proxy_base::pointer signal( const std::string& signame );
00232
00233 bool add_signal( signal_proxy_base::pointer sig );
00234
00235 bool remove_signal( const std::string& signame );
00236
00237 bool remove_signal( signal_proxy_base::pointer sig );
00238
00239 bool has_signal( const std::string& signame ) const;
00240
00241 bool has_signal( signal_proxy_base::pointer sig ) const;
00242
00244 sigc::signal<void,const std::string&,const std::string&> signal_name_changed();
00245
00247 sigc::signal<void,MethodProxyBase::pointer> signal_method_added();
00248
00250 sigc::signal<void,MethodProxyBase::pointer> signal_method_removed();
00251
00252 protected:
00253
00254 friend class ObjectProxy;
00255
00256 ObjectProxy* m_object;
00257
00258 std::string m_name;
00259
00260 Methods m_methods;
00261
00262 Signals m_signals;
00263
00264 mutable pthread_rwlock_t m_methods_rwlock;
00265
00267 pthread_mutex_t m_name_mutex;
00268
00269 sigc::signal<void,const std::string&,const std::string&> m_signal_name_changed;
00270
00271 sigc::signal<void,MethodProxyBase::pointer> m_signal_method_added;
00272
00273 sigc::signal<void,MethodProxyBase::pointer> m_signal_method_removed;
00274
00275 typedef std::map<MethodProxyBase::pointer,sigc::connection> MethodSignalNameConnections;
00276
00277 MethodSignalNameConnections m_method_signal_name_connections;
00278
00279 void on_method_name_changed(const std::string& oldname, const std::string& newname, MethodProxyBase::pointer method);
00280
00281 void on_object_set_connection( DBusCxxPointer<Connection> conn );
00282
00283 void on_object_set_path( const std::string& path );
00284 };
00285
00286 }
00287
00288 #endif
00289