Skip to content

Commit

Permalink
Add code for reading IDMaps
Browse files Browse the repository at this point in the history
  • Loading branch information
TheIndra55 committed Aug 4, 2024
1 parent 13a7f3b commit 7c59629
Show file tree
Hide file tree
Showing 7 changed files with 174 additions and 1 deletion.
29 changes: 29 additions & 0 deletions src/cdc/file/FileSystem.h
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,32 @@ namespace cdc
{
class FileRequest
{
public:
enum Status
{
SETUP,
QUEUED,
PROCESSING,
DONE,
CANCELLED
};

enum Priority
{
HIGH,
NORMAL,
LOW
};

virtual void AddRef() = 0;
virtual void Release() = 0;
virtual void SetCompressedSize(unsigned int size) = 0;
virtual void SetUncompressed() = 0;
virtual void SetSize(unsigned int size) = 0;
virtual Status GetStatus() = 0;
virtual void Submit(Priority priority) = 0;
virtual void Cancel() = 0;
virtual float Completed() = 0;
};

class FileReceiver
Expand All @@ -17,6 +43,9 @@ namespace cdc

class File
{
public:
virtual FileRequest* RequestRead(FileReceiver* receiver, const char* fileName, unsigned int startOffset) = 0;
virtual unsigned int GetSize() = 0;
};

class FileSystem
Expand Down
58 changes: 58 additions & 0 deletions src/cdc/resource/IDMap.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
#include <sstream>

#include "IDMap.h"
#include "file/FileSystem.h"

cdc::IDMap::IDMap(const char* fileName, cdc::FileSystem* fileSystem) : m_map()
{
auto buffer = FSHelper_ReadFile(fileName, fileSystem);

if (buffer)
{
std::istringstream stream(buffer);

unsigned int unk, count;

// Read the header
stream >> unk;
stream.ignore(1);
stream >> count;

std::string line;
std::getline(stream, line);

// Read all lines
for (unsigned int i = 0; i < count; i++)
{
int id;

stream >> id;
stream.ignore(1);

std::getline(stream, line);

// Strip any extra values
line = line.substr(0, line.find(","));

// Allocate new string
auto name = new char[line.size() + 1];
strcpy(name, line.c_str());

m_map.insert({ id, name });
}

// Clean up
delete buffer;
}
}
const char* cdc::IDMap::GetName(unsigned int id)
{
auto name = m_map.find(id);

if (name == m_map.end())
{
return "";
}

return name->second;
}
19 changes: 19 additions & 0 deletions src/cdc/resource/IDMap.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
#pragma once

#include <unordered_map>

#include "cdc/file/FileSystem.h"

namespace cdc
{
class IDMap
{
private:
std::unordered_map<unsigned int, const char*> m_map;

public:
IDMap(const char* fileName, cdc::FileSystem* fileSystem);

const char* GetName(unsigned int id);
};
}
24 changes: 24 additions & 0 deletions src/file/FileReceivers.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
#include "FileReceivers.h"
#include <cstring>

FileUserBufferReceiver::FileUserBufferReceiver(char* buffer) : m_buffer(buffer)
{
}

int FileUserBufferReceiver::ReceiveData(const char* data, unsigned int dataSize, unsigned int requestOffset)
{
memcpy(&m_buffer[requestOffset], data, dataSize);
return dataSize;
}

void FileUserBufferReceiver::ReceiveStarted(cdc::FileRequest* request, unsigned int requestSize)
{
}

void FileUserBufferReceiver::ReceiveCancelled(cdc::FileRequest* request)
{
}

void FileUserBufferReceiver::ReceiveDone(cdc::FileRequest* request)
{
}
17 changes: 17 additions & 0 deletions src/file/FileReceivers.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
#pragma once

#include "cdc/file/FileSystem.h"

class FileUserBufferReceiver : public cdc::FileReceiver
{
private:
char* m_buffer;

public:
FileUserBufferReceiver(char* buffer);

int ReceiveData(const char* data, unsigned int dataSize, unsigned int requestOffset);
void ReceiveStarted(cdc::FileRequest* request, unsigned int requestSize);
void ReceiveCancelled(cdc::FileRequest* request);
void ReceiveDone(cdc::FileRequest* request);
};
23 changes: 23 additions & 0 deletions src/file/FileSystem.cpp
Original file line number Diff line number Diff line change
@@ -1,9 +1,32 @@
#include "FileSystem.h"
#include "FileReceivers.h"
#include "util/Hooking.h"

cdc::FileSystem* GetFS()
{
auto addr = GET_ADDRESS(0x45C700, 0x45F640, 0x472B50);

return Hooking::CallReturn<cdc::FileSystem*>(addr);
}

char* FSHelper_ReadFile(const char* fileName, cdc::FileSystem* fileSystem)
{
auto size = fileSystem->GetFileSize(fileName);
auto buffer = new char[size + 1];

auto receiver = new FileUserBufferReceiver(buffer);
auto request = fileSystem->RequestRead(receiver, fileName, 0);

if (request)
{
request->Submit(cdc::FileRequest::HIGH);
fileSystem->Synchronize();

// Null terminate the buffer
buffer[size] = 0;

return buffer;
}

return nullptr;
}
5 changes: 4 additions & 1 deletion src/file/FileSystem.h
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,7 @@
#include "cdc/file/FileSystem.h"

// Gets the current file system
cdc::FileSystem* GetFS();
cdc::FileSystem* GetFS();

// Reads a file and returns the read buffer
char* FSHelper_ReadFile(const char* fileName, cdc::FileSystem* fileSystem);

0 comments on commit 7c59629

Please sign in to comment.