am: rework IStorage for transfer storage
parent
182137a9a4
commit
b1c2f791af
@ -1,60 +1,59 @@
|
|||||||
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
|
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
|
||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
|
#include "core/hle/service/am/am_results.h"
|
||||||
|
#include "core/hle/service/am/library_applet_storage.h"
|
||||||
#include "core/hle/service/am/storage.h"
|
#include "core/hle/service/am/storage.h"
|
||||||
#include "core/hle/service/am/storage_accessor.h"
|
#include "core/hle/service/am/storage_accessor.h"
|
||||||
#include "core/hle/service/ipc_helpers.h"
|
#include "core/hle/service/ipc_helpers.h"
|
||||||
|
|
||||||
namespace Service::AM {
|
namespace Service::AM {
|
||||||
|
|
||||||
IStorageImpl::~IStorageImpl() = default;
|
IStorage::IStorage(Core::System& system_, std::shared_ptr<LibraryAppletStorage> impl_)
|
||||||
|
: ServiceFramework{system_, "IStorage"}, impl{std::move(impl_)} {
|
||||||
class StorageDataImpl final : public IStorageImpl {
|
static const FunctionInfo functions[] = {
|
||||||
public:
|
{0, &IStorage::Open, "Open"},
|
||||||
explicit StorageDataImpl(std::vector<u8>&& buffer_) : buffer{std::move(buffer_)} {}
|
{1, &IStorage::OpenTransferStorage, "OpenTransferStorage"},
|
||||||
|
};
|
||||||
std::vector<u8>& GetData() override {
|
|
||||||
return buffer;
|
|
||||||
}
|
|
||||||
|
|
||||||
const std::vector<u8>& GetData() const override {
|
|
||||||
return buffer;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::size_t GetSize() const override {
|
|
||||||
return buffer.size();
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
std::vector<u8> buffer;
|
|
||||||
};
|
|
||||||
|
|
||||||
IStorage::IStorage(Core::System& system_, std::vector<u8>&& buffer)
|
|
||||||
: ServiceFramework{system_, "IStorage"},
|
|
||||||
impl{std::make_shared<StorageDataImpl>(std::move(buffer))} {
|
|
||||||
Register();
|
|
||||||
}
|
|
||||||
|
|
||||||
void IStorage::Register() {
|
|
||||||
// clang-format off
|
|
||||||
static const FunctionInfo functions[] = {
|
|
||||||
{0, &IStorage::Open, "Open"},
|
|
||||||
{1, nullptr, "OpenTransferStorage"},
|
|
||||||
};
|
|
||||||
// clang-format on
|
|
||||||
|
|
||||||
RegisterHandlers(functions);
|
RegisterHandlers(functions);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
IStorage::IStorage(Core::System& system_, std::vector<u8>&& data)
|
||||||
|
: IStorage(system_, CreateStorage(std::move(data))) {}
|
||||||
|
|
||||||
IStorage::~IStorage() = default;
|
IStorage::~IStorage() = default;
|
||||||
|
|
||||||
void IStorage::Open(HLERequestContext& ctx) {
|
void IStorage::Open(HLERequestContext& ctx) {
|
||||||
LOG_DEBUG(Service_AM, "called");
|
LOG_DEBUG(Service_AM, "called");
|
||||||
|
|
||||||
IPC::ResponseBuilder rb{ctx, 2, 0, 1};
|
if (impl->GetHandle() != nullptr) {
|
||||||
|
IPC::ResponseBuilder rb{ctx, 2};
|
||||||
|
rb.Push(AM::ResultInvalidStorageType);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
IPC::ResponseBuilder rb{ctx, 2, 0, 1};
|
||||||
rb.Push(ResultSuccess);
|
rb.Push(ResultSuccess);
|
||||||
rb.PushIpcInterface<IStorageAccessor>(system, *this);
|
rb.PushIpcInterface<IStorageAccessor>(system, impl);
|
||||||
|
}
|
||||||
|
|
||||||
|
void IStorage::OpenTransferStorage(HLERequestContext& ctx) {
|
||||||
|
LOG_DEBUG(Service_AM, "called");
|
||||||
|
|
||||||
|
if (impl->GetHandle() == nullptr) {
|
||||||
|
IPC::ResponseBuilder rb{ctx, 2};
|
||||||
|
rb.Push(AM::ResultInvalidStorageType);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
IPC::ResponseBuilder rb{ctx, 2, 0, 1};
|
||||||
|
rb.Push(ResultSuccess);
|
||||||
|
rb.PushIpcInterface<ITransferStorageAccessor>(system, impl);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<u8> IStorage::GetData() const {
|
||||||
|
return impl->GetData();
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace Service::AM
|
} // namespace Service::AM
|
||||||
|
Loading…
Reference in New Issue