blob: b1c60a4608aa750e144789115b1e29c8b8d600e8 [file] [log] [blame]
Darin Petkov887f2982011-07-14 16:10:17 -07001// Copyright (c) 2011 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/modem_manager.h"
6
7#include <base/logging.h>
Darin Petkov5c97ac52011-07-19 16:30:49 -07008#include <base/stl_util-inl.h>
Darin Petkov887f2982011-07-14 16:10:17 -07009
Darin Petkov5c97ac52011-07-19 16:30:49 -070010#include "shill/modem.h"
Darin Petkovc90fe522011-07-15 13:59:47 -070011#include "shill/modem_manager_proxy.h"
12#include "shill/proxy_factory.h"
13
Darin Petkov887f2982011-07-14 16:10:17 -070014using std::string;
Darin Petkov5c97ac52011-07-19 16:30:49 -070015using std::tr1::shared_ptr;
16using std::vector;
Darin Petkov887f2982011-07-14 16:10:17 -070017
18namespace shill {
19
20ModemManager::ModemManager(const string &service,
21 const string &path,
22 ControlInterface *control_interface,
23 EventDispatcher *dispatcher,
24 Manager *manager,
25 GLib *glib)
26 : service_(service),
27 path_(path),
28 watcher_id_(0),
29 control_interface_(control_interface),
30 dispatcher_(dispatcher),
Darin Petkov67d8ecf2011-07-26 16:03:30 -070031 manager_(manager),
Darin Petkov887f2982011-07-14 16:10:17 -070032 glib_(glib) {}
33
34ModemManager::~ModemManager() {
35 Stop();
36}
37
38void ModemManager::Start() {
39 LOG(INFO) << "Start watching modem manager service: " << service_;
40 CHECK_EQ(0, watcher_id_);
Darin Petkovc90fe522011-07-15 13:59:47 -070041 // TODO(petkov): Implement DBus name watching through dbus-c++.
Darin Petkov887f2982011-07-14 16:10:17 -070042 watcher_id_ = glib_->BusWatchName(G_BUS_TYPE_SYSTEM,
43 service_.c_str(),
44 G_BUS_NAME_WATCHER_FLAGS_NONE,
45 OnAppear,
46 OnVanish,
47 this,
48 NULL);
49}
50
51void ModemManager::Stop() {
52 LOG(INFO) << "Stop watching modem manager service: " << service_;
53 if (watcher_id_) {
54 glib_->BusUnwatchName(watcher_id_);
55 watcher_id_ = 0;
56 }
57 Disconnect();
58}
59
60void ModemManager::Connect(const string &owner) {
61 owner_ = owner;
Darin Petkovc90fe522011-07-15 13:59:47 -070062 proxy_.reset(
63 ProxyFactory::factory()->CreateModemManagerProxy(this, path_, owner_));
Darin Petkov5c97ac52011-07-19 16:30:49 -070064
65 // TODO(petkov): Switch to asynchronous calls (crosbug.com/17583).
66 vector<DBus::Path> devices = proxy_->EnumerateDevices();
67 for (vector<DBus::Path>::const_iterator it = devices.begin();
68 it != devices.end(); ++it) {
69 AddModem(*it);
70 }
Darin Petkov887f2982011-07-14 16:10:17 -070071}
72
73void ModemManager::Disconnect() {
Darin Petkov5c97ac52011-07-19 16:30:49 -070074 modems_.clear();
Darin Petkov887f2982011-07-14 16:10:17 -070075 owner_.clear();
Darin Petkovc90fe522011-07-15 13:59:47 -070076 proxy_.reset();
Darin Petkov887f2982011-07-14 16:10:17 -070077}
78
79void ModemManager::OnAppear(GDBusConnection *connection,
80 const gchar *name,
81 const gchar *name_owner,
82 gpointer user_data) {
83 LOG(INFO) << "Modem manager " << name << " appeared. Owner: " << name_owner;
84 ModemManager *manager = reinterpret_cast<ModemManager *>(user_data);
85 manager->Connect(name_owner);
86}
87
88void ModemManager::OnVanish(GDBusConnection *connection,
89 const gchar *name,
90 gpointer user_data) {
91 LOG(INFO) << "Modem manager " << name << " vanished.";
92 ModemManager *manager = reinterpret_cast<ModemManager *>(user_data);
93 manager->Disconnect();
94}
95
Darin Petkov5c97ac52011-07-19 16:30:49 -070096void ModemManager::AddModem(const std::string &path) {
97 LOG(INFO) << "Add modem: " << path;
98 CHECK(!owner_.empty());
99 if (ContainsKey(modems_, path)) {
100 LOG(INFO) << "Modem already exists; ignored.";
101 return;
102 }
Darin Petkove0a312e2011-07-20 13:45:28 -0700103 shared_ptr<Modem> modem(
104 new Modem(owner_, path, control_interface_, dispatcher_, manager_));
Darin Petkov5c97ac52011-07-19 16:30:49 -0700105 modems_[path] = modem;
Darin Petkove0a312e2011-07-20 13:45:28 -0700106 modem->Init();
Darin Petkov5c97ac52011-07-19 16:30:49 -0700107}
108
109void ModemManager::RemoveModem(const std::string &path) {
110 LOG(INFO) << "Remove modem: " << path;
111 CHECK(!owner_.empty());
112 modems_.erase(path);
113}
114
Darin Petkov887f2982011-07-14 16:10:17 -0700115} // namespace shill