1// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef CHROME_BROWSER_SEARCH_ENGINES_TEMPLATE_URL_FETCHER_H_
6#define CHROME_BROWSER_SEARCH_ENGINES_TEMPLATE_URL_FETCHER_H_
7#pragma once
8
9#include "base/memory/scoped_vector.h"
10#include "base/string16.h"
11#include "ui/gfx/native_widget_types.h"
12
13class GURL;
14class Profile;
15class TemplateURL;
16class TemplateURLFetcherCallbacks;
17
18// TemplateURLFetcher is responsible for downloading OpenSearch description
19// documents, creating a TemplateURL from the OSDD, and adding the TemplateURL
20// to the TemplateURLModel. Downloading is done in the background.
21//
22class TemplateURLFetcher {
23 public:
24  enum ProviderType {
25    AUTODETECTED_PROVIDER,
26    EXPLICIT_PROVIDER,  // Supplied by Javascript.
27    EXPLICIT_DEFAULT_PROVIDER  // Supplied by Javascript as default provider.
28  };
29
30  // Creates a TemplateURLFetcher with the specified Profile.
31  explicit TemplateURLFetcher(Profile* profile);
32  ~TemplateURLFetcher();
33
34  // If TemplateURLFetcher is not already downloading the OSDD for osdd_url,
35  // it is downloaded. If successful and the result can be parsed, a TemplateURL
36  // is added to the TemplateURLModel. Takes ownership of |callbacks|.
37  void ScheduleDownload(const string16& keyword,
38                        const GURL& osdd_url,
39                        const GURL& favicon_url,
40                        TemplateURLFetcherCallbacks* callbacks,
41                        ProviderType provider_type);
42
43  // The current number of outstanding requests.
44  int requests_count() const { return requests_->size(); }
45
46 private:
47  friend class RequestDelegate;
48
49  // A RequestDelegate is created to download each OSDD. When done downloading
50  // RequestCompleted is invoked back on the TemplateURLFetcher.
51  class RequestDelegate;
52
53  Profile* profile() const { return profile_; }
54
55  // Invoked from the RequestDelegate when done downloading.
56  void RequestCompleted(RequestDelegate* request);
57
58  Profile* profile_;
59
60  // In progress requests.
61  ScopedVector<RequestDelegate> requests_;
62
63  DISALLOW_COPY_AND_ASSIGN(TemplateURLFetcher);
64};
65
66#endif  // CHROME_BROWSER_SEARCH_ENGINES_TEMPLATE_URL_FETCHER_H_
67