blob: 63dcb2cdc03264d7cb3042b36d1214ae3d6c5890 [file] [log] [blame]
Darin Petkov41c0e0a2012-01-09 16:38:53 +01001// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
Darin Petkov887f2982011-07-14 16:10:17 -07002// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
Ben Chanc54afe52014-11-05 10:28:08 -08005#ifndef SHILL_CELLULAR_MODEM_MANAGER_H_
6#define SHILL_CELLULAR_MODEM_MANAGER_H_
Darin Petkov887f2982011-07-14 16:10:17 -07007
Darin Petkov5c97ac52011-07-19 16:30:49 -07008#include <map>
Alex Vakulenko8a532292014-06-16 17:18:44 -07009#include <memory>
Alex Vakulenkoa41ab512014-07-23 14:24:23 -070010#include <string>
David Rochberg7cb06f62012-03-05 11:23:44 -050011#include <vector>
Darin Petkov5c97ac52011-07-19 16:30:49 -070012
Ben Chancc67c522014-09-03 07:19:18 -070013#include <base/macros.h>
Eric Shienbrood9a245532012-03-07 14:20:39 -050014#include <base/memory/weak_ptr.h>
Darin Petkov887f2982011-07-14 16:10:17 -070015#include <gtest/gtest_prod.h> // for FRIEND_TEST
16
Ben Chanc54afe52014-11-05 10:28:08 -080017#include "shill/cellular/dbus_objectmanager_proxy_interface.h"
18#include "shill/cellular/modem_info.h"
David Rochbergfa1d31d2012-03-20 10:38:07 -040019#include "shill/dbus_properties_proxy_interface.h"
Darin Petkov887f2982011-07-14 16:10:17 -070020#include "shill/glib.h"
21
22namespace shill {
23
Peter Qiu608ec292015-07-30 15:46:16 -070024class ControlInterface;
David Rochberg7cb06f62012-03-05 11:23:44 -050025class DBusObjectManagerProxyInterface;
David Rochbergfa1d31d2012-03-20 10:38:07 -040026class DBusPropertiesProxyInterface;
David Rochbergfa1d31d2012-03-20 10:38:07 -040027class Modem1;
Darin Petkov5c97ac52011-07-19 16:30:49 -070028class Modem;
David Rochbergfa1d31d2012-03-20 10:38:07 -040029class ModemClassic;
Darin Petkovc90fe522011-07-15 13:59:47 -070030class ModemManagerProxyInterface;
Darin Petkov887f2982011-07-14 16:10:17 -070031
Darin Petkov5c97ac52011-07-19 16:30:49 -070032// Handles a modem manager service and creates and destroys modem instances.
Darin Petkov887f2982011-07-14 16:10:17 -070033class ModemManager {
34 public:
Peter Qiu608ec292015-07-30 15:46:16 -070035 ModemManager(ControlInterface* control_interface,
36 const std::string& service,
Paul Stewartf58b28e2015-06-16 13:13:10 -070037 const std::string& path,
38 ModemInfo* modem_info);
David Rochberg7cb06f62012-03-05 11:23:44 -050039 virtual ~ModemManager();
Darin Petkov887f2982011-07-14 16:10:17 -070040
41 // Starts watching for and handling the DBus modem manager service.
Peter Qiu05d87e32015-08-14 23:46:21 -070042 virtual void Start() = 0;
Darin Petkov887f2982011-07-14 16:10:17 -070043
44 // Stops watching for the DBus modem manager service and destroys any
Darin Petkov5c97ac52011-07-19 16:30:49 -070045 // associated modems.
Peter Qiu05d87e32015-08-14 23:46:21 -070046 virtual void Stop() = 0;
Ben Chan66174a12014-01-08 21:27:00 -080047
Paul Stewartf58b28e2015-06-16 13:13:10 -070048 void OnDeviceInfoAvailable(const std::string& link_name);
Darin Petkov41c0e0a2012-01-09 16:38:53 +010049
David Rochberg81030ea2012-03-02 15:44:25 -050050 protected:
Ben Chane2ee5e02014-09-19 19:29:42 -070051 typedef std::map<std::string, std::shared_ptr<Modem>> Modems;
David Rochberg81030ea2012-03-02 15:44:25 -050052
Paul Stewartf58b28e2015-06-16 13:13:10 -070053 const std::string& service() const { return service_; }
54 const std::string& path() const { return path_; }
Peter Qiu608ec292015-07-30 15:46:16 -070055 ControlInterface* control_interface() const { return control_interface_; }
Paul Stewartf58b28e2015-06-16 13:13:10 -070056 ModemInfo* modem_info() const { return modem_info_; }
David Rochberg81030ea2012-03-02 15:44:25 -050057
Peter Qiu05d87e32015-08-14 23:46:21 -070058 // Service availability callbacks.
59 void OnAppeared();
60 void OnVanished();
61
David Rochberg81030ea2012-03-02 15:44:25 -050062 // Connect/Disconnect to a modem manager service.
63 // Inheriting classes must call this superclass method.
Peter Qiu05d87e32015-08-14 23:46:21 -070064 virtual void Connect();
David Rochberg81030ea2012-03-02 15:44:25 -050065 // Inheriting classes must call this superclass method.
66 virtual void Disconnect();
67
Paul Stewartf58b28e2015-06-16 13:13:10 -070068 bool ModemExists(const std::string& path) const;
David Rochbergfa1d31d2012-03-20 10:38:07 -040069 // Put the modem into our modem map
Alex Vakulenko8a532292014-06-16 17:18:44 -070070 void RecordAddedModem(std::shared_ptr<Modem> modem);
David Rochbergfa1d31d2012-03-20 10:38:07 -040071
72 // Removes a modem on |path|.
Paul Stewartf58b28e2015-06-16 13:13:10 -070073 void RemoveModem(const std::string& path);
David Rochbergfa1d31d2012-03-20 10:38:07 -040074
Darin Petkov887f2982011-07-14 16:10:17 -070075 private:
David Rochberg7cb06f62012-03-05 11:23:44 -050076 friend class ModemManagerCoreTest;
77 friend class ModemManagerClassicTest;
78 friend class ModemManager1Test;
79
Darin Petkov887f2982011-07-14 16:10:17 -070080 FRIEND_TEST(ModemInfoTest, RegisterModemManager);
David Rochberg7cb06f62012-03-05 11:23:44 -050081 FRIEND_TEST(ModemManager1Test, AddRemoveInterfaces);
82 FRIEND_TEST(ModemManager1Test, Connect);
83 FRIEND_TEST(ModemManagerClassicTest, Connect);
84 FRIEND_TEST(ModemManagerCoreTest, AddRemoveModem);
Ben Chan66174a12014-01-08 21:27:00 -080085 FRIEND_TEST(ModemManagerCoreTest, ConnectDisconnect);
David Rochberg7cb06f62012-03-05 11:23:44 -050086 FRIEND_TEST(ModemManagerCoreTest, OnAppearVanish);
Darin Petkov887f2982011-07-14 16:10:17 -070087
Peter Qiu608ec292015-07-30 15:46:16 -070088 ControlInterface* control_interface_;
Darin Petkovab565bb2011-10-06 02:55:51 -070089
Darin Petkov887f2982011-07-14 16:10:17 -070090 const std::string service_;
91 const std::string path_;
Peter Qiu05d87e32015-08-14 23:46:21 -070092 bool service_connected_;
Darin Petkov887f2982011-07-14 16:10:17 -070093
Darin Petkov5c97ac52011-07-19 16:30:49 -070094 Modems modems_; // Maps a modem |path| to a modem instance.
95
Paul Stewartf58b28e2015-06-16 13:13:10 -070096 ModemInfo* modem_info_;
Darin Petkov887f2982011-07-14 16:10:17 -070097
98 DISALLOW_COPY_AND_ASSIGN(ModemManager);
99};
100
Jason Glasgow9c09e362012-04-18 15:16:29 -0400101class ModemManagerClassic : public ModemManager {
David Rochberg81030ea2012-03-02 15:44:25 -0500102 public:
Peter Qiu608ec292015-07-30 15:46:16 -0700103 ModemManagerClassic(ControlInterface* control_interface,
104 const std::string& service,
Paul Stewartf58b28e2015-06-16 13:13:10 -0700105 const std::string& path,
106 ModemInfo* modem_info);
David Rochberg81030ea2012-03-02 15:44:25 -0500107
Ben Chan5ea763b2014-08-13 11:07:54 -0700108 ~ModemManagerClassic() override;
David Rochberg81030ea2012-03-02 15:44:25 -0500109
Peter Qiu05d87e32015-08-14 23:46:21 -0700110 void Start() override;
111 void Stop() override;
112
David Rochbergfa1d31d2012-03-20 10:38:07 -0400113 // Called by our dbus proxy
Paul Stewartf58b28e2015-06-16 13:13:10 -0700114 void OnDeviceAdded(const std::string& path);
115 void OnDeviceRemoved(const std::string& path);
David Rochbergfa1d31d2012-03-20 10:38:07 -0400116
David Rochberg81030ea2012-03-02 15:44:25 -0500117 protected:
Peter Qiu05d87e32015-08-14 23:46:21 -0700118 void Connect() override;
Yunlian Jiang6acd9662015-01-30 08:36:10 -0800119 void Disconnect() override;
David Rochbergfa1d31d2012-03-20 10:38:07 -0400120
Paul Stewartf58b28e2015-06-16 13:13:10 -0700121 virtual void AddModemClassic(const std::string& path);
Alex Vakulenko8a532292014-06-16 17:18:44 -0700122 virtual void InitModemClassic(std::shared_ptr<ModemClassic> modem);
David Rochberg81030ea2012-03-02 15:44:25 -0500123
124 private:
Ben Chanc20ed132014-10-16 12:25:03 -0700125 std::unique_ptr<ModemManagerProxyInterface> proxy_; // DBus service proxy
126 std::unique_ptr<DBusPropertiesProxyInterface> dbus_properties_proxy_;
David Rochberg81030ea2012-03-02 15:44:25 -0500127
David Rochberg7cb06f62012-03-05 11:23:44 -0500128 FRIEND_TEST(ModemManagerClassicTest, Connect);
Peter Qiu05d87e32015-08-14 23:46:21 -0700129 FRIEND_TEST(ModemManagerClassicTest, StartStop);
David Rochberg81030ea2012-03-02 15:44:25 -0500130
131 DISALLOW_COPY_AND_ASSIGN(ModemManagerClassic);
132};
David Rochberg7cb06f62012-03-05 11:23:44 -0500133
Eric Shienbrood9a245532012-03-07 14:20:39 -0500134class ModemManager1 : public ModemManager {
David Rochberg7cb06f62012-03-05 11:23:44 -0500135 public:
Peter Qiu608ec292015-07-30 15:46:16 -0700136 ModemManager1(ControlInterface* control_interface,
137 const std::string& service,
Paul Stewartf58b28e2015-06-16 13:13:10 -0700138 const std::string& path,
139 ModemInfo* modem_info);
David Rochberg7cb06f62012-03-05 11:23:44 -0500140
Ben Chan5ea763b2014-08-13 11:07:54 -0700141 ~ModemManager1() override;
David Rochberg7cb06f62012-03-05 11:23:44 -0500142
Peter Qiu05d87e32015-08-14 23:46:21 -0700143 void Start() override;
144 void Stop() override;
145
David Rochberg7cb06f62012-03-05 11:23:44 -0500146 protected:
Paul Stewartf58b28e2015-06-16 13:13:10 -0700147 void AddModem1(const std::string& path,
Peter Qiu05d87e32015-08-14 23:46:21 -0700148 const InterfaceToProperties& properties);
Alex Vakulenko8a532292014-06-16 17:18:44 -0700149 virtual void InitModem1(std::shared_ptr<Modem1> modem,
Peter Qiu05d87e32015-08-14 23:46:21 -0700150 const InterfaceToProperties& properties);
David Rochbergfa1d31d2012-03-20 10:38:07 -0400151
David Rochberg7cb06f62012-03-05 11:23:44 -0500152 // ModemManager methods
Peter Qiu05d87e32015-08-14 23:46:21 -0700153 void Connect() override;
Yunlian Jiang6acd9662015-01-30 08:36:10 -0800154 void Disconnect() override;
David Rochberg7cb06f62012-03-05 11:23:44 -0500155
156 // DBusObjectManagerProxyDelegate signal methods
Eric Shienbrood9a245532012-03-07 14:20:39 -0500157 virtual void OnInterfacesAddedSignal(
Peter Qiu05d87e32015-08-14 23:46:21 -0700158 const std::string& object_path,
159 const InterfaceToProperties& properties);
Eric Shienbrood9a245532012-03-07 14:20:39 -0500160 virtual void OnInterfacesRemovedSignal(
Peter Qiu05d87e32015-08-14 23:46:21 -0700161 const std::string& object_path,
Paul Stewartf58b28e2015-06-16 13:13:10 -0700162 const std::vector<std::string>& interfaces);
David Rochberg7cb06f62012-03-05 11:23:44 -0500163
164 // DBusObjectManagerProxyDelegate method callbacks
Eric Shienbrood9a245532012-03-07 14:20:39 -0500165 virtual void OnGetManagedObjectsReply(
Peter Qiu05d87e32015-08-14 23:46:21 -0700166 const ObjectsWithProperties& objects_with_properties,
Paul Stewartf58b28e2015-06-16 13:13:10 -0700167 const Error& error);
David Rochberg7cb06f62012-03-05 11:23:44 -0500168
169 private:
Ben Chan1e2ba232014-01-27 16:35:45 -0800170 friend class ModemManager1Test;
David Rochberg7cb06f62012-03-05 11:23:44 -0500171 FRIEND_TEST(ModemManager1Test, Connect);
172 FRIEND_TEST(ModemManager1Test, AddRemoveInterfaces);
Peter Qiu05d87e32015-08-14 23:46:21 -0700173 FRIEND_TEST(ModemManager1Test, StartStop);
David Rochberg7cb06f62012-03-05 11:23:44 -0500174
Ben Chanc20ed132014-10-16 12:25:03 -0700175 std::unique_ptr<DBusObjectManagerProxyInterface> proxy_;
Eric Shienbrood9a245532012-03-07 14:20:39 -0500176 base::WeakPtrFactory<ModemManager1> weak_ptr_factory_;
David Rochberg7cb06f62012-03-05 11:23:44 -0500177
178 DISALLOW_COPY_AND_ASSIGN(ModemManager1);
179};
Ben Chan876efd32012-09-28 15:25:13 -0700180
Darin Petkov887f2982011-07-14 16:10:17 -0700181} // namespace shill
182
Ben Chanc54afe52014-11-05 10:28:08 -0800183#endif // SHILL_CELLULAR_MODEM_MANAGER_H_