Progress towards building AppleWin with CMake
[WebKit-https.git] / Source / WebKit / win / WebError.cpp
1 /*
2  * Copyright (C) 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 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 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 "WebKitDLL.h"
27 #include "WebError.h"
28 #include "WebKit.h"
29
30 #include <WebCore/BString.h>
31
32 #if USE(CG)
33 #include <CoreGraphics/CoreGraphics.h>
34 #endif
35
36 #if USE(CFNETWORK)
37 #include <WebKitSystemInterface/WebKitSystemInterface.h>
38 #endif
39
40 using namespace WebCore;
41
42 // WebError ---------------------------------------------------------------------
43
44 WebError::WebError(const ResourceError& error, IPropertyBag* userInfo)
45     : m_refCount(0)
46     , m_error(error)
47     , m_userInfo(userInfo)
48 {
49     gClassCount++;
50     gClassNameCount().add("WebError");
51 }
52
53 WebError::~WebError()
54 {
55     gClassCount--;
56     gClassNameCount().remove("WebError");
57 }
58
59 WebError* WebError::createInstance(const ResourceError& error, IPropertyBag* userInfo)
60 {
61     WebError* instance = new WebError(error, userInfo);
62     instance->AddRef();
63     return instance;
64 }
65
66 WebError* WebError::createInstance()
67 {
68     return createInstance(ResourceError());
69 }
70
71 // IUnknown -------------------------------------------------------------------
72
73 HRESULT STDMETHODCALLTYPE WebError::QueryInterface(REFIID riid, void** ppvObject)
74 {
75     *ppvObject = 0;
76     if (IsEqualGUID(riid, IID_IUnknown))
77         *ppvObject = static_cast<IWebError*>(this);
78     else if (IsEqualGUID(riid, CLSID_WebError))
79         *ppvObject = static_cast<WebError*>(this);
80     else if (IsEqualGUID(riid, IID_IWebError))
81         *ppvObject = static_cast<IWebError*>(this);
82     else if (IsEqualGUID(riid, IID_IWebErrorPrivate))
83         *ppvObject = static_cast<IWebErrorPrivate*>(this);
84     else
85         return E_NOINTERFACE;
86
87     AddRef();
88     return S_OK;
89 }
90
91 ULONG STDMETHODCALLTYPE WebError::AddRef(void)
92 {
93     return ++m_refCount;
94 }
95
96 ULONG STDMETHODCALLTYPE WebError::Release(void)
97 {
98     ULONG newRef = --m_refCount;
99     if (!newRef)
100         delete(this);
101
102     return newRef;
103 }
104
105 // IWebError ------------------------------------------------------------------
106
107 HRESULT STDMETHODCALLTYPE WebError::init( 
108     /* [in] */ BSTR domain,
109     /* [in] */ int code,
110     /* [in] */ BSTR url)
111 {
112     m_error = ResourceError(String(domain, SysStringLen(domain)), code, String(url, SysStringLen(url)), String());
113     return S_OK;
114 }
115   
116 HRESULT STDMETHODCALLTYPE WebError::code( 
117     /* [retval][out] */ int* result)
118 {
119     *result = m_error.errorCode();
120     return S_OK;
121 }
122         
123 HRESULT STDMETHODCALLTYPE WebError::domain( 
124     /* [retval][out] */ BSTR* result)
125 {
126     if (!result)
127         return E_POINTER;
128
129     *result = BString(m_error.domain()).release();
130     return S_OK;
131 }
132                
133 HRESULT STDMETHODCALLTYPE WebError::localizedDescription( 
134     /* [retval][out] */ BSTR* result)
135 {
136     if (!result)
137         return E_POINTER;
138
139     *result = BString(m_error.localizedDescription()).release();
140
141 #if USE(CFNETWORK)
142     if (!*result) {
143         if (int code = m_error.errorCode())
144             *result = BString(wkCFNetworkErrorGetLocalizedDescription(code)).release();
145     }
146 #endif
147
148     return S_OK;
149 }
150
151         
152 HRESULT STDMETHODCALLTYPE WebError::localizedFailureReason( 
153     /* [retval][out] */ BSTR* /*result*/)
154 {
155     ASSERT_NOT_REACHED();
156     return E_NOTIMPL;
157 }
158         
159 HRESULT STDMETHODCALLTYPE WebError::localizedRecoveryOptions( 
160     /* [retval][out] */ IEnumVARIANT** /*result*/)
161 {
162     ASSERT_NOT_REACHED();
163     return E_NOTIMPL;
164 }
165         
166 HRESULT STDMETHODCALLTYPE WebError::localizedRecoverySuggestion( 
167     /* [retval][out] */ BSTR* /*result*/)
168 {
169     ASSERT_NOT_REACHED();
170     return E_NOTIMPL;
171 }
172        
173 HRESULT STDMETHODCALLTYPE WebError::recoverAttempter( 
174     /* [retval][out] */ IUnknown** /*result*/)
175 {
176     ASSERT_NOT_REACHED();
177     return E_NOTIMPL;
178 }
179         
180 HRESULT STDMETHODCALLTYPE WebError::userInfo( 
181     /* [retval][out] */ IPropertyBag** result)
182 {
183     if (!result)
184         return E_POINTER;
185     *result = 0;
186
187     if (!m_userInfo)
188         return E_FAIL;
189
190     return m_userInfo.copyRefTo(result);
191 }
192
193 HRESULT STDMETHODCALLTYPE WebError::failingURL( 
194     /* [retval][out] */ BSTR* result)
195 {
196     if (!result)
197         return E_POINTER;
198
199     *result = BString(m_error.failingURL()).release();
200     return S_OK;
201 }
202
203 HRESULT STDMETHODCALLTYPE WebError::isPolicyChangeError( 
204     /* [retval][out] */ BOOL *result)
205 {
206     if (!result)
207         return E_POINTER;
208
209     *result = m_error.domain() == String(WebKitErrorDomain)
210         && m_error.errorCode() == WebKitErrorFrameLoadInterruptedByPolicyChange;
211     return S_OK;
212 }
213
214 HRESULT WebError::sslPeerCertificate(/* [retval][out] */ ULONG_PTR* result)
215 {
216     if (!result)
217         return E_POINTER;
218     *result = 0;
219
220 #if USE(CFNETWORK)
221     if (!m_cfErrorUserInfoDict) {
222         // copy userinfo from CFErrorRef
223         CFErrorRef cfError = m_error;
224         m_cfErrorUserInfoDict = adoptCF(CFErrorCopyUserInfo(cfError));
225     }
226
227     if (!m_cfErrorUserInfoDict)
228         return E_FAIL;
229
230     void* data = wkGetSSLPeerCertificateDataBytePtr(m_cfErrorUserInfoDict.get());
231     if (!data)
232         return E_FAIL;
233     *result = reinterpret_cast<ULONG_PTR>(data);
234 #endif
235     return *result ? S_OK : E_FAIL;
236 }
237
238 const ResourceError& WebError::resourceError() const
239 {
240     return m_error;
241 }