[BlackBerry] Update NetworkJob to accept batched headers
[WebKit-https.git] / Source / WebCore / platform / network / blackberry / NetworkJob.h
1 /*
2  * Copyright (C) 2009, 2010, 2011 Research In Motion Limited. All rights reserved.
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with this library; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
17  */
18
19 #ifndef NetworkJob_h
20 #define NetworkJob_h
21
22 #include "DeferredData.h"
23 #include "PlatformString.h"
24 #include "ProtectionSpace.h"
25 #include "ResourceHandle.h"
26 #include "ResourceResponse.h"
27 #include "Timer.h"
28
29 #include <network/FilterStream.h>
30 #include <wtf/OwnPtr.h>
31 #include <wtf/RefPtr.h>
32
33 namespace BlackBerry {
34 namespace Platform {
35 class NetworkRequest;
36 class NetworkStreamFactory;
37 }
38 }
39
40 namespace WebCore {
41
42 class Frame;
43 class KURL;
44 class ResourceRequest;
45
46 class NetworkJob : public BlackBerry::Platform::FilterStream {
47 public:
48     NetworkJob();
49     bool initialize(int playerId,
50                     const String& pageGroupName,
51                     const KURL&,
52                     const BlackBerry::Platform::NetworkRequest&,
53                     PassRefPtr<ResourceHandle>,
54                     BlackBerry::Platform::NetworkStreamFactory*,
55                     const Frame&,
56                     int deferLoadingCount,
57                     int redirectCount);
58     PassRefPtr<ResourceHandle> handle() const { return m_handle; }
59 #ifndef NDEBUG
60     bool isRunning() const { return m_isRunning; }
61 #endif
62     bool isCancelled() const { return m_cancelled; }
63     void loadDataURL() { m_loadDataTimer.startOneShot(0); }
64     void loadAboutURL();
65     int cancelJob();
66     bool isDeferringLoading() const { return m_deferLoadingCount > 0; }
67     void updateDeferLoadingCount(int delta);
68     virtual void notifyStatusReceived(int status, const char* message);
69     void handleNotifyStatusReceived(int status, const String& message);
70     virtual void notifyWMLOverride();
71     void handleNotifyWMLOverride() { m_response.setIsWML(true); }
72     virtual void notifyHeadersReceived(BlackBerry::Platform::NetworkRequest::HeaderList& headers);
73     virtual void notifyMultipartHeaderReceived(const char* key, const char* value);
74     // Exists only to resolve ambiguity between char* and String parameters
75     void notifyStringHeaderReceived(const String& key, const String& value);
76     void handleNotifyHeaderReceived(const String& key, const String& value);
77     void handleNotifyMultipartHeaderReceived(const String& key, const String& value);
78     void handleSetCookieHeader(const String& value);
79     void notifyDataReceivedPlain(const char* buf, size_t len);
80     void handleNotifyDataReceived(const char* buf, size_t len);
81     virtual void notifyDataSent(unsigned long long bytesSent, unsigned long long totalBytesToBeSent);
82     void handleNotifyDataSent(unsigned long long bytesSent, unsigned long long totalBytesToBeSent);
83     virtual void notifyClose(int status);
84     void handleNotifyClose(int status);
85
86 private:
87     bool isClientAvailable() const { return !m_cancelled && m_handle && m_handle->client(); }
88
89     virtual void notifyDataReceived(BlackBerry::Platform::NetworkBuffer* buffer)
90     {
91         notifyDataReceivedPlain(BlackBerry::Platform::networkBufferData(buffer), BlackBerry::Platform::networkBufferDataLength(buffer));
92     }
93
94     virtual void setWasDiskCached(bool value)
95     {
96        m_response.setWasCached(value);
97     }
98
99     bool shouldSendClientData() const;
100
101     bool shouldNotifyClientFinished();
102
103     bool shouldDeferLoading() const
104     {
105         return isDeferringLoading() || m_deferredData.hasDeferredData();
106     }
107
108     bool retryAsFTPDirectory();
109
110     bool startNewJobWithRequest(ResourceRequest& newRequest, bool increasRedirectCount = false);
111
112     bool handleRedirect();
113
114     // This can cause m_cancelled to be set to true, if it passes up an error to m_handle->client() which causes the job to be cancelled
115     void sendResponseIfNeeded();
116     void sendMultipartResponseIfNeeded();
117
118     void fireLoadDataTimer(Timer<NetworkJob>*)
119     {
120         parseData();
121     }
122
123     void fireLoadAboutTimer(Timer<NetworkJob>*)
124     {
125         handleAbout();
126     }
127
128     void fireDeleteJobTimer(Timer<NetworkJob>*);
129
130     void parseData();
131
132     void handleAbout();
133
134     // The server needs authentication credentials. Search in the
135     // CredentialStorage or prompt the user via dialog.
136     bool handleAuthHeader(const ProtectionSpaceServerType, const String& header);
137
138     bool handleFTPHeader(const String& header);
139
140     bool sendRequestWithCredentials(ProtectionSpaceServerType, ProtectionSpaceAuthenticationScheme, const String& realm);
141
142     void storeCredentials();
143
144     void purgeCredentials();
145
146     bool isError(int statusCode)
147     {
148         return statusCode < 0 || (!m_isXHR && (400 <= statusCode && statusCode < 600));
149     }
150
151 private:
152     int m_playerId;
153     String m_pageGroupName;
154     RefPtr<ResourceHandle> m_handle;
155     ResourceResponse m_response;
156     Timer<NetworkJob> m_loadDataTimer;
157     Timer<NetworkJob> m_loadAboutTimer;
158     OwnPtr<ResourceResponse> m_multipartResponse;
159     Timer<NetworkJob> m_deleteJobTimer;
160     String m_contentType;
161     String m_sniffedMimeType;
162     String m_contentDisposition;
163     BlackBerry::Platform::NetworkStreamFactory* m_streamFactory;
164     bool m_isFile;
165     bool m_isData;
166     bool m_isAbout;
167     bool m_isFTP;
168     bool m_isFTPDir;
169 #ifndef NDEBUG
170     bool m_isRunning;
171 #endif
172     bool m_cancelled;
173     bool m_statusReceived;
174     bool m_dataReceived;
175     bool m_responseSent;
176     bool m_callingClient;
177     bool m_isXHR; // FIXME - After 7.0, remove this. Only the Qt port reports HTTP error statuses as didFails, so we probably shouldn't.
178     bool m_needsRetryAsFTPDirectory;
179     bool m_isOverrideContentType;
180
181     // If an HTTP status code is received, m_extendedStatusCode and m_response.httpStatusCode will both be set to it.
182     // If a platform error code is received, m_extendedStatusCode will be set to it and m_response.httpStatusCode will be set to 404.
183     int m_extendedStatusCode;
184
185     int m_redirectCount;
186
187     DeferredData m_deferredData;
188     int m_deferLoadingCount;
189     const Frame* m_frame;
190 };
191
192 } // namespace WebCore
193
194 #endif // NetworkJob_h