bcat: Add FSC accessors for BCAT data

Ports BCAT to use FSC interface
This commit is contained in:
Zach Hilman 2019-10-01 09:13:09 -04:00
parent bcf1eafb8b
commit 19c466dfb1
10 changed files with 51 additions and 31 deletions

View File

@ -1140,7 +1140,8 @@ void IApplicationFunctions::PopLaunchParameter(Kernel::HLERequestContext& ctx) {
LOG_DEBUG(Service_AM, "called, kind={:08X}", static_cast<u8>(kind)); LOG_DEBUG(Service_AM, "called, kind={:08X}", static_cast<u8>(kind));
if (kind == LaunchParameterKind::ApplicationSpecific && !launch_popped_application_specific) { if (kind == LaunchParameterKind::ApplicationSpecific && !launch_popped_application_specific) {
const auto backend = BCAT::CreateBackendFromSettings(&FileSystem::GetBCATDirectory); const auto backend = BCAT::CreateBackendFromSettings(
[this](u64 tid) { return system.GetFileSystemController().GetBCATDirectory(tid); });
const auto build_id_full = Core::System::GetInstance().GetCurrentProcessBuildID(); const auto build_id_full = Core::System::GetInstance().GetCurrentProcessBuildID();
u64 build_id{}; u64 build_id{};
std::memcpy(&build_id, build_id_full.data(), sizeof(u64)); std::memcpy(&build_id, build_id_full.data(), sizeof(u64));

View File

@ -57,11 +57,6 @@ static_assert(sizeof(DeliveryCacheProgressImpl) == 0x200,
class ProgressServiceBackend { class ProgressServiceBackend {
friend class IBcatService; friend class IBcatService;
ProgressServiceBackend(std::string event_name);
Kernel::SharedPtr<Kernel::ReadableEvent> GetEvent();
DeliveryCacheProgressImpl& GetImpl();
public: public:
// Clients should call this with true if any of the functions are going to be called from a // Clients should call this with true if any of the functions are going to be called from a
// non-HLE thread and this class need to lock the hle mutex. (default is false) // non-HLE thread and this class need to lock the hle mutex. (default is false)
@ -90,6 +85,11 @@ public:
void FinishDownload(ResultCode result); void FinishDownload(ResultCode result);
private: private:
explicit ProgressServiceBackend(std::string event_name);
Kernel::SharedPtr<Kernel::ReadableEvent> GetEvent();
DeliveryCacheProgressImpl& GetImpl();
void SignalUpdate() const; void SignalUpdate() const;
DeliveryCacheProgressImpl impl; DeliveryCacheProgressImpl impl;

View File

@ -364,17 +364,18 @@ void SynchronizeInternal(DirectoryGetter dir_getter, TitleIDVersion title,
bool Boxcat::Synchronize(TitleIDVersion title, ProgressServiceBackend& progress) { bool Boxcat::Synchronize(TitleIDVersion title, ProgressServiceBackend& progress) {
is_syncing.exchange(true); is_syncing.exchange(true);
std::thread([this, title, &progress] { SynchronizeInternal(dir_getter, title, progress); }) std::thread([this, title, &progress] {
.detach(); SynchronizeInternal(dir_getter, title, progress);
}).detach();
return true; return true;
} }
bool Boxcat::SynchronizeDirectory(TitleIDVersion title, std::string name, bool Boxcat::SynchronizeDirectory(TitleIDVersion title, std::string name,
ProgressServiceBackend& progress) { ProgressServiceBackend& progress) {
is_syncing.exchange(true); is_syncing.exchange(true);
std::thread( std::thread([this, title, name, &progress] {
[this, title, name, &progress] { SynchronizeInternal(dir_getter, title, progress, name); }) SynchronizeInternal(dir_getter, title, progress, name);
.detach(); }).detach();
return true; return true;
} }

View File

@ -6,8 +6,8 @@
namespace Service::BCAT { namespace Service::BCAT {
BCAT::BCAT(std::shared_ptr<Module> module, const char* name) BCAT::BCAT(std::shared_ptr<Module> module, FileSystem::FileSystemController& fsc, const char* name)
: Module::Interface(std::move(module), name) { : Module::Interface(std::move(module), fsc, name) {
// clang-format off // clang-format off
static const FunctionInfo functions[] = { static const FunctionInfo functions[] = {
{0, &BCAT::CreateBcatService, "CreateBcatService"}, {0, &BCAT::CreateBcatService, "CreateBcatService"},

View File

@ -10,7 +10,8 @@ namespace Service::BCAT {
class BCAT final : public Module::Interface { class BCAT final : public Module::Interface {
public: public:
explicit BCAT(std::shared_ptr<Module> module, const char* name); explicit BCAT(std::shared_ptr<Module> module, FileSystem::FileSystemController& fsc,
const char* name);
~BCAT() override; ~BCAT() override;
}; };

View File

@ -539,7 +539,7 @@ void Module::Interface::CreateDeliveryCacheStorageService(Kernel::HLERequestCont
IPC::ResponseBuilder rb{ctx, 2, 0, 1}; IPC::ResponseBuilder rb{ctx, 2, 0, 1};
rb.Push(RESULT_SUCCESS); rb.Push(RESULT_SUCCESS);
rb.PushIpcInterface<IDeliveryCacheStorageService>( rb.PushIpcInterface<IDeliveryCacheStorageService>(
Service::FileSystem::GetBCATDirectory(Core::CurrentProcess()->GetTitleID())); fsc.GetBCATDirectory(Core::CurrentProcess()->GetTitleID()));
} }
void Module::Interface::CreateDeliveryCacheStorageServiceWithApplicationId( void Module::Interface::CreateDeliveryCacheStorageServiceWithApplicationId(
@ -551,8 +551,7 @@ void Module::Interface::CreateDeliveryCacheStorageServiceWithApplicationId(
IPC::ResponseBuilder rb{ctx, 2, 0, 1}; IPC::ResponseBuilder rb{ctx, 2, 0, 1};
rb.Push(RESULT_SUCCESS); rb.Push(RESULT_SUCCESS);
rb.PushIpcInterface<IDeliveryCacheStorageService>( rb.PushIpcInterface<IDeliveryCacheStorageService>(fsc.GetBCATDirectory(title_id));
Service::FileSystem::GetBCATDirectory(title_id));
} }
std::unique_ptr<Backend> CreateBackendFromSettings(DirectoryGetter getter) { std::unique_ptr<Backend> CreateBackendFromSettings(DirectoryGetter getter) {
@ -566,18 +565,23 @@ std::unique_ptr<Backend> CreateBackendFromSettings(DirectoryGetter getter) {
return std::make_unique<NullBackend>(std::move(getter)); return std::make_unique<NullBackend>(std::move(getter));
} }
Module::Interface::Interface(std::shared_ptr<Module> module, const char* name) Module::Interface::Interface(std::shared_ptr<Module> module, FileSystem::FileSystemController& fsc,
: ServiceFramework(name), module(std::move(module)), const char* name)
backend(CreateBackendFromSettings(&Service::FileSystem::GetBCATDirectory)) {} : ServiceFramework(name), module(std::move(module)), fsc(fsc),
backend(CreateBackendFromSettings([&fsc](u64 tid) { return fsc.GetBCATDirectory(tid); })) {}
Module::Interface::~Interface() = default; Module::Interface::~Interface() = default;
void InstallInterfaces(SM::ServiceManager& service_manager) { void InstallInterfaces(Core::System& system) {
auto module = std::make_shared<Module>(); auto module = std::make_shared<Module>();
std::make_shared<BCAT>(module, "bcat:a")->InstallAsService(service_manager); std::make_shared<BCAT>(module, system.GetFileSystemController(), "bcat:a")
std::make_shared<BCAT>(module, "bcat:m")->InstallAsService(service_manager); ->InstallAsService(system.ServiceManager());
std::make_shared<BCAT>(module, "bcat:u")->InstallAsService(service_manager); std::make_shared<BCAT>(module, system.GetFileSystemController(), "bcat:m")
std::make_shared<BCAT>(module, "bcat:s")->InstallAsService(service_manager); ->InstallAsService(system.ServiceManager());
std::make_shared<BCAT>(module, system.GetFileSystemController(), "bcat:u")
->InstallAsService(system.ServiceManager());
std::make_shared<BCAT>(module, system.GetFileSystemController(), "bcat:s")
->InstallAsService(system.ServiceManager());
} }
} // namespace Service::BCAT } // namespace Service::BCAT

View File

@ -6,7 +6,13 @@
#include "core/hle/service/service.h" #include "core/hle/service/service.h"
namespace Service::BCAT { namespace Service {
namespace FileSystem {
class FileSystemController;
} // namespace FileSystem
namespace BCAT {
class Backend; class Backend;
@ -14,7 +20,8 @@ class Module final {
public: public:
class Interface : public ServiceFramework<Interface> { class Interface : public ServiceFramework<Interface> {
public: public:
explicit Interface(std::shared_ptr<Module> module, const char* name); explicit Interface(std::shared_ptr<Module> module, FileSystem::FileSystemController& fsc,
const char* name);
~Interface() override; ~Interface() override;
void CreateBcatService(Kernel::HLERequestContext& ctx); void CreateBcatService(Kernel::HLERequestContext& ctx);
@ -22,12 +29,16 @@ public:
void CreateDeliveryCacheStorageServiceWithApplicationId(Kernel::HLERequestContext& ctx); void CreateDeliveryCacheStorageServiceWithApplicationId(Kernel::HLERequestContext& ctx);
protected: protected:
FileSystem::FileSystemController& fsc;
std::shared_ptr<Module> module; std::shared_ptr<Module> module;
std::unique_ptr<Backend> backend; std::unique_ptr<Backend> backend;
}; };
}; };
/// Registers all BCAT services with the specified service manager. /// Registers all BCAT services with the specified service manager.
void InstallInterfaces(SM::ServiceManager& service_manager); void InstallInterfaces(Core::System& system);
} // namespace Service::BCAT } // namespace BCAT
} // namespace Service

View File

@ -674,7 +674,7 @@ FileSys::VirtualDir FileSystemController::GetModificationDumpRoot(u64 title_id)
return bis_factory->GetModificationDumpRoot(title_id); return bis_factory->GetModificationDumpRoot(title_id);
} }
FileSys::VirtualDir GetBCATDirectory(u64 title_id) { FileSys::VirtualDir FileSystemController::GetBCATDirectory(u64 title_id) const {
LOG_TRACE(Service_FS, "Opening BCAT root for tid={:016X}", title_id); LOG_TRACE(Service_FS, "Opening BCAT root for tid={:016X}", title_id);
if (bis_factory == nullptr) if (bis_factory == nullptr)

View File

@ -110,6 +110,8 @@ public:
FileSys::VirtualDir GetModificationLoadRoot(u64 title_id) const; FileSys::VirtualDir GetModificationLoadRoot(u64 title_id) const;
FileSys::VirtualDir GetModificationDumpRoot(u64 title_id) const; FileSys::VirtualDir GetModificationDumpRoot(u64 title_id) const;
FileSys::VirtualDir GetBCATDirectory(u64 title_id) const;
// Creates the SaveData, SDMC, and BIS Factories. Should be called once and before any function // Creates the SaveData, SDMC, and BIS Factories. Should be called once and before any function
// above is called. // above is called.
void CreateFactories(FileSys::VfsFilesystem& vfs, bool overwrite = true); void CreateFactories(FileSys::VfsFilesystem& vfs, bool overwrite = true);

View File

@ -208,7 +208,7 @@ void Init(std::shared_ptr<SM::ServiceManager>& sm, Core::System& system) {
AOC::InstallInterfaces(*sm, system); AOC::InstallInterfaces(*sm, system);
APM::InstallInterfaces(system); APM::InstallInterfaces(system);
Audio::InstallInterfaces(*sm, system); Audio::InstallInterfaces(*sm, system);
BCAT::InstallInterfaces(*sm); BCAT::InstallInterfaces(system);
BPC::InstallInterfaces(*sm); BPC::InstallInterfaces(*sm);
BtDrv::InstallInterfaces(*sm, system); BtDrv::InstallInterfaces(*sm, system);
BTM::InstallInterfaces(*sm, system); BTM::InstallInterfaces(*sm, system);