1c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu//
2c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// Copyright (C) 2012 The Android Open Source Project
3c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu//
4c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// Licensed under the Apache License, Version 2.0 (the "License");
5c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// you may not use this file except in compliance with the License.
6c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// You may obtain a copy of the License at
7c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu//
8c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu//      http://www.apache.org/licenses/LICENSE-2.0
9c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu//
10c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// Unless required by applicable law or agreed to in writing, software
11c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// distributed under the License is distributed on an "AS IS" BASIS,
12c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// See the License for the specific language governing permissions and
14c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// limitations under the License.
15c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu//
16887f2983bc84acc15139df257e43217fec1f6cdbDarin Petkov
17c54afe521739065a5d77e7c049acdb5e603f0592Ben Chan#ifndef SHILL_CELLULAR_MODEM_MANAGER_H_
18c54afe521739065a5d77e7c049acdb5e603f0592Ben Chan#define SHILL_CELLULAR_MODEM_MANAGER_H_
19887f2983bc84acc15139df257e43217fec1f6cdbDarin Petkov
205c97ac5100dca5e710a25f10a04417e66c2dfc12Darin Petkov#include <map>
218a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko#include <memory>
22a41ab517725d036b63420f8445550246f8f50b99Alex Vakulenko#include <string>
237cb06f6d1b0f212e36ae23b73baeafdf14b7facaDavid Rochberg#include <vector>
245c97ac5100dca5e710a25f10a04417e66c2dfc12Darin Petkov
25cc67c52a2c00f90e877971d552208dd99825d84eBen Chan#include <base/macros.h>
269a24553461df7036755060423f90804011612249Eric Shienbrood#include <base/memory/weak_ptr.h>
27887f2983bc84acc15139df257e43217fec1f6cdbDarin Petkov#include <gtest/gtest_prod.h>  // for FRIEND_TEST
28887f2983bc84acc15139df257e43217fec1f6cdbDarin Petkov
29c54afe521739065a5d77e7c049acdb5e603f0592Ben Chan#include "shill/cellular/dbus_objectmanager_proxy_interface.h"
30c54afe521739065a5d77e7c049acdb5e603f0592Ben Chan#include "shill/cellular/modem_info.h"
31fa1d31d532535043460dfcffd1e9f487d52bd3c4David Rochberg#include "shill/dbus_properties_proxy_interface.h"
32887f2983bc84acc15139df257e43217fec1f6cdbDarin Petkov
33887f2983bc84acc15139df257e43217fec1f6cdbDarin Petkovnamespace shill {
34887f2983bc84acc15139df257e43217fec1f6cdbDarin Petkov
35608ec29525f553d51f0a92e84176e3d4b45930a9Peter Qiuclass ControlInterface;
367cb06f6d1b0f212e36ae23b73baeafdf14b7facaDavid Rochbergclass DBusObjectManagerProxyInterface;
37fa1d31d532535043460dfcffd1e9f487d52bd3c4David Rochbergclass DBusPropertiesProxyInterface;
38fa1d31d532535043460dfcffd1e9f487d52bd3c4David Rochbergclass Modem1;
395c97ac5100dca5e710a25f10a04417e66c2dfc12Darin Petkovclass Modem;
40fa1d31d532535043460dfcffd1e9f487d52bd3c4David Rochbergclass ModemClassic;
41c90fe52d7eed164b63f9a3af4bcb505ee78d3f43Darin Petkovclass ModemManagerProxyInterface;
42887f2983bc84acc15139df257e43217fec1f6cdbDarin Petkov
435c97ac5100dca5e710a25f10a04417e66c2dfc12Darin Petkov// Handles a modem manager service and creates and destroys modem instances.
44887f2983bc84acc15139df257e43217fec1f6cdbDarin Petkovclass ModemManager {
45887f2983bc84acc15139df257e43217fec1f6cdbDarin Petkov public:
46608ec29525f553d51f0a92e84176e3d4b45930a9Peter Qiu  ModemManager(ControlInterface* control_interface,
47608ec29525f553d51f0a92e84176e3d4b45930a9Peter Qiu               const std::string& service,
48f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart               const std::string& path,
49f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart               ModemInfo* modem_info);
507cb06f6d1b0f212e36ae23b73baeafdf14b7facaDavid Rochberg  virtual ~ModemManager();
51887f2983bc84acc15139df257e43217fec1f6cdbDarin Petkov
52887f2983bc84acc15139df257e43217fec1f6cdbDarin Petkov  // Starts watching for and handling the DBus modem manager service.
5305d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu  virtual void Start() = 0;
54887f2983bc84acc15139df257e43217fec1f6cdbDarin Petkov
55887f2983bc84acc15139df257e43217fec1f6cdbDarin Petkov  // Stops watching for the DBus modem manager service and destroys any
565c97ac5100dca5e710a25f10a04417e66c2dfc12Darin Petkov  // associated modems.
5705d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu  virtual void Stop() = 0;
5866174a16342457c5e733292425fda13d6704779dBen Chan
59f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart  void OnDeviceInfoAvailable(const std::string& link_name);
6041c0e0accae6602dbc9fc31f336dabee7af1b170Darin Petkov
6181030eaefea1b37aa67c3934d17cd6ded9be569dDavid Rochberg protected:
62e2ee5e009081a392fb31596c1d0cfb30bc7bad6eBen Chan  typedef std::map<std::string, std::shared_ptr<Modem>> Modems;
6381030eaefea1b37aa67c3934d17cd6ded9be569dDavid Rochberg
64f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart  const std::string& service() const { return service_; }
65f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart  const std::string& path() const { return path_; }
66608ec29525f553d51f0a92e84176e3d4b45930a9Peter Qiu  ControlInterface* control_interface() const { return control_interface_; }
67f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart  ModemInfo* modem_info() const { return modem_info_; }
6881030eaefea1b37aa67c3934d17cd6ded9be569dDavid Rochberg
6905d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu  // Service availability callbacks.
7005d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu  void OnAppeared();
7105d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu  void OnVanished();
7205d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu
7381030eaefea1b37aa67c3934d17cd6ded9be569dDavid Rochberg  // Connect/Disconnect to a modem manager service.
7481030eaefea1b37aa67c3934d17cd6ded9be569dDavid Rochberg  // Inheriting classes must call this superclass method.
7505d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu  virtual void Connect();
7681030eaefea1b37aa67c3934d17cd6ded9be569dDavid Rochberg  // Inheriting classes must call this superclass method.
7781030eaefea1b37aa67c3934d17cd6ded9be569dDavid Rochberg  virtual void Disconnect();
7881030eaefea1b37aa67c3934d17cd6ded9be569dDavid Rochberg
79f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart  bool ModemExists(const std::string& path) const;
80fa1d31d532535043460dfcffd1e9f487d52bd3c4David Rochberg  // Put the modem into our modem map
818a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko  void RecordAddedModem(std::shared_ptr<Modem> modem);
82fa1d31d532535043460dfcffd1e9f487d52bd3c4David Rochberg
83fa1d31d532535043460dfcffd1e9f487d52bd3c4David Rochberg  // Removes a modem on |path|.
84f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart  void RemoveModem(const std::string& path);
85fa1d31d532535043460dfcffd1e9f487d52bd3c4David Rochberg
86887f2983bc84acc15139df257e43217fec1f6cdbDarin Petkov private:
877cb06f6d1b0f212e36ae23b73baeafdf14b7facaDavid Rochberg  friend class ModemManagerCoreTest;
887cb06f6d1b0f212e36ae23b73baeafdf14b7facaDavid Rochberg  friend class ModemManagerClassicTest;
897cb06f6d1b0f212e36ae23b73baeafdf14b7facaDavid Rochberg  friend class ModemManager1Test;
907cb06f6d1b0f212e36ae23b73baeafdf14b7facaDavid Rochberg
91887f2983bc84acc15139df257e43217fec1f6cdbDarin Petkov  FRIEND_TEST(ModemInfoTest, RegisterModemManager);
927cb06f6d1b0f212e36ae23b73baeafdf14b7facaDavid Rochberg  FRIEND_TEST(ModemManager1Test, AddRemoveInterfaces);
937cb06f6d1b0f212e36ae23b73baeafdf14b7facaDavid Rochberg  FRIEND_TEST(ModemManager1Test, Connect);
947cb06f6d1b0f212e36ae23b73baeafdf14b7facaDavid Rochberg  FRIEND_TEST(ModemManagerClassicTest, Connect);
957cb06f6d1b0f212e36ae23b73baeafdf14b7facaDavid Rochberg  FRIEND_TEST(ModemManagerCoreTest, AddRemoveModem);
9666174a16342457c5e733292425fda13d6704779dBen Chan  FRIEND_TEST(ModemManagerCoreTest, ConnectDisconnect);
977cb06f6d1b0f212e36ae23b73baeafdf14b7facaDavid Rochberg  FRIEND_TEST(ModemManagerCoreTest, OnAppearVanish);
98887f2983bc84acc15139df257e43217fec1f6cdbDarin Petkov
99608ec29525f553d51f0a92e84176e3d4b45930a9Peter Qiu  ControlInterface* control_interface_;
100ab565bb6f148849fc0ceb12529ff93acfbbed71fDarin Petkov
101887f2983bc84acc15139df257e43217fec1f6cdbDarin Petkov  const std::string service_;
102887f2983bc84acc15139df257e43217fec1f6cdbDarin Petkov  const std::string path_;
10305d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu  bool service_connected_;
104887f2983bc84acc15139df257e43217fec1f6cdbDarin Petkov
1055c97ac5100dca5e710a25f10a04417e66c2dfc12Darin Petkov  Modems modems_;  // Maps a modem |path| to a modem instance.
1065c97ac5100dca5e710a25f10a04417e66c2dfc12Darin Petkov
107f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart  ModemInfo* modem_info_;
108887f2983bc84acc15139df257e43217fec1f6cdbDarin Petkov
109887f2983bc84acc15139df257e43217fec1f6cdbDarin Petkov  DISALLOW_COPY_AND_ASSIGN(ModemManager);
110887f2983bc84acc15139df257e43217fec1f6cdbDarin Petkov};
111887f2983bc84acc15139df257e43217fec1f6cdbDarin Petkov
1129c09e36db2eb2de8f1433b88438ea53eb1be986aJason Glasgowclass ModemManagerClassic : public ModemManager {
11381030eaefea1b37aa67c3934d17cd6ded9be569dDavid Rochberg public:
114608ec29525f553d51f0a92e84176e3d4b45930a9Peter Qiu  ModemManagerClassic(ControlInterface* control_interface,
115608ec29525f553d51f0a92e84176e3d4b45930a9Peter Qiu                      const std::string& service,
116f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart                      const std::string& path,
117f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart                      ModemInfo* modem_info);
11881030eaefea1b37aa67c3934d17cd6ded9be569dDavid Rochberg
1195ea763b83299b5fad76a87183fb39a74c2d3c61dBen Chan  ~ModemManagerClassic() override;
12081030eaefea1b37aa67c3934d17cd6ded9be569dDavid Rochberg
12105d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu  void Start() override;
12205d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu  void Stop() override;
12305d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu
124fa1d31d532535043460dfcffd1e9f487d52bd3c4David Rochberg  // Called by our dbus proxy
125f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart  void OnDeviceAdded(const std::string& path);
126f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart  void OnDeviceRemoved(const std::string& path);
127fa1d31d532535043460dfcffd1e9f487d52bd3c4David Rochberg
12881030eaefea1b37aa67c3934d17cd6ded9be569dDavid Rochberg protected:
12905d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu  void Connect() override;
1306acd966cabe0d75e0d9ae3f84c727c9b44a899b3Yunlian Jiang  void Disconnect() override;
131fa1d31d532535043460dfcffd1e9f487d52bd3c4David Rochberg
132f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart  virtual void AddModemClassic(const std::string& path);
1338a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko  virtual void InitModemClassic(std::shared_ptr<ModemClassic> modem);
13481030eaefea1b37aa67c3934d17cd6ded9be569dDavid Rochberg
13581030eaefea1b37aa67c3934d17cd6ded9be569dDavid Rochberg private:
136c20ed13f5c0e87e7a5164d1b5330ccd99cced58fBen Chan  std::unique_ptr<ModemManagerProxyInterface> proxy_;  // DBus service proxy
137c20ed13f5c0e87e7a5164d1b5330ccd99cced58fBen Chan  std::unique_ptr<DBusPropertiesProxyInterface> dbus_properties_proxy_;
13881030eaefea1b37aa67c3934d17cd6ded9be569dDavid Rochberg
1397cb06f6d1b0f212e36ae23b73baeafdf14b7facaDavid Rochberg  FRIEND_TEST(ModemManagerClassicTest, Connect);
14005d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu  FRIEND_TEST(ModemManagerClassicTest, StartStop);
14181030eaefea1b37aa67c3934d17cd6ded9be569dDavid Rochberg
14281030eaefea1b37aa67c3934d17cd6ded9be569dDavid Rochberg  DISALLOW_COPY_AND_ASSIGN(ModemManagerClassic);
14381030eaefea1b37aa67c3934d17cd6ded9be569dDavid Rochberg};
1447cb06f6d1b0f212e36ae23b73baeafdf14b7facaDavid Rochberg
1459a24553461df7036755060423f90804011612249Eric Shienbroodclass ModemManager1 : public ModemManager {
1467cb06f6d1b0f212e36ae23b73baeafdf14b7facaDavid Rochberg public:
147608ec29525f553d51f0a92e84176e3d4b45930a9Peter Qiu  ModemManager1(ControlInterface* control_interface,
148608ec29525f553d51f0a92e84176e3d4b45930a9Peter Qiu                const std::string& service,
149f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart                const std::string& path,
150f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart                ModemInfo* modem_info);
1517cb06f6d1b0f212e36ae23b73baeafdf14b7facaDavid Rochberg
1525ea763b83299b5fad76a87183fb39a74c2d3c61dBen Chan  ~ModemManager1() override;
1537cb06f6d1b0f212e36ae23b73baeafdf14b7facaDavid Rochberg
15405d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu  void Start() override;
15505d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu  void Stop() override;
15605d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu
1577cb06f6d1b0f212e36ae23b73baeafdf14b7facaDavid Rochberg protected:
158f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart  void AddModem1(const std::string& path,
15905d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu                 const InterfaceToProperties& properties);
1608a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko  virtual void InitModem1(std::shared_ptr<Modem1> modem,
16105d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu                          const InterfaceToProperties& properties);
162fa1d31d532535043460dfcffd1e9f487d52bd3c4David Rochberg
1637cb06f6d1b0f212e36ae23b73baeafdf14b7facaDavid Rochberg  // ModemManager methods
16405d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu  void Connect() override;
1656acd966cabe0d75e0d9ae3f84c727c9b44a899b3Yunlian Jiang  void Disconnect() override;
1667cb06f6d1b0f212e36ae23b73baeafdf14b7facaDavid Rochberg
1677cb06f6d1b0f212e36ae23b73baeafdf14b7facaDavid Rochberg  // DBusObjectManagerProxyDelegate signal methods
1689a24553461df7036755060423f90804011612249Eric Shienbrood  virtual void OnInterfacesAddedSignal(
16905d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu      const std::string& object_path,
17005d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu      const InterfaceToProperties& properties);
1719a24553461df7036755060423f90804011612249Eric Shienbrood  virtual void OnInterfacesRemovedSignal(
17205d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu      const std::string& object_path,
173f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart      const std::vector<std::string>& interfaces);
1747cb06f6d1b0f212e36ae23b73baeafdf14b7facaDavid Rochberg
1757cb06f6d1b0f212e36ae23b73baeafdf14b7facaDavid Rochberg  // DBusObjectManagerProxyDelegate method callbacks
1769a24553461df7036755060423f90804011612249Eric Shienbrood  virtual void OnGetManagedObjectsReply(
17705d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu      const ObjectsWithProperties& objects_with_properties,
178f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart      const Error& error);
1797cb06f6d1b0f212e36ae23b73baeafdf14b7facaDavid Rochberg
1807cb06f6d1b0f212e36ae23b73baeafdf14b7facaDavid Rochberg private:
1811e2ba23e6d2e4bc079c9111f9814c0081936eff2Ben Chan  friend class ModemManager1Test;
1827cb06f6d1b0f212e36ae23b73baeafdf14b7facaDavid Rochberg  FRIEND_TEST(ModemManager1Test, Connect);
1837cb06f6d1b0f212e36ae23b73baeafdf14b7facaDavid Rochberg  FRIEND_TEST(ModemManager1Test, AddRemoveInterfaces);
18405d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu  FRIEND_TEST(ModemManager1Test, StartStop);
1857cb06f6d1b0f212e36ae23b73baeafdf14b7facaDavid Rochberg
186c20ed13f5c0e87e7a5164d1b5330ccd99cced58fBen Chan  std::unique_ptr<DBusObjectManagerProxyInterface> proxy_;
1879a24553461df7036755060423f90804011612249Eric Shienbrood  base::WeakPtrFactory<ModemManager1> weak_ptr_factory_;
1887cb06f6d1b0f212e36ae23b73baeafdf14b7facaDavid Rochberg
1897cb06f6d1b0f212e36ae23b73baeafdf14b7facaDavid Rochberg  DISALLOW_COPY_AND_ASSIGN(ModemManager1);
1907cb06f6d1b0f212e36ae23b73baeafdf14b7facaDavid Rochberg};
191876efd3172536eaf5ce17be552a06f556a8cf76dBen Chan
192887f2983bc84acc15139df257e43217fec1f6cdbDarin Petkov}  // namespace shill
193887f2983bc84acc15139df257e43217fec1f6cdbDarin Petkov
194c54afe521739065a5d77e7c049acdb5e603f0592Ben Chan#endif  // SHILL_CELLULAR_MODEM_MANAGER_H_
195