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 (882de07e4cbe)

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
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim:set ts=4 sw=2 sts=2 et cindent: */
/* 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
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

#ifndef nsFTPChannel_h___
#define nsFTPChannel_h___

#include "nsBaseChannel.h"
#include "nsBaseChannel.h"

#include "nsString.h"
#include "nsCOMPtr.h"
#include "nsIChannelWithDivertableParentListener.h"
#include "nsIFTPChannel.h"
#include "nsIFTPChannel.h"
#include "nsIForcePendingChannel.h"
#include "nsIUploadChannel.h"
#include "nsIProxyInfo.h"
#include "nsIProxiedChannel.h"
#include "nsIResumableChannel.h"
#include "nsIResumableChannel.h"
#include "nsWeakReference.h"

class nsIURI;
using mozilla::net::ADivertableParentChannel;


class nsFtpChannel final : public nsBaseChannel,
                           public nsIFTPChannel,
                           public nsIUploadChannel,
                           public nsIResumableChannel,
                           public nsIProxiedChannel,
                           public nsIForcePendingChannel,
                           public nsSupportsWeakReference,
                           public nsIChannelWithDivertableParentListener {
                           public nsIChannelWithDivertableParentListener {
 public:
  NS_DECL_ISUPPORTS_INHERITED
  NS_DECL_NSIUPLOADCHANNEL
  NS_DECL_NSIRESUMABLECHANNEL
  NS_DECL_NSIPROXIEDCHANNEL
  NS_DECL_NSIPROXIEDCHANNEL
  NS_DECL_NSICHANNELWITHDIVERTABLEPARENTLISTENER

  nsFtpChannel(nsIURI* uri, nsIProxyInfo* pi)
      : mProxyInfo(pi),
        mStartPos(0),
        mStartPos(0),
        mResumeRequested(false),
        mLastModifiedTime(0),
        mForcePending(false),
        mSuspendCount(0) {
    SetURI(uri);
    SetURI(uri);
  }

  void UpdateURI(nsIURI* aURI) {
    MOZ_DIAGNOSTIC_ASSERT(NS_IsMainThread(), "Not thread-safe.");
    mURI = aURI;
    mURI = aURI;
  }

  nsIProxyInfo* ProxyInfo() { return mProxyInfo; }
  nsIProxyInfo* ProxyInfo() { return mProxyInfo; }


  void SetProxyInfo(nsIProxyInfo* pi) { mProxyInfo = pi; }

  NS_IMETHOD IsPending(bool* result) override;
  NS_IMETHOD IsPending(bool* result) override;

  // This is a short-cut to calling nsIRequest::IsPending().
  // Overrides Pending in nsBaseChannel.
  bool Pending() const override;


  // Were we asked to resume a download?
  bool ResumeRequested() { return mResumeRequested; }

  // Download from this byte offset
  uint64_t StartPos() { return mStartPos; }

  // ID of the entity to resume downloading
  const nsCString& EntityID() { return mEntityID; }
  void SetEntityID(const nsACString& entityID) { mEntityID = entityID; }
  void SetEntityID(const nsACString& entityID) { mEntityID = entityID; }

  NS_IMETHOD GetLastModifiedTime(PRTime* lastModifiedTime) override {
    *lastModifiedTime = mLastModifiedTime;
    return NS_OK;
  }
  }

  NS_IMETHOD SetLastModifiedTime(PRTime lastModifiedTime) override {
    mLastModifiedTime = lastModifiedTime;
    return NS_OK;
  }
  }

  // Data stream to upload
  nsIInputStream* UploadStream() { return mUploadStream; }

  // Helper function for getting the nsIFTPEventSink.
  // Helper function for getting the nsIFTPEventSink.
  void GetFTPEventSink(nsCOMPtr<nsIFTPEventSink>& aResult);

  NS_IMETHOD Suspend() override;
  NS_IMETHOD Resume() override;

 public:
  NS_IMETHOD ForcePending(bool aForcePending) override;
  NS_IMETHOD ForcePending(bool aForcePending) override;

 protected:
  virtual ~nsFtpChannel() = default;
  virtual nsresult OpenContentStream(bool async, nsIInputStream** result,
                                     nsIChannel** channel) override;
                                     nsIChannel** channel) override;
  virtual bool GetStatusArg(nsresult status, nsString& statusArg) override;
  virtual void OnCallbacksChanged() override;

 private:
  nsCOMPtr<nsIProxyInfo> mProxyInfo;
  nsCOMPtr<nsIProxyInfo> mProxyInfo;
  nsCOMPtr<nsIFTPEventSink> mFTPEventSink;
  nsCOMPtr<nsIInputStream> mUploadStream;
  uint64_t mStartPos;
  nsCString mEntityID;
  nsCString mEntityID;
  bool mResumeRequested;
  PRTime mLastModifiedTime;
  bool mForcePending;
  RefPtr<ADivertableParentChannel> mParentChannel;


  // Current suspension depth for this channel object
  uint32_t mSuspendCount;
};


#endif /* nsFTPChannel_h___ */