From 0b4f557c95428aa7025773eef95eef5796a1e74a Mon Sep 17 00:00:00 2001 From: rnv Date: Thu, 21 Feb 2019 12:00:42 +0300 Subject: [PATCH] Run SALOME with UNICODE path --- src/DriverDAT/DriverDAT_R_SMDS_Mesh.cxx | 5 +++ src/DriverDAT/DriverDAT_W_SMDS_Mesh.cxx | 5 +++ src/DriverGMF/libmesh5.c | 42 ++++++++++++++++++++++--- src/DriverSTL/DriverSTL_R_SMDS_Mesh.cxx | 7 ++++- src/DriverUNV/DriverUNV_R_SMDS_Mesh.cxx | 5 +++ src/DriverUNV/DriverUNV_W_SMDS_Mesh.cxx | 5 +++ src/MEDWrapper/MED_Factory.cxx | 8 ++--- src/SMESHUtils/SMESH_File.cxx | 36 +++++++++++++++------ 8 files changed, 93 insertions(+), 20 deletions(-) diff --git a/src/DriverDAT/DriverDAT_R_SMDS_Mesh.cxx b/src/DriverDAT/DriverDAT_R_SMDS_Mesh.cxx index 07ac21b2c..9d34a3cd8 100644 --- a/src/DriverDAT/DriverDAT_R_SMDS_Mesh.cxx +++ b/src/DriverDAT/DriverDAT_R_SMDS_Mesh.cxx @@ -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; diff --git a/src/DriverDAT/DriverDAT_W_SMDS_Mesh.cxx b/src/DriverDAT/DriverDAT_W_SMDS_Mesh.cxx index b72e64cf1..1cf4667b5 100644 --- a/src/DriverDAT/DriverDAT_W_SMDS_Mesh.cxx +++ b/src/DriverDAT/DriverDAT_W_SMDS_Mesh.cxx @@ -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); diff --git a/src/DriverGMF/libmesh5.c b/src/DriverGMF/libmesh5.c index c7d6c52ea..889b69747 100644 --- a/src/DriverGMF/libmesh5.c +++ b/src/DriverGMF/libmesh5.c @@ -26,7 +26,9 @@ #include #include #include "libmesh5.h" - +#ifdef WIN32 +#include +#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; diff --git a/src/DriverSTL/DriverSTL_R_SMDS_Mesh.cxx b/src/DriverSTL/DriverSTL_R_SMDS_Mesh.cxx index c12c4eef8..ec0b7028b 100644 --- a/src/DriverSTL/DriverSTL_R_SMDS_Mesh.cxx +++ b/src/DriverSTL/DriverSTL_R_SMDS_Mesh.cxx @@ -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; diff --git a/src/DriverUNV/DriverUNV_R_SMDS_Mesh.cxx b/src/DriverUNV/DriverUNV_R_SMDS_Mesh.cxx index 6d5146d92..7b48ee664 100644 --- a/src/DriverUNV/DriverUNV_R_SMDS_Mesh.cxx +++ b/src/DriverUNV/DriverUNV_R_SMDS_Mesh.cxx @@ -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 { { diff --git a/src/DriverUNV/DriverUNV_W_SMDS_Mesh.cxx b/src/DriverUNV/DriverUNV_W_SMDS_Mesh.cxx index dfe7b79e8..639cedf9c 100644 --- a/src/DriverUNV/DriverUNV_W_SMDS_Mesh.cxx +++ b/src/DriverUNV/DriverUNV_W_SMDS_Mesh.cxx @@ -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 diff --git a/src/MEDWrapper/MED_Factory.cxx b/src/MEDWrapper/MED_Factory.cxx index e2f02326b..3c504b354 100644 --- a/src/MEDWrapper/MED_Factory.cxx +++ b/src/MEDWrapper/MED_Factory.cxx @@ -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 diff --git a/src/SMESHUtils/SMESH_File.cxx b/src/SMESHUtils/SMESH_File.cxx index 9cd05397b..e4431ac9a 100644 --- a/src/SMESHUtils/SMESH_File.cxx +++ b/src/SMESHUtils/SMESH_File.cxx @@ -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(), -- 2.39.2