forked from suyu/suyu
bcat: Remove use of global system accessors
Removes all uses of the global system accessor within the BCAT interface.
This commit is contained in:
parent
574440d59f
commit
cc1d7048b5
6 changed files with 55 additions and 29 deletions
|
@ -1140,8 +1140,9 @@ 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(
|
const auto backend = BCAT::CreateBackendFromSettings(system, [this](u64 tid) {
|
||||||
[this](u64 tid) { return system.GetFileSystemController().GetBCATDirectory(tid); });
|
return system.GetFileSystemController().GetBCATDirectory(tid);
|
||||||
|
});
|
||||||
const auto build_id_full = system.GetCurrentProcessBuildID();
|
const auto build_id_full = system.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));
|
||||||
|
|
|
@ -10,8 +10,8 @@
|
||||||
|
|
||||||
namespace Service::BCAT {
|
namespace Service::BCAT {
|
||||||
|
|
||||||
ProgressServiceBackend::ProgressServiceBackend(std::string_view event_name) {
|
ProgressServiceBackend::ProgressServiceBackend(Kernel::KernelCore& kernel,
|
||||||
auto& kernel{Core::System::GetInstance().Kernel()};
|
std::string_view event_name) {
|
||||||
event = Kernel::WritableEvent::CreateEventPair(
|
event = Kernel::WritableEvent::CreateEventPair(
|
||||||
kernel, Kernel::ResetType::Automatic,
|
kernel, Kernel::ResetType::Automatic,
|
||||||
std::string("ProgressServiceBackend:UpdateEvent:").append(event_name));
|
std::string("ProgressServiceBackend:UpdateEvent:").append(event_name));
|
||||||
|
|
|
@ -15,6 +15,14 @@
|
||||||
#include "core/hle/kernel/writable_event.h"
|
#include "core/hle/kernel/writable_event.h"
|
||||||
#include "core/hle/result.h"
|
#include "core/hle/result.h"
|
||||||
|
|
||||||
|
namespace Core {
|
||||||
|
class System;
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace Kernel {
|
||||||
|
class KernelCore;
|
||||||
|
}
|
||||||
|
|
||||||
namespace Service::BCAT {
|
namespace Service::BCAT {
|
||||||
|
|
||||||
struct DeliveryCacheProgressImpl;
|
struct DeliveryCacheProgressImpl;
|
||||||
|
@ -88,7 +96,7 @@ public:
|
||||||
void FinishDownload(ResultCode result);
|
void FinishDownload(ResultCode result);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
explicit ProgressServiceBackend(std::string_view event_name);
|
explicit ProgressServiceBackend(Kernel::KernelCore& kernel, std::string_view event_name);
|
||||||
|
|
||||||
Kernel::SharedPtr<Kernel::ReadableEvent> GetEvent() const;
|
Kernel::SharedPtr<Kernel::ReadableEvent> GetEvent() const;
|
||||||
DeliveryCacheProgressImpl& GetImpl();
|
DeliveryCacheProgressImpl& GetImpl();
|
||||||
|
@ -145,6 +153,6 @@ public:
|
||||||
std::optional<std::vector<u8>> GetLaunchParameter(TitleIDVersion title) override;
|
std::optional<std::vector<u8>> GetLaunchParameter(TitleIDVersion title) override;
|
||||||
};
|
};
|
||||||
|
|
||||||
std::unique_ptr<Backend> CreateBackendFromSettings(DirectoryGetter getter);
|
std::unique_ptr<Backend> CreateBackendFromSettings(Core::System& system, DirectoryGetter getter);
|
||||||
|
|
||||||
} // namespace Service::BCAT
|
} // namespace Service::BCAT
|
||||||
|
|
|
@ -104,14 +104,15 @@ std::string GetZIPFilePath(u64 title_id) {
|
||||||
|
|
||||||
// If the error is something the user should know about (build ID mismatch, bad client version),
|
// If the error is something the user should know about (build ID mismatch, bad client version),
|
||||||
// display an error.
|
// display an error.
|
||||||
void HandleDownloadDisplayResult(DownloadResult res) {
|
void HandleDownloadDisplayResult(const AM::Applets::AppletManager& applet_manager,
|
||||||
|
DownloadResult res) {
|
||||||
if (res == DownloadResult::Success || res == DownloadResult::NoResponse ||
|
if (res == DownloadResult::Success || res == DownloadResult::NoResponse ||
|
||||||
res == DownloadResult::GeneralWebError || res == DownloadResult::GeneralFSError ||
|
res == DownloadResult::GeneralWebError || res == DownloadResult::GeneralFSError ||
|
||||||
res == DownloadResult::NoMatchTitleId || res == DownloadResult::InvalidContentType) {
|
res == DownloadResult::NoMatchTitleId || res == DownloadResult::InvalidContentType) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const auto& frontend{Core::System::GetInstance().GetAppletManager().GetAppletFrontendSet()};
|
const auto& frontend{applet_manager.GetAppletFrontendSet()};
|
||||||
frontend.error->ShowCustomErrorText(
|
frontend.error->ShowCustomErrorText(
|
||||||
ResultCode(-1), "There was an error while attempting to use Boxcat.",
|
ResultCode(-1), "There was an error while attempting to use Boxcat.",
|
||||||
DOWNLOAD_RESULT_LOG_MESSAGES[static_cast<std::size_t>(res)], [] {});
|
DOWNLOAD_RESULT_LOG_MESSAGES[static_cast<std::size_t>(res)], [] {});
|
||||||
|
@ -264,12 +265,13 @@ private:
|
||||||
u64 build_id;
|
u64 build_id;
|
||||||
};
|
};
|
||||||
|
|
||||||
Boxcat::Boxcat(DirectoryGetter getter) : Backend(std::move(getter)) {}
|
Boxcat::Boxcat(AM::Applets::AppletManager& applet_manager_, DirectoryGetter getter)
|
||||||
|
: Backend(std::move(getter)), applet_manager{applet_manager_} {}
|
||||||
|
|
||||||
Boxcat::~Boxcat() = default;
|
Boxcat::~Boxcat() = default;
|
||||||
|
|
||||||
void SynchronizeInternal(DirectoryGetter dir_getter, TitleIDVersion title,
|
void SynchronizeInternal(AM::Applets::AppletManager& applet_manager, DirectoryGetter dir_getter,
|
||||||
ProgressServiceBackend& progress,
|
TitleIDVersion title, ProgressServiceBackend& progress,
|
||||||
std::optional<std::string> dir_name = {}) {
|
std::optional<std::string> dir_name = {}) {
|
||||||
progress.SetNeedHLELock(true);
|
progress.SetNeedHLELock(true);
|
||||||
|
|
||||||
|
@ -295,7 +297,7 @@ void SynchronizeInternal(DirectoryGetter dir_getter, TitleIDVersion title,
|
||||||
FileUtil::Delete(zip_path);
|
FileUtil::Delete(zip_path);
|
||||||
}
|
}
|
||||||
|
|
||||||
HandleDownloadDisplayResult(res);
|
HandleDownloadDisplayResult(applet_manager, res);
|
||||||
progress.FinishDownload(ERROR_GENERAL_BCAT_FAILURE);
|
progress.FinishDownload(ERROR_GENERAL_BCAT_FAILURE);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -364,17 +366,24 @@ 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] {
|
||||||
|
SynchronizeInternal(applet_manager, dir_getter, title, progress);
|
||||||
|
})
|
||||||
.detach();
|
.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(
|
|
||||||
[this, title, name, &progress] { SynchronizeInternal(dir_getter, title, progress, name); })
|
std::thread([this, title, name, &progress] {
|
||||||
|
SynchronizeInternal(applet_manager, dir_getter, title, progress, name);
|
||||||
|
})
|
||||||
.detach();
|
.detach();
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -420,7 +429,7 @@ std::optional<std::vector<u8>> Boxcat::GetLaunchParameter(TitleIDVersion title)
|
||||||
FileUtil::Delete(path);
|
FileUtil::Delete(path);
|
||||||
}
|
}
|
||||||
|
|
||||||
HandleDownloadDisplayResult(res);
|
HandleDownloadDisplayResult(applet_manager, res);
|
||||||
return std::nullopt;
|
return std::nullopt;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,6 +9,10 @@
|
||||||
#include <optional>
|
#include <optional>
|
||||||
#include "core/hle/service/bcat/backend/backend.h"
|
#include "core/hle/service/bcat/backend/backend.h"
|
||||||
|
|
||||||
|
namespace Service::AM::Applets {
|
||||||
|
class AppletManager;
|
||||||
|
}
|
||||||
|
|
||||||
namespace Service::BCAT {
|
namespace Service::BCAT {
|
||||||
|
|
||||||
struct EventStatus {
|
struct EventStatus {
|
||||||
|
@ -20,12 +24,13 @@ struct EventStatus {
|
||||||
/// Boxcat is yuzu's custom backend implementation of Nintendo's BCAT service. It is free to use and
|
/// Boxcat is yuzu's custom backend implementation of Nintendo's BCAT service. It is free to use and
|
||||||
/// doesn't require a switch or nintendo account. The content is controlled by the yuzu team.
|
/// doesn't require a switch or nintendo account. The content is controlled by the yuzu team.
|
||||||
class Boxcat final : public Backend {
|
class Boxcat final : public Backend {
|
||||||
friend void SynchronizeInternal(DirectoryGetter dir_getter, TitleIDVersion title,
|
friend void SynchronizeInternal(AM::Applets::AppletManager& applet_manager,
|
||||||
|
DirectoryGetter dir_getter, TitleIDVersion title,
|
||||||
ProgressServiceBackend& progress,
|
ProgressServiceBackend& progress,
|
||||||
std::optional<std::string> dir_name);
|
std::optional<std::string> dir_name);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit Boxcat(DirectoryGetter getter);
|
explicit Boxcat(AM::Applets::AppletManager& applet_manager_, DirectoryGetter getter);
|
||||||
~Boxcat() override;
|
~Boxcat() override;
|
||||||
|
|
||||||
bool Synchronize(TitleIDVersion title, ProgressServiceBackend& progress) override;
|
bool Synchronize(TitleIDVersion title, ProgressServiceBackend& progress) override;
|
||||||
|
@ -53,6 +58,7 @@ private:
|
||||||
|
|
||||||
class Client;
|
class Client;
|
||||||
std::unique_ptr<Client> client;
|
std::unique_ptr<Client> client;
|
||||||
|
AM::Applets::AppletManager& applet_manager;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace Service::BCAT
|
} // namespace Service::BCAT
|
||||||
|
|
|
@ -125,7 +125,11 @@ private:
|
||||||
class IBcatService final : public ServiceFramework<IBcatService> {
|
class IBcatService final : public ServiceFramework<IBcatService> {
|
||||||
public:
|
public:
|
||||||
explicit IBcatService(Core::System& system_, Backend& backend_)
|
explicit IBcatService(Core::System& system_, Backend& backend_)
|
||||||
: ServiceFramework("IBcatService"), system{system_}, backend{backend_} {
|
: ServiceFramework("IBcatService"), system{system_}, backend{backend_},
|
||||||
|
progress{{
|
||||||
|
ProgressServiceBackend{system_.Kernel(), "Normal"},
|
||||||
|
ProgressServiceBackend{system_.Kernel(), "Directory"},
|
||||||
|
}} {
|
||||||
// clang-format off
|
// clang-format off
|
||||||
static const FunctionInfo functions[] = {
|
static const FunctionInfo functions[] = {
|
||||||
{10100, &IBcatService::RequestSyncDeliveryCache, "RequestSyncDeliveryCache"},
|
{10100, &IBcatService::RequestSyncDeliveryCache, "RequestSyncDeliveryCache"},
|
||||||
|
@ -249,10 +253,7 @@ private:
|
||||||
Core::System& system;
|
Core::System& system;
|
||||||
Backend& backend;
|
Backend& backend;
|
||||||
|
|
||||||
std::array<ProgressServiceBackend, static_cast<std::size_t>(SyncType::Count)> progress{
|
std::array<ProgressServiceBackend, static_cast<std::size_t>(SyncType::Count)> progress;
|
||||||
ProgressServiceBackend{"Normal"},
|
|
||||||
ProgressServiceBackend{"Directory"},
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
|
|
||||||
void Module::Interface::CreateBcatService(Kernel::HLERequestContext& ctx) {
|
void Module::Interface::CreateBcatService(Kernel::HLERequestContext& ctx) {
|
||||||
|
@ -557,12 +558,12 @@ void Module::Interface::CreateDeliveryCacheStorageServiceWithApplicationId(
|
||||||
rb.PushIpcInterface<IDeliveryCacheStorageService>(fsc.GetBCATDirectory(title_id));
|
rb.PushIpcInterface<IDeliveryCacheStorageService>(fsc.GetBCATDirectory(title_id));
|
||||||
}
|
}
|
||||||
|
|
||||||
std::unique_ptr<Backend> CreateBackendFromSettings(DirectoryGetter getter) {
|
std::unique_ptr<Backend> CreateBackendFromSettings([[maybe_unused]] Core::System& system,
|
||||||
const auto backend = Settings::values.bcat_backend;
|
DirectoryGetter getter) {
|
||||||
|
|
||||||
#ifdef YUZU_ENABLE_BOXCAT
|
#ifdef YUZU_ENABLE_BOXCAT
|
||||||
if (backend == "boxcat")
|
if (Settings::values.bcat_backend == "boxcat") {
|
||||||
return std::make_unique<Boxcat>(std::move(getter));
|
return std::make_unique<Boxcat>(system.GetAppletManager(), std::move(getter));
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return std::make_unique<NullBackend>(std::move(getter));
|
return std::make_unique<NullBackend>(std::move(getter));
|
||||||
|
@ -571,7 +572,8 @@ std::unique_ptr<Backend> CreateBackendFromSettings(DirectoryGetter getter) {
|
||||||
Module::Interface::Interface(Core::System& system_, std::shared_ptr<Module> module_,
|
Module::Interface::Interface(Core::System& system_, std::shared_ptr<Module> module_,
|
||||||
FileSystem::FileSystemController& fsc_, const char* name)
|
FileSystem::FileSystemController& fsc_, const char* name)
|
||||||
: ServiceFramework(name), fsc{fsc_}, module{std::move(module_)},
|
: ServiceFramework(name), fsc{fsc_}, module{std::move(module_)},
|
||||||
backend{CreateBackendFromSettings([&fsc_](u64 tid) { return fsc_.GetBCATDirectory(tid); })},
|
backend{CreateBackendFromSettings(system_,
|
||||||
|
[&fsc_](u64 tid) { return fsc_.GetBCATDirectory(tid); })},
|
||||||
system{system_} {}
|
system{system_} {}
|
||||||
|
|
||||||
Module::Interface::~Interface() = default;
|
Module::Interface::~Interface() = default;
|
||||||
|
|
Loading…
Reference in a new issue