blob: 380f10eaac63c971c65d25b7fb8133dab4470cd4 [file] [log] [blame]
Vitaly Buka3ef4fff2015-07-31 01:12:07 -07001// Copyright 2014 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 "buffet/ap_manager_client.h"
6
7namespace buffet {
8
9using org::chromium::apmanager::ConfigProxy;
10using org::chromium::apmanager::ManagerProxy;
11using org::chromium::apmanager::ServiceProxy;
12
13ApManagerClient::ApManagerClient(const scoped_refptr<dbus::Bus>& bus)
14 : bus_(bus) {}
15
16ApManagerClient::~ApManagerClient() {
17 Stop();
18}
19
20void ApManagerClient::Start(const std::string& ssid) {
21 if (service_path_.IsValid()) {
22 return;
23 }
24
25 ssid_ = ssid;
26
27 object_manager_proxy_.reset(
28 new org::chromium::apmanager::ObjectManagerProxy{bus_});
29 object_manager_proxy_->SetManagerAddedCallback(base::Bind(
30 &ApManagerClient::OnManagerAdded, weak_ptr_factory_.GetWeakPtr()));
31 object_manager_proxy_->SetServiceAddedCallback(base::Bind(
32 &ApManagerClient::OnServiceAdded, weak_ptr_factory_.GetWeakPtr()));
33
34 object_manager_proxy_->SetServiceRemovedCallback(base::Bind(
35 &ApManagerClient::OnServiceRemoved, weak_ptr_factory_.GetWeakPtr()));
36 object_manager_proxy_->SetManagerRemovedCallback(base::Bind(
37 &ApManagerClient::OnManagerRemoved, weak_ptr_factory_.GetWeakPtr()));
38}
39
40void ApManagerClient::Stop() {
41 if (manager_proxy_ && service_path_.IsValid()) {
42 RemoveService(service_path_);
43 }
44 service_path_ = dbus::ObjectPath();
45 service_proxy_ = nullptr;
46 manager_proxy_ = nullptr;
47 object_manager_proxy_.reset();
48 ssid_.clear();
49}
50
51void ApManagerClient::RemoveService(const dbus::ObjectPath& object_path) {
52 CHECK(object_path.IsValid());
Alex Vakulenko41705852015-10-13 10:12:06 -070053 brillo::ErrorPtr error;
Vitaly Buka3ef4fff2015-07-31 01:12:07 -070054 if (!manager_proxy_->RemoveService(object_path, &error)) {
55 LOG(ERROR) << "RemoveService failed: " << error->GetMessage();
56 }
57}
58
59void ApManagerClient::OnManagerAdded(ManagerProxy* manager_proxy) {
60 VLOG(1) << "manager added: " << manager_proxy->GetObjectPath().value();
61 manager_proxy_ = manager_proxy;
62
63 if (service_path_.IsValid())
64 return;
65
Alex Vakulenko41705852015-10-13 10:12:06 -070066 brillo::ErrorPtr error;
Vitaly Buka3ef4fff2015-07-31 01:12:07 -070067 if (!manager_proxy_->CreateService(&service_path_, &error)) {
68 LOG(ERROR) << "CreateService failed: " << error->GetMessage();
69 }
70}
71
72void ApManagerClient::OnServiceAdded(ServiceProxy* service_proxy) {
73 VLOG(1) << "service added: " << service_proxy->GetObjectPath().value();
74 if (service_proxy->GetObjectPath() != service_path_) {
75 RemoveService(service_proxy->GetObjectPath());
76 return;
77 }
78 service_proxy_ = service_proxy;
79
80 ConfigProxy* config_proxy =
81 object_manager_proxy_->GetConfigProxy(service_proxy->config());
82 ConfigProxy::PropertySet* properties = config_proxy->GetProperties();
83 properties->ssid.Set(ssid_, base::Bind(&ApManagerClient::OnSsidSet,
84 weak_ptr_factory_.GetWeakPtr()));
85}
86
87void ApManagerClient::OnSsidSet(bool success) {
88 if (!success || !service_proxy_) {
89 LOG(ERROR) << "Failed to set ssid.";
90 return;
91 }
92 VLOG(1) << "SSID is set: " << ssid_;
93
Alex Vakulenko41705852015-10-13 10:12:06 -070094 brillo::ErrorPtr error;
Vitaly Buka3ef4fff2015-07-31 01:12:07 -070095 if (!service_proxy_->Start(&error)) {
96 LOG(ERROR) << "Service start failed: " << error->GetMessage();
97 }
98}
99
100void ApManagerClient::OnServiceRemoved(const dbus::ObjectPath& object_path) {
101 VLOG(1) << "service removed: " << object_path.value();
102 if (object_path != service_path_)
103 return;
104 service_path_ = dbus::ObjectPath();
105 service_proxy_ = nullptr;
106}
107
108void ApManagerClient::OnManagerRemoved(const dbus::ObjectPath& object_path) {
109 VLOG(1) << "manager removed: " << object_path.value();
110 manager_proxy_ = nullptr;
111 Stop();
112}
113
114} // namespace buffet