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