aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--backends/psp/psp_fs.cpp93
1 files changed, 61 insertions, 32 deletions
diff --git a/backends/psp/psp_fs.cpp b/backends/psp/psp_fs.cpp
index 702f18a30d..582740eae4 100644
--- a/backends/psp/psp_fs.cpp
+++ b/backends/psp/psp_fs.cpp
@@ -27,8 +27,10 @@
#include "backends/fs/abstract-fs.h"
#include "backends/fs/fs.h"
-#include <stdio.h>
-#include <stdlib.h>
+
+#include <sys/stat.h>
+#include <unistd.h>
+
/*
* Implementation of the ScummVM file system API based on PSPSDK API.
@@ -45,6 +47,7 @@ protected:
public:
PSPFilesystemNode();
PSPFilesystemNode(const String &path);
+ PSPFilesystemNode(const Common::String &p, bool verify);
virtual String displayName() const { return _displayName; }
virtual bool isValid() const { return _isValid; }
@@ -53,6 +56,7 @@ public:
virtual bool listDir(AbstractFSList &list, ListMode mode) const;
virtual AbstractFilesystemNode *parent() const;
+ virtual AbstractFilesystemNode *child(const String &name) const;
};
AbstractFilesystemNode *AbstractFilesystemNode::getCurrentDirectory() {
@@ -71,17 +75,29 @@ PSPFilesystemNode::PSPFilesystemNode() {
_isPseudoRoot = true;
}
-PSPFilesystemNode::PSPFilesystemNode(const Common::String &p)
-{
+PSPFilesystemNode::PSPFilesystemNode(const Common::String &p) {
_displayName = p;
_isValid = true;
_isDirectory = true;
_path = p;
}
+PSPFilesystemNode::PSPFilesystemNode(const Common::String &p, bool verify) {
+ assert(p.size() > 0);
+
+ _path = p;
+ _displayName = _path;
+ _isValid = true;
+ _isDirectory = true;
+
+ if (verify) {
+ struct stat st;
+ _isValid = (0 == stat(_path.c_str(), &st));
+ _isDirectory = S_ISDIR(st.st_mode);
+ }
+}
-AbstractFilesystemNode *AbstractFilesystemNode::getNodeForPath(const String &path)
-{
+AbstractFilesystemNode *AbstractFilesystemNode::getNodeForPath(const String &path) {
return new PSPFilesystemNode(path);
}
@@ -89,38 +105,38 @@ AbstractFilesystemNode *AbstractFilesystemNode::getNodeForPath(const String &pat
bool PSPFilesystemNode::listDir(AbstractFSList &myList, ListMode mode) const {
assert(_isDirectory);
- int dfd;
-
- dfd = sceIoDopen(_path.c_str());
+ int dfd = sceIoDopen(_path.c_str());
if (dfd > 0) {
- SceIoDirent dir;
- memset(&dir, 0, sizeof(dir));
+ SceIoDirent dir;
+ memset(&dir, 0, sizeof(dir));
- while (sceIoDread(dfd, &dir) > 0) {
- // Skip 'invisible files
- if (dir.d_name[0] == '.')
- continue;
+ while (sceIoDread(dfd, &dir) > 0) {
+ // Skip 'invisible files
+ if (dir.d_name[0] == '.')
+ continue;
- PSPFilesystemNode entry;
+ PSPFilesystemNode entry;
- entry._isValid = true;
- entry._isPseudoRoot = false;
- entry._displayName = dir.d_name;
- entry._path = _path;
- entry._path += dir.d_name;
- entry._isDirectory = dir.d_stat.st_attr & FIO_SO_IFDIR;
- if (entry._isDirectory)
- entry._path += "/";
+ entry._isValid = true;
+ entry._isPseudoRoot = false;
+ entry._displayName = dir.d_name;
+ entry._path = _path;
+ entry._path += dir.d_name;
+ entry._isDirectory = dir.d_stat.st_attr & FIO_SO_IFDIR;
+
+ if (entry._isDirectory)
+ entry._path += "/";
- // Honor the chosen mode
- if ((mode == kListFilesOnly && entry._isDirectory) ||
- (mode == kListDirectoriesOnly && !entry._isDirectory))
- continue;
+ // Honor the chosen mode
+ if ((mode == FilesystemNode::kListFilesOnly && entry._isDirectory) ||
+ (mode == FilesystemNode::kListDirectoriesOnly && !entry._isDirectory))
+ continue;
- myList.push_back(new PSPFilesystemNode(entry));
- }
- sceIoDclose(dfd);
- return true;
+ myList.push_back(new PSPFilesystemNode(entry));
+ }
+
+ sceIoDclose(dfd);
+ return true;
} else {
return false;
}
@@ -155,4 +171,17 @@ AbstractFilesystemNode *PSPFilesystemNode::parent() const {
return p;
}
+AbstractFilesystemNode *PSPFilesystemNode::child(const String &name) const {
+ // FIXME: Pretty lame implementation! We do no error checking to speak
+ // of, do not check if this is a special node, etc.
+ assert(_isDirectory);
+ String newPath(_path);
+ if (_path.lastChar() != '/')
+ newPath += '/';
+ newPath += name;
+ PSPFilesystemNode *p = new PSPFilesystemNode(newPath, true);
+
+ return p;
+}
+
#endif // PSP