blob: 383b241c8f068dd1c35f6767353d8b213b438ed4 [file] [log] [blame]
// Copyright 2022 The Chromium 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 "components/services/app_service/public/cpp/permission.h"
namespace apps {
PermissionValue::PermissionValue(bool bool_value) : bool_value(bool_value) {}
PermissionValue::PermissionValue(TriState tristate_value)
: tristate_value(tristate_value) {}
PermissionValue::~PermissionValue() = default;
bool PermissionValue::operator==(const PermissionValue& other) const {
if (tristate_value.has_value() && other.tristate_value.has_value()) {
return tristate_value.value() == other.tristate_value.value();
}
if (bool_value.has_value() && other.bool_value.has_value()) {
return bool_value.value() == other.bool_value.value();
}
return false;
}
std::unique_ptr<PermissionValue> PermissionValue::Clone() const {
if (tristate_value.has_value()) {
return std::make_unique<PermissionValue>(tristate_value.value());
}
if (bool_value.has_value()) {
return std::make_unique<PermissionValue>(bool_value.value());
}
return nullptr;
}
bool PermissionValue::IsPermissionEnabled() {
if (tristate_value.has_value()) {
return tristate_value.value() == TriState::kAllow;
} else if (bool_value.has_value()) {
return bool_value.value();
}
return false;
}
Permission::Permission(PermissionType permission_type,
PermissionValuePtr value,
bool is_managed)
: permission_type(permission_type),
value(std::move(value)),
is_managed(is_managed) {}
Permission::~Permission() = default;
bool Permission::operator==(const Permission& other) const {
return permission_type == other.permission_type &&
((!value && !other.value) || (*value == *other.value)) &&
is_managed == other.is_managed;
}
bool Permission::operator!=(const Permission& other) const {
return !(*this == other);
}
PermissionPtr Permission::Clone() const {
if (!value) {
return nullptr;
}
return std::make_unique<Permission>(permission_type, value->Clone(),
is_managed);
}
Permissions ClonePermissions(const Permissions& source_permissions) {
Permissions permissions;
for (const auto& permission : source_permissions) {
permissions.push_back(permission->Clone());
}
return permissions;
}
bool IsEqual(const Permissions& source, const Permissions& target) {
if (source.size() != target.size()) {
return false;
}
for (int i = 0; i < static_cast<int>(source.size()); i++) {
if (*source[i] != *target[i]) {
return false;
}
}
return true;
}
PermissionType ConvertMojomPermissionTypeToPermissionType(
apps::mojom::PermissionType mojom_permission_type) {
switch (mojom_permission_type) {
case apps::mojom::PermissionType::kUnknown:
return PermissionType::kUnknown;
case apps::mojom::PermissionType::kCamera:
return PermissionType::kCamera;
case apps::mojom::PermissionType::kLocation:
return PermissionType::kLocation;
case apps::mojom::PermissionType::kMicrophone:
return PermissionType::kMicrophone;
case apps::mojom::PermissionType::kNotifications:
return PermissionType::kNotifications;
case apps::mojom::PermissionType::kContacts:
return PermissionType::kContacts;
case apps::mojom::PermissionType::kStorage:
return PermissionType::kStorage;
case apps::mojom::PermissionType::kPrinting:
return PermissionType::kPrinting;
}
}
apps::mojom::PermissionType ConvertPermissionTypeToMojomPermissionType(
PermissionType permission_type) {
switch (permission_type) {
case PermissionType::kUnknown:
return apps::mojom::PermissionType::kUnknown;
case PermissionType::kCamera:
return apps::mojom::PermissionType::kCamera;
case PermissionType::kLocation:
return apps::mojom::PermissionType::kLocation;
case PermissionType::kMicrophone:
return apps::mojom::PermissionType::kMicrophone;
case PermissionType::kNotifications:
return apps::mojom::PermissionType::kNotifications;
case PermissionType::kContacts:
return apps::mojom::PermissionType::kContacts;
case PermissionType::kStorage:
return apps::mojom::PermissionType::kStorage;
case PermissionType::kPrinting:
return apps::mojom::PermissionType::kPrinting;
}
}
TriState ConvertMojomTriStateToTriState(apps::mojom::TriState mojom_tri_state) {
switch (mojom_tri_state) {
case apps::mojom::TriState::kAllow:
return TriState::kAllow;
case apps::mojom::TriState::kBlock:
return TriState::kBlock;
case apps::mojom::TriState::kAsk:
return TriState::kAsk;
}
}
apps::mojom::TriState ConvertTriStateToMojomTriState(TriState tri_state) {
switch (tri_state) {
case TriState::kAllow:
return apps::mojom::TriState::kAllow;
case TriState::kBlock:
return apps::mojom::TriState::kBlock;
case TriState::kAsk:
return apps::mojom::TriState::kAsk;
}
}
PermissionValuePtr ConvertMojomPermissionValueToPermissionValue(
const apps::mojom::PermissionValuePtr& mojom_permission_value) {
if (!mojom_permission_value) {
return nullptr;
}
if (mojom_permission_value->is_tristate_value()) {
return std::make_unique<PermissionValue>(ConvertMojomTriStateToTriState(
mojom_permission_value->get_tristate_value()));
} else if (mojom_permission_value->is_bool_value()) {
return std::make_unique<PermissionValue>(
mojom_permission_value->get_bool_value());
}
return nullptr;
}
apps::mojom::PermissionValuePtr ConvertPermissionValueToMojomPermissionValue(
const PermissionValuePtr& permission_value) {
auto mojom_permission_value = apps::mojom::PermissionValue::New();
if (!permission_value) {
return mojom_permission_value;
}
if (permission_value->bool_value.has_value()) {
mojom_permission_value->set_bool_value(
permission_value->bool_value.value());
}
if (permission_value->tristate_value.has_value()) {
mojom_permission_value->set_tristate_value(ConvertTriStateToMojomTriState(
permission_value->tristate_value.value()));
}
return mojom_permission_value;
}
PermissionPtr ConvertMojomPermissionToPermission(
const apps::mojom::PermissionPtr& mojom_permission) {
if (!mojom_permission) {
return nullptr;
}
return std::make_unique<Permission>(
ConvertMojomPermissionTypeToPermissionType(
mojom_permission->permission_type),
ConvertMojomPermissionValueToPermissionValue(mojom_permission->value),
mojom_permission->is_managed);
}
apps::mojom::PermissionPtr ConvertPermissionToMojomPermission(
const PermissionPtr& permission) {
auto mojom_permission = apps::mojom::Permission::New();
if (!permission) {
return mojom_permission;
}
mojom_permission->permission_type =
ConvertPermissionTypeToMojomPermissionType(permission->permission_type);
mojom_permission->value =
ConvertPermissionValueToMojomPermissionValue(permission->value);
mojom_permission->is_managed = permission->is_managed;
return mojom_permission;
}
} // namespace apps