1effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// Copyright 2014 The Chromium Authors. All rights reserved.
2effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// found in the LICENSE file.
4effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
5effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "chrome/browser/chromeos/timezone/timezone_provider.h"
6effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
7effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include <algorithm>
8effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include <iterator>
9effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
10effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "base/bind.h"
11effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "base/logging.h"
12effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "base/time/time.h"
130529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "chrome/browser/chromeos/geolocation/geoposition.h"
14effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "net/url_request/url_request_context_getter.h"
15effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "url/gurl.h"
16effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
17effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochnamespace chromeos {
18effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
19effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochTimeZoneProvider::TimeZoneProvider(
20effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    net::URLRequestContextGetter* url_context_getter,
21effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    const GURL& url)
22effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    : url_context_getter_(url_context_getter), url_(url) {
23effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
24effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
25effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochTimeZoneProvider::~TimeZoneProvider() {
26effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  DCHECK(thread_checker_.CalledOnValidThread());
27effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
28effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
29effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid TimeZoneProvider::RequestTimezone(
300529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    const Geoposition& position,
31effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    bool sensor,
32effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    base::TimeDelta timeout,
33effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    TimeZoneRequest::TimeZoneResponseCallback callback) {
34effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  TimeZoneRequest* request(new TimeZoneRequest(
35effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      url_context_getter_, url_, position, sensor, timeout));
36effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  requests_.push_back(request);
37effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
38effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // TimeZoneProvider owns all requests. It is safe to pass unretained "this"
39effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // because destruction of TimeZoneProvider cancels all requests.
40effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  TimeZoneRequest::TimeZoneResponseCallback callback_tmp(
41effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      base::Bind(&TimeZoneProvider::OnTimezoneResponse,
42effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                 base::Unretained(this),
43effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                 request,
44effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                 callback));
45effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  request->MakeRequest(callback_tmp);
46effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
47effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
48effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid TimeZoneProvider::OnTimezoneResponse(
49effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    TimeZoneRequest* request,
50effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    TimeZoneRequest::TimeZoneResponseCallback callback,
51effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    scoped_ptr<TimeZoneResponseData> timezone,
52effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    bool server_error) {
53effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  ScopedVector<TimeZoneRequest>::iterator new_end =
54effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      std::remove(requests_.begin(), requests_.end(), request);
55effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  DCHECK_EQ(std::distance(new_end, requests_.end()), 1);
56effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  requests_.erase(new_end, requests_.end());
57effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
58effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  callback.Run(timezone.Pass(), server_error);
59effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
60effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
61effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}  // namespace chromeos
62