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//
1699c8a4d2e6b81b1c395b2e1054111b29c20a5189Ben Chan
17c3d707d1ae4198d5538ff4deccd729a83f1bc805Ben Chan#ifndef SHILL_WIMAX_WIMAX_H_
18c3d707d1ae4198d5538ff4deccd729a83f1bc805Ben Chan#define SHILL_WIMAX_WIMAX_H_
1999c8a4d2e6b81b1c395b2e1054111b29c20a5189Ben Chan
20247dcc12556bbfb7e50753befe217d29eb2f2f86Ben Chan#include <memory>
21c63dcf0b428ea99e8a9a88bc964a51e65b6dddf0Darin Petkov#include <set>
228a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko#include <string>
23c63dcf0b428ea99e8a9a88bc964a51e65b6dddf0Darin Petkov
243a4100c44c9676f17829de5bcb23e883bd970ef7Darin Petkov#include <base/cancelable_callback.h>
253a4100c44c9676f17829de5bcb23e883bd970ef7Darin Petkov#include <base/memory/weak_ptr.h>
26289a5a5e18bb1a676b3dfce111af4c2c00c7776eSamuel Tan#if defined(__ANDROID__)
27289a5a5e18bb1a676b3dfce111af4c2c00c7776eSamuel Tan#include <dbus/service_constants.h>
28289a5a5e18bb1a676b3dfce111af4c2c00c7776eSamuel Tan#else
298ea0eaf6fb42aa7d959a131e43ea1d06635d6da2Darin Petkov#include <chromeos/dbus/service_constants.h>
30289a5a5e18bb1a676b3dfce111af4c2c00c7776eSamuel Tan#endif  // __ANDROID__
31b72b62ec23d13c8e84a1499a04231b79d4bd74bbDarin Petkov#include <gtest/gtest_prod.h>  // for FRIEND_TEST
32b72b62ec23d13c8e84a1499a04231b79d4bd74bbDarin Petkov
3399c8a4d2e6b81b1c395b2e1054111b29c20a5189Ben Chan#include "shill/device.h"
3499c8a4d2e6b81b1c395b2e1054111b29c20a5189Ben Chan
3599c8a4d2e6b81b1c395b2e1054111b29c20a5189Ben Channamespace shill {
3699c8a4d2e6b81b1c395b2e1054111b29c20a5189Ben Chan
37b72b62ec23d13c8e84a1499a04231b79d4bd74bbDarin Petkovclass WiMaxDeviceProxyInterface;
38b72b62ec23d13c8e84a1499a04231b79d4bd74bbDarin Petkov
3999c8a4d2e6b81b1c395b2e1054111b29c20a5189Ben Chanclass WiMax : public Device {
4099c8a4d2e6b81b1c395b2e1054111b29c20a5189Ben Chan public:
4193d817916f4cac344b6985c867a85f65711a1486Paul Stewart  WiMax(ControlInterface* control,
4293d817916f4cac344b6985c867a85f65711a1486Paul Stewart        EventDispatcher* dispatcher,
4393d817916f4cac344b6985c867a85f65711a1486Paul Stewart        Metrics* metrics,
4493d817916f4cac344b6985c867a85f65711a1486Paul Stewart        Manager* manager,
4593d817916f4cac344b6985c867a85f65711a1486Paul Stewart        const std::string& link_name,
4693d817916f4cac344b6985c867a85f65711a1486Paul Stewart        const std::string& address,
47b72b62ec23d13c8e84a1499a04231b79d4bd74bbDarin Petkov        int interface_index,
4893d817916f4cac344b6985c867a85f65711a1486Paul Stewart        const RpcIdentifier& path);
4999c8a4d2e6b81b1c395b2e1054111b29c20a5189Ben Chan
505ea763b83299b5fad76a87183fb39a74c2d3c61dBen Chan  ~WiMax() override;
5199c8a4d2e6b81b1c395b2e1054111b29c20a5189Ben Chan
529893d9c59f596e621463c8e97bb3933f8fa7edf6Darin Petkov  // Inherited from Device.
5393d817916f4cac344b6985c867a85f65711a1486Paul Stewart  void Start(Error* error,
5493d817916f4cac344b6985c867a85f65711a1486Paul Stewart             const EnabledStateChangedCallback& callback) override;
5593d817916f4cac344b6985c867a85f65711a1486Paul Stewart  void Stop(Error* error, const EnabledStateChangedCallback& callback) override;
5693d817916f4cac344b6985c867a85f65711a1486Paul Stewart  void Scan(ScanType /*scan_type*/, Error* error,
5793d817916f4cac344b6985c867a85f65711a1486Paul Stewart            const std::string& /*reason*/) override;
5899c8a4d2e6b81b1c395b2e1054111b29c20a5189Ben Chan
5993d817916f4cac344b6985c867a85f65711a1486Paul Stewart  virtual void ConnectTo(const WiMaxServiceRefPtr& service, Error* error);
6093d817916f4cac344b6985c867a85f65711a1486Paul Stewart  virtual void DisconnectFrom(const ServiceRefPtr& service, Error* error);
61d1cd79736d7a9969c966a76a5906ea408bad3731Darin Petkov
62c63dcf0b428ea99e8a9a88bc964a51e65b6dddf0Darin Petkov  // Signaled by |service| when stopped.
6393d817916f4cac344b6985c867a85f65711a1486Paul Stewart  virtual void OnServiceStopped(const WiMaxServiceRefPtr& service);
64d1cd79736d7a9969c966a76a5906ea408bad3731Darin Petkov
65b96a4515c8cc4432a87c70cbae2865e1445eb86eDarin Petkov  // Signaled by WiMaxProvider when the RPC device disappears. The provider will
66b96a4515c8cc4432a87c70cbae2865e1445eb86eDarin Petkov  // deregister and destroy the device after invoking this method.
67b96a4515c8cc4432a87c70cbae2865e1445eb86eDarin Petkov  virtual void OnDeviceVanished();
68b96a4515c8cc4432a87c70cbae2865e1445eb86eDarin Petkov
696b9b2e18088f22b79ea5d87f575b67632fb5770aDarin Petkov  // Returns true if this device is not connecting or connected to a service.
706b9b2e18088f22b79ea5d87f575b67632fb5770aDarin Petkov  virtual bool IsIdle() const;
716b9b2e18088f22b79ea5d87f575b67632fb5770aDarin Petkov
7293d817916f4cac344b6985c867a85f65711a1486Paul Stewart  const RpcIdentifier& path() const { return path_; }
739893d9c59f596e621463c8e97bb3933f8fa7edf6Darin Petkov  bool scanning() const { return scanning_; }
7493d817916f4cac344b6985c867a85f65711a1486Paul Stewart  const std::set<RpcIdentifier>& networks() const { return networks_; }
75b72b62ec23d13c8e84a1499a04231b79d4bd74bbDarin Petkov
7699c8a4d2e6b81b1c395b2e1054111b29c20a5189Ben Chan private:
77b72b62ec23d13c8e84a1499a04231b79d4bd74bbDarin Petkov  friend class WiMaxTest;
78c63dcf0b428ea99e8a9a88bc964a51e65b6dddf0Darin Petkov  FRIEND_TEST(WiMaxProviderTest, OnNetworksChanged);
793a4100c44c9676f17829de5bcb23e883bd970ef7Darin Petkov  FRIEND_TEST(WiMaxTest, ConnectTimeout);
803a4100c44c9676f17829de5bcb23e883bd970ef7Darin Petkov  FRIEND_TEST(WiMaxTest, ConnectTo);
81b96a4515c8cc4432a87c70cbae2865e1445eb86eDarin Petkov  FRIEND_TEST(WiMaxTest, DropService);
826b9b2e18088f22b79ea5d87f575b67632fb5770aDarin Petkov  FRIEND_TEST(WiMaxTest, IsIdle);
838ea0eaf6fb42aa7d959a131e43ea1d06635d6da2Darin Petkov  FRIEND_TEST(WiMaxTest, OnConnectComplete);
84b96a4515c8cc4432a87c70cbae2865e1445eb86eDarin Petkov  FRIEND_TEST(WiMaxTest, OnDeviceVanished);
8559f2d69a15abf0a1ceb4eff58adcf815f2a0ff92Darin Petkov  FRIEND_TEST(WiMaxTest, OnEnableComplete);
869893d9c59f596e621463c8e97bb3933f8fa7edf6Darin Petkov  FRIEND_TEST(WiMaxTest, OnNetworksChanged);
87c63dcf0b428ea99e8a9a88bc964a51e65b6dddf0Darin Petkov  FRIEND_TEST(WiMaxTest, OnServiceStopped);
88a3f9f775e30f6fbb06f34f7ee9e20a68a1412c95Darin Petkov  FRIEND_TEST(WiMaxTest, OnStatusChanged);
89b72b62ec23d13c8e84a1499a04231b79d4bd74bbDarin Petkov  FRIEND_TEST(WiMaxTest, StartStop);
90b72b62ec23d13c8e84a1499a04231b79d4bd74bbDarin Petkov
913a4100c44c9676f17829de5bcb23e883bd970ef7Darin Petkov  static const int kDefaultConnectTimeoutSeconds;
923a4100c44c9676f17829de5bcb23e883bd970ef7Darin Petkov  static const int kDefaultRPCTimeoutSeconds;
93912f0de92ca103568821e20412b7dc2529494f98Darin Petkov
9493d817916f4cac344b6985c867a85f65711a1486Paul Stewart  void OnScanNetworksComplete(const Error& error);
9593d817916f4cac344b6985c867a85f65711a1486Paul Stewart  void OnConnectComplete(const Error& error);
9693d817916f4cac344b6985c867a85f65711a1486Paul Stewart  void OnDisconnectComplete(const Error& error);
9793d817916f4cac344b6985c867a85f65711a1486Paul Stewart  void OnEnableComplete(const EnabledStateChangedCallback& callback,
9893d817916f4cac344b6985c867a85f65711a1486Paul Stewart                        const Error& error);
9993d817916f4cac344b6985c867a85f65711a1486Paul Stewart  void OnDisableComplete(const EnabledStateChangedCallback& callback,
10093d817916f4cac344b6985c867a85f65711a1486Paul Stewart                         const Error& error);
101912f0de92ca103568821e20412b7dc2529494f98Darin Petkov
10293d817916f4cac344b6985c867a85f65711a1486Paul Stewart  void OnNetworksChanged(const RpcIdentifiers& networks);
1038ea0eaf6fb42aa7d959a131e43ea1d06635d6da2Darin Petkov  void OnStatusChanged(wimax_manager::DeviceStatus status);
1049893d9c59f596e621463c8e97bb3933f8fa7edf6Darin Petkov
105b96a4515c8cc4432a87c70cbae2865e1445eb86eDarin Petkov  void DropService(Service::ConnectState state);
1069893d9c59f596e621463c8e97bb3933f8fa7edf6Darin Petkov
1073a4100c44c9676f17829de5bcb23e883bd970ef7Darin Petkov  // Initializes a callback that will invoke OnConnectTimeout. The timeout will
1083a4100c44c9676f17829de5bcb23e883bd970ef7Darin Petkov  // not be restarted if it's already scheduled.
1093a4100c44c9676f17829de5bcb23e883bd970ef7Darin Petkov  void StartConnectTimeout();
1103a4100c44c9676f17829de5bcb23e883bd970ef7Darin Petkov  // Cancels the connect timeout callback, if any, previously scheduled through
1113a4100c44c9676f17829de5bcb23e883bd970ef7Darin Petkov  // StartConnectTimeout.
1123a4100c44c9676f17829de5bcb23e883bd970ef7Darin Petkov  void StopConnectTimeout();
1133a4100c44c9676f17829de5bcb23e883bd970ef7Darin Petkov  // Returns true if a connect timeout is scheduled, false otherwise.
1143a4100c44c9676f17829de5bcb23e883bd970ef7Darin Petkov  bool IsConnectTimeoutStarted() const;
1153a4100c44c9676f17829de5bcb23e883bd970ef7Darin Petkov  // Called if a connect timeout scheduled through StartConnectTimeout
1163a4100c44c9676f17829de5bcb23e883bd970ef7Darin Petkov  // fires. Marks the callback as stopped and invokes DropService.
1173a4100c44c9676f17829de5bcb23e883bd970ef7Darin Petkov  void OnConnectTimeout();
1183a4100c44c9676f17829de5bcb23e883bd970ef7Darin Petkov
119b72b62ec23d13c8e84a1499a04231b79d4bd74bbDarin Petkov  const RpcIdentifier path_;
120b72b62ec23d13c8e84a1499a04231b79d4bd74bbDarin Petkov
1213a4100c44c9676f17829de5bcb23e883bd970ef7Darin Petkov  base::WeakPtrFactory<WiMax> weak_ptr_factory_;
122247dcc12556bbfb7e50753befe217d29eb2f2f86Ben Chan  std::unique_ptr<WiMaxDeviceProxyInterface> proxy_;
1239893d9c59f596e621463c8e97bb3933f8fa7edf6Darin Petkov  bool scanning_;
1249893d9c59f596e621463c8e97bb3933f8fa7edf6Darin Petkov  WiMaxServiceRefPtr pending_service_;
125c63dcf0b428ea99e8a9a88bc964a51e65b6dddf0Darin Petkov  std::set<RpcIdentifier> networks_;
1263a4100c44c9676f17829de5bcb23e883bd970ef7Darin Petkov  wimax_manager::DeviceStatus status_;
127b72b62ec23d13c8e84a1499a04231b79d4bd74bbDarin Petkov
1283a4100c44c9676f17829de5bcb23e883bd970ef7Darin Petkov  base::CancelableClosure connect_timeout_callback_;
1293a4100c44c9676f17829de5bcb23e883bd970ef7Darin Petkov  int connect_timeout_seconds_;
1303a4100c44c9676f17829de5bcb23e883bd970ef7Darin Petkov
13199c8a4d2e6b81b1c395b2e1054111b29c20a5189Ben Chan  DISALLOW_COPY_AND_ASSIGN(WiMax);
13299c8a4d2e6b81b1c395b2e1054111b29c20a5189Ben Chan};
13399c8a4d2e6b81b1c395b2e1054111b29c20a5189Ben Chan
13499c8a4d2e6b81b1c395b2e1054111b29c20a5189Ben Chan}  // namespace shill
13599c8a4d2e6b81b1c395b2e1054111b29c20a5189Ben Chan
136c3d707d1ae4198d5538ff4deccd729a83f1bc805Ben Chan#endif  // SHILL_WIMAX_WIMAX_H_
137