diff options
Diffstat (limited to 'ACE/apps/JAWS3/jaws3/Synch_IO.cpp')
-rw-r--r-- | ACE/apps/JAWS3/jaws3/Synch_IO.cpp | 265 |
1 files changed, 265 insertions, 0 deletions
diff --git a/ACE/apps/JAWS3/jaws3/Synch_IO.cpp b/ACE/apps/JAWS3/jaws3/Synch_IO.cpp new file mode 100644 index 00000000000..1f66363d8ea --- /dev/null +++ b/ACE/apps/JAWS3/jaws3/Synch_IO.cpp @@ -0,0 +1,265 @@ +// $Id$ + +#include "ace/ACE.h" + +#ifndef JAWS_BUILD_DLL +#define JAWS_BUILD_DLL +#endif + +#include "jaws3/Jaws_IO.h" +#include "jaws3/Synch_IO.h" +#include "jaws3/Event_Completer.h" + +static JAWS_Event_Result +JAWS_synch_send ( ACE_HANDLE handle + , ACE_Message_Block *mb + , const ACE_Time_Value *tv = 0 + ) +{ + JAWS_Event_Result io_result; + + ssize_t result = ACE::send_n (handle, mb->rd_ptr (), mb->length (), tv); + if (result < 0) + { + if (errno == ETIME) + { + JAWS_Event_Result tmp_io_result ( 0 + , JAWS_Event_Result::JE_ERROR + , JAWS_Event_Result::JE_SEND_TIMEOUT + ); + io_result = tmp_io_result; + } + else + { + JAWS_Event_Result tmp_io_result ( 0 + , JAWS_Event_Result::JE_ERROR + , JAWS_Event_Result::JE_SEND_FAIL + ); + io_result = tmp_io_result; + } + } + else if ((size_t) result < mb->length ()) + { + if (result > 0) + mb->rd_ptr (result); + + JAWS_Event_Result tmp_io_result ( result + , JAWS_Event_Result::JE_ERROR + , JAWS_Event_Result::JE_SEND_SHORT + ); + io_result = tmp_io_result; + } + else + { + if (result > 0) + mb->rd_ptr (result); + + JAWS_Event_Result tmp_io_result ( result + , JAWS_Event_Result::JE_OK + , JAWS_Event_Result::JE_SEND_OK + ); + io_result = tmp_io_result; + } + + return io_result; +} + +void +JAWS_Synch_IO::send ( ACE_HANDLE handle + , ACE_Message_Block *mb + , JAWS_Event_Completer *completer + , const ACE_Time_Value &tv + , void *act + ) +{ + JAWS_Event_Result io_result; + const ACE_Time_Value *tvp = 0; + + if (ACE_Time_Value::zero < tv) + tvp = &tv; + + io_result = JAWS_synch_send (handle, mb, tvp); + + if (completer) + completer->output_complete (io_result, act); +} + + +void +JAWS_Synch_IO::send ( ACE_HANDLE handle + , ACE_Message_Block *mb + , JAWS_Event_Completer *completer + , void *act + ) +{ + this->send (handle, mb, completer, ACE_Time_Value::zero, act); +} + + +void +JAWS_Synch_IO::recv ( ACE_HANDLE handle + , ACE_Message_Block *mb + , JAWS_Event_Completer *completer + , const ACE_Time_Value &tv + , void *act + ) +{ + JAWS_Event_Result io_result; + const ACE_Time_Value *tvp = 0; + + if (ACE_Time_Value::zero < tv) + tvp = &tv; + + ssize_t result = ACE::recv (handle, mb->wr_ptr (), mb->space (), tvp); + if (result < 0) + { + JAWS_Event_Result tmp_io_result ( 0 + , JAWS_Event_Result::JE_ERROR + , JAWS_Event_Result::JE_RECV_FAIL + ); + io_result = tmp_io_result; + } + else + { + if (result > 0) + mb->wr_ptr (result); + + JAWS_Event_Result tmp_io_result ( result + , JAWS_Event_Result::JE_OK + , JAWS_Event_Result::JE_RECV_OK + ); + io_result = tmp_io_result; + } + + if (completer) + completer->input_complete (io_result, act); +} + + +void +JAWS_Synch_IO::recv ( ACE_HANDLE handle + , ACE_Message_Block *mb + , JAWS_Event_Completer *completer + , void *act + ) +{ + this->recv (handle, mb, completer, ACE_Time_Value::zero, act); +} + + +void +JAWS_Synch_IO::transmit ( ACE_HANDLE handle + , ACE_HANDLE source + , JAWS_Event_Completer *completer + , const ACE_Time_Value &tv + , void *act + , ACE_Message_Block *header + , ACE_Message_Block *trailer + ) +{ + JAWS_Event_Result io_result; + const ACE_Time_Value *tvp = 0; + + if (ACE_Time_Value::zero < tv) + tvp = &tv; + + size_t bytes = 0; + + if (header) + { + io_result = JAWS_synch_send (handle, header, tvp); + bytes += io_result.bytes (); + if (io_result.status () != JAWS_Event_Result::JE_OK) + { + if (completer) + completer->input_complete (io_result, act); + + return; + } + } + + ACE_Message_Block buf (8 * 1024); + ssize_t len = 0; + while ((len = ACE::recv (source, buf.wr_ptr (), buf.space (), tvp)) >= 0) + { + if (len == 0) + break; + + buf.wr_ptr (len); + io_result = JAWS_synch_send (handle, & buf); + bytes += io_result.bytes (); + if (io_result.status () != JAWS_Event_Result::JE_OK) + { + JAWS_Event_Result tmp_io_result ( bytes + , JAWS_Event_Result::JE_ERROR + , JAWS_Event_Result::JE_SEND_SHORT + ); + + if (completer) + completer->input_complete (tmp_io_result, act); + + return; + } + + buf.crunch (); + } + + if (trailer) + { + io_result = JAWS_synch_send (handle, trailer, tvp); + bytes += io_result.bytes (); + if (io_result.status () != JAWS_Event_Result::JE_OK) + { + JAWS_Event_Result tmp_io_result ( bytes + , JAWS_Event_Result::JE_ERROR + , JAWS_Event_Result::JE_SEND_SHORT + ); + + if (completer) + completer->input_complete (tmp_io_result, act); + + return; + } + } + + if (len == 0) + { + JAWS_Event_Result tmp_io_result ( bytes + , JAWS_Event_Result::JE_OK + , JAWS_Event_Result::JE_SEND_OK + ); + io_result = tmp_io_result; + } + else + { + JAWS_Event_Result tmp_io_result ( bytes + , JAWS_Event_Result::JE_ERROR + , JAWS_Event_Result::JE_SEND_SHORT + ); + io_result = tmp_io_result; + } + + if (completer) + completer->input_complete (io_result, act); +} + + +void +JAWS_Synch_IO::transmit ( ACE_HANDLE handle + , ACE_HANDLE source + , JAWS_Event_Completer *completer + , void *act + , ACE_Message_Block *header + , ACE_Message_Block *trailer + ) +{ + this->transmit ( handle + , source + , completer + , ACE_Time_Value::zero + , act + , header + , trailer + ); +} + |