BusAccess.h
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #ifndef DBUS_BUSACCESS_H_
00029 #define DBUS_BUSACCESS_H_
00030 #include <list>
00031 #include <string>
00032 #include <cstdio>
00033 #include <unistd.h>
00034 #include <stdexcept>
00035
00036 namespace casa {
00037 namespace dbus {
00038
00039
00040
00041 std::string adaptor_object( const std::string &name, const std::string &path );
00042 std::string object( const std::string &name );
00043 std::string path( const std::string &name );
00044
00045 class address {
00046 public:
00047 address( const std::string &bus_address, bool unique=true );
00048 address( );
00049 virtual ~address( );
00050 std::string busName( ) const { return name_; }
00051 private:
00052 std::string generate_name( const std::string &base, bool unique=true );
00053 std::string name_;
00054 };
00055
00056 char *launch_casa_proxy( bool unique_name, const std::string &dbusname, const std::string &default_name, const std::list<std::string> &args );
00057
00058 template<class proxy> proxy *launch( const std::list<std::string> &args=std::list<std::string>( ), bool unique_name=true,
00059 const std::string &name="", int trys=60, unsigned long delay=500000 ) {
00060 char *dbname = launch_casa_proxy( unique_name, name, proxy::dbusName( ), proxy::execArgs(args) );
00061 if ( dbname == 0 ) { throw std::runtime_error( "launch failed" ); }
00062 proxy *result = 0;
00063 int count = trys;
00064 while ( count > 0 ) {
00065 usleep(delay);
00066 try {
00067 result = new proxy(dbname);
00068 break;
00069 } catch (...) { }
00070 --count;
00071 }
00072 delete [] dbname;
00073 return result;
00074 }
00075
00076 }
00077 }
00078
00079 #endif