15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2011 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/prefs/proxy_config_dictionary.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Integer to specify the type of proxy settings.
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// See ProxyPrefs for possible values and interactions with the other proxy
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// preferences.
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kProxyMode[] = "mode";
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// String specifying the proxy server. For a specification of the expected
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// syntax see net::ProxyConfig::ProxyRules::ParseFromString().
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kProxyServer[] = "server";
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// URL to the proxy .pac file.
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kProxyPacUrl[] = "pac_url";
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Optional boolean flag indicating whether a valid PAC script is mandatory.
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// If true, network traffic does not fall back to direct connections in case the
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// PAC script is not available.
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kProxyPacMandatory[] = "pac_mandatory";
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// String containing proxy bypass rules. For a specification of the
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// expected syntax see net::ProxyBypassRules::ParseFromString().
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kProxyBypassList[] = "bypass_list";
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ProxyConfigDictionary::ProxyConfigDictionary(const DictionaryValue* dict)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : dict_(dict->DeepCopy()) {
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ProxyConfigDictionary::~ProxyConfigDictionary() {}
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ProxyConfigDictionary::GetMode(ProxyPrefs::ProxyMode* out) const {
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string mode_str;
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return dict_->GetString(kProxyMode, &mode_str)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      && StringToProxyMode(mode_str, out);
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ProxyConfigDictionary::GetPacUrl(std::string* out) const {
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return dict_->GetString(kProxyPacUrl, out);
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ProxyConfigDictionary::GetPacMandatory(bool* out) const {
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!dict_->HasKey(kProxyPacMandatory)) {
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *out = false;
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return dict_->GetBoolean(kProxyPacMandatory, out);
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ProxyConfigDictionary::GetProxyServer(std::string* out) const {
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return dict_->GetString(kProxyServer, out);
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ProxyConfigDictionary::GetBypassList(std::string* out) const {
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return dict_->GetString(kProxyBypassList, out);
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ProxyConfigDictionary::HasBypassList() const {
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return dict_->HasKey(kProxyBypassList);
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
68868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)const DictionaryValue& ProxyConfigDictionary::GetDictionary() const {
69868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return *dict_;
70868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
71868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DictionaryValue* ProxyConfigDictionary::CreateDirect() {
74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return CreateDictionary(ProxyPrefs::MODE_DIRECT,
75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                          std::string(),
76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                          false,
77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                          std::string(),
78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                          std::string());
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DictionaryValue* ProxyConfigDictionary::CreateAutoDetect() {
83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return CreateDictionary(ProxyPrefs::MODE_AUTO_DETECT,
84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                          std::string(),
85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                          false,
86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                          std::string(),
87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                          std::string());
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DictionaryValue* ProxyConfigDictionary::CreatePacScript(
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& pac_url,
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool pac_mandatory) {
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return CreateDictionary(ProxyPrefs::MODE_PAC_SCRIPT,
95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                          pac_url,
96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                          pac_mandatory,
97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                          std::string(),
98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                          std::string());
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DictionaryValue* ProxyConfigDictionary::CreateFixedServers(
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& proxy_server,
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& bypass_list) {
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!proxy_server.empty()) {
106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return CreateDictionary(ProxyPrefs::MODE_FIXED_SERVERS,
107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                            std::string(),
108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                            false,
109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                            proxy_server,
110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                            bypass_list);
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return CreateDirect();
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DictionaryValue* ProxyConfigDictionary::CreateSystem() {
118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return CreateDictionary(ProxyPrefs::MODE_SYSTEM,
119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                          std::string(),
120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                          false,
121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                          std::string(),
122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                          std::string());
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DictionaryValue* ProxyConfigDictionary::CreateDictionary(
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ProxyPrefs::ProxyMode mode,
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& pac_url,
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool pac_mandatory,
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& proxy_server,
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& bypass_list) {
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DictionaryValue* dict = new DictionaryValue();
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dict->SetString(kProxyMode, ProxyModeToString(mode));
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!pac_url.empty()) {
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dict->SetString(kProxyPacUrl, pac_url);
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dict->SetBoolean(kProxyPacMandatory, pac_mandatory);
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!proxy_server.empty())
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dict->SetString(kProxyServer, proxy_server);
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!bypass_list.empty())
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dict->SetString(kProxyBypassList, bypass_list);
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return dict;
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
144