Skip to content

Commit 89b2ae3

Browse files
author
N3xoX1
committed
OS: add in IStorage::IStorage
1 parent 0fdbdd6 commit 89b2ae3

11 files changed

Lines changed: 76 additions & 19 deletions

File tree

src/nxemu-loader/core/file_sys/vfs/vfs_types.cpp

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,11 +61,11 @@ uint64_t VirtualFilePtr::GetSize() const
6161
return 0;
6262
}
6363

64-
uint64_t VirtualFilePtr::ReadBytes(uint8_t * data, uint64_t datalen)
64+
uint64_t VirtualFilePtr::ReadBytes(uint8_t * data, uint64_t datalen, uint64_t offset)
6565
{
6666
if (m_file)
6767
{
68-
return m_file->Read(data, datalen);
68+
return m_file->Read(data, datalen, offset);
6969
}
7070
return 0;
7171
}
@@ -80,6 +80,11 @@ IVirtualDirectory * VirtualFilePtr::ExtractRomFS()
8080
return std::make_unique<VirtualDirectoryPtr>(dir).release();
8181
}
8282

83+
IVirtualFile * VirtualFilePtr::Duplicate()
84+
{
85+
return std::make_unique<VirtualFilePtr>(m_file).release();
86+
}
87+
8388
void VirtualFilePtr::Release()
8489
{
8590
delete this;

src/nxemu-loader/core/file_sys/vfs/vfs_types.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,8 +73,9 @@ class VirtualFilePtr :
7373

7474
// IVirtualFile
7575
uint64_t GetSize() const override;
76-
uint64_t ReadBytes(uint8_t* data, uint64_t datalen) override;
76+
uint64_t ReadBytes(uint8_t* data, uint64_t datalen, uint64_t offset) override;
7777
IVirtualDirectory * ExtractRomFS() override;
78+
IVirtualFile* Duplicate() override;
7879
void Release() override;
7980

8081
private:

src/nxemu-loader/system_loader.h

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,13 +25,13 @@ class Systemloader :
2525
void RegisterContentProvider(FileSys::ContentProviderUnionSlot slot, FileSys::ContentProvider* provider);
2626

2727
//ISystemloader
28-
bool Initialize();
29-
bool SelectAndLoad(void * parentWindow);
30-
bool LoadRom(const char * romFile);
28+
bool Initialize() override;
29+
bool SelectAndLoad(void * parentWindow) override;
30+
bool LoadRom(const char * romFile) override;
3131

32-
IFileSystemController & FileSystemController();
33-
IVirtualFile * SynthesizeSystemArchive(const uint64_t title_id);
34-
uint32_t GetContentProviderEntriesCount(bool useTitleType, LoaderTitleType titleType, bool useContentRecordType, LoaderContentRecordType contentRecordType, bool useTitleId, unsigned long long titleId);
32+
IFileSystemController & FileSystemController() override;
33+
IVirtualFile * SynthesizeSystemArchive(const uint64_t title_id) override;
34+
uint32_t GetContentProviderEntriesCount(bool useTitleType, LoaderTitleType titleType, bool useContentRecordType, LoaderContentRecordType contentRecordType, bool useTitleId, unsigned long long titleId) override;
3535

3636
private:
3737
Systemloader() = delete;

src/nxemu-module-spec/base.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616

1717
enum
1818
{
19-
MODULE_LOADER_SPECS_VERSION = 0x0103,
19+
MODULE_LOADER_SPECS_VERSION = 0x0104,
2020
MODULE_VIDEO_SPECS_VERSION = 0x0101,
2121
MODULE_CPU_SPECS_VERSION = 0x0101,
2222
MODULE_OPERATING_SYSTEM_SPECS_VERSION = 0x0103,

src/nxemu-module-spec/system_loader.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,8 +106,9 @@ __interface IVirtualDirectory
106106
__interface IVirtualFile
107107
{
108108
uint64_t GetSize() const = 0;
109-
uint64_t ReadBytes(uint8_t * data, uint64_t datalen) = 0;
109+
uint64_t ReadBytes(uint8_t * data, uint64_t datalen, uint64_t offset) = 0;
110110
IVirtualDirectory * ExtractRomFS() = 0;
111+
IVirtualFile * Duplicate() = 0;
111112
void Release() = 0;
112113
};
113114

src/nxemu-os/core/core.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,10 @@ class KProcess;
3333
class KScheduler;
3434
} // namespace Kernel
3535

36+
enum class LoaderResultStatus : uint16_t;
37+
3638
namespace Loader {
3739
class AppLoader;
38-
enum class ResultStatus : u16;
3940
} // namespace Loader
4041

4142
namespace Core::Memory {
@@ -311,7 +312,7 @@ class System {
311312
[[nodiscard]] u64 GetApplicationProcessProgramID() const;
312313

313314
/// Gets the name of the current game
314-
[[nodiscard]] Loader::ResultStatus GetGameName(std::string& out) const;
315+
[[nodiscard]] LoaderResultStatus GetGameName(std::string& out) const;
315316

316317
void SetStatus(SystemResultStatus new_status, const char* details);
317318

src/nxemu-os/core/file_sys/filesystem_interfaces.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ std::vector<uint8_t> IVirtualFilePtr::ReadAllBytes() const
139139
}
140140
std::vector<uint8_t> data;
141141
data.resize(dataSize);
142-
dataSize = m_file->ReadBytes(data.data(), data.size());
142+
dataSize = m_file->ReadBytes(data.data(), data.size(), 0);
143143
if (dataSize < data.size())
144144
{
145145
data.resize(dataSize);

src/nxemu-os/core/hle/service/filesystem/fsp/fs_i_storage.cpp

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,43 @@
44
#include "core/file_sys/errors.h"
55
#include "core/hle/service/cmif_serialization.h"
66
#include "core/hle/service/filesystem/fsp/fs_i_storage.h"
7+
#include <nxemu-module-spec/system_loader.h>
78

89
namespace Service::FileSystem {
910

11+
IStorage::IStorage(Core::System& system_, IVirtualFilePtr && backend_)
12+
: ServiceFramework{system_, "IStorage"}, backend(std::move(backend_)) {
13+
static const FunctionInfo functions[] = {
14+
{0, D<&IStorage::Read>, "Read"},
15+
{1, nullptr, "Write"},
16+
{2, nullptr, "Flush"},
17+
{3, nullptr, "SetSize"},
18+
{4, D<&IStorage::GetSize>, "GetSize"},
19+
{5, nullptr, "OperateRange"},
20+
};
21+
RegisterHandlers(functions);
22+
}
23+
24+
Result IStorage::Read(
25+
OutBuffer<BufferAttr_HipcMapAlias | BufferAttr_HipcMapTransferAllowsNonSecure> out_bytes,
26+
s64 offset, s64 length) {
27+
LOG_DEBUG(Service_FS, "called, offset=0x{:X}, length={}", offset, length);
28+
29+
R_UNLESS(length >= 0, FileSys::ResultInvalidSize);
30+
R_UNLESS(offset >= 0, FileSys::ResultInvalidOffset);
31+
32+
// Read the data from the Storage backend
33+
backend->ReadBytes(out_bytes.data(), length, offset);
34+
35+
R_SUCCEED();
36+
}
37+
38+
Result IStorage::GetSize(Out<u64> out_size) {
39+
*out_size = backend->GetSize();
40+
41+
LOG_DEBUG(Service_FS, "called, size={}", *out_size);
42+
43+
R_SUCCEED();
44+
}
45+
1046
} // namespace Service::FileSystem

src/nxemu-os/core/hle/service/filesystem/fsp/fs_i_storage.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
#pragma once
55

6+
#include "core/file_sys/filesystem_interfaces.h"
67
#include "core/hle/service/cmif_types.h"
78
#include "core/hle/service/filesystem/filesystem.h"
89
#include "core/hle/service/service.h"
@@ -11,8 +12,15 @@ namespace Service::FileSystem {
1112

1213
class IStorage final : public ServiceFramework<IStorage> {
1314
public:
15+
explicit IStorage(Core::System& system_, IVirtualFilePtr && backend_);
1416

1517
private:
18+
IVirtualFilePtr backend;
19+
20+
Result Read(
21+
OutBuffer<BufferAttr_HipcMapAlias | BufferAttr_HipcMapTransferAllowsNonSecure> out_bytes,
22+
s64 offset, s64 length);
23+
Result GetSize(Out<u64> out_size);
1624
};
1725

1826
} // namespace Service::FileSystem

src/nxemu-os/core/hle/service/filesystem/fsp/fsp_srv.cpp

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -238,11 +238,16 @@ Result FSP_SRV::OpenDataStorageByCurrentProcess(OutInterface<IStorage> out_inter
238238
LOG_DEBUG(Service_FS, "called");
239239

240240
if (!romfs) {
241-
auto current_romfs = romfs_controller->OpenRomFSCurrentProcess();
242-
UNIMPLEMENTED();
241+
IVirtualFilePtr current_romfs = std::move(romfs_controller->OpenRomFSCurrentProcess());
242+
if (!current_romfs) {
243+
// TODO (bunnei): Find the right error code to use here
244+
LOG_CRITICAL(Service_FS, "No file system interface available!");
245+
R_RETURN(ResultUnknown);
246+
}
247+
248+
romfs = std::move(current_romfs);
243249
}
244-
245-
UNIMPLEMENTED();
250+
*out_interface = std::make_shared<IStorage>(system, IVirtualFilePtr(romfs->Duplicate()));
246251
R_SUCCEED();
247252
}
248253

0 commit comments

Comments
 (0)