3 #endif /*JAWS_BUILD_DLL*/
5 #include "ace/config-lite.h"
7 #include "jaws3/Jaws_IO.h"
8 #include "jaws3/Asynch_IO.h"
9 #include "jaws3/Event_Completer.h"
10 #include "jaws3/Event_Result.h"
12 #if defined (ACE_HAS_AIO_CALLS) || defined (ACE_HAS_WIN32_OVERLAPPED_IO)
14 #include "jaws3/Asynch_IO_Helpers.h"
17 JAWS_Asynch_IO::send ( ACE_HANDLE handle
18 , ACE_Message_Block
*mb
19 , JAWS_Event_Completer
*completer
23 JAWS_EC_AH_Adapter
*jecaha
;
24 jecaha
= JAWS_EC_AH_Adapter::make (completer
);
26 ACE_Asynch_Write_Stream asynch_write_stream
;
29 || asynch_write_stream
.open (*jecaha
, handle
) == -1
30 || asynch_write_stream
.write (*mb
, mb
->length (), act
) == -1)
33 JAWS_Event_Result
io_result ( 0
34 , JAWS_Event_Result::JE_ERROR
35 , JAWS_Event_Result::JE_SEND_FAIL
39 completer
->output_complete (io_result
, act
);
45 JAWS_Asynch_IO::recv ( ACE_HANDLE handle
46 , ACE_Message_Block
*mb
47 , JAWS_Event_Completer
*completer
51 JAWS_EC_AH_Adapter
*jecaha
;
52 jecaha
= JAWS_EC_AH_Adapter::make (completer
);
54 ACE_Asynch_Read_Stream asynch_read_stream
;
57 || asynch_read_stream
.open (*jecaha
, handle
) == -1
58 || asynch_read_stream
.read (*mb
, mb
->space (), act
) == -1)
61 JAWS_Event_Result
io_result ( 0
62 , JAWS_Event_Result::JE_ERROR
63 , JAWS_Event_Result::JE_RECV_FAIL
67 completer
->output_complete (io_result
, act
);
73 JAWS_Asynch_IO::transmit ( ACE_HANDLE handle
75 , JAWS_Event_Completer
*completer
77 , ACE_Message_Block
*header
78 , ACE_Message_Block
*trailer
81 JAWS_EC_AH_Adapter
*jecaha
;
82 jecaha
= JAWS_EC_AH_Adapter::make (completer
);
84 ACE_Asynch_Transmit_File::Header_And_Trailer
*header_and_trailer
= 0;
86 new ACE_Asynch_Transmit_File::Header_And_Trailer ( header
92 ACE_Asynch_Transmit_File asynch_transmit_file
;
94 if (source
== ACE_INVALID_HANDLE
96 || header_and_trailer
== 0
97 || asynch_transmit_file
.open (*jecaha
, handle
) == -1
98 || asynch_transmit_file
.transmit_file ( source
109 delete header_and_trailer
;
110 JAWS_Event_Result
io_result ( 0
111 , JAWS_Event_Result::JE_ERROR
112 , JAWS_Event_Result::JE_TRANSMIT_FAIL
116 completer
->output_complete (io_result
, act
);
123 JAWS_EC_AH_Adapter::make (JAWS_Event_Completer
*completer
)
125 return new JAWS_EC_AH_Adapter (completer
);
130 ::handle_read_stream (const ACE_Asynch_Read_Stream::Result
&result
)
132 JAWS_Event_Result io_result
;
134 io_result
= this->make_io_result ( result
135 , JAWS_Event_Result::JE_RECV_OK
136 , JAWS_Event_Result::JE_RECV_FAIL
138 // More useful diagnostics not implemented yet.
140 void *act
= const_cast<void *> (result
.act ());
142 this->completer_
->input_complete (io_result
, act
);
148 ::handle_write_stream (const ACE_Asynch_Write_Stream::Result
&result
)
150 JAWS_Event_Result io_result
;
152 io_result
= this->make_io_result ( result
153 , JAWS_Event_Result::JE_SEND_OK
154 , JAWS_Event_Result::JE_SEND_FAIL
156 // More useful diagnostics not implemented yet.
158 void *act
= const_cast<void *> (result
.act ());
160 this->completer_
->output_complete (io_result
, act
);
166 ::handle_transmit_file (const ACE_Asynch_Transmit_File::Result
&result
)
168 JAWS_Event_Result io_result
;
170 io_result
= this->make_io_result ( result
171 , JAWS_Event_Result::JE_TRANSMIT_OK
172 , JAWS_Event_Result::JE_TRANSMIT_FAIL
174 // More useful diagnostics not implemented yet.
175 // Watch out for files not opened in overlapped IO mode.
177 void *act
= const_cast<void *> (result
.act ());
179 this->completer_
->output_complete (io_result
, act
);
185 ::make_io_result ( const ACE_Asynch_Result
&result
186 , JAWS_Event_Result::JE_REASON reason_ok
187 , JAWS_Event_Result::JE_REASON reason_fail
190 size_t bytes
= result
.bytes_transferred ();
192 JAWS_Event_Result::JE_STATUS status
;
193 JAWS_Event_Result::JE_REASON reason
;
195 if (result
.success ())
197 status
= JAWS_Event_Result::JE_OK
;
202 status
= JAWS_Event_Result::JE_ERROR
;
203 reason
= reason_fail
;
206 JAWS_Event_Result
io_result (bytes
, status
, reason
);
211 #else /* EMULATE AIO WITH REACTOR */
213 #include "jaws3/Reactive_IO.h"
216 JAWS_Asynch_IO::send ( ACE_HANDLE handle
217 , ACE_Message_Block
*mb
218 , JAWS_Event_Completer
*completer
222 JAWS_Reactive_IO::instance ()->send (handle
, mb
, completer
, act
);
227 JAWS_Asynch_IO::recv ( ACE_HANDLE handle
228 , ACE_Message_Block
*mb
229 , JAWS_Event_Completer
*completer
233 JAWS_Reactive_IO::instance ()->recv (handle
, mb
, completer
, act
);
238 JAWS_Asynch_IO::transmit ( ACE_HANDLE handle
240 , JAWS_Event_Completer
*completer
242 , ACE_Message_Block
*header
243 , ACE_Message_Block
*trailer
246 JAWS_Reactive_IO::instance ()->transmit ( handle
255 #endif /* ACE_HAS_AIO_CALLS || ACE_HAS_WIN32_OVERLAPPED_IO */
257 // For now, we will simulate timed Asynch IO with timed Reactive IO.
258 // In the future, we will implement the timed Asynch IO with timers
259 // and Asynch IO cancelation.
261 #include "jaws3/Reactive_IO.h"
264 JAWS_Asynch_IO::send ( ACE_HANDLE handle
265 , ACE_Message_Block
*mb
266 , JAWS_Event_Completer
*completer
267 , const ACE_Time_Value
&tv
271 JAWS_Reactive_IO::instance ()->send (handle
, mb
, completer
, tv
, act
);
276 JAWS_Asynch_IO::recv ( ACE_HANDLE handle
277 , ACE_Message_Block
*mb
278 , JAWS_Event_Completer
*completer
279 , const ACE_Time_Value
&tv
283 JAWS_Reactive_IO::instance ()->recv (handle
, mb
, completer
, tv
, act
);
288 JAWS_Asynch_IO::transmit ( ACE_HANDLE handle
290 , JAWS_Event_Completer
*completer
291 , const ACE_Time_Value
&tv
293 , ACE_Message_Block
*header
294 , ACE_Message_Block
*trailer
297 JAWS_Reactive_IO::instance ()->transmit ( handle