From 3b27b9fa438611c3a05fcf2d07a3dfde6be192fa Mon Sep 17 00:00:00 2001 From: Robert Göffringmann Date: Mon, 3 Mar 2008 00:41:59 +0000 Subject: the ps2 changes from the 0.11.1 release, plus some bugfixes and cleanup. svn-id: r31034 --- backends/fs/ps2/ps2-fs-factory.cpp | 16 +++- backends/fs/ps2/ps2-fs-factory.h | 12 +-- backends/fs/ps2/ps2-fs.cpp | 176 ++++++++++++++++++++++++++++++------- 3 files changed, 161 insertions(+), 43 deletions(-) (limited to 'backends/fs') 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 { +class Ps2FilesystemFactory : public FilesystemFactory, public Common::Singleton { 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; }; 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 #include #include -#include "asyncfio.h" -#include "systemps2.h" +#include +#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"; +} + -- cgit v1.2.3