00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #include <sigc++/sigc++.h>
00024
00025 #include <string>
00026 #include <map>
00027
00028 #include <dbus-cxx/signal_proxy.h>
00029 #include <dbus-cxx/interfaceproxy.h>
00030
00031 #ifndef DBUSCXX_OBJECTPROXY_H
00032 #define DBUSCXX_OBJECTPROXY_H
00033
00034 namespace DBus
00035 {
00036
00037 class Connection;
00038
00177 class ObjectProxy
00178 {
00179 protected:
00180
00185 ObjectProxy( DBusCxxPointer<Connection> conn, const std::string& destination, const std::string& path );
00186
00187 public:
00188
00194 typedef DBusCxxPointer<ObjectProxy> pointer;
00195
00200 static pointer create( const std::string& path );
00201
00207 static pointer create( const std::string& destination, const std::string& path );
00208
00209 static pointer create( DBusCxxPointer<Connection> conn, const std::string& path );
00210
00211 static pointer create( DBusCxxPointer<Connection> conn, const std::string& destination, const std::string& path );
00212
00213 virtual ~ObjectProxy();
00214
00215 DBusCxxPointer<Connection> connection() const;
00216
00217 void set_connection( DBusCxxPointer<Connection> conn );
00218
00219 const std::string& destination() const;
00220
00221 void set_destination( const std::string& destination );
00222
00223 const Path& path() const;
00224
00225 void set_path( const std::string& path );
00226
00227 typedef std::multimap<std::string, InterfaceProxy::pointer> Interfaces;
00228
00229 const Interfaces& interfaces() const;
00230
00232 InterfaceProxy::pointer interface( const std::string& name ) const;
00233
00235 InterfaceProxy::pointer operator[]( const std::string& name ) const;
00236
00238 bool add_interface( InterfaceProxy::pointer interface );
00239
00245 InterfaceProxy::pointer create_interface( const std::string& name );
00246
00248 void remove_interface( const std::string& name );
00249
00251 void remove_interface( InterfaceProxy::pointer interface );
00252
00253 bool has_interface( const std::string& name ) const;
00254
00255 bool has_interface( InterfaceProxy::pointer interface ) const;
00256
00257 InterfaceProxy::pointer default_interface() const;
00258
00259 bool set_default_interface( const std::string& new_default_name );
00260
00261 bool set_default_interface( InterfaceProxy::pointer new_default );
00262
00263 void remove_default_interface();
00264
00266 bool add_method( const std::string& interface, MethodProxyBase::pointer method );
00267
00269 bool add_method( MethodProxyBase::pointer method );
00270
00271 CallMessage::pointer create_call_message( const std::string& interface_name, const std::string& method_name ) const;
00272
00273 CallMessage::pointer create_call_message( const std::string& method_name ) const;
00274
00275 ReturnMessage::const_pointer call( CallMessage::const_pointer, int timeout_milliseconds=-1 ) const;
00276
00277 PendingCall::pointer call_async( CallMessage::const_pointer, int timeout_milliseconds=-1 ) const;
00278
00285 template <class T_return>
00286 DBusCxxPointer<MethodProxy<T_return> >
00287 create_method( const std::string& interface_name, const std::string& method_name )
00288 {
00289 InterfaceProxy::pointer interface = this->interface(interface_name);
00290 if ( not interface ) interface = this->create_interface( interface_name );
00291 return interface->create_method<T_return>(method_name);
00292 }
00293
00300 template <class T_return, class T_arg1>
00301 DBusCxxPointer<MethodProxy<T_return, T_arg1> >
00302 create_method( const std::string& interface_name, const std::string& method_name )
00303 {
00304 InterfaceProxy::pointer interface = this->interface(interface_name);
00305 if ( not interface ) interface = this->create_interface( interface_name );
00306 return interface->create_method<T_return, T_arg1>(method_name);
00307 }
00308
00315 template <class T_return, class T_arg1,class T_arg2>
00316 DBusCxxPointer<MethodProxy<T_return, T_arg1,T_arg2> >
00317 create_method( const std::string& interface_name, const std::string& method_name )
00318 {
00319 InterfaceProxy::pointer interface = this->interface(interface_name);
00320 if ( not interface ) interface = this->create_interface( interface_name );
00321 return interface->create_method<T_return, T_arg1,T_arg2>(method_name);
00322 }
00323
00330 template <class T_return, class T_arg1,class T_arg2,class T_arg3>
00331 DBusCxxPointer<MethodProxy<T_return, T_arg1,T_arg2,T_arg3> >
00332 create_method( const std::string& interface_name, const std::string& method_name )
00333 {
00334 InterfaceProxy::pointer interface = this->interface(interface_name);
00335 if ( not interface ) interface = this->create_interface( interface_name );
00336 return interface->create_method<T_return, T_arg1,T_arg2,T_arg3>(method_name);
00337 }
00338
00345 template <class T_return, class T_arg1,class T_arg2,class T_arg3,class T_arg4>
00346 DBusCxxPointer<MethodProxy<T_return, T_arg1,T_arg2,T_arg3,T_arg4> >
00347 create_method( const std::string& interface_name, const std::string& method_name )
00348 {
00349 InterfaceProxy::pointer interface = this->interface(interface_name);
00350 if ( not interface ) interface = this->create_interface( interface_name );
00351 return interface->create_method<T_return, T_arg1,T_arg2,T_arg3,T_arg4>(method_name);
00352 }
00353
00360 template <class T_return, class T_arg1,class T_arg2,class T_arg3,class T_arg4,class T_arg5>
00361 DBusCxxPointer<MethodProxy<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5> >
00362 create_method( const std::string& interface_name, const std::string& method_name )
00363 {
00364 InterfaceProxy::pointer interface = this->interface(interface_name);
00365 if ( not interface ) interface = this->create_interface( interface_name );
00366 return interface->create_method<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5>(method_name);
00367 }
00368
00375 template <class T_return, class T_arg1,class T_arg2,class T_arg3,class T_arg4,class T_arg5,class T_arg6>
00376 DBusCxxPointer<MethodProxy<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6> >
00377 create_method( const std::string& interface_name, const std::string& method_name )
00378 {
00379 InterfaceProxy::pointer interface = this->interface(interface_name);
00380 if ( not interface ) interface = this->create_interface( interface_name );
00381 return interface->create_method<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6>(method_name);
00382 }
00383
00390 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>
00391 DBusCxxPointer<MethodProxy<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6,T_arg7> >
00392 create_method( const std::string& interface_name, const std::string& method_name )
00393 {
00394 InterfaceProxy::pointer interface = this->interface(interface_name);
00395 if ( not interface ) interface = this->create_interface( interface_name );
00396 return interface->create_method<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6,T_arg7>(method_name);
00397 }
00398
00399
00406 template <class T_return>
00407 DBusCxxPointer<signal_proxy<T_return> >
00408 create_signal( const std::string& interface_name, const std::string& sig_name )
00409 {
00410 InterfaceProxy::pointer interface = this->interface(interface_name);
00411 if ( not interface ) interface = this->create_interface( interface_name );
00412 return interface->create_signal<T_return>(sig_name);
00413 }
00414
00421 template <class T_return, class T_arg1>
00422 DBusCxxPointer<signal_proxy<T_return, T_arg1> >
00423 create_signal( const std::string& interface_name, const std::string& sig_name )
00424 {
00425 InterfaceProxy::pointer interface = this->interface(interface_name);
00426 if ( not interface ) interface = this->create_interface( interface_name );
00427 return interface->create_signal<T_return, T_arg1>(sig_name);
00428 }
00429
00436 template <class T_return, class T_arg1,class T_arg2>
00437 DBusCxxPointer<signal_proxy<T_return, T_arg1,T_arg2> >
00438 create_signal( const std::string& interface_name, const std::string& sig_name )
00439 {
00440 InterfaceProxy::pointer interface = this->interface(interface_name);
00441 if ( not interface ) interface = this->create_interface( interface_name );
00442 return interface->create_signal<T_return, T_arg1,T_arg2>(sig_name);
00443 }
00444
00451 template <class T_return, class T_arg1,class T_arg2,class T_arg3>
00452 DBusCxxPointer<signal_proxy<T_return, T_arg1,T_arg2,T_arg3> >
00453 create_signal( const std::string& interface_name, const std::string& sig_name )
00454 {
00455 InterfaceProxy::pointer interface = this->interface(interface_name);
00456 if ( not interface ) interface = this->create_interface( interface_name );
00457 return interface->create_signal<T_return, T_arg1,T_arg2,T_arg3>(sig_name);
00458 }
00459
00466 template <class T_return, class T_arg1,class T_arg2,class T_arg3,class T_arg4>
00467 DBusCxxPointer<signal_proxy<T_return, T_arg1,T_arg2,T_arg3,T_arg4> >
00468 create_signal( const std::string& interface_name, const std::string& sig_name )
00469 {
00470 InterfaceProxy::pointer interface = this->interface(interface_name);
00471 if ( not interface ) interface = this->create_interface( interface_name );
00472 return interface->create_signal<T_return, T_arg1,T_arg2,T_arg3,T_arg4>(sig_name);
00473 }
00474
00481 template <class T_return, class T_arg1,class T_arg2,class T_arg3,class T_arg4,class T_arg5>
00482 DBusCxxPointer<signal_proxy<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5> >
00483 create_signal( const std::string& interface_name, const std::string& sig_name )
00484 {
00485 InterfaceProxy::pointer interface = this->interface(interface_name);
00486 if ( not interface ) interface = this->create_interface( interface_name );
00487 return interface->create_signal<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5>(sig_name);
00488 }
00489
00496 template <class T_return, class T_arg1,class T_arg2,class T_arg3,class T_arg4,class T_arg5,class T_arg6>
00497 DBusCxxPointer<signal_proxy<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6> >
00498 create_signal( const std::string& interface_name, const std::string& sig_name )
00499 {
00500 InterfaceProxy::pointer interface = this->interface(interface_name);
00501 if ( not interface ) interface = this->create_interface( interface_name );
00502 return interface->create_signal<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6>(sig_name);
00503 }
00504
00511 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>
00512 DBusCxxPointer<signal_proxy<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6,T_arg7> >
00513 create_signal( const std::string& interface_name, const std::string& sig_name )
00514 {
00515 InterfaceProxy::pointer interface = this->interface(interface_name);
00516 if ( not interface ) interface = this->create_interface( interface_name );
00517 return interface->create_signal<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6,T_arg7>(sig_name);
00518 }
00519
00520
00521 sigc::signal<void,InterfaceProxy::pointer> signal_interface_added();
00522
00523 sigc::signal<void,InterfaceProxy::pointer> signal_interface_removed();
00524
00525 sigc::signal<void,InterfaceProxy::pointer,InterfaceProxy::pointer> signal_default_interface_changed();
00526
00527 protected:
00528
00529 DBusCxxPointer<Connection> m_connection;
00530
00531 std::string m_destination;
00532
00533 Path m_path;
00534
00535 mutable pthread_rwlock_t m_interfaces_rwlock;
00536
00537 pthread_mutex_t m_name_mutex;
00538
00539 Interfaces m_interfaces;
00540
00541 InterfaceProxy::pointer m_default_interface;
00542
00543 sigc::signal<void,InterfaceProxy::pointer,InterfaceProxy::pointer> m_signal_default_interface_changed;
00544
00545 sigc::signal<void,InterfaceProxy::pointer> m_signal_interface_added;
00546
00547 sigc::signal<void,InterfaceProxy::pointer> m_signal_interface_removed;
00548
00549 typedef std::map<InterfaceProxy::pointer,sigc::connection> InterfaceSignalNameConnections;
00550
00551 InterfaceSignalNameConnections m_interface_signal_name_connections;
00552
00553 void on_interface_name_changed(const std::string& oldname, const std::string& newname, InterfaceProxy::pointer interface);
00554
00555 };
00556
00557 }
00558
00559 #endif