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