From d0c9b0cb233a00094f18269d94b7d0fb64433099 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Mon, 3 Nov 2008 10:45:59 +0000 Subject: * turned DefaultSaveFileManager::checkPath into a virtual method * add a subclass of DefaultSaveFileManager for UNIX, POSIXSaveFileManager, which overloads checkPath * switched SDL backend to use POSIXSaveFileManager if UNIX is #defined svn-id: r34872 --- backends/saves/posix/posix-saves.cpp | 128 +++++++++++++++++++++++++++++++++++ 1 file changed, 128 insertions(+) create mode 100644 backends/saves/posix/posix-saves.cpp (limited to 'backends/saves/posix/posix-saves.cpp') diff --git a/backends/saves/posix/posix-saves.cpp b/backends/saves/posix/posix-saves.cpp new file mode 100644 index 0000000000..38d811789f --- /dev/null +++ b/backends/saves/posix/posix-saves.cpp @@ -0,0 +1,128 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ + * + */ + +#if defined(UNIX) && !defined(DISABLE_DEFAULT_SAVEFILEMANAGER) + +#include "backends/saves/posix/posix-saves.h" + +#include "common/config-manager.h" +#include "common/savefile.h" + +#include +#include +#include +#include + + +#ifdef MACOSX +#define DEFAULT_SAVE_PATH "Documents/ScummVM Savegames" +#else +#define DEFAULT_SAVE_PATH ".scummvm" +#endif + +POSIXSaveFileManager::POSIXSaveFileManager() { + // Register default savepath based on HOME + Common::String savePath; + const char *home = getenv("HOME"); + if (home && *home && strlen(home) < MAXPATHLEN) { + savePath = home; + savePath += "/" DEFAULT_SAVE_PATH; + ConfMan.registerDefault("savepath", savePath); + } +} +/* +POSIXSaveFileManager::POSIXSaveFileManager(const Common::String &defaultSavepath) + : DefaultSaveFileManager(defaultSavepath) { +} +*/ + +#if defined(UNIX) +void POSIXSaveFileManager::checkPath(const Common::FSNode &dir) { + const Common::String path = dir.getPath(); + clearError(); + + struct stat sb; + + // Check whether the dir exists + if (stat(path.c_str(), &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 (ENOENT case). + switch (errno) { + case EACCES: + setError(SFM_DIR_ACCESS, "Search or write permission denied: "+path); + break; + case ELOOP: + setError(SFM_DIR_LOOP, "Too many symbolic links encountered while traversing the path: "+path); + break; + case ENAMETOOLONG: + setError(SFM_DIR_NAMETOOLONG, "The path name is too long: "+path); + break; + case ENOENT: + if (mkdir(path.c_str(), 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!", path.c_str()); + perror("mkdir"); + + switch (errno) { + case EACCES: + setError(SFM_DIR_ACCESS, "Search or write permission denied: "+path); + break; + case EMLINK: + setError(SFM_DIR_LINKMAX, "The link count of the parent directory would exceed {LINK_MAX}: "+path); + break; + case ELOOP: + setError(SFM_DIR_LOOP, "Too many symbolic links encountered while traversing the path: "+path); + break; + case ENAMETOOLONG: + setError(SFM_DIR_NAMETOOLONG, "The path name is too long: "+path); + break; + case ENOENT: + setError(SFM_DIR_NOENT, "A component of the path does not exist, or the path is an empty string: "+path); + break; + case ENOTDIR: + setError(SFM_DIR_NOTDIR, "A component of the path prefix is not a directory: "+path); + break; + case EROFS: + setError(SFM_DIR_ROFS, "The parent directory resides on a read-only file system:"+path); + break; + } + } + break; + case ENOTDIR: + setError(SFM_DIR_NOTDIR, "A component of the path prefix is not a directory: "+path); + break; + } + } else { + // So stat() succeeded. But is the path actually pointing to a directory? + if (!S_ISDIR(sb.st_mode)) { + setError(SFM_DIR_NOTDIR, "The given savepath is not a directory: "+path); + } + } +} +#endif + +#endif -- cgit v1.2.3