annotate src/modules/filesystem/physfs/Filesystem.cpp @ 1086:73f4863ee5b7

Applied the new style guidelines. Well, sort of. Lot's more to be done, but this is a start.
author rude
date Thu, 28 Jun 2012 23:52:33 +0200
parents b9ec45e2aad1
children 86a44f2bc38f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1086
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
1 /**
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
2 * Copyright (c) 2006-2012 LOVE Development Team
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
3 *
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
4 * This software is provided 'as-is', without any express or implied
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
5 * warranty. In no event will the authors be held liable for any damages
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
6 * arising from the use of this software.
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
7 *
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
8 * Permission is granted to anyone to use this software for any purpose,
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
9 * including commercial applications, and to alter it and redistribute it
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
10 * freely, subject to the following restrictions:
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
11 *
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
12 * 1. The origin of this software must not be misrepresented; you must not
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
13 * claim that you wrote the original software. If you use this software
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
14 * in a product, an acknowledgment in the product documentation would be
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
15 * appreciated but is not required.
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
16 * 2. Altered source versions must be plainly marked as such, and must not be
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
17 * misrepresented as being the original software.
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
18 * 3. This notice may not be removed or altered from any source distribution.
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
19 **/
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
20
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
21 #include "common/config.h"
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
22
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
23 #include <iostream>
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
24
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
25 #include "common/utf8.h"
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
26 #include "common/b64.h"
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
27
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
28 #include "Filesystem.h"
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
29
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
30 namespace love
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
31 {
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
32 namespace filesystem
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
33 {
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
34 namespace physfs
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
35 {
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
36
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
37 Filesystem::Filesystem()
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
38 : open_count(0)
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
39 , buffer(0)
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
40 , isInited(false)
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
41 , release(false)
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
42 , releaseSet(false)
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
43 {
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
44 }
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
45
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
46 Filesystem::~Filesystem()
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
47 {
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
48 if (isInited)
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
49 {
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
50 isInited = false;
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
51 PHYSFS_deinit();
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
52 }
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
53 }
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
54
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
55 const char *Filesystem::getName() const
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
56 {
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
57 return "love.filesystem.physfs";
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
58 }
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
59
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
60 void Filesystem::init(const char *arg0)
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
61 {
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
62 if (!PHYSFS_init(arg0))
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
63 throw Exception(PHYSFS_getLastError());
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
64 isInited = true;
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
65 }
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
66
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
67 void Filesystem::setRelease(bool release)
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
68 {
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
69 if (releaseSet)
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
70 return;
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
71 this->release = release;
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
72 releaseSet = true;
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
73 }
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
74
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
75 bool Filesystem::isRelease() const
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
76 {
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
77 if (!releaseSet)
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
78 return false;
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
79 return release;
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
80 }
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
81
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
82 bool Filesystem::setIdentity(const char *ident)
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
83 {
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
84 if (!isInited)
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
85 return false;
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
86
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
87 // Store the save directory.
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
88 save_identity = std::string(ident);
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
89
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
90 // Generate the relative path to the game save folder.
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
91 save_path_relative = std::string(LOVE_APPDATA_PREFIX LOVE_APPDATA_FOLDER LOVE_PATH_SEPARATOR) + save_identity;
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
92
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
93 // Generate the full path to the game save folder.
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
94 save_path_full = std::string(getAppdataDirectory()) + std::string(LOVE_PATH_SEPARATOR);
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
95 if (release)
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
96 save_path_full += std::string(LOVE_APPDATA_PREFIX) + save_identity;
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
97 else
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
98 save_path_full += save_path_relative;
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
99
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
100 // We now have something like:
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
101 // save_identity: game
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
102 // save_path_relative: ./LOVE/game
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
103 // save_path_full: C:\Documents and Settings\user\Application Data/LOVE/game
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
104
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
105 // Try to add the save directory to the search path.
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
106 // (No error on fail, it means that the path doesn't exist).
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
107 PHYSFS_addToSearchPath(save_path_full.c_str(), 0);
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
108
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
109 return true;
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
110 }
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
111
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
112 const char *Filesystem::getIdentity() const
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
113 {
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
114 return save_identity.c_str();
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
115 }
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
116
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
117 bool Filesystem::setSource(const char *source)
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
118 {
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
119 if (!isInited)
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
120 return false;
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
121
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
122 // Check whether directory is already set.
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
123 if (!game_source.empty())
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
124 return false;
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
125
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
126 // Add the directory.
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
127 if (!PHYSFS_addToSearchPath(source, 1))
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
128 return false;
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
129
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
130 // Save the game source.
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
131 game_source = std::string(source);
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
132
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
133 return true;
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
134 }
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
135
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
136 bool Filesystem::setupWriteDirectory()
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
137 {
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
138 if (!isInited)
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
139 return false;
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
140
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
141 // These must all be set.
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
142 if (save_identity.empty() || save_path_full.empty() || save_path_relative.empty())
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
143 return false;
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
144
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
145 // Set the appdata folder as writable directory.
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
146 // (We must create the save folder before mounting it).
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
147 if (!PHYSFS_setWriteDir(getAppdataDirectory()))
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
148 return false;
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
149
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
150 // Create the save folder. (We're now "at" %APPDATA%).
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
151 bool success = false;
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
152 if (release)
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
153 success = mkdir(save_identity.c_str());
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
154 else
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
155 success = mkdir(save_path_relative.c_str());
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
156
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
157 if (!success)
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
158 {
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
159 PHYSFS_setWriteDir(0); // Clear the write directory in case of error.
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
160 return false;
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
161 }
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
162
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
163 // Set the final write directory.
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
164 if (!PHYSFS_setWriteDir(save_path_full.c_str()))
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
165 return false;
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
166
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
167 // Add the directory. (Will not be readded if already present).
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
168 if (!PHYSFS_addToSearchPath(save_path_full.c_str(), 0))
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
169 {
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
170 PHYSFS_setWriteDir(0); // Clear the write directory in case of error.
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
171 return false;
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
172 }
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
173
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
174 return true;
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
175 }
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
176
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
177 File *Filesystem::newFile(const char *filename)
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
178 {
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
179 return new File(filename);
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
180 }
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
181
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
182 FileData *Filesystem::newFileData(void *data, unsigned int size, const char *filename)
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
183 {
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
184 FileData *fd = new FileData(size, std::string(filename));
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
185
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
186 // Copy the data into FileData.
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
187 memcpy(fd->getData(), data, size);
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
188
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
189 return fd;
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
190 }
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
191
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
192 FileData *Filesystem::newFileData(const char *b64, const char *filename)
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
193 {
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
194 int size = strlen(b64);
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
195 int outsize = 0;
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
196 char *dst = b64_decode(b64, size, outsize);
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
197 FileData *fd = new FileData(outsize, std::string(filename));
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
198
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
199 // Copy the data into FileData.
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
200 memcpy(fd->getData(), dst, outsize);
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
201 delete [] dst;
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
202
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
203 return fd;
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
204 }
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
205
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
206 const char *Filesystem::getWorkingDirectory()
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
207 {
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
208 if (cwd.empty())
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
209 {
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
210 #ifdef LOVE_WINDOWS
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
211
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
212 WCHAR w_cwd[LOVE_MAX_PATH];
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
213 _wgetcwd(w_cwd, LOVE_MAX_PATH);
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
214 cwd = to_utf8(w_cwd);
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
215 replace_char(cwd, '\\', '/');
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
216 #else
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
217 char *cwd_char = new char[LOVE_MAX_PATH];
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
218
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
219 if (getcwd(cwd_char, LOVE_MAX_PATH))
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
220 cwd = cwd_char; // if getcwd fails, cwd_char (and thus cwd) will still be empty
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
221
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
222 delete [] cwd_char;
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
223 #endif
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
224 }
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
225
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
226 return cwd.c_str();
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
227 }
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
228
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
229 const char *Filesystem::getUserDirectory()
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
230 {
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
231 return PHYSFS_getUserDir();
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
232 }
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
233
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
234 const char *Filesystem::getAppdataDirectory()
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
235 {
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
236 #ifdef LOVE_WINDOWS
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
237 if (appdata.empty())
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
238 {
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
239 wchar_t *w_appdata = _wgetenv(TEXT("APPDATA"));
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
240 appdata = to_utf8(w_appdata);
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
241 replace_char(appdata, '\\', '/');
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
242 }
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
243 return appdata.c_str();
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
244 #elif defined(LOVE_MACOSX)
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
245 if (appdata.empty())
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
246 {
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
247 std::string udir = getUserDirectory();
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
248 udir.append("/Library/Application Support");
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
249 appdata = udir;
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
250 }
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
251 return appdata.c_str();
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
252 #elif defined(LOVE_LINUX)
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
253 if (appdata.empty())
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
254 {
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
255 char *xdgdatahome = getenv("XDG_DATA_HOME");
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
256 if (!xdgdatahome)
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
257 appdata = std::string(getUserDirectory()) + "/.local/share/";
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
258 else
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
259 appdata = xdgdatahome;
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
260 }
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
261 return appdata.c_str();
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
262 #else
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
263 return getUserDirectory();
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
264 #endif
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
265 }
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
266
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
267
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
268 const char *Filesystem::getSaveDirectory()
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
269 {
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
270 return save_path_full.c_str();
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
271 }
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
272
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
273 bool Filesystem::exists(const char *file)
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
274 {
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
275 if (PHYSFS_exists(file))
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
276 return true;
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
277 return false;
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
278 }
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
279
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
280 bool Filesystem::isDirectory(const char *file)
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
281 {
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
282 if (PHYSFS_isDirectory(file))
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
283 return true;
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
284 return false;
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
285 }
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
286
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
287 bool Filesystem::isFile(const char *file)
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
288 {
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
289 return exists(file) && !isDirectory(file);
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
290 }
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
291
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
292 bool Filesystem::mkdir(const char *file)
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
293 {
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
294 if (PHYSFS_getWriteDir() == 0 && !setupWriteDirectory())
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
295 return false;
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
296
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
297 if (!PHYSFS_mkdir(file))
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
298 return false;
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
299 return true;
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
300 }
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
301
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
302 bool Filesystem::remove(const char *file)
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
303 {
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
304 if (PHYSFS_getWriteDir() == 0 && !setupWriteDirectory())
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
305 return false;
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
306
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
307 if (!PHYSFS_delete(file))
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
308 return false;
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
309 return true;
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
310 }
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
311
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
312 int Filesystem::read(lua_State *L)
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
313 {
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
314 // The file to read from. The file must either be created
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
315 // on-the-fly, or passed as a parameter.
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
316 File *file;
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
317
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
318 if (lua_isstring(L, 1))
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
319 {
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
320 // Create the file.
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
321 file = newFile(lua_tostring(L, 1));
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
322 }
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
323 else
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
324 return luaL_error(L, "Expected filename.");
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
325
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
326 // Optionally, the caller can specify whether to read
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
327 // the whole file, or just a part of it.
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
328 int count = luaL_optint(L, 2, (lua_Integer)file->getSize()); // FIXME
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
329
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
330 // Read the data.
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
331 Data *data = file->read(count);
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
332
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
333 // Error check.
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
334 if (data == 0)
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
335 return luaL_error(L, "File could not be read.");
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
336
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
337 // Close and delete the file, if we created it.
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
338 // (I.e. if the first parameter is a string).
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
339 if (lua_isstring(L, 1))
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
340 file->release();
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
341
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
342 // Push the string.
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
343 lua_pushlstring(L, (char *)data->getData(), data->getSize());
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
344
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
345 // Push the size.
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
346 lua_pushinteger(L, data->getSize());
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
347
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
348 // Lua has a copy now, so we can free it.
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
349 data->release();
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
350
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
351 return 2;
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
352 }
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
353
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
354 int Filesystem::write(lua_State *L)
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
355 {
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
356 // The file to write to. The file must either be created
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
357 // on-the-fly, or passed as a parameter.
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
358 File *file;
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
359
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
360 // We know for sure that we need a second parameter, so
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
361 // let's check that first.
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
362 if (lua_isnoneornil(L, 2))
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
363 return luaL_error(L, "Second argument needed.");
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
364
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
365 if (lua_isstring(L, 1))
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
366 {
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
367 // Create the file.
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
368 file = newFile(lua_tostring(L, 1));
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
369 }
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
370 else
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
371 return luaL_error(L, "Expected filename.");
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
372
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
373 // Get the current mode of the file.
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
374 File::Mode mode = file->getMode();
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
375
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
376 if (mode == File::CLOSED)
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
377 {
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
378 // It should be possible to use append mode, but
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
379 // normal File::Mode::Write is the default.
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
380 int mode = luaL_optint(L, 4, File::WRITE);
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
381
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
382 // Open the file.
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
383 if (!file->open((File::Mode)mode))
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
384 return luaL_error(L, "Could not open file.");
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
385 }
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
386
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
387 size_t length = 0;
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
388 const char *input;
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
389 if (lua_isstring(L, 2))
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
390 {
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
391 input = lua_tolstring(L, 2, &length);
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
392 }
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
393 else if (luax_istype(L, 2, DATA_T))
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
394 {
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
395 love::Data *data = luax_totype<love::Data>(L, 2, "Data", DATA_T);
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
396 length = data->getSize();
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
397 input = (char *)data->getData();
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
398 }
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
399 else
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
400 {
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
401 return luaL_error(L, "Expected string or data for argument #2.");
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
402 }
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
403
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
404 // Get how much we should write. Length of string default.
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
405 length = luaL_optint(L, 3, length);
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
406
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
407 // Write the data.
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
408 bool success = file->write(input, length);
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
409
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
410 // Close and delete the file, if we created
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
411 // it in this function.
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
412 if (lua_isstring(L, 1))
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
413 {
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
414 // Kill the file if "we" created it.
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
415 file->close();
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
416 file->release();
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
417 }
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
418
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
419 if (!success)
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
420 return luaL_error(L, "Data could not be written.");
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
421
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
422 lua_pushboolean(L, success);
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
423 return 1;
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
424 }
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
425
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
426 int Filesystem::enumerate(lua_State *L)
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
427 {
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
428 int n = lua_gettop(L);
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
429
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
430 if (n != 1)
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
431 return luaL_error(L, "Function requires a single parameter.");
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
432
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
433 int type = lua_type(L, 1);
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
434
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
435 if (type != LUA_TSTRING)
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
436 return luaL_error(L, "Function requires parameter of type string.");
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
437
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
438 const char *dir = lua_tostring(L, 1);
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
439 char **rc = PHYSFS_enumerateFiles(dir);
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
440 char **i;
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
441 int index = 1;
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
442
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
443 lua_newtable(L);
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
444
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
445 for (i = rc; *i != 0; i++)
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
446 {
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
447 lua_pushinteger(L, index);
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
448 lua_pushstring(L, *i);
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
449 lua_settable(L, -3);
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
450 index++;
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
451 }
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
452
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
453 PHYSFS_freeList(rc);
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
454
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
455 return 1;
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
456 }
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
457
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
458 int Filesystem::lines_i(lua_State *L)
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
459 {
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
460 const int bufsize = 1024;
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
461 char buf[bufsize];
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
462 int linesize = 0;
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
463 bool newline = false;
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
464
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
465 File *file = luax_checktype<File>(L, lua_upvalueindex(1), "File", FILESYSTEM_FILE_T);
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
466
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
467 // Only accept read mode at this point.
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
468 if (file->getMode() != File::READ)
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
469 return luaL_error(L, "File needs to stay in read mode.");
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
470
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
471 int64 pos = file->tell();
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
472 int64 userpos = -1;
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
473
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
474 if (lua_isnoneornil(L, lua_upvalueindex(2)) == 0)
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
475 {
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
476 // User may have changed the file position.
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
477 userpos = pos;
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
478 pos = (int64) lua_tonumber(L, lua_upvalueindex(2));
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
479 if (userpos != pos)
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
480 file->seek(pos);
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
481 }
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
482
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
483 while (!newline && !file->eof())
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
484 {
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
485 // This 64-bit to 32-bit integer cast should be safe as it never exceeds bufsize.
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
486 int read = (int) file->read(buf, bufsize);
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
487 if (read < 0)
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
488 return luaL_error(L, "Could not read from file.");
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
489
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
490 linesize += read;
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
491
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
492 for (int i = 0; i < read; i++)
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
493 {
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
494 if (buf[i] == '\n')
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
495 {
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
496 linesize -= read - i;
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
497 newline = true;
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
498 break;
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
499 }
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
500 }
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
501 }
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
502
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
503 if (newline || (file->eof() && linesize > 0))
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
504 {
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
505 if (linesize < bufsize)
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
506 {
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
507 // We have the line in the buffer on the stack. No 'new' and 'read' needed.
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
508 lua_pushlstring(L, buf, linesize > 0 && buf[linesize - 1] == '\r' ? linesize - 1 : linesize);
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
509 if (userpos < 0)
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
510 file->seek(pos + linesize + 1);
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
511 }
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
512 else
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
513 {
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
514 char *str;
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
515 try
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
516 {
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
517 str = new char[linesize + 1];
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
518 }
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
519 catch(std::bad_alloc &)
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
520 {
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
521 return luaL_error(L, "Out of memory");
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
522 }
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
523 file->seek(pos);
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
524
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
525 // Read the \n anyway and save us a call to seek.
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
526 if (file->read(str, linesize + 1) == -1)
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
527 {
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
528 delete [] str;
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
529 return luaL_error(L, "Could not read from file.");
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
530 }
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
531
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
532 lua_pushlstring(L, str, str[linesize - 1] == '\r' ? linesize - 1 : linesize);
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
533 delete [] str;
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
534 }
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
535
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
536 if (userpos >= 0)
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
537 {
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
538 // Save new position in upvalue.
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
539 lua_pushnumber(L, (lua_Number)(pos + linesize + 1));
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
540 lua_replace(L, lua_upvalueindex(2));
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
541 file->seek(userpos);
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
542 }
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
543
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
544 return 1;
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
545 }
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
546
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
547 // EOF reached.
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
548 if (userpos >= 0 && luax_toboolean(L, lua_upvalueindex(3)))
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
549 file->seek(userpos);
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
550 else
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
551 file->close();
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
552
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
553 return 0;
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
554 }
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
555
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
556 int Filesystem::load(lua_State *L)
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
557 {
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
558 // Need only one arg.
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
559 luax_assert_argc(L, 1, 1);
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
560
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
561 // Must be string.
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
562 if (!lua_isstring(L, -1))
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
563 return luaL_error(L, "The argument must be a string.");
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
564
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
565 std::string filename = lua_tostring(L, -1);
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
566
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
567 // The file must exist.
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
568 if (!exists(filename.c_str()))
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
569 return luaL_error(L, "File %s does not exist.", filename.c_str());
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
570
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
571 // Create the file.
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
572 File *file = newFile(filename.c_str());
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
573
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
574 // Get the data from the file.
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
575 Data *data = file->read();
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
576
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
577 int status = luaL_loadbuffer(L, (const char *)data->getData(), data->getSize(), ("@" + filename).c_str());
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
578
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
579 data->release();
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
580 file->release();
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
581
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
582 // Load the chunk, but don't run it.
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
583 switch (status)
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
584 {
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
585 case LUA_ERRMEM:
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
586 return luaL_error(L, "Memory allocation error: %s\n", lua_tostring(L, -1));
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
587 case LUA_ERRSYNTAX:
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
588 return luaL_error(L, "Syntax error: %s\n", lua_tostring(L, -1));
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
589 default: // success
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
590 return 1;
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
591 }
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
592 }
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
593
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
594 int Filesystem::getLastModified(lua_State *L)
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
595 {
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
596 const char *filename = luaL_checkstring(L, 1);
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
597 PHYSFS_sint64 time = PHYSFS_getLastModTime(filename);
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
598 if (time == -1)
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
599 {
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
600 lua_pushnil(L);
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
601 lua_pushstring(L, "Could not determine file modification date.");
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
602 return 2;
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
603 }
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
604 lua_pushnumber(L, static_cast<lua_Number>(time));
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
605 return 1;
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
606 }
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
607
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
608 } // physfs
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
609 } // filesystem
73f4863ee5b7 Applied the new style guidelines.
rude
parents: 1078
diff changeset
610 } // love