blob: 0eb684c5d3d0905a67f11a93261fcb4a771c574b [file] [log] [blame]
Darin Petkov41c0e0a2012-01-09 16:38:53 +01001// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
Darin Petkov5c97ac52011-07-19 16:30:49 -07002// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef SHILL_MODEM_
6#define SHILL_MODEM_
7
8#include <string>
Hristo Stefanoved2c28c2011-11-29 15:37:30 -08009#include <vector>
Darin Petkov5c97ac52011-07-19 16:30:49 -070010
11#include <base/basictypes.h>
12#include <base/memory/scoped_ptr.h>
Darin Petkove0a312e2011-07-20 13:45:28 -070013#include <gtest/gtest_prod.h> // for FRIEND_TEST
14
David Rochbergfa1d31d2012-03-20 10:38:07 -040015#include "shill/cellular.h"
16#include "shill/dbus_objectmanager_proxy_interface.h"
Darin Petkove0a312e2011-07-20 13:45:28 -070017#include "shill/dbus_properties_proxy_interface.h"
18#include "shill/refptr_types.h"
Darin Petkov5c97ac52011-07-19 16:30:49 -070019
Darin Petkov137884a2011-10-26 18:52:47 +020020struct mobile_provider_db;
21
Darin Petkov5c97ac52011-07-19 16:30:49 -070022namespace shill {
23
24class ControlInterface;
Darin Petkov5c97ac52011-07-19 16:30:49 -070025class EventDispatcher;
26class Manager;
Thieu Le3426c8f2012-01-11 17:35:11 -080027class Metrics;
Darin Petkovab565bb2011-10-06 02:55:51 -070028class ProxyFactory;
Darin Petkov5c97ac52011-07-19 16:30:49 -070029
Darin Petkove0a312e2011-07-20 13:45:28 -070030// Handles an instance of ModemManager.Modem and an instance of a Cellular
31// device.
Eric Shienbrood11567d02012-04-10 18:08:49 -040032class Modem : public DBusPropertiesProxyDelegate {
Darin Petkov5c97ac52011-07-19 16:30:49 -070033 public:
Darin Petkove0a312e2011-07-20 13:45:28 -070034 // |owner| is the ModemManager DBus service owner (e.g., ":1.17"). |path| is
35 // the ModemManager.Modem DBus object path (e.g.,
36 // "/org/chromium/ModemManager/Gobi/0").
Darin Petkov5c97ac52011-07-19 16:30:49 -070037 Modem(const std::string &owner,
38 const std::string &path,
39 ControlInterface *control_interface,
40 EventDispatcher *dispatcher,
Thieu Le3426c8f2012-01-11 17:35:11 -080041 Metrics *metrics,
Darin Petkov137884a2011-10-26 18:52:47 +020042 Manager *manager,
43 mobile_provider_db *provider_db);
Darin Petkov5c97ac52011-07-19 16:30:49 -070044 ~Modem();
45
David Rochbergfa1d31d2012-03-20 10:38:07 -040046 // Asynchronously initializes support for the modem. If the
47 // |modem_properties| are valid and the MAC address is present,
48 // constructs and registers a Cellular device in |device_| based on
49 // |modem_properties|.
50 virtual void CreateDeviceFromModemProperties(
51 const DBusPropertiesMap &modem_properties);
Darin Petkove0a312e2011-07-20 13:45:28 -070052
Darin Petkov41c0e0a2012-01-09 16:38:53 +010053 void OnDeviceInfoAvailable(const std::string &link_name);
54
David Rochbergfa1d31d2012-03-20 10:38:07 -040055 const std::string &owner() const { return owner_; }
56 const std::string &path() const { return path_; }
Darin Petkove0a312e2011-07-20 13:45:28 -070057
David Rochbergfa1d31d2012-03-20 10:38:07 -040058 void set_type(Cellular::Type type) { type_ = type; }
59
60 protected:
Darin Petkove0a312e2011-07-20 13:45:28 -070061 static const char kPropertyLinkName[];
62 static const char kPropertyIPMethod[];
Darin Petkovbac96002011-08-09 13:22:00 -070063 static const char kPropertyState[];
Darin Petkove0a312e2011-07-20 13:45:28 -070064 static const char kPropertyType[];
Darin Petkove0a312e2011-07-20 13:45:28 -070065
Eric Shienbrood11567d02012-04-10 18:08:49 -040066 virtual void Init();
67
David Rochbergfa1d31d2012-03-20 10:38:07 -040068 ControlInterface *control_interface() const { return control_interface_; }
69 CellularRefPtr device() const { return device_; }
70 EventDispatcher *dispatcher() const { return dispatcher_; }
71 Manager *manager() const { return manager_; }
72 Metrics *metrics() const { return metrics_; }
73 mobile_provider_db *provider_db() const { return provider_db_; }
Darin Petkove0a312e2011-07-20 13:45:28 -070074
David Rochbergfa1d31d2012-03-20 10:38:07 -040075 virtual Cellular *ConstructCellular(const std::string &link_name,
76 const std::string &device_name,
77 int interface_index);
78 virtual Cellular::ModemState ConvertMmToCellularModemState(
79 uint32 input) const = 0;
80 virtual bool GetLinkName(const DBusPropertiesMap &properties,
81 std::string *name) const = 0;
Darin Petkovc5f56562011-08-06 16:40:05 -070082
David Rochbergfa1d31d2012-03-20 10:38:07 -040083 private:
84 friend class ModemTest;
85 FRIEND_TEST(ModemManager1Test, Connect);
86 FRIEND_TEST(ModemManagerClassicTest, Connect);
87 FRIEND_TEST(ModemManagerCoreTest, ShouldAddModem);
88 FRIEND_TEST(ModemTest, CreateDeviceEarlyFailures);
89 FRIEND_TEST(ModemTest, EarlyDeviceProperties);
90 FRIEND_TEST(ModemTest, Init);
91 FRIEND_TEST(ModemTest, PendingDevicePropertiesAndCreate);
Darin Petkovab565bb2011-10-06 02:55:51 -070092
Eric Shienbrood11567d02012-04-10 18:08:49 -040093 // Signal callbacks inherited from DBusPropertiesProxyDelegate.
94 virtual void OnDBusPropertiesChanged(
95 const std::string &interface,
96 const DBusPropertiesMap &changed_properties,
97 const std::vector<std::string> &invalidated_properties);
98 virtual void OnModemManagerPropertiesChanged(
99 const std::string &interface,
100 const DBusPropertiesMap &properties);
101
102 // A proxy to the org.freedesktop.DBusProperties interface used to obtain
103 // ModemManager.Modem properties and watch for property changes
104 scoped_ptr<DBusPropertiesProxyInterface> dbus_properties_proxy_;
105
David Rochbergfa1d31d2012-03-20 10:38:07 -0400106 DBusPropertiesMap initial_modem_properties_;
Darin Petkov5c97ac52011-07-19 16:30:49 -0700107
Darin Petkove0a312e2011-07-20 13:45:28 -0700108 const std::string owner_;
109 const std::string path_;
110
111 CellularRefPtr device_;
112
Darin Petkov5c97ac52011-07-19 16:30:49 -0700113 ControlInterface *control_interface_;
114 EventDispatcher *dispatcher_;
Thieu Le3426c8f2012-01-11 17:35:11 -0800115 Metrics *metrics_;
Darin Petkov5c97ac52011-07-19 16:30:49 -0700116 Manager *manager_;
Darin Petkov137884a2011-10-26 18:52:47 +0200117 mobile_provider_db *provider_db_;
Darin Petkov41c0e0a2012-01-09 16:38:53 +0100118 std::string link_name_;
David Rochbergfa1d31d2012-03-20 10:38:07 -0400119 Cellular::Type type_;
Darin Petkov41c0e0a2012-01-09 16:38:53 +0100120 bool pending_device_info_;
David Rochbergfa1d31d2012-03-20 10:38:07 -0400121 RTNLHandler *rtnl_handler_;
Darin Petkov5c97ac52011-07-19 16:30:49 -0700122
123 DISALLOW_COPY_AND_ASSIGN(Modem);
124};
125
Eric Shienbrood11567d02012-04-10 18:08:49 -0400126class ModemClassic : public Modem {
David Rochbergfa1d31d2012-03-20 10:38:07 -0400127 public:
128 ModemClassic(const std::string &owner,
129 const std::string &path,
130 ControlInterface *control_interface,
131 EventDispatcher *dispatcher,
132 Metrics *metrics,
133 Manager *manager,
134 mobile_provider_db *provider_db);
135 virtual ~ModemClassic();
136
137 // Gathers information and passes it to CreateDeviceFromModemProperties.
138 void CreateDeviceClassic(const DBusPropertiesMap &modem_properties);
139
David Rochbergfa1d31d2012-03-20 10:38:07 -0400140 protected:
141 virtual Cellular::ModemState ConvertMmToCellularModemState(
142 uint32 input) const;
143 virtual bool GetLinkName(const DBusPropertiesMap &modem_properties,
144 std::string *name) const;
145
146 private:
147 DISALLOW_COPY_AND_ASSIGN(ModemClassic);
148};
149
150class Modem1 : public Modem {
151 // TODO(rochberg) Need to register to receive DBus property changes.
152 // crosbug.com/28596
153 public:
154 Modem1(const std::string &owner,
155 const std::string &path,
156 ControlInterface *control_interface,
157 EventDispatcher *dispatcher,
158 Metrics *metrics,
159 Manager *manager,
160 mobile_provider_db *provider_db);
161 virtual ~Modem1();
162
163 // Gathers information and passes it to CreateDeviceFromModemProperties.
164 void CreateDeviceMM1(const DBusInterfaceToProperties &i_to_p);
165
166 protected:
167 virtual Cellular::ModemState ConvertMmToCellularModemState(
168 uint32 input) const;
169 virtual bool GetLinkName(const DBusPropertiesMap &modem_properties,
170 std::string *name) const;
171
172 private:
173 DISALLOW_COPY_AND_ASSIGN(Modem1);
174};
175
Darin Petkov5c97ac52011-07-19 16:30:49 -0700176} // namespace shill
177
178#endif // SHILL_MODEM_