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_SERVICE_H_
18c3d707d1ae4198d5538ff4deccd729a83f1bc805Ben Chan#define SHILL_WIMAX_WIMAX_SERVICE_H_
1999c8a4d2e6b81b1c395b2e1054111b29c20a5189Ben Chan
20247dcc12556bbfb7e50753befe217d29eb2f2f86Ben Chan#include <memory>
218a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko#include <string>
228a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko
23e4b270274cba2a1976c7be6c733bd899e009c1d1Darin Petkov#include <gtest/gtest_prod.h>  // for FRIEND_TEST
24e4b270274cba2a1976c7be6c733bd899e009c1d1Darin Petkov
2599c8a4d2e6b81b1c395b2e1054111b29c20a5189Ben Chan#include "shill/refptr_types.h"
2699c8a4d2e6b81b1c395b2e1054111b29c20a5189Ben Chan#include "shill/service.h"
27c3d707d1ae4198d5538ff4deccd729a83f1bc805Ben Chan#include "shill/wimax/wimax_network_proxy_interface.h"
2899c8a4d2e6b81b1c395b2e1054111b29c20a5189Ben Chan
2999c8a4d2e6b81b1c395b2e1054111b29c20a5189Ben Channamespace shill {
3099c8a4d2e6b81b1c395b2e1054111b29c20a5189Ben Chan
3125665aa52da9f6e08a23fc462b09c2ae63a8a5f2Darin Petkovclass KeyValueStore;
329893d9c59f596e621463c8e97bb3933f8fa7edf6Darin Petkov
3399c8a4d2e6b81b1c395b2e1054111b29c20a5189Ben Chanclass WiMaxService : public Service {
3499c8a4d2e6b81b1c395b2e1054111b29c20a5189Ben Chan public:
35d1cd79736d7a9969c966a76a5906ea408bad3731Darin Petkov  static const char kStorageNetworkId[];
36d1cd79736d7a9969c966a76a5906ea408bad3731Darin Petkov
37d1cd79736d7a9969c966a76a5906ea408bad3731Darin Petkov  // TODO(petkov): Declare this in chromeos/dbus/service_constants.h.
38d1cd79736d7a9969c966a76a5906ea408bad3731Darin Petkov  static const char kNetworkIdProperty[];
39d1cd79736d7a9969c966a76a5906ea408bad3731Darin Petkov
4093d817916f4cac344b6985c867a85f65711a1486Paul Stewart  WiMaxService(ControlInterface* control,
4193d817916f4cac344b6985c867a85f65711a1486Paul Stewart               EventDispatcher* dispatcher,
4293d817916f4cac344b6985c867a85f65711a1486Paul Stewart               Metrics* metrics,
4393d817916f4cac344b6985c867a85f65711a1486Paul Stewart               Manager* manager);
445ea763b83299b5fad76a87183fb39a74c2d3c61dBen Chan  ~WiMaxService() override;
4599c8a4d2e6b81b1c395b2e1054111b29c20a5189Ben Chan
464e5c1310a1c70445a473653bd37d06604c5d5f47Ben Chan  // Returns the parameters to be passed to WiMaxManager.Device.Connect() when
474e5c1310a1c70445a473653bd37d06604c5d5f47Ben Chan  // connecting to the network associated with this service.
4893d817916f4cac344b6985c867a85f65711a1486Paul Stewart  void GetConnectParameters(KeyValueStore* parameters) const;
494e5c1310a1c70445a473653bd37d06604c5d5f47Ben Chan
501e52a1b85f387a5f81e01a6f9fc5196e073803caDarin Petkov  // Returns the RPC object path for the WiMaxManager.Network object associated
511e52a1b85f387a5f81e01a6f9fc5196e073803caDarin Petkov  // with this service. Must only be called after |proxy_| is set by Start().
52d1cd79736d7a9969c966a76a5906ea408bad3731Darin Petkov  virtual RpcIdentifier GetNetworkObjectPath() const;
53d1cd79736d7a9969c966a76a5906ea408bad3731Darin Petkov
54d1cd79736d7a9969c966a76a5906ea408bad3731Darin Petkov  // Starts the service by associating it with the RPC network object |proxy|
55d1cd79736d7a9969c966a76a5906ea408bad3731Darin Petkov  // and listening for its signal strength. Returns true on success, false
56d1cd79736d7a9969c966a76a5906ea408bad3731Darin Petkov  // otherwise. Takes ownership of proxy, regardless of the result of the
57d1cd79736d7a9969c966a76a5906ea408bad3731Darin Petkov  // operation. The proxy will be destroyed on failure.
5893d817916f4cac344b6985c867a85f65711a1486Paul Stewart  virtual bool Start(WiMaxNetworkProxyInterface* proxy);
594e5c1310a1c70445a473653bd37d06604c5d5f47Ben Chan
60d1cd79736d7a9969c966a76a5906ea408bad3731Darin Petkov  // Stops the service by disassociating it from |proxy_| and resetting its
61c63dcf0b428ea99e8a9a88bc964a51e65b6dddf0Darin Petkov  // signal strength to 0. If the service is connected, it notifies the carrier
62c63dcf0b428ea99e8a9a88bc964a51e65b6dddf0Darin Petkov  // device that the service is stopped.
63d1cd79736d7a9969c966a76a5906ea408bad3731Darin Petkov  virtual void Stop();
64d1cd79736d7a9969c966a76a5906ea408bad3731Darin Petkov
65d1cd79736d7a9969c966a76a5906ea408bad3731Darin Petkov  virtual bool IsStarted() const;
669893d9c59f596e621463c8e97bb3933f8fa7edf6Darin Petkov
6793d817916f4cac344b6985c867a85f65711a1486Paul Stewart  const std::string& network_name() const { return network_name_; }
6893d817916f4cac344b6985c867a85f65711a1486Paul Stewart  const WiMaxNetworkId& network_id() const { return network_id_; }
6993d817916f4cac344b6985c867a85f65711a1486Paul Stewart  void set_network_id(const WiMaxNetworkId& id) { network_id_ = id; }
70c1e5273c8c52bb3e5c20364d5c172d57417d3c4cDarin Petkov  bool is_default() const { return is_default_; }
71c1e5273c8c52bb3e5c20364d5c172d57417d3c4cDarin Petkov  void set_is_default(bool is_default) { is_default_ = is_default; }
72d1cd79736d7a9969c966a76a5906ea408bad3731Darin Petkov
737fab89734d88724a288e96a9996b15548c5294c7Ben Chan  static WiMaxNetworkId ConvertIdentifierToNetworkId(uint32_t identifier);
74d1cd79736d7a9969c966a76a5906ea408bad3731Darin Petkov
75d1cd79736d7a9969c966a76a5906ea408bad3731Darin Petkov  // Initializes the storage identifier. Note that the friendly service name and
76d1cd79736d7a9969c966a76a5906ea408bad3731Darin Petkov  // the |network_id_| must already be initialized.
77d1cd79736d7a9969c966a76a5906ea408bad3731Darin Petkov  void InitStorageIdentifier();
7893d817916f4cac344b6985c867a85f65711a1486Paul Stewart  static std::string CreateStorageIdentifier(const WiMaxNetworkId& id,
7993d817916f4cac344b6985c867a85f65711a1486Paul Stewart                                             const std::string& name);
809893d9c59f596e621463c8e97bb3933f8fa7edf6Darin Petkov
81a3f9f775e30f6fbb06f34f7ee9e20a68a1412c95Darin Petkov  virtual void ClearPassphrase();
82a3f9f775e30f6fbb06f34f7ee9e20a68a1412c95Darin Petkov
8399c8a4d2e6b81b1c395b2e1054111b29c20a5189Ben Chan  // Inherited from Service.
8493d817916f4cac344b6985c867a85f65711a1486Paul Stewart  void Connect(Error* error, const char* reason) override;
8593d817916f4cac344b6985c867a85f65711a1486Paul Stewart  void Disconnect(Error* error, const char* reason) override;
866acd966cabe0d75e0d9ae3f84c727c9b44a899b3Yunlian Jiang  std::string GetStorageIdentifier() const override;
876acd966cabe0d75e0d9ae3f84c727c9b44a899b3Yunlian Jiang  bool Is8021x() const override;
886acd966cabe0d75e0d9ae3f84c727c9b44a899b3Yunlian Jiang  bool IsVisible() const override;
896acd966cabe0d75e0d9ae3f84c727c9b44a899b3Yunlian Jiang  void OnEapCredentialsChanged(
906acd966cabe0d75e0d9ae3f84c727c9b44a899b3Yunlian Jiang      Service::UpdateCredentialsReason reason) override;
9193d817916f4cac344b6985c867a85f65711a1486Paul Stewart  bool Save(StoreInterface* storage) override;
926acd966cabe0d75e0d9ae3f84c727c9b44a899b3Yunlian Jiang  bool Unload() override;
936acd966cabe0d75e0d9ae3f84c727c9b44a899b3Yunlian Jiang  void SetState(ConnectState state) override;
94c63dcf0b428ea99e8a9a88bc964a51e65b6dddf0Darin Petkov
9599c8a4d2e6b81b1c395b2e1054111b29c20a5189Ben Chan private:
96c63dcf0b428ea99e8a9a88bc964a51e65b6dddf0Darin Petkov  friend class WiMaxServiceTest;
97a289f6682940ac49c7f7217bc5f5168eef06ff75Ben Chan  FRIEND_TEST(WiMaxServiceTest, Connect);
98a289f6682940ac49c7f7217bc5f5168eef06ff75Ben Chan  FRIEND_TEST(WiMaxServiceTest, Connectable);
99e4b270274cba2a1976c7be6c733bd899e009c1d1Darin Petkov  FRIEND_TEST(WiMaxServiceTest, GetDeviceRpcId);
1006b9b2e18088f22b79ea5d87f575b67632fb5770aDarin Petkov  FRIEND_TEST(WiMaxServiceTest, IsAutoConnectable);
1011e52a1b85f387a5f81e01a6f9fc5196e073803caDarin Petkov  FRIEND_TEST(WiMaxServiceTest, OnSignalStrengthChanged);
1028ea0eaf6fb42aa7d959a131e43ea1d06635d6da2Darin Petkov  FRIEND_TEST(WiMaxServiceTest, SetState);
103d1cd79736d7a9969c966a76a5906ea408bad3731Darin Petkov  FRIEND_TEST(WiMaxServiceTest, StartStop);
104e4b270274cba2a1976c7be6c733bd899e009c1d1Darin Petkov
1056b9b2e18088f22b79ea5d87f575b67632fb5770aDarin Petkov  // Inherited from Service.
10693d817916f4cac344b6985c867a85f65711a1486Paul Stewart  std::string GetDeviceRpcId(Error* error) const override;
10793d817916f4cac344b6985c867a85f65711a1486Paul Stewart  bool IsAutoConnectable(const char** reason) const override;
108c07362bebe25b1db1716c24ed340b46b309868e5Ben Chan
1091e52a1b85f387a5f81e01a6f9fc5196e073803caDarin Petkov  void OnSignalStrengthChanged(int strength);
1101e52a1b85f387a5f81e01a6f9fc5196e073803caDarin Petkov
1118021e7f581b1d040fa8ff0a09ee9444bdb58bc86Darin Petkov  void UpdateConnectable();
1128021e7f581b1d040fa8ff0a09ee9444bdb58bc86Darin Petkov
113cbfb34e699532f62eb5b381d0ea3a15d39e00b7cmukesh agrawal  // Update |device_|, and inform RPC listeners of the change.
114cbfb34e699532f62eb5b381d0ea3a15d39e00b7cmukesh agrawal  void SetDevice(WiMaxRefPtr new_device);
115cbfb34e699532f62eb5b381d0ea3a15d39e00b7cmukesh agrawal
116cbfb34e699532f62eb5b381d0ea3a15d39e00b7cmukesh agrawal  WiMaxRefPtr device_;  // Update via SetDevice().
117247dcc12556bbfb7e50753befe217d29eb2f2f86Ben Chan  std::unique_ptr<WiMaxNetworkProxyInterface> proxy_;
118e4b270274cba2a1976c7be6c733bd899e009c1d1Darin Petkov  std::string storage_id_;
11999c8a4d2e6b81b1c395b2e1054111b29c20a5189Ben Chan
120d1cd79736d7a9969c966a76a5906ea408bad3731Darin Petkov  WiMaxNetworkId network_id_;
1219893d9c59f596e621463c8e97bb3933f8fa7edf6Darin Petkov  std::string network_name_;
1224e5c1310a1c70445a473653bd37d06604c5d5f47Ben Chan  bool need_passphrase_;
123c1e5273c8c52bb3e5c20364d5c172d57417d3c4cDarin Petkov  bool is_default_;
1249893d9c59f596e621463c8e97bb3933f8fa7edf6Darin Petkov
12599c8a4d2e6b81b1c395b2e1054111b29c20a5189Ben Chan  DISALLOW_COPY_AND_ASSIGN(WiMaxService);
12699c8a4d2e6b81b1c395b2e1054111b29c20a5189Ben Chan};
12799c8a4d2e6b81b1c395b2e1054111b29c20a5189Ben Chan
12899c8a4d2e6b81b1c395b2e1054111b29c20a5189Ben Chan}  // namespace shill
12999c8a4d2e6b81b1c395b2e1054111b29c20a5189Ben Chan
130c3d707d1ae4198d5538ff4deccd729a83f1bc805Ben Chan#endif  // SHILL_WIMAX_WIMAX_SERVICE_H_
131