blob: 345eff67f1515c266a2fddae86836d20e8c45d5a (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
|
/**
* 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 <distrio_error.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)
{
Distrio::Digital_var dig;
try {
dig = Distrio::Digital::_narrow (io_digi);
dig->id (new_id ());
} catch (::CORBA::Exception *exc) {
std::cerr << "register digital io failed" << std::endl;
}
digital_list.length (digital_list.length () + 1);
digital_list [digital_list.length () - 1] = dig;
return distrio_success ();
}
::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)
{
Distrio::Device_var dev;
try {
dev = Distrio::Device::_narrow (io_dev);
dev->id (new_id ());
} catch (::CORBA::Exception *exc) {
std::cerr << "register device failed" << std::endl;
}
device_list.length (device_list.length () + 1);
device_list [device_list.length () - 1] = dev;
return distrio_success ();
}
::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;
}
|