[Scummvm-cvs-logs] SF.net SVN: scummvm: [23893] scummvm/trunk/backends/fs/amigaos4/amigaos4-fs .cpp

fingolfin at users.sourceforge.net fingolfin at users.sourceforge.net
Sat Sep 16 19:56:30 CEST 2006


Revision: 23893
          http://svn.sourceforge.net/scummvm/?rev=23893&view=rev
Author:   fingolfin
Date:     2006-09-16 10:56:26 -0700 (Sat, 16 Sep 2006)

Log Message:
-----------
Patch #1559806: Fixes for AmigaOS 4 filesystem backend

Modified Paths:
--------------
    scummvm/trunk/backends/fs/amigaos4/amigaos4-fs.cpp

Modified: scummvm/trunk/backends/fs/amigaos4/amigaos4-fs.cpp
===================================================================
--- scummvm/trunk/backends/fs/amigaos4/amigaos4-fs.cpp	2006-09-16 17:29:43 UTC (rev 23892)
+++ scummvm/trunk/backends/fs/amigaos4/amigaos4-fs.cpp	2006-09-16 17:56:26 UTC (rev 23893)
@@ -103,8 +103,13 @@
 
 	int len = 0, offset = p.size();
 
-	assert(offset > 0);
+	//assert(offset > 0);
 
+	if (offset <= 0) {
+		debug(6, "Bad offset");
+		return;
+	}
+
 	_sPath = p;
 
 	// Extract last	component from path
@@ -148,6 +153,8 @@
 				_bIsValid = true;
 			}			 
 		}
+
+		IDOS->UnLock(pLock);
 	}
 
 	IDOS->FreeDosObject(DOS_FIB, fib);
@@ -329,11 +336,28 @@
 }
 
 AbstractFilesystemNode *AmigaOSFilesystemNode::child(const String &n) const {
-	assert(_bIsDirectory);
+	
+	if (!_bIsDirectory) {
+		debug(6, "Not a directory");
+		return 0;
+	}
+
 	String newPath(_sPath);
+
 	if (_sPath.lastChar() != '/')
 		newPath += '/';
+
 	newPath += n;
+
+	BPTR lock = IDOS->Lock(newPath.c_str(), SHARED_LOCK);
+
+	if (!lock) {
+		debug(6, "Bad path");
+		return 0;
+	}
+
+	IDOS->UnLock(lock);
+
 	return new AmigaOSFilesystemNode(newPath);
 }
 
@@ -343,7 +367,7 @@
 	AbstractFSList myList;
 
 	const uint32 kLockFlags = LDF_READ | LDF_VOLUMES;
-	char n[MAXPATHLEN];
+	char buffer[MAXPATHLEN];
 
 	struct DosList *dosList = IDOS->LockDosList(kLockFlags);
 	if (!dosList) {
@@ -352,30 +376,49 @@
 		return myList;
 	}
 
-
 	dosList = IDOS->NextDosEntry(dosList, LDF_VOLUMES);
 	while (dosList) {
 		if (dosList->dol_Type == DLT_VOLUME &&
 			dosList->dol_Name &&
 			dosList->dol_Task) {
-			const char *volName = (const char *)BADDR(dosList->dol_Name)+1;
-			const char *devName = (const char *)((struct Task *)dosList->dol_Task->mp_SigTask)->tc_Node.ln_Name;
+			//const char *volName = (const char *)BADDR(dosList->dol_Name)+1;
+			
+			// Copy name to buffer
+			IDOS->CopyStringBSTRToC(dosList->dol_Name, buffer, MAXPATHLEN);
 
-			strcpy(n, volName);
-			strcat(n, ":");
+			//const char *devName = (const char *)((struct Task *)dosList->dol_Task->mp_SigTask)->tc_Node.ln_Name;
 
-			BPTR volumeLock = IDOS->Lock((STRPTR)n, SHARED_LOCK);
+			// Volume name + '\0'
+			char *volName = new char [strlen(buffer) + 1];
+
+			strcpy(volName, buffer);
+
+			strcat(buffer, ":");
+
+			BPTR volumeLock = IDOS->Lock((STRPTR)buffer, SHARED_LOCK);
 			if (volumeLock) {
-				sprintf(n, "%s (%s)", volName, devName);
-				AmigaOSFilesystemNode *entry = new AmigaOSFilesystemNode(volumeLock, n);
+
+				char *devName = new char [MAXPATHLEN];
+
+				// Find device name
+				IDOS->DevNameFromLock(volumeLock, devName, MAXPATHLEN, DN_DEVICEONLY);
+				
+				sprintf(buffer, "%s (%s)", volName, devName);
+
+				delete [] devName;
+
+				AmigaOSFilesystemNode *entry = new AmigaOSFilesystemNode(volumeLock, buffer);
 				if (entry) {
 					if (entry->isValid())
 						myList.push_back(entry);
 					else
 						delete entry;
 				}
+
 				IDOS->UnLock(volumeLock);
 			}
+
+			delete [] volName;
 		}
 		dosList	= IDOS->NextDosEntry(dosList, LDF_VOLUMES);
 	}


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.




More information about the Scummvm-git-logs mailing list