From 9a3cd67c3bb2f7d0d4b83f6a5ac8bbcfedf4207b Mon Sep 17 00:00:00 2001 From: krzys-h Date: Thu, 24 Jul 2014 23:38:13 +0200 Subject: Saving colobot.ini through physfs --- src/app/main.cpp | 4 ++++ src/app/system.cpp | 4 ++-- src/app/system.h | 4 ++-- src/app/system_linux.cpp | 24 +++++++++++------------ src/app/system_linux.h | 2 +- src/app/system_macosx.cpp | 11 ++++++----- src/app/system_macosx.h | 2 +- src/app/system_windows.cpp | 16 +++++++-------- src/app/system_windows.h | 2 +- src/common/profile.cpp | 30 +++++++++++++++++++---------- src/common/resources/outputstreambuffer.cpp | 1 + src/common/resources/resourcemanager.cpp | 23 +++++++++++----------- 12 files changed, 70 insertions(+), 53 deletions(-) diff --git a/src/app/main.cpp b/src/app/main.cpp index 6ba8da2..294b306 100644 --- a/src/app/main.cpp +++ b/src/app/main.cpp @@ -102,6 +102,9 @@ int SDL_MAIN_FUNC(int argc, char *argv[]) { return app->GetExitCode(); } + + manager.SetSaveLocation(systemUtils->GetSaveDir()); + manager.AddLocation(systemUtils->GetSaveDir(), true); int code = 0; @@ -121,6 +124,7 @@ int SDL_MAIN_FUNC(int argc, char *argv[]) delete app; delete systemUtils; + //delete manager; logger.Info("Exiting with code %d\n", code); return code; diff --git a/src/app/system.cpp b/src/app/system.cpp index b2e6b47..66d08e5 100644 --- a/src/app/system.cpp +++ b/src/app/system.cpp @@ -192,7 +192,7 @@ float CSystemUtils::TimeStampDiff(SystemTimeStamp *before, SystemTimeStamp *afte return result; } -std::string CSystemUtils::GetProfileFileLocation() +std::string CSystemUtils::GetSaveDir() { - return std::string("colobot.ini"); + return std::string("save"); } diff --git a/src/app/system.h b/src/app/system.h index 01f2672..6d2fe58 100644 --- a/src/app/system.h +++ b/src/app/system.h @@ -130,8 +130,8 @@ public: /** The difference is \a after - \a before. */ virtual long long TimeStampExactDiff(SystemTimeStamp *before, SystemTimeStamp *after) = 0; - //! Returns the profile (colobot.ini) file location - virtual std::string GetProfileFileLocation(); + //! Returns the save dir location + virtual std::string GetSaveDir(); }; //! Global function to get CSystemUtils instance diff --git a/src/app/system_linux.cpp b/src/app/system_linux.cpp index e584cd1..485d7c2 100644 --- a/src/app/system_linux.cpp +++ b/src/app/system_linux.cpp @@ -95,29 +95,29 @@ long long CSystemUtilsLinux::TimeStampExactDiff(SystemTimeStamp *before, SystemT (after->clockTime.tv_sec - before->clockTime.tv_sec) * 1000000000ll; } -std::string CSystemUtilsLinux::GetProfileFileLocation() +std::string CSystemUtilsLinux::GetSaveDir() { - std::string profileFile; - - // Determine profileFile according to XDG Base Directory Specification - char* envXDG_CONFIG_HOME = getenv("XDG_CONFIG_HOME"); - if (envXDG_CONFIG_HOME == NULL) + std::string savegameDir; + + // Determine savegame dir according to XDG Base Directory Specification + char *envXDG_DATA_HOME = getenv("XDG_CONFIG_DATA"); + if (envXDG_DATA_HOME == NULL) { char *envHOME = getenv("HOME"); if (envHOME == NULL) { - profileFile = "colobot.ini"; + savegameDir = "/tmp/colobot-save"; } else { - profileFile = std::string(envHOME) + "/.config/colobot.ini"; + savegameDir = std::string(envHOME) + "/.local/share/colobot"; } } else { - profileFile = std::string(envXDG_CONFIG_HOME) + "/colobot.ini"; + savegameDir = std::string(envXDG_DATA_HOME) + "/colobot"; } - GetLogger()->Trace("Profile configuration is %s\n", profileFile.c_str()); - - return profileFile; + GetLogger()->Trace("Saved game files are going to %s\n", savegameDir.c_str()); + + return savegameDir; } diff --git a/src/app/system_linux.h b/src/app/system_linux.h index ad26454..f9cce05 100644 --- a/src/app/system_linux.h +++ b/src/app/system_linux.h @@ -46,7 +46,7 @@ public: virtual long long GetTimeStampExactResolution() override; virtual long long TimeStampExactDiff(SystemTimeStamp *before, SystemTimeStamp *after) override; - virtual std::string GetProfileFileLocation() override; + virtual std::string GetSaveDir() override; private: bool m_zenityAvailable; diff --git a/src/app/system_macosx.cpp b/src/app/system_macosx.cpp index 38885eb..473a10c 100644 --- a/src/app/system_macosx.cpp +++ b/src/app/system_macosx.cpp @@ -87,10 +87,11 @@ void CSystemUtilsMacOSX::Init() m_dataPath += "/Contents/Resources"; } -std::string CSystemUtilsMacOSX::GetProfileFileLocation() +std::string CSystemUtilsMacOSX::GetSaveDir() { - std::string profileFile = m_ASPath + "/colobot.ini"; - - GetLogger()->Trace("Profile file is %s\n", profileFile.c_str()); - return profileFile; + std::string savegameDir = m_ASPath; + boost::filesystem::create_directories(savegameDir.c_str()); + GetLogger()->Trace("Saved game files are going to %s\n", savegameDir.c_str()); + + return savegameDir; } diff --git a/src/app/system_macosx.h b/src/app/system_macosx.h index 7360af1..6423320 100644 --- a/src/app/system_macosx.h +++ b/src/app/system_macosx.h @@ -28,7 +28,7 @@ class CSystemUtilsMacOSX : public CSystemUtilsOther public: virtual void Init() override; - virtual std::string GetProfileFileLocation() override; + virtual std::string GetSaveDir() override; private: std::string m_ASPath; std::string m_dataPath; diff --git a/src/app/system_windows.cpp b/src/app/system_windows.cpp index ffaa18a..e35f83f 100644 --- a/src/app/system_windows.cpp +++ b/src/app/system_windows.cpp @@ -111,20 +111,20 @@ std::wstring CSystemUtilsWindows::UTF8_Decode(const std::string& str) } -std::string CSystemUtilsWindows::GetProfileFileLocation() +std::string CSystemUtilsWindows::GetSaveDir() { - std::string profileFile; - + std::string savegameDir; + char* envUSERPROFILE = getenv("USERPROFILE"); if (envUSERPROFILE == NULL) { - profileFile = "colobot.ini"; + savegameDir = "save"; } else { - profileFile = std::string(envUSERPROFILE) + "\\colobot\\colobot.ini"; + savegameDir = std::string(envUSERPROFILE) + "\\colobot"; } - GetLogger()->Trace("Profile configuration is %s\n", profileFile.c_str()); - - return profileFile; + GetLogger()->Trace("Saved game files are going to %s\n", savegameDir.c_str()); + + return savegameDir; } diff --git a/src/app/system_windows.h b/src/app/system_windows.h index 0a41c1a..618caf9 100644 --- a/src/app/system_windows.h +++ b/src/app/system_windows.h @@ -44,7 +44,7 @@ public: virtual long long GetTimeStampExactResolution() override; virtual long long TimeStampExactDiff(SystemTimeStamp *before, SystemTimeStamp *after) override; - virtual std::string GetProfileFileLocation() override; + virtual std::string GetSaveDir() override; private: std::string UTF8_Encode(const std::wstring &wstr); diff --git a/src/common/profile.cpp b/src/common/profile.cpp index ee3e873..9947769 100644 --- a/src/common/profile.cpp +++ b/src/common/profile.cpp @@ -18,6 +18,8 @@ #include "common/profile.h" #include "common/logger.h" +#include "common/resources/inputstream.h" +#include "common/resources/outputstream.h" #include "app/system.h" @@ -47,11 +49,15 @@ bool CProfile::InitCurrentDirectory() { try { - #if DEV_BUILD - bp::ini_parser::read_ini("colobot.ini", m_propertyTree); - #else - bp::ini_parser::read_ini(GetSystemUtils()->GetProfileFileLocation(), m_propertyTree); - #endif + CInputStream stream; + stream.open("colobot.ini"); + if(stream.is_open()) { + bp::ini_parser::read_ini(stream, m_propertyTree); + } else { + GetLogger()->Error("Error on parsing profile: failed to open file\n"); + return false; + } + stream.close(); } catch (std::exception & e) { @@ -67,11 +73,15 @@ bool CProfile::SaveCurrentDirectory() { try { - #if DEV_BUILD - bp::ini_parser::write_ini("colobot.ini", m_propertyTree); - #else - bp::ini_parser::write_ini(GetSystemUtils()->GetProfileFileLocation(), m_propertyTree); - #endif + COutputStream stream; + stream.open("colobot.ini"); + if(stream.is_open()) { + bp::ini_parser::write_ini(stream, m_propertyTree); + } else { + GetLogger()->Error("Error on storing profile: failed to open file\n"); + return false; + } + stream.close(); } catch (std::exception & e) { diff --git a/src/common/resources/outputstreambuffer.cpp b/src/common/resources/outputstreambuffer.cpp index e611d13..22ed7cb 100644 --- a/src/common/resources/outputstreambuffer.cpp +++ b/src/common/resources/outputstreambuffer.cpp @@ -43,6 +43,7 @@ void COutputStreamBuffer::open(const std::string &filename) void COutputStreamBuffer::close() { + sync(); if (is_open()) PHYSFS_close(m_file); } diff --git a/src/common/resources/resourcemanager.cpp b/src/common/resources/resourcemanager.cpp index 5e8627d..be5baa8 100644 --- a/src/common/resources/resourcemanager.cpp +++ b/src/common/resources/resourcemanager.cpp @@ -18,15 +18,16 @@ #include "common/resources/resourcemanager.h" #include "common/config.h" +#include "common/logger.h" #include CResourceManager::CResourceManager(const char *argv0) { - if (PHYSFS_init(argv0)) + if (!PHYSFS_init(argv0)) { - // TODO error + CLogger::GetInstancePointer()->Error("Error while initializing physfs\n"); } } @@ -35,9 +36,9 @@ CResourceManager::~CResourceManager() { if (PHYSFS_isInit()) { - if (PHYSFS_deinit()) + if (!PHYSFS_deinit()) { - // TODO error + CLogger::GetInstancePointer()->Error("Error while deinitializing physfs\n"); } } } @@ -47,9 +48,9 @@ bool CResourceManager::AddLocation(const std::string &location, bool prepend) { if (PHYSFS_isInit()) { - if (PHYSFS_mount(location.c_str(), nullptr, prepend ? 0 : 1)) + if (!PHYSFS_mount(location.c_str(), nullptr, prepend ? 0 : 1)) { - // TODO error + CLogger::GetInstancePointer()->Error("Error while mounting \"%s\"\n", location.c_str()); } } @@ -61,9 +62,9 @@ bool CResourceManager::RemoveLocation(const std::string &location) { if (PHYSFS_isInit()) { - if (PHYSFS_removeFromSearchPath(location.c_str())) + if (!PHYSFS_removeFromSearchPath(location.c_str())) { - // TODO error + CLogger::GetInstancePointer()->Error("Error while unmounting \"%s\"\n", location.c_str()); } } @@ -75,9 +76,9 @@ bool CResourceManager::SetSaveLocation(const std::string &location) { if (PHYSFS_isInit()) { - if (PHYSFS_setWriteDir(location.c_str())) + if (!PHYSFS_setWriteDir(location.c_str())) { - // TODO error + CLogger::GetInstancePointer()->Error("Error while setting save location to \"%s\"\n", location.c_str()); } } @@ -96,7 +97,7 @@ SDL_RWops* CResourceManager::GetSDLFileHandler(const std::string &filename) SDL_RWops *handler = SDL_AllocRW(); if (!handler) { - // TODO error + CLogger::GetInstancePointer()->Error("Unable to allocate SDL_RWops for \"%s\"\n", filename.c_str()); return nullptr; } -- cgit v1.2.3-1-g7c22