1/**
2 * Copyright (c) 2006-2023 LOVE Development Team
3 *
4 * This software is provided 'as-is', without any express or implied
5 * warranty. In no event will the authors be held liable for any damages
6 * arising from the use of this software.
7 *
8 * Permission is granted to anyone to use this software for any purpose,
9 * including commercial applications, and to alter it and redistribute it
10 * freely, subject to the following restrictions:
11 *
12 * 1. The origin of this software must not be misrepresented; you must not
13 * claim that you wrote the original software. If you use this software
14 * in a product, an acknowledgment in the product documentation would be
15 * appreciated but is not required.
16 * 2. Altered source versions must be plainly marked as such, and must not be
17 * misrepresented as being the original software.
18 * 3. This notice may not be removed or altered from any source distribution.
19 **/
20
21#ifndef LOVE_FILESYSTEM_PHYSFS_FILESYSTEM_H
22#define LOVE_FILESYSTEM_PHYSFS_FILESYSTEM_H
23
24// STD
25#include <cstdlib>
26#include <cstring>
27#include <map>
28
29// LOVE
30#include "filesystem/Filesystem.h"
31
32namespace love
33{
34namespace filesystem
35{
36namespace physfs
37{
38
39class Filesystem final : public love::filesystem::Filesystem
40{
41public:
42
43 Filesystem();
44 virtual ~Filesystem();
45
46 // Implements Module.
47 const char *getName() const override;
48
49 void init(const char *arg0) override;
50
51 void setFused(bool fused) override;
52 bool isFused() const override;
53
54 bool setupWriteDirectory() override;
55
56 bool setIdentity(const char *ident, bool appendToPath = false) override;
57 const char *getIdentity() const override;
58
59 bool setSource(const char *source) override;
60
61 const char *getSource() const override;
62
63 bool mount(const char *archive, const char *mountpoint, bool appendToPath = false) override;
64 bool mount(Data *data, const char *archivename, const char *mountpoint, bool appendToPath = false) override;
65
66 bool unmount(const char *archive) override;
67 bool unmount(Data *data) override;
68
69 love::filesystem::File *newFile(const char *filename) const override;
70
71 const char *getWorkingDirectory() override;
72 std::string getUserDirectory() override;
73 std::string getAppdataDirectory() override;
74 const char *getSaveDirectory() override;
75 std::string getSourceBaseDirectory() const override;
76
77 std::string getRealDirectory(const char *filename) const override;
78
79 bool getInfo(const char *filepath, Info &info) const override;
80
81 bool createDirectory(const char *dir) override;
82
83 bool remove(const char *file) override;
84
85 FileData *read(const char *filename, int64 size = File::ALL) const override;
86 void write(const char *filename, const void *data, int64 size) const override;
87 void append(const char *filename, const void *data, int64 size) const override;
88
89 void getDirectoryItems(const char *dir, std::vector<std::string> &items) override;
90
91 void setSymlinksEnabled(bool enable) override;
92 bool areSymlinksEnabled() const override;
93
94 std::vector<std::string> &getRequirePath() override;
95 std::vector<std::string> &getCRequirePath() override;
96
97 void allowMountingForPath(const std::string &path) override;
98
99private:
100
101 // Contains the current working directory (UTF8).
102 std::string cwd;
103
104 // %APPDATA% on Windows.
105 std::string appdata;
106
107 // This name will be used to create the folder
108 // in the appdata/userdata folder.
109 std::string save_identity;
110
111 // Full and relative paths of the game save folder.
112 // (Relative to the %APPDATA% folder, meaning that the
113 // relative string will look something like: ./LOVE/game)
114 std::string save_path_relative, save_path_full;
115
116 // The full path to the source of the game.
117 std::string game_source;
118
119 // Allow saving outside of the LOVE_APPDATA_FOLDER
120 // for release 'builds'
121 bool fused;
122 bool fusedSet;
123
124 // Search path for require
125 std::vector<std::string> requirePath;
126 std::vector<std::string> cRequirePath;
127
128 std::vector<std::string> allowedMountPaths;
129
130 std::map<std::string, StrongRef<Data>> mountedData;
131
132}; // Filesystem
133
134} // physfs
135} // filesystem
136} // love
137
138#endif // LOVE_FILESYSTEM_PHYSFS_FILESYSTEM_H
139