aboutsummaryrefslogtreecommitdiff
path: root/backends/platform/sdl
diff options
context:
space:
mode:
authorAlejandro Marzini2010-05-29 01:56:34 +0000
committerAlejandro Marzini2010-05-29 01:56:34 +0000
commit16c559a095af85a7f553912461cf4468366070a7 (patch)
tree3eeb87b664a87b1bb313c87139c655abf269080b /backends/platform/sdl
parent6b3d268e23713eba0356599e8ac6e926e3315148 (diff)
downloadscummvm-rg350-16c559a095af85a7f553912461cf4468366070a7.tar.gz
scummvm-rg350-16c559a095af85a7f553912461cf4468366070a7.tar.bz2
scummvm-rg350-16c559a095af85a7f553912461cf4468366070a7.zip
Added again base-backend. Started sdl backend refatoring, file, mutex and timer subsystems created.
svn-id: r49305
Diffstat (limited to 'backends/platform/sdl')
-rw-r--r--backends/platform/sdl/file.cpp235
-rw-r--r--backends/platform/sdl/file.h67
-rw-r--r--backends/platform/sdl/mutex.cpp83
-rw-r--r--backends/platform/sdl/mutex.h69
-rw-r--r--backends/platform/sdl/timer.cpp121
-rw-r--r--backends/platform/sdl/timer.h69
6 files changed, 644 insertions, 0 deletions
diff --git a/backends/platform/sdl/file.cpp b/backends/platform/sdl/file.cpp
new file mode 100644
index 0000000000..a8dd230059
--- /dev/null
+++ b/backends/platform/sdl/file.cpp
@@ -0,0 +1,235 @@
+/* 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(WIN32)
+#include <windows.h>
+// winnt.h defines ARRAYSIZE, but we want our own one... - this is needed before including util.h
+#undef ARRAYSIZE
+#endif
+
+#include "backends/platform/sdl/file.h"
+#include "common/archive.h"
+
+#ifdef UNIX
+ #include "backends/saves/posix/posix-saves.h"
+#else
+ #include "backends/saves/default/default-saves.h"
+#endif
+
+/*
+ * Include header files needed for the getFilesystemFactory() method.
+ */
+#if defined(__amigaos4__)
+ #include "backends/fs/amigaos4/amigaos4-fs-factory.h"
+#elif defined(UNIX)
+ #include "backends/fs/posix/posix-fs-factory.h"
+#elif defined(WIN32)
+ #include "backends/fs/windows/windows-fs-factory.h"
+#endif
+
+
+#if defined(UNIX)
+#ifdef MACOSX
+#define DEFAULT_CONFIG_FILE "Library/Preferences/ScummVM Preferences"
+#elif defined(SAMSUNGTV)
+#define DEFAULT_CONFIG_FILE "/dtv/usb/sda1/.scummvmrc"
+#else
+#define DEFAULT_CONFIG_FILE ".scummvmrc"
+#endif
+#else
+#define DEFAULT_CONFIG_FILE "scummvm.ini"
+#endif
+
+SdlSubSys_File::SdlSubSys_File()
+ :
+ _inited(false),
+ _fsFactory(0),
+ _savefile(0) {
+
+}
+
+SdlSubSys_File::~SdlSubSys_File() {
+}
+
+void SdlSubSys_File::fileInit(OSystem *mainSys) {
+ if (_inited) {
+ return;
+ }
+ _mainSys = mainSys;
+
+ // Create the savefile manager, if none exists yet (we check for this to
+ // allow subclasses to provide their own).
+ if (_savefile == 0) {
+ #ifdef UNIX
+ _savefile = new POSIXSaveFileManager();
+ #else
+ _savefile = new DefaultSaveFileManager();
+ #endif
+ }
+
+#if defined(__amigaos4__)
+ _fsFactory = new AmigaOSFilesystemFactory();
+#elif defined(UNIX)
+ _fsFactory = new POSIXFilesystemFactory();
+#elif defined(WIN32)
+ _fsFactory = new WindowsFilesystemFactory();
+#elif defined(__SYMBIAN32__)
+ // Do nothing since its handled by the Symbian SDL inheritance
+#else
+ #error Unknown and unsupported FS backend
+#endif
+
+ _inited = true;
+}
+
+void SdlSubSys_File::fileDone() {
+ delete _savefile;
+}
+
+bool SdlSubSys_File::hasFeature(Feature f) {
+ return false;
+}
+
+void SdlSubSys_File::setFeatureState(Feature f, bool enable) {
+
+}
+
+bool SdlSubSys_File::getFeatureState(Feature f) {
+ return false;
+}
+
+Common::SaveFileManager *SdlSubSys_File::getSavefileManager() {
+ assert(_savefile);
+ return _savefile;
+}
+
+FilesystemFactory *SdlSubSys_File::getFilesystemFactory() {
+ assert(_fsFactory);
+ return _fsFactory;
+}
+
+void SdlSubSys_File::addSysArchivesToSearchSet(Common::SearchSet &s, int priority) {
+
+#ifdef DATA_PATH
+ // Add the global DATA_PATH to the directory search list
+ // FIXME: We use depth = 4 for now, to match the old code. May want to change that
+ Common::FSNode dataNode(DATA_PATH);
+ if (dataNode.exists() && dataNode.isDirectory()) {
+ s.add(DATA_PATH, new Common::FSDirectory(dataNode, 4), priority);
+ }
+#endif
+
+#ifdef MACOSX
+ // Get URL of the Resource directory of the .app bundle
+ CFURLRef fileUrl = CFBundleCopyResourcesDirectoryURL(CFBundleGetMainBundle());
+ if (fileUrl) {
+ // Try to convert the URL to an absolute path
+ UInt8 buf[MAXPATHLEN];
+ if (CFURLGetFileSystemRepresentation(fileUrl, true, buf, sizeof(buf))) {
+ // Success: Add it to the search path
+ Common::String bundlePath((const char *)buf);
+ s.add("__OSX_BUNDLE__", new Common::FSDirectory(bundlePath), priority);
+ }
+ CFRelease(fileUrl);
+ }
+
+#endif
+
+}
+
+static Common::String getDefaultConfigFileName() {
+ char configFile[MAXPATHLEN];
+#if defined (WIN32) && !defined(_WIN32_WCE) && !defined(__SYMBIAN32__)
+ OSVERSIONINFO win32OsVersion;
+ ZeroMemory(&win32OsVersion, sizeof(OSVERSIONINFO));
+ win32OsVersion.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
+ GetVersionEx(&win32OsVersion);
+ // Check for non-9X version of Windows.
+ if (win32OsVersion.dwPlatformId != VER_PLATFORM_WIN32_WINDOWS) {
+ // Use the Application Data directory of the user profile.
+ if (win32OsVersion.dwMajorVersion >= 5) {
+ if (!GetEnvironmentVariable("APPDATA", configFile, sizeof(configFile)))
+ error("Unable to access application data directory");
+ } else {
+ if (!GetEnvironmentVariable("USERPROFILE", configFile, sizeof(configFile)))
+ error("Unable to access user profile directory");
+
+ strcat(configFile, "\\Application Data");
+ CreateDirectory(configFile, NULL);
+ }
+
+ strcat(configFile, "\\ScummVM");
+ CreateDirectory(configFile, NULL);
+ strcat(configFile, "\\" DEFAULT_CONFIG_FILE);
+
+ FILE *tmp = NULL;
+ if ((tmp = fopen(configFile, "r")) == NULL) {
+ // Check windows directory
+ char oldConfigFile[MAXPATHLEN];
+ GetWindowsDirectory(oldConfigFile, MAXPATHLEN);
+ strcat(oldConfigFile, "\\" DEFAULT_CONFIG_FILE);
+ if ((tmp = fopen(oldConfigFile, "r"))) {
+ strcpy(configFile, oldConfigFile);
+
+ fclose(tmp);
+ }
+ } else {
+ fclose(tmp);
+ }
+ } else {
+ // Check windows directory
+ GetWindowsDirectory(configFile, MAXPATHLEN);
+ strcat(configFile, "\\" DEFAULT_CONFIG_FILE);
+ }
+#elif defined(UNIX)
+ // On UNIX type systems, by default we store the config file inside
+ // to the HOME directory of the user.
+ //
+ // GP2X is Linux based but Home dir can be read only so do not use
+ // it and put the config in the executable dir.
+ //
+ // On the iPhone, the home dir of the user when you launch the app
+ // from the Springboard, is /. Which we don't want.
+ const char *home = getenv("HOME");
+ if (home != NULL && strlen(home) < MAXPATHLEN)
+ snprintf(configFile, MAXPATHLEN, "%s/%s", home, DEFAULT_CONFIG_FILE);
+ else
+ strcpy(configFile, DEFAULT_CONFIG_FILE);
+#else
+ strcpy(configFile, DEFAULT_CONFIG_FILE);
+#endif
+
+ return configFile;
+}
+
+Common::SeekableReadStream *SdlSubSys_File::createConfigReadStream() {
+ Common::FSNode file(getDefaultConfigFileName());
+ return file.createReadStream();
+}
+
+Common::WriteStream *SdlSubSys_File::createConfigWriteStream() {
+ Common::FSNode file(getDefaultConfigFileName());
+ return file.createWriteStream();
+}
diff --git a/backends/platform/sdl/file.h b/backends/platform/sdl/file.h
new file mode 100644
index 0000000000..4f23a06594
--- /dev/null
+++ b/backends/platform/sdl/file.h
@@ -0,0 +1,67 @@
+/* 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$
+ *
+ */
+
+#ifndef BACKENDS_SDL_SUBSYS_FILE_H
+#define BACKENDS_SDL_SUBSYS_FILE_H
+
+#include "backends/base-subsys-file.h"
+
+#if defined(__SYMBIAN32__)
+#include <esdl\SDL.h>
+#else
+#include <SDL.h>
+#endif
+
+class SdlSubSys_File : public BaseSubSys_File {
+public:
+ SdlSubSys_File();
+ ~SdlSubSys_File();
+
+ virtual void fileInit(OSystem *mainSys);
+ virtual void fileDone();
+
+ bool hasFeature(Feature f);
+ void setFeatureState(Feature f, bool enable);
+ bool getFeatureState(Feature f);
+
+ virtual Common::SeekableReadStream *createConfigReadStream();
+ virtual Common::WriteStream *createConfigWriteStream();
+
+ virtual Common::SaveFileManager *getSavefileManager();
+ virtual FilesystemFactory *getFilesystemFactory();
+ virtual void addSysArchivesToSearchSet(Common::SearchSet &s, int priority = 0);
+
+protected:
+ bool _inited;
+
+ FilesystemFactory *_fsFactory;
+ Common::SaveFileManager *_savefile;
+
+private:
+ OSystem *_mainSys;
+};
+
+
+#endif
diff --git a/backends/platform/sdl/mutex.cpp b/backends/platform/sdl/mutex.cpp
new file mode 100644
index 0000000000..ce9eef6a96
--- /dev/null
+++ b/backends/platform/sdl/mutex.cpp
@@ -0,0 +1,83 @@
+/* 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$
+ *
+ */
+
+#include "backends/platform/sdl/mutex.h"
+
+SdlSubSys_Mutex::SdlSubSys_Mutex()
+ :
+ _inited(false) {
+
+}
+
+SdlSubSys_Mutex::~SdlSubSys_Mutex() {
+ if (_inited) {
+ mutexDone();
+ }
+}
+
+void SdlSubSys_Mutex::mutexInit(OSystem *mainSys) {
+ if (_inited) {
+ return;
+ }
+ _mainSys = mainSys;
+
+ _graphicsMutex = createMutex();
+
+ _inited = true;
+}
+
+void SdlSubSys_Mutex::mutexDone() {
+ deleteMutex(_graphicsMutex);
+
+ _inited = false;
+}
+
+bool SdlSubSys_Mutex::hasFeature(Feature f) {
+ return false;
+}
+
+void SdlSubSys_Mutex::setFeatureState(Feature f, bool enable) {
+
+}
+
+bool SdlSubSys_Mutex::getFeatureState(Feature f) {
+ return false;
+}
+
+OSystem::MutexRef SdlSubSys_Mutex::createMutex() {
+ return (MutexRef) SDL_CreateMutex();
+}
+
+void SdlSubSys_Mutex::lockMutex(MutexRef mutex) {
+ SDL_mutexP((SDL_mutex *) mutex);
+}
+
+void SdlSubSys_Mutex::unlockMutex(MutexRef mutex) {
+ SDL_mutexV((SDL_mutex *) mutex);
+}
+
+void SdlSubSys_Mutex::deleteMutex(MutexRef mutex) {
+ SDL_DestroyMutex((SDL_mutex *) mutex);
+}
diff --git a/backends/platform/sdl/mutex.h b/backends/platform/sdl/mutex.h
new file mode 100644
index 0000000000..9479aa9ece
--- /dev/null
+++ b/backends/platform/sdl/mutex.h
@@ -0,0 +1,69 @@
+/* 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$
+ *
+ */
+
+#ifndef BACKENDS_SDL_SUBSYS_MUTEX_H
+#define BACKENDS_SDL_SUBSYS_MUTEX_H
+
+#include "backends/base-subsys-mutex.h"
+
+#if defined(__SYMBIAN32__)
+#include <esdl\SDL.h>
+#else
+#include <SDL.h>
+#endif
+
+class SdlSubSys_Mutex : public BaseSubSys_Mutex {
+public:
+ SdlSubSys_Mutex();
+ ~SdlSubSys_Mutex();
+
+ virtual void mutexInit(OSystem *mainSys);
+ virtual void mutexDone();
+
+ bool hasFeature(Feature f);
+ void setFeatureState(Feature f, bool enable);
+ bool getFeatureState(Feature f);
+
+ // Mutex handling
+ MutexRef createMutex();
+ void lockMutex(MutexRef mutex);
+ void unlockMutex(MutexRef mutex);
+ void deleteMutex(MutexRef mutex);
+
+protected:
+ bool _inited;
+
+ /**
+ * Mutex which prevents multiple threads from interfering with each other
+ * when accessing the screen.
+ */
+ MutexRef _graphicsMutex;
+
+private:
+ OSystem *_mainSys;
+};
+
+
+#endif
diff --git a/backends/platform/sdl/timer.cpp b/backends/platform/sdl/timer.cpp
new file mode 100644
index 0000000000..a6dfc67918
--- /dev/null
+++ b/backends/platform/sdl/timer.cpp
@@ -0,0 +1,121 @@
+/* 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$
+ *
+ */
+
+#include "backends/platform/sdl/timer.h"
+#include "backends/timer/default/default-timer.h"
+#include "common/EventRecorder.h"
+#include <time.h> // for getTimeAndDate()
+
+static Uint32 timer_handler(Uint32 interval, void *param) {
+ ((DefaultTimerManager *)param)->handler();
+ return interval;
+}
+
+SdlSubSys_Timer::SdlSubSys_Timer()
+ :
+ _inited(false),
+ _timerID(),
+ _timer(0) {
+
+}
+
+SdlSubSys_Timer::~SdlSubSys_Timer() {
+ if (_inited) {
+ timerDone();
+ }
+}
+
+void SdlSubSys_Timer::timerInit(OSystem *mainSys) {
+ if (_inited) {
+ return;
+ }
+ _mainSys = mainSys;
+
+ if (SDL_InitSubSystem(SDL_INIT_TIMER) == -1) {
+ error("Could not initialize SDL Timer: %s", SDL_GetError());
+ }
+
+ // Create and hook up the timer manager, if none exists yet (we check for
+ // this to allow subclasses to provide their own).
+ if (_timer == 0) {
+ // Note: We could implement a custom SDLTimerManager by using
+ // SDL_AddTimer. That might yield better timer resolution, but it would
+ // also change the semantics of a timer: Right now, ScummVM timers
+ // *never* run in parallel, due to the way they are implemented. If we
+ // switched to SDL_AddTimer, each timer might run in a separate thread.
+ // However, not all our code is prepared for that, so we can't just
+ // switch. Still, it's a potential future change to keep in mind.
+ _timer = new DefaultTimerManager();
+ _timerID = SDL_AddTimer(10, &timer_handler, _timer);
+ }
+
+ _inited = true;
+}
+
+void SdlSubSys_Timer::timerDone() {
+ delete _timer;
+ SDL_RemoveTimer(_timerID);
+ SDL_QuitSubSystem(SDL_INIT_TIMER);
+
+ _inited = false;
+}
+
+bool SdlSubSys_Timer::hasFeature(Feature f) {
+ return false;
+}
+
+void SdlSubSys_Timer::setFeatureState(Feature f, bool enable) {
+
+}
+
+bool SdlSubSys_Timer::getFeatureState(Feature f) {
+ return false;
+}
+
+uint32 SdlSubSys_Timer::getMillis() {
+ uint32 millis = SDL_GetTicks();
+ g_eventRec.processMillis(millis);
+ return millis;
+}
+
+void SdlSubSys_Timer::delayMillis(uint msecs) {
+ SDL_Delay(msecs);
+}
+
+void SdlSubSys_Timer::getTimeAndDate(TimeDate &td) const {
+ time_t curTime = time(0);
+ struct tm t = *localtime(&curTime);
+ td.tm_sec = t.tm_sec;
+ td.tm_min = t.tm_min;
+ td.tm_hour = t.tm_hour;
+ td.tm_mday = t.tm_mday;
+ td.tm_mon = t.tm_mon;
+ td.tm_year = t.tm_year;
+}
+
+Common::TimerManager *SdlSubSys_Timer::getTimerManager() {
+ assert(_timer);
+ return _timer;
+}
diff --git a/backends/platform/sdl/timer.h b/backends/platform/sdl/timer.h
new file mode 100644
index 0000000000..1d15b5ad98
--- /dev/null
+++ b/backends/platform/sdl/timer.h
@@ -0,0 +1,69 @@
+/* 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$
+ *
+ */
+
+#ifndef BACKENDS_SDL_SUBSYS_TIMER_H
+#define BACKENDS_SDL_SUBSYS_TIMER_H
+
+#include "backends/base-subsys-timer.h"
+
+#if defined(__SYMBIAN32__)
+#include <esdl\SDL.h>
+#else
+#include <SDL.h>
+#endif
+
+class SdlSubSys_Timer : public BaseSubSys_Timer {
+public:
+ SdlSubSys_Timer();
+ ~SdlSubSys_Timer();
+
+ virtual void timerInit(OSystem *mainSys);
+ virtual void timerDone();
+
+ bool hasFeature(Feature f);
+ void setFeatureState(Feature f, bool enable);
+ bool getFeatureState(Feature f);
+
+ // Get the number of milliseconds since the program was started.
+ uint32 getMillis();
+
+ // Delay for a specified amount of milliseconds
+ void delayMillis(uint msecs);
+
+ virtual void getTimeAndDate(TimeDate &t) const;
+ virtual Common::TimerManager *getTimerManager();
+
+protected:
+ bool _inited;
+
+ SDL_TimerID _timerID;
+ Common::TimerManager *_timer;
+
+private:
+ OSystem *_mainSys;
+};
+
+
+#endif