diff options
author | Fabio Battaglia | 2009-12-30 21:11:38 +0000 |
---|---|---|
committer | Fabio Battaglia | 2009-12-30 21:11:38 +0000 |
commit | a108df30a753bc062d2e2c041c70a4477f08b671 (patch) | |
tree | 13e38c42b014fa280f3a1be3aa950754dca3837e /backends/fs | |
parent | 0de5bac3498e9e9d158e4055c08475e04a00e7b3 (diff) | |
download | scummvm-rg350-a108df30a753bc062d2e2c041c70a4477f08b671.tar.gz scummvm-rg350-a108df30a753bc062d2e2c041c70a4477f08b671.tar.bz2 scummvm-rg350-a108df30a753bc062d2e2c041c70a4477f08b671.zip |
Add Nintendo 64 port to trunk.
svn-id: r46773
Diffstat (limited to 'backends/fs')
-rw-r--r-- | backends/fs/n64/n64-fs-factory.cpp | 47 | ||||
-rw-r--r-- | backends/fs/n64/n64-fs-factory.h | 42 | ||||
-rw-r--r-- | backends/fs/n64/n64-fs.cpp | 213 | ||||
-rw-r--r-- | backends/fs/stdiostream.cpp | 22 |
4 files changed, 324 insertions, 0 deletions
diff --git a/backends/fs/n64/n64-fs-factory.cpp b/backends/fs/n64/n64-fs-factory.cpp new file mode 100644 index 0000000000..7e314693b8 --- /dev/null +++ b/backends/fs/n64/n64-fs-factory.cpp @@ -0,0 +1,47 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ + */ + +#ifdef __N64__ + +#include <n64utils.h> + +#include "backends/fs/n64/n64-fs-factory.h" +#include "backends/fs/n64/n64-fs.cpp" + +AbstractFSNode *N64FilesystemFactory::makeRootFileNode() const { + return new N64FilesystemNode(); +} + +AbstractFSNode *N64FilesystemFactory::makeCurrentDirectoryFileNode() const { + char buf[MAXPATHLEN]; + return romfs_getcwd(buf, MAXPATHLEN) ? new N64FilesystemNode(Common::String(buf), false) : NULL; +} + +AbstractFSNode *N64FilesystemFactory::makeFileNodePath(const Common::String &path) const { + assert(!path.empty()); + return new N64FilesystemNode(path, false); +} + +#endif + diff --git a/backends/fs/n64/n64-fs-factory.h b/backends/fs/n64/n64-fs-factory.h new file mode 100644 index 0000000000..915153c6f8 --- /dev/null +++ b/backends/fs/n64/n64-fs-factory.h @@ -0,0 +1,42 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ + */ + +#ifndef N64_FILESYSTEM_FACTORY_H +#define N64_FILESYSTEM_FACTORY_H + +#include <romfs.h> +#include "backends/fs/fs-factory.h" + +/** + * Creates N64FilesystemNode objects. + * + * Parts of this class are documented in the base interface class, FilesystemFactory. + */ +class N64FilesystemFactory : public FilesystemFactory { + virtual AbstractFSNode *makeRootFileNode() const; + virtual AbstractFSNode *makeCurrentDirectoryFileNode() const; + virtual AbstractFSNode *makeFileNodePath(const Common::String &path) const; +}; + +#endif /*N64_FILESYSTEM_FACTORY_H*/ diff --git a/backends/fs/n64/n64-fs.cpp b/backends/fs/n64/n64-fs.cpp new file mode 100644 index 0000000000..514e3be02d --- /dev/null +++ b/backends/fs/n64/n64-fs.cpp @@ -0,0 +1,213 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifdef __N64__ + +#include "backends/fs/abstract-fs.h" +#include "backends/fs/stdiostream.h" + +#include <sys/param.h> + +#include <unistd.h> + +#include <n64utils.h> + +#define ROOT_PATH "/" + +/** + * Implementation of the ScummVM file system API based on N64 Hkz romfs. + * + * Parts of this class are documented in the base interface class, AbstractFSNode. + */ +class N64FilesystemNode : public AbstractFSNode { +protected: + Common::String _displayName; + Common::String _path; + bool _isDirectory; + bool _isValid; + +public: + /** + * Creates a N64FilesystemNode with the root node as path. + */ + N64FilesystemNode(); + + /** + * Creates a N64FilesystemNode for a given path. + * + * @param path Common::String with the path the new node should point to. + * @param verify true if the isValid and isDirectory flags should be verified during the construction. + */ + N64FilesystemNode(const Common::String &p, bool verify = true); + + virtual bool exists() const; + virtual Common::String getDisplayName() const { + return _displayName; + } + virtual Common::String getName() const { + return _displayName; + } + virtual Common::String getPath() const { + return _path; + } + virtual bool isDirectory() const { + return _isDirectory; + } + virtual bool isReadable() const; + virtual bool isWritable() const; + + virtual AbstractFSNode *getChild(const Common::String &n) const; + virtual bool getChildren(AbstractFSList &list, ListMode mode, bool hidden) const; + virtual AbstractFSNode *getParent() const; + + virtual Common::SeekableReadStream *createReadStream(); + virtual Common::WriteStream *createWriteStream(); +}; + +N64FilesystemNode::N64FilesystemNode() { + _isDirectory = true; + _displayName = "Root"; + _isValid = true; + _path = ROOT_PATH; +} + +N64FilesystemNode::N64FilesystemNode(const Common::String &p, bool verify) { + assert(p.size() > 0); + + _path = p; + _displayName = lastPathComponent(_path, '/'); + _isValid = true; + _isDirectory = true; + + // Check if it's a dir + ROMFILE *tmpfd = romfs_open(p.c_str(), "r"); + if (tmpfd) { + _isDirectory = (tmpfd->type == 0 || tmpfd->type == 1); + romfs_close(tmpfd); + } +} + +bool N64FilesystemNode::exists() const { + int ret = -1; + + ret = romfs_access(_path.c_str(), F_OK); + + return ret == 0; +} + +bool N64FilesystemNode::isReadable() const { + int ret = -1; + + ret = romfs_access(_path.c_str(), R_OK); + + return ret == 0; +} + +// We can't write on ROMFS! +bool N64FilesystemNode::isWritable() const { + return false; +} + + +AbstractFSNode *N64FilesystemNode::getChild(const Common::String &n) 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); + + Common::String newPath(_path); + if (_path.lastChar() != '/') + newPath += '/'; + newPath += n; + + return new N64FilesystemNode(newPath, true); +} + +bool N64FilesystemNode::getChildren(AbstractFSList &myList, ListMode mode, bool hidden) const { + assert(_isDirectory); + ROMDIR *dirp = romfs_opendir(_path.c_str()); + romfs_dirent *dp; + + if (dirp == NULL) + return false; + + // loop over dir entries using readdir + while ((dp = romfs_readdir(dirp)) != NULL) { + // Skip 'invisible' files if necessary + if (dp->entryname[0] == '.' && !hidden) { + free(dp); + continue; + } + // Skip '.' and '..' to avoid cycles + if ((dp->entryname[0] == '.' && dp->entryname[1] == 0) || (dp->entryname[0] == '.' && dp->entryname[1] == '.')) { + free(dp); + continue; + } + + // Start with a clone of this node, with the correct path set + N64FilesystemNode entry(*this); + entry._displayName = dp->entryname; + if (_path.lastChar() != '/') + entry._path += '/'; + entry._path += entry._displayName; + + // Force validity for now... + entry._isValid = 1; + + entry._isDirectory = (dp->type == 0 || dp->type == 1); + + // Honor the chosen mode + if ((mode == Common::FSNode::kListFilesOnly && entry._isDirectory) || + (mode == Common::FSNode::kListDirectoriesOnly && !entry._isDirectory)) { + + free(dp); + continue; + } + + myList.push_back(new N64FilesystemNode(entry)); + + free(dp); + } + romfs_closedir(dirp); + + return true; +} + +AbstractFSNode *N64FilesystemNode::getParent() const { + if (_path == ROOT_PATH) + return 0; + + const char *start = _path.c_str(); + const char *end = lastPathComponent(_path, '/'); + + return new N64FilesystemNode(Common::String(start, end - start), false); +} + +Common::SeekableReadStream *N64FilesystemNode::createReadStream() { + return StdioStream::makeFromPath(getPath(), false); +} + +Common::WriteStream *N64FilesystemNode::createWriteStream() { + return StdioStream::makeFromPath(getPath(), true); +} + +#endif //#ifdef __N64__ + diff --git a/backends/fs/stdiostream.cpp b/backends/fs/stdiostream.cpp index 8845d796c6..73796a31ea 100644 --- a/backends/fs/stdiostream.cpp +++ b/backends/fs/stdiostream.cpp @@ -25,6 +25,28 @@ #include "backends/fs/stdiostream.h" +#ifdef __N64__ + #include <romfs.h> + + #undef feof + #undef clearerr + #undef ferror + + #undef FILE + #define FILE ROMFILE + + #define fopen(name, mode) romfs_open(name, mode) + #define fclose(handle) romfs_close(handle) + #define fread(ptr, size, items, file) romfs_read(ptr, size, items, file) + #define fwrite(ptr, size, items, file) romfs_write(ptr, size, items, file) + #define feof(handle) romfs_eof(handle) + #define ftell(handle) romfs_tell(handle) + #define fseek(handle, offset, whence) romfs_seek(handle, offset, whence) + #define clearerr(handle) romfs_clearerr(handle) + #define fflush(file) romfs_flush(file) + #define ferror(handle) romfs_error(handle) +#endif + StdioStream::StdioStream(void *handle) : _handle(handle) { assert(handle); } |