16d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
26d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
36d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)// found in the LICENSE file.
46d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
56d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#ifndef CHROME_BROWSER_BITMAP_FETCHER_BITMAP_FETCHER_H_
66d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#define CHROME_BROWSER_BITMAP_FETCHER_BITMAP_FETCHER_H_
76d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
86d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
96d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "chrome/browser/bitmap_fetcher_delegate.h"
106d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "chrome/browser/image_decoder.h"
116d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "net/url_request/url_fetcher_delegate.h"
126d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "net/url_request/url_request.h"
136d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "third_party/skia/include/core/SkBitmap.h"
146d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "url/gurl.h"
156d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
166d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)namespace net {
176d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)class URLFetcher;
186d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)class URLRequestContextGetter;
196d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)}  // namespace net
206d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
216d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)namespace chrome {
226d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
236d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)// Asynchrounously fetches an image from the given URL and returns the
246d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)// decoded Bitmap to the provided BitmapFetcherDelegate.
256d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)class BitmapFetcher : public net::URLFetcherDelegate,
266d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                      public ImageDecoder::Delegate {
276d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) public:
286d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  BitmapFetcher(const GURL& url, BitmapFetcherDelegate* delegate);
296d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  virtual ~BitmapFetcher();
306d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
316d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  const GURL& url() const { return url_; }
326d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
336d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // Start fetching the URL with the fetcher. The delegate is notified
346d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // asynchronously when done.  Start may be called more than once in some
356d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // cases.  If so, subsequent starts will be ignored since the operation is
366d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // already in progress.  Arguments are used to configure the internal fetcher.
376d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // Values for |load_flags| are defined in net/base/load_flags.h.  In general,
386d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // |net::LOAD_NORMAL| is appropriate.
396d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  void Start(net::URLRequestContextGetter* request_context,
406d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)             const std::string& referrer,
416d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)             net::URLRequest::ReferrerPolicy referrer_policy,
426d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)             int load_flags);
436d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
446d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // Methods inherited from URLFetcherDelegate
456d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
466d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // This will be called when the URL has been fetched, successfully or not.
476d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // Use accessor methods on |source| to get the results.
486d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  virtual void OnURLFetchComplete(const net::URLFetcher* source) OVERRIDE;
496d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
506d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // This will be called when some part of the response is read. |current|
516d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // denotes the number of bytes received up to the call, and |total| is the
526d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // expected total size of the response (or -1 if not determined).
536d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  virtual void OnURLFetchDownloadProgress(const net::URLFetcher* source,
546d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                                          int64 current,
556d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                                          int64 total) OVERRIDE;
566d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
576d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // Methods inherited from ImageDecoder::Delegate
586d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
596d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // Called when image is decoded. |decoder| is used to identify the image in
606d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // case of decoding several images simultaneously.  This will not be called
616d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // on the UI thread.
626d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  virtual void OnImageDecoded(const ImageDecoder* decoder,
636d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                              const SkBitmap& decoded_image) OVERRIDE;
646d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
656d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // Called when decoding image failed.
666d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  virtual void OnDecodeImageFailed(const ImageDecoder* decoder) OVERRIDE;
676d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
686d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) private:
696d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // Alerts the delegate that a failure occurred.
706d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  void ReportFailure();
716d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
726d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  scoped_ptr<net::URLFetcher> url_fetcher_;
736d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  scoped_refptr<ImageDecoder> image_decoder_;
746d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  const GURL url_;
756d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  BitmapFetcherDelegate* const delegate_;
766d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
776d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(BitmapFetcher);
786d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)};
796d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
806d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)}  // namespace chrome
816d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
826d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#endif  // CHROME_BROWSER_BITMAP_FETCHER_BITMAP_FETCHER_H_
83