diff -r 000000000000 -r 4f2f89ce4247 WebKit/win/WebURLAuthenticationChallenge.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/WebKit/win/WebURLAuthenticationChallenge.cpp Fri Sep 17 09:02:29 2010 +0300 @@ -0,0 +1,234 @@ +/* + * Copyright (C) 2007 Apple Inc. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "config.h" +#include "WebKitDLL.h" +#include "WebURLAuthenticationChallenge.h" + +#include "COMPtr.h" +#include "WebError.h" +#include "WebKit.h" +#include "WebURLAuthenticationChallengeSender.h" +#include "WebURLCredential.h" +#include "WebURLProtectionSpace.h" +#include "WebURLResponse.h" +#include "WebKit.h" + +#pragma warning(push, 0) +#include +#include +#pragma warning(pop) + +using namespace WebCore; + +// WebURLAuthenticationChallenge ---------------------------------------------------------------- + +WebURLAuthenticationChallenge::WebURLAuthenticationChallenge(const AuthenticationChallenge& authenticationChallenge, + IWebURLAuthenticationChallengeSender* sender) + : m_refCount(0) + , m_authenticationChallenge(authenticationChallenge) + , m_sender(sender) +{ + gClassCount++; + gClassNameCount.add("WebURLAuthenticationChallenge"); +} + +WebURLAuthenticationChallenge::~WebURLAuthenticationChallenge() +{ + gClassCount--; + gClassNameCount.remove("WebURLAuthenticationChallenge"); +} + +WebURLAuthenticationChallenge* WebURLAuthenticationChallenge::createInstance(const AuthenticationChallenge& authenticationChallenge) +{ + WebURLAuthenticationChallenge* instance = new WebURLAuthenticationChallenge(authenticationChallenge, 0); + instance->AddRef(); + return instance; +} + +WebURLAuthenticationChallenge* WebURLAuthenticationChallenge::createInstance(const AuthenticationChallenge& authenticationChallenge, + IWebURLAuthenticationChallengeSender* sender) +{ + WebURLAuthenticationChallenge* instance = new WebURLAuthenticationChallenge(authenticationChallenge, sender); + instance->AddRef(); + return instance; +} + +// IUnknown ------------------------------------------------------------------- + +HRESULT STDMETHODCALLTYPE WebURLAuthenticationChallenge::QueryInterface(REFIID riid, void** ppvObject) +{ + *ppvObject = 0; + if (IsEqualGUID(riid, IID_IUnknown)) + *ppvObject = static_cast(this); + else if (IsEqualGUID(riid, __uuidof(this))) + *ppvObject = static_cast(this); + else if (IsEqualGUID(riid, IID_IWebURLAuthenticationChallenge)) + *ppvObject = static_cast(this); + else + return E_NOINTERFACE; + + AddRef(); + return S_OK; +} + +ULONG STDMETHODCALLTYPE WebURLAuthenticationChallenge::AddRef(void) +{ + return ++m_refCount; +} + +ULONG STDMETHODCALLTYPE WebURLAuthenticationChallenge::Release(void) +{ + ULONG newRef = --m_refCount; + if (!newRef) + delete(this); + + return newRef; +} + +// IWebURLAuthenticationChallenge ------------------------------------------------------------------- + +HRESULT STDMETHODCALLTYPE WebURLAuthenticationChallenge::initWithProtectionSpace( + /* [in] */ IWebURLProtectionSpace* space, + /* [in] */ IWebURLCredential* proposedCredential, + /* [in] */ int previousFailureCount, + /* [in] */ IWebURLResponse* failureResponse, + /* [in] */ IWebError* error, + /* [in] */ IWebURLAuthenticationChallengeSender* sender) +{ + LOG_ERROR("Calling the ala carte init for WebURLAuthenticationChallenge - is this really what you want to do?"); + + if (!space || !proposedCredential || !failureResponse || !sender) + return E_POINTER; + + HRESULT hr = S_OK; + COMPtr webSpace; + hr = space->QueryInterface(&webSpace); + if (FAILED(hr)) + return hr; + + COMPtr webCredential(Query, proposedCredential); + if (!webCredential) + return E_NOINTERFACE; + + COMPtr webResponse; + hr = failureResponse->QueryInterface(&webResponse); + if (FAILED(hr)) + return hr; + + COMPtr webError; + hr = error->QueryInterface(CLSID_WebError, (void**)&webError); + if (FAILED(hr)) + return hr; + + COMPtr webSender(Query, sender); + if (!webSender) + return E_NOINTERFACE; + + // FIXME: After we change AuthenticationChallenge to use "ResourceHandle" as the abstract "Sender" or "Source of this Auth Challenge", then we'll + // construct the AuthenticationChallenge with that as obtained from the webSender +#if USE(CFNETWORK) + m_authenticationChallenge = AuthenticationChallenge(webSpace->protectionSpace(), webCredential->credential(), + previousFailureCount, webResponse->resourceResponse(), webError->resourceError()); +#endif + return S_OK; +} + +HRESULT STDMETHODCALLTYPE WebURLAuthenticationChallenge::initWithAuthenticationChallenge( + /* [in] */ IWebURLAuthenticationChallenge* challenge, + /* [in] */ IWebURLAuthenticationChallengeSender* sender) +{ + if (!challenge || !sender) + return E_POINTER; + + COMPtr webChallenge(Query, challenge); + if (!webChallenge) + return E_NOINTERFACE; + + COMPtr webSender(Query, sender); + if (!webSender) + return E_NOINTERFACE; + +#if USE(CFNETWORK) + m_authenticationChallenge = AuthenticationChallenge(webChallenge->authenticationChallenge().cfURLAuthChallengeRef(), webSender->authenticationClient()); + + return S_OK; +#else + + return E_FAIL; +#endif +} + +HRESULT STDMETHODCALLTYPE WebURLAuthenticationChallenge::error( + /* [out, retval] */ IWebError** result) +{ + *result = WebError::createInstance(m_authenticationChallenge.error()); + return S_OK; +} + +HRESULT STDMETHODCALLTYPE WebURLAuthenticationChallenge::failureResponse( + /* [out, retval] */ IWebURLResponse** result) +{ + *result = WebURLResponse::createInstance(m_authenticationChallenge.failureResponse()); + return S_OK; +} + +HRESULT STDMETHODCALLTYPE WebURLAuthenticationChallenge::previousFailureCount( + /* [out, retval] */ UINT* result) +{ + *result = m_authenticationChallenge.previousFailureCount(); + return S_OK; +} + +HRESULT STDMETHODCALLTYPE WebURLAuthenticationChallenge::proposedCredential( + /* [out, retval] */ IWebURLCredential** result) +{ + *result = WebURLCredential::createInstance(m_authenticationChallenge.proposedCredential()); + return S_OK; +} + +HRESULT STDMETHODCALLTYPE WebURLAuthenticationChallenge::protectionSpace( + /* [out, retval] */ IWebURLProtectionSpace** result) +{ + *result = WebURLProtectionSpace::createInstance(m_authenticationChallenge.protectionSpace()); + return S_OK; +} + +HRESULT STDMETHODCALLTYPE WebURLAuthenticationChallenge::sender( + /* [out, retval] */ IWebURLAuthenticationChallengeSender** sender) +{ + if (!m_sender) { + AuthenticationClient* client = m_authenticationChallenge.authenticationClient(); + m_sender.adoptRef(WebURLAuthenticationChallengeSender::createInstance(client)); + } + + return m_sender.copyRefTo(sender); +} + +// WebURLAuthenticationChallenge ------------------------------------------------------------------- +const AuthenticationChallenge& WebURLAuthenticationChallenge::authenticationChallenge() const +{ + return m_authenticationChallenge; +}