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
|
// $Id$
#include "Notification_Receiver_Handler.h"
ACE_RCSID(Consumer, Notification_Receiver_Handler, "$Id$")
#if defined (ACE_HAS_ORBIX) && (ACE_HAS_ORBIX != 0)
#if defined (ACE_HAS_MT_ORBIX) && (ACE_HAS_MT_ORBIX != 0)
typedef ACE_MT_CORBA_Handler CORBA_HANDLER;
#else
typedef ACE_ST_CORBA_Handler CORBA_HANDLER;
#endif /* ACE_HAS_MT_ORBIX */
int
Notification_Receiver_Handler::handle_close (ACE_HANDLE, ACE_Reactor_Mask)
{
// ACE_ST_CORBA_Handler::remove_service (Event_Comm_Notification_Receiver_IMPL);
if (this->receiver_ != 0)
{
ACE_DEBUG ((LM_DEBUG, "closing down Notification_Receiver_Handler\n"));
CORBA_HANDLER::instance ()->deactivate_service (Event_Comm_Notification_Receiver_IMPL,
this->receiver_->_marker ());
CORBA::release (this->receiver_);
this->receiver_ = 0;
CORBA::release (this->notifier_);
this->notifier_ = 0;
// *Must* be allocated dynamically in order to delete this!
delete this;
}
return 0;
}
Notification_Receiver_Handler::Notification_Receiver_Handler (int argc, char *argv[])
: notifier_ (0),
receiver_ (0)
{
const char *server_name = Event_Comm_Notification_Receiver_IMPL;
char buf[BUFSIZ];
char *receiver_marker = buf;
char *filtering_criteria;
char *host;
char *notifier_marker;
char *service_location = argv[0];
// First see if we have any environment variables.
filtering_criteria = ACE_OS::getenv ("FILTERING_CRITERIA");
host = ACE_OS::getenv ("HOST");
notifier_marker = ACE_OS::getenv ("NOTIFIER_MARKER");
// Then override these variables with command-line arguments.
filtering_criteria = argc > 1 ? argv[1] : "";
host = argc > 2 ? argv[2] : "tango.cs";
notifier_marker = argc > 3 ? argv[3] : "notifier:" Event_Comm_Notifier_IR;
CORBA::Orbix.setDiagnostics (0);
struct utsname name;
// Make the marker name be the "/hostname/processid"
ACE_OS::uname (&name);
sprintf (buf, "/%s/%d", name.nodename, ACE_OS::getpid ());
CORBA_HANDLER::instance ()->activate_service (Event_Comm_Notification_Receiver_IMPL,
receiver_marker, service_location);
// Create the receiver object.
this->receiver_ = new TIE_Event_Comm_Notification_Receiver (Notification_Receiver_i)
(new Notification_Receiver_i);
this->receiver_->_marker (receiver_marker);
ACE_ASSERT (this->receiver_);
TRY {
// Get a binding to the notifier.
this->notifier_ = Event_Comm::Notifier::_bind (notifier_marker, host, IT_X);
if (this->notifier_ != CORBA::OBJECT_NIL)
// Subscribe ourselves with the notifier's broker.
this->notifier_->subscribe (this->receiver_,
filtering_criteria, IT_X);
} CATCHANY {
cerr << "Unexpected exception " << IT_X << endl;
ACE_OS::exit (1);
} ENDTRY;
// Print out context.
receiver_marker = (char *) this->receiver_->_marker ();
CORBA::BOA::activationMode mode = CORBA::Orbix.myActivationMode ();
ACE_DEBUG ((LM_DEBUG, "starting up a %spersistent server in mode %d with marker name %s\n",
mode == CORBA::BOA::persistentActivationMode ? "" : "non-",
mode, receiver_marker));
}
Event_Comm::Notification_Receiver *
Notification_Receiver_Handler::receiver (void)
{
return this->receiver_;
}
Event_Comm::Notifier *
Notification_Receiver_Handler::notifier (void)
{
return this->notifier_;
}
// Destroy a Receiver target object.
Notification_Receiver_Handler::~Notification_Receiver_Handler (void)
{
this->handle_close (-1, ACE_Event_Handler::ALL_EVENTS_MASK);
}
#endif /* ACE_HAS_ORBIX */
|