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