blob: aff606d8db05be05de7768ffc58849094d11115a [file] [log] [blame]
// Copyright 2019 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 "login_manager/chrome_features_service_client.h"
#include <utility>
#include <base/bind.h>
#include <chromeos/dbus/service_constants.h>
#include <dbus/message.h>
#include <dbus/object_proxy.h>
namespace login_manager {
ChromeFeaturesServiceClient::ChromeFeaturesServiceClient(
dbus::ObjectProxy* proxy)
: proxy_(proxy) {}
ChromeFeaturesServiceClient::~ChromeFeaturesServiceClient() = default;
void ChromeFeaturesServiceClient::IsFeatureEnabled(
const std::string& feature_name, IsFeatureEnabledCallback callback) {
proxy_->WaitForServiceToBeAvailable(base::BindOnce(
&ChromeFeaturesServiceClient::OnWaitForServiceForIsFeatureEnabled,
weak_ptr_factory_.GetWeakPtr(), feature_name, std::move(callback)));
}
void ChromeFeaturesServiceClient::OnWaitForServiceForIsFeatureEnabled(
const std::string& feature_name,
IsFeatureEnabledCallback callback,
bool available) {
if (!available) {
std::move(callback).Run(base::nullopt);
return;
}
CallIsFeatureEnabled(feature_name, std::move(callback));
}
void ChromeFeaturesServiceClient::CallIsFeatureEnabled(
const std::string& feature_name, IsFeatureEnabledCallback callback) {
dbus::MethodCall call(chromeos::kChromeFeaturesServiceInterface,
chromeos::kChromeFeaturesServiceIsFeatureEnabledMethod);
dbus::MessageWriter writer(&call);
writer.AppendString(feature_name);
proxy_->CallMethod(
&call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT,
base::BindOnce(
&ChromeFeaturesServiceClient::HandlelIsFeatureEnabledResponse,
weak_ptr_factory_.GetWeakPtr(), std::move(callback)));
}
void ChromeFeaturesServiceClient::HandlelIsFeatureEnabledResponse(
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 login_manager