blob: 2fe33bc71770d33cf0520e9b2d2cf27706653295 [file] [log] [blame]
//
// Copyright (C) 2015 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
#ifndef PROXY_DBUS_CLIENT_H
#define PROXY_DBUS_CLIENT_H
#include <stdio.h>
#include <stdlib.h>
#include <sysexits.h>
#include <iostream>
#include <vector>
#include <string>
#include <base/cancelable_callback.h>
#include <base/logging.h>
#include <base/timer/timer.h>
#include <brillo/any.h>
#include <service_constants.h>
#include <shill/dbus-proxies.h>
using ManagerProxy = org::chromium::flimflam::ManagerProxy;
using DeviceProxy = org::chromium::flimflam::DeviceProxy;
using ServiceProxy = org::chromium::flimflam::ServiceProxy;
using ProfileProxy = org::chromium::flimflam::ProfileProxy;
typedef base::Callback<void(const std::string&,
const brillo::Any&)> DbusPropertyChangeCallback;
class ProxyDbusClient {
public:
enum Technology {
TECHNOLOGY_CELLULAR,
TECHNOLOGY_ETHERNET,
TECHNOLOGY_VPN,
TECHNOLOGY_WIFI,
TECHNOLOGY_WIMAX
};
static const char kCommonLogScopes[];
static const char kDbusErrorObjectUnknown[];
static const int kLogLevel;
ProxyDbusClient(scoped_refptr<dbus::Bus> bus);
void SetLogging(Technology tech);
std::vector<std::unique_ptr<DeviceProxy>> GetDeviceProxies();
std::vector<std::unique_ptr<ServiceProxy>> GetServiceProxies();
std::vector<std::unique_ptr<ProfileProxy>> GetProfileProxies();
std::unique_ptr<DeviceProxy> GetMatchingDeviceProxy(
const brillo::VariantDictionary& expected_properties);
std::unique_ptr<ServiceProxy> GetMatchingServiceProxy(
const brillo::VariantDictionary& expected_properties);
std::unique_ptr<ProfileProxy> GetMatchingProfileProxy(
const brillo::VariantDictionary& expected_properties);
bool GetPropertyValueFromDeviceProxy(DeviceProxy* proxy,
const std::string& property_name,
brillo::Any* property_value);
bool GetPropertyValueFromServiceProxy(ServiceProxy* proxy,
const std::string& property_name,
brillo::Any* property_value);
bool GetPropertyValueFromProfileProxy(ProfileProxy* proxy,
const std::string& property_name,
brillo::Any* property_value);
// Optional outparams: |final_value| & |elapsed_time_seconds|. Pass nullptr
// if not required.
bool WaitForDeviceProxyPropertyValueIn(
const dbus::ObjectPath& object_path,
const std::string& property_name,
const std::vector<brillo::Any>& expected_values,
long timeout_milliseconds,
brillo::Any* final_value,
long* elapsed_time_milliseconds);
bool WaitForServiceProxyPropertyValueIn(
const dbus::ObjectPath& object_path,
const std::string& property_name,
const std::vector<brillo::Any>& expected_values,
long timeout_milliseconds,
brillo::Any* final_value,
long* elapsed_time_milliseconds);
bool WaitForProfileProxyPropertyValueIn(
const dbus::ObjectPath& object_path,
const std::string& property_name,
const std::vector<brillo::Any>& expected_values,
long timeout_milliseconds,
brillo::Any* final_value,
long* elapsed_time_milliseconds);
std::unique_ptr<ServiceProxy> GetServiceProxy(
const brillo::VariantDictionary& expected_properties);
std::unique_ptr<ProfileProxy> GetActiveProfileProxy();
// Optional outparam: |elapsed_time_seconds|. Pass nullptr
// if not required.
std::unique_ptr<ServiceProxy> WaitForMatchingServiceProxy(
const brillo::VariantDictionary& service_properties,
const std::string& service_type,
long timeout_milliseconds,
int rescan_interval_milliseconds,
long* elapsed_time_milliseconds);
bool ConfigureService(const brillo::VariantDictionary& config_params);
bool ConfigureServiceByGuid(const std::string& guid,
const brillo::VariantDictionary& config_params);
bool ConnectService(const dbus::ObjectPath& object_path,
long timeout_milliseconds);
bool DisconnectService(const dbus::ObjectPath& object_path,
long timeout_milliseconds);
bool CreateProfile(const std::string& profile_name);
bool RemoveProfile(const std::string& profile_name);
bool PushProfile(const std::string& profile_name);
bool PopProfile(const std::string& profile_name);
bool PopAnyProfile();
bool RequestServiceScan(const std::string& service_type);
bool GetServiceOrder(std::string* order);
bool SetServiceOrder(const std::string& order);
bool SetSchedScan(bool enable);
private:
bool GetPropertyValueFromManager(const std::string& property_name,
brillo::Any* property_value);
dbus::ObjectPath GetObjectPathForActiveProfile();
bool SetLoggingInternal(int level, const std::string& tags);
template<typename Proxy> std::unique_ptr<Proxy> GetProxyForObjectPath(
const dbus::ObjectPath& object_path);
template<typename Proxy> std::vector<std::unique_ptr<Proxy>> GetProxies(
const std::string& object_paths_property_name);
template<typename Proxy> std::unique_ptr<Proxy> GetMatchingProxy(
const std::string& object_paths_property_name,
const brillo::VariantDictionary& expected_properties);
template<typename Proxy> bool WaitForProxyPropertyValueIn(
const dbus::ObjectPath& object_path,
const std::string& property_name,
const std::vector<brillo::Any>& expected_values,
long timeout_milliseconds,
brillo::Any* final_value,
long* elapsed_time_milliseconds);
void IsMatchingServicePresent(
const brillo::VariantDictionary& service_properties,
base::Time wait_start_time,
bool* is_success,
std::unique_ptr<ServiceProxy>* service_proxy_out,
long* elapsed_time_milliseconds);
// This is invoked periodically to check if a service mathching the required
// params are found.
void FindServiceOrRestartScan(
const brillo::VariantDictionary& service_properties,
const std::string& service_type);
void InitiateScanForService(
base::TimeDelta rescan_interval,
const std::string& service_type,
const base::Closure& timer_callback);
void RestartScanForService(
const std::string& service_type);
scoped_refptr<dbus::Bus> dbus_bus_;
ManagerProxy shill_manager_proxy_;
std::unique_ptr<base::Timer> wait_for_service_timer_;
base::WeakPtrFactory<ProxyDbusClient> weak_ptr_factory_;
};
#endif //PROXY_DBUS_CLIENT_H