Home | History | Annotate | Download | only in test-rpc-proxy
      1 //
      2 // Copyright (C) 2015 The Android Open Source Project
      3 //
      4 // Licensed under the Apache License, Version 2.0 (the "License");
      5 // you may not use this file except in compliance with the License.
      6 // You may obtain a copy of the License at
      7 //
      8 //      http://www.apache.org/licenses/LICENSE-2.0
      9 //
     10 // Unless required by applicable law or agreed to in writing, software
     11 // distributed under the License is distributed on an "AS IS" BASIS,
     12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13 // See the License for the specific language governing permissions and
     14 // limitations under the License.
     15 //
     16 
     17 #ifndef PROXY_DBUS_CLIENT_H
     18 #define PROXY_DBUS_CLIENT_H
     19 
     20 #include <stdio.h>
     21 #include <stdlib.h>
     22 #include <sysexits.h>
     23 
     24 #include <iostream>
     25 #include <vector>
     26 #include <string>
     27 
     28 #include <base/cancelable_callback.h>
     29 #include <base/logging.h>
     30 #include <base/timer/timer.h>
     31 #include <brillo/any.h>
     32 #include <service_constants.h>
     33 #include <shill/dbus-proxies.h>
     34 
     35 using ManagerProxy = org::chromium::flimflam::ManagerProxy;
     36 using DeviceProxy = org::chromium::flimflam::DeviceProxy;
     37 using ServiceProxy = org::chromium::flimflam::ServiceProxy;
     38 using ProfileProxy = org::chromium::flimflam::ProfileProxy;
     39 
     40 typedef base::Callback<void(const std::string&,
     41                             const brillo::Any&)> DbusPropertyChangeCallback;
     42 
     43 class ProxyDbusClient {
     44  public:
     45   enum Technology {
     46     TECHNOLOGY_CELLULAR,
     47     TECHNOLOGY_ETHERNET,
     48     TECHNOLOGY_VPN,
     49     TECHNOLOGY_WIFI,
     50     TECHNOLOGY_WIMAX
     51   };
     52   static const char kCommonLogScopes[];
     53   static const char kDbusErrorObjectUnknown[];
     54   static const int kLogLevel;
     55 
     56   ProxyDbusClient(scoped_refptr<dbus::Bus> bus);
     57   void SetLogging(Technology tech);
     58   std::vector<std::unique_ptr<DeviceProxy>> GetDeviceProxies();
     59   std::vector<std::unique_ptr<ServiceProxy>> GetServiceProxies();
     60   std::vector<std::unique_ptr<ProfileProxy>> GetProfileProxies();
     61   std::unique_ptr<DeviceProxy> GetMatchingDeviceProxy(
     62       const brillo::VariantDictionary& expected_properties);
     63   std::unique_ptr<ServiceProxy> GetMatchingServiceProxy(
     64       const brillo::VariantDictionary& expected_properties);
     65   std::unique_ptr<ProfileProxy> GetMatchingProfileProxy(
     66       const brillo::VariantDictionary& expected_properties);
     67   bool GetPropertyValueFromDeviceProxy(DeviceProxy* proxy,
     68                                        const std::string& property_name,
     69                                        brillo::Any* property_value);
     70   bool GetPropertyValueFromServiceProxy(ServiceProxy* proxy,
     71                                         const std::string& property_name,
     72                                         brillo::Any* property_value);
     73   bool GetPropertyValueFromProfileProxy(ProfileProxy* proxy,
     74                                         const std::string& property_name,
     75                                         brillo::Any* property_value);
     76   // Optional outparams: |final_value| & |elapsed_time_seconds|. Pass nullptr
     77   // if not required.
     78   bool WaitForDeviceProxyPropertyValueIn(
     79       const dbus::ObjectPath& object_path,
     80       const std::string& property_name,
     81       const std::vector<brillo::Any>& expected_values,
     82       long timeout_milliseconds,
     83       brillo::Any* final_value,
     84       long* elapsed_time_milliseconds);
     85   bool WaitForServiceProxyPropertyValueIn(
     86       const dbus::ObjectPath& object_path,
     87       const std::string& property_name,
     88       const std::vector<brillo::Any>& expected_values,
     89       long timeout_milliseconds,
     90       brillo::Any* final_value,
     91       long* elapsed_time_milliseconds);
     92   bool WaitForProfileProxyPropertyValueIn(
     93       const dbus::ObjectPath& object_path,
     94       const std::string& property_name,
     95       const std::vector<brillo::Any>& expected_values,
     96       long timeout_milliseconds,
     97       brillo::Any* final_value,
     98       long* elapsed_time_milliseconds);
     99   std::unique_ptr<ServiceProxy> GetServiceProxy(
    100       const brillo::VariantDictionary& expected_properties);
    101   std::unique_ptr<ProfileProxy> GetActiveProfileProxy();
    102   // Optional outparam: |elapsed_time_seconds|. Pass nullptr
    103   // if not required.
    104   std::unique_ptr<ServiceProxy> WaitForMatchingServiceProxy(
    105       const brillo::VariantDictionary& service_properties,
    106       const std::string& service_type,
    107       long timeout_milliseconds,
    108       int rescan_interval_milliseconds,
    109       long* elapsed_time_milliseconds);
    110   bool ConfigureService(const brillo::VariantDictionary& config_params);
    111   bool ConfigureServiceByGuid(const std::string& guid,
    112                               const brillo::VariantDictionary& config_params);
    113   bool ConnectService(const dbus::ObjectPath& object_path,
    114                       long timeout_milliseconds);
    115   bool DisconnectService(const dbus::ObjectPath& object_path,
    116                          long timeout_milliseconds);
    117   bool CreateProfile(const std::string& profile_name);
    118   bool RemoveProfile(const std::string& profile_name);
    119   bool PushProfile(const std::string& profile_name);
    120   bool PopProfile(const std::string& profile_name);
    121   bool PopAnyProfile();
    122   bool RequestServiceScan(const std::string& service_type);
    123   bool GetServiceOrder(std::string* order);
    124   bool SetServiceOrder(const std::string& order);
    125   bool SetSchedScan(bool enable);
    126 
    127  private:
    128   bool GetPropertyValueFromManager(const std::string& property_name,
    129                                    brillo::Any* property_value);
    130   dbus::ObjectPath GetObjectPathForActiveProfile();
    131   bool SetLoggingInternal(int level, const std::string& tags);
    132   template<typename Proxy> std::unique_ptr<Proxy> GetProxyForObjectPath(
    133       const dbus::ObjectPath& object_path);
    134   template<typename Proxy> std::vector<std::unique_ptr<Proxy>> GetProxies(
    135       const std::string& object_paths_property_name);
    136   template<typename Proxy> std::unique_ptr<Proxy> GetMatchingProxy(
    137       const std::string& object_paths_property_name,
    138       const brillo::VariantDictionary& expected_properties);
    139   template<typename Proxy> bool WaitForProxyPropertyValueIn(
    140       const dbus::ObjectPath& object_path,
    141       const std::string& property_name,
    142       const std::vector<brillo::Any>& expected_values,
    143       long timeout_milliseconds,
    144       brillo::Any* final_value,
    145       long* elapsed_time_milliseconds);
    146   void IsMatchingServicePresent(
    147       const brillo::VariantDictionary& service_properties,
    148       base::Time wait_start_time,
    149       bool* is_success,
    150       std::unique_ptr<ServiceProxy>* service_proxy_out,
    151       long* elapsed_time_milliseconds);
    152   // This is invoked periodically to check if a service mathching the required
    153   // params are found.
    154   void FindServiceOrRestartScan(
    155     const brillo::VariantDictionary& service_properties,
    156     const std::string& service_type);
    157   void InitiateScanForService(
    158     base::TimeDelta rescan_interval,
    159     const std::string& service_type,
    160     const base::Closure& timer_callback);
    161   void RestartScanForService(
    162     const std::string& service_type);
    163 
    164   scoped_refptr<dbus::Bus> dbus_bus_;
    165   ManagerProxy shill_manager_proxy_;
    166   std::unique_ptr<base::Timer> wait_for_service_timer_;
    167   base::WeakPtrFactory<ProxyDbusClient> weak_ptr_factory_;
    168 };
    169 #endif //PROXY_DBUS_CLIENT_H
    170