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