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