diff options
Diffstat (limited to 'ACE/apps/JAWS3/small/SS_State_WRITE.cpp')
-rw-r--r-- | ACE/apps/JAWS3/small/SS_State_WRITE.cpp | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/ACE/apps/JAWS3/small/SS_State_WRITE.cpp b/ACE/apps/JAWS3/small/SS_State_WRITE.cpp new file mode 100644 index 00000000000..2acb1f1b047 --- /dev/null +++ b/ACE/apps/JAWS3/small/SS_State_WRITE.cpp @@ -0,0 +1,78 @@ +// $Id$ + +#include "ace/OS.h" +#include "ace/FILE_Connector.h" +#include "ace/FILE_Addr.h" +#include "ace/FILE_IO.h" + +#include "jaws3/IO.h" + +#include "SS_State_WRITE.h" +#include "SS_State_ERROR.h" +#include "SS_State_DONE.h" +#include "SS_Data.h" + +int +TeraSS_State_WRITE::service (JAWS_Event_Completer *ec, void *data) +{ + JAWS_Event_Result fake_bad_result (0, JAWS_Event_Result::JE_ERROR); + + // Retrieve context + TeraSS_Data *tdata = (TeraSS_Data *) data; + + ACE_FILE_Addr file_addr (tdata->mb ().rd_ptr ()); + ACE_FILE_Connector file_connector; + + if (file_connector.connect ( tdata->file_io () + , file_addr + , 0 + , ACE_Addr::sap_any + , 0 + , O_RDONLY + ) < 0) + { + ec->output_complete (fake_bad_result, & tdata->file_io ()); + return 0; + } + + + JAWS_IO::instance ()->transmit ( tdata->peer ().get_handle () + , tdata->file_io ().get_handle () + , ec + , & tdata->file_io () + ); + + return 0; +} + +JAWS_Protocol_State * +TeraSS_State_WRITE::transition ( const JAWS_Event_Result &result + , void *data + , void *act + ) +{ + // Clean up FILE. + + ((ACE_FILE_IO *) act)->close (); + + // In the WRITE state, move to DONE state if success, ERROR if error. + + JAWS_Protocol_State *next_state = 0; + + switch (result.status ()) + { + case JAWS_Event_Result::JE_OK: + next_state = TeraSS_State_DONE::instance (); + break; + case JAWS_Event_Result::JE_ERROR: + next_state = TeraSS_State_ERROR::instance (); + break; + default: + // Just bail unceremoniously. + next_state = TeraSS_State_DONE::instance (); + break; + } + + return next_state; +} + |