summaryrefslogtreecommitdiff
path: root/TAO/orbsvcs/orbsvcs/HTIOP/HTIOP_Acceptor.h
blob: bff5b395142973202e51af97fddf4f45c3ad0cd6 (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
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
// This may look like C, but it's really -*- C++ -*-

//=============================================================================
/**
 *  @file    HTIOP_Acceptor.h
 *
 *  $Id$
 *
 *  HTIOP specific acceptor processing
 *
 *
 *  @author Priyanka Gontla <gontla_p@ociweb.com>
 */
//=============================================================================


#ifndef HTIOP_ACCEPTOR_H
#define HTIOP_ACCEPTOR_H
#include /**/ "ace/pre.h"

#include "HTIOP_Completion_Handler.h"
#include "HTIOP_Connection_Handler.h"

#if !defined (ACE_LACKS_PRAGMA_ONCE)
# pragma once
#endif /* ACE_LACKS_PRAGMA_ONCE */

#include "ace/HTBP/HTBP_Addr.h"

#include "tao/Acceptor_Impl.h"
#include "tao/Transport_Acceptor.h"
#include "tao/GIOP_Message_Version.h"
#include "tao/Object_KeyC.h"

#include "ace/SOCK_Acceptor.h"

namespace ACE
{
  namespace HTBP
  {
    class Environment;
  }
}

namespace TAO
{
  namespace HTIOP
  {

    // TAO HTIOP_Acceptor concrete call definition

    /**
     * @class HTIOP_Acceptor
     *
     * @brief HTIOP_Acceptor
     *
     * The HTIOP-specific bridge class for the concrete acceptor.
     * Based on IIOP_Acceptor
     */
    class HTIOP_Export Acceptor : public TAO_Acceptor
    {
    public:
      /// Constructor.
      Acceptor (ACE::HTBP::Environment *ht_env,
                int is_inside);

      /// Destructor.
      ~Acceptor (void);

      /// @@ Helper method for the implementation repository, should go
      ///    away
      const ACE::HTBP::Addr& address (void) const;

      /// Returns the array of endpoints in this acceptor
      const ACE::HTBP::Addr *endpoints (void);

      typedef ACE_Strategy_Acceptor<Completion_Handler, ACE_SOCK_ACCEPTOR> BASE_ACCEPTOR;
      typedef TAO_Creation_Strategy<Completion_Handler> CREATION_STRATEGY;
      typedef ACE_Concurrency_Strategy<Completion_Handler> CONCURRENCY_STRATEGY;
      typedef TAO_Accept_Strategy<Completion_Handler, ACE_SOCK_ACCEPTOR> ACCEPT_STRATEGY;

      /**
       * The TAO::Acceptor methods, check the documentation in
       * Transport_Acceptor.h for details.
       */
      virtual int open (TAO_ORB_Core *orb_core,
                        ACE_Reactor *reactor,
                        int version_major,
                        int version_minor,
                        const char *address,
                        const char *options = 0);

      virtual int open_default (TAO_ORB_Core *orb_core,
                                ACE_Reactor *reactor,
                                int version_major,
                                int version_minor,
                                const char *options = 0);

      virtual int close (void);

      virtual int create_profile (const TAO::ObjectKey &object_key,
                                  TAO_MProfile &mprofile,
                                  CORBA::Short priority);

      virtual int is_collocated (const TAO_Endpoint *endpoint);

      virtual CORBA::ULong endpoint_count (void);

      virtual int object_key (IOP::TaggedProfile &profile,
                              TAO::ObjectKey &key);

      /**
       * Set the host name for the given addr.
       * A hostname may be forced by using specified_hostname.  This
       * is useful if the given address corresponds to more than one
       * hostname and the desired one cannot be determined in any
       * other way.
       */
      int hostname (TAO_ORB_Core *orb_core,
                    ACE_INET_Addr &addr,
                    char *&host,
                    const char *specified_hostname = 0);

      /**
       * Set the host name for the given address using the dotted decimal
       * format.
       */
      int dotted_decimal_address (ACE_INET_Addr &addr,
                                  char *&host);

    protected:

      /**
       * Implement the common part of the open*() methods.  This method is
       * virtual to allow a derived class implementation to be invoked
       * instead.
       */
      virtual int open_i (const ACE::HTBP::Addr &addr,
                          ACE_Reactor *reactor);

      /**
       * Probe the system for available network interfaces, and initialize
       * the <addrs_> array with an ACE::HTBP::Addr for each network
       * interface.  The port for each initialized ACE::HTBP::Addr will be
       * set in the open_i() method.  This method only gets invoked when
       * no explicit hostname is provided in the specified endpoint.
       */
      int probe_interfaces (TAO_ORB_Core *orb_core);

      /**
       * Parse protocol specific options.
       *
       * Currently supported: hostname_in_ior -- Provides the means to add
       * in an alternative hostname in the object reference, such as that
       * of the outside of a firewall.
       */
      virtual int parse_options (const char *options);

      /// Helper method to add a new profile to the mprofile for
      /// each endpoint.
      int create_new_profile (const TAO::ObjectKey &object_key,
                              TAO_MProfile &mprofile,
                              CORBA::Short priority);

      /// Helper method to create a profile that contains all of
      /// our endpoints.
      int create_shared_profile (const TAO::ObjectKey &object_key,
                                 TAO_MProfile &mprofile,
                                 CORBA::Short priority);


    protected:

      /// Array of ACE::HTBP::Addr instances, each one corresponding to a
      /// given network interface.
      ACE::HTBP::Addr *addrs_;

      /**
       * Cache the information about the endpoints serviced by this
       * acceptor.
       * There may in fact be multiple hostnames for this endpoint. For
       * example, if the IP address is INADDR_ANY (0.0.0.0) then there
       * will be possibly a different hostname for each interface.
       */
      char **hosts_;

      /// The number of host names cached in the hosts_ array (equivalent
      /// to the number of endpoints opened by this Acceptor).
      CORBA::ULong endpoint_count_;

      /**
       * Override the hostname used in the ORBEndPoint.
       */
      char *hostname_in_ior_;

      /**
       * The GIOP version for this endpoint
       * @@ Theoretically they shouldn't be here!! We need to look at a
       * way to move this out
       */
      TAO_GIOP_Message_Version version_;

      /// ORB Core.
      TAO_ORB_Core *orb_core_;

    private:

      /// the concrete acceptor, as a pointer to it's base class.
      BASE_ACCEPTOR base_acceptor_;

      /// Acceptor strategies.
      CREATION_STRATEGY *creation_strategy_;
      CONCURRENCY_STRATEGY *concurrency_strategy_;
      ACCEPT_STRATEGY *accept_strategy_;

      ACE::HTBP::Environment *ht_env_;

      /// Flag used to determine if an acceptor should use an "inside"
      /// local address, or try to compose an "outside" address.
      /// If the value is 1, then always use an HTID for local addr,
      /// otherwise use host:port if 0, or guess based on proxy config
      /// if -1.
      int inside_;
    };
  }
}

#if defined(__ACE_INLINE__)
#include "HTIOP_Acceptor.i"
#endif /* __ACE_INLINE__ */

#include /**/ "ace/post.h"
#endif  /* HTIOP_ACCEPTOR_H */