Part 2 of removing PlatformString.h, remove PlatformString.h
[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 "ProtectionSpace.h"
24 #include "ResourceHandle.h"
25 #include "ResourceResponse.h"
26 #include "Timer.h"
27
28 #include <network/FilterStream.h>
29 #include <wtf/OwnPtr.h>
30 #include <wtf/RefPtr.h>
31 #include <wtf/text/WTFString.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     int cancelJob();
64     bool isDeferringLoading() const { return m_deferLoadingCount > 0; }
65     void updateDeferLoadingCount(int delta);
66     virtual void notifyStatusReceived(int status, const char* message);
67     void handleNotifyStatusReceived(int status, const String& message);
68     virtual void notifyHeadersReceived(BlackBerry::Platform::NetworkRequest::HeaderList& headers);
69     virtual void notifyMultipartHeaderReceived(const char* key, const char* value);
70     virtual void notifyAuthReceived(BlackBerry::Platform::NetworkRequest::AuthType, const char* realm, bool success, bool requireCredentials);
71     // notifyStringHeaderReceived exists only to resolve ambiguity between char* and String parameters
72     void notifyStringHeaderReceived(const String& key, const String& value);
73     void handleNotifyHeaderReceived(const String& key, const String& value);
74     void handleNotifyMultipartHeaderReceived(const String& key, const String& value);
75     void handleSetCookieHeader(const String& value);
76     void notifyDataReceivedPlain(const char* buf, size_t len);
77     void handleNotifyDataReceived(const char* buf, size_t len);
78     virtual void notifyDataSent(unsigned long long bytesSent, unsigned long long totalBytesToBeSent);
79     void handleNotifyDataSent(unsigned long long bytesSent, unsigned long long totalBytesToBeSent);
80     virtual void notifyClose(int status);
81     void handleNotifyClose(int status);
82     virtual int status() const { return m_extendedStatusCode; }
83
84 private:
85     bool isClientAvailable() const { return !m_cancelled && m_handle && m_handle->client(); }
86
87     virtual void notifyDataReceived(BlackBerry::Platform::NetworkBuffer* buffer)
88     {
89         notifyDataReceivedPlain(BlackBerry::Platform::networkBufferData(buffer), BlackBerry::Platform::networkBufferDataLength(buffer));
90     }
91
92     virtual void setWasDiskCached(bool value)
93     {
94        m_response.setWasCached(value);
95     }
96
97     bool shouldSendClientData() const;
98
99     bool shouldReleaseClientResource();
100     bool shouldNotifyClientFailed() const;
101
102     bool shouldDeferLoading() const
103     {
104         return isDeferringLoading() || m_deferredData.hasDeferredData();
105     }
106
107     bool retryAsFTPDirectory();
108
109     bool startNewJobWithRequest(ResourceRequest& newRequest, bool increasRedirectCount = false);
110
111     bool handleRedirect();
112
113     // 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
114     void sendResponseIfNeeded();
115     void sendMultipartResponseIfNeeded();
116
117     void fireDeleteJobTimer(Timer<NetworkJob>*);
118
119     bool handleFTPHeader(const String& header);
120
121     // The server needs authentication credentials. Search in the CredentialStorage
122     // or prompt the user via dialog, then resend the request with the credentials.
123     bool sendRequestWithCredentials(ProtectionSpaceServerType, ProtectionSpaceAuthenticationScheme, const String& realm, bool requireCredentials = true);
124
125     void storeCredentials();
126
127     void purgeCredentials();
128
129     bool isError(int statusCode) const
130     {
131         return statusCode < 0 || (400 <= statusCode && statusCode < 600);
132     }
133
134 private:
135     int m_playerId;
136     String m_pageGroupName;
137     RefPtr<ResourceHandle> m_handle;
138     ResourceResponse m_response;
139     OwnPtr<ResourceResponse> m_multipartResponse;
140     Timer<NetworkJob> m_deleteJobTimer;
141     String m_contentType;
142     String m_sniffedMimeType;
143     String m_contentDisposition;
144     BlackBerry::Platform::NetworkStreamFactory* m_streamFactory;
145     bool m_isFile;
146     bool m_isFTP;
147     bool m_isFTPDir;
148 #ifndef NDEBUG
149     bool m_isRunning;
150 #endif
151     bool m_cancelled;
152     bool m_statusReceived;
153     bool m_dataReceived;
154     bool m_responseSent;
155     bool m_callingClient;
156     bool m_needsRetryAsFTPDirectory;
157     bool m_isOverrideContentType;
158     bool m_newJobWithCredentialsStarted;
159
160     // If an HTTP status code is received, m_extendedStatusCode and m_response.httpStatusCode will both be set to it.
161     // If a platform error code is received, m_extendedStatusCode will be set to it and m_response.httpStatusCode will be set to 404.
162     int m_extendedStatusCode;
163
164     int m_redirectCount;
165
166     DeferredData m_deferredData;
167     int m_deferLoadingCount;
168     const Frame* m_frame;
169 };
170
171 } // namespace WebCore
172
173 #endif // NetworkJob_h