Salome HOME
Merge branch 'rnv/unicode_path'
[modules/kernel.git] / src / Basics / Basics_DirUtils.cxx
index a6ee8c0e378b61b4537369bce9251d5987fd4b25..daa4b8f55567d6ed3cb697e7a232b363b17baedd 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2007-2016  CEA/DEN, EDF R&D, OPEN CASCADE
+// Copyright (C) 2007-2019  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
 //
 
 //  File   : Basics_DirUtils.cxx
-//  Autor  : Alexander A. BORODIN
+//  Author  : Alexander A. BORODIN
 //  Module : SALOME
 //
 #include "Basics_DirUtils.hxx"
+#include "Basics_Utils.hxx"
 #include <stdio.h>
 #include <errno.h>
 #include <stdlib.h>
@@ -50,7 +51,7 @@ namespace Kernel_Utils
 {
   std::string GetBaseName( const std::string& file_path, const bool with_extension )
   {
-       std::string tmp_str = file_path;
+    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 ) : "";
@@ -72,69 +73,88 @@ namespace Kernel_Utils
 
   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 );
   }
 
   std::string GetTmpDirByPath( const std::string& tmp_path )
   {
     std::string aTmpDir = tmp_path;
-    if ( aTmpDir == "" )
-      {
+    if ( aTmpDir == "" || !IsExists( aTmpDir ))
+    {
 #ifdef WIN32
-        char *Tmp_dir = getenv("TEMP");
-        if( Tmp_dir == NULL )
-          {
-            Tmp_dir = getenv("TMP");
-            if (Tmp_dir == NULL)
-              aTmpDir = std::string("C:\\");
-            else 
-              aTmpDir = std::string(Tmp_dir);
-          }
+#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 )
+      {
+        Tmp_dir = getenv("TMP");
+        if ( Tmp_dir == NULL )
+          aTmpDir = "C:\\";
         else
-          aTmpDir = std::string(Tmp_dir);
+          aTmpDir = Tmp_dir;
+      }
+      else
+        aTmpDir = Tmp_dir;
+#endif
 #else
-        aTmpDir = std::string("/tmp/");
+      aTmpDir = "/tmp/";
 #endif
-      }
-    
-    if(aTmpDir[aTmpDir.size()-1] != _separator_)
-      aTmpDir+=_separator_;
-    
-    srand((unsigned int)time(NULL));
+    }
+
+    if ( aTmpDir.back() != _separator_ )
+      aTmpDir += _separator_;
+
+    srand( (unsigned int)time( NULL ));
     int aRND = 999 + (int)(100000.0*rand()/(RAND_MAX+1.0)); //Get a random number to present a name of a sub directory
     char buffer[127];
-    sprintf(buffer, "%d", aRND);
-    std::string aSubDir(buffer);
-    if(aSubDir.size() <= 1) aSubDir = std::string("123409876");
-    
+    sprintf( buffer, "%d", aRND );
+    std::string aSubDir( buffer );
+    if ( aSubDir.size() <= 1 ) aSubDir = "123409876";
+
     aTmpDir += aSubDir; //Get RND sub directory
-    
+
     std::string aDir = aTmpDir;
-    
-    if(IsExists(aDir)) {
-      for(aRND = 0; IsExists(aDir); aRND++) {
-        sprintf(buffer, "%d", aRND);
-        aDir = aTmpDir+buffer;  //Build a unique directory name
-      }
+
+    for ( aRND = 0; IsExists( aDir ); aRND++ )
+    {
+      sprintf( buffer, "%d", aRND );
+      aDir = aTmpDir + buffer;  //Build a unique directory name
     }
-    
-    if(aDir[aDir.size()-1] != _separator_) aDir += _separator_;
-    
-#ifdef WIN32
-    CreateDirectory(aDir.c_str(), NULL);
+
+    if ( aDir.back() != _separator_ ) aDir += _separator_;
+
+#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); 
+    mkdir( aDir.c_str(), 0x1ff );
 #endif
-    
     return aDir;
   }
-  
+
   //============================================================================
   // function : GetTempDir
-  // purpose  : Returns a temp directory to store created files like "/tmp/sub_dir/" 
-  //============================================================================ 
+  // purpose  : Returns a temp directory to store created files like "/tmp/sub_dir/"
+  //============================================================================
   std::string GetTmpDir()
   {
     return GetTmpDirByPath( "" );
@@ -180,7 +200,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;
   }
@@ -189,10 +213,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;
       }
@@ -272,7 +301,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