From 16c559a095af85a7f553912461cf4468366070a7 Mon Sep 17 00:00:00 2001 From: Alejandro Marzini Date: Sat, 29 May 2010 01:56:34 +0000 Subject: Added again base-backend. Started sdl backend refatoring, file, mutex and timer subsystems created. svn-id: r49305 --- backends/platform/sdl/file.cpp | 235 ++++++++++++++++++++++++++++++++++++++++ backends/platform/sdl/file.h | 67 ++++++++++++ backends/platform/sdl/mutex.cpp | 83 ++++++++++++++ backends/platform/sdl/mutex.h | 69 ++++++++++++ backends/platform/sdl/timer.cpp | 121 +++++++++++++++++++++ backends/platform/sdl/timer.h | 69 ++++++++++++ 6 files changed, 644 insertions(+) create mode 100644 backends/platform/sdl/file.cpp create mode 100644 backends/platform/sdl/file.h create mode 100644 backends/platform/sdl/mutex.cpp create mode 100644 backends/platform/sdl/mutex.h create mode 100644 backends/platform/sdl/timer.cpp create mode 100644 backends/platform/sdl/timer.h (limited to 'backends/platform/sdl') 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 +// 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 +#else +#include +#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 +#else +#include +#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 // 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 +#else +#include +#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 -- cgit v1.2.3