From 48f4b84b47b7ca9f54677b1bea41e0a065faad26 Mon Sep 17 00:00:00 2001 From: mpv Date: Wed, 3 Apr 2019 13:49:51 +0300 Subject: [PATCH] Fix for the issue #2899 : Not activated parts are not saved --- src/XGUI/XGUI_Tools.cpp | 106 +++++++++++++++++++++++++++++++++++++ src/XGUI/XGUI_Tools.h | 8 +++ src/XGUI/XGUI_Workshop.cpp | 18 +++++-- 3 files changed, 127 insertions(+), 5 deletions(-) diff --git a/src/XGUI/XGUI_Tools.cpp b/src/XGUI/XGUI_Tools.cpp index a5b71682c..cb66e1837 100644 --- a/src/XGUI/XGUI_Tools.cpp +++ b/src/XGUI/XGUI_Tools.cpp @@ -51,6 +51,19 @@ #include #include +#ifndef WIN32 +# include +# include +# include +# define _separator_ '/' +#else +#include +#define F_OK 0 +#define access _access +# include +# define _separator_ '\\' +#endif + namespace XGUI_Tools { //****************************************************************** QString dir(const QString& path, bool isAbs) @@ -276,4 +289,97 @@ QString generateName(const ModuleBase_ViewerPrsPtr& thePrs) return aName; } +std::wstring strToWStr(const std::string& theStr) { + size_t aLen = theStr.size(); + std::wstring aResult(aLen, L'#'); + mbstowcs(&aResult[0], theStr.c_str(), aLen); + return aResult; +} + +std::string getTmpDirByPath( const std::string& theTmpPath) +{ + std::string aTmpDir = theTmpPath; + if (aTmpDir == "" || access(aTmpDir.c_str() , F_OK) != 0) { +#ifdef WIN32 + char *Tmp_dir = getenv("TEMP"); + if (Tmp_dir == NULL) { + Tmp_dir = getenv("TMP"); + if (Tmp_dir == NULL) + aTmpDir = "C:\\"; + else + aTmpDir = Tmp_dir; + } + else + aTmpDir = Tmp_dir; +#else + aTmpDir = "/tmp/"; +#endif + } + + if (aTmpDir.back() != _separator_) + aTmpDir += _separator_; + + srand((unsigned int)time( NULL )); + //Get a random number to present a name of a sub directory + int aRND = 999 + (int)(100000.0*rand()/(RAND_MAX+1.0)); + char buffer[127]; + sprintf(buffer, "%d", aRND); + std::string aSubDir(buffer); + if (aSubDir.size() <= 1) + aSubDir = "123049876"; + + aTmpDir += aSubDir; //Get RND sub directory + + std::string aDir = aTmpDir; + + for(aRND = 0; access(aDir.c_str() , F_OK) == 0; aRND++) { + sprintf( buffer, "%d", aRND ); + aDir = aTmpDir + buffer; //Build a unique directory name + } + if (aDir.back() != _separator_) + aDir += _separator_; + +#ifdef WIN32 + CreateDirectory(strToWStr(aDir).c_str(), NULL); +#else + mkdir( aDir.c_str(), 0x1ff ); +#endif + + return aDir; +} + +std::string getTmpDirByEnv( const char* thePathEnv) +{ + char* aVal = thePathEnv[0] == 0 ? 0 : getenv(thePathEnv); + std::string dir = aVal ? aVal : ""; + return getTmpDirByPath(dir).c_str(); +} + +void removeTemporaryFiles(const std::string& theDirectory, + const std::list& theFiles) +{ + std::string aDirName = theDirectory; + + std::list::const_iterator aFilesIter = theFiles.cbegin(); + for(; aFilesIter != theFiles.cend(); aFilesIter++) { + const std::string& aFile = *aFilesIter; + if(access(aFile.c_str() , F_OK) != 0) + continue; + +#ifdef WIN32 + DeleteFile(strToWStr(aFile).c_str()); +#else + unlink(aFile.c_str()); +#endif + } + + if(access(aDirName.c_str() , F_OK) == 0) { +#ifdef WIN32 + RemoveDirectory(strToWStr(aDirName).c_str()); +#else + rmdir(aDirName.c_str()); +#endif + } +} + } diff --git a/src/XGUI/XGUI_Tools.h b/src/XGUI/XGUI_Tools.h index 2bcb33228..54928254e 100644 --- a/src/XGUI/XGUI_Tools.h +++ b/src/XGUI/XGUI_Tools.h @@ -127,6 +127,14 @@ XGUI_EXPORT XGUI_Workshop* workshop(ModuleBase_IWorkshop* theWorkshop); /// \param thePrs a presentation /// \return string value XGUI_EXPORT QString generateName(const std::shared_ptr& thePrs); + +/// Creates and returns the temporary directory (with random name) using the environment variable +/// path to location of such directories, +std::string getTmpDirByEnv( const char* thePathEnv); + +/// Removes files and directory where they are located +void removeTemporaryFiles(const std::string& theDirectory, + const std::list& theFiles); }; #endif diff --git a/src/XGUI/XGUI_Workshop.cpp b/src/XGUI/XGUI_Workshop.cpp index f1d5d4f36..b42e4d003 100644 --- a/src/XGUI/XGUI_Workshop.cpp +++ b/src/XGUI/XGUI_Workshop.cpp @@ -1073,15 +1073,23 @@ bool XGUI_Workshop::onSave() aMgr->blockAutoUpdate(false); std::list aFiles; - saveDocument(myTmpDir.path(), aFiles); - if (!XGUI_CompressFiles::compress(myCurrentFile, aFiles)) - return false; + // issue #2899: create a temporary directory, save and then remove it +#ifdef HAVE_SALOME + std::string aTmpDir = XGUI_Tools::getTmpDirByEnv("SALOME_TMP_DIR"); +#else + std::string aTmpDir = XGUI_Tools::getTmpDirByEnv(""); +#endif + saveDocument(QString(aTmpDir.c_str()), aFiles); + bool aResult = XGUI_CompressFiles::compress(myCurrentFile, aFiles); + XGUI_Tools::removeTemporaryFiles(aTmpDir, aFiles); - updateCommandStatus(); + if (aResult) { + updateCommandStatus(); #ifndef HAVE_SALOME myMainWindow->setModifiedState(false); #endif - return true; + } + return aResult; } //****************************************************** -- 2.39.2