165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch/*
22fc2651226baac27029e38c9d6ef883fa32084dbSteve Block * Copyright (C) 2010, 2011 Apple Inc. All rights reserved.
365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch *
465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * Redistribution and use in source and binary forms, with or without
565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * modification, are permitted provided that the following conditions
665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * are met:
765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * 1. Redistributions of source code must retain the above copyright
865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch *    notice, this list of conditions and the following disclaimer.
965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * 2. Redistributions in binary form must reproduce the above copyright
1065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch *    notice, this list of conditions and the following disclaimer in the
1165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch *    documentation and/or other materials provided with the distribution.
1265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch *
1365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
1465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
1565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
1665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
1765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
1865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
1965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
2065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
2165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
2265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
2365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * THE POSSIBILITY OF SUCH DAMAGE.
2465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch */
2565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
2665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#ifndef Download_h
2765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#define Download_h
2865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
2965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "MessageSender.h"
3065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <WebCore/ResourceRequest.h>
3165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <wtf/Noncopyable.h>
3265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <wtf/PassOwnPtr.h>
3365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
3465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#if PLATFORM(MAC)
3565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <wtf/RetainPtr.h>
362fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
372fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockOBJC_CLASS NSURLDownload;
382fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockOBJC_CLASS WKDownloadAsDelegate;
3965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif
4065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
4165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#if USE(CFNETWORK)
4265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <CFNetwork/CFURLDownloadPriv.h>
4365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif
4465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
4565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochnamespace CoreIPC {
4665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    class DataReference;
4765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
4865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
4965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochnamespace WebCore {
502bde8e466a4451c7319e3a072d118917957d6554Steve Block    class AuthenticationChallenge;
512bde8e466a4451c7319e3a072d118917957d6554Steve Block    class Credential;
5265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    class ResourceError;
5365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    class ResourceHandle;
5465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    class ResourceResponse;
5565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
5665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
5765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochnamespace WebKit {
5865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
5965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochclass SandboxExtension;
6065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochclass WebPage;
6165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
6265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochclass Download : public CoreIPC::MessageSender<Download> {
6365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    WTF_MAKE_NONCOPYABLE(Download);
6465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochpublic:
6565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    static PassOwnPtr<Download> create(uint64_t downloadID, const WebCore::ResourceRequest&);
6665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ~Download();
6765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
6865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // Used by MessageSender.
6965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    CoreIPC::Connection* connection() const;
7065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    uint64_t destinationID() const { return downloadID(); }
7165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
7265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    void start(WebPage* initiatingWebPage);
7365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    void startWithHandle(WebPage* initiatingPage, WebCore::ResourceHandle*, const WebCore::ResourceRequest& initialRequest, const WebCore::ResourceResponse&);
7465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    void cancel();
7565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
7665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    uint64_t downloadID() const { return m_downloadID; }
7765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
7865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    void didStart();
792bde8e466a4451c7319e3a072d118917957d6554Steve Block    void didReceiveAuthenticationChallenge(const WebCore::AuthenticationChallenge&);
8065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    void didReceiveResponse(const WebCore::ResourceResponse&);
8165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    void didReceiveData(uint64_t length);
8265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    bool shouldDecodeSourceDataOfMIMEType(const String& mimeType);
8365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    String decideDestinationWithSuggestedFilename(const String& filename, bool& allowOverwrite);
8465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    void didCreateDestination(const String& path);
8565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    void didFinish();
862fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    void platformDidFinish();
8765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    void didFail(const WebCore::ResourceError&, const CoreIPC::DataReference& resumeData);
8865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    void didCancel(const CoreIPC::DataReference& resumeData);
892fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    void didDecideDestination(const String&, bool allowOverwrite);
902fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
912fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#if USE(CFNETWORK)
922fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    const String& destination() const { return m_destination; }
932fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#endif
9465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
952bde8e466a4451c7319e3a072d118917957d6554Steve Block    // Authentication
962bde8e466a4451c7319e3a072d118917957d6554Steve Block    static void receivedCredential(const WebCore::AuthenticationChallenge&, const WebCore::Credential&);
972bde8e466a4451c7319e3a072d118917957d6554Steve Block    static void receivedRequestToContinueWithoutCredential(const WebCore::AuthenticationChallenge&);
982bde8e466a4451c7319e3a072d118917957d6554Steve Block    static void receivedCancellation(const WebCore::AuthenticationChallenge&);
992bde8e466a4451c7319e3a072d118917957d6554Steve Block
10065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochprivate:
10165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    Download(uint64_t downloadID, const WebCore::ResourceRequest&);
10265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
10365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    void platformInvalidate();
10465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
1052fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    String retrieveDestinationWithSuggestedFilename(const String& filename, bool& allowOverwrite);
1062fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
10765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    uint64_t m_downloadID;
10865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    WebCore::ResourceRequest m_request;
10965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
11065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    RefPtr<SandboxExtension> m_sandboxExtension;
11165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
11265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#if PLATFORM(MAC)
11365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    RetainPtr<NSURLDownload> m_nsURLDownload;
11465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    RetainPtr<WKDownloadAsDelegate> m_delegate;
11565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif
1162fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    bool m_allowOverwrite;
1172fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    String m_destination;
1182fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    String m_bundlePath;
1192bde8e466a4451c7319e3a072d118917957d6554Steve Block#if USE(CFNETWORK)
12065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    RetainPtr<CFURLDownloadRef> m_download;
12165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif
12265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch};
12365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
12465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} // namespace WebKit
12565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
12665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif // Download_h
127