default_profile.cc revision bf667617d573e3af4b808ed317b1d6ca04747ee4
1// Copyright (c) 2012 The Chromium OS 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 "shill/default_profile.h"
6
7#include <vector>
8
9#include <base/file_path.h>
10#include <base/string_number_conversions.h>
11#include <base/stringprintf.h>
12#include <chromeos/dbus/service_constants.h>
13
14#include "shill/adaptor_interfaces.h"
15#include "shill/control_interface.h"
16#include "shill/manager.h"
17#include "shill/portal_detector.h"
18#include "shill/resolver.h"
19#include "shill/store_interface.h"
20
21using std::string;
22using std::vector;
23
24namespace shill {
25// static
26const char DefaultProfile::kDefaultId[] = "default";
27// static
28const char DefaultProfile::kStorageId[] = "global";
29// static
30const char DefaultProfile::kStorageArpGateway[] = "ArpGateway";
31// static
32const char DefaultProfile::kStorageCheckPortalList[] = "CheckPortalList";
33// static
34const char DefaultProfile::kStorageHostName[] = "HostName";
35// static
36const char DefaultProfile::kStorageName[] = "Name";
37// static
38const char DefaultProfile::kStorageOfflineMode[] = "OfflineMode";
39// static
40const char DefaultProfile::kStoragePortalURL[] = "PortalURL";
41// static
42const char DefaultProfile::kStoragePortalCheckInterval[] =
43    "PortalCheckInterval";
44// static
45const char DefaultProfile::kStorageShortDNSTimeoutTechnologies[] =
46    "ShortDNSTimeoutTechnologies";
47
48DefaultProfile::DefaultProfile(ControlInterface *control,
49                               Manager *manager,
50                               const FilePath &storage_path,
51                               const string &profile_id,
52                               const Manager::Properties &manager_props)
53    : Profile(control, manager, Identifier(profile_id), "", true),
54      storage_path_(storage_path),
55      profile_id_(profile_id),
56      props_(manager_props) {
57  PropertyStore *store = this->mutable_store();
58  store->RegisterConstBool(flimflam::kArpGatewayProperty,
59                           &manager_props.arp_gateway);
60  store->RegisterConstString(flimflam::kCheckPortalListProperty,
61                             &manager_props.check_portal_list);
62  store->RegisterConstString(flimflam::kCountryProperty,
63                             &manager_props.country);
64  store->RegisterConstBool(flimflam::kOfflineModeProperty,
65                           &manager_props.offline_mode);
66  store->RegisterConstString(flimflam::kPortalURLProperty,
67                             &manager_props.portal_url);
68  store->RegisterConstInt32(shill::kPortalCheckIntervalProperty,
69                            &manager_props.portal_check_interval_seconds);
70  store->RegisterConstString(shill::kShortDNSTimeoutTechnologiesProperty,
71                             &manager_props.short_dns_timeout_technologies);
72}
73
74DefaultProfile::~DefaultProfile() {}
75
76bool DefaultProfile::LoadManagerProperties(Manager::Properties *manager_props) {
77  storage()->GetBool(kStorageId, kStorageArpGateway,
78                     &manager_props->arp_gateway);
79  storage()->GetString(kStorageId, kStorageHostName, &manager_props->host_name);
80  storage()->GetBool(kStorageId, kStorageOfflineMode,
81                     &manager_props->offline_mode);
82  if (!storage()->GetString(kStorageId,
83                            kStorageCheckPortalList,
84                            &manager_props->check_portal_list)) {
85    manager_props->check_portal_list = PortalDetector::kDefaultCheckPortalList;
86  }
87  if (!storage()->GetString(kStorageId, kStoragePortalURL,
88                            &manager_props->portal_url)) {
89    manager_props->portal_url = PortalDetector::kDefaultURL;
90  }
91  std::string check_interval;
92  if (!storage()->GetString(kStorageId, kStoragePortalCheckInterval,
93                            &check_interval) ||
94      !base::StringToInt(check_interval,
95                         &manager_props->portal_check_interval_seconds)) {
96    manager_props->portal_check_interval_seconds =
97        PortalDetector::kDefaultCheckIntervalSeconds;
98  }
99  if (!storage()->GetString(kStorageId,
100                            kStorageShortDNSTimeoutTechnologies,
101                            &manager_props->short_dns_timeout_technologies)) {
102    manager_props->short_dns_timeout_technologies =
103        Resolver::kDefaultShortTimeoutTechnologies;
104  }
105  return true;
106}
107
108bool DefaultProfile::ConfigureService(const ServiceRefPtr &service) {
109  if (Profile::ConfigureService(service)) {
110    return true;
111  }
112  if (service->technology() == Technology::kEthernet) {
113    // Ethernet services should have an affinity towards the default profile,
114    // so even if a new Ethernet service has no known configuration, accept
115    // it anyway.
116    UpdateService(service);
117    service->set_profile(this);
118    return true;
119  }
120  return false;
121}
122
123bool DefaultProfile::Save() {
124  storage()->SetBool(kStorageId, kStorageArpGateway, props_.arp_gateway);
125  storage()->SetString(kStorageId, kStorageHostName, props_.host_name);
126  storage()->SetString(kStorageId, kStorageName, GetFriendlyName());
127  storage()->SetBool(kStorageId, kStorageOfflineMode, props_.offline_mode);
128  storage()->SetString(kStorageId,
129                       kStorageCheckPortalList,
130                       props_.check_portal_list);
131  storage()->SetString(kStorageId,
132                       kStoragePortalURL,
133                       props_.portal_url);
134  storage()->SetString(kStorageId,
135                       kStoragePortalCheckInterval,
136                       base::IntToString(props_.portal_check_interval_seconds));
137  storage()->SetString(kStorageId,
138                       kStorageShortDNSTimeoutTechnologies,
139                       props_.short_dns_timeout_technologies);
140  return Profile::Save();
141}
142
143bool DefaultProfile::UpdateDevice(const DeviceRefPtr &device) {
144  return device->Save(storage()) && storage()->Flush();
145}
146
147bool DefaultProfile::GetStoragePath(FilePath *path) {
148  *path = storage_path_.Append(base::StringPrintf("%s.profile",
149                                                  profile_id_.c_str()));
150  return true;
151}
152
153}  // namespace shill
154