Salome HOME
Run SALOME with UNICODE path
authorrnv <rnv@opencascade.com>
Thu, 21 Feb 2019 09:00:42 +0000 (12:00 +0300)
committerrnv <rnv@opencascade.com>
Mon, 11 Mar 2019 10:05:42 +0000 (13:05 +0300)
src/DriverDAT/DriverDAT_R_SMDS_Mesh.cxx
src/DriverDAT/DriverDAT_W_SMDS_Mesh.cxx
src/DriverGMF/libmesh5.c
src/DriverSTL/DriverSTL_R_SMDS_Mesh.cxx
src/DriverUNV/DriverUNV_R_SMDS_Mesh.cxx
src/DriverUNV/DriverUNV_W_SMDS_Mesh.cxx
src/MEDWrapper/MED_Factory.cxx
src/SMESHUtils/SMESH_File.cxx

index 07ac21b2ce4317c9c992860c5c8164cd4e28118d..9d34a3cd812ace4e3e82fe42444b033b824fb9e7 100644 (file)
@@ -50,8 +50,13 @@ Driver_Mesh::Status DriverDAT_R_SMDS_Mesh::Perform()
   /****************************************************************************
    *                      OUVERTURE DU FICHIER EN LECTURE                      *
    ****************************************************************************/
+#if defined(WIN32) && defined(UNICODE)
+  std::wstring file2Read = Kernel_Utils::utf8_decode_s(myFile);
+  FILE* aFileId = _wfopen(file2Read.c_str(), L"r");
+#else
   char *file2Read = (char *)myFile.c_str();
   FILE* aFileId = fopen(file2Read, "r");
+#endif
   if ( !aFileId ) {
     fprintf(stderr, ">> ERREUR : ouverture du fichier %s \n", file2Read);
     return DRS_FAIL;
index b72e64cf1dd0355a67835c6097fe85c3c1cb550b..1cf4667b5283a65fb30f04778b1df0872d6f963c 100644 (file)
@@ -38,9 +38,14 @@ Driver_Mesh::Status DriverDAT_W_SMDS_Mesh::Perform()
   Status aResult = DRS_OK;
 
   int nbNodes, nbCells;
+#if defined(WIN32) && defined(UNICODE)
+  std::wstring file2Read = Kernel_Utils::utf8_decode_s(myFile);
+  FILE* aFileId = _wfopen(file2Read.c_str(), L"w+");
 
+#else
   char *file2Read = (char *)myFile.c_str();
   FILE* aFileId = fopen(file2Read, "w+");
+#endif
   if ( !aFileId )
   {
     fprintf(stderr, ">> ERREUR : ouverture du fichier %s \n", file2Read);
index c7d6c52ea5fd3e8fec7c5f296a094557fd8fe4ab..889b69747137b6fd6b4eb4054a9390dba741f1c4 100644 (file)
@@ -26,7 +26,9 @@
 #include <math.h>
 #include <ctype.h>
 #include "libmesh5.h"
-
+#ifdef WIN32
+#include <windows.h>
+#endif
 
 /*----------------------------------------------------------*/
 /* Defines                                                                                                      */
@@ -190,7 +192,10 @@ int GmfOpenMesh(const char *FilNam, int mod, ...)
         GmfMshSct *msh;
         char *ptr;
         int k;
-
+#if defined(WIN32) && defined(UNICODE)
+               wchar_t* encoded = 0;
+               int size_needed = 0;
+#endif
         if(!GmfIniFlg)
         {
                 for(i=0;i<=MaxMsh;i++)
@@ -262,13 +267,27 @@ int GmfOpenMesh(const char *FilNam, int mod, ...)
                 va_end(VarArg);
 
                 /* Create the name string and open the file */
-
-                if(!(msh->hdl = fopen(msh->FilNam, "rb")))
+#if defined(WIN32) && defined(UNICODE)
+                               size_needed = MultiByteToWideChar(CP_UTF8, 0, msh->FilNam, strlen(msh->FilNam), NULL, 0);
+                               encoded = malloc((size_needed + 1)*sizeof(wchar_t));
+                               MultiByteToWideChar(CP_UTF8, 0, msh->FilNam, strlen(msh->FilNam), encoded, size_needed);
+                               encoded[size_needed] = '\0';
+                               if (!(msh->hdl = _wfopen(encoded, L"rb")))
+#else
+                               if (!(msh->hdl = fopen(msh->FilNam, "rb")))
+#endif
                 {
                         free (msh);
+#if defined(WIN32) && defined(UNICODE)
+                                               free(encoded);
+#endif
                         return(0);
                 }
 
+#if defined(WIN32) && defined(UNICODE)
+                               free(encoded);
+#endif
+
                 /* Read the endian coding tag, the mesh version and the mesh dimension (mandatory kwd) */
 
                 if(msh->typ & Bin)
@@ -401,13 +420,26 @@ int GmfOpenMesh(const char *FilNam, int mod, ...)
                 }
 
                 /* Create the mesh file */
-
+#if defined(WIN32) && defined(UNICODE)
+                               size_needed = MultiByteToWideChar(CP_UTF8, 0, msh->FilNam, strlen(msh->FilNam), NULL, 0);
+                               encoded = malloc((size_needed + 1) * sizeof(wchar_t));
+                               MultiByteToWideChar(CP_UTF8, 0, msh->FilNam, strlen(msh->FilNam), encoded, size_needed);
+                               encoded[size_needed] = '\0';
+                               if (!(msh->hdl = _wfopen(encoded, L"wb")))
+#else
                 if(!(msh->hdl = fopen(msh->FilNam, "wb")))
+#endif
                 {
                         free (msh);
+#if defined(WIN32) && defined(UNICODE)
+                                               free(encoded);
+#endif
                         return(0);
                 }
 
+#if defined(WIN32) && defined(UNICODE)
+                               free(encoded);
+#endif
                 GmfMshTab[ MshIdx ] = msh;
 
 
index c12c4eef889a57700e7299ce4f3a65c602e9a261..ec0b7028bde2ba4b57ebd868d11f8b62493b0207 100644 (file)
@@ -238,7 +238,12 @@ Driver_Mesh::Status DriverSTL_R_SMDS_Mesh::readAscii(SMESH_File& theFile) const
   theFile.close();
 
   // Open the file
-  FILE* file = fopen( myFile.c_str(),"r");
+#if defined(WIN32) && defined(UNICODE)
+  std::wstring aFile = Kernel_Utils::utf8_decode_s(myFile);
+  FILE* file = _wfopen( aFile.c_str(), L"r");
+#else
+  FILE* file = fopen(myFile.c_str(), "r");  
+#endif  
 
   // count the number of lines
   Standard_Integer nbLines = 0;
index 6d5146d927a31012a6b055942f8169e44e5809d9..7b48ee664e45a41391845ae4681eb9f939ed3373 100644 (file)
@@ -102,7 +102,12 @@ Driver_Mesh::Status DriverUNV_R_SMDS_Mesh::Perform()
 {
   Kernel_Utils::Localizer loc;
   Status aResult = DRS_OK;
+#if defined(WIN32) && defined(UNICODE)
+  std::wstring aFile = Kernel_Utils::utf8_decode_s(myFile);
+  std::ifstream in_stream(aFile.c_str());
+#else
   std::ifstream in_stream(myFile.c_str());
+#endif
   try
   {
     {
index dfe7b79e842538e3e6191646b50e064b3e750e14..639cedf9cab78629ae8c5c4ec552fccd9dada8f0 100644 (file)
@@ -45,7 +45,12 @@ Driver_Mesh::Status DriverUNV_W_SMDS_Mesh::Perform()
 {
   Kernel_Utils::Localizer loc;
   Status aResult = DRS_OK;
+#if defined(WIN32) && defined(UNICODE)
+  std::wstring aFile = Kernel_Utils::utf8_decode_s(myFile);
+  std::ofstream out_stream(aFile.c_str());
+#else
   std::ofstream out_stream(myFile.c_str());
+#endif
   try{
 
     UNV164::Write( out_stream ); // unit system
index e2f02326b59b8e01cf2be7580b09ab537781f246..3c504b3547cfbe768572fc1898a99ed71c342359 100644 (file)
@@ -92,10 +92,10 @@ namespace MED
   {
 #ifdef WIN32
 #ifdef UNICODE
-       size_t length = strlen(fileName.c_str()) + sizeof(char);
-       wchar_t* path = new wchar_t[length];
-       memset(path, '\0', length);
-       mbstowcs(path, fileName.c_str(), length);
+       int size_needed = MultiByteToWideChar(CP_UTF8, 0, fileName.c_str(), strlen(fileName.c_str()), NULL, 0);
+       wchar_t* path = new wchar_t[size_needed + 1];
+       MultiByteToWideChar(CP_UTF8, 0, fileName.c_str(), strlen(fileName.c_str()), path, size_needed);
+       path[size_needed] = '\0';
 #else
        cosnt char* path = xmlPath.c_str();
 #endif
index 9cd05397b9d343fd42747beffdceb84c5e7db531..e4431ac9a3e92ee71cdebfb00bf6fc1b164696ea 100644 (file)
@@ -82,16 +82,14 @@ bool SMESH_File::open()
   {
 #ifdef WIN32
 #ifdef UNICODE
-         const wchar_t* name = Kernel_Utils::decode(_name.data());
+         std::wstring aName = Kernel_Utils::utf8_decode_s(_name);
+         const wchar_t* name = aName.c_str();
 #else
          char* name = name.data();
 #endif
     _file = CreateFile(name, GENERIC_READ, FILE_SHARE_READ,
                        NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
     bool ok = ( _file != INVALID_HANDLE_VALUE );
-#ifdef UNICODE
-       delete name;
-#endif
 #else
     _file = ::open(_name.data(), O_RDONLY );
     bool ok = ( _file >= 0 );
@@ -178,7 +176,12 @@ bool SMESH_File::remove()
   close();
 
   boost::system::error_code err;
+#if defined(WIN32) && defined(UNICODE)
+  std::wstring name = Kernel_Utils::utf8_decode_s(_name);
+  boofs::remove(name.c_str(), err);
+#else
   boofs::remove( _name, err );
+#endif
   _error = err.message();
 
   return !err;
@@ -195,7 +198,12 @@ long SMESH_File::size()
   if ( _size >= 0 ) return _size; // size of an open file
 
   boost::system::error_code err;
+#if defined(WIN32) && defined(UNICODE)
+  std::wstring name = Kernel_Utils::utf8_decode_s(_name);
+  boost::uintmax_t size = boofs::file_size(name.c_str(), err);
+#else
   boost::uintmax_t size = boofs::file_size( _name, err );
+#endif
   _error = err.message();
 
   return !err ? (long) size : -1;
@@ -210,7 +218,13 @@ long SMESH_File::size()
 bool SMESH_File::exists()
 {
   boost::system::error_code err;
-  bool res = boofs::exists( _name, err );
+#if defined(WIN32) && defined(UNICODE)
+  std::wstring name = Kernel_Utils::utf8_decode_s(_name);
+  bool res = boofs::exists(name.c_str(), err);
+#else
+  bool res = boofs::exists(_name, err);
+#endif
+
   _error = err.message();
 
   return err ? false : res;
@@ -225,7 +239,12 @@ bool SMESH_File::exists()
 bool SMESH_File::isDirectory()
 {
   boost::system::error_code err;
+#if defined(WIN32) && defined(UNICODE)
+  std::wstring name = Kernel_Utils::utf8_decode_s(_name);
+  bool res = boofs::is_directory(name.c_str(), err);
+#else
   bool res = boofs::is_directory( _name, err );
+#endif
   _error = err.message();
 
   return err ? false : res;
@@ -302,7 +321,8 @@ bool SMESH_File::openForWriting()
 {
 #ifdef WIN32
 #ifdef UNICODE
-       const wchar_t* name = Kernel_Utils::decode(_name.data());
+       std::wstring aName = Kernel_Utils::utf8_decode_s(_name);
+       const wchar_t* name = aName.c_str();
 #else
        char* name = name.data();
 #endif
@@ -313,11 +333,7 @@ bool SMESH_File::openForWriting()
                       OPEN_ALWAYS,            // CREATE NEW or OPEN EXISTING
                       FILE_ATTRIBUTE_NORMAL,  // normal file
                       NULL);                  // no attr. template
-#ifdef UNICODE
-  delete name;
-#endif
   return ( _file != INVALID_HANDLE_VALUE );
-
 #else
 
   _file = ::open( _name.c_str(),