156c269a533910c37123ed0b37c0f5e5ee3c47e26Roshan Pius//
256c269a533910c37123ed0b37c0f5e5ee3c47e26Roshan Pius// Copyright (C) 2015 The Android Open Source Project
356c269a533910c37123ed0b37c0f5e5ee3c47e26Roshan Pius//
456c269a533910c37123ed0b37c0f5e5ee3c47e26Roshan Pius// Licensed under the Apache License, Version 2.0 (the "License");
556c269a533910c37123ed0b37c0f5e5ee3c47e26Roshan Pius// you may not use this file except in compliance with the License.
656c269a533910c37123ed0b37c0f5e5ee3c47e26Roshan Pius// You may obtain a copy of the License at
756c269a533910c37123ed0b37c0f5e5ee3c47e26Roshan Pius//
856c269a533910c37123ed0b37c0f5e5ee3c47e26Roshan Pius//      http://www.apache.org/licenses/LICENSE-2.0
956c269a533910c37123ed0b37c0f5e5ee3c47e26Roshan Pius//
1056c269a533910c37123ed0b37c0f5e5ee3c47e26Roshan Pius// Unless required by applicable law or agreed to in writing, software
1156c269a533910c37123ed0b37c0f5e5ee3c47e26Roshan Pius// distributed under the License is distributed on an "AS IS" BASIS,
1256c269a533910c37123ed0b37c0f5e5ee3c47e26Roshan Pius// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1356c269a533910c37123ed0b37c0f5e5ee3c47e26Roshan Pius// See the License for the specific language governing permissions and
1456c269a533910c37123ed0b37c0f5e5ee3c47e26Roshan Pius// limitations under the License.
1556c269a533910c37123ed0b37c0f5e5ee3c47e26Roshan Pius//
1656c269a533910c37123ed0b37c0f5e5ee3c47e26Roshan Pius
1756c269a533910c37123ed0b37c0f5e5ee3c47e26Roshan Pius#ifndef PROXY_DBUS_CLIENT_H
1856c269a533910c37123ed0b37c0f5e5ee3c47e26Roshan Pius#define PROXY_DBUS_CLIENT_H
1956c269a533910c37123ed0b37c0f5e5ee3c47e26Roshan Pius
2056c269a533910c37123ed0b37c0f5e5ee3c47e26Roshan Pius#include <stdio.h>
2156c269a533910c37123ed0b37c0f5e5ee3c47e26Roshan Pius#include <stdlib.h>
2256c269a533910c37123ed0b37c0f5e5ee3c47e26Roshan Pius#include <sysexits.h>
2356c269a533910c37123ed0b37c0f5e5ee3c47e26Roshan Pius
2456c269a533910c37123ed0b37c0f5e5ee3c47e26Roshan Pius#include <iostream>
2502244d42e5f6a195a41984cf40346a1b07b4c9a0Roshan Pius#include <vector>
2656c269a533910c37123ed0b37c0f5e5ee3c47e26Roshan Pius#include <string>
2756c269a533910c37123ed0b37c0f5e5ee3c47e26Roshan Pius
2802244d42e5f6a195a41984cf40346a1b07b4c9a0Roshan Pius#include <base/cancelable_callback.h>
2956c269a533910c37123ed0b37c0f5e5ee3c47e26Roshan Pius#include <base/logging.h>
30ee39bfa925600a2153d5c5c68c503cb22ed7d3fcRoshan Pius#include <base/timer/timer.h>
3103e6719bae1e0903d94853b896673a033196bcf5Alex Vakulenko#include <brillo/any.h>
32ae0da94cb8a611a7c0b58b78778d2cf85ab918e9Roshan Pius#include <service_constants.h>
3356c269a533910c37123ed0b37c0f5e5ee3c47e26Roshan Pius#include <shill/dbus-proxies.h>
3456c269a533910c37123ed0b37c0f5e5ee3c47e26Roshan Pius
35fa07c8685b2647752cdbb637793e24893c92ab0bRoshan Piususing ManagerProxy = org::chromium::flimflam::ManagerProxy;
36fa07c8685b2647752cdbb637793e24893c92ab0bRoshan Piususing DeviceProxy = org::chromium::flimflam::DeviceProxy;
37fa07c8685b2647752cdbb637793e24893c92ab0bRoshan Piususing ServiceProxy = org::chromium::flimflam::ServiceProxy;
38fa07c8685b2647752cdbb637793e24893c92ab0bRoshan Piususing ProfileProxy = org::chromium::flimflam::ProfileProxy;
395c01b468e7dc6bfd74928bbd5e9726df374fd252Roshan Pius
4002244d42e5f6a195a41984cf40346a1b07b4c9a0Roshan Piustypedef base::Callback<void(const std::string&,
4102244d42e5f6a195a41984cf40346a1b07b4c9a0Roshan Pius                            const brillo::Any&)> DbusPropertyChangeCallback;
4202244d42e5f6a195a41984cf40346a1b07b4c9a0Roshan Pius
4356c269a533910c37123ed0b37c0f5e5ee3c47e26Roshan Piusclass ProxyDbusClient {
4456c269a533910c37123ed0b37c0f5e5ee3c47e26Roshan Pius public:
455c01b468e7dc6bfd74928bbd5e9726df374fd252Roshan Pius  enum Technology {
465c01b468e7dc6bfd74928bbd5e9726df374fd252Roshan Pius    TECHNOLOGY_CELLULAR,
475c01b468e7dc6bfd74928bbd5e9726df374fd252Roshan Pius    TECHNOLOGY_ETHERNET,
485c01b468e7dc6bfd74928bbd5e9726df374fd252Roshan Pius    TECHNOLOGY_VPN,
495c01b468e7dc6bfd74928bbd5e9726df374fd252Roshan Pius    TECHNOLOGY_WIFI,
505c01b468e7dc6bfd74928bbd5e9726df374fd252Roshan Pius    TECHNOLOGY_WIMAX
515c01b468e7dc6bfd74928bbd5e9726df374fd252Roshan Pius  };
525c01b468e7dc6bfd74928bbd5e9726df374fd252Roshan Pius  static const char kCommonLogScopes[];
53da0b0a7dee2dff8bbb7d79a09e4410644b6ac503Roshan Pius  static const char kDbusErrorObjectUnknown[];
545c01b468e7dc6bfd74928bbd5e9726df374fd252Roshan Pius  static const int kLogLevel;
555c01b468e7dc6bfd74928bbd5e9726df374fd252Roshan Pius
56fa07c8685b2647752cdbb637793e24893c92ab0bRoshan Pius  ProxyDbusClient(scoped_refptr<dbus::Bus> bus);
57fa07c8685b2647752cdbb637793e24893c92ab0bRoshan Pius  void SetLogging(Technology tech);
58fa07c8685b2647752cdbb637793e24893c92ab0bRoshan Pius  std::vector<std::unique_ptr<DeviceProxy>> GetDeviceProxies();
59fa07c8685b2647752cdbb637793e24893c92ab0bRoshan Pius  std::vector<std::unique_ptr<ServiceProxy>> GetServiceProxies();
60fa07c8685b2647752cdbb637793e24893c92ab0bRoshan Pius  std::vector<std::unique_ptr<ProfileProxy>> GetProfileProxies();
61fa07c8685b2647752cdbb637793e24893c92ab0bRoshan Pius  std::unique_ptr<DeviceProxy> GetMatchingDeviceProxy(
62ae0da94cb8a611a7c0b58b78778d2cf85ab918e9Roshan Pius      const brillo::VariantDictionary& expected_properties);
63fa07c8685b2647752cdbb637793e24893c92ab0bRoshan Pius  std::unique_ptr<ServiceProxy> GetMatchingServiceProxy(
64ae0da94cb8a611a7c0b58b78778d2cf85ab918e9Roshan Pius      const brillo::VariantDictionary& expected_properties);
65ae0da94cb8a611a7c0b58b78778d2cf85ab918e9Roshan Pius  std::unique_ptr<ProfileProxy> GetMatchingProfileProxy(
66ae0da94cb8a611a7c0b58b78778d2cf85ab918e9Roshan Pius      const brillo::VariantDictionary& expected_properties);
67ae0da94cb8a611a7c0b58b78778d2cf85ab918e9Roshan Pius  bool GetPropertyValueFromDeviceProxy(DeviceProxy* proxy,
68ae0da94cb8a611a7c0b58b78778d2cf85ab918e9Roshan Pius                                       const std::string& property_name,
69ae0da94cb8a611a7c0b58b78778d2cf85ab918e9Roshan Pius                                       brillo::Any* property_value);
70ae0da94cb8a611a7c0b58b78778d2cf85ab918e9Roshan Pius  bool GetPropertyValueFromServiceProxy(ServiceProxy* proxy,
71ae0da94cb8a611a7c0b58b78778d2cf85ab918e9Roshan Pius                                        const std::string& property_name,
72ae0da94cb8a611a7c0b58b78778d2cf85ab918e9Roshan Pius                                        brillo::Any* property_value);
73ae0da94cb8a611a7c0b58b78778d2cf85ab918e9Roshan Pius  bool GetPropertyValueFromProfileProxy(ProfileProxy* proxy,
74ae0da94cb8a611a7c0b58b78778d2cf85ab918e9Roshan Pius                                        const std::string& property_name,
75ae0da94cb8a611a7c0b58b78778d2cf85ab918e9Roshan Pius                                        brillo::Any* property_value);
7602244d42e5f6a195a41984cf40346a1b07b4c9a0Roshan Pius  // Optional outparams: |final_value| & |elapsed_time_seconds|. Pass nullptr
77ee39bfa925600a2153d5c5c68c503cb22ed7d3fcRoshan Pius  // if not required.
7802244d42e5f6a195a41984cf40346a1b07b4c9a0Roshan Pius  bool WaitForDeviceProxyPropertyValueIn(
7902244d42e5f6a195a41984cf40346a1b07b4c9a0Roshan Pius      const dbus::ObjectPath& object_path,
8002244d42e5f6a195a41984cf40346a1b07b4c9a0Roshan Pius      const std::string& property_name,
8102244d42e5f6a195a41984cf40346a1b07b4c9a0Roshan Pius      const std::vector<brillo::Any>& expected_values,
820ad14af1781762bfff5feccdbacd79911ce7da9cRoshan Pius      long timeout_milliseconds,
8302244d42e5f6a195a41984cf40346a1b07b4c9a0Roshan Pius      brillo::Any* final_value,
840ad14af1781762bfff5feccdbacd79911ce7da9cRoshan Pius      long* elapsed_time_milliseconds);
8502244d42e5f6a195a41984cf40346a1b07b4c9a0Roshan Pius  bool WaitForServiceProxyPropertyValueIn(
8602244d42e5f6a195a41984cf40346a1b07b4c9a0Roshan Pius      const dbus::ObjectPath& object_path,
8702244d42e5f6a195a41984cf40346a1b07b4c9a0Roshan Pius      const std::string& property_name,
8802244d42e5f6a195a41984cf40346a1b07b4c9a0Roshan Pius      const std::vector<brillo::Any>& expected_values,
890ad14af1781762bfff5feccdbacd79911ce7da9cRoshan Pius      long timeout_milliseconds,
9002244d42e5f6a195a41984cf40346a1b07b4c9a0Roshan Pius      brillo::Any* final_value,
910ad14af1781762bfff5feccdbacd79911ce7da9cRoshan Pius      long* elapsed_time_milliseconds);
9202244d42e5f6a195a41984cf40346a1b07b4c9a0Roshan Pius  bool WaitForProfileProxyPropertyValueIn(
9302244d42e5f6a195a41984cf40346a1b07b4c9a0Roshan Pius      const dbus::ObjectPath& object_path,
9402244d42e5f6a195a41984cf40346a1b07b4c9a0Roshan Pius      const std::string& property_name,
9502244d42e5f6a195a41984cf40346a1b07b4c9a0Roshan Pius      const std::vector<brillo::Any>& expected_values,
960ad14af1781762bfff5feccdbacd79911ce7da9cRoshan Pius      long timeout_milliseconds,
9702244d42e5f6a195a41984cf40346a1b07b4c9a0Roshan Pius      brillo::Any* final_value,
980ad14af1781762bfff5feccdbacd79911ce7da9cRoshan Pius      long* elapsed_time_milliseconds);
99ae0da94cb8a611a7c0b58b78778d2cf85ab918e9Roshan Pius  std::unique_ptr<ServiceProxy> GetServiceProxy(
100ae0da94cb8a611a7c0b58b78778d2cf85ab918e9Roshan Pius      const brillo::VariantDictionary& expected_properties);
101ae0da94cb8a611a7c0b58b78778d2cf85ab918e9Roshan Pius  std::unique_ptr<ProfileProxy> GetActiveProfileProxy();
102ee39bfa925600a2153d5c5c68c503cb22ed7d3fcRoshan Pius  // Optional outparam: |elapsed_time_seconds|. Pass nullptr
103ee39bfa925600a2153d5c5c68c503cb22ed7d3fcRoshan Pius  // if not required.
104ee39bfa925600a2153d5c5c68c503cb22ed7d3fcRoshan Pius  std::unique_ptr<ServiceProxy> WaitForMatchingServiceProxy(
105ee39bfa925600a2153d5c5c68c503cb22ed7d3fcRoshan Pius      const brillo::VariantDictionary& service_properties,
106ee39bfa925600a2153d5c5c68c503cb22ed7d3fcRoshan Pius      const std::string& service_type,
1070ad14af1781762bfff5feccdbacd79911ce7da9cRoshan Pius      long timeout_milliseconds,
108ee39bfa925600a2153d5c5c68c503cb22ed7d3fcRoshan Pius      int rescan_interval_milliseconds,
1090ad14af1781762bfff5feccdbacd79911ce7da9cRoshan Pius      long* elapsed_time_milliseconds);
1105a93aaa6f32c3dc5eb15594f5caf54c6cb34276cRoshan Pius  bool ConfigureService(const brillo::VariantDictionary& config_params);
1115a93aaa6f32c3dc5eb15594f5caf54c6cb34276cRoshan Pius  bool ConfigureServiceByGuid(const std::string& guid,
1125a93aaa6f32c3dc5eb15594f5caf54c6cb34276cRoshan Pius                              const brillo::VariantDictionary& config_params);
11302244d42e5f6a195a41984cf40346a1b07b4c9a0Roshan Pius  bool ConnectService(const dbus::ObjectPath& object_path,
1140ad14af1781762bfff5feccdbacd79911ce7da9cRoshan Pius                      long timeout_milliseconds);
11502244d42e5f6a195a41984cf40346a1b07b4c9a0Roshan Pius  bool DisconnectService(const dbus::ObjectPath& object_path,
1160ad14af1781762bfff5feccdbacd79911ce7da9cRoshan Pius                         long timeout_milliseconds);
117fa07c8685b2647752cdbb637793e24893c92ab0bRoshan Pius  bool CreateProfile(const std::string& profile_name);
118fa07c8685b2647752cdbb637793e24893c92ab0bRoshan Pius  bool RemoveProfile(const std::string& profile_name);
119fa07c8685b2647752cdbb637793e24893c92ab0bRoshan Pius  bool PushProfile(const std::string& profile_name);
120fa07c8685b2647752cdbb637793e24893c92ab0bRoshan Pius  bool PopProfile(const std::string& profile_name);
1215c01b468e7dc6bfd74928bbd5e9726df374fd252Roshan Pius  bool PopAnyProfile();
122ee39bfa925600a2153d5c5c68c503cb22ed7d3fcRoshan Pius  bool RequestServiceScan(const std::string& service_type);
1235a93aaa6f32c3dc5eb15594f5caf54c6cb34276cRoshan Pius  bool GetServiceOrder(std::string* order);
1245a93aaa6f32c3dc5eb15594f5caf54c6cb34276cRoshan Pius  bool SetServiceOrder(const std::string& order);
1255a93aaa6f32c3dc5eb15594f5caf54c6cb34276cRoshan Pius  bool SetSchedScan(bool enable);
12656c269a533910c37123ed0b37c0f5e5ee3c47e26Roshan Pius
12756c269a533910c37123ed0b37c0f5e5ee3c47e26Roshan Pius private:
128ae0da94cb8a611a7c0b58b78778d2cf85ab918e9Roshan Pius  bool GetPropertyValueFromManager(const std::string& property_name,
129ae0da94cb8a611a7c0b58b78778d2cf85ab918e9Roshan Pius                                   brillo::Any* property_value);
130ae0da94cb8a611a7c0b58b78778d2cf85ab918e9Roshan Pius  dbus::ObjectPath GetObjectPathForActiveProfile();
13102244d42e5f6a195a41984cf40346a1b07b4c9a0Roshan Pius  bool SetLoggingInternal(int level, const std::string& tags);
132ae0da94cb8a611a7c0b58b78778d2cf85ab918e9Roshan Pius  template<typename Proxy> std::unique_ptr<Proxy> GetProxyForObjectPath(
133ae0da94cb8a611a7c0b58b78778d2cf85ab918e9Roshan Pius      const dbus::ObjectPath& object_path);
134ae0da94cb8a611a7c0b58b78778d2cf85ab918e9Roshan Pius  template<typename Proxy> std::vector<std::unique_ptr<Proxy>> GetProxies(
135ae0da94cb8a611a7c0b58b78778d2cf85ab918e9Roshan Pius      const std::string& object_paths_property_name);
136ae0da94cb8a611a7c0b58b78778d2cf85ab918e9Roshan Pius  template<typename Proxy> std::unique_ptr<Proxy> GetMatchingProxy(
137ae0da94cb8a611a7c0b58b78778d2cf85ab918e9Roshan Pius      const std::string& object_paths_property_name,
138ae0da94cb8a611a7c0b58b78778d2cf85ab918e9Roshan Pius      const brillo::VariantDictionary& expected_properties);
13902244d42e5f6a195a41984cf40346a1b07b4c9a0Roshan Pius  template<typename Proxy> bool WaitForProxyPropertyValueIn(
14002244d42e5f6a195a41984cf40346a1b07b4c9a0Roshan Pius      const dbus::ObjectPath& object_path,
14102244d42e5f6a195a41984cf40346a1b07b4c9a0Roshan Pius      const std::string& property_name,
14202244d42e5f6a195a41984cf40346a1b07b4c9a0Roshan Pius      const std::vector<brillo::Any>& expected_values,
1430ad14af1781762bfff5feccdbacd79911ce7da9cRoshan Pius      long timeout_milliseconds,
14402244d42e5f6a195a41984cf40346a1b07b4c9a0Roshan Pius      brillo::Any* final_value,
1450ad14af1781762bfff5feccdbacd79911ce7da9cRoshan Pius      long* elapsed_time_milliseconds);
146ee39bfa925600a2153d5c5c68c503cb22ed7d3fcRoshan Pius  void IsMatchingServicePresent(
147ee39bfa925600a2153d5c5c68c503cb22ed7d3fcRoshan Pius      const brillo::VariantDictionary& service_properties,
1480ad14af1781762bfff5feccdbacd79911ce7da9cRoshan Pius      base::Time wait_start_time,
149ee39bfa925600a2153d5c5c68c503cb22ed7d3fcRoshan Pius      bool* is_success,
150ee39bfa925600a2153d5c5c68c503cb22ed7d3fcRoshan Pius      std::unique_ptr<ServiceProxy>* service_proxy_out,
1510ad14af1781762bfff5feccdbacd79911ce7da9cRoshan Pius      long* elapsed_time_milliseconds);
152ee39bfa925600a2153d5c5c68c503cb22ed7d3fcRoshan Pius  // This is invoked periodically to check if a service mathching the required
153ee39bfa925600a2153d5c5c68c503cb22ed7d3fcRoshan Pius  // params are found.
154ee39bfa925600a2153d5c5c68c503cb22ed7d3fcRoshan Pius  void FindServiceOrRestartScan(
155ee39bfa925600a2153d5c5c68c503cb22ed7d3fcRoshan Pius    const brillo::VariantDictionary& service_properties,
156ee39bfa925600a2153d5c5c68c503cb22ed7d3fcRoshan Pius    const std::string& service_type);
157ee39bfa925600a2153d5c5c68c503cb22ed7d3fcRoshan Pius  void InitiateScanForService(
158ee39bfa925600a2153d5c5c68c503cb22ed7d3fcRoshan Pius    base::TimeDelta rescan_interval,
159ee39bfa925600a2153d5c5c68c503cb22ed7d3fcRoshan Pius    const std::string& service_type,
160ee39bfa925600a2153d5c5c68c503cb22ed7d3fcRoshan Pius    const base::Closure& timer_callback);
161ee39bfa925600a2153d5c5c68c503cb22ed7d3fcRoshan Pius  void RestartScanForService(
162ee39bfa925600a2153d5c5c68c503cb22ed7d3fcRoshan Pius    const std::string& service_type);
16356c269a533910c37123ed0b37c0f5e5ee3c47e26Roshan Pius
164fa07c8685b2647752cdbb637793e24893c92ab0bRoshan Pius  scoped_refptr<dbus::Bus> dbus_bus_;
16502244d42e5f6a195a41984cf40346a1b07b4c9a0Roshan Pius  ManagerProxy shill_manager_proxy_;
166ee39bfa925600a2153d5c5c68c503cb22ed7d3fcRoshan Pius  std::unique_ptr<base::Timer> wait_for_service_timer_;
167ee39bfa925600a2153d5c5c68c503cb22ed7d3fcRoshan Pius  base::WeakPtrFactory<ProxyDbusClient> weak_ptr_factory_;
16856c269a533910c37123ed0b37c0f5e5ee3c47e26Roshan Pius};
16956c269a533910c37123ed0b37c0f5e5ee3c47e26Roshan Pius#endif //PROXY_DBUS_CLIENT_H
170