diff options
| author | Willem Jan Palenstijn | 2014-10-11 20:13:25 +0200 | 
|---|---|---|
| committer | Willem Jan Palenstijn | 2014-10-11 21:13:13 +0200 | 
| commit | 4b0995738667e05a425ecbda5c9ab37e814ebe95 (patch) | |
| tree | cb298f8454bc4938d5175a5c31c2137426e550ea /backends | |
| parent | f76e02e5d65ae235e4816ace30398c3b923a6b4a (diff) | |
| download | scummvm-rg350-4b0995738667e05a425ecbda5c9ab37e814ebe95.tar.gz scummvm-rg350-4b0995738667e05a425ecbda5c9ab37e814ebe95.tar.bz2 scummvm-rg350-4b0995738667e05a425ecbda5c9ab37e814ebe95.zip  | |
AMIGAOS4: Fix getParent() for non-directories
The previous attempt in d32816c0 was broken because it failed
to realize that _pFileLock is only set for directories.
This patch also tries to clarify this by making the root node logic
explicit in isRootNode().
Diffstat (limited to 'backends')
| -rw-r--r-- | backends/fs/amigaos4/amigaos4-fs.cpp | 26 | ||||
| -rw-r--r-- | backends/fs/amigaos4/amigaos4-fs.h | 5 | 
2 files changed, 24 insertions, 7 deletions
diff --git a/backends/fs/amigaos4/amigaos4-fs.cpp b/backends/fs/amigaos4/amigaos4-fs.cpp index 2cf397492a..7bebdf8ce6 100644 --- a/backends/fs/amigaos4/amigaos4-fs.cpp +++ b/backends/fs/amigaos4/amigaos4-fs.cpp @@ -252,7 +252,7 @@ bool AmigaOSFilesystemNode::getChildren(AbstractFSList &myList, ListMode mode, b  		return false; // Empty list  	} -	if (_pFileLock == 0) { +	if (isRootNode()) {  		debug(6, "Root node");  		LEAVE();  		myList = listVolumes(); @@ -307,21 +307,33 @@ bool AmigaOSFilesystemNode::getChildren(AbstractFSList &myList, ListMode mode, b  AbstractFSNode *AmigaOSFilesystemNode::getParent() const {  	ENTER(); -	if (_pFileLock == 0) { +	if (isRootNode()) {  		debug(6, "Root node");  		LEAVE();  		return new AmigaOSFilesystemNode(*this);  	} +	BPTR pLock = _pFileLock; + +	if (!_bIsDirectory) { +		assert(!pLock); +		pLock = IDOS->Lock((CONST_STRPTR)_sPath.c_str(), SHARED_LOCK); +		assert(pLock); +	} +  	AmigaOSFilesystemNode *node; -	BPTR parentDir = IDOS->ParentDir( _pFileLock ); +	BPTR parentDir = IDOS->ParentDir( pLock );  	if (parentDir) {  		node = new AmigaOSFilesystemNode(parentDir);  		IDOS->UnLock(parentDir);  	} else  		node = new AmigaOSFilesystemNode(); +	if (!_bIsDirectory) { +		IDOS->UnLock(pLock); +	} +  	LEAVE();  	return node; @@ -332,9 +344,9 @@ bool AmigaOSFilesystemNode::isReadable() const {  		return false;  	// Regular RWED protection flags are low-active or inverted, thus the negation. -	// Moreover, a pseudo root filesystem (null _pFileLock) is readable whatever the +	// Moreover, a pseudo root filesystem is readable whatever the  	// protection says. -	bool readable = !(_nProt & EXDF_OTR_READ) || _pFileLock == 0; +	bool readable = !(_nProt & EXDF_OTR_READ) || isRootNode();  	return readable;  } @@ -344,9 +356,9 @@ bool AmigaOSFilesystemNode::isWritable() const {  		return false;  	// Regular RWED protection flags are low-active or inverted, thus the negation. -	// Moreover, a pseudo root filesystem (null _pFileLock) is never writable whatever +	// Moreover, a pseudo root filesystem is never writable whatever  	// the protection says (Because of it's pseudo nature). -	bool writable = !(_nProt & EXDF_OTR_WRITE) && _pFileLock !=0; +	bool writable = !(_nProt & EXDF_OTR_WRITE) && !isRootNode();  	return writable;  } diff --git a/backends/fs/amigaos4/amigaos4-fs.h b/backends/fs/amigaos4/amigaos4-fs.h index 223d809032..408354888e 100644 --- a/backends/fs/amigaos4/amigaos4-fs.h +++ b/backends/fs/amigaos4/amigaos4-fs.h @@ -62,6 +62,11 @@ protected:  	 */  	virtual AbstractFSList listVolumes() const; +	/** +	 * True if this is the pseudo root filesystem. +	 */ +	bool isRootNode() const { return _bIsValid && _bIsDirectory && _pFileLock == 0; } +  public:  	/**  	 * Creates an AmigaOSFilesystemNode with the root node as path.  | 
