00001
00002
00003
00004
00005 #ifndef DBUSCXXOBJECT_H
00006 #define DBUSCXXOBJECT_H
00007
00008 #include <sigc++/sigc++.h>
00009
00010 #include <string>
00011 #include <map>
00012
00013 #include <dbus-cxx/objectpathhandler.h>
00014 #include <dbus-cxx/interface.h>
00015
00016 namespace DBus
00017 {
00069 class Connection;
00070
00079 class Object: public ObjectPathHandler
00080 {
00081 protected:
00082
00083 Object( const std::string& path, PrimaryFallback pf=PRIMARY );
00084
00085 public:
00086
00087 typedef DBusCxxPointer<Object> pointer;
00088
00089 typedef std::multimap<std::string, Interface::pointer> Interfaces;
00090
00091 static pointer create( const std::string& path = std::string(), PrimaryFallback pf=PRIMARY );
00092
00093 virtual ~Object();
00094
00096 virtual bool register_with_connection(DBusCxxPointer<Connection> conn);
00097
00098 const Interfaces& interfaces() const;
00099
00101 Interface::pointer interface( const std::string& name ) const;
00102
00104 bool add_interface( Interface::pointer interface );
00105
00111 Interface::pointer create_interface( const std::string& name );
00112
00116 template <class T_return>
00117 DBusCxxPointer<Method<T_return> > create_method( const std::string& method_name, sigc::slot0<T_return> slot )
00118 {
00119 if ( not m_default_interface )
00120 {
00121 this->create_interface("");
00122 this->set_default_interface("");
00123 }
00124
00125
00126 DBusCxxPointer< Method<T_return> > method;
00127 method = m_default_interface->create_method<T_return>(method_name);
00128 method->set_method( slot );
00129 return method;
00130 }
00131
00135 template <class T_return, class T_arg1>
00136 DBusCxxPointer<Method<T_return, T_arg1> > create_method( const std::string& method_name, sigc::slot1<T_return, T_arg1> slot )
00137 {
00138 if ( not m_default_interface )
00139 {
00140 this->create_interface("");
00141 this->set_default_interface("");
00142 }
00143
00144
00145 DBusCxxPointer< Method<T_return, T_arg1> > method;
00146 method = m_default_interface->create_method<T_return, T_arg1>(method_name);
00147 method->set_method( slot );
00148 return method;
00149 }
00150
00154 template <class T_return, class T_arg1,class T_arg2>
00155 DBusCxxPointer<Method<T_return, T_arg1,T_arg2> > create_method( const std::string& method_name, sigc::slot2<T_return, T_arg1,T_arg2> slot )
00156 {
00157 if ( not m_default_interface )
00158 {
00159 this->create_interface("");
00160 this->set_default_interface("");
00161 }
00162
00163
00164 DBusCxxPointer< Method<T_return, T_arg1,T_arg2> > method;
00165 method = m_default_interface->create_method<T_return, T_arg1,T_arg2>(method_name);
00166 method->set_method( slot );
00167 return method;
00168 }
00169
00173 template <class T_return, class T_arg1,class T_arg2,class T_arg3>
00174 DBusCxxPointer<Method<T_return, T_arg1,T_arg2,T_arg3> > create_method( const std::string& method_name, sigc::slot3<T_return, T_arg1,T_arg2,T_arg3> slot )
00175 {
00176 if ( not m_default_interface )
00177 {
00178 this->create_interface("");
00179 this->set_default_interface("");
00180 }
00181
00182
00183 DBusCxxPointer< Method<T_return, T_arg1,T_arg2,T_arg3> > method;
00184 method = m_default_interface->create_method<T_return, T_arg1,T_arg2,T_arg3>(method_name);
00185 method->set_method( slot );
00186 return method;
00187 }
00188
00192 template <class T_return, class T_arg1,class T_arg2,class T_arg3,class T_arg4>
00193 DBusCxxPointer<Method<T_return, T_arg1,T_arg2,T_arg3,T_arg4> > create_method( const std::string& method_name, sigc::slot4<T_return, T_arg1,T_arg2,T_arg3,T_arg4> slot )
00194 {
00195 if ( not m_default_interface )
00196 {
00197 this->create_interface("");
00198 this->set_default_interface("");
00199 }
00200
00201
00202 DBusCxxPointer< Method<T_return, T_arg1,T_arg2,T_arg3,T_arg4> > method;
00203 method = m_default_interface->create_method<T_return, T_arg1,T_arg2,T_arg3,T_arg4>(method_name);
00204 method->set_method( slot );
00205 return method;
00206 }
00207
00211 template <class T_return, class T_arg1,class T_arg2,class T_arg3,class T_arg4,class T_arg5>
00212 DBusCxxPointer<Method<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5> > create_method( const std::string& method_name, sigc::slot5<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5> slot )
00213 {
00214 if ( not m_default_interface )
00215 {
00216 this->create_interface("");
00217 this->set_default_interface("");
00218 }
00219
00220
00221 DBusCxxPointer< Method<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5> > method;
00222 method = m_default_interface->create_method<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5>(method_name);
00223 method->set_method( slot );
00224 return method;
00225 }
00226
00230 template <class T_return, class T_arg1,class T_arg2,class T_arg3,class T_arg4,class T_arg5,class T_arg6>
00231 DBusCxxPointer<Method<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6> > create_method( const std::string& method_name, sigc::slot6<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6> slot )
00232 {
00233 if ( not m_default_interface )
00234 {
00235 this->create_interface("");
00236 this->set_default_interface("");
00237 }
00238
00239
00240 DBusCxxPointer< Method<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6> > method;
00241 method = m_default_interface->create_method<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6>(method_name);
00242 method->set_method( slot );
00243 return method;
00244 }
00245
00249 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>
00250 DBusCxxPointer<Method<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6,T_arg7> > create_method( const std::string& method_name, sigc::slot7<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6,T_arg7> slot )
00251 {
00252 if ( not m_default_interface )
00253 {
00254 this->create_interface("");
00255 this->set_default_interface("");
00256 }
00257
00258
00259 DBusCxxPointer< Method<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6,T_arg7> > method;
00260 method = m_default_interface->create_method<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6,T_arg7>(method_name);
00261 method->set_method( slot );
00262 return method;
00263 }
00264
00265
00266 template <class T_return>
00267 DBusCxxPointer<Method<T_return> > create_method( const std::string& interface_name, const std::string& method_name, sigc::slot0<T_return> slot )
00268 {
00269 Interface::pointer interface;
00270 interface = this->interface(interface_name);
00271 if ( not interface ) interface = this->create_interface(interface_name);
00272
00273
00274 DBusCxxPointer< Method<T_return> > method;
00275 method = interface->create_method<T_return>(method_name);
00276 method->set_method( slot );
00277 return method;
00278 }
00279
00280 template <class T_return, class T_arg1>
00281 DBusCxxPointer<Method<T_return, T_arg1> > create_method( const std::string& interface_name, const std::string& method_name, sigc::slot1<T_return, T_arg1> slot )
00282 {
00283 Interface::pointer interface;
00284 interface = this->interface(interface_name);
00285 if ( not interface ) interface = this->create_interface(interface_name);
00286
00287
00288 DBusCxxPointer< Method<T_return, T_arg1> > method;
00289 method = interface->create_method<T_return, T_arg1>(method_name);
00290 method->set_method( slot );
00291 return method;
00292 }
00293
00294 template <class T_return, class T_arg1,class T_arg2>
00295 DBusCxxPointer<Method<T_return, T_arg1,T_arg2> > create_method( const std::string& interface_name, const std::string& method_name, sigc::slot2<T_return, T_arg1,T_arg2> slot )
00296 {
00297 Interface::pointer interface;
00298 interface = this->interface(interface_name);
00299 if ( not interface ) interface = this->create_interface(interface_name);
00300
00301
00302 DBusCxxPointer< Method<T_return, T_arg1,T_arg2> > method;
00303 method = interface->create_method<T_return, T_arg1,T_arg2>(method_name);
00304 method->set_method( slot );
00305 return method;
00306 }
00307
00308 template <class T_return, class T_arg1,class T_arg2,class T_arg3>
00309 DBusCxxPointer<Method<T_return, T_arg1,T_arg2,T_arg3> > create_method( const std::string& interface_name, const std::string& method_name, sigc::slot3<T_return, T_arg1,T_arg2,T_arg3> slot )
00310 {
00311 Interface::pointer interface;
00312 interface = this->interface(interface_name);
00313 if ( not interface ) interface = this->create_interface(interface_name);
00314
00315
00316 DBusCxxPointer< Method<T_return, T_arg1,T_arg2,T_arg3> > method;
00317 method = interface->create_method<T_return, T_arg1,T_arg2,T_arg3>(method_name);
00318 method->set_method( slot );
00319 return method;
00320 }
00321
00322 template <class T_return, class T_arg1,class T_arg2,class T_arg3,class T_arg4>
00323 DBusCxxPointer<Method<T_return, T_arg1,T_arg2,T_arg3,T_arg4> > create_method( const std::string& interface_name, const std::string& method_name, sigc::slot4<T_return, T_arg1,T_arg2,T_arg3,T_arg4> slot )
00324 {
00325 Interface::pointer interface;
00326 interface = this->interface(interface_name);
00327 if ( not interface ) interface = this->create_interface(interface_name);
00328
00329
00330 DBusCxxPointer< Method<T_return, T_arg1,T_arg2,T_arg3,T_arg4> > method;
00331 method = interface->create_method<T_return, T_arg1,T_arg2,T_arg3,T_arg4>(method_name);
00332 method->set_method( slot );
00333 return method;
00334 }
00335
00336 template <class T_return, class T_arg1,class T_arg2,class T_arg3,class T_arg4,class T_arg5>
00337 DBusCxxPointer<Method<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5> > create_method( const std::string& interface_name, const std::string& method_name, sigc::slot5<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5> slot )
00338 {
00339 Interface::pointer interface;
00340 interface = this->interface(interface_name);
00341 if ( not interface ) interface = this->create_interface(interface_name);
00342
00343
00344 DBusCxxPointer< Method<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5> > method;
00345 method = interface->create_method<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5>(method_name);
00346 method->set_method( slot );
00347 return method;
00348 }
00349
00350 template <class T_return, class T_arg1,class T_arg2,class T_arg3,class T_arg4,class T_arg5,class T_arg6>
00351 DBusCxxPointer<Method<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, sigc::slot6<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6> slot )
00352 {
00353 Interface::pointer interface;
00354 interface = this->interface(interface_name);
00355 if ( not interface ) interface = this->create_interface(interface_name);
00356
00357
00358 DBusCxxPointer< Method<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6> > method;
00359 method = interface->create_method<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6>(method_name);
00360 method->set_method( slot );
00361 return method;
00362 }
00363
00364 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>
00365 DBusCxxPointer<Method<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, sigc::slot7<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6,T_arg7> slot )
00366 {
00367 Interface::pointer interface;
00368 interface = this->interface(interface_name);
00369 if ( not interface ) interface = this->create_interface(interface_name);
00370
00371
00372 DBusCxxPointer< Method<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6,T_arg7> > method;
00373 method = interface->create_method<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6,T_arg7>(method_name);
00374 method->set_method( slot );
00375 return method;
00376 }
00377
00378
00380 void remove_interface( const std::string& name );
00381
00382 bool has_interface( const std::string& name );
00383
00384 Interface::pointer default_interface() const;
00385
00386 bool set_default_interface( const std::string& new_default_name );
00387
00388 void remove_default_interface();
00389
00390 template <class T_return, class T_arg1=nil, class T_arg2=nil, class T_arg3=nil, class T_arg4=nil, class T_arg5=nil, class T_arg6=nil, class T_arg7=nil>
00391 DBusCxxPointer<signal<T_return,T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6,T_arg7> > create_signal( const std::string& name ) {
00392 DBusCxxPointer<DBus::signal<T_return,T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6,T_arg7> > sig;
00393 Interface::pointer iface = this->default_interface();
00394
00395 if (not iface) iface = this->create_interface("");
00396
00397 sig = iface->create_signal<T_return,T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6,T_arg7>(name);
00398
00399 return sig;
00400 }
00401
00402 template <class T_return, class T_arg1=nil, class T_arg2=nil, class T_arg3=nil, class T_arg4=nil, class T_arg5=nil, class T_arg6=nil, class T_arg7=nil>
00403 DBusCxxPointer<signal<T_return,T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6,T_arg7> > create_signal( const std::string& iface, const std::string& name ) {
00404 DBusCxxPointer<DBus::signal<T_return,T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6,T_arg7> > sig;
00405
00406 if ( not has_interface(iface) ) this->create_interface(iface);
00407
00408 sig = this->interface(iface)->create_signal<T_return,T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6,T_arg7>(name);
00409
00410 return sig;
00411 }
00412
00413
00414
00415 sigc::signal<void,Interface::pointer> signal_interface_added();
00416
00417 sigc::signal<void,Interface::pointer> signal_interface_removed();
00418
00419 sigc::signal<void,Interface::pointer,Interface::pointer> signal_default_interface_changed();
00420
00421 virtual HandlerResult handle_message( DBusCxxPointer<Connection>, Message::const_pointer );
00422
00423 protected:
00424 mutable pthread_rwlock_t m_interfaces_rwlock;
00425
00426 pthread_mutex_t m_name_mutex;
00427
00428 Interfaces m_interfaces;
00429
00430 Interface::pointer m_default_interface;
00431
00432 sigc::signal<void,Interface::pointer,Interface::pointer> m_signal_default_interface_changed;
00433
00434 sigc::signal<void,Interface::pointer> m_signal_interface_added;
00435
00436 sigc::signal<void,Interface::pointer> m_signal_interface_removed;
00437
00438 typedef std::map<Interface::pointer,sigc::connection> InterfaceSignalNameConnections;
00439
00440 InterfaceSignalNameConnections m_interface_signal_name_connections;
00441
00442 void on_interface_name_changed(const std::string& oldname, const std::string& newname, Interface::pointer interface);
00443
00444 };
00445
00446 }
00447
00448 #endif