StreamWriter.cpp
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include "config.h"
00023
00024 #include "StreamWriter.hpp"
00025 #include "IOManager.hpp"
00026 #include <ace/Asynch_IO.h>
00027 #include <ace/Message_Block.h>
00028 #include <Exception.hpp>
00029 #include <iostream>
00030 #include <cassert>
00031 #include <errno.h>
00032
00033 using namespace mermaid::support::io;
00034
00035 using mermaid::support::errorhandling::Exception;
00036
00037 StreamWriter::~StreamWriter()
00038 {
00039 }
00040
00041 StreamWriter::StreamWriter (Device* device) : device_ (device)
00042 {
00043 }
00044
00045 void StreamWriter::onWrite (size_t bytesWritten, size_t requestedBytes, const char* data, bool success, shared_ptr<StreamOperationHandlerMethodBase> streamOperationHandlerWrite)
00046 {
00047 device_->callWriteHandler (bytesWritten, requestedBytes, data, success, streamOperationHandlerWrite);
00048 }
00049
00050 int StreamWriter::getFileDescriptor() const
00051 {
00052 return device_->getFileDescriptor();
00053 }
00054
00055 void StreamWriter::open (ACE_Handler* streamHandler, ACE_Proactor* proactor)
00056 {
00057 int ret = writeStream_.open (*streamHandler, device_->getFileDescriptor(), 0, proactor);
00058 if (ret != 0)
00059 throw Exception ("StreamWriter::open(): Error opening ACE_Asynch_Write_Stream.");
00060 }
00061
00062 void StreamWriter::doWrite (size_t bytesToWrite, const char* data, shared_ptr<StreamOperationHandlerMethodBase> streamOperationHandlerWrite)
00063 {
00064 ACE_Message_Block* mb = new ACE_Message_Block (bytesToWrite);
00065 mb->copy (data, bytesToWrite);
00066
00067
00068 delete[] data;
00069
00070 int ret = writeStream_.write (*mb, mb->length(), static_cast<void*> (new shared_ptr<StreamOperationHandlerMethodBase> (streamOperationHandlerWrite)));
00071
00072 if (ret != 0) {
00073 std::cerr << "StreamWriter::doWrite: Error writing. errno: " << errno << std::endl;
00074 while (ret == -1)
00075 ret = writeStream_.write (*mb, mb->length());
00076
00077 if (ret != 0)
00078 throw Exception ("StreamWriter::doWrite(): Error performing an asynch write operation.");
00079 }
00080 }
00081