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// 16daf4386a4775be7c965493749ccfe2fecc2e4167Darin Petkov 17c54afe521739065a5d77e7c049acdb5e603f0592Ben Chan#ifndef SHILL_CELLULAR_CELLULAR_CAPABILITY_H_ 18c54afe521739065a5d77e7c049acdb5e603f0592Ben Chan#define SHILL_CELLULAR_CELLULAR_CAPABILITY_H_ 19daf4386a4775be7c965493749ccfe2fecc2e4167Darin Petkov 20b05315fa7beab387bcbfd9330215aa50cdd6c8f4Darin Petkov#include <string> 213e20a2341d0aeb7681e4ee0f89eae6817ade2b3bEric Shienbrood#include <vector> 22b05315fa7beab387bcbfd9330215aa50cdd6c8f4Darin Petkov 233e20a2341d0aeb7681e4ee0f89eae6817ade2b3bEric Shienbrood#include <base/callback.h> 24cc67c52a2c00f90e877971d552208dd99825d84eBen Chan#include <base/macros.h> 255de44ab664b7cbb7619e31431e346ec8309548a6Eric Shienbrood#include <gtest/gtest_prod.h> // for FRIEND_TEST 26daf4386a4775be7c965493749ccfe2fecc2e4167Darin Petkov 2782f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow#include "shill/callbacks.h" 28c54afe521739065a5d77e7c049acdb5e603f0592Ben Chan#include "shill/cellular/cellular.h" 29ce4483e054058ab3f6d940c7aa2e7b5697af325aThieu Le#include "shill/metrics.h" 305de44ab664b7cbb7619e31431e346ec8309548a6Eric Shienbrood 31daf4386a4775be7c965493749ccfe2fecc2e4167Darin Petkovnamespace shill { 32daf4386a4775be7c965493749ccfe2fecc2e4167Darin Petkov 33daf4386a4775be7c965493749ccfe2fecc2e4167Darin Petkovclass Cellular; 34539ab0266ef93a3198f12b8be83a6312d35d6ba0Ben Chanclass CellularBearer; 35b05315fa7beab387bcbfd9330215aa50cdd6c8f4Darin Petkovclass Error; 3627526f1dad75e135f437e023cb34b0919d9a981fPrathmesh Prabhuclass ModemInfo; 37daf4386a4775be7c965493749ccfe2fecc2e4167Darin Petkov 385de44ab664b7cbb7619e31431e346ec8309548a6Eric Shienbrood// Cellular devices instantiate subclasses of CellularCapability that 395de44ab664b7cbb7619e31431e346ec8309548a6Eric Shienbrood// handle the specific modem technologies and capabilities. 4082f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow// 4182f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow// The CellularCapability is directly subclassed by: 4282f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow// * CelllularCapabilityUniversal which handles all modems managed by 4382f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow// a modem manager using the the org.chromium.ModemManager1 DBUS 4472fab6ab6f6d481f904b5e259ce27a84e32760e4Arman Uguray// interface. 4582f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow// * CellularCapabilityClassic which handles all modems managed by a 4682f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow// modem manager using the older org.chromium.ModemManager DBUS 4782f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow// interface. This class is further subclassed to represent CDMA 4872fab6ab6f6d481f904b5e259ce27a84e32760e4Arman Uguray// and GSM modems. 4982f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow// 5082f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow// Pictorially: 5182f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow// 5282f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow// CellularCapability 5382f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow// | 5482f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow// |-- CellularCapabilityUniversal 5572fab6ab6f6d481f904b5e259ce27a84e32760e4Arman Uguray// | | 5672fab6ab6f6d481f904b5e259ce27a84e32760e4Arman Uguray// | |-- CellularCapabilityUniversalCDMA 5782f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow// | 5882f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow// |-- CellularCapabilityClassic 5982f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow// | 6082f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow// |-- CellularCapabilityGSM 6182f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow// | 6282f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow// |-- CellularCapabilityCDMA 6382f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow// 6472fab6ab6f6d481f904b5e259ce27a84e32760e4Arman Uguray// TODO(armansito): Currently, 3GPP logic is handled by 6572fab6ab6f6d481f904b5e259ce27a84e32760e4Arman Uguray// CellularCapabilityUniversal. Eventually CellularCapabilityUniversal will 6672fab6ab6f6d481f904b5e259ce27a84e32760e4Arman Uguray// only serve as the abstract base class for ModemManager1 3GPP and CDMA 6772fab6ab6f6d481f904b5e259ce27a84e32760e4Arman Uguray// capabilities. 689a24553461df7036755060423f90804011612249Eric Shienbroodclass CellularCapability { 69daf4386a4775be7c965493749ccfe2fecc2e4167Darin Petkov public: 705de44ab664b7cbb7619e31431e346ec8309548a6Eric Shienbrood static const int kTimeoutActivate; 715de44ab664b7cbb7619e31431e346ec8309548a6Eric Shienbrood static const int kTimeoutConnect; 725de44ab664b7cbb7619e31431e346ec8309548a6Eric Shienbrood static const int kTimeoutDefault; 73049adb5335c6bd6863c70c67ecaca06cccd93027Thieu Le static const int kTimeoutDisconnect; 749a24553461df7036755060423f90804011612249Eric Shienbrood static const int kTimeoutEnable; 755de44ab664b7cbb7619e31431e346ec8309548a6Eric Shienbrood static const int kTimeoutRegister; 765d0d32c1b5e2370ff0739f7a2dbb641726d4bf87Ben Chan static const int kTimeoutReset; 775de44ab664b7cbb7619e31431e346ec8309548a6Eric Shienbrood static const int kTimeoutScan; 785de44ab664b7cbb7619e31431e346ec8309548a6Eric Shienbrood 797fce52c4afdc5e73a9e740dc9b90f1e61ae8cea4Eric Shienbrood static const char kModemPropertyIMSI[]; 807fce52c4afdc5e73a9e740dc9b90f1e61ae8cea4Eric Shienbrood static const char kModemPropertyState[]; 815de44ab664b7cbb7619e31431e346ec8309548a6Eric Shienbrood 82daf4386a4775be7c965493749ccfe2fecc2e4167Darin Petkov // |cellular| is the parent Cellular device. 83f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart CellularCapability(Cellular* cellular, 84608ec29525f553d51f0a92e84176e3d4b45930a9Peter Qiu ControlInterface* control_interface, 85f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart ModemInfo* modem_info); 86daf4386a4775be7c965493749ccfe2fecc2e4167Darin Petkov virtual ~CellularCapability(); 87daf4386a4775be7c965493749ccfe2fecc2e4167Darin Petkov 88f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan virtual std::string GetTypeString() const = 0; 89daf4386a4775be7c965493749ccfe2fecc2e4167Darin Petkov 90f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan // Called when the modem manager has sent a property change notification 9105d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu // signal. 9205d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu virtual void OnPropertiesChanged( 93f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart const std::string& interface, 9405d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu const KeyValueStore& changed_properties, 95f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart const std::vector<std::string>& invalidated_properties) = 0; 96ae0c64ea644748f28b7a320e9663f30cd69e344eDarin Petkov 97f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan // ------------------------------------------------------------------------- 98f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan // Modem management 99f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan // ------------------------------------------------------------------------- 100f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan 101f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan // StartModem attempts to put the modem in a state in which it is usable for 102f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan // creating services and establishing connections (if network conditions 103f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan // permit). It potentially consists of multiple non-blocking calls to the 104f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan // modem-manager server. After each call, control is passed back up to the 105f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan // main loop. Each time a reply to a non-blocking call is received, the 106f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan // operation advances to the next step, until either an error occurs in one of 107f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan // them, or all the steps have been completed, at which point StartModem() is 108f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan // finished. 109f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart virtual void StartModem(Error* error, const ResultCallback& callback) = 0; 110f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan 111f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan // StopModem disconnects and disables a modem asynchronously. |callback| is 112f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan // invoked when this completes and the result is passed to the callback. 113f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart virtual void StopModem(Error* error, const ResultCallback& callback) = 0; 1145de44ab664b7cbb7619e31431e346ec8309548a6Eric Shienbrood 115f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan // Resets the modem. 116f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan // 117f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan // The default implementation fails by returning kNotSupported via |error|. 118f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart virtual void Reset(Error* error, const ResultCallback& callback); 119f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan 12063881a73f4aa10521e0173e4fa5e4dedec45730fThieu Le // Checks to see if all proxies have been initialized. 12163881a73f4aa10521e0173e4fa5e4dedec45730fThieu Le virtual bool AreProxiesInitialized() const = 0; 12263881a73f4aa10521e0173e4fa5e4dedec45730fThieu Le 123f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan // ------------------------------------------------------------------------- 124f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan // Activation 125f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan // ------------------------------------------------------------------------- 126f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan 127f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan // Returns true if service activation is required. 128f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan // 129f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan // The default implementation returns false. 130f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan virtual bool IsServiceActivationRequired() const; 131f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan 132f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan // Returns true if the modem is being activated. 133f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan // 134f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan // The default implementation returns false. 135f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan virtual bool IsActivating() const; 136f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan 137f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan // Activates the modem. 138f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan // 139f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan // The default implementation fails by returning kNotSupported via |error|. 140f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart virtual void Activate(const std::string& carrier, 141f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart Error* error, const ResultCallback& callback); 142a3d3be5100a0931273cdfc08b364efe03322e3caDarin Petkov 143c7b1560b03c070fad239767f868322e6b3bdd932Arman Uguray // Initiates the necessary to steps to verify that the cellular service has 144c7b1560b03c070fad239767f868322e6b3bdd932Arman Uguray // been activated. Once these steps have been completed, the service should 145c7b1560b03c070fad239767f868322e6b3bdd932Arman Uguray // be marked as activated. 146c7b1560b03c070fad239767f868322e6b3bdd932Arman Uguray // 147f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan // The default implementation fails by returning kNotSupported via |error|. 148f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart virtual void CompleteActivation(Error* error); 149c7b1560b03c070fad239767f868322e6b3bdd932Arman Uguray 150f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan // ------------------------------------------------------------------------- 151f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan // Network service and registration 152f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan // ------------------------------------------------------------------------- 15315786033dc85e3dd7fea18ba936957b8b2c34e29Ben Chan 154f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan // Configures the modem to support the |carrier|. 155f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan // 156f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan // The default implementation fails by returning kNotSupported via |error|. 157f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart virtual void SetCarrier(const std::string& carrier, 158f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart Error* error, 159f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart const ResultCallback& callback); 160f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan 161f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan // Asks the modem to scan for networks. 162f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan // 163f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan // The default implementation fails by returning kNotSupported via |error|. 164f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan // 165f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan // Subclasses should implement this by fetching scan results asynchronously. 166f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan // When the results are ready, update the kFoundNetworksProperty and send a 167f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan // property change notification. Finally, callback must be invoked to inform 168f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan // the caller that the scan has completed. 169f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan // 170f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan // Errors are not generally reported, but on error the kFoundNetworksProperty 171f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan // should be cleared and a property change notification sent out. 172f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan // 173f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan // TODO(jglasgow): Refactor to reuse code by putting notification logic into 174f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan // Cellular or CellularCapability. 175f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan // 176f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan // TODO(jglasgow): Implement real error handling. 177f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart virtual void Scan(Error* error, const ResultStringmapsCallback& callback); 178f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan 179f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan // Registers on a network with |network_id|. 180f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart virtual void RegisterOnNetwork(const std::string& network_id, 181f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart Error* error, 182f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart const ResultCallback& callback); 183f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan 18431ce564d64f68172299d4cde60edd7a5c004b38eBen Chan // Returns true if the modem is registered on a network, which can be a home 18531ce564d64f68172299d4cde60edd7a5c004b38eBen Chan // or roaming network. It is possible that we cannot determine whether it is 18631ce564d64f68172299d4cde60edd7a5c004b38eBen Chan // a home or roaming network, but we still consider the modem is registered. 18731ce564d64f68172299d4cde60edd7a5c004b38eBen Chan virtual bool IsRegistered() const = 0; 188f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan 1897fce52c4afdc5e73a9e740dc9b90f1e61ae8cea4Eric Shienbrood // If we are informed by means of something other than a signal indicating 1907fce52c4afdc5e73a9e740dc9b90f1e61ae8cea4Eric Shienbrood // a registration state change that the modem has unregistered from the 1917fce52c4afdc5e73a9e740dc9b90f1e61ae8cea4Eric Shienbrood // network, we need to update the network-type-specific capability object. 1927fce52c4afdc5e73a9e740dc9b90f1e61ae8cea4Eric Shienbrood virtual void SetUnregistered(bool searching) = 0; 193184c54e6091b21fc2a8ba40d8957ca6c84c37d6eDarin Petkov 194f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan // Invoked by the parent Cellular device when a new service is created. 195f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan virtual void OnServiceCreated() = 0; 196f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan 19792df619a98585c7fe7b072fe07f60b43c9ec52ddPrathmesh Prabhu // Hook called by the Cellular device when either the Home Provider or the 19892df619a98585c7fe7b072fe07f60b43c9ec52ddPrathmesh Prabhu // Serving Operator changes. Default implementation calls other hooks declared 19992df619a98585c7fe7b072fe07f60b43c9ec52ddPrathmesh Prabhu // below. Overrides should chain up to this function. 20092df619a98585c7fe7b072fe07f60b43c9ec52ddPrathmesh Prabhu // Note: This may be called before |CellularService| is created. 20192df619a98585c7fe7b072fe07f60b43c9ec52ddPrathmesh Prabhu virtual void OnOperatorChanged(); 20292df619a98585c7fe7b072fe07f60b43c9ec52ddPrathmesh Prabhu virtual void UpdateServiceOLP(); 20392df619a98585c7fe7b072fe07f60b43c9ec52ddPrathmesh Prabhu 204f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan // Returns an empty string if the network technology is unknown. 205f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan virtual std::string GetNetworkTechnologyString() const = 0; 206b05315fa7beab387bcbfd9330215aa50cdd6c8f4Darin Petkov 207f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan virtual std::string GetRoamingStateString() const = 0; 208c37a9c4ee413984342d53c6151edcb7dc3800d78Darin Petkov 209f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan // Should this device allow roaming? 210f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan // The decision to allow roaming or not is based on the home provider as well 211f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan // as on the user modifiable "allow_roaming" property. 212f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan virtual bool AllowRoaming() = 0; 213f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan 214f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan // Returns true if the cellular device should initiate passive traffic 215f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan // monitoring to trigger active out-of-credit detection checks. The default 216f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan // implementation returns false by default. 217f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan virtual bool ShouldDetectOutOfCredit() const; 218f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan 219f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan // TODO(armansito): Remove this method once cromo is deprecated. 220f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan virtual void GetSignalQuality() = 0; 221f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan 222f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan // ------------------------------------------------------------------------- 223f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan // Connection management 224f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan // ------------------------------------------------------------------------- 225f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan 226f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan // Fills |properties| with properties for establishing a connection, which 227f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan // will be passed to Connect(). 22805d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu virtual void SetupConnectProperties(KeyValueStore* properties) = 0; 229f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan 230f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan // Connects the modem to a network based on the connection properties 231f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan // specified by |properties|. 23205d87e34869f44473edc1eec25d2fe1110d777a7Peter Qiu virtual void Connect(const KeyValueStore& properties, 233f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart Error* error, 234f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart const ResultCallback& callback) = 0; 235f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan 236f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan // Disconnects the modem from a network. 237f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart virtual void Disconnect(Error* error, const ResultCallback& callback) = 0; 238f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan 239f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan // Called when a disconnect operation completes, successful or not. 24082f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow // 241f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan // The default implementation does nothing. 242f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan virtual void DisconnectCleanup(); 2431272a43bf73f6a99f51a6cc6345183aa503cfb67Darin Petkov 244ea18c6c99743aeee9b2e544532ef9fe55dbd182dBen Chan // Returns a pointer to the current active bearer object or nullptr if no 245ea18c6c99743aeee9b2e544532ef9fe55dbd182dBen Chan // active bearer exists. The returned bearer object is managed by this 246ea18c6c99743aeee9b2e544532ef9fe55dbd182dBen Chan // capability object. This implementation returns nullptr by default. 247f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart virtual CellularBearer* GetActiveBearer() const; 248539ab0266ef93a3198f12b8be83a6312d35d6ba0Ben Chan 249f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan // ------------------------------------------------------------------------- 250f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan // SIM PIN management 251f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan // ------------------------------------------------------------------------- 25220c13ec645faacb9c517fd2c574aa7fa30d890d0Darin Petkov 253f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan // The default implementation fails by returning kNotSupported via |error|. 254f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart virtual void RequirePIN(const std::string& pin, 255f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan bool require, 256f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart Error* error, 257f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart const ResultCallback& callback); 25820c13ec645faacb9c517fd2c574aa7fa30d890d0Darin Petkov 259f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart virtual void EnterPIN(const std::string& pin, 260f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart Error* error, 261f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart const ResultCallback& callback); 2620db6a9b416564808fea94eac688d78eb3c754bb3Eric Shienbrood 263f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart virtual void UnblockPIN(const std::string& unblock_code, 264f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart const std::string& pin, 265f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart Error* error, 266f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart const ResultCallback& callback); 267ae0c64ea644748f28b7a320e9663f30cd69e344eDarin Petkov 268f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart virtual void ChangePIN(const std::string& old_pin, 269f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart const std::string& new_pin, 270f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart Error* error, 271f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart const ResultCallback& callback); 2729a24553461df7036755060423f90804011612249Eric Shienbrood 273f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan // ------------------------------------------------------------------------- 2741582bddf620625f9e6f6c407a707d6a916387df1Christopher Wiley 275f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart Cellular* cellular() const { return cellular_; } 276608ec29525f553d51f0a92e84176e3d4b45930a9Peter Qiu ControlInterface* control_interface() const { return control_interface_; } 277f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart ModemInfo* modem_info() const { return modem_info_; } 278d42d8ec85a9a1bdc406870b75d1b9e266fbaaa02Arman Uguray 27982f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow protected: 280f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan // Releases all proxies held by the object. This is most useful during unit 281f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan // tests. 28282f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow virtual void ReleaseProxies() = 0; 2839a24553461df7036755060423f90804011612249Eric Shienbrood 284f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart static void OnUnsupportedOperation(const char* operation, Error* error); 2859a24553461df7036755060423f90804011612249Eric Shienbrood 286f98f00e52f3408fd3ca6184f19636efb7e66b986Ben Chan // Accessor for subclasses to read the 'allow roaming' property. 2877b461dfc2e96f207ef42fec71d8d941fdef98c83Jason Glasgow bool allow_roaming_property() const { 2887b461dfc2e96f207ef42fec71d8d941fdef98c83Jason Glasgow return cellular_->allow_roaming_property(); 2897b461dfc2e96f207ef42fec71d8d941fdef98c83Jason Glasgow } 2905de44ab664b7cbb7619e31431e346ec8309548a6Eric Shienbrood 291daf4386a4775be7c965493749ccfe2fecc2e4167Darin Petkov private: 292923006bc5f3fde53ea8651de16200d7226f065a2Thieu Le friend class CellularCapabilityGSMTest; 2935de44ab664b7cbb7619e31431e346ec8309548a6Eric Shienbrood friend class CellularCapabilityTest; 294ef96556fff984bbc79597669af2465905666ed09Jason Glasgow friend class CellularCapabilityUniversalTest; 29572fab6ab6f6d481f904b5e259ce27a84e32760e4Arman Uguray friend class CellularCapabilityUniversalCDMATest; 296923006bc5f3fde53ea8651de16200d7226f065a2Thieu Le friend class CellularTest; 2979c1dcef1a5a21057392874bd511b5c577c35634aDarin Petkov FRIEND_TEST(CellularCapabilityTest, AllowRoaming); 298539ab0266ef93a3198f12b8be83a6312d35d6ba0Ben Chan FRIEND_TEST(CellularCapabilityUniversalMainTest, UpdateActiveBearer); 2995de44ab664b7cbb7619e31431e346ec8309548a6Eric Shienbrood FRIEND_TEST(CellularTest, Connect); 30082f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow FRIEND_TEST(CellularTest, TearDown); 301721ac93ab19a9169872a296626adb49279031af5Darin Petkov 302f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart Cellular* cellular_; 303608ec29525f553d51f0a92e84176e3d4b45930a9Peter Qiu ControlInterface* control_interface_; 304f58b28e08efb9e3beccb993bc27dd68e0025a7daPaul Stewart ModemInfo* modem_info_; 305daf4386a4775be7c965493749ccfe2fecc2e4167Darin Petkov 306daf4386a4775be7c965493749ccfe2fecc2e4167Darin Petkov DISALLOW_COPY_AND_ASSIGN(CellularCapability); 307daf4386a4775be7c965493749ccfe2fecc2e4167Darin Petkov}; 308daf4386a4775be7c965493749ccfe2fecc2e4167Darin Petkov 309daf4386a4775be7c965493749ccfe2fecc2e4167Darin Petkov} // namespace shill 310daf4386a4775be7c965493749ccfe2fecc2e4167Darin Petkov 311c54afe521739065a5d77e7c049acdb5e603f0592Ben Chan#endif // SHILL_CELLULAR_CELLULAR_CAPABILITY_H_ 312