[Scummvm-cvs-logs] SF.net SVN: scummvm:[53186] scummvm/trunk/engines/sword25
sev at users.sourceforge.net
sev at users.sourceforge.net
Wed Oct 13 00:01:09 CEST 2010
Revision: 53186
http://scummvm.svn.sourceforge.net/scummvm/?rev=53186&view=rev
Author: sev
Date: 2010-10-12 22:01:08 +0000 (Tue, 12 Oct 2010)
Log Message:
-----------
SWORD25: Implemented ScummVM version of BS_FileSystemUtil interface
Modified Paths:
--------------
scummvm/trunk/engines/sword25/kernel/filesystemutil.h
scummvm/trunk/engines/sword25/module.mk
Added Paths:
-----------
scummvm/trunk/engines/sword25/kernel/filesystemutil.cpp
Removed Paths:
-------------
scummvm/trunk/engines/sword25/kernel/filesystemutil_win32.cpp
Added: scummvm/trunk/engines/sword25/kernel/filesystemutil.cpp
===================================================================
--- scummvm/trunk/engines/sword25/kernel/filesystemutil.cpp (rev 0)
+++ scummvm/trunk/engines/sword25/kernel/filesystemutil.cpp 2010-10-12 22:01:08 UTC (rev 53186)
@@ -0,0 +1,131 @@
+/* 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$
+ *
+ */
+
+// -----------------------------------------------------------------------------
+// Includes
+// -----------------------------------------------------------------------------
+
+#include "common/config-manager.h"
+#include "common/fs.h"
+#include "common/savefile.h"
+#include "common/system.h"
+#include "sword25/kernel/filesystemutil.h"
+
+namespace Sword25 {
+
+#define BS_LOG_PREFIX "FILESYSTEMUTIL"
+
+// -----------------------------------------------------------------------------
+// Constants and utility functions
+// -----------------------------------------------------------------------------
+
+Common::String GetAbsolutePath(const Common::String &Path) {
+ Common::FSNode node(Path);
+
+ if (!node.exists()) {
+ // An error has occurred finding the node
+ // We can do nothing at this pointer than return an empty string
+ BS_LOG_ERRORLN("A call to GetAbsolutePath failed.");
+ return "";
+ }
+
+ // Return the result
+ return node.getPath();
+}
+
+// -----------------------------------------------------------------------------
+// Class definitions
+// -----------------------------------------------------------------------------
+
+class BS_FileSystemUtilScummVM : public BS_FileSystemUtil {
+public:
+ virtual Common::String GetUserdataDirectory() {
+ Common::String path = ConfMan.get("savepath");
+
+ if (path.empty()) {
+ BS_LOG_ERRORLN("No save path has been defined");
+ return "";
+ }
+
+ // Return the path
+ return path;
+ }
+
+ virtual Common::String GetPathSeparator() {
+ return Common::String("//");
+ }
+
+ virtual int64 GetFileSize(const Common::String &Filename) {
+ Common::FSNode node(Filename);
+
+ // If the file does not exist, return -1 as a result
+ if (!node.exists())
+ return -1;
+
+ // Get the size of the file and return it
+ Common::File f;
+ f.open(node);
+ uint32 size = f.size();
+ f.close();
+
+ return size;
+ }
+
+ virtual time_t GetFileTime(const Common::String &Filename) {
+ // TODO: There isn't any way in ScummVM to get a file's modified date/time. We will need to check
+ // what code makes use of it. If it's only the save game code, for example, we may be able to
+ // encode the date/time inside the savegame files themselves.
+ return 0;
+ }
+
+ virtual bool FileExists(const Common::String &Filename) {
+ Common::File f;
+ return f.exists(Filename);
+ }
+
+ virtual bool CreateDirectory(const Common::String &DirectoryName) {
+ // ScummVM doesn't support creating folders, so this is only a stub
+ BS_LOG_ERRORLN("CreateDirectory method called");
+ return false;
+ }
+
+ virtual Common::StringArray GetFilesInDirectory(const Common::String &Directory) {
+ Common::SaveFileManager *sfm = g_system->getSavefileManager();
+ Common::StringArray filenames = sfm->listSavefiles("*");
+ sort(filenames.begin(), filenames.end());
+ return filenames;
+ }
+};
+
+// -----------------------------------------------------------------------------
+// Singleton method of parent class
+// -----------------------------------------------------------------------------
+
+BS_FileSystemUtil &BS_FileSystemUtil::GetInstance() {
+ static BS_FileSystemUtilScummVM Instance;
+ return Instance;
+}
+
+} // End of namespace Sword25
Property changes on: scummvm/trunk/engines/sword25/kernel/filesystemutil.cpp
___________________________________________________________________
Added: svn:executable
+ *
Added: svn:mime-type
+ text/plain
Added: svn:keywords
+ Date Rev Author URL Id
Added: svn:eol-style
+ native
Modified: scummvm/trunk/engines/sword25/kernel/filesystemutil.h
===================================================================
--- scummvm/trunk/engines/sword25/kernel/filesystemutil.h 2010-10-12 22:00:10 UTC (rev 53185)
+++ scummvm/trunk/engines/sword25/kernel/filesystemutil.h 2010-10-12 22:01:08 UTC (rev 53186)
@@ -37,15 +37,17 @@
// -----------------------------------------------------------------------------
#include "common/str.h"
+#include "common/str-array.h"
#include "sword25/kernel/common.h"
#include "sword25/kernel/bs_stdint.h"
+namespace Sword25 {
+
// -----------------------------------------------------------------------------
// Class definitions
// -----------------------------------------------------------------------------
-class BS_FileSystemUtil
-{
+class BS_FileSystemUtil {
public:
static BS_FileSystemUtil &GetInstance();
virtual ~BS_FileSystemUtil() {};
@@ -66,7 +68,7 @@
* @return Returns the size of the specified file. If the size could not be
* determined, or the file does not exist, returns -1
*/
- virtual uint64_t GetFileSize(const Common::String &Filename) = 0;
+ virtual int64 GetFileSize(const Common::String &Filename) = 0;
/**
* @param Filename The path to a file.
* @return Returns the timestamp of the specified file. On error it returns 0
@@ -94,4 +96,6 @@
virtual Common::StringArray GetFilesInDirectory(const Common::String &Path) = 0;
};
+} // End of namespace Sword25
+
#endif
Deleted: scummvm/trunk/engines/sword25/kernel/filesystemutil_win32.cpp
===================================================================
--- scummvm/trunk/engines/sword25/kernel/filesystemutil_win32.cpp 2010-10-12 22:00:10 UTC (rev 53185)
+++ scummvm/trunk/engines/sword25/kernel/filesystemutil_win32.cpp 2010-10-12 22:01:08 UTC (rev 53186)
@@ -1,256 +0,0 @@
-// -----------------------------------------------------------------------------
-// This file is part of Broken Sword 2.5
-// Copyright (c) Malte Thiesen, Daniel Queteschiner and Michael Elsd\xF6rfer
-//
-// Broken Sword 2.5 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.
-//
-// Broken Sword 2.5 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 Broken Sword 2.5; if not, write to the Free Software
-// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
-// -----------------------------------------------------------------------------
-
-// -----------------------------------------------------------------------------
-// Includes
-// -----------------------------------------------------------------------------
-
-#include "sword25/kernel/filesystemutil.h"
-#define WIN32_LEAN_AND_MEAN
-#include <Windows.h>
-#include <ShlObj.h>
-#include <memory.h>
-
-using namespace std;
-
-#define BS_LOG_PREFIX "FILESYSTEMUTILWIN32"
-
-// -----------------------------------------------------------------------------
-// Konstanten und Hilfsfunktionen
-// -----------------------------------------------------------------------------
-
-namespace
-{
- const char * DIRECTORY_NAME = "Broken Sword 2.5";
-
- // -------------------------------------------------------------------------
-
- string GetAbsolutePath(const string & Path)
- {
- char Buffer[MAX_PATH];
- if (!::GetFullPathNameA(Path.c_str(), MAX_PATH, Buffer, 0))
- {
- // Bei der Ausf\xFChrung von GetFullPathNameA() ist ein Fehler aufgetreten.
- // Wir k\xF6nnen an dieser Stelle nichts andere machen, als einen leeren String zur\xFCckzugeben.
- BS_LOG_ERRORLN("A call to GetFullPathNameA() failed.");
- return "";
- }
-
- // Ergebnis zur\xFCckgeben.
- return string(Buffer);
- }
-}
-
-// -----------------------------------------------------------------------------
-// Klassendefinition
-// -----------------------------------------------------------------------------
-
-class BS_FileSystemUtilWin32 : public BS_FileSystemUtil
-{
-public:
- virtual string GetUserdataDirectory()
- {
- // Die C++ Dateisystemfunktionen k\xF6nnen leider nicht mit Unicode-Dateinamen umgehen.
- // F\xFCr uns ist das problematisch, wenn wir in das %APPDATA%-Verzeichnis eines Benutzers zugreifen wollen,
- // dessen Name Unicode-Zeichen enth\xE4lt, die sich mit der aktuellen Codepage nicht als ANSI-String darstellen
- // lassen.
- // Wir behelfen uns damit, dass wir das Verzeichnis als Unicode-String abfragen, in die kurze
- // Verzeichnisdarstellung konvertieren und das Ergebnis in einen ANSI-String konvertieren.
- // Kurze Dateinamen sollten keine Unicode-Zeichen enthalten, ich habe allerdings keine offizielle Aussage dazu
- // gefunden.
-
- WCHAR PathBuffer[MAX_PATH];
-
- // Das %APPDATA%-Verzeichnis erfragen.
- if (::SHGetSpecialFolderPathW(0, PathBuffer, CSIDL_APPDATA, FALSE) == FALSE)
- {
- BS_LOG_ERRORLN("SHGetSpecialFolderPathW() failed");
- return "";
- }
-
- // Die kurze Variante des Verzeichnisses erfragen.
- if (::GetShortPathNameW(PathBuffer, PathBuffer, MAX_PATH) == 0)
- {
- BS_LOG_ERRORLN("GetShortPathNameW() failed");
- return "";
- }
-
- // Die Verzeichnisangabe in einen ANSI-String konvertieren.
- char AnsiPathBuffer[MAX_PATH];
- BOOL UsedDefaultChar = FALSE;
- if (::WideCharToMultiByte(CP_ACP, 0, PathBuffer, -1, AnsiPathBuffer, MAX_PATH, 0, &UsedDefaultChar) == 0)
- {
- BS_LOG_ERRORLN("WideCharToMultiByte() failed");
- return "";
- }
-
- // Falls bei der Konvertierung ein zum Einsatz kam, ist das Ergebnis nicht eindeutig und damit nicht
- // verwendbar.
- if (UsedDefaultChar)
- {
- BS_LOG_ERRORLN("Conversion from unicode to ANSI is ambiguous.");
- return "";
- }
-
- // Verzeichnis zur\xFCckgeben.
- return string(AnsiPathBuffer) + "\\" + DIRECTORY_NAME;
- }
-
- virtual string GetPathSeparator()
- {
- return string("\\");
- }
-
- virtual uint64_t GetFileSize(const std::string & Filename)
- {
- WIN32_FILE_ATTRIBUTE_DATA fileAttributeData;
- // Dateiattribute einlesen.
- if (::GetFileAttributesExA(Filename.c_str(), GetFileExInfoStandard, &fileAttributeData) != 0)
- {
- // Die Dateigr\xF6\xDFe wird von Windows in zwei 32-Bit Zahlen angegeben. Diese werden an dieser Stelle in eine 64-Bit Zahl umgewandelt.
- uint64_t fileSize = fileAttributeData.nFileSizeHigh;
- fileSize <<= 32;
- fileSize |= fileAttributeData.nFileSizeLow;
- return fileSize;
- }
- else
- {
- return -1;
- }
- }
-
- virtual time_t GetFileTime(const std::string & Filename)
- {
- WIN32_FILE_ATTRIBUTE_DATA fileAttributeData;
- if (::GetFileAttributesExA(Filename.c_str(), GetFileExInfoStandard, &fileAttributeData) != 0)
- {
- __int64 timestamp;
- memcpy(×tamp, &fileAttributeData.ftLastWriteTime, sizeof(FILETIME));
- return (timestamp - 0x19DB1DED53E8000) / 10000000;
- }
- else
- {
- return 0;
- }
- }
-
- virtual bool FileExists(const std::string & Filename)
- {
- return ::GetFileAttributesA(Filename.c_str()) != INVALID_FILE_ATTRIBUTES;
- }
-
- // Windows.h enth\xE4lt ein Makro mit dem Namen CreateDirectory. Dieses muss entfernt werden bevor die Definition von
- // unserem CreateDirectory() folgt.
- #ifdef CreateDirectory
- #undef CreateDirectory
- #endif
-
- virtual bool CreateDirectory(const string & DirectoryName)
- {
- return CreateDirectoryRecursive(GetAbsolutePath(DirectoryName));
- }
-
- virtual vector<string> GetFilesInDirectory(const std::string & Directory)
- {
- vector<string> Result;
-
- // Suchstring erstellen, dabei muss der leere String (aktuelles Verzeichnis) gesondert behandelt werden.
- string SearchPattern;
- if (Directory.empty())
- SearchPattern = "*";
- else
- SearchPattern = Directory + "\\*";
-
- // Die erste Datei suchen.
- WIN32_FIND_DATAA FindData;
- HANDLE FindHandle = ::FindFirstFileA(SearchPattern.c_str(), &FindData);
-
- while (FindHandle != INVALID_HANDLE_VALUE)
- {
- // Verzeichnisse ignorieren.
- // Beim erstellen des Ergebnispfades muss wieder der Sonderfall der leeren Verzeichnisangabe ber\xFCcksichtigt werden.
- if (!(FindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
- Result.push_back(FindData.cFileName);
-
- // Solange weitermachen, bis keine Dateien mehr gefunden werden.
- if (FindNextFileA(FindHandle, &FindData) == 0)
- {
- FindClose(&FindHandle);
- break;
- }
- }
-
- return Result;
- }
-
-private:
- bool CreateDirectoryRecursive(string & DirectoryName)
- {
- //
- // http://www.codeguru.com/Cpp/W-P/files/article.php/c4439/
- // (c) Assaf Tzur-El
- //
-
- DWORD attr;
- int pos;
- bool result = true;
-
- // Check for trailing slash:
- pos = DirectoryName.find_last_of("\\");
- if (DirectoryName.length() == pos + 1) // last character is "\"
- {
- DirectoryName.resize(pos);
- }
-
- // Look for existing object:
- attr = ::GetFileAttributesA(DirectoryName.c_str());
- if (0xFFFFFFFF == attr) // doesn't exist yet - create it!
- {
- pos = DirectoryName.find_last_of("\\");
- if (0 < pos)
- {
- // Create parent dirs:
- result = CreateDirectoryRecursive(DirectoryName.substr(0, pos));
- }
- // Create node:
- result = result && ::CreateDirectoryA(DirectoryName.c_str(), NULL);
- }
- else if (!(FILE_ATTRIBUTE_DIRECTORY & attr))
- { // object already exists, but is not a dir
- ::SetLastError(ERROR_FILE_EXISTS);
- result = false;
- }
-
- return result;
- }
-};
-
-// -----------------------------------------------------------------------------
-// Singleton-Methode der Elternklasse
-// Hiermit wird sichergestellt, dass wenn immer diese Datei kompiliert wird,
-// die Singleton-Methode der Oberklasse diese Klasse instanziiert.
-// Unterscheidung zwischen den Plattformen wird so nur durch Linken gegen andere
-// Dateien realisiert.
-// -----------------------------------------------------------------------------
-
-BS_FileSystemUtil & BS_FileSystemUtil::GetInstance()
-{
- static BS_FileSystemUtilWin32 Instance;
- return Instance;
-}
Modified: scummvm/trunk/engines/sword25/module.mk
===================================================================
--- scummvm/trunk/engines/sword25/module.mk 2010-10-12 22:00:10 UTC (rev 53185)
+++ scummvm/trunk/engines/sword25/module.mk 2010-10-12 22:01:08 UTC (rev 53186)
@@ -47,7 +47,7 @@
input/stdwininput.o \
kernel/callbackregistry.o \
kernel/debug/debugtools.o \
- kernel/filesystemutil_win32.o \
+ kernel/filesystemutil.o \
kernel/inputpersistenceblock.o \
kernel/kernel.o \
kernel/kernel_script.o \
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