10529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// Copyright 2014 The Chromium Authors. All rights reserved.
20529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// Use of this source code is governed by a BSD-style license that can be
30529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// found in the LICENSE file.
40529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
50529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "chrome/browser/chromeos/geolocation/simple_geolocation_provider.h"
60529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
70529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include <algorithm>
80529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include <iterator>
90529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
100529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "base/bind.h"
110529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "base/time/time.h"
120529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "chrome/browser/chromeos/geolocation/geoposition.h"
130529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "net/url_request/url_request_context_getter.h"
140529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "url/gurl.h"
150529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
160529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochnamespace chromeos {
170529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
180529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochnamespace {
190529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochconst char kDefaultGeolocationProviderUrl[] =
200529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    "https://www.googleapis.com/geolocation/v1/geolocate?";
210529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}  // namespace
220529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
230529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochSimpleGeolocationProvider::SimpleGeolocationProvider(
240529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    net::URLRequestContextGetter* url_context_getter,
250529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    const GURL& url)
260529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    : url_context_getter_(url_context_getter), url_(url) {
270529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}
280529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
290529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochSimpleGeolocationProvider::~SimpleGeolocationProvider() {
300529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  DCHECK(thread_checker_.CalledOnValidThread());
310529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}
320529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
330529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochvoid SimpleGeolocationProvider::RequestGeolocation(
340529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    base::TimeDelta timeout,
350529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    SimpleGeolocationRequest::ResponseCallback callback) {
360529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  DCHECK(thread_checker_.CalledOnValidThread());
370529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  SimpleGeolocationRequest* request(
381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      new SimpleGeolocationRequest(url_context_getter_.get(), url_, timeout));
390529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  requests_.push_back(request);
400529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
410529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // SimpleGeolocationProvider owns all requests. It is safe to pass unretained
420529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // "this" because destruction of SimpleGeolocationProvider cancels all
430529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // requests.
440529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  SimpleGeolocationRequest::ResponseCallback callback_tmp(
450529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      base::Bind(&SimpleGeolocationProvider::OnGeolocationResponse,
460529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                 base::Unretained(this),
470529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                 request,
480529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                 callback));
490529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  request->MakeRequest(callback_tmp);
500529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}
510529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
520529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// static
530529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochGURL SimpleGeolocationProvider::DefaultGeolocationProviderURL() {
540529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  return GURL(kDefaultGeolocationProviderUrl);
550529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}
560529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
570529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochvoid SimpleGeolocationProvider::OnGeolocationResponse(
580529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    SimpleGeolocationRequest* request,
590529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    SimpleGeolocationRequest::ResponseCallback callback,
600529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    const Geoposition& geoposition,
610529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    bool server_error,
620529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    const base::TimeDelta elapsed) {
630529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  DCHECK(thread_checker_.CalledOnValidThread());
640529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
650529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  callback.Run(geoposition, server_error, elapsed);
660529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
670529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  ScopedVector<SimpleGeolocationRequest>::iterator new_end =
680529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      std::remove(requests_.begin(), requests_.end(), request);
690529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  DCHECK_EQ(std::distance(new_end, requests_.end()), 1);
700529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  requests_.erase(new_end, requests_.end());
710529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}
720529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
730529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}  // namespace chromeos
74