From: rnv Date: Tue, 5 Mar 2019 08:36:54 +0000 (+0300) Subject: Run SALOME on Windows with unicode path. X-Git-Url: http://git.salome-platform.org/gitweb/?a=commitdiff_plain;h=784a719c2f60f5b5c2980cff49aa22d5359bb723;p=modules%2Fsmesh.git Run SALOME on Windows with unicode path. --- diff --git a/src/DriverDAT/DriverDAT_R_SMDS_Mesh.cxx b/src/DriverDAT/DriverDAT_R_SMDS_Mesh.cxx index 5d2956c57..f34cd106d 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 403dad4f5..beb0b8b76 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 f1e1ea6ac..355c35617 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 6ebc03eeb..4e22f6bac 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 02ec7588b..30d7e2ab4 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