Blame netwerk/protocol/ftp/nsFtpConnectionThread.h

Packit f0b94e
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
Packit f0b94e
/* This Source Code Form is subject to the terms of the Mozilla Public
Packit f0b94e
 * License, v. 2.0. If a copy of the MPL was not distributed with this
Packit f0b94e
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
Packit f0b94e
Packit f0b94e
#ifndef __nsFtpConnectionThread__h_
Packit f0b94e
#define __nsFtpConnectionThread__h_
Packit f0b94e
Packit f0b94e
#include "nsBaseContentStream.h"
Packit f0b94e
Packit f0b94e
#include "nsString.h"
Packit f0b94e
#include "nsCOMPtr.h"
Packit f0b94e
#include "nsIAsyncInputStream.h"
Packit f0b94e
#include "nsAutoPtr.h"
Packit f0b94e
#include "nsITransport.h"
Packit f0b94e
#include "mozilla/net/DNS.h"
Packit f0b94e
#include "nsFtpControlConnection.h"
Packit f0b94e
#include "nsIProtocolProxyCallback.h"
Packit f0b94e
Packit f0b94e
// ftp server types
Packit f0b94e
#define FTP_GENERIC_TYPE 0
Packit f0b94e
#define FTP_UNIX_TYPE 1
Packit f0b94e
#define FTP_VMS_TYPE 8
Packit f0b94e
#define FTP_NT_TYPE 9
Packit f0b94e
#define FTP_OS2_TYPE 11
Packit f0b94e
Packit f0b94e
// ftp states
Packit f0b94e
typedef enum _FTP_STATE {
Packit f0b94e
  ///////////////////////
Packit f0b94e
  //// Internal states
Packit f0b94e
  FTP_INIT,
Packit f0b94e
  FTP_COMMAND_CONNECT,
Packit f0b94e
  FTP_READ_BUF,
Packit f0b94e
  FTP_ERROR,
Packit f0b94e
  FTP_COMPLETE,
Packit f0b94e
Packit f0b94e
  ///////////////////////
Packit f0b94e
  //// Command channel connection setup states
Packit f0b94e
  FTP_S_USER,
Packit f0b94e
  FTP_R_USER,
Packit f0b94e
  FTP_S_PASS,
Packit f0b94e
  FTP_R_PASS,
Packit f0b94e
  FTP_S_SYST,
Packit f0b94e
  FTP_R_SYST,
Packit f0b94e
  FTP_S_ACCT,
Packit f0b94e
  FTP_R_ACCT,
Packit f0b94e
  FTP_S_TYPE,
Packit f0b94e
  FTP_R_TYPE,
Packit f0b94e
  FTP_S_CWD,
Packit f0b94e
  FTP_R_CWD,
Packit f0b94e
  FTP_S_SIZE,
Packit f0b94e
  FTP_R_SIZE,
Packit f0b94e
  FTP_S_MDTM,
Packit f0b94e
  FTP_R_MDTM,
Packit f0b94e
  FTP_S_REST,
Packit f0b94e
  FTP_R_REST,
Packit f0b94e
  FTP_S_RETR,
Packit f0b94e
  FTP_R_RETR,
Packit f0b94e
  FTP_S_STOR,
Packit f0b94e
  FTP_R_STOR,
Packit f0b94e
  FTP_S_LIST,
Packit f0b94e
  FTP_R_LIST,
Packit f0b94e
  FTP_S_PASV,
Packit f0b94e
  FTP_R_PASV,
Packit f0b94e
  FTP_S_PWD,
Packit f0b94e
  FTP_R_PWD,
Packit f0b94e
  FTP_S_FEAT,
Packit f0b94e
  FTP_R_FEAT,
Packit f0b94e
  FTP_S_OPTS,
Packit f0b94e
  FTP_R_OPTS
Packit f0b94e
} FTP_STATE;
Packit f0b94e
Packit f0b94e
// higher level ftp actions
Packit f0b94e
typedef enum _FTP_ACTION { GET, PUT } FTP_ACTION;
Packit f0b94e
Packit f0b94e
class nsFtpChannel;
Packit f0b94e
class nsICancelable;
Packit f0b94e
class nsIProxyInfo;
Packit f0b94e
class nsIStreamListener;
Packit f0b94e
Packit f0b94e
// The nsFtpState object is the content stream for the channel.  It implements
Packit f0b94e
// nsIInputStreamCallback, so it can read data from the control connection.  It
Packit f0b94e
// implements nsITransportEventSink so it can mix status events from both the
Packit f0b94e
// control connection and the data connection.
Packit f0b94e
Packit f0b94e
class nsFtpState final : public nsBaseContentStream,
Packit f0b94e
                         public nsIInputStreamCallback,
Packit f0b94e
                         public nsITransportEventSink,
Packit f0b94e
                         public nsIRequestObserver,
Packit f0b94e
                         public nsFtpControlConnectionListener,
Packit f0b94e
                         public nsIProtocolProxyCallback {
Packit f0b94e
 public:
Packit f0b94e
  NS_DECL_ISUPPORTS_INHERITED
Packit f0b94e
  NS_DECL_NSIINPUTSTREAMCALLBACK
Packit f0b94e
  NS_DECL_NSITRANSPORTEVENTSINK
Packit f0b94e
  NS_DECL_NSIREQUESTOBSERVER
Packit f0b94e
  NS_DECL_NSIPROTOCOLPROXYCALLBACK
Packit f0b94e
Packit f0b94e
  // Override input stream methods:
Packit f0b94e
  NS_IMETHOD CloseWithStatus(nsresult status) override;
Packit f0b94e
  NS_IMETHOD Available(uint64_t* result) override;
Packit f0b94e
  NS_IMETHOD ReadSegments(nsWriteSegmentFun fun, void* closure, uint32_t count,
Packit f0b94e
                          uint32_t* result) override;
Packit f0b94e
Packit f0b94e
  // nsFtpControlConnectionListener methods:
Packit f0b94e
  virtual void OnControlDataAvailable(const char* data,
Packit f0b94e
                                      uint32_t dataLen) override;
Packit f0b94e
  virtual void OnControlError(nsresult status) override;
Packit f0b94e
Packit f0b94e
  nsFtpState();
Packit f0b94e
  nsresult Init(nsFtpChannel* channel);
Packit f0b94e
Packit f0b94e
 protected:
Packit f0b94e
  // Notification from nsBaseContentStream::AsyncWait
Packit f0b94e
  virtual void OnCallbackPending() override;
Packit f0b94e
Packit f0b94e
 private:
Packit f0b94e
  virtual ~nsFtpState();
Packit f0b94e
Packit f0b94e
  ///////////////////////////////////
Packit f0b94e
  // BEGIN: STATE METHODS
Packit f0b94e
  nsresult S_user();
Packit f0b94e
  FTP_STATE R_user();
Packit f0b94e
  nsresult S_pass();
Packit f0b94e
  FTP_STATE R_pass();
Packit f0b94e
  nsresult S_syst();
Packit f0b94e
  FTP_STATE R_syst();
Packit f0b94e
  nsresult S_acct();
Packit f0b94e
  FTP_STATE R_acct();
Packit f0b94e
Packit f0b94e
  nsresult S_type();
Packit f0b94e
  FTP_STATE R_type();
Packit f0b94e
  nsresult S_cwd();
Packit f0b94e
  FTP_STATE R_cwd();
Packit f0b94e
Packit f0b94e
  nsresult S_size();
Packit f0b94e
  FTP_STATE R_size();
Packit f0b94e
  nsresult S_mdtm();
Packit f0b94e
  FTP_STATE R_mdtm();
Packit f0b94e
  nsresult S_list();
Packit f0b94e
  FTP_STATE R_list();
Packit f0b94e
Packit f0b94e
  nsresult S_rest();
Packit f0b94e
  FTP_STATE R_rest();
Packit f0b94e
  nsresult S_retr();
Packit f0b94e
  FTP_STATE R_retr();
Packit f0b94e
  nsresult S_stor();
Packit f0b94e
  FTP_STATE R_stor();
Packit f0b94e
  nsresult S_pasv();
Packit f0b94e
  FTP_STATE R_pasv();
Packit f0b94e
  nsresult S_pwd();
Packit f0b94e
  FTP_STATE R_pwd();
Packit f0b94e
  nsresult S_feat();
Packit f0b94e
  FTP_STATE R_feat();
Packit f0b94e
  nsresult S_opts();
Packit f0b94e
  FTP_STATE R_opts();
Packit f0b94e
  // END: STATE METHODS
Packit f0b94e
  ///////////////////////////////////
Packit f0b94e
Packit f0b94e
  // internal methods
Packit f0b94e
  void MoveToNextState(FTP_STATE nextState);
Packit f0b94e
  nsresult Process();
Packit f0b94e
Packit f0b94e
  void KillControlConnection();
Packit f0b94e
  nsresult StopProcessing();
Packit f0b94e
  nsresult EstablishControlConnection();
Packit f0b94e
  nsresult SendFTPCommand(const nsACString& command);
Packit f0b94e
  void ConvertFilespecToVMS(nsCString& fileSpec);
Packit f0b94e
  void ConvertDirspecToVMS(nsCString& fileSpec);
Packit f0b94e
  void ConvertDirspecFromVMS(nsCString& fileSpec);
Packit f0b94e
  nsresult BuildStreamConverter(nsIStreamListener** convertStreamListener);
Packit f0b94e
  nsresult SetContentType();
Packit f0b94e
Packit f0b94e
  /**
Packit f0b94e
   * This method is called to kick-off the FTP state machine.  mState is
Packit f0b94e
   * reset to FTP_COMMAND_CONNECT, and the FTP state machine progresses from
Packit f0b94e
   * there.  This method is initially called (indirectly) from the channel's
Packit f0b94e
   * AsyncOpen implementation.
Packit f0b94e
   */
Packit f0b94e
  void Connect();
Packit f0b94e
Packit f0b94e
  ///////////////////////////////////
Packit f0b94e
  // Private members
Packit f0b94e
Packit f0b94e
  // ****** state machine vars
Packit f0b94e
  FTP_STATE mState;        // the current state
Packit f0b94e
  FTP_STATE mNextState;    // the next state
Packit f0b94e
  bool mKeepRunning;       // thread event loop boolean
Packit f0b94e
  int32_t mResponseCode;   // the last command response code
Packit f0b94e
  nsCString mResponseMsg;  // the last command response text
Packit f0b94e
Packit f0b94e
  // ****** channel/transport/stream vars
Packit f0b94e
  RefPtr<nsFtpControlConnection>
Packit f0b94e
      mControlConnection;  // cacheable control connection (owns mCPipe)
Packit f0b94e
  bool mReceivedControlData;
Packit f0b94e
  bool mTryingCachedControl;  // retrying the password
Packit f0b94e
  bool mRETRFailed;           // Did we already try a RETR and it failed?
Packit f0b94e
  uint64_t mFileSize;
Packit f0b94e
  nsCString mModTime;
Packit f0b94e
Packit f0b94e
  // ****** consumer vars
Packit f0b94e
  RefPtr<nsFtpChannel>
Packit f0b94e
      mChannel;  // our owning FTP channel we pass through our events
Packit f0b94e
  nsCOMPtr<nsIProxyInfo> mProxyInfo;
Packit f0b94e
Packit f0b94e
  // ****** connection cache vars
Packit f0b94e
  int32_t mServerType;  // What kind of server are we talking to
Packit f0b94e
Packit f0b94e
  // ****** protocol interpretation related state vars
Packit f0b94e
  nsString mUsername;       // username
Packit f0b94e
  nsString mPassword;       // password
Packit f0b94e
  FTP_ACTION mAction;       // the higher level action (GET/PUT)
Packit f0b94e
  bool mAnonymous;          // try connecting anonymous (default)
Packit f0b94e
  bool mRetryPass;          // retrying the password
Packit f0b94e
  bool mStorReplyReceived;  // FALSE if waiting for STOR
Packit f0b94e
                            // completion status from server
Packit f0b94e
  nsresult mInternalError;  // represents internal state errors
Packit f0b94e
  bool mReconnectAndLoginAgain;
Packit f0b94e
  bool mCacheConnection;
Packit f0b94e
Packit f0b94e
  // ****** URI vars
Packit f0b94e
  int32_t mPort;       // the port to connect to
Packit f0b94e
  nsString mFilename;  // url filename (if any)
Packit f0b94e
  nsCString mPath;     // the url's path
Packit f0b94e
  nsCString mPwd;      // login Path
Packit f0b94e
Packit f0b94e
  // ****** other vars
Packit f0b94e
  nsCOMPtr<nsITransport> mDataTransport;
Packit f0b94e
  nsCOMPtr<nsIAsyncInputStream> mDataStream;
Packit f0b94e
  nsCOMPtr<nsIRequest> mUploadRequest;
Packit f0b94e
  bool mAddressChecked;
Packit f0b94e
  bool mServerIsIPv6;
Packit f0b94e
  bool mUseUTF8;
Packit f0b94e
Packit f0b94e
  mozilla::net::NetAddr mServerAddress;
Packit f0b94e
Packit f0b94e
  // ***** control read gvars
Packit f0b94e
  nsresult mControlStatus;
Packit f0b94e
  nsCString mControlReadCarryOverBuf;
Packit f0b94e
Packit f0b94e
  nsCString mSuppliedEntityID;
Packit f0b94e
Packit f0b94e
  nsCOMPtr<nsICancelable> mProxyRequest;
Packit f0b94e
  bool mDeferredCallbackPending;
Packit f0b94e
};
Packit f0b94e
Packit f0b94e
#endif  //__nsFtpConnectionThread__h_