190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// found in the LICENSE file.
490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
5424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#ifndef CHROME_BROWSER_UI_APP_LIST_SEARCH_COMMON_JSON_RESPONSE_FETCHER_H_
6424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#define CHROME_BROWSER_UI_APP_LIST_SEARCH_COMMON_JSON_RESPONSE_FETCHER_H_
790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include <string>
990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
1090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "base/basictypes.h"
1190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "base/callback.h"
1290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "base/memory/scoped_ptr.h"
1390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "base/memory/weak_ptr.h"
1490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "net/url_request/url_fetcher_delegate.h"
1590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
16424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)class GURL;
17424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
1890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)namespace base {
1990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class DictionaryValue;
2090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class Value;
2190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
2290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
2390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)namespace net {
2490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class URLFetcher;
2590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class URLRequestContextGetter;
2690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
2790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
2890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)namespace app_list {
2990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
30424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)// A class that fetches a JSON formatted response from a server and uses a
31424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)// sandboxed utility process to parse it to a DictionaryValue.
3258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// TODO(rkc): Add the ability to give control of handling http failures to
3358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// the consumers of this class.
34424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)class JSONResponseFetcher : public net::URLFetcherDelegate {
3590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) public:
3690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Callback to pass back the parsed json dictionary returned from the server.
3790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Invoked with NULL if there is an error.
3890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  typedef base::Callback<void(scoped_ptr<base::DictionaryValue>)> Callback;
3990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
40424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  JSONResponseFetcher(const Callback& callback,
41424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                      net::URLRequestContextGetter* context_getter);
42424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  virtual ~JSONResponseFetcher();
4390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
44424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // Starts to fetch results for the given |query_url|.
45424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  void Start(const GURL& query_url);
4690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  void Stop();
4790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
4890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) private:
4990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Callbacks for SafeJsonParser.
5090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  void OnJsonParseSuccess(scoped_ptr<base::Value> parsed_json);
5190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  void OnJsonParseError(const std::string& error);
5290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
5390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // net::URLFetcherDelegate overrides:
5490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual void OnURLFetchComplete(const net::URLFetcher* source) OVERRIDE;
5590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
5690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  Callback callback_;
5790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  net::URLRequestContextGetter* context_getter_;
5890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
5990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  scoped_ptr<net::URLFetcher> fetcher_;
60424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  base::WeakPtrFactory<JSONResponseFetcher> weak_factory_;
6190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
62424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(JSONResponseFetcher);
6390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)};
6490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
6590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}  // namespace app_list
6690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
67424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#endif  // CHROME_BROWSER_UI_APP_LIST_SEARCH_COMMON_JSON_RESPONSE_FETCHER_H_
68