blob: 8f8a967f65e9624e2e0b53c56415fb11789c6525 [file] [log] [blame]
Darin Petkov002c58e2012-06-19 02:56:05 +02001// 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/dbus_manager.h"
6
7#include <base/bind.h>
8
9#include "shill/dbus_service_proxy_interface.h"
10#include "shill/error.h"
Christopher Wileyb691efd2012-08-09 13:51:51 -070011#include "shill/logging.h"
Darin Petkov002c58e2012-06-19 02:56:05 +020012#include "shill/proxy_factory.h"
Darin Petkov002c58e2012-06-19 02:56:05 +020013
14using base::Bind;
15using base::Unretained;
16using std::list;
17using std::map;
18using std::string;
19
20namespace shill {
21
Rebecca Silbersteinc9c31d82014-10-21 15:01:00 -070022namespace Logging {
23static auto kModuleLogScope = ScopeLogger::kDBus;
Paul Stewarta794cd62015-06-16 13:13:10 -070024static string ObjectID(DBusManager* d) { return "(dbus_manager)"; }
Rebecca Silbersteinc9c31d82014-10-21 15:01:00 -070025}
26
Darin Petkov002c58e2012-06-19 02:56:05 +020027namespace {
28
29const int kDefaultRPCTimeoutMS = 30000;
30
31} // namespace
32
33DBusManager::DBusManager()
34 : proxy_factory_(ProxyFactory::GetInstance()) {}
35
36DBusManager::~DBusManager() {}
37
38void DBusManager::Start() {
Rebecca Silbersteinc9c31d82014-10-21 15:01:00 -070039 SLOG(this, 2) << __func__;
Darin Petkov002c58e2012-06-19 02:56:05 +020040 if (proxy_.get()) {
41 return;
42 }
43 proxy_.reset(proxy_factory_->CreateDBusServiceProxy());
44 proxy_->set_name_owner_changed_callback(
45 Bind(&DBusManager::OnNameOwnerChanged, Unretained(this)));
46}
47
48void DBusManager::Stop() {
Rebecca Silbersteinc9c31d82014-10-21 15:01:00 -070049 SLOG(this, 2) << __func__;
Darin Petkov002c58e2012-06-19 02:56:05 +020050 proxy_.reset();
51 name_watchers_.clear();
52}
53
Paul Stewarta794cd62015-06-16 13:13:10 -070054DBusNameWatcher* DBusManager::CreateNameWatcher(
55 const string& name,
56 const DBusNameWatcher::NameAppearedCallback& name_appeared_callback,
57 const DBusNameWatcher::NameVanishedCallback& name_vanished_callback) {
Ben Chan084faca2013-07-02 14:25:12 -070058 // DBusNameWatcher holds a weak pointer to, and thus may outlive, this
59 // DBusManager object.
Ben Chand1fce552014-10-17 01:12:52 -070060 std::unique_ptr<DBusNameWatcher> name_watcher(new DBusNameWatcher(
Ben Chan084faca2013-07-02 14:25:12 -070061 this, name, name_appeared_callback, name_vanished_callback));
62 name_watchers_[name].push_back(name_watcher.get());
63
Darin Petkov002c58e2012-06-19 02:56:05 +020064 Error error;
Ben Chan084faca2013-07-02 14:25:12 -070065 proxy_->GetNameOwner(name,
66 &error,
67 Bind(&DBusManager::OnGetNameOwnerComplete,
68 AsWeakPtr(),
69 name_watcher->AsWeakPtr()),
70 kDefaultRPCTimeoutMS);
Darin Petkov002c58e2012-06-19 02:56:05 +020071 // Ensures that the watcher gets an initial appear/vanish notification
72 // regardless of the outcome of the GetNameOwner call.
73 if (error.IsFailure()) {
Ben Chan084faca2013-07-02 14:25:12 -070074 OnGetNameOwnerComplete(name_watcher->AsWeakPtr(), string(), error);
75 }
76 return name_watcher.release();
77}
78
Paul Stewarta794cd62015-06-16 13:13:10 -070079void DBusManager::RemoveNameWatcher(DBusNameWatcher* name_watcher) {
Ben Chan084faca2013-07-02 14:25:12 -070080 CHECK(name_watcher);
81
82 auto watcher_iterator = name_watchers_.find(name_watcher->name());
83 if (watcher_iterator != name_watchers_.end()) {
84 watcher_iterator->second.remove(name_watcher);
Darin Petkov002c58e2012-06-19 02:56:05 +020085 }
86}
87
88void DBusManager::OnNameOwnerChanged(
Paul Stewarta794cd62015-06-16 13:13:10 -070089 const string& name, const string& old_owner, const string& new_owner) {
Ben Chan084faca2013-07-02 14:25:12 -070090 auto watcher_iterator = name_watchers_.find(name);
91 if (watcher_iterator == name_watchers_.end()) {
Darin Petkov002c58e2012-06-19 02:56:05 +020092 return;
93 }
Ben Chan084faca2013-07-02 14:25:12 -070094 LOG(INFO) << "DBus name '" << name << "' owner changed ('" << old_owner
95 << "' -> '" << new_owner << "')";
Paul Stewarta794cd62015-06-16 13:13:10 -070096 for (const auto& watcher : watcher_iterator->second) {
Ben Chan084faca2013-07-02 14:25:12 -070097 watcher->OnNameOwnerChanged(new_owner);
Darin Petkov002c58e2012-06-19 02:56:05 +020098 }
99}
100
Ben Chan084faca2013-07-02 14:25:12 -0700101void DBusManager::OnGetNameOwnerComplete(
Paul Stewarta794cd62015-06-16 13:13:10 -0700102 const base::WeakPtr<DBusNameWatcher>& watcher,
103 const string& unique_name,
104 const Error& error) {
Ben Chan084faca2013-07-02 14:25:12 -0700105 if (watcher) {
106 LOG(INFO) << "DBus name '" << watcher->name() << "' owner '" << unique_name
107 << "' (" << error.message() << ")";
108 watcher->OnNameOwnerChanged(error.IsSuccess() ? unique_name : string());
Darin Petkov002c58e2012-06-19 02:56:05 +0200109 }
110}
111
112} // namespace shill