blob: 91cad69b2c0ca1c65073d0376617a294b1c3dbd9 [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)
Darin Petkovab565bb2011-10-06 02:55:51 -070026 : proxy_factory_(ProxyFactory::GetInstance()),
27 service_(service),
Darin Petkov887f2982011-07-14 16:10:17 -070028 path_(path),
29 watcher_id_(0),
30 control_interface_(control_interface),
31 dispatcher_(dispatcher),
Darin Petkov67d8ecf2011-07-26 16:03:30 -070032 manager_(manager),
Darin Petkov887f2982011-07-14 16:10:17 -070033 glib_(glib) {}
34
35ModemManager::~ModemManager() {
36 Stop();
37}
38
39void ModemManager::Start() {
40 LOG(INFO) << "Start watching modem manager service: " << service_;
41 CHECK_EQ(0, watcher_id_);
Darin Petkovc90fe522011-07-15 13:59:47 -070042 // TODO(petkov): Implement DBus name watching through dbus-c++.
Darin Petkov887f2982011-07-14 16:10:17 -070043 watcher_id_ = glib_->BusWatchName(G_BUS_TYPE_SYSTEM,
44 service_.c_str(),
45 G_BUS_NAME_WATCHER_FLAGS_NONE,
46 OnAppear,
47 OnVanish,
48 this,
49 NULL);
50}
51
52void ModemManager::Stop() {
53 LOG(INFO) << "Stop watching modem manager service: " << service_;
54 if (watcher_id_) {
55 glib_->BusUnwatchName(watcher_id_);
56 watcher_id_ = 0;
57 }
58 Disconnect();
59}
60
61void ModemManager::Connect(const string &owner) {
62 owner_ = owner;
Darin Petkovab565bb2011-10-06 02:55:51 -070063 proxy_.reset(proxy_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
mukesh agrawal1830fa12011-09-26 14:31:40 -070079void ModemManager::OnAppear(GDBusConnection */*connection*/,
Darin Petkov887f2982011-07-14 16:10:17 -070080 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
mukesh agrawal1830fa12011-09-26 14:31:40 -070088void ModemManager::OnVanish(GDBusConnection */*connection*/,
Darin Petkov887f2982011-07-14 16:10:17 -070089 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