9d4664465575761176c9ff6fc1b2d514228ef26d
[WebKit-https.git] / 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 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 "WebError.h"
29 #include "WebKit.h"
30
31 #pragma warning(push, 0)
32 #include <WebCore/BString.h>
33 #pragma warning(pop)
34
35 using namespace WebCore;
36
37 // WebError ---------------------------------------------------------------------
38
39 WebError::WebError(const ResourceError& error, IPropertyBag* userInfo)
40     : m_refCount(0)
41     , m_error(error)
42     , m_userInfo(userInfo)
43 {
44     gClassCount++;
45 }
46
47 WebError::~WebError()
48 {
49     gClassCount--;
50 }
51
52 WebError* WebError::createInstance(const ResourceError& error, IPropertyBag* userInfo)
53 {
54     WebError* instance = new WebError(error, userInfo);
55     instance->AddRef();
56     return instance;
57 }
58
59 // IUnknown -------------------------------------------------------------------
60
61 HRESULT STDMETHODCALLTYPE WebError::QueryInterface(REFIID riid, void** ppvObject)
62 {
63     *ppvObject = 0;
64     if (IsEqualGUID(riid, IID_IUnknown))
65         *ppvObject = static_cast<IUnknown*>(this);
66     else if (IsEqualGUID(riid, CLSID_WebError))
67         *ppvObject = static_cast<WebError*>(this);
68     else if (IsEqualGUID(riid, IID_IWebError))
69         *ppvObject = static_cast<IWebError*>(this);
70     else
71         return E_NOINTERFACE;
72
73     AddRef();
74     return S_OK;
75 }
76
77 ULONG STDMETHODCALLTYPE WebError::AddRef(void)
78 {
79     return ++m_refCount;
80 }
81
82 ULONG STDMETHODCALLTYPE WebError::Release(void)
83 {
84     ULONG newRef = --m_refCount;
85     if (!newRef)
86         delete(this);
87
88     return newRef;
89 }
90
91 // IWebError ------------------------------------------------------------------
92
93 HRESULT STDMETHODCALLTYPE WebError::init( 
94     /* [in] */ BSTR domain,
95     /* [in] */ int code,
96     /* [in] */ BSTR url)
97 {
98     m_error = ResourceError(String(domain, SysStringLen(domain)), code, String(url, SysStringLen(url)), String());
99     return S_OK;
100 }
101   
102 HRESULT STDMETHODCALLTYPE WebError::code( 
103     /* [retval][out] */ int* result)
104 {
105     *result = m_error.errorCode();
106     return S_OK;
107 }
108         
109 HRESULT STDMETHODCALLTYPE WebError::domain( 
110     /* [retval][out] */ BSTR* result)
111 {
112     if (!result)
113         return E_POINTER;
114
115     *result = BString(m_error.domain()).release();
116     return S_OK;
117 }
118                
119 HRESULT STDMETHODCALLTYPE WebError::localizedDescription( 
120     /* [retval][out] */ BSTR* result)
121 {
122     if (!result)
123         return E_POINTER;
124
125     *result = BString(m_error.localizedDescription()).release();
126     return S_OK;
127 }
128
129         
130 HRESULT STDMETHODCALLTYPE WebError::localizedFailureReason( 
131     /* [retval][out] */ BSTR* /*result*/)
132 {
133     ASSERT_NOT_REACHED();
134     return E_NOTIMPL;
135 }
136         
137 HRESULT STDMETHODCALLTYPE WebError::localizedRecoveryOptions( 
138     /* [retval][out] */ IEnumVARIANT** /*result*/)
139 {
140     ASSERT_NOT_REACHED();
141     return E_NOTIMPL;
142 }
143         
144 HRESULT STDMETHODCALLTYPE WebError::localizedRecoverySuggestion( 
145     /* [retval][out] */ BSTR* /*result*/)
146 {
147     ASSERT_NOT_REACHED();
148     return E_NOTIMPL;
149 }
150        
151 HRESULT STDMETHODCALLTYPE WebError::recoverAttempter( 
152     /* [retval][out] */ IUnknown** /*result*/)
153 {
154     ASSERT_NOT_REACHED();
155     return E_NOTIMPL;
156 }
157         
158 HRESULT STDMETHODCALLTYPE WebError::userInfo( 
159     /* [retval][out] */ IPropertyBag** result)
160 {
161     if (!result)
162         return E_POINTER;
163     *result = 0;
164
165     if (!m_userInfo)
166         return E_FAIL;
167
168     return m_userInfo.copyRefTo(result);
169 }
170
171 HRESULT STDMETHODCALLTYPE WebError::failingURL( 
172     /* [retval][out] */ BSTR* result)
173 {
174     if (!result)
175         return E_POINTER;
176
177     *result = BString(m_error.failingURL()).release();
178     return S_OK;
179 }
180
181 HRESULT STDMETHODCALLTYPE WebError::isPolicyChangeError( 
182     /* [retval][out] */ BOOL *result)
183 {
184     if (!result)
185         return E_POINTER;
186
187     *result = m_error.domain() == String(WebKitErrorDomain)
188         && m_error.errorCode() == WebKitErrorFrameLoadInterruptedByPolicyChange;
189     return S_OK;
190 }
191
192 const ResourceError& WebError::resourceError() const
193 {
194     return m_error;
195 }