00001
00002
00003
00004
00005 #ifndef DBUSCXXOBJECTPROXY_H
00006 #define DBUSCXXOBJECTPROXY_H
00007
00008 #include <sigc++/sigc++.h>
00009
00010 #include <string>
00011 #include <map>
00012
00013 #include <dbus-cxx/signal_proxy.h>
00014 #include <dbus-cxx/interfaceproxy.h>
00015
00016 namespace DBus
00017 {
00018
00019 class Connection;
00020
00158 class ObjectProxy
00159 {
00160 protected:
00161
00162 ObjectProxy( DBusCxxPointer<Connection> conn, const std::string& destination, const std::string& path );
00163
00164 public:
00165
00166 typedef DBusCxxPointer<ObjectProxy> pointer;
00167
00168 static pointer create( const std::string& path );
00169
00170 static pointer create( const std::string& destination, const std::string& path );
00171
00172 static pointer create( DBusCxxPointer<Connection> conn, const std::string& path );
00173
00174 static pointer create( DBusCxxPointer<Connection> conn, const std::string& destination, const std::string& path );
00175
00176 virtual ~ObjectProxy();
00177
00178 DBusCxxPointer<Connection> connection() const;
00179
00180 void set_connection( DBusCxxPointer<Connection> conn );
00181
00182 const std::string& destination() const;
00183
00184 void set_destination( const std::string& destination );
00185
00186 const Path& path() const;
00187
00188 void set_path( const std::string& path );
00189
00190 typedef std::multimap<std::string, InterfaceProxy::pointer> Interfaces;
00191
00192 const Interfaces& interfaces() const;
00193
00195 InterfaceProxy::pointer interface( const std::string& name ) const;
00196
00198 InterfaceProxy::pointer operator[]( const std::string& name ) const;
00199
00201 bool add_interface( InterfaceProxy::pointer interface );
00202
00208 InterfaceProxy::pointer create_interface( const std::string& name );
00209
00211 void remove_interface( const std::string& name );
00212
00214 void remove_interface( InterfaceProxy::pointer interface );
00215
00216 bool has_interface( const std::string& name ) const;
00217
00218 bool has_interface( InterfaceProxy::pointer interface ) const;
00219
00220 InterfaceProxy::pointer default_interface() const;
00221
00222 bool set_default_interface( const std::string& new_default_name );
00223
00224 bool set_default_interface( InterfaceProxy::pointer new_default );
00225
00226 void remove_default_interface();
00227
00229 bool add_method( const std::string& interface, MethodProxyBase::pointer method );
00230
00232 bool add_method( MethodProxyBase::pointer method );
00233
00234 CallMessage::pointer create_call_message( const std::string& interface_name, const std::string& method_name ) const;
00235
00236 CallMessage::pointer create_call_message( const std::string& method_name ) const;
00237
00238 ReturnMessage::const_pointer call( CallMessage::const_pointer, int timeout_milliseconds=-1 ) const;
00239
00240 PendingCall::pointer call_async( CallMessage::const_pointer, int timeout_milliseconds=-1 ) const;
00241
00242 template <class T_return>
00243 DBusCxxPointer<MethodProxy<T_return> > create_method( const std::string& interface_name, const std::string& method_name )
00244 {
00245 InterfaceProxy::pointer interface = this->interface(interface_name);
00246 if ( not interface ) interface = this->create_interface( interface_name );
00247 return interface->create_method<T_return>(method_name);
00248 }
00249
00250 template <class T_return, class T_arg1>
00251 DBusCxxPointer<MethodProxy<T_return, T_arg1> > create_method( const std::string& interface_name, const std::string& method_name )
00252 {
00253 InterfaceProxy::pointer interface = this->interface(interface_name);
00254 if ( not interface ) interface = this->create_interface( interface_name );
00255 return interface->create_method<T_return, T_arg1>(method_name);
00256 }
00257
00258 template <class T_return, class T_arg1,class T_arg2>
00259 DBusCxxPointer<MethodProxy<T_return, T_arg1,T_arg2> > create_method( const std::string& interface_name, const std::string& method_name )
00260 {
00261 InterfaceProxy::pointer interface = this->interface(interface_name);
00262 if ( not interface ) interface = this->create_interface( interface_name );
00263 return interface->create_method<T_return, T_arg1,T_arg2>(method_name);
00264 }
00265
00266 template <class T_return, class T_arg1,class T_arg2,class T_arg3>
00267 DBusCxxPointer<MethodProxy<T_return, T_arg1,T_arg2,T_arg3> > create_method( const std::string& interface_name, const std::string& method_name )
00268 {
00269 InterfaceProxy::pointer interface = this->interface(interface_name);
00270 if ( not interface ) interface = this->create_interface( interface_name );
00271 return interface->create_method<T_return, T_arg1,T_arg2,T_arg3>(method_name);
00272 }
00273
00274 template <class T_return, class T_arg1,class T_arg2,class T_arg3,class T_arg4>
00275 DBusCxxPointer<MethodProxy<T_return, T_arg1,T_arg2,T_arg3,T_arg4> > create_method( const std::string& interface_name, const std::string& method_name )
00276 {
00277 InterfaceProxy::pointer interface = this->interface(interface_name);
00278 if ( not interface ) interface = this->create_interface( interface_name );
00279 return interface->create_method<T_return, T_arg1,T_arg2,T_arg3,T_arg4>(method_name);
00280 }
00281
00282 template <class T_return, class T_arg1,class T_arg2,class T_arg3,class T_arg4,class T_arg5>
00283 DBusCxxPointer<MethodProxy<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5> > create_method( const std::string& interface_name, const std::string& method_name )
00284 {
00285 InterfaceProxy::pointer interface = this->interface(interface_name);
00286 if ( not interface ) interface = this->create_interface( interface_name );
00287 return interface->create_method<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5>(method_name);
00288 }
00289
00290 template <class T_return, class T_arg1,class T_arg2,class T_arg3,class T_arg4,class T_arg5,class T_arg6>
00291 DBusCxxPointer<MethodProxy<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6> > create_method( const std::string& interface_name, const std::string& method_name )
00292 {
00293 InterfaceProxy::pointer interface = this->interface(interface_name);
00294 if ( not interface ) interface = this->create_interface( interface_name );
00295 return interface->create_method<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6>(method_name);
00296 }
00297
00298 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>
00299 DBusCxxPointer<MethodProxy<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6,T_arg7> > create_method( const std::string& interface_name, const std::string& method_name )
00300 {
00301 InterfaceProxy::pointer interface = this->interface(interface_name);
00302 if ( not interface ) interface = this->create_interface( interface_name );
00303 return interface->create_method<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6,T_arg7>(method_name);
00304 }
00305
00306
00307 template <class T_return>
00308 DBusCxxPointer<signal_proxy<T_return> > create_signal( const std::string& interface_name, const std::string& sig_name )
00309 {
00310 InterfaceProxy::pointer interface = this->interface(interface_name);
00311 if ( not interface ) interface = this->create_interface( interface_name );
00312 return interface->create_signal<T_return>(sig_name);
00313 }
00314
00315 template <class T_return, class T_arg1>
00316 DBusCxxPointer<signal_proxy<T_return, T_arg1> > create_signal( const std::string& interface_name, const std::string& sig_name )
00317 {
00318 InterfaceProxy::pointer interface = this->interface(interface_name);
00319 if ( not interface ) interface = this->create_interface( interface_name );
00320 return interface->create_signal<T_return, T_arg1>(sig_name);
00321 }
00322
00323 template <class T_return, class T_arg1,class T_arg2>
00324 DBusCxxPointer<signal_proxy<T_return, T_arg1,T_arg2> > create_signal( const std::string& interface_name, const std::string& sig_name )
00325 {
00326 InterfaceProxy::pointer interface = this->interface(interface_name);
00327 if ( not interface ) interface = this->create_interface( interface_name );
00328 return interface->create_signal<T_return, T_arg1,T_arg2>(sig_name);
00329 }
00330
00331 template <class T_return, class T_arg1,class T_arg2,class T_arg3>
00332 DBusCxxPointer<signal_proxy<T_return, T_arg1,T_arg2,T_arg3> > create_signal( const std::string& interface_name, const std::string& sig_name )
00333 {
00334 InterfaceProxy::pointer interface = this->interface(interface_name);
00335 if ( not interface ) interface = this->create_interface( interface_name );
00336 return interface->create_signal<T_return, T_arg1,T_arg2,T_arg3>(sig_name);
00337 }
00338
00339 template <class T_return, class T_arg1,class T_arg2,class T_arg3,class T_arg4>
00340 DBusCxxPointer<signal_proxy<T_return, T_arg1,T_arg2,T_arg3,T_arg4> > create_signal( const std::string& interface_name, const std::string& sig_name )
00341 {
00342 InterfaceProxy::pointer interface = this->interface(interface_name);
00343 if ( not interface ) interface = this->create_interface( interface_name );
00344 return interface->create_signal<T_return, T_arg1,T_arg2,T_arg3,T_arg4>(sig_name);
00345 }
00346
00347 template <class T_return, class T_arg1,class T_arg2,class T_arg3,class T_arg4,class T_arg5>
00348 DBusCxxPointer<signal_proxy<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5> > create_signal( const std::string& interface_name, const std::string& sig_name )
00349 {
00350 InterfaceProxy::pointer interface = this->interface(interface_name);
00351 if ( not interface ) interface = this->create_interface( interface_name );
00352 return interface->create_signal<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5>(sig_name);
00353 }
00354
00355 template <class T_return, class T_arg1,class T_arg2,class T_arg3,class T_arg4,class T_arg5,class T_arg6>
00356 DBusCxxPointer<signal_proxy<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6> > create_signal( const std::string& interface_name, const std::string& sig_name )
00357 {
00358 InterfaceProxy::pointer interface = this->interface(interface_name);
00359 if ( not interface ) interface = this->create_interface( interface_name );
00360 return interface->create_signal<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6>(sig_name);
00361 }
00362
00363 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>
00364 DBusCxxPointer<signal_proxy<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6,T_arg7> > create_signal( const std::string& interface_name, const std::string& sig_name )
00365 {
00366 InterfaceProxy::pointer interface = this->interface(interface_name);
00367 if ( not interface ) interface = this->create_interface( interface_name );
00368 return interface->create_signal<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6,T_arg7>(sig_name);
00369 }
00370
00371
00372
00373
00374 sigc::signal<void,InterfaceProxy::pointer> signal_interface_added();
00375
00376 sigc::signal<void,InterfaceProxy::pointer> signal_interface_removed();
00377
00378 sigc::signal<void,InterfaceProxy::pointer,InterfaceProxy::pointer> signal_default_interface_changed();
00379
00380 protected:
00381
00382 DBusCxxPointer<Connection> m_connection;
00383
00384 std::string m_destination;
00385
00386 Path m_path;
00387
00388 mutable pthread_rwlock_t m_interfaces_rwlock;
00389
00390 pthread_mutex_t m_name_mutex;
00391
00392 Interfaces m_interfaces;
00393
00394 InterfaceProxy::pointer m_default_interface;
00395
00396 sigc::signal<void,InterfaceProxy::pointer,InterfaceProxy::pointer> m_signal_default_interface_changed;
00397
00398 sigc::signal<void,InterfaceProxy::pointer> m_signal_interface_added;
00399
00400 sigc::signal<void,InterfaceProxy::pointer> m_signal_interface_removed;
00401
00402 typedef std::map<InterfaceProxy::pointer,sigc::connection> InterfaceSignalNameConnections;
00403
00404 InterfaceSignalNameConnections m_interface_signal_name_connections;
00405
00406 void on_interface_name_changed(const std::string& oldname, const std::string& newname, InterfaceProxy::pointer interface);
00407
00408 };
00409
00410 }
00411
00412 #endif