summaryrefslogtreecommitdiff
path: root/TAO/examples/Event_Comm/Notifier_Server.cpp
blob: 74eb3eacffeca10d3b099bfeccc8da527f0641c5 (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
#include "Notifier_Server.h"
#include "Event_CommC.h"
#include "tao/debug.h"
#include "tao/ORB_Core.h"

// Constructor.
Notifier_Server::Notifier_Server ()
{
}

// Destructor.

Notifier_Server::~Notifier_Server ()
{
}

int
Notifier_Server::close ()
{
  try
    {
      // disconnect all the consumers.
      this->servant_.disconnect ("notifier shutdown.");

      // Name the object.
      CosNaming::Name notifier_obj_name (1);
      notifier_obj_name.length (1);
      notifier_obj_name[0].id =
        CORBA::string_dup (NOTIFIER_BIND_NAME);

      this->naming_server_->unbind (notifier_obj_name);

      // Instruct the ORB to shutdown.
      this->orb_manager_.orb ()->shutdown ();
    }
  catch (const CORBA::Exception&)
    {
      return -1;
    }

    return 0;
}

// The naming service is initialized and the naming context as well as
// the object name is bound to the naming server.

int
Notifier_Server::init_naming_service ()
{
  try
    {
      CORBA::ORB_var orb = this->orb_manager_.orb ();

      TAO_debug_level = 1;

      if (this->naming_server_.init (orb.in ()) == -1)
        ACE_ERROR_RETURN ((LM_ERROR,
                           "Failed to initialize TAO_Naming_Server\n"),
                          -1);

      // Register the object implementation with the POA.
      Event_Comm::Notifier_var notifier_obj =
        this->servant_._this ();

      // Name the object.
      CosNaming::Name notifier_obj_name (1);
      notifier_obj_name.length (1);
      notifier_obj_name[0].id =
        CORBA::string_dup (NOTIFIER_BIND_NAME);

      // Now, attach the object name to the context.
      this->naming_server_->bind (notifier_obj_name,
                                  notifier_obj.in ());
    }
  catch (const CORBA::Exception& ex)
    {
      ex._tao_print_exception ("Notifier_Server::init_naming_service\n");
      return -1;
    }

  return 0;
}


// Initialize the server.
int
Notifier_Server::init (int argc,
                       ACE_TCHAR *argv[])
{
  // Call the init of <TAO_ORB_Manager> to initialize the ORB and
  // create the child poa under the root POA.

 if (this->orb_manager_.init_child_poa (argc,
                                        argv,
                                        "child_poa") == -1)

   ACE_ERROR_RETURN ((LM_ERROR,
                       "%p\n",
                      "init_child_poa"),
                      -1);

 this->orb_manager_.activate_poa_manager ();

 // Activate the servant in the POA.
 CORBA::String_var str =
   this->orb_manager_.activate_under_child_poa (NOTIFIER_BIND_NAME,
                                                 &this->servant_);

 return this->init_naming_service ();
}

int
Notifier_Server::run ()
{
  ACE_DEBUG ((LM_DEBUG,
              "Running the notifier server...\n"));

  // Run the main event loop for the ORB.
  this->orb_manager_.run ();

  return 0;
}

ACE_Reactor *
Notifier_Server::reactor ()
{
  return TAO_ORB_Core_instance ()->reactor ();
}