From 64c20fc0e786e9d6e4f7a379b867029790832a5f Mon Sep 17 00:00:00 2001 From: rnv Date: Thu, 21 Feb 2019 11:57:50 +0300 Subject: [PATCH] Run SALOME with UNICODE path on Windows platform. --- src/GEOM/GEOM_Engine.cxx | 15 ++- src/GEOMGUI/GeometryGUI.cxx | 12 +- src/GEOMUtils/GEOMUtils_XmlHandler.cxx | 168 ++++++++++++++----------- src/GEOM_I/GEOM_Gen_i.cc | 13 +- 4 files changed, 118 insertions(+), 90 deletions(-) diff --git a/src/GEOM/GEOM_Engine.cxx b/src/GEOM/GEOM_Engine.cxx index f09601f8c..8eacebc5a 100644 --- a/src/GEOM/GEOM_Engine.cxx +++ b/src/GEOM/GEOM_Engine.cxx @@ -512,7 +512,13 @@ bool GEOM_Engine::Save(const char* theFileName) { if(!_document) return false; - _OCAFApp->SaveAs(_document, theFileName); +#if defined(WIN32) && defined(UNICODE) + std::wstring aFileName = Kernel_Utils::utf8_decode_s(theFileName); +#else + std::string aFileName = theFileName; +#endif + + _OCAFApp->SaveAs( _document, aFileName.c_str() ); return true; } @@ -524,8 +530,13 @@ bool GEOM_Engine::Save(const char* theFileName) //============================================================================= bool GEOM_Engine::Load(const char* theFileName) { +#if defined(WIN32) && defined(UNICODE) + std::wstring aFileName = Kernel_Utils::utf8_decode_s(theFileName); +#else + std::string aFileName = theFileName; +#endif Handle(TDocStd_Document) aDoc; - if (_OCAFApp->Open(theFileName, aDoc) != PCDM_RS_OK) { + if (_OCAFApp->Open(aFileName.c_str(), aDoc) != PCDM_RS_OK) { return false; } diff --git a/src/GEOMGUI/GeometryGUI.cxx b/src/GEOMGUI/GeometryGUI.cxx index f1790cd21..26bda2aed 100644 --- a/src/GEOMGUI/GeometryGUI.cxx +++ b/src/GEOMGUI/GeometryGUI.cxx @@ -258,11 +258,11 @@ GEOMGUI* GeometryGUI::getLibrary( const QString& libraryName ) if ( !myGUIMap.contains( libraryName ) ) { // try to load library if it is not loaded yet #if defined(WIN32) - QString dirs = getenv( "PATH" ); + QString dirs = Qtx::getenv( "PATH" ); #elif defined(__APPLE__) - QString dirs = getenv( "DYLD_LIBRARY_PATH" ); + QString dirs = Qtx::getenv( "DYLD_LIBRARY_PATH" ); #else - QString dirs = getenv( "LD_LIBRARY_PATH" ); + QString dirs = Qtx::getenv( "LD_LIBRARY_PATH" ); #endif #if defined(WIN32) QString sep = ";"; @@ -309,11 +309,11 @@ GEOMPluginGUI* GeometryGUI::getPluginLibrary( const QString& libraryName ) // try to load library if it is not loaded yet #if defined(WIN32) - QString dirs = getenv( "PATH" ); + QString dirs = Qtx::getenv( "PATH" ); #elif defined(__APPLE__) - QString dirs = getenv( "DYLD_LIBRARY_PATH" ); + QString dirs = Qtx::getenv( "DYLD_LIBRARY_PATH" ); #else - QString dirs = getenv( "LD_LIBRARY_PATH" ); + QString dirs = Qtx::getenv( "LD_LIBRARY_PATH" ); #endif #if defined(WIN32) QString sep = ";"; diff --git a/src/GEOMUtils/GEOMUtils_XmlHandler.cxx b/src/GEOMUtils/GEOMUtils_XmlHandler.cxx index 6d0c6eaf4..a315a3111 100644 --- a/src/GEOMUtils/GEOMUtils_XmlHandler.cxx +++ b/src/GEOMUtils/GEOMUtils_XmlHandler.cxx @@ -18,12 +18,14 @@ // #include "GEOMUtils_XmlHandler.hxx" +#include #include #include #ifdef WIN32 #include +#include #else #include #endif @@ -33,7 +35,7 @@ namespace { const char* env_var = "GEOM_PluginsList"; - + const xmlChar* root_tag = (xmlChar*)"geom-plugins"; const xmlChar* plugin_tag = (xmlChar*)"geom-plugin"; const xmlChar* name_tag = (xmlChar*)"name"; @@ -75,91 +77,113 @@ namespace std::list getPluginXMLFiles() { - std::list xmlPaths; + std::list xmlPaths; #ifdef WIN32 - std::string sep = "\\"; +#ifdef UNICODE + std::wstring sep = L"\\"; +#else + std::string sep = "\\"; +#endif #else - std::string sep = "/"; + std::string sep = "/"; #endif - if ( const char* var = getenv( env_var ) ) - { - std::string plugins = var; +#if defined(WIN32) && defined(UNICODE) + std::wstring wenv_var = Kernel_Utils::utf8_decode_s(env_var); + if (const wchar_t* var = _wgetenv(wenv_var.c_str())) + { + std::wstring plugins = var; +#else + if (const char* var = getenv(env_var)) + { + std::string plugins = var; +#endif + std::string::size_type from = 0, pos; + while (from < plugins.size()) + { +#if defined(WIN32) && defined(UNICODE) + pos = plugins.find(L':', from); + std::wstring plugin; +#else + pos = plugins.find(':', from); + std::string plugin; +#endif + if (pos != std::string::npos) + plugin = plugins.substr(from, pos - from); + else + plugin = plugins.substr(from), pos = plugins.size(); + from = pos + 1; - std::string::size_type from = 0, pos; - while ( from < plugins.size() ) - { - pos = plugins.find( ':', from ); - std::string plugin; - if ( pos != std::string::npos ) - plugin = plugins.substr( from, pos-from ); - else - plugin = plugins.substr( from ), pos = plugins.size(); - from = pos + 1; - - if ( plugin.size() == 0 ) continue; - - std::string pluginRoot = toUpper( plugin+"_ROOT_DIR" ); + if (plugin.size() == 0) continue; +#if defined(WIN32) && defined(UNICODE) + std::wstring pluginRoot = plugin + L"_ROOT_DIR"; + std::transform(pluginRoot.begin(), pluginRoot.end(), pluginRoot.begin(), ::toupper); + const wchar_t* rootDirGeom = _wgetenv(L"GEOM_ROOT_DIR"); + const wchar_t* rootDirPlugin = _wgetenv(pluginRoot.c_str()); +#else + std::string pluginRoot = toUpper(plugin + "_ROOT_DIR"); - const char* rootDirGeom = getenv( "GEOM_ROOT_DIR" ); - const char* rootDirPlugin = getenv( pluginRoot.c_str() ); + const char* rootDirGeom = getenv("GEOM_ROOT_DIR"); + const char* rootDirPlugin = getenv(pluginRoot.c_str()); +#endif - bool fileOK = false; - if ( rootDirGeom ) { - std::string xmlPath = rootDirGeom; - if ( xmlPath[ xmlPath.size()-1 ] != sep[0] ) - xmlPath += sep; - xmlPath += "share" + sep + "salome" + sep + "resources" + sep + "geom" + sep + plugin + ".xml"; -#ifdef WIN32 + bool fileOK = false; + if (rootDirGeom) { -#ifdef UNICODE - //RNV: this is workaround for providing compilation, - // path should be processed as unicode string. - size_t length = strlen(xmlPath.c_str()) + sizeof(char); - wchar_t* aPath = new wchar_t[length + 1]; - memset(aPath, '\0', length); - mbstowcs(aPath, xmlPath.c_str(), length); +#if defined(WIN32) && defined(UNICODE) + std::wstring xmlPath = rootDirGeom; + if (xmlPath[xmlPath.size() - 1] != sep[0]) + xmlPath += sep; + xmlPath += L"share" + sep + L"salome" + sep + L"resources" + sep + L"geom" + sep + plugin + L".xml"; #else - const char* aPath = xmlPath.c_str(); + std::string xmlPath = rootDirGeom; + if (xmlPath[xmlPath.size() - 1] != sep[0]) + xmlPath += sep; + xmlPath += "share" + sep + "salome" + sep + "resources" + sep + "geom" + sep + plugin + ".xml"; #endif - fileOK = (GetFileAttributes(aPath) != INVALID_FILE_ATTRIBUTES); -#if UNICODE - delete aPath; + +#ifdef WIN32 + fileOK = (GetFileAttributes(xmlPath.c_str()) != INVALID_FILE_ATTRIBUTES); +#else + fileOK = (access(xmlPath.c_str(), F_OK) == 0); #endif + if (fileOK) +#if defined(WIN32) && defined(UNICODE) + xmlPaths.push_back(Kernel_Utils::utf8_encode_s(xmlPath)); #else - fileOK = (access(xmlPath.c_str(), F_OK) == 0); + xmlPaths.push_back(xmlPath); #endif - if ( fileOK ) - xmlPaths.push_back( xmlPath ); - } - if ( !fileOK && rootDirPlugin ) { - std::string xmlPath = rootDirPlugin; - if ( xmlPath[ xmlPath.size()-1 ] != sep[0] ) - xmlPath += sep; - xmlPath += "share" + sep + "salome" + sep + "resources" + sep + toLower(plugin) + sep + plugin + ".xml"; -#ifdef WIN32 -#ifdef UNICODE - size_t length = strlen(xmlPath.c_str()) + sizeof(char); - wchar_t* aPath = new wchar_t[length+1]; - memset(aPath, '\0', length); - mbstowcs(aPath, xmlPath.c_str(), length); + } + if (!fileOK && rootDirPlugin) { +#if defined(WIN32) && defined(UNICODE) + std::wstring xmlPath = rootDirPlugin; + if (xmlPath[xmlPath.size() - 1] != sep[0]) + xmlPath += sep; + std::transform(plugin.begin(), plugin.end(), plugin.begin(), ::tolower); + xmlPath += L"share" + sep + L"salome" + sep + L"resources" + sep + plugin + sep + plugin + L".xml"; + #else - const char* aPath = xmlPath.c_str(); + std::string xmlPath = rootDirPlugin; + if (xmlPath[xmlPath.size() - 1] != sep[0]) + xmlPath += sep; + xmlPath += "share" + sep + "salome" + sep + "resources" + sep + toLower(plugin) + sep + plugin + ".xml"; #endif - fileOK = (GetFileAttributes(aPath) != INVALID_FILE_ATTRIBUTES); -#if UNICODE - delete aPath; + +#ifdef WIN32 + fileOK = (GetFileAttributes(xmlPath.c_str()) != INVALID_FILE_ATTRIBUTES); +#else + fileOK = (access(xmlPath.c_str(), F_OK) == 0); #endif +#if defined(WIN32) && defined(UNICODE) + xmlPaths.push_back(Kernel_Utils::utf8_encode_s(xmlPath)); #else - fileOK = (access(xmlPath.c_str(), F_OK) == 0); + xmlPaths.push_back(xmlPath); #endif - if ( fileOK ) - xmlPaths.push_back( xmlPath ); - } - } - } - return xmlPaths; + } + } + return xmlPaths; + } } #ifdef MYDEBUG @@ -202,15 +226,15 @@ namespace GEOMUtils for ( fit = xmlPaths.begin(); fit != xmlPaths.end(); ++fit ) { std::string fileName = *fit; - + int options = XML_PARSE_HUGE | XML_PARSE_NOCDATA; xmlDocPtr doc = xmlReadFile( fileName.c_str(), NULL, options ); - + if ( doc ) { // get root node xmlNodePtr root = xmlDocGetRootElement(doc); - + // check if it is plugins container node if (xmlStrcmp(root->name, root_tag) == 0) { @@ -249,13 +273,13 @@ namespace GEOMUtils } // end iteration through actions container node children } // end actions container node } // end iterations through plugin node children - + if (data.name != "") info.push_back(data); } // end plugin node } // end iterations through plugins container node children } // end root node - + xmlFreeDoc(doc); //xmlCleanupParser();//vsr: xmlCleanupParser should not be called from the application } // end xml doc diff --git a/src/GEOM_I/GEOM_Gen_i.cc b/src/GEOM_I/GEOM_Gen_i.cc index 26d83ca9a..da12563f2 100644 --- a/src/GEOM_I/GEOM_Gen_i.cc +++ b/src/GEOM_I/GEOM_Gen_i.cc @@ -2532,21 +2532,14 @@ void GEOM_Gen_i::LoadPlugin(const std::string& theLibName) // check, if corresponding operations are already created if (myOpCreatorMap.find(theLibName) == myOpCreatorMap.end()) { #if WIN32 - #if UNICODE - //RNV: this is workaround for providing compilation, - // path should be processed as unicode string. - size_t length = strlen(aPlatformLibName.c_str()) + sizeof(char); - wchar_t* aPath = new wchar_t[length + 1]; - memset(aPath, '\0', length); - mbstowcs(aPath, aPlatformLibName.c_str(), length); + #if UNICODE + std::wstring strL = Kernel_Utils::utf8_decode_s(aPlatformLibName); + const wchar_t* aPath = strL.c_str(); #else const char* aPath = aPlatformLibName.c_str(); #endif // load plugin library LibHandle libHandle = LoadLib(aPath); - #if UNICODE - delete aPath; - #endif #else LibHandle libHandle = LoadLib(aPlatformLibName.c_str()); #endif -- 2.39.2