blob: 95025081db37714946a33775b2d45d08243548af [file] [log] [blame]
mukesh agrawal4d0401c2012-01-06 16:05:31 -08001// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
Chris Masoned7732e42011-05-20 11:08:56 -07002// 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/service_dbus_adaptor.h"
6
7#include <map>
8#include <string>
9
Chris Masone8fe2c7e2011-06-09 15:51:19 -070010#include "shill/error.h"
Christopher Wileyb691efd2012-08-09 13:51:51 -070011#include "shill/logging.h"
Chris Masonea82b7112011-05-25 15:16:29 -070012#include "shill/service.h"
13
Chris Masoned7732e42011-05-20 11:08:56 -070014using std::map;
15using std::string;
Paul Stewartbcb2c962012-10-31 10:52:10 -070016using std::vector;
Chris Masoned7732e42011-05-20 11:08:56 -070017
18namespace shill {
19
Rebecca Silbersteinc9c31d82014-10-21 15:01:00 -070020namespace Logging {
21static auto kModuleLogScope = ScopeLogger::kDBus;
Paul Stewart1a212a62015-06-16 13:13:10 -070022static string ObjectID(ServiceDBusAdaptor* s) { return s->GetRpcIdentifier(); }
Rebecca Silbersteinc9c31d82014-10-21 15:01:00 -070023}
24
Chris Masoned7732e42011-05-20 11:08:56 -070025// static
Chris Masonea82b7112011-05-25 15:16:29 -070026const char ServiceDBusAdaptor::kPath[] = "/service/";
Chris Masoned7732e42011-05-20 11:08:56 -070027
Paul Stewart1a212a62015-06-16 13:13:10 -070028ServiceDBusAdaptor::ServiceDBusAdaptor(DBus::Connection* conn, Service* service)
Ben Chan3f4d4ee2014-09-09 07:41:33 -070029 : DBusAdaptor(conn, kPath + service->unique_name()), service_(service) {}
Chris Masoneec6b18b2011-06-08 14:09:10 -070030
31ServiceDBusAdaptor::~ServiceDBusAdaptor() {
Ben Chancc225ef2014-09-30 13:26:51 -070032 service_ = nullptr;
Chris Masoneec6b18b2011-06-08 14:09:10 -070033}
Chris Masoned7732e42011-05-20 11:08:56 -070034
35void ServiceDBusAdaptor::UpdateConnected() {}
36
Paul Stewart1a212a62015-06-16 13:13:10 -070037void ServiceDBusAdaptor::EmitBoolChanged(const string& name, bool value) {
Rebecca Silbersteinc9c31d82014-10-21 15:01:00 -070038 SLOG(this, 2) << __func__ << ": Service " << service_->unique_name()
Peter Qiu047a21c2014-04-01 11:48:50 -070039 << " " << name;
Chris Masoned0ceb8c2011-06-02 10:05:39 -070040 PropertyChanged(name, DBusAdaptor::BoolToVariant(value));
41}
42
Paul Stewart1a212a62015-06-16 13:13:10 -070043void ServiceDBusAdaptor::EmitUint8Changed(const string& name, uint8_t value) {
Rebecca Silbersteinc9c31d82014-10-21 15:01:00 -070044 SLOG(this, 2) << __func__ << ": Service " << service_->unique_name()
Peter Qiu047a21c2014-04-01 11:48:50 -070045 << " " << name;
Darin Petkovd78ee7e2012-01-12 11:21:10 +010046 PropertyChanged(name, DBusAdaptor::ByteToVariant(value));
47}
48
Paul Stewart1a212a62015-06-16 13:13:10 -070049void ServiceDBusAdaptor::EmitUint16Changed(const string& name, uint16_t value) {
Rebecca Silbersteinc9c31d82014-10-21 15:01:00 -070050 SLOG(this, 2) << __func__ << ": Service " << service_->unique_name()
Peter Qiu047a21c2014-04-01 11:48:50 -070051 << " " << name;
mukesh agrawale1d90e92012-02-15 17:36:08 -080052 PropertyChanged(name, DBusAdaptor::Uint16ToVariant(value));
53}
54
Paul Stewart1a212a62015-06-16 13:13:10 -070055void ServiceDBusAdaptor::EmitUint16sChanged(const string& name,
56 const Uint16s& value) {
Rebecca Silbersteinc9c31d82014-10-21 15:01:00 -070057 SLOG(this, 2) << __func__ << ": Service " << service_->unique_name()
Peter Qiu047a21c2014-04-01 11:48:50 -070058 << " " << name;
mukesh agrawale7c7e652013-06-18 17:19:39 -070059 PropertyChanged(name, DBusAdaptor::Uint16sToVariant(value));
60}
61
Paul Stewart1a212a62015-06-16 13:13:10 -070062void ServiceDBusAdaptor::EmitUintChanged(const string& name, uint32_t value) {
Rebecca Silbersteinc9c31d82014-10-21 15:01:00 -070063 SLOG(this, 2) << __func__ << ": Service " << service_->unique_name()
Peter Qiu047a21c2014-04-01 11:48:50 -070064 << " " << name;
Chris Masone8fe2c7e2011-06-09 15:51:19 -070065 PropertyChanged(name, DBusAdaptor::Uint32ToVariant(value));
Chris Masoned0ceb8c2011-06-02 10:05:39 -070066}
67
Paul Stewart1a212a62015-06-16 13:13:10 -070068void ServiceDBusAdaptor::EmitIntChanged(const string& name, int value) {
Rebecca Silbersteinc9c31d82014-10-21 15:01:00 -070069 SLOG(this, 2) << __func__ << ": Service " << service_->unique_name()
Peter Qiu047a21c2014-04-01 11:48:50 -070070 << " " << name;
Chris Masone8fe2c7e2011-06-09 15:51:19 -070071 PropertyChanged(name, DBusAdaptor::Int32ToVariant(value));
Chris Masoned0ceb8c2011-06-02 10:05:39 -070072}
73
Paul Stewart1a212a62015-06-16 13:13:10 -070074void ServiceDBusAdaptor::EmitRpcIdentifierChanged(const string& name,
75 const string& value) {
Rebecca Silbersteinc9c31d82014-10-21 15:01:00 -070076 SLOG(this, 2) << __func__ << ": Service " << service_->unique_name()
Peter Qiu047a21c2014-04-01 11:48:50 -070077 << " " << name;
Paul Stewart1e3bc4962012-09-14 12:20:22 -070078 PropertyChanged(name, DBusAdaptor::PathToVariant(value));
79}
80
Paul Stewart1a212a62015-06-16 13:13:10 -070081void ServiceDBusAdaptor::EmitStringChanged(const string& name,
82 const string& value) {
Rebecca Silbersteinc9c31d82014-10-21 15:01:00 -070083 SLOG(this, 2) << __func__ << ": Service " << service_->unique_name()
Peter Qiu047a21c2014-04-01 11:48:50 -070084 << " " << name;
Chris Masoned0ceb8c2011-06-02 10:05:39 -070085 PropertyChanged(name, DBusAdaptor::StringToVariant(value));
Darin Petkov9cb02682012-01-28 00:17:38 +010086}
Chris Masoned0ceb8c2011-06-02 10:05:39 -070087
Paul Stewart1a212a62015-06-16 13:13:10 -070088void ServiceDBusAdaptor::EmitStringmapChanged(const string& name,
89 const Stringmap& value) {
Rebecca Silbersteinc9c31d82014-10-21 15:01:00 -070090 SLOG(this, 2) << __func__ << ": Service " << service_->unique_name()
Peter Qiu047a21c2014-04-01 11:48:50 -070091 << " " << name;
Darin Petkov9cb02682012-01-28 00:17:38 +010092 PropertyChanged(name, DBusAdaptor::StringmapToVariant(value));
Chris Masoned0ceb8c2011-06-02 10:05:39 -070093}
94
Ben Chan3f4d4ee2014-09-09 07:41:33 -070095map<string, DBus::Variant> ServiceDBusAdaptor::GetProperties(
Paul Stewart1a212a62015-06-16 13:13:10 -070096 DBus::Error& error) { // NOLINT
Rebecca Silbersteinc9c31d82014-10-21 15:01:00 -070097 SLOG(this, 2) << __func__ << ": Service " << service_->unique_name();
Ben Chan3f4d4ee2014-09-09 07:41:33 -070098 map<string, DBus::Variant> properties;
Chris Masone27c4aa52011-07-02 13:10:14 -070099 DBusAdaptor::GetProperties(service_->store(), &properties, &error);
Chris Masonea8a2c252011-06-27 22:16:30 -0700100 return properties;
Chris Masoned7732e42011-05-20 11:08:56 -0700101}
102
Paul Stewart1a212a62015-06-16 13:13:10 -0700103void ServiceDBusAdaptor::SetProperty(const string& name,
104 const DBus::Variant& value,
105 DBus::Error& error) { // NOLINT
Rebecca Silbersteinc9c31d82014-10-21 15:01:00 -0700106 SLOG(this, 2) << __func__ << ": Service " << service_->unique_name()
Peter Qiu047a21c2014-04-01 11:48:50 -0700107 << " " << name;
mukesh agrawal6bb9e7c2012-01-30 14:57:54 -0800108 DBusAdaptor::SetProperty(service_->mutable_store(), name, value, &error);
Chris Masoned7732e42011-05-20 11:08:56 -0700109}
110
Paul Stewart1a212a62015-06-16 13:13:10 -0700111void ServiceDBusAdaptor::SetProperties(const map<string, DBus::Variant>& args,
112 DBus::Error& error) { // NOLINT
Rebecca Silbersteinc9c31d82014-10-21 15:01:00 -0700113 SLOG(this, 2) << __func__ << ": Service " << service_->unique_name();
Paul Stewartad0e5982013-07-02 08:47:47 -0700114 KeyValueStore args_store;
115 Error key_value_store_error;
116 DBusAdaptor::ArgsToKeyValueStore(args, &args_store, &key_value_store_error);
117 if (key_value_store_error.ToDBusError(&error)) {
118 return;
119 }
120 Error configure_error;
121 service_->Configure(args_store, &configure_error);
122 configure_error.ToDBusError(&error);
123}
124
Paul Stewart1a212a62015-06-16 13:13:10 -0700125void ServiceDBusAdaptor::ClearProperty(const string& name,
126 DBus::Error& error) { // NOLINT
Rebecca Silbersteinc9c31d82014-10-21 15:01:00 -0700127 SLOG(this, 2) << __func__ << ": Service " << service_->unique_name()
Peter Qiu047a21c2014-04-01 11:48:50 -0700128 << " " << name;
mukesh agrawal8abd2f62012-01-30 14:56:14 -0800129 DBusAdaptor::ClearProperty(service_->mutable_store(), name, &error);
Paul Stewartd215af62012-04-24 23:25:50 -0700130 if (!error.is_set()) {
131 service_->OnPropertyChanged(name);
132 }
Chris Masoned7732e42011-05-20 11:08:56 -0700133}
134
Ben Chan3f4d4ee2014-09-09 07:41:33 -0700135vector<bool> ServiceDBusAdaptor::ClearProperties(
Paul Stewart1a212a62015-06-16 13:13:10 -0700136 const vector<string>& names, DBus::Error& /*error*/) { // NOLINT
Rebecca Silbersteinc9c31d82014-10-21 15:01:00 -0700137 SLOG(this, 2) << __func__ << ": Service " << service_->unique_name();
Paul Stewartbcb2c962012-10-31 10:52:10 -0700138 vector<bool> results;
139 vector<string>::const_iterator it;
140 for (it = names.begin(); it != names.end(); ++it) {
Ben Chan3f4d4ee2014-09-09 07:41:33 -0700141 DBus::Error error;
Paul Stewartbcb2c962012-10-31 10:52:10 -0700142 ClearProperty(*it, error);
143 results.push_back(!error.is_set());
144 }
145 return results;
146}
147
Paul Stewart1a212a62015-06-16 13:13:10 -0700148void ServiceDBusAdaptor::Connect(DBus::Error& error) { // NOLINT
Rebecca Silbersteinc9c31d82014-10-21 15:01:00 -0700149 SLOG(this, 2) << __func__ << ": Service " << service_->unique_name();
Darin Petkov4d6d9412011-08-24 13:19:54 -0700150 Error e;
Peter Qiudc4e0992014-05-01 10:02:52 -0700151 service_->UserInitiatedConnect(&e);
Darin Petkov4d6d9412011-08-24 13:19:54 -0700152 e.ToDBusError(&error);
Chris Masoned7732e42011-05-20 11:08:56 -0700153}
154
Paul Stewart1a212a62015-06-16 13:13:10 -0700155void ServiceDBusAdaptor::Disconnect(DBus::Error& error) { // NOLINT
Rebecca Silbersteinc9c31d82014-10-21 15:01:00 -0700156 SLOG(this, 2) << __func__ << ": Service " << service_->unique_name();
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +0000157 Error e;
Christopher Wileyabd3b502012-09-26 13:08:52 -0700158 service_->UserInitiatedDisconnect(&e);
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +0000159 e.ToDBusError(&error);
Chris Masoned7732e42011-05-20 11:08:56 -0700160}
161
Paul Stewart1a212a62015-06-16 13:13:10 -0700162void ServiceDBusAdaptor::Remove(DBus::Error& error) { // NOLINT
Rebecca Silbersteinc9c31d82014-10-21 15:01:00 -0700163 SLOG(this, 2) << __func__ << ": Service " << service_->unique_name();
Albert Chaulk0e1cdea2013-02-27 15:32:55 -0800164 Error e;
165 service_->Remove(&e);
166 e.ToDBusError(&error);
Chris Masoned7732e42011-05-20 11:08:56 -0700167}
168
Paul Stewart1a212a62015-06-16 13:13:10 -0700169void ServiceDBusAdaptor::ActivateCellularModem(const string& carrier,
170 DBus::Error& error) { // NOLINT
Rebecca Silbersteinc9c31d82014-10-21 15:01:00 -0700171 SLOG(this, 2) << __func__ << ": Service " << service_->unique_name();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500172 Error e(Error::kOperationInitiated);
Paul Stewart1a212a62015-06-16 13:13:10 -0700173 DBus::Tag* tag = new DBus::Tag();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500174 service_->ActivateCellularModem(carrier, &e, GetMethodReplyCallback(tag));
175 ReturnResultOrDefer(tag, e, &error);
Chris Masoned7732e42011-05-20 11:08:56 -0700176}
177
Ben Chan3f4d4ee2014-09-09 07:41:33 -0700178void ServiceDBusAdaptor::CompleteCellularActivation(
Paul Stewart1a212a62015-06-16 13:13:10 -0700179 DBus::Error& error) { // NOLINT
Rebecca Silbersteinc9c31d82014-10-21 15:01:00 -0700180 SLOG(this, 2) << __func__ << ": Service " << service_->unique_name();
Ben Chan5d924542013-02-14 17:49:08 -0800181 Error e;
182 service_->CompleteCellularActivation(&e);
183 e.ToDBusError(&error);
184}
185
Ben Chan3f4d4ee2014-09-09 07:41:33 -0700186map<DBus::Path, string> ServiceDBusAdaptor::GetLoadableProfileEntries(
Paul Stewart1a212a62015-06-16 13:13:10 -0700187 DBus::Error& error) { // NOLINT
Rebecca Silbersteinc9c31d82014-10-21 15:01:00 -0700188 SLOG(this, 2) << __func__ << ": Service " << service_->unique_name();
Paul Stewart967eaeb2013-04-25 19:53:07 -0700189 map<string, string> profile_entry_strings =
190 service_->GetLoadableProfileEntries();
Ben Chan3f4d4ee2014-09-09 07:41:33 -0700191 map<DBus::Path, string> profile_entries;
Paul Stewart1a212a62015-06-16 13:13:10 -0700192 for (const auto& entry : profile_entry_strings) {
Ben Chan3f4d4ee2014-09-09 07:41:33 -0700193 profile_entries[DBus::Path(entry.first)] = entry.second;
Paul Stewart967eaeb2013-04-25 19:53:07 -0700194 }
195 return profile_entries;
196}
197
Chris Masoned7732e42011-05-20 11:08:56 -0700198} // namespace shill