1 /* 2 * Copyright (C) 2010, 2011 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 INC. AND ITS CONTRIBUTORS ``AS IS'' 14 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 15 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS 17 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 18 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 19 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 20 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 21 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 22 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 23 * THE POSSIBILITY OF SUCH DAMAGE. 24 */ 25 26 #ifndef Download_h 27 #define Download_h 28 29 #include "MessageSender.h" 30 #include <WebCore/ResourceRequest.h> 31 #include <wtf/Noncopyable.h> 32 #include <wtf/PassOwnPtr.h> 33 34 #if PLATFORM(MAC) 35 #include <wtf/RetainPtr.h> 36 37 OBJC_CLASS NSURLDownload; 38 OBJC_CLASS WKDownloadAsDelegate; 39 #endif 40 41 #if USE(CFNETWORK) 42 #include <CFNetwork/CFURLDownloadPriv.h> 43 #endif 44 45 namespace CoreIPC { 46 class DataReference; 47 } 48 49 namespace WebCore { 50 class AuthenticationChallenge; 51 class Credential; 52 class ResourceError; 53 class ResourceHandle; 54 class ResourceResponse; 55 } 56 57 namespace WebKit { 58 59 class SandboxExtension; 60 class WebPage; 61 62 class Download : public CoreIPC::MessageSender<Download> { 63 WTF_MAKE_NONCOPYABLE(Download); 64 public: 65 static PassOwnPtr<Download> create(uint64_t downloadID, const WebCore::ResourceRequest&); 66 ~Download(); 67 68 // Used by MessageSender. 69 CoreIPC::Connection* connection() const; destinationID()70 uint64_t destinationID() const { return downloadID(); } 71 72 void start(WebPage* initiatingWebPage); 73 void startWithHandle(WebPage* initiatingPage, WebCore::ResourceHandle*, const WebCore::ResourceRequest& initialRequest, const WebCore::ResourceResponse&); 74 void cancel(); 75 downloadID()76 uint64_t downloadID() const { return m_downloadID; } 77 78 void didStart(); 79 void didReceiveAuthenticationChallenge(const WebCore::AuthenticationChallenge&); 80 void didReceiveResponse(const WebCore::ResourceResponse&); 81 void didReceiveData(uint64_t length); 82 bool shouldDecodeSourceDataOfMIMEType(const String& mimeType); 83 String decideDestinationWithSuggestedFilename(const String& filename, bool& allowOverwrite); 84 void didCreateDestination(const String& path); 85 void didFinish(); 86 void platformDidFinish(); 87 void didFail(const WebCore::ResourceError&, const CoreIPC::DataReference& resumeData); 88 void didCancel(const CoreIPC::DataReference& resumeData); 89 void didDecideDestination(const String&, bool allowOverwrite); 90 91 #if USE(CFNETWORK) destination()92 const String& destination() const { return m_destination; } 93 #endif 94 95 // Authentication 96 static void receivedCredential(const WebCore::AuthenticationChallenge&, const WebCore::Credential&); 97 static void receivedRequestToContinueWithoutCredential(const WebCore::AuthenticationChallenge&); 98 static void receivedCancellation(const WebCore::AuthenticationChallenge&); 99 100 private: 101 Download(uint64_t downloadID, const WebCore::ResourceRequest&); 102 103 void platformInvalidate(); 104 105 String retrieveDestinationWithSuggestedFilename(const String& filename, bool& allowOverwrite); 106 107 uint64_t m_downloadID; 108 WebCore::ResourceRequest m_request; 109 110 RefPtr<SandboxExtension> m_sandboxExtension; 111 112 #if PLATFORM(MAC) 113 RetainPtr<NSURLDownload> m_nsURLDownload; 114 RetainPtr<WKDownloadAsDelegate> m_delegate; 115 #endif 116 bool m_allowOverwrite; 117 String m_destination; 118 String m_bundlePath; 119 #if USE(CFNETWORK) 120 RetainPtr<CFURLDownloadRef> m_download; 121 #endif 122 }; 123 124 } // namespace WebKit 125 126 #endif // Download_h 127