aboutsummaryrefslogtreecommitdiff
path: root/backends
diff options
context:
space:
mode:
authorVincent Bénony2016-02-26 09:50:39 +0100
committerVincent Bénony2016-02-26 09:50:39 +0100
commit587d5d570310118595140b475d77a4be9999963d (patch)
tree4837885fa7bc33b3a2e7efd574ec28e5dbebe395 /backends
parent2a98be9f350d136cdcc956cd4df200df6cecd9a7 (diff)
downloadscummvm-rg350-587d5d570310118595140b475d77a4be9999963d.tar.gz
scummvm-rg350-587d5d570310118595140b475d77a4be9999963d.tar.bz2
scummvm-rg350-587d5d570310118595140b475d77a4be9999963d.zip
IOS: Fixes savegame deletion on sandboxed iOS devices
Diffstat (limited to 'backends')
-rw-r--r--backends/platform/ios7/ios7_osys_main.cpp32
-rw-r--r--backends/platform/ios7/ios7_osys_main.h4
2 files changed, 34 insertions, 2 deletions
diff --git a/backends/platform/ios7/ios7_osys_main.cpp b/backends/platform/ios7/ios7_osys_main.cpp
index c1280a2969..25d9cbed15 100644
--- a/backends/platform/ios7/ios7_osys_main.cpp
+++ b/backends/platform/ios7/ios7_osys_main.cpp
@@ -79,6 +79,33 @@ AQCallbackStruct OSystem_iOS7::s_AudioQueue;
SoundProc OSystem_iOS7::s_soundCallback = NULL;
void *OSystem_iOS7::s_soundParam = NULL;
+#ifdef IPHONE_SANDBOXED
+class SandboxedSaveFileManager : public DefaultSaveFileManager {
+ Common::String _sandboxRootPath;
+public:
+
+ SandboxedSaveFileManager(Common::String sandboxRootPath, Common::String defaultSavepath)
+ : DefaultSaveFileManager(defaultSavepath), _sandboxRootPath(sandboxRootPath) {
+ }
+
+ virtual bool removeSavefile(const Common::String &filename) override {
+ Common::String chrootedFile = getSavePath() + "/" + filename;
+ Common::String realFilePath = _sandboxRootPath + chrootedFile;
+
+ if (remove(realFilePath.c_str()) != 0) {
+ if (errno == EACCES)
+ setError(Common::kWritePermissionDenied, "Search or write permission denied: "+chrootedFile);
+
+ if (errno == ENOENT)
+ setError(Common::kPathDoesNotExist, "removeSavefile: '"+chrootedFile+"' does not exist or path is invalid");
+ return false;
+ } else {
+ return true;
+ }
+ }
+};
+#endif
+
OSystem_iOS7::OSystem_iOS7() :
_mixer(NULL), _lastMouseTap(0), _queuedEventTime(0),
_mouseNeedTextureUpdate(false), _secondaryTapped(false), _lastSecondaryTap(0),
@@ -89,7 +116,8 @@ OSystem_iOS7::OSystem_iOS7() :
_queuedInputEvent.type = Common::EVENT_INVALID;
_touchpadModeEnabled = !iOS7_isBigDevice();
#ifdef IPHONE_SANDBOXED
- _fsFactory = new ChRootFilesystemFactory(iOS7_getDocumentsDir());
+ _chrootBasePath = iOS7_getDocumentsDir();
+ _fsFactory = new ChRootFilesystemFactory(_chrootBasePath);
#else
_fsFactory = new POSIXFilesystemFactory();
#endif
@@ -124,7 +152,7 @@ int OSystem_iOS7::timerHandler(int t) {
void OSystem_iOS7::initBackend() {
#ifdef IPHONE_SANDBOXED
- _savefileManager = new DefaultSaveFileManager("/Savegames");
+ _savefileManager = new SandboxedSaveFileManager(_chrootBasePath, "/Savegames");
#else
_savefileManager = new DefaultSaveFileManager(SCUMMVM_SAVE_PATH);
#endif
diff --git a/backends/platform/ios7/ios7_osys_main.h b/backends/platform/ios7/ios7_osys_main.h
index cc2f1ccc06..174c160bd6 100644
--- a/backends/platform/ios7/ios7_osys_main.h
+++ b/backends/platform/ios7/ios7_osys_main.h
@@ -111,6 +111,10 @@ protected:
char *_lastErrorMessage;
+#ifdef IPHONE_SANDBOXED
+ Common::String _chrootBasePath;
+#endif
+
public:
OSystem_iOS7();