11320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Copyright 2014 The Chromium Authors. All rights reserved.
21320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Use of this source code is governed by a BSD-style license that can be
31320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// found in the LICENSE file.
41320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "components/data_reduction_proxy/browser/data_reduction_proxy_statistics_prefs.h"
61320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/bind.h"
81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/location.h"
91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/logging.h"
101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/prefs/pref_service.h"
111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/prefs/scoped_user_pref_update.h"
121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/sequenced_task_runner.h"
131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/strings/string_number_conversions.h"
141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/time/time.h"
151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/values.h"
161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace data_reduction_proxy {
181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciDataReductionProxyStatisticsPrefs::DataReductionProxyStatisticsPrefs(
201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    PrefService* prefs,
211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    scoped_refptr<base::SequencedTaskRunner> task_runner,
221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const base::TimeDelta& delay)
231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    : pref_service_(prefs),
241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      task_runner_(task_runner),
251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      weak_factory_(this),
261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      delay_(delay),
271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      delayed_task_posted_(false) {
281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DCHECK(prefs);
291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DCHECK_GE(delay.InMilliseconds(), 0);
301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  Init();
311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciDataReductionProxyStatisticsPrefs::~DataReductionProxyStatisticsPrefs() {}
341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid DataReductionProxyStatisticsPrefs::Init() {
361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (delay_ == base::TimeDelta())
371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return;
381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Init all int64 prefs.
401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  InitInt64Pref(data_reduction_proxy::prefs::
411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                kDailyHttpContentLengthLastUpdateDate);
421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  InitInt64Pref(data_reduction_proxy::prefs::kHttpReceivedContentLength);
431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  InitInt64Pref(data_reduction_proxy::prefs::kHttpOriginalContentLength);
441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Init all list prefs.
461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  InitListPref(data_reduction_proxy::prefs::
471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci               kDailyContentLengthHttpsWithDataReductionProxyEnabled);
481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  InitListPref(data_reduction_proxy::prefs::
491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci               kDailyContentLengthLongBypassWithDataReductionProxyEnabled);
501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  InitListPref(data_reduction_proxy::prefs::
511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci               kDailyContentLengthShortBypassWithDataReductionProxyEnabled);
521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  InitListPref(data_reduction_proxy::prefs::
531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci               kDailyContentLengthUnknownWithDataReductionProxyEnabled);
541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  InitListPref(data_reduction_proxy::prefs::
551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci               kDailyContentLengthViaDataReductionProxy);
561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  InitListPref(data_reduction_proxy::prefs::
571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci               kDailyContentLengthWithDataReductionProxyEnabled);
581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  InitListPref(data_reduction_proxy::prefs::kDailyHttpOriginalContentLength);
591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  InitListPref(data_reduction_proxy::prefs::kDailyHttpReceivedContentLength);
601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  InitListPref(data_reduction_proxy::prefs::
611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci               kDailyOriginalContentLengthViaDataReductionProxy);
621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  InitListPref(data_reduction_proxy::prefs::
631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci               kDailyOriginalContentLengthWithDataReductionProxyEnabled);
641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid DataReductionProxyStatisticsPrefs::InitInt64Pref(const char* pref) {
671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int64 pref_value = pref_service_->GetInt64(pref);
681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  pref_map_[pref] = pref_value;
691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid DataReductionProxyStatisticsPrefs::InitListPref(const char* pref) {
721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_ptr<base::ListValue> pref_value = scoped_ptr<base::ListValue>(
731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      pref_service_->GetList(pref)->DeepCopy());
741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  list_pref_map_.add(pref, pref_value.Pass());
751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciint64 DataReductionProxyStatisticsPrefs::GetInt64(const char* pref_path) {
781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (delay_ == base::TimeDelta())
791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return pref_service_->GetInt64(pref_path);
801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DataReductionProxyPrefMap::iterator iter = pref_map_.find(pref_path);
821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return iter->second;
831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid DataReductionProxyStatisticsPrefs::SetInt64(const char* pref_path,
861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                 int64 pref_value) {
871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (delay_ == base::TimeDelta()) {
881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    pref_service_->SetInt64(pref_path, pref_value);
891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return;
901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DelayedWritePrefs();
931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  pref_map_[pref_path] = pref_value;
941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibase::ListValue* DataReductionProxyStatisticsPrefs::GetList(
971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const char* pref_path) {
981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (delay_ == base::TimeDelta())
991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return ListPrefUpdate(pref_service_, pref_path).Get();
1001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DelayedWritePrefs();
1021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return list_pref_map_.get(pref_path);
1031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid DataReductionProxyStatisticsPrefs::WritePrefs() {
1061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (delay_ == base::TimeDelta())
1071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return;
1081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  for (DataReductionProxyPrefMap::iterator iter = pref_map_.begin();
1101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci       iter != pref_map_.end(); ++iter) {
1111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    pref_service_->SetInt64(iter->first, iter->second);
1121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
1131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  for (DataReductionProxyListPrefMap::iterator iter = list_pref_map_.begin();
1151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci       iter != list_pref_map_.end(); ++iter) {
1161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    TransferList(*(iter->second),
1171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                 ListPrefUpdate(pref_service_, iter->first).Get());
1181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
1191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  delayed_task_posted_ = false;
1211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid DataReductionProxyStatisticsPrefs::DelayedWritePrefs() {
1241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Only write after the first time posting the task.
1251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (delayed_task_posted_)
1261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return;
1271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  task_runner_->PostDelayedTask(
1291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      FROM_HERE,
1301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      base::Bind(&DataReductionProxyStatisticsPrefs::WritePrefs,
1311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                 weak_factory_.GetWeakPtr()),
1321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                 delay_);
1331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  delayed_task_posted_ = true;
1351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid DataReductionProxyStatisticsPrefs::TransferList(
1381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const base::ListValue& from_list,
1391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    base::ListValue* to_list) {
1401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  to_list->Clear();
1411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  for (size_t i = 0; i < from_list.GetSize(); ++i) {
1421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    to_list->Set(i, new base::StringValue(base::Int64ToString(
1431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        GetListPrefInt64Value(from_list, i))));
1441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
1451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciint64 DataReductionProxyStatisticsPrefs::GetListPrefInt64Value(
1481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const base::ListValue& list,
1491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    size_t index) {
1501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::string string_value;
1511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!list.GetString(index, &string_value)) {
1521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    NOTREACHED();
1531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return 0;
1541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
1551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int64 value = 0;
1571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  bool rv = base::StringToInt64(string_value, &value);
1581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DCHECK(rv);
1591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return value;
1601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}  // namespace data_reduction_proxy
163