1d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 2a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// found in the LICENSE file. 4a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 5d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#ifndef CHROME_BROWSER_EXTENSIONS_API_IMAGE_WRITER_PRIVATE_WRITE_FROM_URL_OPERATION_H_ 6d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#define CHROME_BROWSER_EXTENSIONS_API_IMAGE_WRITER_PRIVATE_WRITE_FROM_URL_OPERATION_H_ 7a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 8d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "chrome/browser/extensions/api/image_writer_private/operation.h" 9a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "net/url_request/url_fetcher_delegate.h" 10a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "url/gurl.h" 11a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 12a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)namespace net { 13a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class URLFetcher; 14a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class URLRequestContextGetter; 15a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} // namespace net 1658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 17a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)namespace extensions { 18d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)namespace image_writer { 19a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 20d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)class OperationManager; 2158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 22a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// Encapsulates a write of an image accessed via URL. 23a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class WriteFromUrlOperation : public Operation, public net::URLFetcherDelegate { 24a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) public: 2568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) WriteFromUrlOperation(base::WeakPtr<OperationManager> manager, 26a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const ExtensionId& extension_id, 27a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) net::URLRequestContextGetter* request_context, 2858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) GURL url, 2958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const std::string& hash, 30a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const std::string& storage_unit_id); 31a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual void StartImpl() OVERRIDE; 32a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 33a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) protected: 3458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual ~WriteFromUrlOperation(); 3558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 36a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Sets the image_path to the correct location to download to. 37a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) void GetDownloadTarget(const base::Closure& continuation); 38a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 39a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Downloads the |url| to the currently configured |image_path|. Should not 40a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // be called without calling |GetDownloadTarget| first. 41a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) void Download(const base::Closure& continuation); 42a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 43a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Verifies the download matches |hash|. If the hash is empty, this stage is 44a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // skipped. 45a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) void VerifyDownload(const base::Closure& continuation); 46a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 47a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) private: 48a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Destroys the URLFetcher. The URLFetcher needs to be destroyed on the same 49a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // thread it was created on. The Operation may be deleted on the UI thread 50a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // and so we must first delete the URLFetcher on the FILE thread. 51a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) void DestroyUrlFetcher(); 52a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 53a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // URLFetcherDelegate implementation. 54a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual void OnURLFetchComplete(const net::URLFetcher* source) OVERRIDE; 55a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual void OnURLFetchDownloadProgress(const net::URLFetcher* source, 56a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int64 current, 57a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int64 total) OVERRIDE; 58a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual void OnURLFetchUploadProgress(const net::URLFetcher* source, 59a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int64 current, 60a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int64 total) OVERRIDE; 6158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 62a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) void VerifyDownloadCompare(const base::Closure& continuation, 63a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const std::string& download_hash); 64a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) void VerifyDownloadComplete(const base::Closure& continuation); 6558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 6668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // Arguments 67a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) net::URLRequestContextGetter* request_context_; 6858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) GURL url_; 6958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const std::string hash_; 7068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 7168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // Local state 72a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_ptr<net::URLFetcher> url_fetcher_; 73a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::Closure download_continuation_; 7458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}; 75a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 76d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)} // namespace image_writer 77a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} // namespace extensions 78a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 79d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#endif // CHROME_BROWSER_EXTENSIONS_API_IMAGE_WRITER_PRIVATE_WRITE_FROM_URL_OPERATION_H_ 80