aboutsummaryrefslogtreecommitdiff
path: root/backends/fs
diff options
context:
space:
mode:
authorRobert Göffringmann2008-03-03 00:41:59 +0000
committerRobert Göffringmann2008-03-03 00:41:59 +0000
commit3b27b9fa438611c3a05fcf2d07a3dfde6be192fa (patch)
tree8605c47d67b779fb33ce4dda3a64a7d3caecdb4d /backends/fs
parentfc91de07dfdfe6bd29edadf739f324f30f5624d0 (diff)
downloadscummvm-rg350-3b27b9fa438611c3a05fcf2d07a3dfde6be192fa.tar.gz
scummvm-rg350-3b27b9fa438611c3a05fcf2d07a3dfde6be192fa.tar.bz2
scummvm-rg350-3b27b9fa438611c3a05fcf2d07a3dfde6be192fa.zip
the ps2 changes from the 0.11.1 release, plus some bugfixes and cleanup.
svn-id: r31034
Diffstat (limited to 'backends/fs')
-rw-r--r--backends/fs/ps2/ps2-fs-factory.cpp16
-rw-r--r--backends/fs/ps2/ps2-fs-factory.h12
-rw-r--r--backends/fs/ps2/ps2-fs.cpp176
3 files changed, 161 insertions, 43 deletions
diff --git a/backends/fs/ps2/ps2-fs-factory.cpp b/backends/fs/ps2/ps2-fs-factory.cpp
index 7585e4f20a..b960e39a24 100644
--- a/backends/fs/ps2/ps2-fs-factory.cpp
+++ b/backends/fs/ps2/ps2-fs-factory.cpp
@@ -22,7 +22,6 @@
* $Id$
*/
-#if defined(__PLAYSTATION2__)
#include "backends/fs/ps2/ps2-fs-factory.h"
#include "backends/fs/ps2/ps2-fs.cpp"
@@ -37,6 +36,17 @@ AbstractFilesystemNode *Ps2FilesystemFactory::makeCurrentDirectoryFileNode() con
}
AbstractFilesystemNode *Ps2FilesystemFactory::makeFileNodePath(const String &path) const {
- return new Ps2FilesystemNode(path);
+ // return new Ps2FilesystemNode(path);
+
+ Ps2FilesystemNode *nf = new Ps2FilesystemNode(path, true);
+/*
+ int fd = fio.dopen(path.c_str());
+ if (fd < 0) {
+ nf->_isDirectory = false;
+ }
+ else {
+ fio.dclose(fd);
+ }
+*/
+ return nf; // new Ps2FilesystemNode(path, true);
}
-#endif
diff --git a/backends/fs/ps2/ps2-fs-factory.h b/backends/fs/ps2/ps2-fs-factory.h
index 1b74ae25d1..416024c905 100644
--- a/backends/fs/ps2/ps2-fs-factory.h
+++ b/backends/fs/ps2/ps2-fs-factory.h
@@ -30,20 +30,20 @@
/**
* Creates PS2FilesystemNode objects.
- *
- * Parts of this class are documented in the base interface class, FilesystemFactory.
+ *
+ * Parts of this class are documented in the base interface class, AbstractFilesystemFactory.
*/
-class Ps2FilesystemFactory : public FilesystemFactory, public Common::Singleton<Ps2FilesystemFactory> {
+class Ps2FilesystemFactory : public FilesystemFactory, public Common::Singleton<Ps2FilesystemFactory> {
public:
typedef Common::String String;
-
+
virtual AbstractFilesystemNode *makeRootFileNode() const;
virtual AbstractFilesystemNode *makeCurrentDirectoryFileNode() const;
virtual AbstractFilesystemNode *makeFileNodePath(const String &path) const;
-
+
protected:
Ps2FilesystemFactory() {};
-
+
private:
friend class Common::Singleton<SingletonBaseType>;
};
diff --git a/backends/fs/ps2/ps2-fs.cpp b/backends/fs/ps2/ps2-fs.cpp
index b972887f94..782e97b959 100644
--- a/backends/fs/ps2/ps2-fs.cpp
+++ b/backends/fs/ps2/ps2-fs.cpp
@@ -26,49 +26,73 @@
#include <kernel.h>
#include <stdio.h>
#include <stdlib.h>
-#include "asyncfio.h"
-#include "systemps2.h"
+#include <unistd.h>
+#include "backends/platform/ps2/asyncfio.h"
+#include "backends/platform/ps2/fileio.h"
+#include "backends/platform/ps2/systemps2.h"
+#include "backends/platform/ps2/ps2debug.h"
+
+#define DEFAULT_MODE (FIO_S_IRUSR | FIO_S_IWUSR | FIO_S_IRGRP | FIO_S_IWGRP | FIO_S_IROTH | FIO_S_IWOTH)
extern AsyncFio fio;
extern OSystem_PS2 *g_systemPs2;
/**
* Implementation of the ScummVM file system API based on the Ps2SDK.
- *
+ *
* Parts of this class are documented in the base interface class, AbstractFilesystemNode.
*/
class Ps2FilesystemNode : public AbstractFilesystemNode {
+
+friend class Ps2FilesystemFactory;
+
protected:
String _displayName;
String _path;
bool _isDirectory;
bool _isRoot;
+private:
+ char *getDeviceDescription(const char *path) const;
+ bool getDirectoryFlag(const char *path);
+
public:
/**
* Creates a PS2FilesystemNode with the root node as path.
*/
Ps2FilesystemNode();
-
+
/**
* Creates a PS2FilesystemNode for a given path.
- *
+ *
* @param path String with the path the new node should point to.
*/
Ps2FilesystemNode(const String &path);
-
+ Ps2FilesystemNode(const String &path, bool verify);
+
/**
* Copy constructor.
*/
Ps2FilesystemNode(const Ps2FilesystemNode *node);
- virtual bool exists() const { return true; } //FIXME: this is just a stub
+ virtual bool exists(void) const;
+
virtual String getDisplayName() const { return _displayName; }
virtual String getName() const { return _displayName; }
virtual String getPath() const { return _path; }
- virtual bool isDirectory() const { return _isDirectory; }
- virtual bool isReadable() const { return true; } //FIXME: this is just a stub
- virtual bool isWritable() const { return true; } //FIXME: this is just a stub
+
+ virtual bool isDirectory() const {
+ return _isDirectory;
+ }
+
+ virtual bool isReadable() const {
+ return exists();
+ }
+
+ virtual bool isWritable() const {
+ // The only writable device on the ps2 is the memory card
+ return false;
+ }
virtual AbstractFilesystemNode *clone() const { return new Ps2FilesystemNode(this); }
virtual AbstractFilesystemNode *getChild(const String &n) const;
@@ -78,18 +102,24 @@ public:
/**
* Returns the last component of a given path.
- *
+ *
* @param str String containing the path.
* @return Pointer to the first char of the last component inside str.
*/
const char *lastPathComponent(const Common::String &str) {
- //FIXME: implement this method properly.
- // This code is probably around the constructors,
- // but I couldn't figure it out without having
- // doubts on the correctness of my assumptions.
- // Therefore, I leave it to the porter to correctly
- // implement this method.
- assert(false);
+ if (str.empty())
+ return "";
+
+ const char *start = str.c_str();
+ const char *cur = start + str.size() - 2;
+
+ while (cur >= start && *cur != '/' && *cur != ':') {
+ --cur;
+ }
+
+ printf("romeo : lastPathComponent = %s\n", cur + 1);
+
+ return cur + 1;
}
Ps2FilesystemNode::Ps2FilesystemNode() {
@@ -113,13 +143,34 @@ Ps2FilesystemNode::Ps2FilesystemNode(const String &path) {
dsplName = pos;
if (dsplName)
_displayName = String(dsplName);
- else {
- if (strncmp(path.c_str(), "cdfs", 4) == 0)
- _displayName = "DVD Drive";
- else if (strncmp(path.c_str(), "mass", 4) == 0)
- _displayName = "USB Mass Storage";
+ else
+ _displayName = getDeviceDescription(path.c_str());
+ }
+}
+
+Ps2FilesystemNode::Ps2FilesystemNode(const String &path, bool verify) {
+ _path = path;
+
+ if (strcmp(path.c_str(), "") == 0) {
+ _isRoot = true; /* root is always a dir*/
+ _displayName = String("PlayStation 2");
+ _isDirectory = true;
+ } else {
+ _isRoot = false;
+ const char *dsplName = NULL, *pos = path.c_str();
+ while (*pos)
+ if (*pos++ == '/')
+ dsplName = pos;
+
+ if (dsplName) {
+ _displayName = String(dsplName);
+ if (verify)
+ _isDirectory = getDirectoryFlag(path.c_str());
else
- _displayName = "Harddisk";
+ _isDirectory = false;
+ } else {
+ _displayName = getDeviceDescription(path.c_str());
+ _isDirectory = true; /* devices are always dir */
}
}
}
@@ -131,6 +182,52 @@ Ps2FilesystemNode::Ps2FilesystemNode(const Ps2FilesystemNode *node) {
_isRoot = node->_isRoot;
}
+bool Ps2FilesystemNode::exists(void) const {
+
+ dbg_printf("Ps2FilesystemNode::exists: path \"%s\": ", _path.c_str());
+
+ if (_path[4] != ':') { // don't bother for relative path... they always fail on PS2!
+ dbg_printf("NO, relative path\n");
+ return false;
+ }
+
+ if (_path[0] == 'h') { // bypass host
+ dbg_printf("NO, host device ignored\n");
+ return false;
+ }
+
+ int fd = fio.open(_path.c_str(), O_RDONLY);
+ if (fd == -EISDIR) {
+ dbg_printf("YES, directory\n");
+ return true;
+ } else if (fd >= 0) {
+ dbg_printf("YES, file\n");
+ fio.close(fd);
+ return true;
+ }
+
+ printf("NO, not found\n");
+ return false;
+}
+
+bool Ps2FilesystemNode::getDirectoryFlag(const char *path) {
+ if (strncmp(path, "host:", 5) == 0)
+ return true; // Can't get listings from host: right now
+
+ int fd = fio.open(_path.c_str(), O_RDONLY);
+
+ if (fd == -EISDIR) {
+ dbg_printf(" romeo : new node [ %s ] is a dir\n", path);
+ return true;
+ } else if (fd >=0) {
+ dbg_printf(" romeo : new node [ %s ] is -not- a dir (%d)\n", path, fd);
+ fio.close(fd);
+ } else
+ dbg_printf(" romeo : new node [ %s ] is -not- (%d)\n", path, fd);
+
+ return false;
+}
+
AbstractFilesystemNode *Ps2FilesystemNode::getChild(const String &n) const {
if (!_isDirectory)
return NULL;
@@ -138,10 +235,10 @@ AbstractFilesystemNode *Ps2FilesystemNode::getChild(const String &n) const {
char listDir[256];
sprintf(listDir, "%s/", _path.c_str());
int fd = fio.dopen(listDir);
-
+
if (fd >= 0) {
iox_dirent_t dirent;
-
+
while (fio.dread(fd, &dirent) > 0) {
if (strcmp(n.c_str(), dirent.name) == 0) {
Ps2FilesystemNode *dirEntry = new Ps2FilesystemNode();
@@ -161,13 +258,13 @@ AbstractFilesystemNode *Ps2FilesystemNode::getChild(const String &n) const {
}
fio.dclose(fd);
}
-
+
return NULL;
}
bool Ps2FilesystemNode::getChildren(AbstractFSList &list, ListMode mode, bool hidden) const {
//TODO: honor the hidden flag
-
+
if (!_isDirectory)
return false;
@@ -176,32 +273,32 @@ bool Ps2FilesystemNode::getChildren(AbstractFSList &list, ListMode mode, bool hi
dirEntry._isDirectory = true;
dirEntry._isRoot = false;
dirEntry._path = "cdfs:";
- dirEntry._displayName = "DVD Drive";
+ dirEntry._displayName = getDeviceDescription(dirEntry._path.c_str());
list.push_back(new Ps2FilesystemNode(&dirEntry));
if (g_systemPs2->hddPresent()) {
dirEntry._path = "pfs0:";
- dirEntry._displayName = "Harddisk";
+ dirEntry._displayName = getDeviceDescription(dirEntry._path.c_str());
list.push_back(new Ps2FilesystemNode(&dirEntry));
}
if (g_systemPs2->usbMassPresent()) {
dirEntry._path = "mass:";
- dirEntry._displayName = "USB Mass Storage";
+ dirEntry._displayName = getDeviceDescription(dirEntry._path.c_str());
list.push_back(new Ps2FilesystemNode(&dirEntry));
}
return true;
} else {
char listDir[256];
int fd;
-
- if (_path.lastChar() == '/')
+
+ if (_path.lastChar() == '/' /* || _path.lastChar() == ':'*/)
fd = fio.dopen(_path.c_str());
else {
sprintf(listDir, "%s/", _path.c_str());
fd = fio.dopen(listDir);
}
-
+
if (fd >= 0) {
iox_dirent_t dirent;
Ps2FilesystemNode dirEntry;
@@ -251,3 +348,14 @@ AbstractFilesystemNode *Ps2FilesystemNode::getParent() const {
else
return new Ps2FilesystemNode();
}
+
+
+char *Ps2FilesystemNode::getDeviceDescription(const char *path) const {
+ if (strncmp(path, "cdfs", 4) == 0)
+ return "DVD Drive";
+ else if (strncmp(path, "mass", 4) == 0)
+ return "USB Mass Storage";
+ else
+ return "Harddisk";
+}
+