setup of save directory works

This commit is contained in:
Martin Felis
2013-12-28 19:32:46 +01:00
parent 6518cde39a
commit f58dcdf03a
@@ -30,6 +30,13 @@
#include "SDL.h"
#include <string>
#ifdef __ANDROID__
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
#include <errno.h>
#endif
namespace
{
size_t getDriveDelim(const std::string &input)
@@ -52,6 +59,54 @@ namespace
}
#ifdef __ANDROID__
bool androidDirectoryExists(const char* path) {
SDL_Log ("Checking directory exists for %s", path);
struct stat s;
int err = stat(path, &s);
if (err == -1) {
if (errno == ENOENT)
return false;
else {
SDL_Log ("Error checking for directory %s errno = %d: %s", path, errno, strerror (errno));
return false;
}
} else if(S_ISDIR(s.st_mode)) {
SDL_Log ("Directory %s exists!", path);
return true;
}
return false;
}
bool androidMkdir (const char* path) {
int err = mkdir (path, 0770);
if (err == -1) {
SDL_Log ("Error: Could not create directory %s", path);
return false;
}
return true;
}
bool androidCreateStorageDirectories () {
std::string internal_storage_path = SDL_AndroidGetInternalStoragePath();
std::string save_directory = internal_storage_path + "/save";
if (!androidDirectoryExists (save_directory.c_str())) {
if (!androidMkdir(save_directory.c_str()))
return false;
}
std::string game_directory = internal_storage_path + "/game";
if (!androidDirectoryExists (game_directory.c_str())) {
if (!androidMkdir(game_directory.c_str()))
return false;
}
SDL_Log ("Creating storage directories successful!");
return true;
}
bool androidCopyGameFromAssets () {
SDL_RWops *asset_game_file = SDL_RWFromFile("game.love", "rb");
@@ -69,7 +124,7 @@ namespace
SDL_Log ("Found game.love in assets. Size: %d", (int) file_size);
std::string internal_storage_path = SDL_AndroidGetInternalStoragePath();
std::string internal_game_file = internal_storage_path + "/game.love";
std::string internal_game_file = internal_storage_path + "/game/game.love";
SDL_RWops *storage_game_file = SDL_RWFromFile (internal_game_file.c_str(), "wb");
if (!storage_game_file) {
@@ -157,6 +212,8 @@ bool Filesystem::isFused() const
bool Filesystem::setIdentity(const char *ident, bool appendToPath)
{
SDL_Log ("identity = %s", ident);
if (!initialized)
return false;
@@ -175,6 +232,31 @@ bool Filesystem::setIdentity(const char *ident, bool appendToPath)
else
save_path_full += save_path_relative;
#ifdef __ANDROID__
std::string internal_storage_path = SDL_AndroidGetInternalStoragePath();
std::string save_directory = internal_storage_path + "/save";
save_path_full = std::string(SDL_AndroidGetInternalStoragePath()) + std::string("/save/") + save_identity;
if (androidDirectoryExists (save_path_full.c_str())) {
SDL_Log ("dir exists");
} else {
SDL_Log ("does not exist");
}
if (!androidDirectoryExists (save_path_full.c_str())) {
if (!androidMkdir (save_path_full.c_str())) {
SDL_Log ("Error: Could not create save directory %s!", save_path_full.c_str());
} else {
SDL_Log ("Save directory %s successfuly created!", save_path_full.c_str());
}
} else {
SDL_Log ("Save directory %s exists!", save_path_full.c_str());
}
#endif
// We now have something like:
// save_identity: game
// save_path_relative: ./LOVE/game
@@ -209,8 +291,12 @@ bool Filesystem::setSource(const char *source)
std::string new_search_path = source;
#ifdef __ANDROID__
if (!androidCreateStorageDirectories ()) {
SDL_Log ("Error creating storage directories!");
}
if (androidCopyGameFromAssets())
new_search_path = std::string(SDL_AndroidGetInternalStoragePath()) + std::string("/game.love");
new_search_path = std::string(SDL_AndroidGetInternalStoragePath()) + std::string("/game/game.love");
else {
SDL_RWops *sdcard_main = SDL_RWFromFile("/sdcard/lovegame/main.lua", "rb");