15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CONTENT_BROWSER_GEOLOCATION_NETWORK_LOCATION_REQUEST_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CONTENT_BROWSER_GEOLOCATION_NETWORK_LOCATION_REQUEST_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
11424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "content/browser/geolocation/wifi_data_provider.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/content_export.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_fetcher_delegate.h"
147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "url/gurl.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net {
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class URLFetcher;
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class URLRequestContextGetter;
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct Geoposition;
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)// Takes wifi data and sends it to a server to get a position fix.
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// It performs formatting of the request and interpretation of the response.
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NetworkLocationRequest : private net::URLFetcherDelegate {
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ID passed to URLFetcher::Create(). Used for testing.
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CONTENT_EXPORT static int url_fetcher_id_for_tests;
303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Called when a new geo position is available. The second argument indicates
323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // whether there was a server error or not. It is true when there was a
333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // server or network error - either no response or a 500 error code.
343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  typedef base::Callback<void(const Geoposition& /* position */,
353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                              bool /* server_error */,
36a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                              const base::string16& /* access_token */,
373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                              const WifiData& /* wifi_data */)>
383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      LocationResponseCallback;
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |url| is the server address to which the request wil be sent.
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NetworkLocationRequest(net::URLRequestContextGetter* context,
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         const GURL& url,
433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                         LocationResponseCallback callback);
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~NetworkLocationRequest();
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Makes a new request. Returns true if the new request was successfully
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // started. In all cases, any currently pending request will be canceled.
48a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  bool MakeRequest(const base::string16& access_token,
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   const WifiData& wifi_data,
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   const base::Time& timestamp);
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is_request_pending() const { return url_fetcher_ != NULL; }
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GURL& url() const { return url_; }
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // net::URLFetcherDelegate
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnURLFetchComplete(const net::URLFetcher* source) OVERRIDE;
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<net::URLRequestContextGetter> url_context_;
606e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  LocationResponseCallback location_response_callback_;
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GURL url_;
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<net::URLFetcher> url_fetcher_;
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Keep a copy of the data sent in the request, so we can refer back to it
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // when the response arrives.
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WifiData wifi_data_;
676e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  base::Time wifi_data_timestamp_;
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The start time for the request.
706e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  base::TimeTicks request_start_time_;
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(NetworkLocationRequest);
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CONTENT_BROWSER_GEOLOCATION_NETWORK_LOCATION_REQUEST_H_
78