[Scummvm-cvs-logs] SF.net SVN: scummvm: [28140] scummvm/branches/gsoc2007-fsnode

david_corrales at users.sourceforge.net david_corrales at users.sourceforge.net
Wed Jul 18 22:51:26 CEST 2007


Revision: 28140
          http://scummvm.svn.sourceforge.net/scummvm/?rev=28140&view=rev
Author:   david_corrales
Date:     2007-07-18 13:51:26 -0700 (Wed, 18 Jul 2007)

Log Message:
-----------
Added error codes to the SaveFileManager via the SFMError enum. Also, solved TODO's in the default-saves implementation.

Modified Paths:
--------------
    scummvm/branches/gsoc2007-fsnode/backends/saves/default/default-saves.cpp
    scummvm/branches/gsoc2007-fsnode/common/savefile.h

Modified: scummvm/branches/gsoc2007-fsnode/backends/saves/default/default-saves.cpp
===================================================================
--- scummvm/branches/gsoc2007-fsnode/backends/saves/default/default-saves.cpp	2007-07-18 16:36:21 UTC (rev 28139)
+++ scummvm/branches/gsoc2007-fsnode/backends/saves/default/default-saves.cpp	2007-07-18 20:51:26 UTC (rev 28140)
@@ -29,6 +29,7 @@
 #include "common/savefile.h"
 #include "common/util.h"
 #include "common/fs.h"
+#include "common/str.h"
 #include "backends/saves/default/default-saves.h"
 #include "backends/saves/compressed/compressed-saves.h"
 
@@ -120,36 +121,69 @@
 	// Ensure that the savepath exists and is writeable. If not, generate
 	// an appropriate error
 	const char *savePath = getSavePath();
+	
 #if defined(UNIX) || defined(__SYMBIAN32__)
 	struct stat sb;
+	clearError();
 	
 	// Check whether the dir exists
 	if (stat(savePath, &sb) == -1) {
 		// The dir does not exist, or stat failed for some other reason.
 		// If the problem was that the path pointed to nothing, try
-		// to create the dir.
-		if (errno == ENOENT) {
+		// to create the dir (ENOENT case).
+		switch (errno) {
+		case EACCES:
+			setError(SFM_DIR_ACCESS, Common::String("Search or write permission denied"));
+			break;
+		case ELOOP:
+			setError(SFM_DIR_LOOP, Common::String("Too many symbolic links encountered while traversing the path"));
+			break;
+		case ENAMETOOLONG:
+			setError(SFM_DIR_NAMETOOLONG, Common::String("The path name is too long"));
+			break;
+		case ENOENT:
 			if (mkdir(savePath, 0755) != 0) {
 				// mkdir could fail for various reasons: The parent dir doesn't exist,
 				// or is not writeable, the path could be completly bogus, etc.
 				warning("mkdir for '%s' failed!", savePath);
 				perror("mkdir");
-				// TODO: Specify an error code here so that callers can 
-				// determine what exactly went wrong.
+				
+				switch (errno) {
+				case EACCES:
+					setError(SFM_DIR_ACCESS, Common::String("Search or write permission denied"));
+					break;
+				case EMLINK:
+					setError(SFM_DIR_LINKMAX, Common::String("The link count of the parent directory would exceed {LINK_MAX}"));
+					break;
+				case ELOOP:
+					setError(SFM_DIR_LOOP, Common::String("Too many symbolic links encountered while traversing the path"));
+					break;
+				case ENAMETOOLONG:
+					setError(SFM_DIR_NAMETOOLONG, Common::String("The path name is too long"));
+					break;
+				case ENOENT:
+					setError(SFM_DIR_NOENT, Common::String("A component of the path path does not exist, or the path is an empty string"));
+					break;
+				case ENOTDIR:
+					setError(SFM_DIR_NOTDIR, Common::String("A component of the path prefix is not a directory"));
+					break;
+				case EROFS:
+					setError(SFM_DIR_ROFS, Common::String("The parent directory resides on a read-only file system"));
+					break;
+				}
+				
 				return 0;
 			}
-		} else {
-			// Unknown error, abort.
-			// TODO: Specify an error code here so that callers can 
-			// determine what exactly went wrong.
-			return 0;
-		}
+			break;
+		case ENOTDIR:
+			setError(SFM_DIR_NOTDIR, Common::String("A component of the path prefix is not a directory"));
+			break;
+		} 
 	} else {
 		// So stat() succeeded. But is the path actually pointing to a
 		// directory?
 		if (!S_ISDIR(sb.st_mode)) {
-			// TODO: Specify an error code here so that callers can 
-			// determine what exactly went wrong.
+			setError(SFM_DIR_NOTDIR, Common::String("The given savepath is not a directory"));
 			return 0;
 		}
 	}
@@ -164,6 +198,7 @@
 		delete sf;
 		sf = 0;
 	}
+	
 	return wrapOutSaveFile(sf);
 }
 

Modified: scummvm/branches/gsoc2007-fsnode/common/savefile.h
===================================================================
--- scummvm/branches/gsoc2007-fsnode/common/savefile.h	2007-07-18 16:36:21 UTC (rev 28139)
+++ scummvm/branches/gsoc2007-fsnode/common/savefile.h	2007-07-18 20:51:26 UTC (rev 28140)
@@ -78,9 +78,51 @@
 class SaveFileManager : NonCopyable {
 
 public:
+	enum SFMError {
+		SFM_NO_ERROR,			//Default state, indicates no error has been recorded
+		SFM_DIR_ACCESS,			//stat(), mkdir()::EACCES: Search or write permission denied
+		SFM_DIR_LINKMAX,		//mkdir()::EMLINK: The link count of the parent directory would exceed {LINK_MAX}
+		SFM_DIR_LOOP,			//stat(), mkdir()::ELOOP: Too many symbolic links encountered while traversing the path
+		SFM_DIR_NAMETOOLONG,	//stat(), mkdir()::ENAMETOOLONG: The path name is too long
+		SFM_DIR_NOENT,			//stat(), mkdir()::ENOENT: A component of the path path does not exist, or the path is an empty string
+		SFM_DIR_NOTDIR,			//stat(), mkdir()::ENOTDIR: A component of the path prefix is not a directory
+		SFM_DIR_ROFS			//mkdir()::EROFS: The parent directory resides on a read-only file system
+	};
+	
+protected:
+	SFMError _error;
+	String _errorDesc;
+	
+public:
 	virtual ~SaveFileManager() {}
-
+	
 	/**
+	 * Clears the last set error code and string.
+	 */
+	virtual void clearError() { _error = SFM_NO_ERROR; _errorDesc = ""; }
+	
+	/**
+	 * Returns the last ocurred error code. If none ocurred, returns SFM_NO_ERROR.
+	 * 
+	 * @return A SFMError indicating the type of the last error.
+	 */
+	virtual SFMError getError() { return _error; }
+	
+	/**
+	 * Returns the last ocurred error description. If none ocurred, returns 0.
+	 * 
+	 * @return A string describing the last error.
+	 */
+	virtual String getErrorDesc() { return _errorDesc; }
+	
+	/**
+	 * Sets the last ocurred error.
+	 * @param error Code identifying the last error.
+	 * @param errorDesc String describing the last error.
+	 */
+	virtual void setError(SFMError error, String errorDesc) { _error = error; _errorDesc = errorDesc; }
+	
+	/**
 	 * Open the file with name filename in the given directory for saving.
 	 * @param filename	the filename
 	 * @return pointer to an OutSaveFile, or NULL if an error occured.


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