blob: f3350530a42ab73b7d39037178e2d6f397d4906d [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,
Darin Petkov137884a2011-10-26 18:52:47 +020025 GLib *glib,
26 mobile_provider_db *provider_db)
Darin Petkovab565bb2011-10-06 02:55:51 -070027 : proxy_factory_(ProxyFactory::GetInstance()),
28 service_(service),
Darin Petkov887f2982011-07-14 16:10:17 -070029 path_(path),
30 watcher_id_(0),
31 control_interface_(control_interface),
32 dispatcher_(dispatcher),
Darin Petkov67d8ecf2011-07-26 16:03:30 -070033 manager_(manager),
Darin Petkov137884a2011-10-26 18:52:47 +020034 glib_(glib),
35 provider_db_(provider_db) {}
Darin Petkov887f2982011-07-14 16:10:17 -070036
37ModemManager::~ModemManager() {
38 Stop();
39}
40
41void ModemManager::Start() {
42 LOG(INFO) << "Start watching modem manager service: " << service_;
43 CHECK_EQ(0, watcher_id_);
Darin Petkovc90fe522011-07-15 13:59:47 -070044 // TODO(petkov): Implement DBus name watching through dbus-c++.
Darin Petkov887f2982011-07-14 16:10:17 -070045 watcher_id_ = glib_->BusWatchName(G_BUS_TYPE_SYSTEM,
46 service_.c_str(),
47 G_BUS_NAME_WATCHER_FLAGS_NONE,
48 OnAppear,
49 OnVanish,
50 this,
51 NULL);
52}
53
54void ModemManager::Stop() {
55 LOG(INFO) << "Stop watching modem manager service: " << service_;
56 if (watcher_id_) {
57 glib_->BusUnwatchName(watcher_id_);
58 watcher_id_ = 0;
59 }
60 Disconnect();
61}
62
63void ModemManager::Connect(const string &owner) {
64 owner_ = owner;
Darin Petkovab565bb2011-10-06 02:55:51 -070065 proxy_.reset(proxy_factory_->CreateModemManagerProxy(this, path_, owner_));
Darin Petkov5c97ac52011-07-19 16:30:49 -070066
67 // TODO(petkov): Switch to asynchronous calls (crosbug.com/17583).
68 vector<DBus::Path> devices = proxy_->EnumerateDevices();
69 for (vector<DBus::Path>::const_iterator it = devices.begin();
70 it != devices.end(); ++it) {
71 AddModem(*it);
72 }
Darin Petkov887f2982011-07-14 16:10:17 -070073}
74
75void ModemManager::Disconnect() {
Darin Petkov5c97ac52011-07-19 16:30:49 -070076 modems_.clear();
Darin Petkov887f2982011-07-14 16:10:17 -070077 owner_.clear();
Darin Petkovc90fe522011-07-15 13:59:47 -070078 proxy_.reset();
Darin Petkov887f2982011-07-14 16:10:17 -070079}
80
mukesh agrawal1830fa12011-09-26 14:31:40 -070081void ModemManager::OnAppear(GDBusConnection */*connection*/,
Darin Petkov887f2982011-07-14 16:10:17 -070082 const gchar *name,
83 const gchar *name_owner,
84 gpointer user_data) {
85 LOG(INFO) << "Modem manager " << name << " appeared. Owner: " << name_owner;
86 ModemManager *manager = reinterpret_cast<ModemManager *>(user_data);
87 manager->Connect(name_owner);
88}
89
mukesh agrawal1830fa12011-09-26 14:31:40 -070090void ModemManager::OnVanish(GDBusConnection */*connection*/,
Darin Petkov887f2982011-07-14 16:10:17 -070091 const gchar *name,
92 gpointer user_data) {
93 LOG(INFO) << "Modem manager " << name << " vanished.";
94 ModemManager *manager = reinterpret_cast<ModemManager *>(user_data);
95 manager->Disconnect();
96}
97
Darin Petkov5c97ac52011-07-19 16:30:49 -070098void ModemManager::AddModem(const std::string &path) {
99 LOG(INFO) << "Add modem: " << path;
100 CHECK(!owner_.empty());
101 if (ContainsKey(modems_, path)) {
102 LOG(INFO) << "Modem already exists; ignored.";
103 return;
104 }
Darin Petkov137884a2011-10-26 18:52:47 +0200105 shared_ptr<Modem> modem(new Modem(owner_,
106 path,
107 control_interface_,
108 dispatcher_,
109 manager_,
110 provider_db_));
Darin Petkov5c97ac52011-07-19 16:30:49 -0700111 modems_[path] = modem;
Darin Petkove0a312e2011-07-20 13:45:28 -0700112 modem->Init();
Darin Petkov5c97ac52011-07-19 16:30:49 -0700113}
114
115void ModemManager::RemoveModem(const std::string &path) {
116 LOG(INFO) << "Remove modem: " << path;
117 CHECK(!owner_.empty());
118 modems_.erase(path);
119}
120
Darin Petkov887f2982011-07-14 16:10:17 -0700121} // namespace shill