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