00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014 #ifndef TAO_GIOP_MESSAGE_BASE_H
00015 #define TAO_GIOP_MESSAGE_BASE_H
00016
00017 #include "ace/pre.h"
00018
00019 #include "tao/TAO_Export.h"
00020
00021 #if !defined (ACE_LACKS_PRAGMA_ONCE)
00022 # pragma once
00023 #endif
00024
00025 #include "tao/Pluggable_Messaging.h"
00026 #include "tao/Pluggable_Messaging_Utils.h"
00027 #include "tao/GIOP_Message_Generator_Parser_Impl.h"
00028 #include "tao/GIOP_Utils.h"
00029 #include "tao/GIOP_Message_State.h"
00030 #include "tao/GIOP_Fragmentation_Strategy.h"
00031 #include "tao/CDR.h"
00032 #include "tao/Incoming_Message_Stack.h"
00033
00034 #include "ace/Auto_Ptr.h"
00035
00036 TAO_BEGIN_VERSIONED_NAMESPACE_DECL
00037
00038 class TAO_Pluggable_Reply_Params;
00039 class TAO_Queued_Data;
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051 class TAO_Export TAO_GIOP_Message_Base : public TAO_Pluggable_Messaging
00052 {
00053 public:
00054
00055 TAO_GIOP_Message_Base (TAO_ORB_Core *orb_core,
00056 TAO_Transport * transport,
00057 size_t input_cdr_size = ACE_CDR::DEFAULT_BUFSIZE);
00058
00059
00060 virtual ~TAO_GIOP_Message_Base (void);
00061
00062
00063
00064 virtual void init (CORBA::Octet major,
00065 CORBA::Octet minor);
00066
00067
00068 virtual void reset (void);
00069
00070
00071
00072 virtual int generate_request_header (TAO_Operation_Details &op,
00073 TAO_Target_Specification &spec,
00074 TAO_OutputCDR &cdr);
00075
00076
00077 virtual int generate_locate_request_header (
00078 TAO_Operation_Details &op,
00079 TAO_Target_Specification &spec,
00080 TAO_OutputCDR &cdr);
00081
00082
00083 virtual int generate_reply_header (
00084 TAO_OutputCDR &cdr,
00085 TAO_Pluggable_Reply_Params_Base ¶ms);
00086
00087 virtual int generate_fragment_header (TAO_OutputCDR & cdr,
00088 CORBA::ULong request_id);
00089
00090
00091
00092
00093 virtual int format_message (TAO_OutputCDR &cdr);
00094
00095
00096
00097
00098
00099
00100
00101
00102 virtual int parse_next_message (TAO_Queued_Data &qd,
00103 size_t &mesg_length);
00104
00105
00106
00107
00108
00109 virtual int extract_next_message (ACE_Message_Block &incoming,
00110 TAO_Queued_Data *&qd);
00111
00112
00113 virtual int consolidate_node (TAO_Queued_Data *qd,
00114 ACE_Message_Block &incoming);
00115
00116
00117
00118 virtual int process_request_message (TAO_Transport *transport,
00119 TAO_Queued_Data *qd);
00120
00121
00122
00123
00124 virtual int process_reply_message (
00125 TAO_Pluggable_Reply_Params &reply_info,
00126 TAO_Queued_Data *qd);
00127
00128
00129 virtual int generate_exception_reply (
00130 TAO_OutputCDR &cdr,
00131 TAO_Pluggable_Reply_Params_Base ¶ms,
00132 const CORBA::Exception &x);
00133
00134
00135 virtual size_t header_length (void) const;
00136
00137
00138 virtual size_t fragment_header_length (
00139 const TAO_GIOP_Message_Version& giop_version) const;
00140
00141 virtual TAO_OutputCDR &out_stream (void);
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152 virtual int consolidate_fragmented_message (TAO_Queued_Data *qd,
00153 TAO_Queued_Data *&msg);
00154
00155
00156
00157
00158
00159
00160 virtual int discard_fragmented_message (const TAO_Queued_Data *cancel_request);
00161
00162
00163 virtual TAO_GIOP_Fragmentation_Strategy * fragmentation_strategy (void);
00164
00165 protected:
00166
00167
00168 virtual int process_request (TAO_Transport *transport,
00169 TAO_InputCDR &input,
00170 TAO_OutputCDR &output,
00171 TAO_GIOP_Message_Generator_Parser *);
00172
00173
00174 virtual int process_locate_request (TAO_Transport *transport,
00175 TAO_InputCDR &input,
00176 TAO_OutputCDR &output,
00177 TAO_GIOP_Message_Generator_Parser *);
00178
00179
00180 void set_state (const TAO_GIOP_Message_Version &version,
00181 TAO_GIOP_Message_Generator_Parser *&) const;
00182
00183
00184 void dump_msg (const char *label, const u_char *ptr, size_t len);
00185
00186
00187
00188
00189 int write_protocol_header (TAO_GIOP_Message_Type t, TAO_OutputCDR &msg);
00190
00191
00192
00193
00194
00195 int make_send_locate_reply (TAO_Transport *transport,
00196 TAO_GIOP_Locate_Request_Header &request,
00197 TAO_GIOP_Locate_Status_Msg &status,
00198 TAO_OutputCDR &output,
00199 TAO_GIOP_Message_Generator_Parser *);
00200
00201
00202 int send_error (TAO_Transport *transport);
00203
00204
00205 void send_close_connection (const TAO_GIOP_Message_Version &version,
00206 TAO_Transport *transport,
00207 void *ctx);
00208
00209
00210
00211 int send_reply_exception (TAO_Transport *transport,
00212 TAO_OutputCDR &cdr,
00213 CORBA::ULong request_id,
00214 IOP::ServiceContextList *svc_info,
00215 CORBA::Exception *x);
00216
00217
00218 virtual int generate_locate_reply_header (
00219 TAO_OutputCDR &cdr,
00220 TAO_Pluggable_Reply_Params_Base ¶ms);
00221
00222
00223
00224 virtual int is_ready_for_bidirectional (TAO_OutputCDR &msg);
00225
00226
00227
00228 TAO_Queued_Data *make_queued_data (size_t sz);
00229
00230 private:
00231
00232
00233 int parse_request_id (const TAO_Queued_Data *qd, CORBA::ULong &request_id) const;
00234
00235
00236
00237 int parse_request_id (const TAO_InputCDR &cdr, CORBA::ULong &request_id) const;
00238
00239
00240
00241
00242
00243
00244
00245 void set_giop_flags (TAO_OutputCDR & msg) const;
00246
00247 private:
00248
00249 TAO_ORB_Core *orb_core_;
00250
00251
00252 TAO_GIOP_Message_Generator_Parser_Impl tao_giop_impl_;
00253
00254
00255
00256 TAO::Incoming_Message_Stack fragment_stack_;
00257
00258 protected:
00259
00260
00261
00262
00263
00264
00265
00266
00267
00268 auto_ptr<TAO_GIOP_Fragmentation_Strategy> fragmentation_strategy_;
00269
00270
00271 TAO_OutputCDR out_stream_;
00272
00273
00274
00275
00276
00277
00278
00279 };
00280
00281
00282
00283
00284
00285
00286
00287 TAO_END_VERSIONED_NAMESPACE_DECL
00288
00289 #include "ace/post.h"
00290
00291 #endif