00001
00002
00003
00004
00005 #ifndef DBUSCXXINTERFACE_H
00006 #define DBUSCXXINTERFACE_H
00007
00008 #include <sigc++/sigc++.h>
00009
00010 #include <string>
00011 #include <map>
00012 #include <set>
00013
00014 #include <dbus-cxx/methodbase.h>
00015 #include <dbus-cxx/method.h>
00016 #include <dbus-cxx/dbus_signal.h>
00017
00018
00019 namespace DBus {
00020
00021 class Object;
00022
00031 class Interface
00032 {
00033 protected:
00034 Interface(const std::string& name);
00035
00036 public:
00037 typedef DBusCxxPointer<Interface> pointer;
00038
00039 typedef DBusCxxWeakPointer<Interface> weak_pointer;
00040
00041 typedef std::multimap<std::string, MethodBase::pointer> Methods;
00042
00043 typedef std::set<signal_base::pointer> Signals;
00044
00045 static pointer create( const std::string& name = std::string() );
00046
00047 virtual ~Interface();
00048
00055 Object* object() const;
00056
00058 Path path() const;
00059
00061 DBusCxxPointer<Connection> connection() const;
00062
00063 HandlerResult handle_call_message( DBusCxxPointer<Connection> connection, CallMessage::const_pointer message );
00064
00065 const std::string& name() const;
00066
00067 void set_name( const std::string& new_name );
00068
00069 const Methods& methods() const;
00070
00072 MethodBase::pointer method( const std::string& name ) const;
00073
00074 template <class T_return>
00075 DBusCxxPointer<Method<T_return> > create_method( const std::string& name )
00076 {
00077 DBusCxxPointer< Method<T_return> > method;
00078 method = Method<T_return>::create(name);
00079 this->add_method( method );
00080 return method;
00081 }
00082
00083 template <class T_return, class T_arg1>
00084 DBusCxxPointer<Method<T_return, T_arg1> > create_method( const std::string& name )
00085 {
00086 DBusCxxPointer< Method<T_return, T_arg1> > method;
00087 method = Method<T_return, T_arg1>::create(name);
00088 this->add_method( method );
00089 return method;
00090 }
00091
00092 template <class T_return, class T_arg1,class T_arg2>
00093 DBusCxxPointer<Method<T_return, T_arg1,T_arg2> > create_method( const std::string& name )
00094 {
00095 DBusCxxPointer< Method<T_return, T_arg1,T_arg2> > method;
00096 method = Method<T_return, T_arg1,T_arg2>::create(name);
00097 this->add_method( method );
00098 return method;
00099 }
00100
00101 template <class T_return, class T_arg1,class T_arg2,class T_arg3>
00102 DBusCxxPointer<Method<T_return, T_arg1,T_arg2,T_arg3> > create_method( const std::string& name )
00103 {
00104 DBusCxxPointer< Method<T_return, T_arg1,T_arg2,T_arg3> > method;
00105 method = Method<T_return, T_arg1,T_arg2,T_arg3>::create(name);
00106 this->add_method( method );
00107 return method;
00108 }
00109
00110 template <class T_return, class T_arg1,class T_arg2,class T_arg3,class T_arg4>
00111 DBusCxxPointer<Method<T_return, T_arg1,T_arg2,T_arg3,T_arg4> > create_method( const std::string& name )
00112 {
00113 DBusCxxPointer< Method<T_return, T_arg1,T_arg2,T_arg3,T_arg4> > method;
00114 method = Method<T_return, T_arg1,T_arg2,T_arg3,T_arg4>::create(name);
00115 this->add_method( method );
00116 return method;
00117 }
00118
00119 template <class T_return, class T_arg1,class T_arg2,class T_arg3,class T_arg4,class T_arg5>
00120 DBusCxxPointer<Method<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5> > create_method( const std::string& name )
00121 {
00122 DBusCxxPointer< Method<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5> > method;
00123 method = Method<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5>::create(name);
00124 this->add_method( method );
00125 return method;
00126 }
00127
00128 template <class T_return, class T_arg1,class T_arg2,class T_arg3,class T_arg4,class T_arg5,class T_arg6>
00129 DBusCxxPointer<Method<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6> > create_method( const std::string& name )
00130 {
00131 DBusCxxPointer< Method<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6> > method;
00132 method = Method<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6>::create(name);
00133 this->add_method( method );
00134 return method;
00135 }
00136
00137 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>
00138 DBusCxxPointer<Method<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6,T_arg7> > create_method( const std::string& name )
00139 {
00140 DBusCxxPointer< Method<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6,T_arg7> > method;
00141 method = Method<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6,T_arg7>::create(name);
00142 this->add_method( method );
00143 return method;
00144 }
00145
00146
00147
00148 template <class T_return>
00149 DBusCxxPointer<Method<T_return> > create_method( const std::string& name, sigc::slot0<T_return> slot )
00150 {
00151 DBusCxxPointer< Method<T_return> > method;
00152 method = Method<T_return>::create(name);
00153 method->set_method( slot );
00154 this->add_method( method );
00155 return method;
00156 }
00157
00158 template <class T_return, class T_arg1>
00159 DBusCxxPointer<Method<T_return, T_arg1> > create_method( const std::string& name, sigc::slot1<T_return, T_arg1> slot )
00160 {
00161 DBusCxxPointer< Method<T_return, T_arg1> > method;
00162 method = Method<T_return, T_arg1>::create(name);
00163 method->set_method( slot );
00164 this->add_method( method );
00165 return method;
00166 }
00167
00168 template <class T_return, class T_arg1,class T_arg2>
00169 DBusCxxPointer<Method<T_return, T_arg1,T_arg2> > create_method( const std::string& name, sigc::slot2<T_return, T_arg1,T_arg2> slot )
00170 {
00171 DBusCxxPointer< Method<T_return, T_arg1,T_arg2> > method;
00172 method = Method<T_return, T_arg1,T_arg2>::create(name);
00173 method->set_method( slot );
00174 this->add_method( method );
00175 return method;
00176 }
00177
00178 template <class T_return, class T_arg1,class T_arg2,class T_arg3>
00179 DBusCxxPointer<Method<T_return, T_arg1,T_arg2,T_arg3> > create_method( const std::string& name, sigc::slot3<T_return, T_arg1,T_arg2,T_arg3> slot )
00180 {
00181 DBusCxxPointer< Method<T_return, T_arg1,T_arg2,T_arg3> > method;
00182 method = Method<T_return, T_arg1,T_arg2,T_arg3>::create(name);
00183 method->set_method( slot );
00184 this->add_method( method );
00185 return method;
00186 }
00187
00188 template <class T_return, class T_arg1,class T_arg2,class T_arg3,class T_arg4>
00189 DBusCxxPointer<Method<T_return, T_arg1,T_arg2,T_arg3,T_arg4> > create_method( const std::string& name, sigc::slot4<T_return, T_arg1,T_arg2,T_arg3,T_arg4> slot )
00190 {
00191 DBusCxxPointer< Method<T_return, T_arg1,T_arg2,T_arg3,T_arg4> > method;
00192 method = Method<T_return, T_arg1,T_arg2,T_arg3,T_arg4>::create(name);
00193 method->set_method( slot );
00194 this->add_method( method );
00195 return method;
00196 }
00197
00198 template <class T_return, class T_arg1,class T_arg2,class T_arg3,class T_arg4,class T_arg5>
00199 DBusCxxPointer<Method<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5> > create_method( const std::string& name, sigc::slot5<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5> slot )
00200 {
00201 DBusCxxPointer< Method<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5> > method;
00202 method = Method<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5>::create(name);
00203 method->set_method( slot );
00204 this->add_method( method );
00205 return method;
00206 }
00207
00208 template <class T_return, class T_arg1,class T_arg2,class T_arg3,class T_arg4,class T_arg5,class T_arg6>
00209 DBusCxxPointer<Method<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6> > create_method( const std::string& name, sigc::slot6<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6> slot )
00210 {
00211 DBusCxxPointer< Method<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6> > method;
00212 method = Method<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6>::create(name);
00213 method->set_method( slot );
00214 this->add_method( method );
00215 return method;
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<Method<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6,T_arg7> > create_method( const std::string& name, sigc::slot7<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6,T_arg7> slot )
00220 {
00221 DBusCxxPointer< Method<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6,T_arg7> > method;
00222 method = Method<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6,T_arg7>::create(name);
00223 method->set_method( slot );
00224 this->add_method( method );
00225 return method;
00226 }
00227
00228
00230 bool add_method( MethodBase::pointer method );
00231
00233 void remove_method( const std::string& name );
00234
00236 bool has_method( const std::string& name ) const;
00237
00242 bool add_signal( signal_base::pointer signal );
00243
00250 bool remove_signal( signal_base::pointer signal );
00251
00255 bool remove_signal( const std::string& name );
00256
00260 bool has_signal( signal_base::pointer signal ) const;
00261
00263 bool has_signal( const std::string& name ) const;
00264
00265 template <class T_return>
00266 DBusCxxPointer<signal<T_return> > create_signal( const std::string& name )
00267 {
00268 DBusCxxPointer<DBus::signal<T_return> > sig;
00269 sig = DBus::signal<T_return>::create(m_name, name);
00270 if ( this->add_signal(sig) ) return sig;
00271 return DBusCxxPointer<DBus::signal<T_return> >();
00272 }
00273
00274 template <class T_return, class T_arg1>
00275 DBusCxxPointer<signal<T_return, T_arg1> > create_signal( const std::string& name )
00276 {
00277 DBusCxxPointer<DBus::signal<T_return, T_arg1> > sig;
00278 sig = DBus::signal<T_return, T_arg1>::create(m_name, name);
00279 if ( this->add_signal(sig) ) return sig;
00280 return DBusCxxPointer<DBus::signal<T_return, T_arg1> >();
00281 }
00282
00283 template <class T_return, class T_arg1,class T_arg2>
00284 DBusCxxPointer<signal<T_return, T_arg1,T_arg2> > create_signal( const std::string& name )
00285 {
00286 DBusCxxPointer<DBus::signal<T_return, T_arg1,T_arg2> > sig;
00287 sig = DBus::signal<T_return, T_arg1,T_arg2>::create(m_name, name);
00288 if ( this->add_signal(sig) ) return sig;
00289 return DBusCxxPointer<DBus::signal<T_return, T_arg1,T_arg2> >();
00290 }
00291
00292 template <class T_return, class T_arg1,class T_arg2,class T_arg3>
00293 DBusCxxPointer<signal<T_return, T_arg1,T_arg2,T_arg3> > create_signal( const std::string& name )
00294 {
00295 DBusCxxPointer<DBus::signal<T_return, T_arg1,T_arg2,T_arg3> > sig;
00296 sig = DBus::signal<T_return, T_arg1,T_arg2,T_arg3>::create(m_name, name);
00297 if ( this->add_signal(sig) ) return sig;
00298 return DBusCxxPointer<DBus::signal<T_return, T_arg1,T_arg2,T_arg3> >();
00299 }
00300
00301 template <class T_return, class T_arg1,class T_arg2,class T_arg3,class T_arg4>
00302 DBusCxxPointer<signal<T_return, T_arg1,T_arg2,T_arg3,T_arg4> > create_signal( const std::string& name )
00303 {
00304 DBusCxxPointer<DBus::signal<T_return, T_arg1,T_arg2,T_arg3,T_arg4> > sig;
00305 sig = DBus::signal<T_return, T_arg1,T_arg2,T_arg3,T_arg4>::create(m_name, name);
00306 if ( this->add_signal(sig) ) return sig;
00307 return DBusCxxPointer<DBus::signal<T_return, T_arg1,T_arg2,T_arg3,T_arg4> >();
00308 }
00309
00310 template <class T_return, class T_arg1,class T_arg2,class T_arg3,class T_arg4,class T_arg5>
00311 DBusCxxPointer<signal<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5> > create_signal( const std::string& name )
00312 {
00313 DBusCxxPointer<DBus::signal<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5> > sig;
00314 sig = DBus::signal<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5>::create(m_name, name);
00315 if ( this->add_signal(sig) ) return sig;
00316 return DBusCxxPointer<DBus::signal<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5> >();
00317 }
00318
00319 template <class T_return, class T_arg1,class T_arg2,class T_arg3,class T_arg4,class T_arg5,class T_arg6>
00320 DBusCxxPointer<signal<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6> > create_signal( const std::string& name )
00321 {
00322 DBusCxxPointer<DBus::signal<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6> > sig;
00323 sig = DBus::signal<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6>::create(m_name, name);
00324 if ( this->add_signal(sig) ) return sig;
00325 return DBusCxxPointer<DBus::signal<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6> >();
00326 }
00327
00328 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>
00329 DBusCxxPointer<signal<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6,T_arg7> > create_signal( const std::string& name )
00330 {
00331 DBusCxxPointer<DBus::signal<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6,T_arg7> > sig;
00332 sig = DBus::signal<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6,T_arg7>::create(m_name, name);
00333 if ( this->add_signal(sig) ) return sig;
00334 return DBusCxxPointer<DBus::signal<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6,T_arg7> >();
00335 }
00336
00337
00338
00340 const Signals& signals();
00341
00347 signal_base::pointer signal(const std::string& signal_name);
00348
00350 sigc::signal<void,const std::string&,const std::string&> signal_name_changed();
00351
00353 sigc::signal<void,MethodBase::pointer> signal_method_added();
00354
00356 sigc::signal<void,MethodBase::pointer> signal_method_removed();
00357
00359 std::string introspect(int space_depth=0) const;
00360
00361 private:
00362
00363 Object* m_object;
00364
00365 protected:
00366
00367 friend class Object;
00368
00369 void set_object( Object* object );
00370
00371 std::string m_name;
00372
00373 Methods m_methods;
00374
00375 Signals m_signals;
00376
00377 mutable pthread_rwlock_t m_methods_rwlock;
00378
00379 mutable pthread_rwlock_t m_signals_rwlock;
00380
00382 pthread_mutex_t m_name_mutex;
00383
00384 sigc::signal<void,const std::string&,const std::string&> m_signal_name_changed;
00385
00386 sigc::signal<void,MethodBase::pointer> m_signal_method_added;
00387
00388 sigc::signal<void,MethodBase::pointer> m_signal_method_removed;
00389
00390 typedef std::map<MethodBase::pointer,sigc::connection> MethodSignalNameConnections;
00391
00392 MethodSignalNameConnections m_method_signal_name_connections;
00393
00394 void on_method_name_changed(const std::string& oldname, const std::string& newname, MethodBase::pointer method);
00395
00396 void set_connection(DBusCxxPointer<Connection> conn);
00397
00398 void set_path( const std::string& new_path );
00399
00400 };
00401
00402 }
00403
00404 #endif
00405