[colobot] 187/390: PHYSFS in CStudio

Didier Raboud odyx at moszumanska.debian.org
Fri Jun 12 14:21:44 UTC 2015


This is an automated email from the git hooks/post-receive script.

odyx pushed a commit to branch upstream/latest
in repository colobot.

commit c330bcac6dc47a99038710cce9fd9ff03613a181
Author: krzys-h <krzys_h at interia.pl>
Date:   Mon Nov 10 18:17:13 2014 +0100

    PHYSFS in CStudio
---
 src/common/resources/resourcemanager.cpp | 24 ++++++++++++++-
 src/common/resources/resourcemanager.h   |  6 ++++
 src/ui/studio.cpp                        | 51 +++++++++++---------------------
 src/ui/studio.h                          |  2 +-
 4 files changed, 48 insertions(+), 35 deletions(-)

diff --git a/src/common/resources/resourcemanager.cpp b/src/common/resources/resourcemanager.cpp
index d2d69f5..7329871 100644
--- a/src/common/resources/resourcemanager.cpp
+++ b/src/common/resources/resourcemanager.cpp
@@ -167,7 +167,7 @@ bool CResourceManager::CreateDirectory(const std::string& directory)
     return PHYSFS_mkdir(CleanPath(directory).c_str());
 }
 
-//TODO: Don't use boost filesystem here
+//TODO: Don't use boost::filesystem here
 bool CResourceManager::RemoveDirectory(const std::string& directory)
 {
     bool success = true;
@@ -219,6 +219,28 @@ std::vector<std::string> CResourceManager::ListDirectories(const std::string &di
     return result;
 }
 
+long long CResourceManager::GetFileSize(const std::string& filename)
+{
+    if(PHYSFS_isInit())
+    {
+        PHYSFS_File* file = PHYSFS_openRead(CleanPath(filename).c_str());
+        if(file == nullptr) return -1;
+        long long size = PHYSFS_fileLength(file);
+        PHYSFS_close(file);
+        return size;
+    }
+    return -1;
+}
+
+long long CResourceManager::GetLastModificationTime(const std::string& filename)
+{
+    if(PHYSFS_isInit())
+    {
+        return PHYSFS_getLastModTime(CleanPath(filename).c_str());
+    }
+    return -1;
+}
+
 
 int CResourceManager::SDLClose(SDL_RWops *context)
 {
diff --git a/src/common/resources/resourcemanager.h b/src/common/resources/resourcemanager.h
index 4d79e9b..e34ea10 100644
--- a/src/common/resources/resourcemanager.h
+++ b/src/common/resources/resourcemanager.h
@@ -56,6 +56,12 @@ public:
     static std::vector<std::string> ListFiles(const std::string &directory);
     //! List directories contained in directory
     static std::vector<std::string> ListDirectories(const std::string &directory);
+    
+    
+    //! Returns file size in bytes
+    static long long GetFileSize(const std::string &filename);
+    //! Returns last modification date as timestamp
+    static long long GetLastModificationTime(const std::string &filename);
 
 private:
     static int SDLSeek(SDL_RWops *context, int offset, int whence);
diff --git a/src/ui/studio.cpp b/src/ui/studio.cpp
index efdbbbc..4551d7b 100644
--- a/src/ui/studio.cpp
+++ b/src/ui/studio.cpp
@@ -1496,7 +1496,6 @@ void CStudio::UpdateDialogList()
 {
     CWindow*        pw;
     CList*          pl;
-    fs::path        path;
     int             i = 0;
     char            time[100];
 
@@ -1506,52 +1505,38 @@ void CStudio::UpdateDialogList()
     if ( pl == nullptr )  return;
     pl->Flush();
 
-    path = fs::path(SearchDirectory(false));
-    fs::directory_iterator end_iter;
-    if ( fs::exists(path) && fs::is_directory(path) )
-    {
-        for( fs::directory_iterator file(path); file != end_iter; file++)
-        {
-            if (fs::is_regular_file(file->status()) )
-            {
-                std::ostringstream temp;
-                TimeToAscii(fs::last_write_time(file->path()), time);
-                temp << file->path().filename().string() << '\t' << fs::file_size(file->path()) << "  \t" << time;
-                pl->SetItemName(i++, temp.str().c_str());
-            }
-        }
+    if(!CResourceManager::DirectoryExists(SearchDirectory(false)))
+        return;
+    
+    std::vector<std::string> programs = CResourceManager::ListFiles(SearchDirectory(false));
+    for(auto& prog : programs) {
+        std::ostringstream temp;
+        TimeToAscii(CResourceManager::GetLastModificationTime(SearchDirectory(false) + prog), time);
+        temp << prog << '\t' << CResourceManager::GetFileSize(SearchDirectory(false) + prog) << "  \t" << time;
+        pl->SetItemName(i++, temp.str().c_str());
     }
 }
 
 // Constructs the name of the folder or open/save.
 // If the folder does not exist, it will be created.
-//TODO: Refactor to PHYSFS
-std::string CStudio::SearchDirectory(bool bCreate, bool physfsReady)
+std::string CStudio::SearchDirectory(bool bCreate)
 {
-    char dir[MAX_FNAME];
+    std::string dir;
     if ( m_main->GetIOPublic() )
     {
-        sprintf(dir, "%s/", m_main->GetPublicDir());
+        dir = std::string(m_main->GetPublicDir()) + "/";
     }
     else
     {
-        sprintf(dir, "%s/%s/Program/", m_main->GetSavegameDir(), m_main->GetGamerName());
+        dir = std::string(m_main->GetPHYSFSSavegameDir()) + "/" + std::string(m_main->GetGamerName()) + "/program/";
     }
 
     if ( bCreate )
     {
-        fs::path path = fs::path(dir);
-        fs::create_directories(path);
-    }
-
-    std::string dir2 = dir;
-    if(physfsReady) {
-        std::string savedir = CResourceManager::GetSaveLocation()+"/";
-        boost::replace_all(dir2, "\\", "/");
-        boost::replace_all(savedir, "\\", "/");
-        boost::replace_all(dir2, savedir, "");
+        if(!CResourceManager::DirectoryExists(dir))
+            CResourceManager::CreateDirectory(dir);
     }
-    return dir2;
+    return dir;
 }
 
 // Reads a new program.
@@ -1577,7 +1562,7 @@ bool CStudio::ReadProgram()
     {
         strcat(filename, ".txt");
     }
-    strcpy(dir, SearchDirectory(true, true).c_str());
+    strcpy(dir, SearchDirectory(true).c_str());
     strcat(dir, filename);
 
     pw = static_cast< CWindow* >(m_interface->SearchControl(EVENT_WINDOW3));
@@ -1615,7 +1600,7 @@ bool CStudio::WriteProgram()
     {
         strcat(filename, ".txt");
     }
-    strcpy(dir, SearchDirectory(true, true).c_str());
+    strcpy(dir, SearchDirectory(true).c_str());
     strcat(dir, filename);
 
     pw = static_cast< CWindow* >(m_interface->SearchControl(EVENT_WINDOW3));
diff --git a/src/ui/studio.h b/src/ui/studio.h
index dda1368..a11d706 100644
--- a/src/ui/studio.h
+++ b/src/ui/studio.h
@@ -88,7 +88,7 @@ protected:
     void        UpdateDialogAction();
     void        UpdateDialogPublic();
     void        UpdateDialogList();
-    std::string  SearchDirectory(bool bCreate, bool physfsReady=false);
+    std::string  SearchDirectory(bool bCreate);
     bool        ReadProgram();
     bool        WriteProgram();
 

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-games/colobot.git



More information about the Pkg-games-commits mailing list