aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Corrales2007-10-31 19:37:34 +0000
committerDavid Corrales2007-10-31 19:37:34 +0000
commit6afbcc89a7cd5df7e4dc15448efbc2d2fbabc74b (patch)
treecb968caa739da2372d8591479806cc54bd577dd5
parentdc29c25b715a8bde4eb0e0a19529f656c5b5123e (diff)
downloadscummvm-rg350-6afbcc89a7cd5df7e4dc15448efbc2d2fbabc74b.tar.gz
scummvm-rg350-6afbcc89a7cd5df7e4dc15448efbc2d2fbabc74b.tar.bz2
scummvm-rg350-6afbcc89a7cd5df7e4dc15448efbc2d2fbabc74b.zip
Factorize most of the common code in the isReadable() and isWritable() methods for the AmigaOS backend, via the getFibProtection() method.
svn-id: r29342
-rw-r--r--backends/fs/amigaos4/amigaos4-fs.cpp98
1 files changed, 50 insertions, 48 deletions
diff --git a/backends/fs/amigaos4/amigaos4-fs.cpp b/backends/fs/amigaos4/amigaos4-fs.cpp
index e195ee5629..d4bf58c7e3 100644
--- a/backends/fs/amigaos4/amigaos4-fs.cpp
+++ b/backends/fs/amigaos4/amigaos4-fs.cpp
@@ -56,6 +56,14 @@ protected:
String _sPath;
bool _bIsDirectory;
bool _bIsValid;
+
+ /**
+ * Obtain the FileInfoBlock protection value for this FilesystemNode,
+ * as defined in the <proto/dos.h> header.
+ *
+ * @return -1 if there were errors, 0 or a positive integer otherwise.
+ */
+ virtual int getFibProtection() const;
public:
/**
@@ -398,6 +406,30 @@ bool AmigaOSFilesystemNode::getChildren(AbstractFSList &myList, ListMode mode, b
return true;
}
+int AmigaOSFilesystemNode::getFibProtection() const {
+ ENTER();
+
+ int fibProt = -1;
+ struct FileInfoBlock *fib = (struct FileInfoBlock *)IDOS->AllocDosObject(DOS_FIB, NULL);
+ if (!fib) {
+ debug(6, "FileInfoBlock is NULL");
+ LEAVE();
+ return fibProt;
+ }
+
+ BPTR pLock = IDOS->Lock((STRPTR)_sPath.c_str(), SHARED_LOCK);
+ if (pLock) {
+ if (IDOS->Examine(pLock, fib) != DOSFALSE) {
+ fibProt = fib->fib_Protection;
+ }
+ IDOS->UnLock(pLock);
+ }
+
+ IDOS->FreeDosObject(DOS_FIB, fib);
+ LEAVE();
+ return fibProt;
+}
+
AbstractFilesystemNode *AmigaOSFilesystemNode::getParent() const {
ENTER();
@@ -429,64 +461,34 @@ AbstractFilesystemNode *AmigaOSFilesystemNode::getParent() const {
}
bool AmigaOSFilesystemNode::isReadable() const {
- ENTER();
+ bool readable = false;
+ int fibProt = getFibProtection();
- bool readable = false;
- struct FileInfoBlock *fib = (struct FileInfoBlock *)IDOS->AllocDosObject(DOS_FIB, NULL);
- if (!fib) {
- debug(6, "FileInfoBlock is NULL");
- LEAVE();
- return false;
- }
-
- BPTR pLock = IDOS->Lock((STRPTR)_sPath.c_str(), SHARED_LOCK);
- if (pLock) {
- if (IDOS->Examine(pLock, fib) != DOSFALSE) {
- /* The fib_Protection flag is low-active or inverted, thus the negation.
- *
- * For more information, consult the compiler/include/dos/dos.h
- * file from the AROS source (http://aros.sourceforge.net/).
- */
- if (!(fib->fib_Protection & FIBF_READ)) {
- readable = true;
- }
- }
- IDOS->UnLock(pLock);
+ if (fibProt >= 0) {
+ /* The fib_Protection flag is low-active or inverted, thus the negation.
+ *
+ * For more information, consult the compiler/include/dos/dos.h
+ * file from the AROS source (http://aros.sourceforge.net/).
+ */
+ readable = !(fibProt & FIBF_READ);
}
- IDOS->FreeDosObject(DOS_FIB, fib);
- LEAVE();
return readable;
}
bool AmigaOSFilesystemNode::isWritable() const {
- ENTER();
+ bool writable = false;
+ int fibProt = getFibProtection();
- bool writable = false;
- struct FileInfoBlock *fib = (struct FileInfoBlock *)IDOS->AllocDosObject(DOS_FIB, NULL);
- if (!fib) {
- debug(6, "FileInfoBlock is NULL");
- LEAVE();
- return false;
+ if (fibProt >= 0) {
+ /* The fib_Protection flag is low-active or inverted, thus the negation.
+ *
+ * For more information, consult the compiler/include/dos/dos.h
+ * file from the AROS source (http://aros.sourceforge.net/).
+ */
+ writable = !(fibProt & FIBF_WRITE);
}
- BPTR pLock = IDOS->Lock((STRPTR)_sPath.c_str(), SHARED_LOCK);
- if (pLock) {
- if (IDOS->Examine(pLock, fib) != DOSFALSE) {
- /* The fib_Protection flag is low-active or inverted, thus the negation.
- *
- * For more information, consult the compiler/include/dos/dos.h
- * file from the AROS source (http://aros.sourceforge.net/).
- */
- if (!(fib->fib_Protection & FIBF_WRITE)) {
- writable = true;
- }
- }
- IDOS->UnLock(pLock);
- }
-
- IDOS->FreeDosObject(DOS_FIB, fib);
- LEAVE();
return writable;
}