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/command_line.h" 8 #include "base/values.h" 9 #include "chrome/common/chrome_switches.h" 10 #include "chrome/common/cloud_print/cloud_print_constants.h" 11 #include "chrome/common/pref_names.h" 12 #include "chrome/service/cloud_print/print_system.h" 13 #include "chrome/service/service_process_prefs.h" 14 15 namespace { 16 17 const char kDefaultCloudPrintServerUrl[] = "https://www.google.com/cloudprint"; 18 const char kDeleteOnEnumFail[] = "delete_on_enum_fail"; 19 const char kName[] = "name"; 20 const char kConnect[] = "connect"; 21 22 } // namespace 23 24 namespace cloud_print { 25 26 ConnectorSettings::ConnectorSettings() 27 : delete_on_enum_fail_(false), 28 connect_new_printers_(true), 29 xmpp_ping_enabled_(false), 30 xmpp_ping_timeout_sec_(kDefaultXmppPingTimeoutSecs) { 31 } 32 33 ConnectorSettings::~ConnectorSettings() { 34 } 35 36 void ConnectorSettings::InitFrom(ServiceProcessPrefs* prefs) { 37 CopyFrom(ConnectorSettings()); 38 39 proxy_id_ = prefs->GetString(prefs::kCloudPrintProxyId, std::string()); 40 if (proxy_id_.empty()) { 41 proxy_id_ = PrintSystem::GenerateProxyId(); 42 prefs->SetString(prefs::kCloudPrintProxyId, proxy_id_); 43 prefs->WritePrefs(); 44 } 45 46 // Getting print system specific settings from the preferences. 47 const base::DictionaryValue* print_system_settings = 48 prefs->GetDictionary(prefs::kCloudPrintPrintSystemSettings); 49 if (print_system_settings) { 50 print_system_settings_.reset(print_system_settings->DeepCopy()); 51 // TODO(vitalybuka) : Consider to rename and move out option from 52 // print_system_settings. 53 print_system_settings_->GetBoolean(kDeleteOnEnumFail, 54 &delete_on_enum_fail_); 55 } 56 57 // Check if there is an override for the cloud print server URL. 58 const CommandLine& command_line = *CommandLine::ForCurrentProcess(); 59 server_url_ = 60 GURL(command_line.GetSwitchValueASCII(switches::kCloudPrintServiceURL)); 61 if (server_url_.is_empty() || !server_url_.is_valid()) { 62 server_url_ = 63 GURL(prefs->GetString(prefs::kCloudPrintServiceURL, std::string())); 64 DCHECK(server_url_.is_empty() || server_url_.is_valid()); 65 if (server_url_.is_empty() || !server_url_.is_valid()) { 66 server_url_ = GURL(kDefaultCloudPrintServerUrl); 67 } 68 } 69 DCHECK(server_url_.is_valid()); 70 71 connect_new_printers_ = prefs->GetBoolean( 72 prefs::kCloudPrintConnectNewPrinters, true); 73 74 xmpp_ping_enabled_ = prefs->GetBoolean( 75 prefs::kCloudPrintXmppPingEnabled, false); 76 int timeout = prefs->GetInt( 77 prefs::kCloudPrintXmppPingTimeout, kDefaultXmppPingTimeoutSecs); 78 SetXmppPingTimeoutSec(timeout); 79 80 const base::ListValue* printers = prefs->GetList(prefs::kCloudPrintPrinters); 81 if (printers) { 82 for (size_t i = 0; i < printers->GetSize(); ++i) { 83 const base::DictionaryValue* dictionary = NULL; 84 if (printers->GetDictionary(i, &dictionary) && dictionary) { 85 std::string name; 86 dictionary->GetString(kName, &name); 87 if (!name.empty()) { 88 bool connect = connect_new_printers_; 89 dictionary->GetBoolean(kConnect, &connect); 90 if (connect != connect_new_printers_) 91 printers_.insert(name); 92 } 93 } 94 } 95 } 96 } 97 98 bool ConnectorSettings::ShouldConnect(const std::string& printer_name) const { 99 Printers::const_iterator printer = printers_.find(printer_name); 100 if (printer != printers_.end()) 101 return !connect_new_printers_; 102 return connect_new_printers_; 103 } 104 105 void ConnectorSettings::CopyFrom(const ConnectorSettings& source) { 106 server_url_ = source.server_url(); 107 proxy_id_ = source.proxy_id(); 108 delete_on_enum_fail_ = source.delete_on_enum_fail(); 109 connect_new_printers_ = source.connect_new_printers_; 110 xmpp_ping_enabled_ = source.xmpp_ping_enabled(); 111 xmpp_ping_timeout_sec_ = source.xmpp_ping_timeout_sec(); 112 printers_ = source.printers_; 113 if (source.print_system_settings()) 114 print_system_settings_.reset(source.print_system_settings()->DeepCopy()); 115 } 116 117 void ConnectorSettings::SetXmppPingTimeoutSec(int timeout) { 118 xmpp_ping_timeout_sec_ = timeout; 119 if (xmpp_ping_timeout_sec_ < kMinimumXmppPingTimeoutSecs) { 120 LOG(WARNING) << 121 "CP_CONNECTOR: XMPP ping timeout is less then minimal value"; 122 xmpp_ping_timeout_sec_ = kMinimumXmppPingTimeoutSecs; 123 } 124 } 125 126 } // namespace cloud_print 127