1 //
2 // Copyright (C) 2015 The Android Open Source Project
3 //
4 // Licensed under the Apache License, Version 2.0 (the "License");
5 // you may not use this file except in compliance with the License.
6 // You may obtain a copy of the License at
7 //
8 // http://www.apache.org/licenses/LICENSE-2.0
9 //
10 // Unless required by applicable law or agreed to in writing, software
11 // distributed under the License is distributed on an "AS IS" BASIS,
12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 // See the License for the specific language governing permissions and
14 // limitations under the License.
15 //
16
17 #include "shill/dbus/chromeos_wimax_network_proxy.h"
18
19 #if defined(__ANDROID__)
20 #include <dbus/service_constants.h>
21 #else
22 #include <chromeos/dbus/service_constants.h>
23 #endif // __ANDROID__
24
25 #include "shill/error.h"
26 #include "shill/logging.h"
27
28 using std::string;
29
30 namespace shill {
31
32 namespace Logging {
33 static auto kModuleLogScope = ScopeLogger::kDBus;
ObjectID(const dbus::ObjectPath * p)34 static string ObjectID(const dbus::ObjectPath* p) {
35 return "wimax_network_proxy (" + p->value() + ")";
36 }
37 }
38
39 // static.
40 const char ChromeosWiMaxNetworkProxy::kPropertyIdentifier[] = "Identifier";
41 const char ChromeosWiMaxNetworkProxy::kPropertyName[] = "Name";
42 const char ChromeosWiMaxNetworkProxy::kPropertyType[] = "Type";
43 const char ChromeosWiMaxNetworkProxy::kPropertyCINR[] = "CINR";
44 const char ChromeosWiMaxNetworkProxy::kPropertyRSSI[] = "RSSI";
45 const char ChromeosWiMaxNetworkProxy::kPropertySignalStrength[] =
46 "SignalStrength";
47
PropertySet(dbus::ObjectProxy * object_proxy,const std::string & interface_name,const PropertyChangedCallback & callback)48 ChromeosWiMaxNetworkProxy::PropertySet::PropertySet(
49 dbus::ObjectProxy* object_proxy,
50 const std::string& interface_name,
51 const PropertyChangedCallback& callback)
52 : dbus::PropertySet(object_proxy, interface_name, callback) {
53 RegisterProperty(kPropertyIdentifier, &identifier);
54 RegisterProperty(kPropertyName, &name);
55 RegisterProperty(kPropertyType, &type);
56 RegisterProperty(kPropertyCINR, &cinr);
57 RegisterProperty(kPropertyRSSI, &rssi);
58 RegisterProperty(kPropertySignalStrength, &signal_strength);
59 }
60
ChromeosWiMaxNetworkProxy(const scoped_refptr<dbus::Bus> & bus,const std::string & rpc_identifier)61 ChromeosWiMaxNetworkProxy::ChromeosWiMaxNetworkProxy(
62 const scoped_refptr<dbus::Bus>& bus,
63 const std::string& rpc_identifier)
64 : proxy_(
65 new org::chromium::WiMaxManager::NetworkProxy(
66 bus,
67 wimax_manager::kWiMaxManagerServiceName,
68 dbus::ObjectPath(rpc_identifier))) {
69 // Register signal handlers.
70 proxy_->RegisterSignalStrengthChangedSignalHandler(
71 base::Bind(&ChromeosWiMaxNetworkProxy::SignalStrengthChanged,
72 weak_factory_.GetWeakPtr()),
73 base::Bind(&ChromeosWiMaxNetworkProxy::OnSignalConnected,
74 weak_factory_.GetWeakPtr()));
75
76 // Register properties.
77 properties_.reset(
78 new PropertySet(
79 proxy_->GetObjectProxy(),
80 wimax_manager::kWiMaxManagerNetworkInterface,
81 base::Bind(&ChromeosWiMaxNetworkProxy::OnPropertyChanged,
82 weak_factory_.GetWeakPtr())));
83 properties_->ConnectSignals();
84 properties_->GetAll();
85 }
86
87
~ChromeosWiMaxNetworkProxy()88 ChromeosWiMaxNetworkProxy::~ChromeosWiMaxNetworkProxy() {
89 proxy_->ReleaseObjectProxy(base::Bind(&base::DoNothing));
90 }
91
path() const92 RpcIdentifier ChromeosWiMaxNetworkProxy::path() const {
93 return proxy_->GetObjectPath().value();
94 }
95
set_signal_strength_changed_callback(const SignalStrengthChangedCallback & callback)96 void ChromeosWiMaxNetworkProxy::set_signal_strength_changed_callback(
97 const SignalStrengthChangedCallback& callback) {
98 signal_strength_changed_callback_ = callback;
99 }
100
Identifier(Error *)101 uint32_t ChromeosWiMaxNetworkProxy::Identifier(Error* /*error*/) {
102 SLOG(&proxy_->GetObjectPath(), 2) << __func__;
103 if (!properties_->identifier.GetAndBlock()) {
104 LOG(ERROR) << "Failed to get Identifier";
105 return 0;
106 }
107 return properties_->identifier.value();
108 }
109
Name(Error *)110 string ChromeosWiMaxNetworkProxy::Name(Error* /*error*/) {
111 SLOG(&proxy_->GetObjectPath(), 2) << __func__;
112 if (!properties_->name.GetAndBlock()) {
113 LOG(ERROR) << "Failed to get Name";
114 return string();
115 }
116 return properties_->name.value();
117 }
118
Type(Error *)119 int ChromeosWiMaxNetworkProxy::Type(Error* /*error*/) {
120 SLOG(&proxy_->GetObjectPath(), 2) << __func__;
121 if (!properties_->type.GetAndBlock()) {
122 LOG(ERROR) << "Failed to get Type";
123 return 0;
124 }
125 return properties_->type.value();
126 }
127
CINR(Error *)128 int ChromeosWiMaxNetworkProxy::CINR(Error* /*error*/) {
129 SLOG(&proxy_->GetObjectPath(), 2) << __func__;
130 if (!properties_->cinr.GetAndBlock()) {
131 LOG(ERROR) << "Failed to get CINR";
132 return 0;
133 }
134 return properties_->cinr.value();
135 }
136
RSSI(Error *)137 int ChromeosWiMaxNetworkProxy::RSSI(Error* /*error*/) {
138 SLOG(&proxy_->GetObjectPath(), 2) << __func__;
139 if (!properties_->rssi.GetAndBlock()) {
140 LOG(ERROR) << "Failed to get RSSI";
141 return 0;
142 }
143 return properties_->rssi.value();
144 }
145
SignalStrength(Error *)146 int ChromeosWiMaxNetworkProxy::SignalStrength(Error* /*error*/) {
147 SLOG(&proxy_->GetObjectPath(), 2) << __func__;
148 if (!properties_->signal_strength.GetAndBlock()) {
149 LOG(ERROR) << "Faild to get SignalStrength";
150 return 0;
151 }
152 return properties_->signal_strength.value();
153 }
154
SignalStrengthChanged(int32_t signal_strength)155 void ChromeosWiMaxNetworkProxy::SignalStrengthChanged(int32_t signal_strength) {
156 SLOG(&proxy_->GetObjectPath(), 2) << __func__
157 << "(" << signal_strength << ")";
158 if (!signal_strength_changed_callback_.is_null()) {
159 signal_strength_changed_callback_.Run(signal_strength);
160 }
161 }
162
OnSignalConnected(const string & interface_name,const string & signal_name,bool success)163 void ChromeosWiMaxNetworkProxy::OnSignalConnected(
164 const string& interface_name, const string& signal_name, bool success) {
165 SLOG(&proxy_->GetObjectPath(), 2) << __func__
166 << "interface: " << interface_name << " signal: " << signal_name
167 << "success: " << success;
168 if (!success) {
169 LOG(ERROR) << "Failed to connect signal " << signal_name
170 << " to interface " << interface_name;
171 }
172 }
173
OnPropertyChanged(const std::string & property_name)174 void ChromeosWiMaxNetworkProxy::OnPropertyChanged(
175 const std::string& property_name) {
176 SLOG(&proxy_->GetObjectPath(), 2) << __func__ << ": " << property_name;
177 }
178
179 } // namespace shill
180