// Copyright 2019 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROMEOS_ASH_COMPONENTS_SMBFS_SMBFS_HOST_H_
#define CHROMEOS_ASH_COMPONENTS_SMBFS_SMBFS_HOST_H_
#include <memory>
#include "base/component_export.h"
#include "base/files/file.h"
#include "base/files/file_path.h"
#include "base/functional/callback.h"
#include "base/memory/raw_ptr.h"
#include "chromeos/ash/components/disks/mount_point.h"
#include "chromeos/ash/components/smbfs/mojom/smbfs.mojom.h"
#include "mojo/public/cpp/bindings/pending_receiver.h"
#include "mojo/public/cpp/bindings/remote.h"
namespace smbfs {
// SmbFsHost is a connection to a running instance of smbfs. It exposes methods
// provided by smbfs over Mojo (eg. server-side copy), and provides access to
// the host from smbfs using the Delegate interface. Destroying SmbFsHost will
// unmount and clean up the smbfs instance.
class COMPONENT_EXPORT(CHROMEOS_ASH_COMPONENTS_SMBFS) SmbFsHost {
public:
class Delegate {
public:
virtual ~Delegate();
// Notification that the smbfs process is no longer connected via Mojo.
virtual void OnDisconnected() = 0;
using RequestCredentialsCallback =
base::OnceCallback<void(bool cancel,
const std::string& username,
const std::string& workgroup,
const std::string& password)>;
// Request credentials from the user. If the user dismisses the request, run
// |callback| with |cancel| = true. Otherwise, run |callback| with the
// credentials provided by the user and |cancel| = false.
virtual void RequestCredentials(RequestCredentialsCallback callback) = 0;
};
SmbFsHost(std::unique_ptr<ash::disks::MountPoint> mount_point,
Delegate* delegate,
mojo::Remote<mojom::SmbFs> smbfs_remote,
mojo::PendingReceiver<mojom::SmbFsDelegate> delegate_receiver);
SmbFsHost(const SmbFsHost&) = delete;
SmbFsHost& operator=(const SmbFsHost&) = delete;
~SmbFsHost();
// Returns the path where SmbFS is mounted.
const base::FilePath& mount_path() const {
return mount_point_->mount_path();
}
using UnmountCallback = base::OnceCallback<void(ash::MountError)>;
void Unmount(UnmountCallback callback);
// Request any credentials saved by smbfs are deleted.
using RemoveSavedCredentialsCallback = base::OnceCallback<void(bool)>;
void RemoveSavedCredentials(RemoveSavedCredentialsCallback callback);
// Recursively delete |path| by making a Mojo request to smbfs.
using DeleteRecursivelyCallback = base::OnceCallback<void(base::File::Error)>;
void DeleteRecursively(const base::FilePath& path,
DeleteRecursivelyCallback callback);
private:
// Mojo disconnection handler.
void OnDisconnect();
// Called after cros-disks has attempted to unmount the share.
void OnUnmountDone(SmbFsHost::UnmountCallback callback,
ash::MountError result);
// Callback for mojom::SmbFs::RemoveSavedCredentials().
void OnRemoveSavedCredentialsDone(RemoveSavedCredentialsCallback callback,
bool success);
// Called after smbfs completes a DeleteRecursively operation.
void OnDeleteRecursivelyDone(DeleteRecursivelyCallback callback,
smbfs::mojom::DeleteRecursivelyError error);
const std::unique_ptr<ash::disks::MountPoint> mount_point_;
const raw_ptr<Delegate> delegate_;
mojo::Remote<mojom::SmbFs> smbfs_;
std::unique_ptr<mojom::SmbFsDelegate> delegate_impl_;
};
} // namespace smbfs
#endif // CHROMEOS_ASH_COMPONENTS_SMBFS_SMBFS_HOST_H_