Salome HOME
Copyright update 2021
[modules/kernel.git] / src / Basics / Basics_DirUtils.cxx
index aa147cf4c0509561d7787676b56d1644ade98995..01d32f935d8902f17bf74715fdbf756af696504b 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2007-2019  CEA/DEN, EDF R&D, OPEN CASCADE
+// Copyright (C) 2007-2021  CEA/DEN, EDF R&D, OPEN CASCADE
 //
 // This library is free software; you can redistribute it and/or
 // modify it under the terms of the GNU Lesser General Public
 //  Module : SALOME
 //
 #include "Basics_DirUtils.hxx"
+#include "Basics_Utils.hxx"
 #include <stdio.h>
 #include <errno.h>
 #include <stdlib.h>
 
+#include <algorithm>
+
 #ifndef WIN32
 # include <sys/stat.h>
 # include <dirent.h>
@@ -51,29 +54,35 @@ namespace Kernel_Utils
   std::string GetBaseName( const std::string& file_path, const bool with_extension )
   {
     std::string tmp_str = file_path;
-    int pos = file_path.rfind( _separator_ );
-    if ( pos >= 0 )
-      tmp_str = pos < (int)file_path.size()-1 ? file_path.substr( pos+1 ) : "";
+    auto pos = file_path.rfind( _separator_ );
+    if ( pos != std::string::npos )
+      tmp_str = pos < file_path.size()-1 ? file_path.substr( pos+1 ) : "";
 
     pos = tmp_str.rfind( _extension_ );
-    if( !with_extension && pos >= 0 )
-      tmp_str = pos < (int)tmp_str.size()-1 ? tmp_str.substr( 0, pos ) : "";
+    if( !with_extension && pos != std::string::npos )
+      tmp_str = pos < tmp_str.size()-1 ? tmp_str.substr( 0, pos ) : "";
 
     return tmp_str;
   }
 
   std::string GetDirName( const std::string& file_path )
   {
-    int pos = file_path.rfind( _separator_ );
-    if ( pos >= 0 )
-      return pos < (int)file_path.size()-1 ? file_path.substr(0, pos ) : "";
+    auto pos = file_path.rfind( _separator_ );
+    if ( pos != std::string::npos )
+      return pos < file_path.size()-1 ? file_path.substr(0, pos ) : "";
     return std::string(".");
   }
 
   std::string GetTmpDirByEnv( const std::string& tmp_path_env )
   {
+#if defined WIN32 && defined UNICODE
+   std::wstring w_tmp_path_env = utf8_decode_s( tmp_path_env );
+   wchar_t* val = _wgetenv( w_tmp_path_env.c_str() );
+   std::string dir = val ? utf8_encode_s(val) : "";
+#else 
     char* val = getenv( tmp_path_env.c_str() );
-    std::string dir = val ? val : "";
+       std::string dir = val ? val : "";
+#endif
     return GetTmpDirByPath( dir );
   }
 
@@ -83,6 +92,15 @@ namespace Kernel_Utils
     if ( aTmpDir == "" || !IsExists( aTmpDir ))
     {
 #ifdef WIN32
+#ifdef UNICODE
+         wchar_t *wTmp_dir = _wgetenv( L"TEMP" );
+         if ( wTmp_dir == NULL ) {
+                       wTmp_dir = _wgetenv(L"TMP");
+                       if (wTmp_dir == NULL)
+                               wTmp_dir = L"C:\\";
+         }
+         aTmpDir = utf8_encode_s( wTmp_dir );
+#else
       char *Tmp_dir = getenv("TEMP");
       if ( Tmp_dir == NULL )
       {
@@ -94,6 +112,7 @@ namespace Kernel_Utils
       }
       else
         aTmpDir = Tmp_dir;
+#endif
 #else
       aTmpDir = "/tmp/";
 #endif
@@ -121,12 +140,16 @@ namespace Kernel_Utils
 
     if ( aDir.back() != _separator_ ) aDir += _separator_;
 
-#ifdef WIN32
-    CreateDirectory( aDir.c_str(), NULL );
+#ifdef WIN32   
+#ifdef UNICODE
+       std::wstring aDirToCreate = utf8_decode_s(aDir);
+#else
+       std::string aDirToCreate = aDir;
+#endif
+    CreateDirectory( aDirToCreate.c_str(), NULL );
 #else
     mkdir( aDir.c_str(), 0x1ff );
 #endif
-
     return aDir;
   }
 
@@ -167,8 +190,8 @@ namespace Kernel_Utils
   std::string AddExtension( const std::string& name )
   {
     std::string tmp_str = name;
-    int pos = tmp_str.rfind( _extension_ );
-    if( pos < 0 )
+    auto pos = tmp_str.rfind( _extension_ );
+    if( pos == std::string::npos )
       return tmp_str.append( _extension_ );
     return tmp_str;
   }
@@ -179,7 +202,11 @@ namespace Kernel_Utils
   //============================================================================ 
   bool IsExists(const std::string& thePath) 
   {
+#if defined WIN32 && defined UNICODE
+       int status = _waccess( utf8_decode_s( thePath).c_str(), F_OK );
+#else
     int status = access ( thePath.c_str() , F_OK ); 
+#endif
     if (status != 0) return false;
     return true;
   }
@@ -188,10 +215,15 @@ namespace Kernel_Utils
   // function : IsWritable
   // purpose  : Returns True(False) if the path is (not) writable
   //============================================================================ 
-  bool IsWritable(const std::string& thePath) 
+  bool IsWritable(const std::string& thePath)
   {
-#ifdef WIN32 
-    if (  GetFileAttributes (  thePath.c_str()  ) == 0xFFFFFFFF  ) { 
+#ifdef WIN32
+#ifdef UNICODE
+         std::wstring aPathToCheck = utf8_decode_s( thePath );
+#else
+         std::string aPathToCheck = thePath;
+#endif
+    if (  GetFileAttributes ( aPathToCheck.c_str()  ) == 0xFFFFFFFF  ) {
       if (  GetLastError () == FILE_ATTRIBUTE_READONLY ) {
         return false;
       }
@@ -271,7 +303,13 @@ namespace Kernel_Utils
 
 #ifdef WIN32
     WIN32_FIND_DATA aFileData;
-    HANDLE hFile = FindFirstFile( thePath.c_str(), &aFileData );
+#ifdef UNICODE
+       std::wstring aPathToCheck = utf8_decode_s(thePath);
+#else
+       std::string aPathToCheck = thePath;
+#endif
+
+    HANDLE hFile = FindFirstFile( aPathToCheck.c_str(), &aFileData );
     if ( hFile == INVALID_HANDLE_VALUE )
     {
       //empty dir
@@ -303,4 +341,28 @@ namespace Kernel_Utils
 #endif
     return result;
   }
+
+  //============================================================================
+  // function : BackSlashToSlash  
+  // purpose  : Convert back slash to slash
+  //============================================================================ 
+  std::string BackSlashToSlash(const std::string& path) {
+         std::string res = path;
+         std::replace(res.begin(), res.end(), '\\', '/');
+         return res;
+  }
+
+
+  //============================================================================
+  // function : BackSlashToSlash  
+  // purpose  : Convert back slash to slash
+  //============================================================================ 
+  std::string HomePath() {
+#ifdef WIN32
+    std::string homedir = getenv("USERPROFILE");
+#else
+    std::string homedir = getenv("HOME");       
+#endif
+    return homedir;
+  }
 }