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// 1682f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow 17c54afe521739065a5d77e7c049acdb5e603f0592Ben Chan#ifndef SHILL_CELLULAR_CELLULAR_CAPABILITY_CLASSIC_H_ 18c54afe521739065a5d77e7c049acdb5e603f0592Ben Chan#define SHILL_CELLULAR_CELLULAR_CAPABILITY_CLASSIC_H_ 1982f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow 20c20ed13f5c0e87e7a5164d1b5330ccd99cced58fBen Chan#include <memory> 2182f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow#include <string> 2282f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow#include <vector> 2382f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow 2482f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow#include <base/callback.h> 25cc67c52a2c00f90e877971d552208dd99825d84eBen Chan#include <base/macros.h> 2682f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow#include <base/memory/weak_ptr.h> 2782f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow#include <gtest/gtest_prod.h> // for FRIEND_TEST 2882f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow 29c54afe521739065a5d77e7c049acdb5e603f0592Ben Chan#include "shill/cellular/cellular.h" 30c54afe521739065a5d77e7c049acdb5e603f0592Ben Chan#include "shill/cellular/cellular_capability.h" 31c54afe521739065a5d77e7c049acdb5e603f0592Ben Chan#include "shill/cellular/modem_proxy_interface.h" 32c54afe521739065a5d77e7c049acdb5e603f0592Ben Chan#include "shill/cellular/modem_simple_proxy_interface.h" 3382f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow 3482f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgownamespace shill { 3582f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow 3682f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgowclass Cellular; 37608ec29525f553d51f0a92e84176e3d4b45930a9Peter Qiuclass ControlInterface; 3882f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgowclass Error; 3982f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgowclass EventDispatcher; 40c37a9c4ee413984342d53c6151edcb7dc3800d78Darin Petkovclass ModemGobiProxyInterface; 4127526f1dad75e135f437e023cb34b0919d9a981fPrathmesh Prabhuclass ModemInfo; 4282f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow 437fce52c4afdc5e73a9e740dc9b90f1e61ae8cea4Eric Shienbroodenum ModemClassicState { 447fce52c4afdc5e73a9e740dc9b90f1e61ae8cea4Eric Shienbrood kModemClassicStateUnknown = 0, 457fce52c4afdc5e73a9e740dc9b90f1e61ae8cea4Eric Shienbrood kModemClassicStateDisabled = 10, 467fce52c4afdc5e73a9e740dc9b90f1e61ae8cea4Eric Shienbrood kModemClassicStateDisabling = 20, 477fce52c4afdc5e73a9e740dc9b90f1e61ae8cea4Eric Shienbrood kModemClassicStateEnabling = 30, 487fce52c4afdc5e73a9e740dc9b90f1e61ae8cea4Eric Shienbrood kModemClassicStateEnabled = 40, 497fce52c4afdc5e73a9e740dc9b90f1e61ae8cea4Eric Shienbrood kModemClassicStateSearching = 50, 507fce52c4afdc5e73a9e740dc9b90f1e61ae8cea4Eric Shienbrood kModemClassicStateRegistered = 60, 517fce52c4afdc5e73a9e740dc9b90f1e61ae8cea4Eric Shienbrood kModemClassicStateDisconnecting = 70, 527fce52c4afdc5e73a9e740dc9b90f1e61ae8cea4Eric Shienbrood kModemClassicStateConnecting = 80, 537fce52c4afdc5e73a9e740dc9b90f1e61ae8cea4Eric Shienbrood kModemClassicStateConnected = 90, 547fce52c4afdc5e73a9e740dc9b90f1e61ae8cea4Eric Shienbrood}; 557fce52c4afdc5e73a9e740dc9b90f1e61ae8cea4Eric Shienbrood 5682f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow// CellularCapabilityClassic handles modems using the 5782f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow// org.chromium.ModemManager DBUS interface. 5882f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgowclass CellularCapabilityClassic : public CellularCapability { 5982f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow public: 6082f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow static const char kConnectPropertyApn[]; 6182f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow static const char kConnectPropertyApnUsername[]; 6282f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow static const char kConnectPropertyApnPassword[]; 6382f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow static const char kConnectPropertyHomeOnly[]; 6482f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow static const char kConnectPropertyPhoneNumber[]; 657fce52c4afdc5e73a9e740dc9b90f1e61ae8cea4Eric Shienbrood static const char kModemPropertyEnabled[]; 66c37a9c4ee413984342d53c6151edcb7dc3800d78Darin Petkov static const int kTimeoutSetCarrierMilliseconds; 6782f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow 6882f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow // |cellular| is the parent Cellular device. 69f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart CellularCapabilityClassic(Cellular* cellular, 70608ec29525f553d51f0a92e84176e3d4b45930a9Peter Qiu ControlInterface* control_interface, 71f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart ModemInfo* modem_info); 725ea763b83299b5fad76a87183fb39a74c2d3c61dBen Chan ~CellularCapabilityClassic() override; 7382f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow 74f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan // Inherited from CellularCapability. 7505d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu void OnPropertiesChanged( 76f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart const std::string& interface, 7705d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu const KeyValueStore& changed_properties, 78f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart const std::vector<std::string>& invalidated_properties) override; 79f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart void StopModem(Error* error, const ResultCallback& callback) override; 80016fa0e9c8f47630c8e6c440ace42ba99f8498dfAlex Vakulenko bool AreProxiesInitialized() const override; 81f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart void SetCarrier(const std::string& carrier, 82f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart Error* error, 83f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart const ResultCallback& callback) override; 8405d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu void Connect(const KeyValueStore& properties, 85f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart Error* error, 86f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart const ResultCallback& callback) override; 87f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart void Disconnect(Error* error, 88f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart const ResultCallback& callback) override; 897fce52c4afdc5e73a9e740dc9b90f1e61ae8cea4Eric Shienbrood 9082f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow protected: 91a0caabfa2443efdff8ef87e6db0186b68133cea5Jason Glasgow typedef std::vector<base::Closure> CellularTaskList; 92a0caabfa2443efdff8ef87e6db0186b68133cea5Jason Glasgow 934380f0da94f609b01951ce2b250b04f404adc132Jason Glasgow virtual void GetRegistrationState() = 0; 944380f0da94f609b01951ce2b250b04f404adc132Jason Glasgow 9582f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow // The following five methods are only ever called as 9682f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow // callbacks (from the main loop), which is why they 97f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart // don't take an Error* argument. 98f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart virtual void EnableModem(const ResultCallback& callback); 99f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart virtual void DisableModem(const ResultCallback& callback); 100f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart virtual void GetModemStatus(const ResultCallback& callback); 101f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart virtual void GetModemInfo(const ResultCallback& callback); 102f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart virtual void GetProperties(const ResultCallback& callback) = 0; 103f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart 104f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart void FinishEnable(const ResultCallback& callback); 105f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart void FinishDisable(const ResultCallback& callback); 10682f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow virtual void InitProxies(); 1076acd966cabe0d75e0d9ae3f84c727c9b44a899b3Yunlian Jiang void ReleaseProxies() override; 1086e0a8ef3cacc359b80849047aecba6f1c7007e8aPrathmesh Prabhu 1096e0a8ef3cacc359b80849047aecba6f1c7007e8aPrathmesh Prabhu // Default implementation is no-op. 11005d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu virtual void UpdateStatus(const KeyValueStore& properties); 11182f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow 112a0caabfa2443efdff8ef87e6db0186b68133cea5Jason Glasgow // Runs the next task in a list. 113a0caabfa2443efdff8ef87e6db0186b68133cea5Jason Glasgow // Precondition: |tasks| is not empty. 114f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart void RunNextStep(CellularTaskList* tasks); 115a0caabfa2443efdff8ef87e6db0186b68133cea5Jason Glasgow // StepCompletedCallback is called after a task completes. 116a0caabfa2443efdff8ef87e6db0186b68133cea5Jason Glasgow // |callback| is the original callback that needs to be invoked when all of 117a0caabfa2443efdff8ef87e6db0186b68133cea5Jason Glasgow // the tasks complete or if there is a failure. |ignore_error| will be set 118a0caabfa2443efdff8ef87e6db0186b68133cea5Jason Glasgow // to true if the next task should be run regardless of the result of the 119a0caabfa2443efdff8ef87e6db0186b68133cea5Jason Glasgow // just-completed task. |tasks| is the list of tasks remaining. |error| is 120a0caabfa2443efdff8ef87e6db0186b68133cea5Jason Glasgow // the result of the just-completed task. 121f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart void StepCompletedCallback(const ResultCallback& callback, 122f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan bool ignore_error, 123f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart CellularTaskList* tasks, 124f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart const Error& error); 125a0caabfa2443efdff8ef87e6db0186b68133cea5Jason Glasgow 126c20ed13f5c0e87e7a5164d1b5330ccd99cced58fBen Chan std::unique_ptr<ModemSimpleProxyInterface> simple_proxy_; 127b54974f033f713690135f3f3516ca14aa7ee6cfdNathan Williams 12882f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow private: 12982f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow friend class CellularTest; 1307d0953e9ee0455e7774b5f55ad88582961b757a3Christopher Wiley friend class CellularCapabilityCDMATest; 13182f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow friend class CellularCapabilityTest; 13282f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow friend class CellularCapabilityGSMTest; 13382f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow FRIEND_TEST(CellularCapabilityGSMTest, SetProxy); 13482f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow FRIEND_TEST(CellularCapabilityGSMTest, SetStorageIdentifier); 13582f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow FRIEND_TEST(CellularCapabilityGSMTest, UpdateStatus); 13682f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow FRIEND_TEST(CellularCapabilityTest, AllowRoaming); 13782f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow FRIEND_TEST(CellularCapabilityTest, EnableModemFail); 13882f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow FRIEND_TEST(CellularCapabilityTest, EnableModemSucceed); 13982f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow FRIEND_TEST(CellularCapabilityTest, FinishEnable); 14082f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow FRIEND_TEST(CellularCapabilityTest, GetModemInfo); 14182f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow FRIEND_TEST(CellularCapabilityTest, GetModemStatus); 14282f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow FRIEND_TEST(CellularCapabilityTest, TryApns); 14382f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow FRIEND_TEST(CellularServiceTest, FriendlyName); 14482f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow FRIEND_TEST(CellularTest, StartCDMARegister); 14582f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow FRIEND_TEST(CellularTest, StartConnected); 14682f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow FRIEND_TEST(CellularTest, StartGSMRegister); 14782f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow FRIEND_TEST(CellularTest, StartLinked); 14882f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow FRIEND_TEST(CellularTest, Connect); 14982f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow FRIEND_TEST(CellularTest, ConnectFailure); 150b5954a249c1346e5a0da097330a3639753392ecbThieu Le FRIEND_TEST(CellularTest, ConnectFailureNoService); 151d4974cd523440171033048d03d27730b47f50cf2Thieu Le FRIEND_TEST(CellularTest, ConnectSuccessNoService); 15282f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow FRIEND_TEST(CellularTest, Disconnect); 153539c423105d5ee8f8c40b9025265f6d5c0386381Arman Uguray FRIEND_TEST(CellularTest, DisconnectFailure); 1547d0953e9ee0455e7774b5f55ad88582961b757a3Christopher Wiley FRIEND_TEST(CellularTest, DisconnectWithCallback); 1557fce52c4afdc5e73a9e740dc9b90f1e61ae8cea4Eric Shienbrood FRIEND_TEST(CellularTest, ModemStateChangeEnable); 1567fce52c4afdc5e73a9e740dc9b90f1e61ae8cea4Eric Shienbrood FRIEND_TEST(CellularTest, ModemStateChangeDisable); 15782f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow 15882f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow // Method reply and signal callbacks from Modem interface 1597fab89734d88724a288e96a9996b15548c5294c7Ben Chan void OnModemStateChangedSignal(uint32_t old_state, 1607fab89734d88724a288e96a9996b15548c5294c7Ben Chan uint32_t new_state, 1617fab89734d88724a288e96a9996b15548c5294c7Ben Chan uint32_t reason); 162f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart void OnGetModemInfoReply(const ResultCallback& callback, 16305d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu const std::string& manufacturer, 16405d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu const std::string& modem, 16505d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu const std::string& version, 166f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart const Error& error); 16782f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow 16882f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow // Method reply callbacks from Modem.Simple interface 169f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart void OnGetModemStatusReply(const ResultCallback& callback, 17005d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu const KeyValueStore& props, 171f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart const Error& error); 17282f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow 173f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart Cellular* cellular_; 17482f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow base::WeakPtrFactory<CellularCapabilityClassic> weak_ptr_factory_; 175c20ed13f5c0e87e7a5164d1b5330ccd99cced58fBen Chan std::unique_ptr<ModemProxyInterface> proxy_; 176c20ed13f5c0e87e7a5164d1b5330ccd99cced58fBen Chan std::unique_ptr<ModemGobiProxyInterface> gobi_proxy_; 17782f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow 17882f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow DISALLOW_COPY_AND_ASSIGN(CellularCapabilityClassic); 17982f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow}; 18082f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow 18182f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow} // namespace shill 18282f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow 183c54afe521739065a5d77e7c049acdb5e603f0592Ben Chan#endif // SHILL_CELLULAR_CELLULAR_CAPABILITY_CLASSIC_H_ 184