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