Branch data Line data Source code
1 : : #if !defined(ASAR_VIRTUALFILE_H)
2 : : #define ASAR_VIRTUALFILE_H
3 : :
4 : : #include "autoarray.h"
5 : : #include "assocarr.h"
6 : : #include "libstr.h"
7 : :
8 : : // RPG Hacker: A virtual file system which can work with physical files
9 : : // as well as in-memory files.
10 : :
11 : : typedef void* virtual_file_handle;
12 : : static const virtual_file_handle INVALID_VIRTUAL_FILE_HANDLE = nullptr;
13 : :
14 : : enum virtual_file_error
15 : : {
16 : : vfe_none,
17 : :
18 : : vfe_doesnt_exist,
19 : : vfe_access_denied,
20 : : vfe_not_regular_file,
21 : : vfe_unknown,
22 : :
23 : : vfe_num_errors
24 : : };
25 : :
26 : : struct memory_buffer
27 : : {
28 : : const void* data;
29 : : size_t length;
30 : : };
31 : :
32 : : class virtual_filesystem
33 : : {
34 : : public:
35 : : void initialize(const char** include_paths, size_t num_include_paths);
36 : : void destroy();
37 : :
38 : : virtual_file_handle open_file(const char* path, const char* base_path);
39 : : void close_file(virtual_file_handle file_handle);
40 : :
41 : : size_t read_file(virtual_file_handle file_handle, void* out_buffer, size_t pos, size_t num_bytes);
42 : :
43 : : size_t get_file_size(virtual_file_handle file_handle);
44 : :
45 : : bool is_path_absolute(const char* path);
46 : :
47 : : string create_absolute_path(const char* base, const char* target);
48 : :
49 : : void add_memory_file(const char* name, const void* buffer, size_t length);
50 : :
51 : 12 : inline virtual_file_error get_last_error()
52 : : {
53 : 24 : return m_last_error;
54 : : }
55 : :
56 : : private:
57 : : enum virtual_file_type
58 : : {
59 : : vft_physical_file,
60 : : vft_memory_file
61 : : };
62 : :
63 : : virtual_file_type get_file_type_from_path(const char* path);
64 : :
65 : : assocarr<memory_buffer> m_memory_files;
66 : : autoarray<string> m_include_paths;
67 : : virtual_file_error m_last_error;
68 : : };
69 : :
70 : : #endif
|