|
1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ |
|
2 /* vim: set sw=2 ts=8 et tw=80 : */ |
|
3 |
|
4 /* This Source Code Form is subject to the terms of the Mozilla Public |
|
5 * License, v. 2.0. If a copy of the MPL was not distributed with this |
|
6 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ |
|
7 |
|
8 #ifndef mozilla_net_FTPChannelChild_h |
|
9 #define mozilla_net_FTPChannelChild_h |
|
10 |
|
11 #include "mozilla/net/PFTPChannelChild.h" |
|
12 #include "mozilla/net/ChannelEventQueue.h" |
|
13 #include "nsBaseChannel.h" |
|
14 #include "nsIFTPChannel.h" |
|
15 #include "nsIUploadChannel.h" |
|
16 #include "nsIProxiedChannel.h" |
|
17 #include "nsIResumableChannel.h" |
|
18 #include "nsIChildChannel.h" |
|
19 #include "nsIDivertableChannel.h" |
|
20 |
|
21 #include "nsIStreamListener.h" |
|
22 #include "PrivateBrowsingChannel.h" |
|
23 |
|
24 namespace mozilla { |
|
25 namespace net { |
|
26 |
|
27 // This class inherits logic from nsBaseChannel that is not needed for an |
|
28 // e10s child channel, but it works. At some point we could slice up |
|
29 // nsBaseChannel and have a new class that has only the common logic for |
|
30 // nsFTPChannel/FTPChannelChild. |
|
31 |
|
32 class FTPChannelChild : public PFTPChannelChild |
|
33 , public nsBaseChannel |
|
34 , public nsIFTPChannel |
|
35 , public nsIUploadChannel |
|
36 , public nsIResumableChannel |
|
37 , public nsIProxiedChannel |
|
38 , public nsIChildChannel |
|
39 , public nsIDivertableChannel |
|
40 { |
|
41 public: |
|
42 typedef ::nsIStreamListener nsIStreamListener; |
|
43 |
|
44 NS_DECL_ISUPPORTS_INHERITED |
|
45 NS_DECL_NSIFTPCHANNEL |
|
46 NS_DECL_NSIUPLOADCHANNEL |
|
47 NS_DECL_NSIRESUMABLECHANNEL |
|
48 NS_DECL_NSIPROXIEDCHANNEL |
|
49 NS_DECL_NSICHILDCHANNEL |
|
50 NS_DECL_NSIDIVERTABLECHANNEL |
|
51 |
|
52 NS_IMETHOD Cancel(nsresult status); |
|
53 NS_IMETHOD Suspend(); |
|
54 NS_IMETHOD Resume(); |
|
55 |
|
56 FTPChannelChild(nsIURI* uri); |
|
57 virtual ~FTPChannelChild(); |
|
58 |
|
59 void AddIPDLReference(); |
|
60 void ReleaseIPDLReference(); |
|
61 |
|
62 NS_IMETHOD AsyncOpen(nsIStreamListener* listener, nsISupports* aContext); |
|
63 |
|
64 // Note that we handle this ourselves, overriding the nsBaseChannel |
|
65 // default behavior, in order to be e10s-friendly. |
|
66 NS_IMETHOD IsPending(bool* result); |
|
67 |
|
68 nsresult OpenContentStream(bool async, |
|
69 nsIInputStream** stream, |
|
70 nsIChannel** channel) MOZ_OVERRIDE; |
|
71 |
|
72 bool IsSuspended(); |
|
73 |
|
74 void FlushedForDiversion(); |
|
75 |
|
76 protected: |
|
77 bool RecvOnStartRequest(const nsresult& aChannelStatus, |
|
78 const int64_t& aContentLength, |
|
79 const nsCString& aContentType, |
|
80 const PRTime& aLastModified, |
|
81 const nsCString& aEntityID, |
|
82 const URIParams& aURI) MOZ_OVERRIDE; |
|
83 bool RecvOnDataAvailable(const nsresult& channelStatus, |
|
84 const nsCString& data, |
|
85 const uint64_t& offset, |
|
86 const uint32_t& count) MOZ_OVERRIDE; |
|
87 bool RecvOnStopRequest(const nsresult& channelStatus) MOZ_OVERRIDE; |
|
88 bool RecvFailedAsyncOpen(const nsresult& statusCode) MOZ_OVERRIDE; |
|
89 bool RecvFlushedForDiversion() MOZ_OVERRIDE; |
|
90 bool RecvDivertMessages() MOZ_OVERRIDE; |
|
91 bool RecvDeleteSelf() MOZ_OVERRIDE; |
|
92 |
|
93 void DoOnStartRequest(const nsresult& aChannelStatus, |
|
94 const int64_t& aContentLength, |
|
95 const nsCString& aContentType, |
|
96 const PRTime& aLastModified, |
|
97 const nsCString& aEntityID, |
|
98 const URIParams& aURI); |
|
99 void DoOnDataAvailable(const nsresult& channelStatus, |
|
100 const nsCString& data, |
|
101 const uint64_t& offset, |
|
102 const uint32_t& count); |
|
103 void DoOnStopRequest(const nsresult& statusCode); |
|
104 void DoFailedAsyncOpen(const nsresult& statusCode); |
|
105 void DoDeleteSelf(); |
|
106 |
|
107 friend class FTPStartRequestEvent; |
|
108 friend class FTPDataAvailableEvent; |
|
109 friend class FTPStopRequestEvent; |
|
110 friend class FTPFailedAsyncOpenEvent; |
|
111 friend class FTPDeleteSelfEvent; |
|
112 |
|
113 private: |
|
114 nsCOMPtr<nsIInputStream> mUploadStream; |
|
115 |
|
116 bool mIPCOpen; |
|
117 nsRefPtr<ChannelEventQueue> mEventQ; |
|
118 bool mCanceled; |
|
119 uint32_t mSuspendCount; |
|
120 bool mIsPending; |
|
121 bool mWasOpened; |
|
122 |
|
123 PRTime mLastModifiedTime; |
|
124 uint64_t mStartPos; |
|
125 nsCString mEntityID; |
|
126 |
|
127 // Once set, OnData and possibly OnStop will be diverted to the parent. |
|
128 bool mDivertingToParent; |
|
129 // Once set, no OnStart/OnData/OnStop callbacks should be received from the |
|
130 // parent channel, nor dequeued from the ChannelEventQueue. |
|
131 bool mFlushedForDiversion; |
|
132 // Set if SendSuspend is called. Determines if SendResume is needed when |
|
133 // diverting callbacks to parent. |
|
134 bool mSuspendSent; |
|
135 }; |
|
136 |
|
137 inline bool |
|
138 FTPChannelChild::IsSuspended() |
|
139 { |
|
140 return mSuspendCount != 0; |
|
141 } |
|
142 |
|
143 } // namespace net |
|
144 } // namespace mozilla |
|
145 |
|
146 #endif // mozilla_net_FTPChannelChild_h |