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