diff options
Diffstat (limited to 'manager/bin/distrio_manager.cpp')
| -rw-r--r-- | manager/bin/distrio_manager.cpp | 160 |
1 files changed, 160 insertions, 0 deletions
diff --git a/manager/bin/distrio_manager.cpp b/manager/bin/distrio_manager.cpp new file mode 100644 index 0000000..b7671fb --- /dev/null +++ b/manager/bin/distrio_manager.cpp @@ -0,0 +1,160 @@ +/** + * distrio manager implementation + * + * - instances a manager object + * - registers the manager object at the NamingService + * + * @author Manuel Traut <manut@mecka.net> + * @licence GPLv2 + */ + +#include "distrio_manager.h" + +#include <orbsvcs/CosNamingC.h> + +#include <iostream> + +// Implementation skeleton constructor +Distrio_Manager_i::Distrio_Manager_i (void) +{ +} + +// Implementation skeleton destructor +Distrio_Manager_i::~Distrio_Manager_i (void) +{ +} + +::Distrio::Error * Distrio_Manager_i::digital ( + ::Distrio::Digital_list_out io_list) +{ + io_list = &digital_list; +} + +::Distrio::Error * Distrio_Manager_i::analog ( + ::Distrio::Analog_list_out io_list) +{ + io_list = &analog_list; +} + +::Distrio::Error * Distrio_Manager_i::device ( + ::Distrio::Device_list_out dev_list) +{ + dev_list = &device_list; +} + +/* TODO: think about locking!!! */ + +::Distrio::Error * Distrio_Manager_i::register_io_digital ( + ::Distrio::Digital_ptr & io_digi) +{ + io_digi->id (new_id ()); + digital_list.length (digital_list.length () + 1); + digital_list [digital_list.length () - 1] = io_digi; +} + +::Distrio::Error * Distrio_Manager_i::register_io_analog ( + ::Distrio::Analog_ptr & io_ana) +{ + io_ana->id (new_id ()); + analog_list.length (digital_list.length () + 1); + analog_list [analog_list.length () - 1] = io_ana; +} + +::Distrio::Error * Distrio_Manager_i::register_io_device ( + ::Distrio::Device_ptr & io_dev) +{ + io_dev->id (new_id ()); + device_list.length (device_list.length () + 1); + device_list [device_list.length () - 1] = io_dev; +} + +::Distrio::Error * Distrio_Manager_i::unregister_io_digital ( + ::Distrio::Digital_ptr io_dig) +{ + // Add your implementation here +} + +::Distrio::Error * Distrio_Manager_i::unregister_io_analog ( + ::Distrio::Analog_ptr io_ana) +{ + // Add your implementation here +} + +::Distrio::Error * Distrio_Manager_i::unregister_io_device ( + ::Distrio::Device_ptr io_dev) +{ + // Add your implementation here +} + +void Distrio_Manager_i::log_error ( + const ::Distrio::Error & error) +{ + // Add your implementation here +} + +ACE_TMAIN (int argc, ACE_TCHAR *argv[]) +{ + std::cout << __FILE__ << " build " << __DATE__ << " " << __TIME__ <<std::endl; + + int ret = 0; + CORBA::ORB_var orb; + CORBA::Object_var distrio_manager_obj, root_poa, naming_service; + PortableServer::POA_var poa; + PortableServer::POAManager_var poa_mgr; + CosNaming::NamingContext_var nc; + CosNaming::Name name; + + Distrio_Manager_i *distrio_manager; + PortableServer::ObjectId_var distrio_manager_oid; + + distrio_manager = new Distrio_Manager_i (); + + try { + std::cout << "initialize CORBA orb" << std::endl; + orb = CORBA::ORB_init (argc, argv); + root_poa = orb->resolve_initial_references ("RootPOA"); + poa = PortableServer::POA::_narrow (root_poa.in ()); + distrio_manager_oid = poa->activate_object (distrio_manager); + distrio_manager_obj = distrio_manager->_this (); + + std::cout << "get context of NameService" << std::endl; + naming_service = orb->resolve_initial_references ("NameService"); + if (CORBA::is_nil (naming_service)) { + std::cerr << "can't resolve NameService" << std::endl; + ret = -EINVAL; + goto out; + } + nc = CosNaming::NamingContext::_narrow (naming_service.in ()); + if (CORBA::is_nil (nc)) { + std::cerr << "resolved invalid NameService object" << std::endl; + ret = -EINVAL; + goto out; + } + + std::cout << "bind manager object at NameService" << std::endl; + /* TODO: find out how to build a tree @ the nameservice "distrio/manager" */ + name.length (1); + name[0].id = CORBA::string_dup ("distrio_manager"); + nc->rebind (name, distrio_manager_obj.in ()); + + std::cout << "activate POA Manager" << std::endl; + poa_mgr = poa->the_POAManager (); + poa_mgr->activate (); + + std::cout << "distrio_manager ready" << std::endl; + orb->run (); + orb->destroy (); + } catch (CORBA::SystemException &e) { + std::cerr << "CORBA initialization failed: " << e << std::endl; + ret = -EINVAL; + goto out; + } catch(CORBA::Exception &e) { + std::cerr << "CORBA initialization failed: " << e << std::endl; + ret = -EINVAL; + goto out; + } + +out: + free (distrio_manager); + return ret; +} |
