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