b2b719bce53b48693642b72a248dde4fddb74f6c
[WebKit-https.git] / WebKit / win / WebDataSource.cpp
1 /*
2  * Copyright (C) 2006, 2007 Apple Inc.  All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
24  */
25
26 #include "config.h"
27 #include "WebKitDLL.h"
28 #include "WebDataSource.h"
29
30 #include "IWebMutableURLRequest.h"
31 #include "MemoryStream.h"
32 #include "WebDocumentLoader.h"
33 #include "WebError.h"
34 #include "WebFrame.h"
35 #include "WebKit.h"
36 #include "WebHTMLRepresentation.h"
37 #include "WebKitStatisticsPrivate.h"
38 #include "WebMutableURLRequest.h"
39 #include "WebResource.h"
40 #include "WebURLResponse.h"
41
42 #pragma warning(push, 0)
43 #include <WebCore/BString.h>
44 #include <WebCore/DocLoader.h>
45 #include <WebCore/Document.h>
46 #include <WebCore/FrameLoader.h>
47 #include <WebCore/KURL.h>
48 #pragma warning(pop)
49
50 using namespace WebCore;
51
52 // WebDataSource ----------------------------------------------------------------
53
54 // {F230854D-7091-428a-8DB5-37CABA44C105}
55 const GUID IID_WebDataSource = 
56 { 0x5c2f9099, 0xe65e, 0x4a0f, { 0x9c, 0xa0, 0x6a, 0xd6, 0x92, 0x52, 0xa6, 0x2a } };
57
58 WebDataSource::WebDataSource(WebDocumentLoader* loader)
59     : m_refCount(0)
60     , m_loader(loader)
61 {
62     WebDataSourceCount++;
63     gClassCount++;
64 }
65
66 WebDataSource::~WebDataSource()
67 {
68     WebDataSourceCount--;
69     gClassCount--;
70 }
71
72 WebDataSource* WebDataSource::createInstance(WebDocumentLoader* loader)
73 {
74     WebDataSource* instance = new WebDataSource(loader);
75     instance->AddRef();
76     return instance;
77 }
78
79 WebDocumentLoader* WebDataSource::documentLoader() const
80 {
81     return m_loader;
82 }
83
84 // IWebDataSourcePrivate ------------------------------------------------------
85
86 HRESULT STDMETHODCALLTYPE WebDataSource::overrideEncoding( 
87     /* [retval][out] */ BSTR* /*encoding*/)
88 {
89     ASSERT_NOT_REACHED();
90     return E_NOTIMPL;
91 }
92
93 HRESULT STDMETHODCALLTYPE WebDataSource::setOverrideEncoding( 
94     /* [in] */ BSTR /*encoding*/)
95 {
96     ASSERT_NOT_REACHED();
97     return E_NOTIMPL;
98 }
99
100 HRESULT STDMETHODCALLTYPE WebDataSource::mainDocumentError(
101         /* [retval][out] */ IWebError** error)
102 {
103     if (!error) {
104         ASSERT_NOT_REACHED();
105         return E_POINTER;
106     }
107
108     *error = 0;
109
110     if (!m_loader)
111         return E_FAIL;
112
113     if (m_loader->mainDocumentError().isNull())
114         return S_OK;
115
116     *error = WebError::createInstance(m_loader->mainDocumentError());
117     return S_OK;
118 }
119
120 // IUnknown -------------------------------------------------------------------
121
122 HRESULT STDMETHODCALLTYPE WebDataSource::QueryInterface(REFIID riid, void** ppvObject)
123 {
124     *ppvObject = 0;
125     if (IsEqualGUID(riid, IID_WebDataSource))
126         *ppvObject = this;
127     else if (IsEqualGUID(riid, IID_IUnknown))
128         *ppvObject = static_cast<IWebDataSource*>(this);
129     else if (IsEqualGUID(riid, IID_IWebDataSource))
130         *ppvObject = static_cast<IWebDataSource*>(this);
131     else if (IsEqualGUID(riid, IID_IWebDataSourcePrivate))
132         *ppvObject = static_cast<IWebDataSourcePrivate*>(this);
133     else
134         return E_NOINTERFACE;
135
136     AddRef();
137     return S_OK;
138 }
139
140 ULONG STDMETHODCALLTYPE WebDataSource::AddRef(void)
141 {
142     return ++m_refCount;
143 }
144
145 ULONG STDMETHODCALLTYPE WebDataSource::Release(void)
146 {
147     ULONG newRef = --m_refCount;
148     if (!newRef)
149         delete(this);
150
151     return newRef;
152 }
153
154 // IWebDataSource --------------------------------------------------------------
155
156 HRESULT STDMETHODCALLTYPE WebDataSource::initWithRequest( 
157     /* [in] */ IWebURLRequest* /*request*/)
158 {
159     ASSERT_NOT_REACHED();
160     return E_NOTIMPL;
161 }
162
163 HRESULT STDMETHODCALLTYPE WebDataSource::data( 
164     /* [retval][out] */ IStream** stream)
165 {
166     *stream = 0;
167     if (!m_loader)
168         return E_FAIL;
169
170     *stream = MemoryStream::createInstance(m_loader->mainResourceData());
171     return S_OK;
172 }
173
174 HRESULT STDMETHODCALLTYPE WebDataSource::representation( 
175     /* [retval][out] */ IWebDocumentRepresentation** rep)
176 {
177     HRESULT hr = S_OK;
178     if (!m_representation) {
179         WebHTMLRepresentation* htmlRep = WebHTMLRepresentation::createInstance(static_cast<WebFrame*>(m_loader->frameLoader()->client()));
180         hr = htmlRep->QueryInterface(IID_IWebDocumentRepresentation, (void**) &m_representation);
181         htmlRep->Release();
182     }
183
184     return m_representation.copyRefTo(rep);
185 }
186
187 HRESULT STDMETHODCALLTYPE WebDataSource::webFrame( 
188     /* [retval][out] */ IWebFrame** frame)
189 {
190     *frame = static_cast<WebFrame*>(m_loader->frameLoader()->client());
191     (*frame)->AddRef();
192     return S_OK;
193 }
194
195 HRESULT STDMETHODCALLTYPE WebDataSource::initialRequest( 
196     /* [retval][out] */ IWebURLRequest** request)
197 {
198     *request = WebMutableURLRequest::createInstance(m_loader->initialRequest());
199     return S_OK;
200 }
201
202 HRESULT STDMETHODCALLTYPE WebDataSource::request( 
203     /* [retval][out] */ IWebMutableURLRequest** request)
204 {
205     *request = WebMutableURLRequest::createInstance(m_loader->request());
206     return S_OK;
207 }
208
209 HRESULT STDMETHODCALLTYPE WebDataSource::response( 
210     /* [retval][out] */ IWebURLResponse** response)
211 {
212     *response = WebURLResponse::createInstance(m_loader->response());
213     return S_OK;
214 }
215
216 HRESULT STDMETHODCALLTYPE WebDataSource::textEncodingName( 
217     /* [retval][out] */ BSTR* name)
218 {
219     String encoding = m_loader->overrideEncoding();
220     if (encoding.isNull())
221         encoding = m_loader->response().textEncodingName();
222
223     *name = BString(encoding).release();
224
225     return S_OK;
226 }
227
228 HRESULT STDMETHODCALLTYPE WebDataSource::isLoading( 
229     /* [retval][out] */ BOOL* loading)
230 {
231     *loading = m_loader->isLoadingInAPISense();
232     return S_OK;
233 }
234
235 HRESULT STDMETHODCALLTYPE WebDataSource::pageTitle( 
236     /* [retval][out] */ BSTR* title)
237 {
238     *title = BString(m_loader->title()).release();
239     return S_OK;
240 }
241
242 HRESULT STDMETHODCALLTYPE WebDataSource::unreachableURL( 
243     /* [retval][out] */ BSTR* url)
244 {
245     KURL unreachableURL = m_loader->unreachableURL();
246     BString urlString((LPOLESTR)unreachableURL.url().unicode(), unreachableURL.url().length());
247
248     *url = urlString.release();
249     return S_OK;
250 }
251
252 HRESULT STDMETHODCALLTYPE WebDataSource::webArchive( 
253     /* [retval][out] */ IWebArchive** /*archive*/)
254 {
255     ASSERT_NOT_REACHED();
256     return E_NOTIMPL;
257 }
258
259 HRESULT STDMETHODCALLTYPE WebDataSource::mainResource( 
260     /* [retval][out] */ IWebResource** /*resource*/)
261 {
262     ASSERT_NOT_REACHED();
263     return E_NOTIMPL;
264 }
265
266 HRESULT STDMETHODCALLTYPE WebDataSource::subresources( 
267     /* [retval][out] */ IEnumVARIANT** /*result*/)
268 {
269     ASSERT_NOT_REACHED();
270     return E_NOTIMPL;
271 }
272
273 HRESULT STDMETHODCALLTYPE WebDataSource::subresourceForURL( 
274     /* [in] */ BSTR url,
275     /* [retval][out] */ IWebResource** resource)
276 {
277     if (!resource) {
278         ASSERT_NOT_REACHED();
279         return E_POINTER;
280     }
281
282     *resource = 0;
283
284     Document *doc = m_loader->frameLoader()->frame()->document();
285
286     if (!doc)
287         return E_FAIL;
288
289     CachedResource *cachedResource = doc->docLoader()->cachedResource(String(url));
290
291     if (!cachedResource)
292         return E_FAIL;
293
294     *resource = WebResource::createInstance(cachedResource->data(), cachedResource->response());
295     return S_OK;
296 }
297
298 HRESULT STDMETHODCALLTYPE WebDataSource::addSubresource( 
299     /* [in] */ IWebResource* /*subresource*/)
300 {
301     ASSERT_NOT_REACHED();
302     return E_NOTIMPL;
303 }