00001
00002
00003
00004
00005 #ifndef __DBUSXX_CONNECTION_H
00006 #define __DBUSXX_CONNECTION_H
00007
00008 #include <list>
00009 #include <deque>
00010
00011 #include <dbus-cxx/pointer.h>
00012 #include <dbus-cxx/message.h>
00013 #include <dbus-cxx/returnmessage.h>
00014 #include <dbus-cxx/pendingcall.h>
00015 #include <dbus-cxx/watch.h>
00016 #include <dbus-cxx/timeout.h>
00017 #include <dbus-cxx/accumulators.h>
00018 #include <dbus-cxx/object.h>
00019 #include <dbus-cxx/objectproxy.h>
00020 #include <dbus-cxx/signal_proxy.h>
00021 #include <dbus-cxx/dbus_signal.h>
00022 #include <dbus-cxx/messagefilter.h>
00023 #include <dbus-cxx/method.h>
00024
00025 #include <iostream>
00026
00027 namespace DBus
00028 {
00029
00030 class Object;
00031 class signal_base;
00032 class PendingCall;
00033
00043 class Connection
00044 {
00045
00046 protected:
00047
00048
00049
00050 Connection( DBusConnection* cobj = NULL, bool is_private=false );
00051
00057 Connection( BusType type, bool is_private=false );
00058
00059 Connection( const Connection& other );
00060
00061 public:
00062
00063 typedef DBusCxxPointer<Connection> pointer;
00064
00065 typedef DBusCxxWeakPointer<Connection> weak_pointer;
00066
00067
00068
00069 static pointer create( DBusConnection* cobj = NULL, bool is_private=false );
00070
00076 static pointer create( BusType type, bool is_private=false );
00077
00078 static pointer create( const Connection& other );
00079
00080 virtual ~Connection();
00081
00083 operator bool() const;
00084
00086 bool is_valid() const;
00087
00089 bool is_private() const;
00090
00092 bool bus_register();
00093
00095 bool is_registered() const;
00096
00098 const char* unique_name() const;
00099
00100
00101
00106 unsigned long unix_user( const std::string& name ) const;
00107
00109 const char* bus_id() const;
00110
00111 int request_name( const std::string& name, unsigned int flags = 0 );
00112
00113 int release_name( const std::string& name );
00114
00115 bool name_has_owner( const std::string& name ) const;
00116
00117 StartReply start_service( const std::string& name, uint32_t flags ) const;
00118
00119 bool add_match( const std::string& rule );
00120
00121 void add_match_nonblocking( const std::string& rule );
00122
00123 bool remove_match( const std::string& rule );
00124
00125 void remove_match_nonblocking( const std::string& rule );
00126
00127
00128
00129 bool is_connected() const;
00130
00131 bool is_authenticated() const;
00132
00133 bool is_anonymous() const;
00134
00135 const char* server_id() const;
00136
00137
00138
00139
00140
00141 uint32_t send( const Message::const_pointer );
00142
00146 Connection& operator<<( Message::const_pointer msg );
00147
00148 PendingCall::pointer send_with_reply_async( Message::const_pointer message, int timeout_milliseconds=-1 ) const;
00149
00150 ReturnMessage::const_pointer send_with_reply_blocking( Message::const_pointer msg, int timeout_milliseconds=-1 ) const;
00151
00152 void flush();
00153
00154 bool read_write_dispatch( int timeout_milliseconds=-1 );
00155
00156 bool read_write( int timeout_milliseconds=-1 );
00157
00158 Message::pointer borrow_message();
00159
00160 void return_message( Message::pointer message );
00161
00162 void steal_borrowed_message( Message::pointer message );
00163
00164 Message::pointer pop_message( );
00165
00166 DispatchStatus dispatch_status( ) const;
00167
00168 DispatchStatus dispatch( );
00169
00170 int unix_fd() const;
00171
00172 int socket() const;
00173
00174 unsigned long unix_user() const;
00175
00176 unsigned long unix_process_id() const;
00177
00178
00179
00180
00181
00182
00183
00184
00185
00186 void set_allow_anonymous( bool allow=true );
00187
00188 void set_route_peer_messages( bool route=true );
00189
00190
00191
00192
00193
00194
00195
00196
00197
00198 void set_max_message_size( long size );
00199
00200 long max_message_size();
00201
00202 void set_max_received_size( long size );
00203
00204 long max_received_size();
00205
00206 long outgoing_size();
00207
00208 bool has_messages_to_send();
00209
00210 typedef sigc::signal1<bool,Watch::pointer,InterruptablePredicateAccumulatorDefaultFalse> AddWatchSignal;
00211
00213 AddWatchSignal& signal_add_watch();
00214
00215 sigc::signal<bool,Watch::pointer>& signal_remove_watch();
00216
00217 sigc::signal<bool,Watch::pointer>& signal_watch_toggled();
00218
00219 typedef sigc::signal1<bool,Timeout::pointer,InterruptablePredicateAccumulatorDefaultFalse> AddTimeoutSignal;
00220
00222 AddTimeoutSignal& signal_add_timeout();
00223
00224 sigc::signal<bool,Timeout::pointer>& signal_remove_timeout();
00225
00226 sigc::signal<bool,Timeout::pointer>& signal_timeout_toggled();
00227
00228 sigc::signal<void>& signal_wakeup_main();
00229
00231 sigc::signal<void,DispatchStatus>& signal_dispatch_status_changed();
00232
00237 FilterSignal& signal_filter();
00238
00239 typedef std::deque<Watch::pointer> Watches;
00240
00241 const Watches& unhandled_watches() const;
00242
00243 void remove_unhandled_watch(const Watch::pointer w);
00244
00245 Object::pointer create_object( const std::string& path, PrimaryFallback pf=PRIMARY );
00246
00247 bool register_object( Object::pointer object );
00248
00249 ObjectPathHandler::pointer create_object( const std::string& path, sigc::slot<HandlerResult,Connection::pointer,Message::const_pointer>& slot, PrimaryFallback pf=PRIMARY );
00250
00251 ObjectPathHandler::pointer create_object( const std::string& path, HandlerResult (*MessageFunction)(Connection::pointer,Message::const_pointer), PrimaryFallback pf=PRIMARY );
00252
00253 ObjectProxy::pointer create_object_proxy( const std::string& path );
00254
00255 ObjectProxy::pointer create_object_proxy( const std::string& destination, const std::string& path );
00256
00257 bool unregister_object( const std::string& path );
00258
00264 signal_proxy_simple::pointer create_signal_proxy( const std::string& interface, const std::string& name );
00265
00271 signal_proxy_simple::pointer create_signal_proxy( const std::string& path, const std::string& interface, const std::string& name );
00272
00273 template <class T_return>
00274 DBusCxxPointer<signal_proxy<T_return> > create_signal_proxy( const std::string& interface, const std::string& name )
00275 {
00276 DBusCxxPointer<signal_proxy<T_return> > sig;
00277 sig = signal_proxy<T_return>::create(interface, name);
00278 this->add_signal_proxy( sig );
00279 return sig;
00280 }
00281
00282 template <class T_return, class T_arg1>
00283 DBusCxxPointer<signal_proxy<T_return, T_arg1> > create_signal_proxy( const std::string& interface, const std::string& name )
00284 {
00285 DBusCxxPointer<signal_proxy<T_return, T_arg1> > sig;
00286 sig = signal_proxy<T_return, T_arg1>::create(interface, name);
00287 this->add_signal_proxy( sig );
00288 return sig;
00289 }
00290
00291 template <class T_return, class T_arg1,class T_arg2>
00292 DBusCxxPointer<signal_proxy<T_return, T_arg1,T_arg2> > create_signal_proxy( const std::string& interface, const std::string& name )
00293 {
00294 DBusCxxPointer<signal_proxy<T_return, T_arg1,T_arg2> > sig;
00295 sig = signal_proxy<T_return, T_arg1,T_arg2>::create(interface, name);
00296 this->add_signal_proxy( sig );
00297 return sig;
00298 }
00299
00300 template <class T_return, class T_arg1,class T_arg2,class T_arg3>
00301 DBusCxxPointer<signal_proxy<T_return, T_arg1,T_arg2,T_arg3> > create_signal_proxy( const std::string& interface, const std::string& name )
00302 {
00303 DBusCxxPointer<signal_proxy<T_return, T_arg1,T_arg2,T_arg3> > sig;
00304 sig = signal_proxy<T_return, T_arg1,T_arg2,T_arg3>::create(interface, name);
00305 this->add_signal_proxy( sig );
00306 return sig;
00307 }
00308
00309 template <class T_return, class T_arg1,class T_arg2,class T_arg3,class T_arg4>
00310 DBusCxxPointer<signal_proxy<T_return, T_arg1,T_arg2,T_arg3,T_arg4> > create_signal_proxy( const std::string& interface, const std::string& name )
00311 {
00312 DBusCxxPointer<signal_proxy<T_return, T_arg1,T_arg2,T_arg3,T_arg4> > sig;
00313 sig = signal_proxy<T_return, T_arg1,T_arg2,T_arg3,T_arg4>::create(interface, name);
00314 this->add_signal_proxy( sig );
00315 return sig;
00316 }
00317
00318 template <class T_return, class T_arg1,class T_arg2,class T_arg3,class T_arg4,class T_arg5>
00319 DBusCxxPointer<signal_proxy<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5> > create_signal_proxy( const std::string& interface, const std::string& name )
00320 {
00321 DBusCxxPointer<signal_proxy<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5> > sig;
00322 sig = signal_proxy<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5>::create(interface, name);
00323 this->add_signal_proxy( sig );
00324 return sig;
00325 }
00326
00327 template <class T_return, class T_arg1,class T_arg2,class T_arg3,class T_arg4,class T_arg5,class T_arg6>
00328 DBusCxxPointer<signal_proxy<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6> > create_signal_proxy( const std::string& interface, const std::string& name )
00329 {
00330 DBusCxxPointer<signal_proxy<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6> > sig;
00331 sig = signal_proxy<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6>::create(interface, name);
00332 this->add_signal_proxy( sig );
00333 return sig;
00334 }
00335
00336 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>
00337 DBusCxxPointer<signal_proxy<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6,T_arg7> > create_signal_proxy( const std::string& interface, const std::string& name )
00338 {
00339 DBusCxxPointer<signal_proxy<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6,T_arg7> > sig;
00340 sig = signal_proxy<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6,T_arg7>::create(interface, name);
00341 this->add_signal_proxy( sig );
00342 return sig;
00343 }
00344
00345
00346
00347 template <class T_return>
00348 DBusCxxPointer<signal_proxy<T_return> > create_signal_proxy( const std::string& path, const std::string& interface, const std::string& name )
00349 {
00350 DBusCxxPointer<signal_proxy<T_return> > sig;
00351 sig = signal_proxy<T_return>::create(path, interface, name);
00352 this->add_signal_proxy( sig );
00353 return sig;
00354 }
00355
00356 template <class T_return, class T_arg1>
00357 DBusCxxPointer<signal_proxy<T_return, T_arg1> > create_signal_proxy( const std::string& path, const std::string& interface, const std::string& name )
00358 {
00359 DBusCxxPointer<signal_proxy<T_return, T_arg1> > sig;
00360 sig = signal_proxy<T_return, T_arg1>::create(path, interface, name);
00361 this->add_signal_proxy( sig );
00362 return sig;
00363 }
00364
00365 template <class T_return, class T_arg1,class T_arg2>
00366 DBusCxxPointer<signal_proxy<T_return, T_arg1,T_arg2> > create_signal_proxy( const std::string& path, const std::string& interface, const std::string& name )
00367 {
00368 DBusCxxPointer<signal_proxy<T_return, T_arg1,T_arg2> > sig;
00369 sig = signal_proxy<T_return, T_arg1,T_arg2>::create(path, interface, name);
00370 this->add_signal_proxy( sig );
00371 return sig;
00372 }
00373
00374 template <class T_return, class T_arg1,class T_arg2,class T_arg3>
00375 DBusCxxPointer<signal_proxy<T_return, T_arg1,T_arg2,T_arg3> > create_signal_proxy( const std::string& path, const std::string& interface, const std::string& name )
00376 {
00377 DBusCxxPointer<signal_proxy<T_return, T_arg1,T_arg2,T_arg3> > sig;
00378 sig = signal_proxy<T_return, T_arg1,T_arg2,T_arg3>::create(path, interface, name);
00379 this->add_signal_proxy( sig );
00380 return sig;
00381 }
00382
00383 template <class T_return, class T_arg1,class T_arg2,class T_arg3,class T_arg4>
00384 DBusCxxPointer<signal_proxy<T_return, T_arg1,T_arg2,T_arg3,T_arg4> > create_signal_proxy( const std::string& path, const std::string& interface, const std::string& name )
00385 {
00386 DBusCxxPointer<signal_proxy<T_return, T_arg1,T_arg2,T_arg3,T_arg4> > sig;
00387 sig = signal_proxy<T_return, T_arg1,T_arg2,T_arg3,T_arg4>::create(path, interface, name);
00388 this->add_signal_proxy( sig );
00389 return sig;
00390 }
00391
00392 template <class T_return, class T_arg1,class T_arg2,class T_arg3,class T_arg4,class T_arg5>
00393 DBusCxxPointer<signal_proxy<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5> > create_signal_proxy( const std::string& path, const std::string& interface, const std::string& name )
00394 {
00395 DBusCxxPointer<signal_proxy<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5> > sig;
00396 sig = signal_proxy<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5>::create(path, interface, name);
00397 this->add_signal_proxy( sig );
00398 return sig;
00399 }
00400
00401 template <class T_return, class T_arg1,class T_arg2,class T_arg3,class T_arg4,class T_arg5,class T_arg6>
00402 DBusCxxPointer<signal_proxy<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6> > create_signal_proxy( const std::string& path, const std::string& interface, const std::string& name )
00403 {
00404 DBusCxxPointer<signal_proxy<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6> > sig;
00405 sig = signal_proxy<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6>::create(path, interface, name);
00406 this->add_signal_proxy( sig );
00407 return sig;
00408 }
00409
00410 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>
00411 DBusCxxPointer<signal_proxy<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6,T_arg7> > create_signal_proxy( const std::string& path, const std::string& interface, const std::string& name )
00412 {
00413 DBusCxxPointer<signal_proxy<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6,T_arg7> > sig;
00414 sig = signal_proxy<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6,T_arg7>::create(path, interface, name);
00415 this->add_signal_proxy( sig );
00416 return sig;
00417 }
00418
00419
00420
00424 signal_proxy_base::pointer add_signal_proxy( signal_proxy_base::pointer signal );
00425
00426 bool remove_signal_proxy( signal_proxy_base::pointer proxy );
00427
00428 typedef std::list<signal_proxy_base::pointer> ProxySignals;
00429
00430 typedef std::map<std::string,ProxySignals> NameToProxySignalMap;
00431
00432 typedef std::map<std::string,NameToProxySignalMap> InterfaceToNameProxySignalMap;
00433
00435 const InterfaceToNameProxySignalMap& get_signal_proxies();
00436
00438 NameToProxySignalMap get_signal_proxies( const std::string& interface );
00439
00441 ProxySignals get_signal_proxies( const std::string& interface, const std::string& member );
00442
00443 template <class T_return>
00444 DBusCxxPointer<signal<T_return> > create_signal( const std::string& interface, const std::string& name )
00445 {
00446 DBusCxxPointer<signal<T_return> > sig;
00447 sig = signal<T_return>::create(interface, name);
00448 sig->set_connection(this->self());
00449 return sig;
00450 }
00451
00452 template <class T_return, class T_arg1>
00453 DBusCxxPointer<signal<T_return, T_arg1> > create_signal( const std::string& interface, const std::string& name )
00454 {
00455 DBusCxxPointer<signal<T_return, T_arg1> > sig;
00456 sig = signal<T_return, T_arg1>::create(interface, name);
00457 sig->set_connection(this->self());
00458 return sig;
00459 }
00460
00461 template <class T_return, class T_arg1,class T_arg2>
00462 DBusCxxPointer<signal<T_return, T_arg1,T_arg2> > create_signal( const std::string& interface, const std::string& name )
00463 {
00464 DBusCxxPointer<signal<T_return, T_arg1,T_arg2> > sig;
00465 sig = signal<T_return, T_arg1,T_arg2>::create(interface, name);
00466 sig->set_connection(this->self());
00467 return sig;
00468 }
00469
00470 template <class T_return, class T_arg1,class T_arg2,class T_arg3>
00471 DBusCxxPointer<signal<T_return, T_arg1,T_arg2,T_arg3> > create_signal( const std::string& interface, const std::string& name )
00472 {
00473 DBusCxxPointer<signal<T_return, T_arg1,T_arg2,T_arg3> > sig;
00474 sig = signal<T_return, T_arg1,T_arg2,T_arg3>::create(interface, name);
00475 sig->set_connection(this->self());
00476 return sig;
00477 }
00478
00479 template <class T_return, class T_arg1,class T_arg2,class T_arg3,class T_arg4>
00480 DBusCxxPointer<signal<T_return, T_arg1,T_arg2,T_arg3,T_arg4> > create_signal( const std::string& interface, const std::string& name )
00481 {
00482 DBusCxxPointer<signal<T_return, T_arg1,T_arg2,T_arg3,T_arg4> > sig;
00483 sig = signal<T_return, T_arg1,T_arg2,T_arg3,T_arg4>::create(interface, name);
00484 sig->set_connection(this->self());
00485 return sig;
00486 }
00487
00488 template <class T_return, class T_arg1,class T_arg2,class T_arg3,class T_arg4,class T_arg5>
00489 DBusCxxPointer<signal<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5> > create_signal( const std::string& interface, const std::string& name )
00490 {
00491 DBusCxxPointer<signal<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5> > sig;
00492 sig = signal<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5>::create(interface, name);
00493 sig->set_connection(this->self());
00494 return sig;
00495 }
00496
00497 template <class T_return, class T_arg1,class T_arg2,class T_arg3,class T_arg4,class T_arg5,class T_arg6>
00498 DBusCxxPointer<signal<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6> > create_signal( const std::string& interface, const std::string& name )
00499 {
00500 DBusCxxPointer<signal<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6> > sig;
00501 sig = signal<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6>::create(interface, name);
00502 sig->set_connection(this->self());
00503 return sig;
00504 }
00505
00506 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>
00507 DBusCxxPointer<signal<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6,T_arg7> > create_signal( const std::string& interface, const std::string& name )
00508 {
00509 DBusCxxPointer<signal<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6,T_arg7> > sig;
00510 sig = signal<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6,T_arg7>::create(interface, name);
00511 sig->set_connection(this->self());
00512 return sig;
00513 }
00514
00515
00516
00517 template <class T_return>
00518 DBusCxxPointer<signal<T_return> > create_signal( const std::string& path, const std::string& interface, const std::string& name )
00519 {
00520 DBusCxxPointer<signal<T_return> > sig;
00521 sig = signal<T_return>::create(path, interface, name);
00522 sig->set_connection(this->self());
00523 return sig;
00524 }
00525
00526 template <class T_return, class T_arg1>
00527 DBusCxxPointer<signal<T_return, T_arg1> > create_signal( const std::string& path, const std::string& interface, const std::string& name )
00528 {
00529 DBusCxxPointer<signal<T_return, T_arg1> > sig;
00530 sig = signal<T_return, T_arg1>::create(path, interface, name);
00531 sig->set_connection(this->self());
00532 return sig;
00533 }
00534
00535 template <class T_return, class T_arg1,class T_arg2>
00536 DBusCxxPointer<signal<T_return, T_arg1,T_arg2> > create_signal( const std::string& path, const std::string& interface, const std::string& name )
00537 {
00538 DBusCxxPointer<signal<T_return, T_arg1,T_arg2> > sig;
00539 sig = signal<T_return, T_arg1,T_arg2>::create(path, interface, name);
00540 sig->set_connection(this->self());
00541 return sig;
00542 }
00543
00544 template <class T_return, class T_arg1,class T_arg2,class T_arg3>
00545 DBusCxxPointer<signal<T_return, T_arg1,T_arg2,T_arg3> > create_signal( const std::string& path, const std::string& interface, const std::string& name )
00546 {
00547 DBusCxxPointer<signal<T_return, T_arg1,T_arg2,T_arg3> > sig;
00548 sig = signal<T_return, T_arg1,T_arg2,T_arg3>::create(path, interface, name);
00549 sig->set_connection(this->self());
00550 return sig;
00551 }
00552
00553 template <class T_return, class T_arg1,class T_arg2,class T_arg3,class T_arg4>
00554 DBusCxxPointer<signal<T_return, T_arg1,T_arg2,T_arg3,T_arg4> > create_signal( const std::string& path, const std::string& interface, const std::string& name )
00555 {
00556 DBusCxxPointer<signal<T_return, T_arg1,T_arg2,T_arg3,T_arg4> > sig;
00557 sig = signal<T_return, T_arg1,T_arg2,T_arg3,T_arg4>::create(path, interface, name);
00558 sig->set_connection(this->self());
00559 return sig;
00560 }
00561
00562 template <class T_return, class T_arg1,class T_arg2,class T_arg3,class T_arg4,class T_arg5>
00563 DBusCxxPointer<signal<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5> > create_signal( const std::string& path, const std::string& interface, const std::string& name )
00564 {
00565 DBusCxxPointer<signal<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5> > sig;
00566 sig = signal<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5>::create(path, interface, name);
00567 sig->set_connection(this->self());
00568 return sig;
00569 }
00570
00571 template <class T_return, class T_arg1,class T_arg2,class T_arg3,class T_arg4,class T_arg5,class T_arg6>
00572 DBusCxxPointer<signal<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6> > create_signal( const std::string& path, const std::string& interface, const std::string& name )
00573 {
00574 DBusCxxPointer<signal<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6> > sig;
00575 sig = signal<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6>::create(path, interface, name);
00576 sig->set_connection(this->self());
00577 return sig;
00578 }
00579
00580 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>
00581 DBusCxxPointer<signal<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6,T_arg7> > create_signal( const std::string& path, const std::string& interface, const std::string& name )
00582 {
00583 DBusCxxPointer<signal<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6,T_arg7> > sig;
00584 sig = signal<T_return, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6,T_arg7>::create(path, interface, name);
00585 sig->set_connection(this->self());
00586 return sig;
00587 }
00588
00589
00590
00591
00592
00593
00594
00596 pointer self();
00597
00612 static pointer self(DBusConnection* c);
00613
00614 DBusConnection* cobj();
00615
00616 static void set_global_change_sigpipe(bool will_modify_sigpipe=true);
00617
00618 protected:
00619 DBusConnection* m_cobj;
00620
00621 bool m_private_flag;
00622
00623 AddWatchSignal m_add_watch_signal;
00624
00625 sigc::signal<bool,Watch::pointer> m_remove_watch_signal;
00626
00627 sigc::signal<bool,Watch::pointer> m_watch_toggled_signal;
00628
00629 AddTimeoutSignal m_add_timeout_signal;
00630
00631 sigc::signal<bool,Timeout::pointer> m_remove_timeout_signal;
00632
00633 sigc::signal<bool,Timeout::pointer> m_timeout_toggled_signal;
00634
00635 sigc::signal<void> m_wakeup_main_signal;
00636
00637 sigc::signal<void,DispatchStatus> m_dispatch_status_signal;
00638
00639 FilterSignal m_filter_signal;
00640
00641 Watches m_unhandled_watches;
00642
00643 typedef std::map<DBusTimeout*,Timeout::pointer> Timeouts;
00644
00645 Timeouts m_timeouts;
00646
00647 friend void init(bool);
00648
00649 void initialize( bool is_private );
00650
00651 static dbus_int32_t m_weak_pointer_slot;
00652
00653 std::map<std::string,ObjectPathHandler::pointer> m_created_objects;
00654
00655 InterfaceToNameProxySignalMap m_proxy_signal_interface_map;
00656
00657
00658
00659
00660
00661
00662
00663
00664
00665
00666
00667
00668
00669 static dbus_bool_t on_add_watch_callback( DBusWatch* cwatch, void* data );
00670
00671 static void on_remove_watch_callback( DBusWatch* cwatch, void* data );
00672
00673 static void on_watch_toggled_callback( DBusWatch* cwatch, void* data );
00674
00675 static dbus_bool_t on_add_timeout_callback( DBusTimeout* ctimeout, void* data );
00676
00677 static void on_remove_timeout_callback( DBusTimeout* ctimeout, void* data );
00678
00679 static void on_timeout_toggled_callback( DBusTimeout* ctimeout, void* data );
00680
00681 static void on_wakeup_main_callback( void* data );
00682
00683 static void on_dispatch_status_callback( DBusConnection* connection, DBusDispatchStatus new_status, void* data );
00684
00685 static DBusHandlerResult on_filter_callback( DBusConnection* connection, DBusMessage* message, void* data );
00686
00687 };
00688
00689 inline
00690 Connection::pointer operator<<(Connection::pointer ptr, Message::pointer msg)
00691 {
00692 if (not ptr) return ptr;
00693 *ptr << msg;
00694 return ptr;
00695 }
00696
00697 inline
00698 Connection::pointer operator<<(Connection::pointer ptr, Message::const_pointer msg)
00699 {
00700 if (not ptr) return ptr;
00701 *ptr << msg;
00702 return ptr;
00703 }
00704
00705 inline
00706 Connection::pointer operator<<(Connection::pointer ptr, ReturnMessage::pointer msg)
00707 {
00708 if (not ptr) return ptr;
00709 *ptr << msg;
00710 return ptr;
00711 }
00712
00713 inline
00714 Connection::pointer operator<<(Connection::pointer ptr, ReturnMessage::const_pointer msg)
00715 {
00716 if (not ptr) return ptr;
00717 *ptr << msg;
00718 return ptr;
00719 }
00720
00721 inline
00722 Connection::pointer operator<<(Connection::pointer ptr, SignalMessage::pointer msg)
00723 {
00724 if (not ptr) return ptr;
00725 *ptr << msg;
00726 return ptr;
00727 }
00728
00729 inline
00730 Connection::pointer operator<<(Connection::pointer ptr, SignalMessage::const_pointer msg)
00731 {
00732 if (not ptr) return ptr;
00733 *ptr << msg;
00734 return ptr;
00735 }
00736
00737 }
00738
00739 #endif
00740
00741 #include <dbus-cxx/method_impl.h>