DXR is a code search and navigation tool aimed at making sense of large projects. It supports full-text and regex searches as well as structural queries.

Implementation

Mercurial (c68fe15a81fc)

VCS Links

Line Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

#ifndef __nsFtpConnectionThread__h_
#define __nsFtpConnectionThread__h_


#include "nsBaseContentStream.h"

#include "nsString.h"
#include "nsCOMPtr.h"
#include "nsIAsyncInputStream.h"
#include "nsITransport.h"
#include "mozilla/net/DNS.h"
#include "mozilla/net/DNS.h"
#include "nsFtpControlConnection.h"
#include "nsIProtocolProxyCallback.h"

// ftp server types
#define FTP_GENERIC_TYPE 0
#define FTP_GENERIC_TYPE 0
#define FTP_UNIX_TYPE 1
#define FTP_VMS_TYPE 8
#define FTP_NT_TYPE 9
#define FTP_OS2_TYPE 11


// ftp states
typedef enum _FTP_STATE {
  ///////////////////////
  ///////////////////////
  //// Internal states
  FTP_INIT,
  FTP_COMMAND_CONNECT,
  FTP_READ_BUF,
  FTP_ERROR,
  FTP_ERROR,
  FTP_COMPLETE,

  ///////////////////////
  //// Command channel connection setup states
  FTP_S_USER,
  FTP_S_USER,
  FTP_R_USER,
  FTP_S_PASS,
  FTP_R_PASS,
  FTP_S_SYST,
  FTP_R_SYST,
  FTP_R_SYST,
  FTP_S_ACCT,
  FTP_R_ACCT,
  FTP_S_TYPE,
  FTP_R_TYPE,
  FTP_S_CWD,
  FTP_S_CWD,
  FTP_R_CWD,
  FTP_S_SIZE,
  FTP_R_SIZE,
  FTP_S_MDTM,
  FTP_R_MDTM,
  FTP_R_MDTM,
  FTP_S_REST,
  FTP_R_REST,
  FTP_S_RETR,
  FTP_R_RETR,
  FTP_S_STOR,
  FTP_R_STOR,
  FTP_S_LIST,
  FTP_S_LIST,
  FTP_R_LIST,
  FTP_S_PASV,
  FTP_R_PASV,
  FTP_S_PWD,
  FTP_R_PWD,
  FTP_R_PWD,
  FTP_S_FEAT,
  FTP_R_FEAT,
  FTP_S_OPTS,
  FTP_R_OPTS
} FTP_STATE;
} FTP_STATE;

// higher level ftp actions
typedef enum _FTP_ACTION { GET, PUT } FTP_ACTION;

class nsFtpChannel;
class nsFtpChannel;
class nsICancelable;
class nsIProxyInfo;
class nsIStreamListener;


// The nsFtpState object is the content stream for the channel.  It implements
// nsIInputStreamCallback, so it can read data from the control connection.  It
// implements nsITransportEventSink so it can mix status events from both the
// control connection and the data connection.


class nsFtpState final : public nsBaseContentStream,
                         public nsIInputStreamCallback,
                         public nsITransportEventSink,
                         public nsIRequestObserver,
                         public nsFtpControlConnectionListener,
                         public nsFtpControlConnectionListener,
                         public nsIProtocolProxyCallback {
 public:
  NS_DECL_ISUPPORTS_INHERITED
  NS_DECL_NSIINPUTSTREAMCALLBACK
  NS_DECL_NSITRANSPORTEVENTSINK
  NS_DECL_NSITRANSPORTEVENTSINK
  NS_DECL_NSIREQUESTOBSERVER
  NS_DECL_NSIPROTOCOLPROXYCALLBACK

  // Override input stream methods:
  NS_IMETHOD CloseWithStatus(nsresult status) override;
  NS_IMETHOD CloseWithStatus(nsresult status) override;
  NS_IMETHOD Available(uint64_t* result) override;
  NS_IMETHOD ReadSegments(nsWriteSegmentFun fun, void* closure, uint32_t count,
                          uint32_t* result) override;

  // nsFtpControlConnectionListener methods:
  // nsFtpControlConnectionListener methods:
  virtual void OnControlDataAvailable(const char* data,
                                      uint32_t dataLen) override;
  virtual void OnControlError(nsresult status) override;
  virtual void OnControlError(nsresult status) override;

  nsFtpState();
  nsresult Init(nsFtpChannel* channel);

 protected:
 protected:
  // Notification from nsBaseContentStream::AsyncWait
  virtual void OnCallbackPending() override;

 private:
  virtual ~nsFtpState();
  virtual ~nsFtpState();

  ///////////////////////////////////
  // BEGIN: STATE METHODS
  nsresult S_user();
  FTP_STATE R_user();
  FTP_STATE R_user();
  nsresult S_pass();
  FTP_STATE R_pass();
  nsresult S_syst();
  FTP_STATE R_syst();
  nsresult S_acct();
  nsresult S_acct();
  FTP_STATE R_acct();

  nsresult S_type();
  FTP_STATE R_type();
  FTP_STATE R_type();
  nsresult S_cwd();
  FTP_STATE R_cwd();

  nsresult S_size();
  FTP_STATE R_size();
  FTP_STATE R_size();
  nsresult S_mdtm();
  FTP_STATE R_mdtm();
  nsresult S_list();
  FTP_STATE R_list();


  nsresult S_rest();
  FTP_STATE R_rest();
  nsresult S_retr();
  FTP_STATE R_retr();
  nsresult S_stor();
  nsresult S_stor();
  FTP_STATE R_stor();
  nsresult S_pasv();
  FTP_STATE R_pasv();
  FTP_STATE R_pasv();
  nsresult S_pwd();
  FTP_STATE R_pwd();
  nsresult S_feat();
  nsresult S_feat();
  FTP_STATE R_feat();
  FTP_STATE R_feat();
  nsresult S_opts();
  FTP_STATE R_opts();
  // END: STATE METHODS
  // END: STATE METHODS
  ///////////////////////////////////

  // internal methods
  void MoveToNextState(FTP_STATE nextState);
  nsresult Process();
  nsresult Process();

  void KillControlConnection();
  nsresult StopProcessing();
  nsresult EstablishControlConnection();
  nsresult SendFTPCommand(const nsACString& command);
  nsresult SendFTPCommand(const nsACString& command);
  void ConvertFilespecToVMS(nsCString& fileSpec);
  void ConvertDirspecToVMS(nsCString& fileSpec);
  void ConvertDirspecFromVMS(nsCString& fileSpec);
  nsresult BuildStreamConverter(nsIStreamListener** convertStreamListener);
  nsresult SetContentType();
  nsresult SetContentType();

  /**
   * This method is called to kick-off the FTP state machine.  mState is
   * reset to FTP_COMMAND_CONNECT, and the FTP state machine progresses from
   * there.  This method is initially called (indirectly) from the channel's
   * there.  This method is initially called (indirectly) from the channel's
   * AsyncOpen implementation.
   */
  void Connect();


  ///////////////////////////////////
  // Private members

  nsCOMPtr<nsIProxiedProtocolHandler> mHandler;  // Ref to gFtpHandler

  // ****** state machine vars
  // ****** state machine vars
  FTP_STATE mState;        // the current state
  FTP_STATE mNextState;    // the next state
  bool mKeepRunning;       // thread event loop boolean
  int32_t mResponseCode;   // the last command response code
  nsCString mResponseMsg;  // the last command response text
  nsCString mResponseMsg;  // the last command response text

  // ****** channel/transport/stream vars
  RefPtr<nsFtpControlConnection>
      mControlConnection;  // cacheable control connection (owns mCPipe)
  bool mReceivedControlData;
  bool mReceivedControlData;
  bool mTryingCachedControl;  // retrying the password
  bool mRETRFailed;           // Did we already try a RETR and it failed?
  uint64_t mFileSize;
  nsCString mModTime;


  // ****** consumer vars
  RefPtr<nsFtpChannel>
      mChannel;  // our owning FTP channel we pass through our events
  nsCOMPtr<nsIProxyInfo> mProxyInfo;


  // ****** connection cache vars
  int32_t mServerType;  // What kind of server are we talking to

  // ****** protocol interpretation related state vars
  nsString mUsername;       // username
  nsString mUsername;       // username
  nsString mPassword;       // password
  FTP_ACTION mAction;       // the higher level action (GET/PUT)
  bool mAnonymous;          // try connecting anonymous (default)
  bool mRetryPass;          // retrying the password
  bool mStorReplyReceived;  // FALSE if waiting for STOR
                            // completion status from server
  bool mRlist1xxReceived;   // TRUE if we have received a LIST 1xx
                            // response from the server
  bool mRretr1xxReceived;   // TRUE if we have received a RETR 1xx
  bool mRretr1xxReceived;   // TRUE if we have received a RETR 1xx
                            // response from the server
  bool mRstor1xxReceived;   // TRUE if we have received a STOR 1xx
                            // response from the server
  nsresult mInternalError;  // represents internal state errors
  bool mReconnectAndLoginAgain;
  bool mReconnectAndLoginAgain;
  bool mCacheConnection;

  // ****** URI vars
  int32_t mPort;       // the port to connect to
  nsString mFilename;  // url filename (if any)
  nsString mFilename;  // url filename (if any)
  nsCString mPath;     // the url's path
  nsCString mPwd;      // login Path

  // ****** other vars
  nsCOMPtr<nsITransport> mDataTransport;
  nsCOMPtr<nsITransport> mDataTransport;
  nsCOMPtr<nsIAsyncInputStream> mDataStream;
  nsCOMPtr<nsIRequest> mUploadRequest;
  bool mAddressChecked;
  bool mServerIsIPv6;
  bool mUseUTF8;
  bool mUseUTF8;

  mozilla::net::NetAddr mServerAddress;

  // ***** control read gvars
  nsresult mControlStatus;
  nsCString mControlReadCarryOverBuf;


  nsCString mSuppliedEntityID;

  nsCOMPtr<nsICancelable> mProxyRequest;
  bool mDeferredCallbackPending;
};
};

#endif  //__nsFtpConnectionThread__h_