1/* 2 * Copyright (C) 2008 Brent Fulgham <bfulgham@gmail.com>. 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 "WebDownload.h" 29 30#include "DefaultDownloadDelegate.h" 31#include "MarshallingHelpers.h" 32#include "WebError.h" 33#include "WebKit.h" 34#include "WebKitLogging.h" 35#include "WebMutableURLRequest.h" 36#include "WebURLAuthenticationChallenge.h" 37#include "WebURLCredential.h" 38#include "WebURLResponse.h" 39 40#include <wtf/platform.h> 41#include <wtf/text/CString.h> 42 43#include <io.h> 44#include <sys/stat.h> 45#include <sys/types.h> 46 47#include <WebCore/BString.h> 48#include <WebCore/NotImplemented.h> 49#include <WebCore/ResourceError.h> 50#include <WebCore/ResourceHandle.h> 51#include <WebCore/ResourceRequest.h> 52#include <WebCore/ResourceResponse.h> 53 54using namespace WebCore; 55 56// WebDownload ---------------------------------------------------------------- 57 58void WebDownload::init(ResourceHandle* handle, const ResourceRequest& request, const ResourceResponse& response, IWebDownloadDelegate* delegate) 59{ 60 notImplemented(); 61} 62 63void WebDownload::init(const KURL& url, IWebDownloadDelegate* delegate) 64{ 65 m_delegate = delegate; 66 67 m_download.init(this, url); 68} 69 70// IWebDownload ------------------------------------------------------------------- 71 72HRESULT STDMETHODCALLTYPE WebDownload::initWithRequest( 73 /* [in] */ IWebURLRequest* request, 74 /* [in] */ IWebDownloadDelegate* delegate) 75{ 76 notImplemented(); 77 return E_FAIL; 78} 79 80HRESULT STDMETHODCALLTYPE WebDownload::initToResumeWithBundle( 81 /* [in] */ BSTR bundlePath, 82 /* [in] */ IWebDownloadDelegate* delegate) 83{ 84 notImplemented(); 85 return E_FAIL; 86} 87 88HRESULT STDMETHODCALLTYPE WebDownload::start() 89{ 90 if (!m_download.start()) 91 return E_FAIL; 92 93 if (m_delegate) 94 m_delegate->didBegin(this); 95 96 return S_OK; 97} 98 99HRESULT STDMETHODCALLTYPE WebDownload::cancel() 100{ 101 if (!m_download.cancel()) 102 return E_FAIL; 103 104 return S_OK; 105} 106 107HRESULT STDMETHODCALLTYPE WebDownload::cancelForResume() 108{ 109 notImplemented(); 110 return E_FAIL; 111} 112 113HRESULT STDMETHODCALLTYPE WebDownload::deletesFileUponFailure( 114 /* [out, retval] */ BOOL* result) 115{ 116 *result = m_download.deletesFileUponFailure() ? TRUE : FALSE; 117 return S_OK; 118} 119 120HRESULT STDMETHODCALLTYPE WebDownload::setDeletesFileUponFailure( 121 /* [in] */ BOOL deletesFileUponFailure) 122{ 123 m_download.setDeletesFileUponFailure(deletesFileUponFailure); 124 return S_OK; 125} 126 127HRESULT STDMETHODCALLTYPE WebDownload::setDestination( 128 /* [in] */ BSTR path, 129 /* [in] */ BOOL allowOverwrite) 130{ 131 size_t len = wcslen(path); 132 m_destination = String(path, len); 133 m_download.setDestination(m_destination); 134 return S_OK; 135} 136 137// IWebURLAuthenticationChallengeSender ------------------------------------------------------------------- 138 139HRESULT STDMETHODCALLTYPE WebDownload::cancelAuthenticationChallenge( 140 /* [in] */ IWebURLAuthenticationChallenge*) 141{ 142 notImplemented(); 143 return E_FAIL; 144} 145 146HRESULT STDMETHODCALLTYPE WebDownload::continueWithoutCredentialForAuthenticationChallenge( 147 /* [in] */ IWebURLAuthenticationChallenge* challenge) 148{ 149 notImplemented(); 150 return E_FAIL; 151} 152 153HRESULT STDMETHODCALLTYPE WebDownload::useCredential( 154 /* [in] */ IWebURLCredential* credential, 155 /* [in] */ IWebURLAuthenticationChallenge* challenge) 156{ 157 notImplemented(); 158 return E_FAIL; 159} 160 161void WebDownload::didReceiveResponse() 162{ 163 COMPtr<WebDownload> protect = this; 164 165 if (m_delegate) { 166 ResourceResponse response = m_download.getResponse(); 167 COMPtr<WebURLResponse> webResponse(AdoptCOM, WebURLResponse::createInstance(response)); 168 m_delegate->didReceiveResponse(this, webResponse.get()); 169 170 String suggestedFilename = response.suggestedFilename(); 171 if (suggestedFilename.isEmpty()) 172 suggestedFilename = pathGetFileName(response.url().string()); 173 BString suggestedFilenameBSTR(suggestedFilename.characters(), suggestedFilename.length()); 174 m_delegate->decideDestinationWithSuggestedFilename(this, suggestedFilenameBSTR); 175 } 176} 177 178void WebDownload::didReceiveDataOfLength(int size) 179{ 180 COMPtr<WebDownload> protect = this; 181 182 if (m_delegate) 183 m_delegate->didReceiveDataOfLength(this, size); 184} 185 186void WebDownload::didFinish() 187{ 188 COMPtr<WebDownload> protect = this; 189 190 if (m_delegate) 191 m_delegate->didFinish(this); 192} 193 194void WebDownload::didFail() 195{ 196 COMPtr<WebDownload> protect = this; 197 198 if (m_delegate) 199 m_delegate->didFailWithError(this, 0); 200} 201