File tree Expand file tree Collapse file tree 7 files changed +174
-1
lines changed Expand file tree Collapse file tree 7 files changed +174
-1
lines changed Original file line number Diff line number Diff line change @@ -4,6 +4,32 @@ namespace cdc
4
4
{
5
5
class FileRequest
6
6
{
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;
7
33
};
8
34
9
35
class FileReceiver
@@ -17,6 +43,9 @@ namespace cdc
17
43
18
44
class File
19
45
{
46
+ public:
47
+ virtual FileRequest* RequestRead (FileReceiver* receiver, const char * fileName, unsigned int startOffset) = 0;
48
+ virtual unsigned int GetSize () = 0;
20
49
};
21
50
22
51
class FileSystem
Original file line number Diff line number Diff line change
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
+ }
Original file line number Diff line number Diff line change
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
+ }
Original file line number Diff line number Diff line change
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
+ }
Original file line number Diff line number Diff line change
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
+ };
Original file line number Diff line number Diff line change 1
1
#include " FileSystem.h"
2
+ #include " FileReceivers.h"
2
3
#include " util/Hooking.h"
3
4
4
5
cdc::FileSystem* GetFS ()
5
6
{
6
7
auto addr = GET_ADDRESS (0x45C700 , 0x45F640 , 0x472B50 );
7
8
8
9
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 ;
9
32
}
Original file line number Diff line number Diff line change 3
3
#include "cdc/file/FileSystem.h"
4
4
5
5
// 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 );
You can’t perform that action at this time.
0 commit comments