aboutsummaryrefslogtreecommitdiff
path: root/backends/fs
diff options
context:
space:
mode:
Diffstat (limited to 'backends/fs')
-rw-r--r--backends/fs/abstract-fs.h9
-rw-r--r--backends/fs/amigaos4/amigaos4-fs.cpp5
-rw-r--r--backends/fs/amigaos4/amigaos4-fs.h1
-rw-r--r--backends/fs/chroot/chroot-fs.cpp5
-rw-r--r--backends/fs/chroot/chroot-fs.h1
-rw-r--r--backends/fs/ds/ds-fs.cpp10
-rw-r--r--backends/fs/ds/ds-fs.h2
-rw-r--r--backends/fs/n64/n64-fs.cpp5
-rw-r--r--backends/fs/n64/n64-fs.h1
-rw-r--r--backends/fs/posix/posix-fs.cpp30
-rw-r--r--backends/fs/posix/posix-fs.h1
-rw-r--r--backends/fs/ps2/ps2-fs.cpp5
-rw-r--r--backends/fs/ps2/ps2-fs.h1
-rw-r--r--backends/fs/psp/psp-fs.cpp5
-rw-r--r--backends/fs/psp/psp-fs.h1
-rw-r--r--backends/fs/symbian/symbian-fs.cpp6
-rw-r--r--backends/fs/symbian/symbian-fs.h1
-rw-r--r--backends/fs/wii/wii-fs.cpp13
-rw-r--r--backends/fs/wii/wii-fs.h1
-rw-r--r--backends/fs/windows/windows-fs.cpp32
-rw-r--r--backends/fs/windows/windows-fs.h1
21 files changed, 132 insertions, 4 deletions
diff --git a/backends/fs/abstract-fs.h b/backends/fs/abstract-fs.h
index dcfdc08975..24286b649d 100644
--- a/backends/fs/abstract-fs.h
+++ b/backends/fs/abstract-fs.h
@@ -191,6 +191,15 @@ public:
* @return pointer to the stream object, 0 in case of a failure
*/
virtual Common::WriteStream *createWriteStream() = 0;
+
+ /**
+ * Creates a file referred by this node.
+ *
+ * @param isDirectory true if created file must be a directory
+ *
+ * @return true if file is created successfully
+ */
+ virtual bool create(bool isDirectory) = 0;
};
diff --git a/backends/fs/amigaos4/amigaos4-fs.cpp b/backends/fs/amigaos4/amigaos4-fs.cpp
index 6d5b099736..24a8fb98ad 100644
--- a/backends/fs/amigaos4/amigaos4-fs.cpp
+++ b/backends/fs/amigaos4/amigaos4-fs.cpp
@@ -443,4 +443,9 @@ Common::WriteStream *AmigaOSFilesystemNode::createWriteStream() {
return StdioStream::makeFromPath(getPath(), true);
}
+bool AmigaOSFilesystemNode::create(bool isDirectory) {
+ error("Not supported");
+ return false;
+}
+
#endif //defined(__amigaos4__)
diff --git a/backends/fs/amigaos4/amigaos4-fs.h b/backends/fs/amigaos4/amigaos4-fs.h
index 408354888e..3ed45d3f77 100644
--- a/backends/fs/amigaos4/amigaos4-fs.h
+++ b/backends/fs/amigaos4/amigaos4-fs.h
@@ -116,6 +116,7 @@ public:
virtual Common::SeekableReadStream *createReadStream();
virtual Common::WriteStream *createWriteStream();
+ virtual bool create(bool isDirectory);
};
diff --git a/backends/fs/chroot/chroot-fs.cpp b/backends/fs/chroot/chroot-fs.cpp
index 2cbb4af9d6..be6805bbd8 100644
--- a/backends/fs/chroot/chroot-fs.cpp
+++ b/backends/fs/chroot/chroot-fs.cpp
@@ -108,6 +108,11 @@ Common::WriteStream *ChRootFilesystemNode::createWriteStream() {
return _realNode->createWriteStream();
}
+bool ChRootFilesystemNode::create(bool /*isDir*/) {
+ error("Not supported");
+ return false;
+}
+
Common::String ChRootFilesystemNode::addPathComponent(const Common::String &path, const Common::String &component) {
const char sep = '/';
if (path.lastChar() == sep && component.firstChar() == sep) {
diff --git a/backends/fs/chroot/chroot-fs.h b/backends/fs/chroot/chroot-fs.h
index 9ff913be31..e0ecc1c47e 100644
--- a/backends/fs/chroot/chroot-fs.h
+++ b/backends/fs/chroot/chroot-fs.h
@@ -49,6 +49,7 @@ public:
virtual Common::SeekableReadStream *createReadStream();
virtual Common::WriteStream *createWriteStream();
+ virtual bool create(bool isDirectory);
private:
static Common::String addPathComponent(const Common::String &path, const Common::String &component);
diff --git a/backends/fs/ds/ds-fs.cpp b/backends/fs/ds/ds-fs.cpp
index 3782caf432..83b1295838 100644
--- a/backends/fs/ds/ds-fs.cpp
+++ b/backends/fs/ds/ds-fs.cpp
@@ -211,6 +211,11 @@ Common::WriteStream *DSFileSystemNode::createWriteStream() {
return Common::wrapBufferedWriteStream(stream, WRITE_BUFFER_SIZE);
}
+bool DSFileSystemNode::create(bool isDirectory) {
+ error("Not supported");
+ return false;
+}
+
//////////////////////////////////////////////////////////////////////////
// GBAMPFileSystemNode - File system using GBA Movie Player and CF card //
//////////////////////////////////////////////////////////////////////////
@@ -393,6 +398,11 @@ Common::WriteStream *GBAMPFileSystemNode::createWriteStream() {
return Common::wrapBufferedWriteStream(stream, WRITE_BUFFER_SIZE);
}
+bool GBAMPFileSystemNode::create(bool isDirectory) {
+ error("Not supported");
+ return false;
+}
+
DSFileStream::DSFileStream(void *handle) : _handle(handle) {
diff --git a/backends/fs/ds/ds-fs.h b/backends/fs/ds/ds-fs.h
index b9ccfcbe9c..939d1a1555 100644
--- a/backends/fs/ds/ds-fs.h
+++ b/backends/fs/ds/ds-fs.h
@@ -91,6 +91,7 @@ public:
virtual Common::SeekableReadStream *createReadStream();
virtual Common::WriteStream *createWriteStream();
+ virtual bool create(bool isDirectory);
/**
* Returns the zip file this node points to.
@@ -156,6 +157,7 @@ public:
virtual Common::SeekableReadStream *createReadStream();
virtual Common::WriteStream *createWriteStream();
+ virtual bool create(bool isDirectory);
};
struct fileHandle {
diff --git a/backends/fs/n64/n64-fs.cpp b/backends/fs/n64/n64-fs.cpp
index fe37dad467..d568500d30 100644
--- a/backends/fs/n64/n64-fs.cpp
+++ b/backends/fs/n64/n64-fs.cpp
@@ -160,4 +160,9 @@ Common::WriteStream *N64FilesystemNode::createWriteStream() {
return RomfsStream::makeFromPath(getPath(), true);
}
+bool N64FilesystemNode::create(bool isDirectory) {
+ error("Not supported");
+ return false;
+}
+
#endif //#ifdef __N64__
diff --git a/backends/fs/n64/n64-fs.h b/backends/fs/n64/n64-fs.h
index d503a6601e..d520ad5be6 100644
--- a/backends/fs/n64/n64-fs.h
+++ b/backends/fs/n64/n64-fs.h
@@ -73,6 +73,7 @@ public:
virtual Common::SeekableReadStream *createReadStream();
virtual Common::WriteStream *createWriteStream();
+ virtual bool create(bool isDirectory);
};
#endif
diff --git a/backends/fs/posix/posix-fs.cpp b/backends/fs/posix/posix-fs.cpp
index 1a6c4e40a5..ce5715210a 100644
--- a/backends/fs/posix/posix-fs.cpp
+++ b/backends/fs/posix/posix-fs.cpp
@@ -39,6 +39,7 @@
#include <dirent.h>
#include <stdio.h>
#include <errno.h>
+#include <fcntl.h>
#ifdef __OS2__
#define INCL_DOS
@@ -252,6 +253,35 @@ Common::WriteStream *POSIXFilesystemNode::createWriteStream() {
return StdioStream::makeFromPath(getPath(), true);
}
+bool POSIXFilesystemNode::create(bool isDir) {
+ bool success;
+
+ if (isDir) {
+ success = mkdir(_path.c_str(), 0755) == 0;
+ } else {
+ int fd = open(_path.c_str(), O_WRONLY | O_CREAT | O_TRUNC, 0755);
+ success = fd >= 0;
+
+ if (fd >= 0) {
+ close(fd);
+ }
+ }
+
+ if (success) {
+ setFlags();
+ if (_isValid) {
+ if (_isDirectory != isDir) warning("failed to create %s: got %s", isDir ? "directory" : "file", _isDirectory ? "directory" : "file");
+ return _isDirectory == isDir;
+ }
+
+ warning("POSIXFilesystemNode: %s() was a success, but stat indicates there is no such %s",
+ isDir ? "mkdir" : "creat", isDir ? "directory" : "file");
+ return false;
+ }
+
+ return false;
+}
+
namespace Posix {
bool assureDirectoryExists(const Common::String &dir, const char *prefix) {
diff --git a/backends/fs/posix/posix-fs.h b/backends/fs/posix/posix-fs.h
index 0703ac5bf5..4ebce7e9d9 100644
--- a/backends/fs/posix/posix-fs.h
+++ b/backends/fs/posix/posix-fs.h
@@ -73,6 +73,7 @@ public:
virtual Common::SeekableReadStream *createReadStream();
virtual Common::WriteStream *createWriteStream();
+ virtual bool create(bool isDirectory);
private:
/**
diff --git a/backends/fs/ps2/ps2-fs.cpp b/backends/fs/ps2/ps2-fs.cpp
index 9b6e1270f1..8391e063a0 100644
--- a/backends/fs/ps2/ps2-fs.cpp
+++ b/backends/fs/ps2/ps2-fs.cpp
@@ -441,4 +441,9 @@ Common::WriteStream *Ps2FilesystemNode::createWriteStream() {
return PS2FileStream::makeFromPath(getPath(), true);
}
+bool Ps2FilesystemNode::create(bool isDirectory) {
+ error("Not supported");
+ return false;
+}
+
#endif
diff --git a/backends/fs/ps2/ps2-fs.h b/backends/fs/ps2/ps2-fs.h
index 63b866ba5b..c9da434535 100644
--- a/backends/fs/ps2/ps2-fs.h
+++ b/backends/fs/ps2/ps2-fs.h
@@ -96,6 +96,7 @@ public:
virtual Common::SeekableReadStream *createReadStream();
virtual Common::WriteStream *createWriteStream();
+ virtual bool create(bool isDirectory);
int getDev() { return 0; }
};
diff --git a/backends/fs/psp/psp-fs.cpp b/backends/fs/psp/psp-fs.cpp
index e8aad9fa98..6bd5e93435 100644
--- a/backends/fs/psp/psp-fs.cpp
+++ b/backends/fs/psp/psp-fs.cpp
@@ -239,4 +239,9 @@ Common::WriteStream *PSPFilesystemNode::createWriteStream() {
return Common::wrapBufferedWriteStream(stream, WRITE_BUFFER_SIZE);
}
+bool PSPFilesystemNode::create(bool isDirectory) {
+ error("Not supported");
+ return false;
+}
+
#endif //#ifdef __PSP__
diff --git a/backends/fs/psp/psp-fs.h b/backends/fs/psp/psp-fs.h
index 1bb4543d19..648544650b 100644
--- a/backends/fs/psp/psp-fs.h
+++ b/backends/fs/psp/psp-fs.h
@@ -65,6 +65,7 @@ public:
virtual Common::SeekableReadStream *createReadStream();
virtual Common::WriteStream *createWriteStream();
+ virtual bool create(bool isDirectory);
};
#endif
diff --git a/backends/fs/symbian/symbian-fs.cpp b/backends/fs/symbian/symbian-fs.cpp
index 8fbc3a402a..e4163caa33 100644
--- a/backends/fs/symbian/symbian-fs.cpp
+++ b/backends/fs/symbian/symbian-fs.cpp
@@ -231,4 +231,10 @@ Common::SeekableReadStream *SymbianFilesystemNode::createReadStream() {
Common::WriteStream *SymbianFilesystemNode::createWriteStream() {
return SymbianStdioStream::makeFromPath(getPath(), true);
}
+
+bool SymbianFilesystemNode::create(bool isDirectory) {
+ error("Not supported");
+ return false;
+}
+
#endif //#if defined(__SYMBIAN32__)
diff --git a/backends/fs/symbian/symbian-fs.h b/backends/fs/symbian/symbian-fs.h
index 339e998a28..1327f9f2e9 100644
--- a/backends/fs/symbian/symbian-fs.h
+++ b/backends/fs/symbian/symbian-fs.h
@@ -66,6 +66,7 @@ public:
virtual Common::SeekableReadStream *createReadStream();
virtual Common::WriteStream *createWriteStream();
+ virtual bool create(bool isDirectory);
};
#endif
diff --git a/backends/fs/wii/wii-fs.cpp b/backends/fs/wii/wii-fs.cpp
index 43f4f592b7..e036b75019 100644
--- a/backends/fs/wii/wii-fs.cpp
+++ b/backends/fs/wii/wii-fs.cpp
@@ -168,7 +168,7 @@ bool WiiFilesystemNode::getChildren(AbstractFSList &list, ListMode mode, bool hi
if (newPath.lastChar() != '/')
newPath += '/';
newPath += pent->d_name;
-
+
bool isDir = false;
tmpdir = opendir(newPath.c_str());
if(tmpdir)
@@ -176,17 +176,17 @@ bool WiiFilesystemNode::getChildren(AbstractFSList &list, ListMode mode, bool hi
isDir = true;
closedir(tmpdir);
}
-
+
if ((mode == Common::FSNode::kListFilesOnly && isDir) ||
(mode == Common::FSNode::kListDirectoriesOnly && !isDir))
continue;
-
+
struct stat st;
st.st_mode = 0;
st.st_mode |= ( isDir ? S_IFDIR : 0 );
st.st_mode |= S_IRUSR;
st.st_mode |= S_IWUSR;
-
+
list.push_back(new WiiFilesystemNode(newPath, &st));
}
@@ -213,4 +213,9 @@ Common::WriteStream *WiiFilesystemNode::createWriteStream() {
return StdioStream::makeFromPath(getPath(), true);
}
+bool WiiFilesystemNode::create(bool isDirectory) {
+ error("Not supported");
+ return false;
+}
+
#endif //#if defined(__WII__)
diff --git a/backends/fs/wii/wii-fs.h b/backends/fs/wii/wii-fs.h
index c77c543dae..affb765884 100644
--- a/backends/fs/wii/wii-fs.h
+++ b/backends/fs/wii/wii-fs.h
@@ -69,6 +69,7 @@ public:
virtual Common::SeekableReadStream *createReadStream();
virtual Common::WriteStream *createWriteStream();
+ virtual bool create(bool isDirectory);
};
#endif
diff --git a/backends/fs/windows/windows-fs.cpp b/backends/fs/windows/windows-fs.cpp
index 49549b83cb..b43686f911 100644
--- a/backends/fs/windows/windows-fs.cpp
+++ b/backends/fs/windows/windows-fs.cpp
@@ -244,4 +244,36 @@ Common::WriteStream *WindowsFilesystemNode::createWriteStream() {
return StdioStream::makeFromPath(getPath(), true);
}
+bool WindowsFilesystemNode::create(bool isDirectory) {
+ bool success;
+
+ if (isDirectory) {
+ success = CreateDirectory(toUnicode(_path.c_str()), NULL) != 0;
+ } else {
+ success = CreateFile(toUnicode(_path.c_str()), GENERIC_READ|GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL) != INVALID_HANDLE_VALUE;
+ }
+
+ if (success) {
+ //this piece is copied from constructor, it checks that file exists and detects whether it's a directory
+ DWORD fileAttribs = GetFileAttributes(toUnicode(_path.c_str()));
+ if (fileAttribs != INVALID_FILE_ATTRIBUTES) {
+ _isDirectory = ((fileAttribs & FILE_ATTRIBUTE_DIRECTORY) != 0);
+ _isValid = true;
+ // Add a trailing slash, if necessary.
+ if (_isDirectory && _path.lastChar() != '\\') {
+ _path += '\\';
+ }
+
+ if (_isDirectory != isDirectory) warning("failed to create %s: got %s", isDirectory ? "directory" : "file", _isDirectory ? "directory" : "file");
+ return _isDirectory == isDirectory;
+ }
+
+ warning("WindowsFilesystemNode: Create%s() was a success, but GetFileAttributes() indicates there is no such %s",
+ isDirectory ? "Directory" : "File", isDirectory ? "directory" : "file");
+ return false;
+ }
+
+ return false;
+}
+
#endif //#ifdef WIN32
diff --git a/backends/fs/windows/windows-fs.h b/backends/fs/windows/windows-fs.h
index d06044603a..7c9f2c1e1a 100644
--- a/backends/fs/windows/windows-fs.h
+++ b/backends/fs/windows/windows-fs.h
@@ -88,6 +88,7 @@ public:
virtual Common::SeekableReadStream *createReadStream();
virtual Common::WriteStream *createWriteStream();
+ virtual bool create(bool isDirectory);
private:
/**