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, 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>
00075 DBusCxxPointer<Method<T_return,T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6,T_arg7> > create_method( const std::string& name )
00076 {
00077 DBusCxxPointer< Method<T_return,T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6,T_arg7> > method;
00078 method = Method<T_return,T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6,T_arg7>::create(name);
00079 this->add_method( method );
00080 return method;
00081 }
00082
00083 template <class T_return>
00084 DBusCxxPointer<Method<T_return> > create_method( const std::string& name, sigc::slot0<T_return> slot )
00085 {
00086 DBusCxxPointer< Method<T_return> > method;
00087 method = Method<T_return>::create(name);
00088 method->set_method( slot );
00089 this->add_method( method );
00090 return method;
00091 }
00092
00093 template <class T_return, class T_arg1>
00094 DBusCxxPointer<Method<T_return, T_arg1> > create_method( const std::string& name, sigc::slot1<T_return, T_arg1> slot )
00095 {
00096 DBusCxxPointer< Method<T_return, T_arg1> > method;
00097 method = Method<T_return, T_arg1>::create(name);
00098 method->set_method( slot );
00099 this->add_method( method );
00100 return method;
00101 }
00102
00103 template <class T_return, class T_arg1,class T_arg2>
00104 DBusCxxPointer<Method<T_return, T_arg1,T_arg2> > create_method( const std::string& name, sigc::slot2<T_return, T_arg1,T_arg2> slot )
00105 {
00106 DBusCxxPointer< Method<T_return, T_arg1,T_arg2> > method;
00107 method = Method<T_return, T_arg1,T_arg2>::create(name);
00108 method->set_method( slot );
00109 this->add_method( method );
00110 return method;
00111 }
00112
00113 template <class T_return, class T_arg1,class T_arg2,class T_arg3>
00114 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 )
00115 {
00116 DBusCxxPointer< Method<T_return, T_arg1,T_arg2,T_arg3> > method;
00117 method = Method<T_return, T_arg1,T_arg2,T_arg3>::create(name);
00118 method->set_method( slot );
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>
00124 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 )
00125 {
00126 DBusCxxPointer< Method<T_return, T_arg1,T_arg2,T_arg3,T_arg4> > method;
00127 method = Method<T_return, T_arg1,T_arg2,T_arg3,T_arg4>::create(name);
00128 method->set_method( slot );
00129 this->add_method( method );
00130 return method;
00131 }
00132
00133 template <class T_return, class T_arg1,class T_arg2,class T_arg3,class T_arg4,class T_arg5>
00134 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 )
00135 {
00136 DBusCxxPointer< Method<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5> > method;
00137 method = Method<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5>::create(name);
00138 method->set_method( slot );
00139 this->add_method( method );
00140 return method;
00141 }
00142
00143 template <class T_return, class T_arg1,class T_arg2,class T_arg3,class T_arg4,class T_arg5,class T_arg6>
00144 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 )
00145 {
00146 DBusCxxPointer< Method<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6> > method;
00147 method = Method<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6>::create(name);
00148 method->set_method( slot );
00149 this->add_method( method );
00150 return method;
00151 }
00152
00153 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>
00154 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 )
00155 {
00156 DBusCxxPointer< Method<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6,T_arg7> > method;
00157 method = Method<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6,T_arg7>::create(name);
00158 method->set_method( slot );
00159 this->add_method( method );
00160 return method;
00161 }
00162
00163
00165 bool add_method( MethodBase::pointer method );
00166
00168 void remove_method( const std::string& name );
00169
00171 bool has_method( const std::string& name ) const;
00172
00177 bool add_signal( signal_base::pointer signal );
00178
00185 bool remove_signal( signal_base::pointer signal );
00186
00190 bool remove_signal( const std::string& name );
00191
00195 bool has_signal( signal_base::pointer signal ) const;
00196
00198 bool has_signal( const std::string& name ) const;
00199
00200 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>
00201 DBusCxxPointer<signal<T_return,T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6,T_arg7> > create_signal( const std::string& name ) {
00202 DBusCxxPointer<DBus::signal<T_return,T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6,T_arg7> > sig;
00203 sig = DBus::signal<T_return,T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6,T_arg7>::create(m_name, name);
00204
00205 if ( this->add_signal(sig) ) return sig;
00206
00207 return DBusCxxPointer<DBus::signal<T_return,T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6,T_arg7> >();
00208 }
00209
00211 const Signals& signals();
00212
00218 signal_base::pointer signal(const std::string& signal_name);
00219
00221 sigc::signal<void,const std::string&,const std::string&> signal_name_changed();
00222
00224 sigc::signal<void,MethodBase::pointer> signal_method_added();
00225
00227 sigc::signal<void,MethodBase::pointer> signal_method_removed();
00228
00230 std::string introspect(int space_depth=0) const;
00231
00232 private:
00233
00234 Object* m_object;
00235
00236 protected:
00237
00238 friend class Object;
00239
00240 void set_object( Object* object );
00241
00242 std::string m_name;
00243
00244 Methods m_methods;
00245
00246 Signals m_signals;
00247
00248 mutable pthread_rwlock_t m_methods_rwlock;
00249
00250 mutable pthread_rwlock_t m_signals_rwlock;
00251
00253 pthread_mutex_t m_name_mutex;
00254
00255 sigc::signal<void,const std::string&,const std::string&> m_signal_name_changed;
00256
00257 sigc::signal<void,MethodBase::pointer> m_signal_method_added;
00258
00259 sigc::signal<void,MethodBase::pointer> m_signal_method_removed;
00260
00261 typedef std::map<MethodBase::pointer,sigc::connection> MethodSignalNameConnections;
00262
00263 MethodSignalNameConnections m_method_signal_name_connections;
00264
00265 void on_method_name_changed(const std::string& oldname, const std::string& newname, MethodBase::pointer method);
00266
00267 void set_connection(DBusCxxPointer<Connection> conn);
00268
00269 void set_path( const std::string& new_path );
00270
00271 };
00272
00273 }
00274
00275 #endif
00276