blob: 056e8e982b80530e5256700dd9cb11ab46dc44c4 [file] [log] [blame]
// Copyright 2021 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "dns-proxy/chrome_features_service_client.h"
#include <utility>
#include <base/bind.h>
#include <base/logging.h>
#include <chromeos/dbus/service_constants.h>
#include <dbus/message.h>
namespace dns_proxy {
std::unique_ptr<ChromeFeaturesServiceClient> ChromeFeaturesServiceClient::New(
scoped_refptr<dbus::Bus> bus) {
auto* proxy = bus->GetObjectProxy(
chromeos::kChromeFeaturesServiceName,
dbus::ObjectPath(chromeos::kChromeFeaturesServicePath));
if (!proxy) {
LOG(ERROR) << "Failed to create object proxy for "
<< chromeos::kChromeFeaturesServiceName;
return nullptr;
}
return std::make_unique<ChromeFeaturesServiceClient>(proxy);
}
ChromeFeaturesServiceClient::ChromeFeaturesServiceClient(
dbus::ObjectProxy* proxy)
: proxy_(proxy) {}
void ChromeFeaturesServiceClient::IsDNSProxyEnabled(
IsFeatureEnabledCallback callback) {
if (!proxy_) {
LOG(DFATAL) << "No object proxy";
return;
}
proxy_->WaitForServiceToBeAvailable(base::BindOnce(
&ChromeFeaturesServiceClient::OnWaitForServiceAndCallMethod,
weak_ptr_factory_.GetWeakPtr(),
chromeos::kChromeFeaturesServiceIsDNSProxyEnabledMethod,
std::move(callback)));
}
void ChromeFeaturesServiceClient::OnWaitForServiceAndCallMethod(
const std::string& method_name,
IsFeatureEnabledCallback callback,
bool available) {
if (!available) {
std::move(callback).Run(base::nullopt);
return;
}
dbus::MethodCall call(chromeos::kChromeFeaturesServiceInterface, method_name);
dbus::MessageWriter writer(&call);
proxy_->CallMethod(
&call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT,
base::BindOnce(&ChromeFeaturesServiceClient::HandleCallResponse,
weak_ptr_factory_.GetWeakPtr(), std::move(callback)));
}
void ChromeFeaturesServiceClient::HandleCallResponse(
IsFeatureEnabledCallback callback, dbus::Response* response) {
if (!response) {
std::move(callback).Run(base::nullopt);
return;
}
dbus::MessageReader reader(response);
bool feature_enabled = false;
if (!reader.PopBool(&feature_enabled)) {
std::move(callback).Run(base::nullopt);
return;
}
std::move(callback).Run(feature_enabled);
}
} // namespace dns_proxy