1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "chrome/service/cloud_print/connector_settings.h" 6 7 #include "base/metrics/histogram.h" 8 #include "base/values.h" 9 #include "chrome/common/cloud_print/cloud_print_constants.h" 10 #include "chrome/common/pref_names.h" 11 #include "chrome/service/cloud_print/print_system.h" 12 #include "chrome/service/service_process_prefs.h" 13 #include "components/cloud_devices/common/cloud_devices_urls.h" 14 15 namespace { 16 17 const char kDeleteOnEnumFail[] = "delete_on_enum_fail"; 18 const char kName[] = "name"; 19 const char kConnect[] = "connect"; 20 21 } // namespace 22 23 namespace cloud_print { 24 25 ConnectorSettings::ConnectorSettings() 26 : delete_on_enum_fail_(false), 27 connect_new_printers_(true), 28 xmpp_ping_enabled_(false), 29 xmpp_ping_timeout_sec_(kDefaultXmppPingTimeoutSecs) { 30 } 31 32 ConnectorSettings::~ConnectorSettings() { 33 } 34 35 void ConnectorSettings::InitFrom(ServiceProcessPrefs* prefs) { 36 CopyFrom(ConnectorSettings()); 37 38 proxy_id_ = prefs->GetString(prefs::kCloudPrintProxyId, std::string()); 39 if (proxy_id_.empty()) { 40 proxy_id_ = PrintSystem::GenerateProxyId(); 41 prefs->SetString(prefs::kCloudPrintProxyId, proxy_id_); 42 prefs->WritePrefs(); 43 } 44 45 // Getting print system specific settings from the preferences. 46 const base::DictionaryValue* print_system_settings = 47 prefs->GetDictionary(prefs::kCloudPrintPrintSystemSettings); 48 if (print_system_settings) { 49 print_system_settings_.reset(print_system_settings->DeepCopy()); 50 // TODO(vitalybuka) : Consider to rename and move out option from 51 // print_system_settings. 52 print_system_settings_->GetBoolean(kDeleteOnEnumFail, 53 &delete_on_enum_fail_); 54 } 55 56 // Check if there is an override for the cloud print server URL. 57 server_url_ = cloud_devices::GetCloudPrintURL(); 58 DCHECK(server_url_.is_valid()); 59 60 connect_new_printers_ = prefs->GetBoolean( 61 prefs::kCloudPrintConnectNewPrinters, true); 62 63 xmpp_ping_enabled_ = prefs->GetBoolean( 64 prefs::kCloudPrintXmppPingEnabled, false); 65 int timeout = prefs->GetInt( 66 prefs::kCloudPrintXmppPingTimeout, kDefaultXmppPingTimeoutSecs); 67 SetXmppPingTimeoutSec(timeout); 68 UMA_HISTOGRAM_LONG_TIMES( 69 "CloudPrint.XmppTimeout", 70 base::TimeDelta::FromSeconds(xmpp_ping_timeout_sec_)); 71 72 const base::ListValue* printers = prefs->GetList(prefs::kCloudPrintPrinters); 73 if (printers) { 74 for (size_t i = 0; i < printers->GetSize(); ++i) { 75 const base::DictionaryValue* dictionary = NULL; 76 if (printers->GetDictionary(i, &dictionary) && dictionary) { 77 std::string name; 78 dictionary->GetString(kName, &name); 79 if (!name.empty()) { 80 bool connect = connect_new_printers_; 81 dictionary->GetBoolean(kConnect, &connect); 82 if (connect != connect_new_printers_) 83 printers_.insert(name); 84 } 85 } 86 } 87 } 88 if (connect_new_printers_) { 89 UMA_HISTOGRAM_COUNTS_10000("CloudPrint.PrinterBlacklistSize", 90 printers_.size()); 91 } else { 92 UMA_HISTOGRAM_COUNTS_10000("CloudPrint.PrinterWhitelistSize", 93 printers_.size()); 94 } 95 } 96 97 bool ConnectorSettings::ShouldConnect(const std::string& printer_name) const { 98 Printers::const_iterator printer = printers_.find(printer_name); 99 if (printer != printers_.end()) 100 return !connect_new_printers_; 101 return connect_new_printers_; 102 } 103 104 void ConnectorSettings::CopyFrom(const ConnectorSettings& source) { 105 server_url_ = source.server_url(); 106 proxy_id_ = source.proxy_id(); 107 delete_on_enum_fail_ = source.delete_on_enum_fail(); 108 connect_new_printers_ = source.connect_new_printers_; 109 xmpp_ping_enabled_ = source.xmpp_ping_enabled(); 110 xmpp_ping_timeout_sec_ = source.xmpp_ping_timeout_sec(); 111 printers_ = source.printers_; 112 if (source.print_system_settings()) 113 print_system_settings_.reset(source.print_system_settings()->DeepCopy()); 114 } 115 116 void ConnectorSettings::SetXmppPingTimeoutSec(int timeout) { 117 xmpp_ping_timeout_sec_ = timeout; 118 if (xmpp_ping_timeout_sec_ < kMinXmppPingTimeoutSecs) { 119 LOG(WARNING) << 120 "CP_CONNECTOR: XMPP ping timeout is less then minimal value"; 121 xmpp_ping_timeout_sec_ = kMinXmppPingTimeoutSecs; 122 } 123 } 124 125 } // namespace cloud_print 126