summaryrefslogtreecommitdiff
path: root/ACE/protocols/ace/INet/FTP_Request.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'ACE/protocols/ace/INet/FTP_Request.cpp')
-rw-r--r--ACE/protocols/ace/INet/FTP_Request.cpp152
1 files changed, 152 insertions, 0 deletions
diff --git a/ACE/protocols/ace/INet/FTP_Request.cpp b/ACE/protocols/ace/INet/FTP_Request.cpp
new file mode 100644
index 00000000000..57d2f6f17c6
--- /dev/null
+++ b/ACE/protocols/ace/INet/FTP_Request.cpp
@@ -0,0 +1,152 @@
+// $Id$
+
+#include "ace/String_Base.h"
+#include "ace/OS_NS_ctype.h"
+#include "ace/INet/FTP_Request.h"
+
+#if !defined (__ACE_INLINE__)
+#include "ace/INet/FTP_Request.inl"
+#endif
+
+#include "ace/INet/INet_Log.h"
+#include "ace/INet/String_IOStream.h"
+
+
+
+ACE_BEGIN_VERSIONED_NAMESPACE_DECL
+
+namespace ACE
+{
+ namespace FTP
+ {
+
+ const ACE_CString Request::FTP_USER = "USER";
+ const ACE_CString Request::FTP_PASS = "PASS";
+ const ACE_CString Request::FTP_QUIT = "QUIT";
+ const ACE_CString Request::FTP_TYPE = "TYPE";
+ const ACE_CString Request::FTP_SYST = "SYST";
+ const ACE_CString Request::FTP_PWD = "PWD";
+ const ACE_CString Request::FTP_CWD = "CWD";
+ const ACE_CString Request::FTP_CDUP = "CDUP";
+ const ACE_CString Request::FTP_RNFR = "RNFR";
+ const ACE_CString Request::FTP_RNTO = "RNTO";
+ const ACE_CString Request::FTP_DELE = "DELE";
+ const ACE_CString Request::FTP_MKD = "MKD";
+ const ACE_CString Request::FTP_RMD = "RMD";
+ const ACE_CString Request::FTP_RETR = "RETR";
+ const ACE_CString Request::FTP_STOR = "STOR";
+ const ACE_CString Request::FTP_LIST = "LIST";
+ const ACE_CString Request::FTP_NLST = "NLST";
+ const ACE_CString Request::FTP_ABOR = "ABOR";
+ const ACE_CString Request::FTP_EPRT = "EPRT";
+ const ACE_CString Request::FTP_PORT = "PORT";
+ const ACE_CString Request::FTP_EPSV = "EPSV";
+ const ACE_CString Request::FTP_PASV = "PASV";
+ const ACE_CString Request::FTP_STAT = "STAT";
+
+ const int Request::eof_ = std::char_traits<char>::eof ();
+
+ Request::Request()
+ {
+ }
+
+ Request::~Request()
+ {
+ }
+
+ void Request::arguments (ACE_Array<ACE_CString> & args) const
+ {
+ ACE::IOS::CString_IStream sis (this->args_);
+
+ int ch = sis.get ();
+ while (ch != eof_)
+ {
+ // skip whitespace
+ while (ACE_OS::ace_isspace (ch)) ch = sis.get ();
+ if (ch != eof_)
+ {
+ // get arg
+ ACE_Array<ACE_CString>::size_type n =
+ args.size ();
+ args.size (n + 1);
+ ACE_CString& arg = args[n];
+ while (ch != eof_ && !ACE_OS::ace_isspace (ch))
+ {
+ arg += ch;
+ ch = sis.get ();
+ }
+ }
+ }
+ }
+
+ void Request::write(std::ostream& str) const
+ {
+ str << this->command_.c_str ();
+ if (!this->args_.empty ())
+ str << ' ' << this->args_.c_str ();
+ str << "\r\n";
+
+ INET_DEBUG (6, (LM_DEBUG, DLINFO
+ ACE_TEXT ("ACE_INet_FTP: --> %C %C\n"),
+ this->command_.c_str (),
+ this->command_ == FTP_PASS ?
+ "***" : this->args_.c_str ()));
+ }
+
+ bool Request::read(std::istream& str)
+ {
+ ACE_CString cmd (4, '\0');
+ ACE_CString args (128, '\0');
+
+ int ch = str.peek ();
+ if (ch == eof_)
+ {
+ str.get (); // skip to eof
+ return false;
+ }
+ // skip whitespace
+ while (ACE_OS::ace_isspace (str.peek ()))
+ {
+ str.get ();
+ }
+ // get method
+ ch = str.get ();
+ while (!ACE_OS::ace_isspace (ch) && ch != eof_ && cmd.length () < MAX_CMD_LENGTH)
+ {
+ cmd += ch;
+ ch = str.get ();
+ }
+ if (!ACE_OS::ace_isspace (ch))
+ return false; // invalid FTP command string
+ if (ch != '\r' && ch != '\n')
+ {
+ // skip whitespace
+ while (ACE_OS::ace_isspace (str.peek ()))
+ {
+ str.get ();
+ }
+ // get arguments
+ ch = str.get ();
+ while (ch != eof_ && ch != '\r' && ch != '\n' && args.length () < MAX_ARG_LENGTH)
+ {
+ args += ch;
+ ch = str.get ();
+ }
+ if (ch != eof_ && ch != '\r' && ch != '\n')
+ {
+ return false; // args too long
+ }
+ }
+ if (ch == '\r')
+ {
+ str.get ();
+ }
+ this->command (cmd);
+ this->args_ = args;
+ return true;
+ }
+
+ }
+}
+
+ACE_END_VERSIONED_NAMESPACE_DECL