Blame netwerk/protocol/ftp/FTPChannelChild.h

Packit f0b94e
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
Packit f0b94e
/* vim: set sw=2 ts=8 et tw=80 : */
Packit f0b94e
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 mozilla_net_FTPChannelChild_h
Packit f0b94e
#define mozilla_net_FTPChannelChild_h
Packit f0b94e
Packit f0b94e
#include "mozilla/UniquePtr.h"
Packit f0b94e
#include "mozilla/net/PFTPChannelChild.h"
Packit f0b94e
#include "mozilla/net/ChannelEventQueue.h"
Packit f0b94e
#include "nsBaseChannel.h"
Packit f0b94e
#include "nsIFTPChannel.h"
Packit f0b94e
#include "nsIUploadChannel.h"
Packit f0b94e
#include "nsIProxiedChannel.h"
Packit f0b94e
#include "nsIResumableChannel.h"
Packit f0b94e
#include "nsIChildChannel.h"
Packit f0b94e
#include "nsIDivertableChannel.h"
Packit f0b94e
#include "nsIEventTarget.h"
Packit f0b94e
Packit f0b94e
#include "nsIStreamListener.h"
Packit f0b94e
#include "PrivateBrowsingChannel.h"
Packit f0b94e
Packit f0b94e
class nsIEventTarget;
Packit f0b94e
Packit f0b94e
namespace mozilla {
Packit f0b94e
Packit f0b94e
namespace net {
Packit f0b94e
Packit f0b94e
// This class inherits logic from nsBaseChannel that is not needed for an
Packit f0b94e
// e10s child channel, but it works.  At some point we could slice up
Packit f0b94e
// nsBaseChannel and have a new class that has only the common logic for
Packit f0b94e
// nsFTPChannel/FTPChannelChild.
Packit f0b94e
Packit f0b94e
class FTPChannelChild final : public PFTPChannelChild,
Packit f0b94e
                              public nsBaseChannel,
Packit f0b94e
                              public nsIFTPChannel,
Packit f0b94e
                              public nsIUploadChannel,
Packit f0b94e
                              public nsIResumableChannel,
Packit f0b94e
                              public nsIProxiedChannel,
Packit f0b94e
                              public nsIChildChannel,
Packit f0b94e
                              public nsIDivertableChannel {
Packit f0b94e
 public:
Packit f0b94e
  typedef ::nsIStreamListener nsIStreamListener;
Packit f0b94e
Packit f0b94e
  NS_DECL_ISUPPORTS_INHERITED
Packit f0b94e
  NS_DECL_NSIFTPCHANNEL
Packit f0b94e
  NS_DECL_NSIUPLOADCHANNEL
Packit f0b94e
  NS_DECL_NSIRESUMABLECHANNEL
Packit f0b94e
  NS_DECL_NSIPROXIEDCHANNEL
Packit f0b94e
  NS_DECL_NSICHILDCHANNEL
Packit f0b94e
  NS_DECL_NSIDIVERTABLECHANNEL
Packit f0b94e
Packit f0b94e
  NS_IMETHOD Cancel(nsresult status) override;
Packit f0b94e
  NS_IMETHOD Suspend() override;
Packit f0b94e
  NS_IMETHOD Resume() override;
Packit f0b94e
Packit f0b94e
  explicit FTPChannelChild(nsIURI* uri);
Packit f0b94e
Packit f0b94e
  void AddIPDLReference();
Packit f0b94e
  void ReleaseIPDLReference();
Packit f0b94e
Packit f0b94e
  NS_IMETHOD AsyncOpen(nsIStreamListener* listener,
Packit f0b94e
                       nsISupports* aContext) override;
Packit f0b94e
Packit f0b94e
  // Note that we handle this ourselves, overriding the nsBaseChannel
Packit f0b94e
  // default behavior, in order to be e10s-friendly.
Packit f0b94e
  NS_IMETHOD IsPending(bool* result) override;
Packit f0b94e
Packit f0b94e
  nsresult OpenContentStream(bool async, nsIInputStream** stream,
Packit f0b94e
                             nsIChannel** channel) override;
Packit f0b94e
Packit f0b94e
  bool IsSuspended();
Packit f0b94e
Packit f0b94e
  void FlushedForDiversion();
Packit f0b94e
Packit f0b94e
 protected:
Packit f0b94e
  virtual ~FTPChannelChild();
Packit f0b94e
Packit f0b94e
  mozilla::ipc::IPCResult RecvOnStartRequest(const nsresult& aChannelStatus,
Packit f0b94e
                                             const int64_t& aContentLength,
Packit f0b94e
                                             const nsCString& aContentType,
Packit f0b94e
                                             const PRTime& aLastModified,
Packit f0b94e
                                             const nsCString& aEntityID,
Packit f0b94e
                                             const URIParams& aURI) override;
Packit f0b94e
  mozilla::ipc::IPCResult RecvOnDataAvailable(const nsresult& channelStatus,
Packit f0b94e
                                              const nsCString& data,
Packit f0b94e
                                              const uint64_t& offset,
Packit f0b94e
                                              const uint32_t& count) override;
Packit f0b94e
  mozilla::ipc::IPCResult RecvOnStopRequest(const nsresult& channelStatus,
Packit f0b94e
                                            const nsCString& aErrorMsg,
Packit f0b94e
                                            const bool& aUseUTF8) override;
Packit f0b94e
  mozilla::ipc::IPCResult RecvFailedAsyncOpen(
Packit f0b94e
      const nsresult& statusCode) override;
Packit f0b94e
  mozilla::ipc::IPCResult RecvFlushedForDiversion() override;
Packit f0b94e
  mozilla::ipc::IPCResult RecvDivertMessages() override;
Packit f0b94e
  mozilla::ipc::IPCResult RecvDeleteSelf() override;
Packit f0b94e
Packit f0b94e
  void DoOnStartRequest(const nsresult& aChannelStatus,
Packit f0b94e
                        const int64_t& aContentLength,
Packit f0b94e
                        const nsCString& aContentType,
Packit f0b94e
                        const PRTime& aLastModified, const nsCString& aEntityID,
Packit f0b94e
                        const URIParams& aURI);
Packit f0b94e
  void DoOnDataAvailable(const nsresult& channelStatus, const nsCString& data,
Packit f0b94e
                         const uint64_t& offset, const uint32_t& count);
Packit f0b94e
  void MaybeDivertOnData(const nsCString& data, const uint64_t& offset,
Packit f0b94e
                         const uint32_t& count);
Packit f0b94e
  void MaybeDivertOnStop(const nsresult& statusCode);
Packit f0b94e
  void DoOnStopRequest(const nsresult& statusCode, const nsCString& aErrorMsg,
Packit f0b94e
                       bool aUseUTF8);
Packit f0b94e
  void DoFailedAsyncOpen(const nsresult& statusCode);
Packit f0b94e
  void DoDeleteSelf();
Packit f0b94e
Packit f0b94e
  void SetupNeckoTarget() override;
Packit f0b94e
Packit f0b94e
  friend class FTPStartRequestEvent;
Packit f0b94e
  friend class FTPDataAvailableEvent;
Packit f0b94e
  friend class MaybeDivertOnDataFTPEvent;
Packit f0b94e
  friend class FTPStopRequestEvent;
Packit f0b94e
  friend class MaybeDivertOnStopFTPEvent;
Packit f0b94e
  friend class FTPFailedAsyncOpenEvent;
Packit f0b94e
  friend class FTPFlushedForDiversionEvent;
Packit f0b94e
  friend class FTPDeleteSelfEvent;
Packit f0b94e
  friend class NeckoTargetChannelEvent<FTPChannelChild>;
Packit f0b94e
Packit f0b94e
 private:
Packit f0b94e
  nsCOMPtr<nsIInputStream> mUploadStream;
Packit f0b94e
Packit f0b94e
  bool mIPCOpen;
Packit f0b94e
  RefPtr<ChannelEventQueue> mEventQ;
Packit f0b94e
Packit f0b94e
  // If nsUnknownDecoder is involved we queue onDataAvailable (and possibly
Packit f0b94e
  // OnStopRequest) so that we can divert them if needed when the listener's
Packit f0b94e
  // OnStartRequest is finally called
Packit f0b94e
  nsTArray<UniquePtr<ChannelEvent>> mUnknownDecoderEventQ;
Packit f0b94e
  bool mUnknownDecoderInvolved;
Packit f0b94e
Packit f0b94e
  bool mCanceled;
Packit f0b94e
  uint32_t mSuspendCount;
Packit f0b94e
  bool mIsPending;
Packit f0b94e
Packit f0b94e
  PRTime mLastModifiedTime;
Packit f0b94e
  uint64_t mStartPos;
Packit f0b94e
  nsCString mEntityID;
Packit f0b94e
Packit f0b94e
  // Once set, OnData and possibly OnStop will be diverted to the parent.
Packit f0b94e
  bool mDivertingToParent;
Packit f0b94e
  // Once set, no OnStart/OnData/OnStop callbacks should be received from the
Packit f0b94e
  // parent channel, nor dequeued from the ChannelEventQueue.
Packit f0b94e
  bool mFlushedForDiversion;
Packit f0b94e
  // Set if SendSuspend is called. Determines if SendResume is needed when
Packit f0b94e
  // diverting callbacks to parent.
Packit f0b94e
  bool mSuspendSent;
Packit f0b94e
};
Packit f0b94e
Packit f0b94e
inline bool FTPChannelChild::IsSuspended() { return mSuspendCount != 0; }
Packit f0b94e
Packit f0b94e
}  // namespace net
Packit f0b94e
}  // namespace mozilla
Packit f0b94e
Packit f0b94e
#endif  // mozilla_net_FTPChannelChild_h