blob: 94536fbff4453aa522a8e96f65d4b1c9fe31a247 [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>
8
Darin Petkovc90fe522011-07-15 13:59:47 -07009#include "shill/modem_manager_proxy.h"
10#include "shill/proxy_factory.h"
11
Darin Petkov887f2982011-07-14 16:10:17 -070012using std::string;
13
14namespace shill {
15
16ModemManager::ModemManager(const string &service,
17 const string &path,
18 ControlInterface *control_interface,
19 EventDispatcher *dispatcher,
20 Manager *manager,
21 GLib *glib)
22 : service_(service),
23 path_(path),
24 watcher_id_(0),
25 control_interface_(control_interface),
26 dispatcher_(dispatcher),
27 glib_(glib) {}
28
29ModemManager::~ModemManager() {
30 Stop();
31}
32
33void ModemManager::Start() {
34 LOG(INFO) << "Start watching modem manager service: " << service_;
35 CHECK_EQ(0, watcher_id_);
Darin Petkovc90fe522011-07-15 13:59:47 -070036 // TODO(petkov): Implement DBus name watching through dbus-c++.
Darin Petkov887f2982011-07-14 16:10:17 -070037 watcher_id_ = glib_->BusWatchName(G_BUS_TYPE_SYSTEM,
38 service_.c_str(),
39 G_BUS_NAME_WATCHER_FLAGS_NONE,
40 OnAppear,
41 OnVanish,
42 this,
43 NULL);
44}
45
46void ModemManager::Stop() {
47 LOG(INFO) << "Stop watching modem manager service: " << service_;
48 if (watcher_id_) {
49 glib_->BusUnwatchName(watcher_id_);
50 watcher_id_ = 0;
51 }
52 Disconnect();
53}
54
55void ModemManager::Connect(const string &owner) {
56 owner_ = owner;
Darin Petkovc90fe522011-07-15 13:59:47 -070057 proxy_.reset(
58 ProxyFactory::factory()->CreateModemManagerProxy(this, path_, owner_));
Darin Petkov887f2982011-07-14 16:10:17 -070059}
60
61void ModemManager::Disconnect() {
62 owner_.clear();
Darin Petkovc90fe522011-07-15 13:59:47 -070063 proxy_.reset();
Darin Petkov887f2982011-07-14 16:10:17 -070064}
65
66void ModemManager::OnAppear(GDBusConnection *connection,
67 const gchar *name,
68 const gchar *name_owner,
69 gpointer user_data) {
70 LOG(INFO) << "Modem manager " << name << " appeared. Owner: " << name_owner;
71 ModemManager *manager = reinterpret_cast<ModemManager *>(user_data);
72 manager->Connect(name_owner);
73}
74
75void ModemManager::OnVanish(GDBusConnection *connection,
76 const gchar *name,
77 gpointer user_data) {
78 LOG(INFO) << "Modem manager " << name << " vanished.";
79 ModemManager *manager = reinterpret_cast<ModemManager *>(user_data);
80 manager->Disconnect();
81}
82
83} // namespace shill