Inheritance diagram for ACE_POSIX_Asynch_Transmit_Handler:


Public Member Functions | |
| ACE_POSIX_Asynch_Transmit_Handler (ACE_POSIX_Proactor *posix_proactor, ACE_POSIX_Asynch_Transmit_File_Result *result) | |
| virtual | ~ACE_POSIX_Asynch_Transmit_Handler (void) |
| Destructor. | |
| int | transmit (void) |
Protected Types | |
| enum | ACT { HEADER_ACT = 1, DATA_ACT = 2, TRAILER_ACT = 3 } |
Protected Member Functions | |
| virtual void | handle_write_stream (const ACE_Asynch_Write_Stream::Result &result) |
| This is called when asynchronous writes from the socket complete. | |
| virtual void | handle_read_file (const ACE_Asynch_Read_File::Result &result) |
| This is called when asynchronous reads from the file complete. | |
| int | initiate_read_file (void) |
| Issue asynch read from the file. | |
Protected Attributes | |
| ACE_POSIX_Asynch_Transmit_File_Result * | result_ |
| ACE_Message_Block * | mb_ |
| Message bloack used to do the transmission. | |
| ACT | header_act_ |
| ACT to transmit header. | |
| ACT | data_act_ |
| ACT to transmit data. | |
| ACT | trailer_act_ |
| ACT to transmit trailer. | |
| size_t | file_offset_ |
| Current offset of the file being transmitted. | |
| size_t | file_size_ |
| Total size of the file. | |
| size_t | bytes_transferred_ |
| Number of bytes transferred on the stream. | |
| ACE_POSIX_Asynch_Read_File | rf_ |
| To read from the file to be transmitted. | |
| ACE_POSIX_Asynch_Write_Stream | ws_ |
| Write stream to write the header, trailer and the data. | |
This is a helper class for implementing in Unix systems.
Definition at line 1734 of file POSIX_Asynch_IO.cpp.
|
|
Definition at line 1759 of file POSIX_Asynch_IO.cpp. Referenced by handle_write_stream().
01760 {
01761 HEADER_ACT = 1,
01762 DATA_ACT = 2,
01763 TRAILER_ACT = 3
01764 };
|
|
||||||||||||
|
Constructor. Result pointer will have all the information to do the file transmission (socket, file, application handler, bytes to write). Definition at line 1804 of file POSIX_Asynch_IO.cpp. References ACE_NEW, and ACE_OS::filesize().
01806 : result_ (result), 01807 mb_ (0), 01808 header_act_ (this->HEADER_ACT), 01809 data_act_ (this->DATA_ACT), 01810 trailer_act_ (this->TRAILER_ACT), 01811 file_offset_ (result->offset ()), 01812 file_size_ (0), 01813 bytes_transferred_ (0), 01814 rf_ (posix_proactor), 01815 ws_ (posix_proactor) 01816 { 01817 // Allocate memory for the message block. 01818 ACE_NEW (this->mb_, 01819 ACE_Message_Block (this->result_->bytes_per_send () 01820 + 1)); 01821 // Init the file size. 01822 file_size_ = ACE_OS::filesize (this->result_->file ()); 01823 } |
|
|
Destructor.
Definition at line 1826 of file POSIX_Asynch_IO.cpp. References mb_, ACE_Message_Block::release(), result_, and ~ACE_POSIX_Asynch_Transmit_Handler(). Referenced by ~ACE_POSIX_Asynch_Transmit_Handler().
|
|
|
This is called when asynchronous reads from the file complete.
Reimplemented from ACE_Handler. Definition at line 1973 of file POSIX_Asynch_IO.cpp. References ACE_ERROR, ACE_SEH_FINALLY, ACE_SEH_TRY, ACE_Asynch_Result::bytes_transferred(), ACE_POSIX_Asynch_Transmit_File_Result::complete(), data_act_, file_offset_, handle_read_file(), LM_ERROR, ACE_Asynch_Read_Stream::Result::message_block(), ACE_POSIX_Asynch_Result::priority(), result_, ACE_POSIX_Asynch_Result::signal_number(), ACE_Asynch_Result::success(), ACE_POSIX_Asynch_Write_Stream::write(), and ws_. Referenced by handle_read_file().
01974 {
01975 // Failure.
01976 if (result.success () == 0)
01977 {
01978 //
01979 ACE_SEH_TRY
01980 {
01981 this->result_->complete (this->bytes_transferred_,
01982 0, // Failure.
01983 0, // @@ Completion key.
01984 errno); // Error no.
01985 }
01986 ACE_SEH_FINALLY
01987 {
01988 delete this;
01989 }
01990 return;
01991 }
01992
01993 // Read successful.
01994 if (result.bytes_transferred () == 0)
01995 return;
01996
01997 // Increment offset.
01998 this->file_offset_ += result.bytes_transferred ();
01999
02000 // Write data to network.
02001 if (this->ws_.write (result.message_block (),
02002 result.bytes_transferred (),
02003 (void *)&this->data_act_,
02004 this->result_->priority (),
02005 this->result_->signal_number ()) == -1)
02006 {
02007 // @@ Handle this error.
02008 ACE_ERROR ((LM_ERROR,
02009 "Error:ACE_Asynch_Transmit_File : write to the stream failed\n"));
02010 return;
02011 }
02012 }
|
|
|
This is called when asynchronous writes from the socket complete.
Reimplemented from ACE_Handler. Definition at line 1874 of file POSIX_Asynch_IO.cpp. References ACE_DEBUG, ACE_ERROR, ACE_SEH_FINALLY, ACE_SEH_TRY, ACT, ACE_Asynch_Result::act(), ACE_Asynch_Write_Stream::Result::bytes_to_write(), ACE_Asynch_Result::bytes_transferred(), bytes_transferred_, ACE_POSIX_Asynch_Transmit_File_Result::complete(), DATA_ACT, ACE_Message_Block::duplicate(), handle_write_stream(), HEADER_ACT, initiate_read_file(), LM_DEBUG, LM_ERROR, ACE_Asynch_Write_Stream::Result::message_block(), ACE_POSIX_Asynch_Result::priority(), result_, ACE_POSIX_Asynch_Result::signal_number(), ACE_Asynch_Result::success(), TRAILER_ACT, ACE_POSIX_Asynch_Write_Stream::write(), and ws_. Referenced by handle_write_stream().
01875 {
01876 // Update bytes transferred so far.
01877 this->bytes_transferred_ += result.bytes_transferred ();
01878
01879 // Check the success parameter.
01880 if (result.success () == 0)
01881 {
01882 // Failure.
01883
01884 ACE_ERROR ((LM_ERROR,
01885 "Asynch_Transmit_File failed.\n"));
01886
01887 ACE_SEH_TRY
01888 {
01889 this->result_->complete (this->bytes_transferred_,
01890 0, // Failure.
01891 0, // @@ Completion key.
01892 0); // @@ Error no.
01893 }
01894 ACE_SEH_FINALLY
01895 {
01896 // This is crucial to prevent memory leaks. This deletes
01897 // the result pointer also.
01898 delete this;
01899 }
01900 }
01901
01902 // Write stream successful.
01903
01904 // Partial write to socket.
01905 size_t unsent_data = result.bytes_to_write () - result.bytes_transferred ();
01906 if (unsent_data != 0)
01907 {
01908 ACE_DEBUG ((LM_DEBUG,
01909 "%N:%l:Partial write to socket: Asynch_write called again\n"));
01910
01911 // Duplicate the message block and retry remaining data
01912 if (this->ws_.write (*result.message_block ().duplicate (),
01913 unsent_data,
01914 result.act (),
01915 this->result_->priority (),
01916 this->result_->signal_number ()) == -1)
01917 {
01918 // @@ Handle this error.
01919 ACE_ERROR ((LM_ERROR,
01920 "Asynch_Transmit_Handler:write_stream failed\n"));
01921 return;
01922 }
01923
01924 // @@ Handling *partial write* to a socket. Let us not continue
01925 // further before this write finishes. Because proceeding with
01926 // another read and then write might change the order of the
01927 // file transmission, because partial write to the stream is
01928 // always possible.
01929 return;
01930 }
01931
01932 // Not a partial write. A full write.
01933
01934 // Check ACT to see what was sent.
01935 ACT act = * (ACT *) result.act ();
01936
01937 switch (act)
01938 {
01939 case TRAILER_ACT:
01940 // If it is the "trailer" that is just sent, then transmit file
01941 // is complete.
01942 // Call the application handler.
01943 ACE_SEH_TRY
01944 {
01945 this->result_->complete (this->bytes_transferred_,
01946 1, // @@ Success.
01947 0, // @@ Completion key.
01948 0); // @@ Errno.
01949 }
01950 ACE_SEH_FINALLY
01951 {
01952 delete this;
01953 }
01954 break;
01955
01956 case HEADER_ACT:
01957 case DATA_ACT:
01958 // If header/data was sent, initiate the file data transmission.
01959 if (this->initiate_read_file () == -1)
01960 // @@ Handle this error.
01961 ACE_ERROR ((LM_ERROR,
01962 "Error:Asynch_Transmit_Handler:read_file couldnt be initiated\n"));
01963 break;
01964
01965 default:
01966 // @@ Handle this error.
01967 ACE_ERROR ((LM_ERROR,
01968 "Error:ACE_Asynch_Transmit_Handler::handle_write_stream::Unexpected act\n"));
01969 }
01970 }
|
|
|
Issue asynch read from the file.
Definition at line 2015 of file POSIX_Asynch_IO.cpp. References ACE_ERROR_RETURN, file_offset_, file_size_, ACE_POSIX_Asynch_Transmit_File_Result::header_and_trailer(), initiate_read_file(), LM_ERROR, mb_, ACE_POSIX_Asynch_Result::priority(), ACE_Message_Block::rd_ptr(), ACE_POSIX_Asynch_Read_File::read(), result_, rf_, ACE_POSIX_Asynch_Result::signal_number(), trailer_act_, ACE_Asynch_Transmit_File::Header_And_Trailer::trailer_bytes(), ACE_Message_Block::wr_ptr(), ACE_POSIX_Asynch_Write_Stream::write(), and ws_. Referenced by handle_write_stream(), and initiate_read_file().
02016 {
02017 // Is there something to read.
02018 if (this->file_offset_ >= this->file_size_)
02019 {
02020 // File is sent. Send the trailer.
02021 if (this->ws_.write (*this->result_->header_and_trailer ()->trailer (),
02022 this->result_->header_and_trailer ()->trailer_bytes (),
02023 (void *)&this->trailer_act_,
02024 this->result_->priority (),
02025 this->result_->signal_number ()) == -1)
02026 ACE_ERROR_RETURN ((LM_ERROR,
02027 "Error:Asynch_Transmit_Handler:write_stream writing trailer failed\n"),
02028 -1);
02029 return 0;
02030 }
02031 else
02032 {
02033 // @@ Is this right??
02034 // Previous reads and writes are over. For the new read, adjust
02035 // the wr_ptr and the rd_ptr to the beginning.
02036 this->mb_->rd_ptr (this->mb_->base ());
02037 this->mb_->wr_ptr (this->mb_->base ());
02038
02039 // Inititiate an asynchronous read from the file.
02040 if (this->rf_.read (*this->mb_,
02041 this->mb_->size () - 1,
02042 this->file_offset_,
02043 0, // @@ offset_high !!! if aiocb64 is used.
02044 0, // Act
02045 this->result_->priority (),
02046 this->result_->signal_number ()) == -1)
02047 ACE_ERROR_RETURN ((LM_ERROR,
02048 "Error:Asynch_Transmit_Handler::read from file failed\n"),
02049 -1);
02050 return 0;
02051 }
02052 }
|
|
|
Do the transmission. All the info to do the transmission is in the member. Definition at line 1837 of file POSIX_Asynch_IO.cpp. References ACE_ERROR_RETURN, ACE_POSIX_Asynch_Transmit_File_Result::file(), header_act_, ACE_POSIX_Asynch_Transmit_File_Result::header_and_trailer(), ACE_Asynch_Transmit_File::Header_And_Trailer::header_bytes(), LM_ERROR, ACE_POSIX_Asynch_Operation::open(), result_, rf_, ACE_POSIX_Asynch_Transmit_File_Result::socket(), transmit(), ACE_POSIX_Asynch_Write_Stream::write(), and ws_. Referenced by transmit().
01838 {
01839 // No proactor is given for the <open>'s. Because we are using the
01840 // concrete implementations of the Asynch_Operations, and we have
01841 // already given them the specific proactor, so they wont need the
01842 // general <proactor> interface pointer.
01843
01844 // Open Asynch_Read_File.
01845 if (this->rf_.open (this->proxy (),
01846 this->result_->file (),
01847 0,
01848 0) == -1)
01849 ACE_ERROR_RETURN ((LM_ERROR,
01850 "ACE_Asynch_Transmit_Handler:read_file open failed\n"),
01851 -1);
01852
01853 // Open Asynch_Write_Stream.
01854 if (this->ws_.open (this->proxy (),
01855 this->result_->socket (),
01856 0,
01857 0) == -1)
01858 ACE_ERROR_RETURN ((LM_ERROR,
01859 "ACE_Asynch_Transmit_Handler:write_stream open failed\n"),
01860 -1);
01861
01862 // Transmit the header.
01863 if (this->ws_.write (*this->result_->header_and_trailer ()->header (),
01864 this->result_->header_and_trailer ()->header_bytes (),
01865 reinterpret_cast<void *> (&this->header_act_),
01866 0) == -1)
01867 ACE_ERROR_RETURN ((LM_ERROR,
01868 "Asynch_Transmit_Handler:transmitting header:write_stream failed\n"),
01869 -1);
01870 return 0;
01871 }
|
|
|
Number of bytes transferred on the stream.
Definition at line 1782 of file POSIX_Asynch_IO.cpp. Referenced by handle_write_stream(). |
|
|
ACT to transmit data.
Definition at line 1770 of file POSIX_Asynch_IO.cpp. Referenced by handle_read_file(). |
|
|
Current offset of the file being transmitted.
Definition at line 1776 of file POSIX_Asynch_IO.cpp. Referenced by handle_read_file(), and initiate_read_file(). |
|
|
Total size of the file.
Definition at line 1779 of file POSIX_Asynch_IO.cpp. Referenced by initiate_read_file(). |
|
|
ACT to transmit header.
Definition at line 1767 of file POSIX_Asynch_IO.cpp. Referenced by transmit(). |
|
|
Message bloack used to do the transmission.
Definition at line 1757 of file POSIX_Asynch_IO.cpp. Referenced by initiate_read_file(), and ~ACE_POSIX_Asynch_Transmit_Handler(). |
|
|
The asynch result pointer made from the initial transmit file request. Definition at line 1754 of file POSIX_Asynch_IO.cpp. Referenced by handle_read_file(), handle_write_stream(), initiate_read_file(), transmit(), and ~ACE_POSIX_Asynch_Transmit_Handler(). |
|
|
To read from the file to be transmitted.
Definition at line 1794 of file POSIX_Asynch_IO.cpp. Referenced by initiate_read_file(), and transmit(). |
|
|
ACT to transmit trailer.
Definition at line 1773 of file POSIX_Asynch_IO.cpp. Referenced by initiate_read_file(). |
|
|
Write stream to write the header, trailer and the data.
Definition at line 1797 of file POSIX_Asynch_IO.cpp. Referenced by handle_read_file(), handle_write_stream(), initiate_read_file(), and transmit(). |
1.3.6