aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndre Heider2009-01-16 19:32:19 +0000
committerAndre Heider2009-01-16 19:32:19 +0000
commit9f1ac87466717d2095539ea9a2a37c77698605fc (patch)
tree33a84f3b9d871a927a73e71268eae04060fb76dd
parente9f0fc21e84b78d5b7f48bcdfca4e083b7026cc5 (diff)
downloadscummvm-rg350-9f1ac87466717d2095539ea9a2a37c77698605fc.tar.gz
scummvm-rg350-9f1ac87466717d2095539ea9a2a37c77698605fc.tar.bz2
scummvm-rg350-9f1ac87466717d2095539ea9a2a37c77698605fc.zip
Reuse given stat flags when possible to avoid fstat() calls
svn-id: r35872
-rw-r--r--backends/fs/wii/wii-fs-factory.cpp4
-rw-r--r--backends/fs/wii/wii-fs.cpp69
2 files changed, 50 insertions, 23 deletions
diff --git a/backends/fs/wii/wii-fs-factory.cpp b/backends/fs/wii/wii-fs-factory.cpp
index 0112ffa150..6bc07dd161 100644
--- a/backends/fs/wii/wii-fs-factory.cpp
+++ b/backends/fs/wii/wii-fs-factory.cpp
@@ -37,13 +37,13 @@ AbstractFSNode *WiiFilesystemFactory::makeCurrentDirectoryFileNode() const {
char buf[MAXPATHLEN];
if (getcwd(buf, MAXPATHLEN))
- return new WiiFilesystemNode(buf, true);
+ return new WiiFilesystemNode(buf);
else
return new WiiFilesystemNode();
}
AbstractFSNode *WiiFilesystemFactory::makeFileNodePath(const Common::String &path) const {
- return new WiiFilesystemNode(path, true);
+ return new WiiFilesystemNode(path);
}
#endif
diff --git a/backends/fs/wii/wii-fs.cpp b/backends/fs/wii/wii-fs.cpp
index cbecce2d05..4064e271db 100644
--- a/backends/fs/wii/wii-fs.cpp
+++ b/backends/fs/wii/wii-fs.cpp
@@ -42,10 +42,12 @@ class WiiFilesystemNode : public AbstractFSNode {
protected:
Common::String _displayName;
Common::String _path;
- bool _isDirectory, _isReadable, _isWritable;
+ bool _exists, _isDirectory, _isReadable, _isWritable;
virtual void initRootNode();
virtual bool getDevopChildren(AbstractFSList &list, ListMode mode, bool hidden) const;
+ virtual void setFlags(const struct stat st);
+ virtual void clearFlags();
public:
/**
@@ -57,9 +59,9 @@ public:
* Creates a WiiFilesystemNode 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.
*/
- WiiFilesystemNode(const Common::String &path, bool verify);
+ WiiFilesystemNode(const Common::String &path);
+ WiiFilesystemNode(const Common::String &p, const struct stat st);
virtual bool exists() const;
virtual Common::String getDisplayName() const { return _displayName; }
@@ -92,7 +94,7 @@ bool WiiFilesystemNode::getDevopChildren(AbstractFSList &list, ListMode mode, bo
if (!dt || !dt->name || !dt->open_r || !dt->diropen_r)
continue;
- list.push_back(new WiiFilesystemNode(Common::String(dt->name) + ":/", true));
+ list.push_back(new WiiFilesystemNode(Common::String(dt->name) + ":/"));
}
return true;
@@ -102,16 +104,31 @@ void WiiFilesystemNode::initRootNode() {
_path.clear();
_displayName = "<devices>";
+ _exists = true;
_isDirectory = true;
_isReadable = false;
_isWritable = false;
}
+void WiiFilesystemNode::clearFlags() {
+ _exists = false;
+ _isDirectory = false;
+ _isReadable = false;
+ _isWritable = false;
+}
+
+void WiiFilesystemNode::setFlags(const struct stat st) {
+ _exists = true;
+ _isDirectory = S_ISDIR(st.st_mode);
+ _isReadable = (st.st_mode & S_IRUSR) > 0;
+ _isWritable = (st.st_mode & S_IWUSR) > 0;
+}
+
WiiFilesystemNode::WiiFilesystemNode() {
initRootNode();
}
-WiiFilesystemNode::WiiFilesystemNode(const Common::String &p, bool verify) {
+WiiFilesystemNode::WiiFilesystemNode(const Common::String &p) {
if (p.empty()) {
initRootNode();
return;
@@ -124,34 +141,44 @@ WiiFilesystemNode::WiiFilesystemNode(const Common::String &p, bool verify) {
else
_displayName = lastPathComponent(_path, '/');
- if (verify) {
- _isDirectory = false;
- _isReadable = false;
- _isWritable = false;
-
- struct stat st;
- if (!stat(_path.c_str(), &st)) {
- _isDirectory = S_ISDIR(st.st_mode);
- _isReadable = (st.st_mode & S_IRUSR) > 0;
- _isWritable = (st.st_mode & S_IWUSR) > 0;
- }
+ struct stat st;
+ if (!stat(_path.c_str(), &st))
+ setFlags(st);
+ else
+ clearFlags();
+}
+
+WiiFilesystemNode::WiiFilesystemNode(const Common::String &p, const struct stat st) {
+ if (p.empty()) {
+ initRootNode();
+ return;
}
+
+ _path = p;
+
+ if (_path.hasSuffix(":/"))
+ _displayName = _path;
+ else
+ _displayName = lastPathComponent(_path, '/');
+
+ setFlags(st);
}
bool WiiFilesystemNode::exists() const {
- struct stat st;
- return stat(_path.c_str (), &st) == 0;
+ return _exists;
}
AbstractFSNode *WiiFilesystemNode::getChild(const Common::String &n) const {
assert(_isDirectory);
+ assert(!n.contains('/'));
+
Common::String newPath(_path);
if (newPath.lastChar() != '/')
newPath += '/';
newPath += n;
- return new WiiFilesystemNode(newPath, true);
+ return new WiiFilesystemNode(newPath);
}
bool WiiFilesystemNode::getChildren(AbstractFSList &list, ListMode mode, bool hidden) const {
@@ -186,7 +213,7 @@ bool WiiFilesystemNode::getChildren(AbstractFSList &list, ListMode mode, bool hi
if (isDir)
newPath += '/';
- list.push_back(new WiiFilesystemNode(newPath, true));
+ list.push_back(new WiiFilesystemNode(newPath, st));
}
dirclose(dp);
@@ -201,7 +228,7 @@ AbstractFSNode *WiiFilesystemNode::getParent() const {
const char *start = _path.c_str();
const char *end = lastPathComponent(_path, '/');
- return new WiiFilesystemNode(Common::String(start, end - start), true);
+ return new WiiFilesystemNode(Common::String(start, end - start));
}
Common::SeekableReadStream *WiiFilesystemNode::openForReading() {