// Copyright 2024 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/ash/crosapi/one_drive_integration_service_ash.h"
#include "chrome/browser/ash/file_system_provider/provided_file_system_info.h"
#include "chrome/browser/profiles/profile_manager.h"
#include "chrome/browser/ui/webui/ash/cloud_upload/cloud_upload_util.h"
#include "chrome/common/extensions/extension_constants.h"
namespace crosapi {
OneDriveIntegrationServiceAsh::OneDriveIntegrationServiceAsh() = default;
OneDriveIntegrationServiceAsh::~OneDriveIntegrationServiceAsh() = default;
void OneDriveIntegrationServiceAsh::BindReceiver(
mojo::PendingReceiver<mojom::OneDriveIntegrationService> receiver) {
one_drive_service_set_.Add(this, std::move(receiver));
}
void OneDriveIntegrationServiceAsh::AddOneDriveMountObserver(
mojo::PendingRemote<mojom::OneDriveMountObserver> observer) {
auto* profile = ProfileManager::GetPrimaryUserProfile();
if (!profile) {
return;
}
mojo::Remote<mojom::OneDriveMountObserver> remote(std::move(observer));
remote->OnOneDriveMountPointPathChanged(
ash::cloud_upload::GetODFSFuseboxMount(profile));
observers_.Add(std::move(remote));
// Observe FSP.
if (file_system_provider_observation_.IsObserving()) {
return;
}
ash::file_system_provider::Service* service =
ash::file_system_provider::Service::Get(profile);
DCHECK(service);
file_system_provider_observation_.Observe(service);
}
void OneDriveIntegrationServiceAsh::OnProvidedFileSystemMount(
const ash::file_system_provider::ProvidedFileSystemInfo& file_system_info,
ash::file_system_provider::MountContext context,
base::File::Error error) {
const ash::file_system_provider::ProviderId odfs_provider_id =
ash::file_system_provider::ProviderId::CreateFromExtensionId(
extension_misc::kODFSExtensionId);
// Only observe successful mount events for ODFS.
if (file_system_info.provider_id() != odfs_provider_id ||
error != base::File::FILE_OK) {
return;
}
auto* profile = ProfileManager::GetPrimaryUserProfile();
if (!profile) {
return;
}
const auto fusebox_path = ash::cloud_upload::GetODFSFuseboxMount(profile);
if (fusebox_path.empty()) {
return;
}
for (auto& observer : observers_) {
observer->OnOneDriveMountPointPathChanged(fusebox_path);
}
}
void OneDriveIntegrationServiceAsh::OnProvidedFileSystemUnmount(
const ash::file_system_provider::ProvidedFileSystemInfo& file_system_info,
base::File::Error error) {
ash::file_system_provider::ProviderId odfs_provider_id =
ash::file_system_provider::ProviderId::CreateFromExtensionId(
extension_misc::kODFSExtensionId);
// Only observe successful unmount events for ODFS.
if (file_system_info.provider_id() != odfs_provider_id ||
error != base::File::FILE_OK) {
return;
}
for (auto& observer : observers_) {
observer->OnOneDriveMountPointPathChanged(base::FilePath());
}
}
void OneDriveIntegrationServiceAsh::OnShutDown() {
if (!file_system_provider_observation_.IsObserving()) {
return;
}
file_system_provider_observation_.Reset();
}
} // namespace crosapi