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