summaryrefslogtreecommitdiff
path: root/TAO/tao/GIOP_Message_Acceptors.h
blob: 030b0b3e63c0718211c65252233315f35d9e696f (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
// -*- C++ -*-
// $Id$

// ============================================================================
//
// = LIBRARY
//     TAO
//
// = FILENAME
//     GIOP_Message_Acceptors.h
//
// = DESCRIPTION
//   Implementation interface for the Server side of GIOP classes.  
//
// = AUTHOR
//     Balachandran Natarajan <bala@cs.wustl.edu>
//
// ============================================================================
#ifndef TAO_GIOP_MESSAGE_ACCEPTORS
#define TAO_GIOP_MESSAGE_ACCEPTORS

#include "tao/GIOP_Message_Base.h"
#include "tao/GIOP_Utils.h"
#include "tao/GIOP_Message_Accept_State.h"
#include "tao/ORB_Core.h"
#include "tao/debug.h"

class TAO_Export TAO_GIOP_Message_Acceptors:
  public TAO_GIOP_Message_Base
{
  // = TITLE
  //   TAO_GIOP_Message_Acceptors
  // = DESCRIPTION
  //   This class provides a comprehensive set of interfaces for the
  //   server side of the GIOP classes. 
  
public:

  TAO_GIOP_Message_Acceptors (TAO_ORB_Core *orb_core);
  // Ctor

  int process_connector_messages (TAO_Transport *transport,
                                  TAO_ORB_Core *orb_core,
                                  TAO_InputCDR &input,
                                  CORBA::Octet message_type);
  // Processes the messages from the connectors so that they can be
  // passed on to the appropriate states.
  
  int parse_reply (TAO_Message_State_Factory &mesg_state,
                   TAO_Pluggable_Connector_Params &params);
private:
  
  int process_connector_request (TAO_Transport *transport,
                                 TAO_ORB_Core* orb_core,
                                 TAO_InputCDR &input);
  // A request was received on the server side. <transport> is the
  // source of the message (and thus where the  replies should be
  // sent). <orb_core> is the ORB that received the message <input>
  // contains the message <output> can be used to store any responses
  // <request_id> and <response_required> are set as part of the
  // message processing.


  int process_connector_locate (TAO_Transport *transport,
                                TAO_ORB_Core* orb_core,
                                TAO_InputCDR &input);
  // A LocateRequest was received on the server side. <transport> is
  // the source of the message (and thus where the replies should be
  // sent). <orb_core> is the ORB that received the message <input>
  // contains the message <output> can be used to store any responses
  // <request_id> and <response_required> are set as part of the
  // message processing.

  CORBA::Octet major_version (void);
  CORBA::Octet minor_version (void);
  
  CORBA::Boolean make_reply (CORBA::ULong request_id,
                             TAO_OutputCDR &output);
  // This would prepare a version specific reply to the
  // messages from the client. The type of reply would be context
  // sensitive. Only the common stuff for all the replies to be
  // sent would be handled.
  
  int make_send_locate_reply (TAO_Transport *transport,
                              TAO_GIOP_Locate_Request_Header &request,
                              TAO_GIOP_Locate_Status_Msg &status);
  // As on date 1.1 & 1.2 seem to have similar headers. Til an
  // unmanageable difference comes let them be implemented here. 

  int send_reply_exception (TAO_Transport *transport,
                            TAO_ORB_Core* orb_core,
                            CORBA::ULong request_id,
                            CORBA::Exception *x);
  // We must send a LocateReply through <transport>, this request
  // resulted in some kind of exception.
  
  int validate_version (TAO_GIOP_Message_State *state);
  
  void set_state (CORBA::Octet def_major,
                  CORBA::Octet def_minor);
  
  TAO_GIOP_Message_Accept_State *accept_state_;
  // This indicates the strategy that we are using for this request
  
  TAO_GIOP_Message_Accept_Impl implementations_;
  // Different strategies that we know
  
  TAO_OutputCDR output_;
  // The output CDR stream
  
  char repbuf_[ACE_CDR::DEFAULT_BUFSIZE];
  // A buffer that we will use to initialise the CDR stream

  // Quoting Carlos,
  // Remember that the same connection could receive multiple
  // requests concurrently.  Currently the ORB cannot do this, but we
  // want to do it in the future....
 
  // The above will not work for the case that Carlos mentions, but
  // till then we can have it here. This gets us better performance.
  
  ////////////////////////////////////////////////////
  // Inherited methods. Should not be here in the first place? 
  ////////////////////////////////////////////////////
  CORBA::Boolean 
  write_request_header (const TAO_Operation_Details &opdetails,
                        TAO_Target_Specification &spec,
                        TAO_OutputCDR &msg);

  CORBA::Boolean
  write_locate_request_header (CORBA::ULong request_id,
                               TAO_Target_Specification &spec,
                               TAO_OutputCDR &msg);
  ///////////////////////////////////////////////////
};

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

#endif /*TAO_GIOP_MESSAGE_ACCEPTORS*/