Skip to content

Commit 7c59629

Browse files
committed
Add code for reading IDMaps
1 parent 13a7f3b commit 7c59629

File tree

7 files changed

+174
-1
lines changed

7 files changed

+174
-1
lines changed

src/cdc/file/FileSystem.h

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,32 @@ namespace cdc
44
{
55
class FileRequest
66
{
7+
public:
8+
enum Status
9+
{
10+
SETUP,
11+
QUEUED,
12+
PROCESSING,
13+
DONE,
14+
CANCELLED
15+
};
16+
17+
enum Priority
18+
{
19+
HIGH,
20+
NORMAL,
21+
LOW
22+
};
23+
24+
virtual void AddRef() = 0;
25+
virtual void Release() = 0;
26+
virtual void SetCompressedSize(unsigned int size) = 0;
27+
virtual void SetUncompressed() = 0;
28+
virtual void SetSize(unsigned int size) = 0;
29+
virtual Status GetStatus() = 0;
30+
virtual void Submit(Priority priority) = 0;
31+
virtual void Cancel() = 0;
32+
virtual float Completed() = 0;
733
};
834

935
class FileReceiver
@@ -17,6 +43,9 @@ namespace cdc
1743

1844
class File
1945
{
46+
public:
47+
virtual FileRequest* RequestRead(FileReceiver* receiver, const char* fileName, unsigned int startOffset) = 0;
48+
virtual unsigned int GetSize() = 0;
2049
};
2150

2251
class FileSystem

src/cdc/resource/IDMap.cpp

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
#include <sstream>
2+
3+
#include "IDMap.h"
4+
#include "file/FileSystem.h"
5+
6+
cdc::IDMap::IDMap(const char* fileName, cdc::FileSystem* fileSystem) : m_map()
7+
{
8+
auto buffer = FSHelper_ReadFile(fileName, fileSystem);
9+
10+
if (buffer)
11+
{
12+
std::istringstream stream(buffer);
13+
14+
unsigned int unk, count;
15+
16+
// Read the header
17+
stream >> unk;
18+
stream.ignore(1);
19+
stream >> count;
20+
21+
std::string line;
22+
std::getline(stream, line);
23+
24+
// Read all lines
25+
for (unsigned int i = 0; i < count; i++)
26+
{
27+
int id;
28+
29+
stream >> id;
30+
stream.ignore(1);
31+
32+
std::getline(stream, line);
33+
34+
// Strip any extra values
35+
line = line.substr(0, line.find(","));
36+
37+
// Allocate new string
38+
auto name = new char[line.size() + 1];
39+
strcpy(name, line.c_str());
40+
41+
m_map.insert({ id, name });
42+
}
43+
44+
// Clean up
45+
delete buffer;
46+
}
47+
}
48+
const char* cdc::IDMap::GetName(unsigned int id)
49+
{
50+
auto name = m_map.find(id);
51+
52+
if (name == m_map.end())
53+
{
54+
return "";
55+
}
56+
57+
return name->second;
58+
}

src/cdc/resource/IDMap.h

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
#pragma once
2+
3+
#include <unordered_map>
4+
5+
#include "cdc/file/FileSystem.h"
6+
7+
namespace cdc
8+
{
9+
class IDMap
10+
{
11+
private:
12+
std::unordered_map<unsigned int, const char*> m_map;
13+
14+
public:
15+
IDMap(const char* fileName, cdc::FileSystem* fileSystem);
16+
17+
const char* GetName(unsigned int id);
18+
};
19+
}

src/file/FileReceivers.cpp

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
#include "FileReceivers.h"
2+
#include <cstring>
3+
4+
FileUserBufferReceiver::FileUserBufferReceiver(char* buffer) : m_buffer(buffer)
5+
{
6+
}
7+
8+
int FileUserBufferReceiver::ReceiveData(const char* data, unsigned int dataSize, unsigned int requestOffset)
9+
{
10+
memcpy(&m_buffer[requestOffset], data, dataSize);
11+
return dataSize;
12+
}
13+
14+
void FileUserBufferReceiver::ReceiveStarted(cdc::FileRequest* request, unsigned int requestSize)
15+
{
16+
}
17+
18+
void FileUserBufferReceiver::ReceiveCancelled(cdc::FileRequest* request)
19+
{
20+
}
21+
22+
void FileUserBufferReceiver::ReceiveDone(cdc::FileRequest* request)
23+
{
24+
}

src/file/FileReceivers.h

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
#pragma once
2+
3+
#include "cdc/file/FileSystem.h"
4+
5+
class FileUserBufferReceiver : public cdc::FileReceiver
6+
{
7+
private:
8+
char* m_buffer;
9+
10+
public:
11+
FileUserBufferReceiver(char* buffer);
12+
13+
int ReceiveData(const char* data, unsigned int dataSize, unsigned int requestOffset);
14+
void ReceiveStarted(cdc::FileRequest* request, unsigned int requestSize);
15+
void ReceiveCancelled(cdc::FileRequest* request);
16+
void ReceiveDone(cdc::FileRequest* request);
17+
};

src/file/FileSystem.cpp

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,32 @@
11
#include "FileSystem.h"
2+
#include "FileReceivers.h"
23
#include "util/Hooking.h"
34

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

89
return Hooking::CallReturn<cdc::FileSystem*>(addr);
10+
}
11+
12+
char* FSHelper_ReadFile(const char* fileName, cdc::FileSystem* fileSystem)
13+
{
14+
auto size = fileSystem->GetFileSize(fileName);
15+
auto buffer = new char[size + 1];
16+
17+
auto receiver = new FileUserBufferReceiver(buffer);
18+
auto request = fileSystem->RequestRead(receiver, fileName, 0);
19+
20+
if (request)
21+
{
22+
request->Submit(cdc::FileRequest::HIGH);
23+
fileSystem->Synchronize();
24+
25+
// Null terminate the buffer
26+
buffer[size] = 0;
27+
28+
return buffer;
29+
}
30+
31+
return nullptr;
932
}

src/file/FileSystem.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,7 @@
33
#include "cdc/file/FileSystem.h"
44

55
// Gets the current file system
6-
cdc::FileSystem* GetFS();
6+
cdc::FileSystem* GetFS();
7+
8+
// Reads a file and returns the read buffer
9+
char* FSHelper_ReadFile(const char* fileName, cdc::FileSystem* fileSystem);

0 commit comments

Comments
 (0)