#include <FTP_ClientRequestHandler.h>


Definition at line 48 of file FTP_ClientRequestHandler.h.
typedef Session_T<ACE_SYNCH>::connection_type ACE::FTP::ClientRequestHandler::connection_type [protected] |
Definition at line 93 of file FTP_ClientRequestHandler.h.
typedef ACE::IOS::Sock_IOStreamBase<ACE_SYNCH> ACE::FTP::ClientRequestHandler::stream_type [protected] |
Definition at line 94 of file FTP_ClientRequestHandler.h.
| ACE::FTP::ClientRequestHandler::ClientRequestHandler | ( | bool | passive_mode = true |
) |
Definition at line 105 of file FTP_ClientRequestHandler.cpp.
{
this->password_ = pw;
}
const ACE_CString ClientRequestHandler::anonymous_user_ = "anonymous";
const ACE_CString ClientRequestHandler::empty_;
ClientRequestHandler::ClientRequestHandler (bool passive_mode)
: session_ (0),
use_passive_mode_ (passive_mode),
| ACE::FTP::ClientRequestHandler::~ClientRequestHandler | ( | ) | [virtual] |
Definition at line 117 of file FTP_ClientRequestHandler.cpp.
{
| bool ACE::FTP::ClientRequestHandler::abort_transfer | ( | ) | [protected] |
Definition at line 381 of file FTP_ClientRequestHandler.cpp.
{
if (transfer_active_)
{
this->session ()->send_interrupt ();
this->process_command (Request::FTP_ABOR);
if (this->response_.status () == 426)
this->session ()->receive_response (this->response_);
stream_type* old_stream = dynamic_cast<stream_type*> (this->in_data_stream_.set_stream (0));
{
// decrease ref count to 1
const_cast<connection_type&> (old_stream->stream ()).remove_reference ();
// also removes last ref count on stream handler
delete old_stream;
}
old_stream = dynamic_cast<stream_type*> (this->out_data_stream_.set_stream (0));
{
// decrease ref count to 1
const_cast<connection_type&> (old_stream->stream ()).remove_reference ();
// also removes last ref count on stream handler
delete old_stream;
| void ACE::FTP::ClientRequestHandler::close_connection | ( | ) | [protected] |
Definition at line 246 of file FTP_ClientRequestHandler.cpp.
{
if (this->session_)
| bool ACE::FTP::ClientRequestHandler::finish_transfer | ( | ) | [protected] |
Definition at line 353 of file FTP_ClientRequestHandler.cpp.
{
if (this->set_filetype (binary))
{
return this->open_data_connection (Request::FTP_STOR, path);
}
return 0;
}
bool ClientRequestHandler::finish_transfer ()
{
if (transfer_active_)
{
stream_type* old_stream = dynamic_cast<stream_type*> (this->in_data_stream_.set_stream (0));
if (old_stream)
{
// decrease ref count to 1
const_cast<connection_type&> (old_stream->stream ()).remove_reference ();
// also removes last ref count on stream handler
delete old_stream;
}
old_stream = dynamic_cast<stream_type*> (this->out_data_stream_.set_stream (0));
{
// decrease ref count to 1
const_cast<connection_type&> (old_stream->stream ()).remove_reference ();
// also removes last ref count on stream handler
delete old_stream;
}
| bool ACE::FTP::ClientRequestHandler::get_passive_address | ( | ACE_INET_Addr & | addr | ) | [protected] |
Definition at line 570 of file FTP_ClientRequestHandler.cpp.
{
// can we use the RFC 2428 extensions?
if (this->session ()->supports_ftp_extensions ())
{
if (this->process_command (Request::FTP_EPSV) == Response::COMPLETED_OK)
{
return this->parse_ext_address (this->response_.response ()[0],
addr);
}
// flag RFC 2428 extensions as unsupported
this->session ()->set_ftp_extension_support (false);
}
| void ACE::FTP::ClientRequestHandler::handle_connection_error | ( | const URL & | url | ) | [protected, virtual] |
Reimplemented in My_FTP_RequestHandler.
Definition at line 230 of file FTP_ClientRequestHandler.cpp.
| bool ACE::FTP::ClientRequestHandler::handle_credentials | ( | const URL & | url, | |
| ACE_CString & | user, | |||
| ACE_CString & | password | |||
| ) | [protected, virtual] |
Definition at line 216 of file FTP_ClientRequestHandler.cpp.
{
this->session (dynamic_cast<SessionHolder*> (pch));
return true;
}
else
return false;
}
bool ClientRequestHandler::handle_credentials (const URL& url,
| std::istream & ACE::FTP::ClientRequestHandler::handle_get_request | ( | const URL & | url, | |
| bool | binary = true | |||
| ) | [virtual] |
Definition at line 136 of file FTP_ClientRequestHandler.cpp.
{
const URL& ftp_url = dynamic_cast<const URL&> (url);
return this->handle_get_request (ftp_url);
}
std::istream& ClientRequestHandler::handle_get_request (
const URL& ftp_url,
bool binary)
{
if (this->initialize_connection (ftp_url.get_host (),
ftp_url.get_port ()))
{
bool rc = true;
if (this->session ()->is_new_connection () ||
(!ftp_url.get_user_info ().empty () &&
ftp_url.get_user_info () != this->current_user_))
{
if (!this->session ()->is_new_connection ())
rc = this->logout ();
if (rc)
{
ACE_CString user = ftp_url.get_user_info ().empty () ?
anonymous_user_ : ftp_url.get_user_info ();
ACE_CString password = user;
rc = this->handle_credentials (ftp_url, user, password);
if (rc) rc = this->login (user, password);
}
}
if (rc) rc = this->finish_transfer ();
if (rc)
{
stream_type* data_stream =
this->start_download (ftp_url.get_path (), binary);
if (data_stream)
{
// no need to check prev stream since we just called finish_transfer
// to clean everything up
this->in_data_stream_.set_stream (data_stream);
}
else
{
rc = false;
}
}
if (!rc)
{
this->close_connection ();
this->handle_request_error(ftp_url);
}
| std::istream & ACE::FTP::ClientRequestHandler::handle_open_request | ( | const ACE::INet::URL_Base & | url | ) | [virtual] |
Definition at line 129 of file FTP_ClientRequestHandler.cpp.
{
return this->response_.is_completed_ok () ||
(this->response_.is_preliminary_ok () &&
!this->in_data_stream_.bad ());
| void ACE::FTP::ClientRequestHandler::handle_request_error | ( | const URL & | url | ) | [protected, virtual] |
Reimplemented in My_FTP_RequestHandler.
Definition at line 226 of file FTP_ClientRequestHandler.cpp.
{
Authentication authentication (url.get_host(),
| bool ACE::FTP::ClientRequestHandler::initialize_connection | ( | const ACE_CString & | host, | |
| u_short | port | |||
| ) | [protected, virtual] |
Definition at line 199 of file FTP_ClientRequestHandler.cpp.
{
this->finish_transfer ();
}
bool ClientRequestHandler::initialize_connection (const ACE_CString& host,
u_short port)
{
static const SessionFactory session_factory;
ACE::INet::ConnectionHolder* pch = 0;
if (this->connection_cache ().claim_connection (INetConnectionKey (host, port),
pch,
| bool ACE::FTP::ClientRequestHandler::is_dir | ( | const ACE_CString & | path | ) | [protected] |
Definition at line 312 of file FTP_ClientRequestHandler.cpp.
{
return (this->is_valid_path (path) &&
| bool ACE::FTP::ClientRequestHandler::is_file | ( | const ACE_CString & | path | ) | [protected] |
Definition at line 306 of file FTP_ClientRequestHandler.cpp.
{
| bool ACE::FTP::ClientRequestHandler::is_response_ok | ( | ) | const [virtual] |
Definition at line 122 of file FTP_ClientRequestHandler.cpp.
{
this->release_connection ();
| bool ACE::FTP::ClientRequestHandler::is_valid_path | ( | const ACE_CString & | path | ) | [protected] |
Definition at line 301 of file FTP_ClientRequestHandler.cpp.
{
this->process_command (Request::FTP_PASS, password);
}
| bool ACE::FTP::ClientRequestHandler::login | ( | const ACE_CString & | user, | |
| const ACE_CString & | password | |||
| ) | [protected] |
Definition at line 284 of file FTP_ClientRequestHandler.cpp.
| bool ACE::FTP::ClientRequestHandler::logout | ( | ) | [protected] |
Definition at line 264 of file FTP_ClientRequestHandler.cpp.
{
this->logout ();
this->close_connection ();
}
bool ClientRequestHandler::logout ()
{
bool rc = true;
if (this->session ()->is_connected ())
{
try
{
this->finish_transfer ();
}
catch (...)
{
| void ACE::FTP::ClientRequestHandler::on_eof | ( | void | ) | [protected, virtual] |
Reimplemented from ACE::IOS::StreamInterceptorBase< ACE_CHAR_T, TR >.
Reimplemented in My_FTP_RequestHandler.
Definition at line 194 of file FTP_ClientRequestHandler.cpp.
{
this->handle_connection_error (ftp_url);
}
| ClientRequestHandler::stream_type * ACE::FTP::ClientRequestHandler::open_data_connection | ( | const ACE_CString & | cmd, | |
| const ACE_CString & | arg | |||
| ) | [protected] |
Definition at line 428 of file FTP_ClientRequestHandler.cpp.
{
this->response_(0);
}
return this->response_.status_type ();
}
ClientRequestHandler::stream_type*
ClientRequestHandler::open_data_connection (const ACE_CString& cmd,
const ACE_CString& arg)
{
if (this->use_passive_mode_)
{
// get address for passive data connection
ACE_INET_Addr data_addr;
if (this->get_passive_address (data_addr))
{
// establish data connection
// copy sync settings from session
unsigned long f_reactor =
this->session ()->is_reactive() ? ACE_Synch_Options::USE_REACTOR : 0;
ACE_Synch_Options sync_opt (ACE_Synch_Options::USE_TIMEOUT | f_reactor,
this->session ()->timeout ());
typedef ACE_Connector<SessionHolder::session_type::connection_type,
ACE_SOCK_CONNECTOR> connector_type;
connector_type connector;
// create connection object (stream handler)
SessionHolder::session_type::connection_type* data_connection = 0;
ACE_NEW_NORETURN (data_connection,
SessionHolder::session_type::connection_type(sync_opt));
if (data_connection == 0)
{
return 0;
}
// connect to data connection address
if (connector.connect (data_connection,
data_addr,
ACE_Synch_Options (0,
this->session ()->timeout ())) == -1)
{
INET_ERROR (1, (LM_ERROR, DLINFO
ACE_TEXT ("(%d) ACE_FTP_ClientRequestHandler::open_data_connection - ")
ACE_TEXT ("failed to connect to %C:%d\n"),
ACE_OS::last_error (),
data_addr.get_host_name (),
data_addr.get_port_number ()));
// as the connection was dynamically allocated
// the connector causes it to be destroyed after
// the connection failure
return 0;
}
// enable ref counting so we can control when to destroy
data_connection->reference_counting_policy ().value (
ACE_Event_Handler::Reference_Counting_Policy::ENABLED);
// create io stream for connection
stream_type* data_stream = 0;
ACE_NEW_NORETURN (data_stream,
stream_type (data_connection));
if (data_stream)
{
if (this->process_command (cmd, arg) == Response::PRELIM_OK)
return data_stream;
delete data_stream; // decreases ref count on connection
}
// remove last ref count -> delete
data_connection->remove_reference ();
}
}
else
{
// address for active data connection
ACE_INET_Addr data_addr;
this->session ()->get_local_addr (data_addr);
data_addr.set_port_number (this->active_port_);
// copy sync settings from session
unsigned long f_reactor =
this->session ()->is_reactive() ? ACE_Synch_Options::USE_REACTOR : 0;
ACE_Synch_Options sync_opt (ACE_Synch_Options::USE_TIMEOUT | f_reactor,
this->session ()->timeout ());
typedef ACE_Oneshot_Acceptor<SessionHolder::session_type::connection_type,
ACE_SOCK_ACCEPTOR> acceptor_type;
acceptor_type acceptor;
// start data connection acceptor listening and retrieve actual listening address
if (acceptor.open (data_addr) == 0 &&
acceptor.acceptor ().get_local_addr (data_addr) == 0)
{
// send listen address to peer followed by data command to execute
if (this->send_active_address (data_addr) &&
this->process_command (cmd, arg) == Response::PRELIM_OK)
{
// create connection object (stream handler)
SessionHolder::session_type::connection_type* data_connection = 0;
ACE_NEW_NORETURN (data_connection,
SessionHolder::session_type::connection_type(sync_opt));
if (data_connection == 0)
{
return 0;
}
// accept data connection from peer
if (acceptor.accept (data_connection,
0,
ACE_Synch_Options (ACE_Synch_Options::USE_TIMEOUT,
this->session ()->timeout ())) == -1)
{
INET_ERROR (1, (LM_ERROR, DLINFO
ACE_TEXT ("(%d) ACE_FTP_ClientRequestHandler::open_data_connection - ")
ACE_TEXT ("failed to accept connection to %C:%d\n"),
ACE_OS::last_error (),
data_addr.get_host_name (),
data_addr.get_port_number ()));
// as the connection was dynamically allocated
// the acceptor causes it to be destroyed after
// the connection failure
return 0;
}
// enable ref counting so we can control when to destroy
data_connection->reference_counting_policy ().value (
ACE_Event_Handler::Reference_Counting_Policy::ENABLED);
// create io stream for connection
stream_type* data_stream = 0;
ACE_NEW_NORETURN (data_stream,
stream_type (data_connection));
if (data_stream)
{
return data_stream;
| bool ACE::FTP::ClientRequestHandler::parse_address | ( | const ACE_CString & | str, | |
| ACE_INET_Addr & | addr | |||
| ) | [protected] |
Definition at line 593 of file FTP_ClientRequestHandler.cpp.
{
return this->parse_address (this->response_.response ()[0],
addr);
}
return false;
}
bool
ClientRequestHandler::parse_address (const ACE_CString& str, ACE_INET_Addr& addr)
{
static const int eof_ = std::char_traits<char>::eof ();
ACE::IOS::CString_OStream sos_host;
u_short port_hi = 0, port_lo = 0;
ACE::IOS::CString_IStream sis (str);
sis.ignore (str.length (), '(');
int ch = sis.get ();
if (ACE_OS::ace_isdigit (ch))
{
for (int i=0; i<4 ;++i)
{
if (ch == ',')
{
sos_host.put ('.');
ch = sis.get ();
}
while (ch != eof_ && ACE_OS::ace_isdigit (ch))
{
sos_host.put (ch);
ch = sis.get ();
}
}
if (ch == ',')
{
sis >> port_hi;
ch = sis.get ();
if (ch == ',')
{
sis >> port_lo;
| bool ACE::FTP::ClientRequestHandler::parse_ext_address | ( | const ACE_CString & | str, | |
| ACE_INET_Addr & | addr | |||
| ) | [protected] |
Definition at line 636 of file FTP_ClientRequestHandler.cpp.
{
static const int eof_ = std::char_traits<char>::eof ();
ACE::IOS::CString_IStream sis (str);
sis.ignore (str.length (), '(');
int ch = sis.get ();
if (ch != eof_)
{
int delim = ch;
sis.ignore (str.length (), delim);
sis.ignore (str.length (), delim);
if (sis.peek () != eof_)
{
| Response::StatusType ACE::FTP::ClientRequestHandler::process_command | ( | const ACE_CString & | cmd, | |
| const ACE_CString & | arg = empty_ | |||
| ) | [protected] |
Definition at line 413 of file FTP_ClientRequestHandler.cpp.
| void ACE::FTP::ClientRequestHandler::quit_connection | ( | ) |
Definition at line 258 of file FTP_ClientRequestHandler.cpp.
| void ACE::FTP::ClientRequestHandler::release_connection | ( | ) | [protected] |
Definition at line 234 of file FTP_ClientRequestHandler.cpp.
{
}
void ClientRequestHandler::handle_connection_error (const URL& /*url*/)
{
}
void ClientRequestHandler::release_connection ()
{
if (this->session_)
| Request & ACE::FTP::ClientRequestHandler::request | ( | ) | [inline, virtual] |
Definition at line 50 of file FTP_ClientRequestHandler.inl.
{
return this->request_;
}
| const Request & ACE::FTP::ClientRequestHandler::request | ( | ) | const [inline, virtual] |
Definition at line 56 of file FTP_ClientRequestHandler.inl.
{
return this->request_;
}
| std::ostream & ACE::FTP::ClientRequestHandler::request_stream | ( | ) | [inline] |
Definition at line 86 of file FTP_ClientRequestHandler.inl.
{
if (this->session_)
return this->out_data_stream_;
else
return ACE::IOS::Null::out_stream_;
}
| const Response & ACE::FTP::ClientRequestHandler::response | ( | ) | const [inline, virtual] |
Definition at line 68 of file FTP_ClientRequestHandler.inl.
{
return this->response_;
}
| Response & ACE::FTP::ClientRequestHandler::response | ( | ) | [inline, virtual] |
Definition at line 62 of file FTP_ClientRequestHandler.inl.
{
return this->response_;
}
| std::istream & ACE::FTP::ClientRequestHandler::response_stream | ( | ) | [inline, virtual] |
Definition at line 95 of file FTP_ClientRequestHandler.inl.
{
if (this->session_)
return this->in_data_stream_;
else
return ACE::IOS::Null::in_stream_;
}
| bool ACE::FTP::ClientRequestHandler::send_active_address | ( | const ACE_INET_Addr & | addr | ) | [protected] |
Definition at line 660 of file FTP_ClientRequestHandler.cpp.
{
ACE::IOS::CString_OStream arg;
char ip_buf[128];
if (addr.get_host_addr (ip_buf, sizeof(ip_buf)) == 0)
{
return false;
}
u_short port = addr.get_port_number ();
// can we use the RFC 2428 extensions?
if (this->session ()->supports_ftp_extensions ())
{
arg << '|'
<< (addr.get_type () == AF_INET ? '1' : '2')
<< '|'
<< (&ip_buf[0])
<< '|'
<< port
<< '|';
if (this->process_command (Request::FTP_EPRT, arg.str ()) == Response::COMPLETED_OK)
{
return true;
}
// flag RFC 2428 extensions as unsupported
this->session ()->set_ftp_extension_support (false);
arg.clear ();
}
// use 'old' command
ACE_CString ip_addr = addr.get_host_addr (ip_buf, sizeof(ip_buf));
ACE_CString::size_type pos;
while ((pos = ip_addr.find ('.')) != ACE_CString::npos)
{
| void ACE::FTP::ClientRequestHandler::session | ( | SessionHolder * | session | ) | [inline, protected] |
Definition at line 80 of file FTP_ClientRequestHandler.inl.
{
this->session_ = session;
}
| ClientRequestHandler::SessionHolder & ACE::FTP::ClientRequestHandler::session | ( | ) | [inline, protected] |
Definition at line 74 of file FTP_ClientRequestHandler.inl.
{
return *this->session_;
}
| bool ACE::FTP::ClientRequestHandler::set_filetype | ( | bool | binary | ) | [protected] |
Definition at line 318 of file FTP_ClientRequestHandler.cpp.
{
| ClientRequestHandler::stream_type * ACE::FTP::ClientRequestHandler::start_download | ( | const ACE_CString & | path, | |
| bool | binary | |||
| ) | [protected] |
Definition at line 324 of file FTP_ClientRequestHandler.cpp.
{
return this->process_command (Request::FTP_TYPE, binary ? "I" : "A") == Response::COMPLETED_OK;
}
ClientRequestHandler::stream_type*
ClientRequestHandler::start_download (const ACE_CString& path, bool binary)
{
if (path.empty () || this->is_dir (path))
{
if (this->set_filetype (false))
{
return this->open_data_connection (Request::FTP_LIST, path);
}
}
else
| ClientRequestHandler::stream_type * ACE::FTP::ClientRequestHandler::start_upload | ( | const ACE_CString & | path, | |
| bool | binary | |||
| ) | [protected] |
Definition at line 344 of file FTP_ClientRequestHandler.cpp.
{
return this->open_data_connection (Request::FTP_RETR, path);
}
}
return 0;
}
ClientRequestHandler::stream_type*
| void ACE::FTP::ClientRequestHandler::use_active_mode | ( | u_short | port = 0 |
) | [inline] |
Definition at line 36 of file FTP_ClientRequestHandler.inl.
{
this->use_passive_mode_ = false;
this->active_port_ = port;
}
| void ACE::FTP::ClientRequestHandler::use_passive_mode | ( | ) | [inline] |
Definition at line 30 of file FTP_ClientRequestHandler.inl.
{
this->use_passive_mode_ = true;
}
| u_short ACE::FTP::ClientRequestHandler::uses_active_port | ( | ) | const [inline] |
Definition at line 43 of file FTP_ClientRequestHandler.inl.
{
return this->active_port_;
}
| bool ACE::FTP::ClientRequestHandler::uses_passive_mode | ( | ) | const [inline] |
Definition at line 24 of file FTP_ClientRequestHandler.inl.
{
return this->use_passive_mode_;
}
u_short ACE::FTP::ClientRequestHandler::active_port_ [private] |
Definition at line 215 of file FTP_ClientRequestHandler.h.
const ACE_CString ACE::FTP::ClientRequestHandler::anonymous_user_ = "anonymous" [static] |
Definition at line 88 of file FTP_ClientRequestHandler.h.
Definition at line 221 of file FTP_ClientRequestHandler.h.
const ACE_CString ACE::FTP::ClientRequestHandler::empty_ [static, protected] |
Definition at line 91 of file FTP_ClientRequestHandler.h.
Definition at line 218 of file FTP_ClientRequestHandler.h.
Definition at line 217 of file FTP_ClientRequestHandler.h.
Definition at line 211 of file FTP_ClientRequestHandler.h.
Definition at line 212 of file FTP_ClientRequestHandler.h.
Definition at line 213 of file FTP_ClientRequestHandler.h.
bool ACE::FTP::ClientRequestHandler::transfer_active_ [private] |
Definition at line 219 of file FTP_ClientRequestHandler.h.
bool ACE::FTP::ClientRequestHandler::use_passive_mode_ [private] |
Definition at line 214 of file FTP_ClientRequestHandler.h.
1.7.0