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
00084 virtual int generate_reply_header (
00085 TAO_OutputCDR &cdr,
00086 TAO_Pluggable_Reply_Params_Base ¶ms
00087 );
00088
00089 virtual int generate_fragment_header (TAO_OutputCDR & cdr,
00090 CORBA::ULong request_id);
00091
00092
00093
00094
00095 virtual int format_message (TAO_OutputCDR &cdr);
00096
00097
00098
00099
00100
00101
00102
00103
00104 virtual int parse_next_message (ACE_Message_Block &incoming,
00105 TAO_Queued_Data &qd,
00106 size_t &mesg_length);
00107
00108
00109
00110
00111
00112 virtual int extract_next_message (ACE_Message_Block &incoming,
00113 TAO_Queued_Data *&qd);
00114
00115
00116 virtual int consolidate_node (TAO_Queued_Data *qd,
00117 ACE_Message_Block &incoming);
00118
00119
00120
00121 virtual int process_request_message (TAO_Transport *transport,
00122 TAO_Queued_Data *qd);
00123
00124
00125
00126
00127 virtual int process_reply_message (
00128 TAO_Pluggable_Reply_Params &reply_info,
00129 TAO_Queued_Data *qd);
00130
00131
00132 virtual int generate_exception_reply (
00133 TAO_OutputCDR &cdr,
00134 TAO_Pluggable_Reply_Params_Base ¶ms,
00135 CORBA::Exception &x
00136 );
00137
00138
00139 virtual size_t header_length (void) const;
00140
00141
00142 virtual size_t fragment_header_length (CORBA::Octet major,
00143 CORBA::Octet minor) const;
00144
00145 virtual TAO_OutputCDR &out_stream (void);
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156 virtual int consolidate_fragmented_message (TAO_Queued_Data *qd,
00157 TAO_Queued_Data *&msg);
00158
00159
00160
00161
00162
00163
00164 virtual int discard_fragmented_message (const TAO_Queued_Data *cancel_request);
00165
00166
00167 virtual TAO_GIOP_Fragmentation_Strategy * fragmentation_strategy (void);
00168
00169 protected:
00170
00171
00172 virtual int process_request (TAO_Transport *transport,
00173 TAO_InputCDR &input,
00174 TAO_OutputCDR &output,
00175 TAO_GIOP_Message_Generator_Parser *);
00176
00177
00178 virtual int process_locate_request (TAO_Transport *transport,
00179 TAO_InputCDR &input,
00180 TAO_OutputCDR &output,
00181 TAO_GIOP_Message_Generator_Parser *);
00182
00183
00184 void set_state (CORBA::Octet major,
00185 CORBA::Octet minor,
00186 TAO_GIOP_Message_Generator_Parser *&) const;
00187
00188
00189 void dump_msg (const char *label,
00190 const u_char *ptr,
00191 size_t len);
00192
00193
00194
00195
00196
00197
00198
00199 TAO_Pluggable_Message_Type message_type (
00200 const TAO_GIOP_Message_State &state) const;
00201
00202
00203
00204
00205 int write_protocol_header (TAO_GIOP_Message_Type t,
00206 TAO_OutputCDR &msg);
00207
00208
00209
00210
00211
00212 int make_send_locate_reply (TAO_Transport *transport,
00213 TAO_GIOP_Locate_Request_Header &request,
00214 TAO_GIOP_Locate_Status_Msg &status,
00215 TAO_OutputCDR &output,
00216 TAO_GIOP_Message_Generator_Parser *);
00217
00218
00219 int send_error (TAO_Transport *transport);
00220
00221
00222 void send_close_connection (const TAO_GIOP_Message_Version &version,
00223 TAO_Transport *transport,
00224 void *ctx);
00225
00226
00227
00228 int send_reply_exception (TAO_Transport *transport,
00229 TAO_OutputCDR &cdr,
00230 CORBA::ULong request_id,
00231 IOP::ServiceContextList *svc_info,
00232 CORBA::Exception *x);
00233
00234
00235
00236 virtual int generate_locate_reply_header (
00237 TAO_OutputCDR & ,
00238 TAO_Pluggable_Reply_Params_Base & );
00239
00240
00241
00242 virtual int is_ready_for_bidirectional (TAO_OutputCDR &msg);
00243
00244
00245
00246 TAO_Queued_Data *make_queued_data (size_t sz);
00247
00248
00249
00250 void init_queued_data (TAO_Queued_Data* qd,
00251 const TAO_GIOP_Message_State& state) const;
00252
00253 private:
00254 int parse_incoming_messages (ACE_Message_Block &incoming);
00255
00256
00257
00258 int parse_request_id (const TAO_Queued_Data *qd, CORBA::ULong &request_id) const;
00259
00260
00261
00262 int parse_request_id (const TAO_InputCDR &cdr, CORBA::ULong &request_id) const;
00263
00264
00265
00266
00267
00268
00269
00270 void set_giop_flags (TAO_OutputCDR & msg) const;
00271
00272 private:
00273
00274 TAO_ORB_Core *orb_core_;
00275
00276
00277
00278 TAO_GIOP_Message_State message_state_;
00279
00280
00281 TAO_GIOP_Message_Generator_Parser_Impl tao_giop_impl_;
00282
00283
00284
00285 TAO::Incoming_Message_Stack fragment_stack_;
00286
00287 protected:
00288
00289
00290
00291
00292
00293
00294
00295
00296
00297 auto_ptr<TAO_GIOP_Fragmentation_Strategy> fragmentation_strategy_;
00298
00299
00300 TAO_OutputCDR out_stream_;
00301
00302
00303
00304
00305
00306
00307
00308 };
00309
00310
00311
00312
00313
00314
00315
00316 TAO_END_VERSIONED_NAMESPACE_DECL
00317
00318 #include "ace/post.h"
00319
00320 #endif