+
+// ----------------------------------------------------------------------------
+// wxFTP download and upload
+// ----------------------------------------------------------------------------
+
+class wxInputFTPStream : public wxSocketInputStream
+{
+public:
+ wxInputFTPStream(wxFTP *ftp, wxSocketBase *sock)
+ : wxSocketInputStream(*sock)
+ {
+ m_ftp = ftp;
+ // socket timeout automatically set in GetPort function
+ }
+
+ virtual ~wxInputFTPStream()
+ {
+ delete m_i_socket; // keep at top
+
+ // when checking the result, the stream will
+ // almost always show an error, even if the file was
+ // properly transfered, thus, lets just grab the result
+
+ // we are looking for "226 transfer completed"
+ char code = m_ftp->GetResult();
+ if ('2' == code)
+ {
+ // it was a good transfer.
+ // we're done!
+ m_ftp->m_streaming = false;
+ return;
+ }
+ // did we timeout?
+ if (0 == code)
+ {
+ // the connection is probably toast. issue an abort, and
+ // then a close. there won't be any more waiting
+ // for this connection
+ m_ftp->Abort();
+ m_ftp->Close();
+ return;
+ }
+ // There was a problem with the transfer and the server
+ // has acknowledged it. If we issue an "ABORT" now, the user
+ // would get the "226" for the abort and think the xfer was
+ // complete, thus, don't do anything here, just return
+ }
+
+ wxFTP *m_ftp;
+
+ wxDECLARE_NO_COPY_CLASS(wxInputFTPStream);
+};
+
+class wxOutputFTPStream : public wxSocketOutputStream
+{
+public:
+ wxOutputFTPStream(wxFTP *ftp_clt, wxSocketBase *sock)
+ : wxSocketOutputStream(*sock), m_ftp(ftp_clt)
+ {
+ }
+
+ virtual ~wxOutputFTPStream(void)
+ {
+ if ( IsOk() )
+ {
+ // close data connection first, this will generate "transfer
+ // completed" reply
+ delete m_o_socket;
+
+ // read this reply
+ m_ftp->GetResult(); // save result so user can get to it
+
+ m_ftp->m_streaming = false;
+ }
+ else
+ {
+ // abort data connection first
+ m_ftp->Abort();
+
+ // and close it after
+ delete m_o_socket;
+ }
+ }
+
+ wxFTP *m_ftp;
+
+ wxDECLARE_NO_COPY_CLASS(wxOutputFTPStream);
+};
+