📄 io.cpp
字号:
void
JAWS_Synch_IO::send_confirmation_message (JAWS_IO_Handler *ioh,
const char *buffer,
unsigned int length)
{
this->send_message (ioh, buffer, length);
ioh->confirmation_message_complete ();
}
void
JAWS_Synch_IO::send_error_message (JAWS_IO_Handler *ioh,
const char *buffer,
unsigned int length)
{
this->send_message (ioh, buffer, length);
ioh->error_message_complete ();
}
void
JAWS_Synch_IO::send_message (JAWS_IO_Handler *ioh,
const char *buffer,
unsigned int length)
{
ACE_SOCK_Stream stream;
stream.set_handle (ioh->handle ());
stream.send_n (buffer, length);
}
// This only works on asynch I/O-capable systems.
#if defined (ACE_HAS_WIN32_OVERLAPPED_IO) || defined (ACE_HAS_AIO_CALLS)
JAWS_Asynch_IO::JAWS_Asynch_IO (void)
{
}
JAWS_Asynch_IO::~JAWS_Asynch_IO (void)
{
if (this->handle_ != ACE_INVALID_HANDLE)
ACE_OS::closesocket (this->handle_);
}
void
JAWS_Asynch_IO::accept (JAWS_IO_Handler *ioh,
ACE_Message_Block *,
unsigned int)
{
JAWS_TRACE ("JAWS_Asynch_IO::accept");
ioh->idle ();
JAWS_Data_Block *db = ioh->message_block ();
//ACE_HANDLE listen_handle = db->policy ()->acceptor ()->get_handle ();
//JAWS_Asynch_IO_Handler *aioh =
// dynamic_cast<JAWS_Asynch_IO_Handler *> (ioh);
size_t bytes_to_read = JAWS_Data_Block::JAWS_DATA_BLOCK_SIZE;
if (db->policy ()->acceptor ()->accept (bytes_to_read, ioh) == -1)
ioh->accept_error ();
}
void
JAWS_Asynch_IO::read (JAWS_IO_Handler *ioh,
ACE_Message_Block* mb,
unsigned int size)
{
JAWS_TRACE ("JAWS_Asynch_IO::read");
ioh->idle ();
JAWS_Asynch_IO_Handler *aioh =
dynamic_cast<JAWS_Asynch_IO_Handler *> (ioh);
ACE_Asynch_Read_Stream ar;
if (ar.open (*(aioh->handler ()), aioh->handle ()) == -1
|| ar.read (*mb, size) == -1)
aioh->read_error ();
}
void
JAWS_Asynch_IO::receive_file (JAWS_IO_Handler *ioh,
const char *filename,
void *initial_data,
unsigned int initial_data_length,
unsigned int entire_length)
{
JAWS_TRACE ("JAWS_Asynch_IO::receive_file");
ioh->idle ();
JAWS_Asynch_IO_Handler *aioh =
dynamic_cast<JAWS_Asynch_IO_Handler *> (ioh);
ACE_Message_Block *mb = 0;
ACE_Filecache_Handle *handle;
ACE_NEW (handle, ACE_Filecache_Handle (filename, entire_length, ACE_NOMAP));
int result = handle->error ();
if (result == ACE_Filecache_Handle::ACE_SUCCESS)
{
ACE_OS::memcpy (handle->address (),
initial_data,
initial_data_length);
int bytes_to_read = entire_length - initial_data_length;
ACE_NEW (mb, ACE_Message_Block ((char *)handle->address ()
+ initial_data_length, bytes_to_read));
if (mb == 0)
{
errno = ENOMEM;
result = -1;
}
else
{
ACE_Asynch_Read_Stream ar;
if (ar.open (*(aioh->handler ()), aioh->handle ()) == -1
|| ar.read (*mb, mb->size () - mb->length (), handle) == -1)
result = -1;
}
}
if (result != ACE_Filecache_Handle::ACE_SUCCESS)
{
this->handler_->receive_file_error (result);
delete mb;
delete handle;
}
}
void
JAWS_Asynch_IO::transmit_file (JAWS_IO_Handler *ioh,
ACE_HANDLE handle,
const char *header,
unsigned int header_size,
const char *trailer,
unsigned int trailer_size)
{
JAWS_TRACE ("JAWS_Asynch_IO::transmit_file");
ioh->idle ();
JAWS_Asynch_IO_Handler *aioh =
dynamic_cast<JAWS_Asynch_IO_Handler *> (ioh);
ACE_Asynch_Transmit_File::Header_And_Trailer *header_and_trailer = 0;
int result = 0;
if (handle != ACE_INVALID_HANDLE)
{
ACE_Message_Block hdr_mb (header, header_size);
ACE_Message_Block trl_mb (trailer, trailer_size);
header_and_trailer =
new ACE_Asynch_Transmit_File::Header_And_Trailer (hdr_mb.duplicate (),
header_size,
trl_mb.duplicate (),
trailer_size);
ACE_Asynch_Transmit_File tf;
if (tf.open (*(aioh->handler ()), aioh->handle ()) == -1
|| tf.transmit_file (handle, // file handle
header_and_trailer, // header and trailer data
0, // bytes_to_write
0, // offset
0, // offset_high
0, // bytes_per_send
0, // flags
0 // act
) == -1)
result = -1;
}
if (result != 0)
{
ioh->transmit_file_error (result);
delete header_and_trailer;
}
}
void
JAWS_Asynch_IO::transmit_file (JAWS_IO_Handler *ioh,
const char *filename,
const char *header,
unsigned int header_size,
const char *trailer,
unsigned int trailer_size)
{
int result = 0;
JAWS_TRACE ("JAWS_Asynch_IO::transmit_file");
ioh->idle ();
JAWS_Asynch_IO_Handler *aioh =
dynamic_cast<JAWS_Asynch_IO_Handler *> (ioh);
ACE_Asynch_Transmit_File::Header_And_Trailer *header_and_trailer = 0;
JAWS_Cached_FILE *cf = new JAWS_Cached_FILE (filename);
if (cf->file ()->get_handle () != ACE_INVALID_HANDLE)
{
ACE_Message_Block hdr_mb (header, header_size);
ACE_Message_Block trl_mb (trailer, trailer_size);
header_and_trailer = new ACE_Asynch_Transmit_File::Header_And_Trailer
(hdr_mb.duplicate (), header_size, trl_mb.duplicate (), trailer_size);
ACE_Asynch_Transmit_File tf;
if (tf.open (*(aioh->handler ()), aioh->handle ()) == -1
|| tf.transmit_file (cf->file ()->get_handle (), // file handle
header_and_trailer, // header and trailer data
0, // bytes_to_write
0, // offset
0, // offset_high
0, // bytes_per_send
0, // flags
cf // act
) == -1)
result = -1;
}
if (result != 0)
{
ioh->transmit_file_error (result);
delete header_and_trailer;
delete cf;
}
}
void
JAWS_Asynch_IO::send_confirmation_message (JAWS_IO_Handler *ioh,
const char *buffer,
unsigned int length)
{
this->send_message (ioh, buffer, length, CONFIRMATION);
}
void
JAWS_Asynch_IO::send_error_message (JAWS_IO_Handler *ioh,
const char *buffer,
unsigned int length)
{
this->send_message (ioh, buffer, length, ERROR_MESSAGE);
}
void
JAWS_Asynch_IO::send_message (JAWS_IO_Handler *ioh,
const char *buffer,
unsigned int length,
long act)
{
ioh->idle ();
JAWS_Asynch_IO_Handler *aioh =
dynamic_cast<JAWS_Asynch_IO_Handler *> (ioh);
ACE_Message_Block *mb;
ACE_NEW (mb, ACE_Message_Block (buffer, length));
if (mb == 0)
{
this->handler_->error_message_complete ();
return;
}
ACE_Asynch_Write_Stream aw;
if (aw.open (*(aioh->handler ()), aioh->handle ()) == -1
|| aw.write (*mb, length, (void *) static_cast<intptr_t> (act)) == -1)
{
mb->release ();
if (act == CONFIRMATION)
ioh->confirmation_message_complete ();
else
ioh->error_message_complete ();
}
}
void
JAWS_Asynch2_IO::accept (JAWS_IO_Handler *,
ACE_Message_Block *,
unsigned int)
{
}
#endif /* ACE_HAS_WIN32_OVERLAPPED_IO || ACE_HAS_AIO_CALLS */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -