00001
00002
00003 #include "tao/Strategies/SCIOP_Transport.h"
00004
00005 #if TAO_HAS_SCIOP == 1
00006
00007 #include "tao/Strategies/SCIOP_Connection_Handler.h"
00008 #include "tao/Strategies/SCIOP_Acceptor.h"
00009 #include "tao/Strategies/SCIOP_Profile.h"
00010 #include "tao/Acceptor_Registry.h"
00011 #include "tao/Thread_Lane_Resources.h"
00012 #include "tao/operation_details.h"
00013 #include "tao/Timeprobe.h"
00014 #include "tao/CDR.h"
00015 #include "tao/Transport_Mux_Strategy.h"
00016 #include "tao/Wait_Strategy.h"
00017 #include "tao/Stub.h"
00018 #include "tao/ORB_Core.h"
00019 #include "tao/debug.h"
00020 #include "tao/GIOP_Message_Base.h"
00021 #include "tao/Protocols_Hooks.h"
00022 #include "tao/Adapter.h"
00023
00024 ACE_RCSID (tao,
00025 SCIOP_Transport,
00026 "$Id: SCIOP_Transport.cpp 84860 2009-03-17 10:17:38Z johnnyw $")
00027
00028 TAO_BEGIN_VERSIONED_NAMESPACE_DECL
00029
00030 TAO_SCIOP_Transport::TAO_SCIOP_Transport (TAO_SCIOP_Connection_Handler *handler,
00031 TAO_ORB_Core *orb_core)
00032 : TAO_Transport (TAO_TAG_SCIOP_PROFILE,
00033 orb_core)
00034 , connection_handler_ (handler)
00035 {
00036 }
00037
00038 TAO_SCIOP_Transport::~TAO_SCIOP_Transport (void)
00039 {
00040 }
00041
00042 ACE_Event_Handler *
00043 TAO_SCIOP_Transport::event_handler_i (void)
00044 {
00045 return this->connection_handler_;
00046 }
00047
00048 TAO_Connection_Handler *
00049 TAO_SCIOP_Transport::connection_handler_i (void)
00050 {
00051 return this->connection_handler_;
00052 }
00053
00054 ssize_t
00055 TAO_SCIOP_Transport::send (iovec *iov, int iovcnt,
00056 size_t &bytes_transferred,
00057 const ACE_Time_Value *max_wait_time)
00058 {
00059 ssize_t retval = this->connection_handler_->peer ().sendv (iov, iovcnt,
00060 max_wait_time);
00061 if (retval > 0)
00062 bytes_transferred = retval;
00063
00064 return retval;
00065 }
00066
00067 ssize_t
00068 TAO_SCIOP_Transport::recv (char *buf,
00069 size_t len,
00070 const ACE_Time_Value *max_wait_time)
00071 {
00072 ssize_t n = this->connection_handler_->peer ().recv (buf,
00073 len,
00074 max_wait_time);
00075
00076
00077
00078 if (n == -1 &&
00079 TAO_debug_level > 4 &&
00080 errno != ETIME)
00081 {
00082 ACE_DEBUG ((LM_DEBUG,
00083 ACE_TEXT ("TAO (%P|%t) - SCIOP_Transport[%d]::recv, ")
00084 ACE_TEXT ("read failure - %m\n"),
00085 this->id ()));
00086 }
00087
00088
00089 if (n == -1)
00090 {
00091 if (errno == EWOULDBLOCK)
00092 return 0;
00093
00094
00095 return -1;
00096 }
00097
00098
00099
00100
00101
00102 else if (n == 0)
00103 {
00104 return -1;
00105 }
00106
00107 return n;
00108 }
00109
00110 int
00111 TAO_SCIOP_Transport::send_request (TAO_Stub *stub,
00112 TAO_ORB_Core *orb_core,
00113 TAO_OutputCDR &stream,
00114 TAO_Message_Semantics message_semantics,
00115 ACE_Time_Value *max_wait_time)
00116 {
00117 if (this->ws_->sending_request (orb_core,
00118 message_semantics) == -1)
00119
00120 return -1;
00121
00122 if (this->send_message (stream,
00123 stub,
00124 message_semantics,
00125 max_wait_time) == -1)
00126 return -1;
00127
00128 this->first_request_sent();
00129
00130 return 0;
00131 }
00132
00133 int
00134 TAO_SCIOP_Transport::send_message (TAO_OutputCDR &stream,
00135 TAO_Stub *stub,
00136 TAO_Message_Semantics message_semantics,
00137 ACE_Time_Value *max_wait_time)
00138 {
00139
00140 if (this->messaging_object ()->format_message (stream, stub) != 0)
00141 return -1;
00142
00143
00144 ssize_t n = this->send_message_shared (stub,
00145 message_semantics,
00146 stream.begin (),
00147 max_wait_time);
00148
00149 if (n == -1)
00150 {
00151 if (TAO_debug_level)
00152 ACE_ERROR ((LM_ERROR,
00153 ACE_TEXT ("TAO (%P|%t) - SCIOP_Transport[%d]::send_message, ")
00154 ACE_TEXT (" write failure - %m\n"),
00155 this->id ()));
00156 return -1;
00157 }
00158
00159 return 1;
00160 }
00161
00162 int
00163 TAO_SCIOP_Transport::tear_listen_point_list (TAO_InputCDR &cdr)
00164 {
00165 CORBA::Boolean byte_order;
00166 if ((cdr >> ACE_InputCDR::to_boolean (byte_order)) == 0)
00167 return -1;
00168
00169 cdr.reset_byte_order (static_cast<int> (byte_order));
00170
00171 IIOP::ListenPointList listen_list;
00172 if (!(cdr >> listen_list))
00173 return -1;
00174
00175
00176
00177 this->bidirectional_flag (0);
00178
00179 return this->connection_handler_->process_listen_point_list (listen_list);
00180 }
00181
00182 void
00183 TAO_SCIOP_Transport::set_bidir_context_info (TAO_Operation_Details &opdetails)
00184 {
00185
00186 TAO_Acceptor_Registry &ar =
00187 this->orb_core ()->lane_resources ().acceptor_registry ();
00188
00189
00190 TAO_AcceptorSetIterator acceptor = ar.begin ();
00191
00192 IIOP::ListenPointList listen_point_list;
00193
00194 for (;
00195 acceptor != ar.end ();
00196 acceptor++)
00197 {
00198
00199 if ((*acceptor)->tag () == this->tag ())
00200 {
00201 if (this->get_listen_point (listen_point_list,
00202 *acceptor) == -1)
00203 {
00204 ACE_ERROR ((LM_ERROR,
00205 "TAO (%P|%t) - SCIOP_Transport::set_bidir_info, "
00206 "error getting listen_point\n"));
00207
00208 return;
00209 }
00210 }
00211 }
00212
00213
00214
00215 TAO_OutputCDR cdr;
00216
00217
00218 if ((cdr << ACE_OutputCDR::from_boolean (TAO_ENCAP_BYTE_ORDER) == 0)
00219 || (cdr << listen_point_list) == 0)
00220 return;
00221
00222
00223 opdetails.request_service_context ().set_context (IOP::BI_DIR_IIOP, cdr);
00224 }
00225
00226 int
00227 TAO_SCIOP_Transport::get_listen_point (
00228 IIOP::ListenPointList &listen_point_list,
00229 TAO_Acceptor *acceptor)
00230 {
00231 TAO_SCIOP_Acceptor *sciop_acceptor =
00232 dynamic_cast<TAO_SCIOP_Acceptor *> (acceptor );
00233
00234
00235 const ACE_INET_Addr *endpoint_addr =
00236 sciop_acceptor->endpoints ();
00237
00238
00239 size_t count =
00240 sciop_acceptor->endpoint_count ();
00241
00242
00243 ACE_INET_Addr local_addr;
00244
00245 if (this->connection_handler_->peer ().get_local_addr (local_addr) == -1)
00246 {
00247 ACE_ERROR_RETURN ((LM_ERROR,
00248 ACE_TEXT ("(%P|%t) Could not resolve local ")
00249 ACE_TEXT ("host address in ")
00250 ACE_TEXT ("get_listen_point()\n")),
00251 -1);
00252 }
00253
00254
00255
00256
00257 CORBA::String_var local_interface;
00258
00259
00260 if (sciop_acceptor->hostname (this->orb_core_,
00261 local_addr,
00262 local_interface.out ()) == -1)
00263 {
00264 ACE_ERROR_RETURN ((LM_ERROR,
00265 ACE_TEXT ("(%P|%t) Could not resolve local host")
00266 ACE_TEXT (" name\n")),
00267 -1);
00268 }
00269
00270 for (size_t index = 0; index != count; index++)
00271 {
00272 if (local_addr.get_ip_address() == endpoint_addr[index].get_ip_address())
00273 {
00274
00275 CORBA::ULong const len = listen_point_list.length ();
00276
00277
00278 listen_point_list.length (len + 1);
00279
00280
00281
00282 IIOP::ListenPoint &point = listen_point_list[len];
00283 point.host = CORBA::string_dup (local_interface.in ());
00284 point.port = endpoint_addr[index].get_port_number ();
00285 }
00286 }
00287
00288 return 1;
00289 }
00290
00291 TAO_END_VERSIONED_NAMESPACE_DECL
00292
00293 #endif