diff options
Diffstat (limited to 'ACE/protocols/ace/INet/FTP_Response.cpp')
-rw-r--r-- | ACE/protocols/ace/INet/FTP_Response.cpp | 132 |
1 files changed, 132 insertions, 0 deletions
diff --git a/ACE/protocols/ace/INet/FTP_Response.cpp b/ACE/protocols/ace/INet/FTP_Response.cpp new file mode 100644 index 00000000000..46b2ea1a0b3 --- /dev/null +++ b/ACE/protocols/ace/INet/FTP_Response.cpp @@ -0,0 +1,132 @@ +// $Id$ + +#include "ace/OS_NS_stdlib.h" +#include "ace/OS_NS_ctype.h" +#include "ace/String_Base.h" +#include "ace/INet/FTP_Response.h" + +#if !defined (__ACE_INLINE__) +#include "ace/INet/FTP_Response.inl" +#endif + +#include "ace/INet/INet_Log.h" +#include "ace/INet/String_IOStream.h" + + + +ACE_BEGIN_VERSIONED_NAMESPACE_DECL + +namespace ACE +{ + namespace FTP + { + const int Response::eof_ = std::char_traits<char>::eof (); + + Response::Response() + : status_ (NORESPONSE) + { + } + + Response::~Response() + { + } + + void Response::write(ostream& str) const + { + ACE_Array<ACE_CString>::size_type n = 0; + str << this->status_; + if (this->response_.size () > 0) + { + n = this->response_.size () - 1; + str << (n > 0 ? '-' : ' ') << this->response_[0].c_str (); + } + str << "\r\n"; + for (ACE_Array<ACE_CString>::size_type i = 1; + i < n; + ++i) + { + str << this->response_[i].c_str () << "\r\n"; + } + if (n > 0) + { + str << this->status_ << ' ' + << this->response_[n].c_str () << "\r\n"; + } + } + + bool Response::read(istream& str) + { + int ch; + str >> this->status_; + ch = str.get (); + if (str.bad () || this->status_type () == NOSTATE || (ch != ' ' && ch != '-')) + { + return false; // invalid status + } + + bool multi_line = (ch == '-'); + + ACE_Array<ACE_CString>::size_type n = + this->response_.size (); + this->response_.size (n+1); + this->response_[n].clear (); + ACE::IOS::CString_OStream sos (this->response_[n]); + sos << this->status_; + sos.put (ch); + ch = this->read_line (str, sos); + if (ch == '\r') ch = str.get (); + sos.close (); // close the stream before resizing the array invalidates the string reference + + INET_DEBUG (6, (LM_DEBUG, DLINFO + ACE_TEXT ("ACE_INet_FTP: <-- %C\n"), + this->response_[n].c_str ())); + + if (multi_line) + { + while (ch != eof_) + { + int nxt_stat = 0; + + n = this->response_.size (); + this->response_.size (n+1); + this->response_[n].clear (); + ACE::IOS::CString_OStream nxt_sos (this->response_[n]); + + if (ACE_OS::ace_isdigit (str.peek ())) + { + str >> nxt_stat; + ch = str.get (); + if (str.bad () || (nxt_stat == this->status_ && ch != ' ')) + { + this->status_ = NORESPONSE; + return false; + } + nxt_sos << nxt_stat; + nxt_sos.put(ch); + } + ch = this->read_line (str, nxt_sos); + + nxt_sos.close (); + + INET_DEBUG (9, (LM_DEBUG, DLINFO + ACE_TEXT ("ACE_INet_FTP: <-+ %C\n"), + this->response_[n].c_str ())); + + if (nxt_stat == this->status_) + { + return true; + } + } + + this->status_ = NORESPONSE; + return false; + } + else + { + return true; + } + } + } +} + +ACE_END_VERSIONED_NAMESPACE_DECL |