summaryrefslogtreecommitdiff
path: root/TAO/tao/GIOP_Message_Generator_Parser.h
blob: cdc275d85d965fffc0e3fe3140c15f0207e0c2b2 (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

// -*- C++ -*-
// ===================================================================
/**
 *  @file   GIOP_Message_Generator_Parser.h
 *
 *  $Id$
 *
 *  @author Balachandran Natarajan <bala@cs.wustl.edu>
 */
// ===================================================================

#ifndef TAO_GIOP_MESSAGE_GENERATOR_PARSER_H
#define TAO_GIOP_MESSAGE_GENERATOR_PARSER_H
#include "ace/pre.h"

#include "tao/corbafwd.h"

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

#include "tao/Exception.h"

#if defined(_MSC_VER)
#if (_MSC_VER >= 1200)
#pragma warning(push)
#endif /* _MSC_VER >= 1200 */
#pragma warning(disable:4250)
#endif /* _MSC_VER */

class TAO_Operation_Details;
class TAO_Target_Specification;
class TAO_OutputCDR;
class TAO_InputCDR;
class TAO_Pluggable_Reply_Params;
class TAO_GIOP_Locate_Status_Msg;
class TAO_GIOP_Locate_Request_Header;
class TAO_Tagged_Profile;

/**
 * @class TAO_GIOP_Message_Generator_Parser
 *
 * @brief Base class for the GIOP Message generator and parser
 *
 * Version specific classes would inherit from this class. Strategy to
 * determine which version of the GIOP request have we received and
 * which version do we need to use to send messages.
 */

class TAO_Export TAO_GIOP_Message_Generator_Parser
{
public:

  /// Write the request header in to <msg>
  virtual int write_request_header (
      const TAO_Operation_Details &opdetails,
      TAO_Target_Specification &spec,
      TAO_OutputCDR &msg) = 0;

  /// Write the LocateRequest header
  virtual int write_locate_request_header (
      CORBA::ULong request_id,
      TAO_Target_Specification &spec,
      TAO_OutputCDR &msg) = 0;

  /// Write the reply header in to <output>
  virtual int write_reply_header (
      TAO_OutputCDR &output,
      TAO_Pluggable_Reply_Params &reply,
      CORBA::Environment &ACE_TRY_ENV)
    ACE_THROW_SPEC ((CORBA::SystemException)) = 0;

  /// Writes the locate _reply message in to the <output>
  virtual int write_locate_reply_mesg (
      TAO_OutputCDR &output,
      CORBA::ULong request_id,
      TAO_GIOP_Locate_Status_Msg &status) = 0;

  /// Parse the Request Header from the incoming stream. This will do a
  /// version specific parsing of the incoming Request header
  virtual int parse_request_header (TAO_ServerRequest &) = 0;

  /// Parse the Loacte Request Header from the incoming stream. This will do a
  /// version specific parsing of the incoming Request header
  virtual int parse_locate_header (
      TAO_GIOP_Locate_Request_Header &) = 0;

  /// Parse the reply message
  virtual int parse_reply (TAO_InputCDR &input,
                           TAO_Pluggable_Reply_Params &params);

  /// Parse the locate reply message from the server
  virtual int parse_locate_reply (TAO_InputCDR &input,
                                  TAO_Pluggable_Reply_Params &params);

  /// Our versions
  virtual CORBA::Octet major_version (void) = 0;
  virtual CORBA::Octet minor_version (void) = 0;

  /// Is the messaging object ready for processing BiDirectional
  /// request/response?
  virtual int is_ready_for_bidirectional (void);

protected:

  /// Marshall the reply status
  void marshal_reply_status (TAO_OutputCDR &output,
                             TAO_Pluggable_Reply_Params &reply);

  /// Unmarshals the received object key
  CORBA::Boolean unmarshall_object_key (TAO_ServerRequest &request,
                                        TAO_InputCDR &input);

  /// Unmarshall the IOP::TaggedProfile
  CORBA::Boolean unmarshall_iop_profile (TAO_ServerRequest &request,
                                         TAO_InputCDR &input);

  /// Unmarshalls the GIOP::IORAddressingInfo
  CORBA::Boolean unmarshall_ref_addr (TAO_ServerRequest &request,
                                      TAO_InputCDR &input);

  /// Unmarshals the received object key
  CORBA::Boolean unmarshall_object_key (TAO_GIOP_Locate_Request_Header &request,
                                        TAO_InputCDR &input);

  /// Unmarshall the IOP::TaggedProfile
  CORBA::Boolean unmarshall_iop_profile (TAO_GIOP_Locate_Request_Header &request,
                                         TAO_InputCDR &input);

  /// Unmarshalls the GIOP::IORAddressingInfo
  CORBA::Boolean unmarshall_ref_addr (TAO_GIOP_Locate_Request_Header &request,
                                      TAO_InputCDR &input);

};

#if defined (__ACE_INLINE__)
# include "tao/GIOP_Message_Generator_Parser.inl"
#endif /* __ACE_INLINE__ */

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