From: kgv Date: Wed, 13 Jul 2016 19:47:16 +0000 (+0300) Subject: 0027675: Foundation Classes - handle Unicode path to CSF_UnitsLexicon and CSF_UnitsDe... X-Git-Tag: V7_1_0_beta~247 X-Git-Url: http://git.dev.opencascade.org/gitweb/?a=commitdiff_plain;h=ce0594b85e59fd98bbcf034958fbbbab22052a95;p=occt-copy.git 0027675: Foundation Classes - handle Unicode path to CSF_UnitsLexicon and CSF_UnitsDefinition on Windows Units package now uses Unicode-aware functions OSD_OpenStream and OSD_FileStatCTime (introduced for fetching file timestamp). --- diff --git a/src/OSD/OSD_OpenFile.cxx b/src/OSD/OSD_OpenFile.cxx index 0be7e84be4..f99c9dcf2a 100644 --- a/src/OSD/OSD_OpenFile.cxx +++ b/src/OSD/OSD_OpenFile.cxx @@ -19,6 +19,9 @@ #include #include +#include +#include + // ============================================== // function : OSD_OpenFile // purpose : Opens file @@ -160,3 +163,28 @@ void OSD_OpenStream (std::ifstream& theStream, theStream.open (aString.ToCString(), theMode); #endif } + +// ============================================== +// function : OSD_FileStatCTime +// purpose : +// ============================================== +Standard_Time OSD_FileStatCTime (const char* theName) +{ + Standard_Time aTime = 0; +#if defined(_WIN32) + // file name is treated as UTF-8 string and converted to UTF-16 one + const TCollection_ExtendedString aFileNameW (theName, Standard_True); + struct __stat64 aStat; + if (_wstat64 ((const wchar_t* )aFileNameW.ToExtString(), &aStat) == 0) + { + aTime = (Standard_Time )aStat.st_ctime; + } +#else + struct stat aStat; + if (stat (theName, &aStat) == 0) + { + aTime = (Standard_Time )aStat.st_ctime; + } +#endif + return aTime; +} diff --git a/src/OSD/OSD_OpenFile.hxx b/src/OSD/OSD_OpenFile.hxx index ca8bf7bf56..2944c36225 100644 --- a/src/OSD/OSD_OpenFile.hxx +++ b/src/OSD/OSD_OpenFile.hxx @@ -80,6 +80,11 @@ __Standard_API void OSD_OpenFileBuf (std::filebuf& theBuff, __Standard_API FILE* OSD_OpenFile (const TCollection_ExtendedString& theName, const char* theMode); +//! Function retrieves file timestamp. +//! @param theName name of file encoded in UTF-8 +//! @return stat.st_ctime value +__Standard_API Standard_Time OSD_FileStatCTime (const char* theName); + extern "C" { #endif // __cplusplus diff --git a/src/Units/Units.cxx b/src/Units/Units.cxx index 826867ec08..58ca07a439 100644 --- a/src/Units/Units.cxx +++ b/src/Units/Units.cxx @@ -22,8 +22,6 @@ // Convertir correctement les unites translatees #include -#include -#include #include #include diff --git a/src/Units/Units_Lexicon.cxx b/src/Units/Units_Lexicon.cxx index 1aecc6ff37..156598dc71 100644 --- a/src/Units/Units_Lexicon.cxx +++ b/src/Units/Units_Lexicon.cxx @@ -14,16 +14,15 @@ // Alternatively, this file may be used under the terms of Open CASCADE // commercial license or contractual agreement. +#include #include +#include #include #include #include -#include #include -#include -#include IMPLEMENT_STANDARD_RTTIEXT(Units_Lexicon,MMgt_TShared) #ifdef _MSC_VER @@ -56,7 +55,8 @@ static inline bool strrightadjust (char *str) void Units_Lexicon::Creates(const Standard_CString afilename) { - ifstream file(afilename, ios::in); + std::ifstream file; + OSD_OpenStream (file, afilename, std::ios::in); if(!file) { #ifdef OCCT_DEBUG cout<<"unable to open "<= (Standard_Time)buf.st_ctime) - return Standard_True; - } - - return Standard_False; + TCollection_AsciiString aPath = FileName(); + Standard_Time aTime = OSD_FileStatCTime (aPath.ToCString()); + return aTime != 0 + && aTime <= thetime; } diff --git a/src/Units/Units_UnitsDictionary.cxx b/src/Units/Units_UnitsDictionary.cxx index 17d3f23d02..a9d974f46d 100644 --- a/src/Units/Units_UnitsDictionary.cxx +++ b/src/Units/Units_UnitsDictionary.cxx @@ -14,8 +14,10 @@ // Alternatively, this file may be used under the terms of Open CASCADE // commercial license or contractual agreement. +#include #include +#include #include #include #include @@ -31,13 +33,12 @@ #include #include #include -#include #include #include #include #include -#include + IMPLEMENT_STANDARD_RTTIEXT(Units_UnitsDictionary,MMgt_TShared) //======================================================================= @@ -69,8 +70,9 @@ void Units_UnitsDictionary::Creates(const Standard_CString afilename) Handle(Units_Unit) unit; Handle(Units_ShiftedUnit) shiftedunit; Handle(Units_Quantity) quantity; - - ifstream file(afilename, ios::in); + + std::ifstream file; + OSD_OpenStream (file, afilename, std::ios::in); if(!file) { #ifdef OCCT_DEBUG cout<<"unable to open "<String(); - if(!stat(string.ToCString(),&buf)) { - if(thetime == (Standard_Time)buf.st_ctime) return Standard_True; - } - - return Standard_False; + Standard_Time aTime = OSD_FileStatCTime (thefilename->String().ToCString()); + return aTime != 0 + && aTime == thetime; } - //======================================================================= //function : ActiveUnit //purpose : diff --git a/src/Units/Units_UnitsLexicon.cxx b/src/Units/Units_UnitsLexicon.cxx index 8c12e7881d..50cb2e4862 100644 --- a/src/Units/Units_UnitsLexicon.cxx +++ b/src/Units/Units_UnitsLexicon.cxx @@ -14,17 +14,16 @@ // Alternatively, this file may be used under the terms of Open CASCADE // commercial license or contractual agreement. +#include +#include #include #include #include #include #include #include -#include -#include -#include IMPLEMENT_STANDARD_RTTIEXT(Units_UnitsLexicon,Units_Lexicon) //======================================================================= @@ -44,11 +43,13 @@ void Units_UnitsLexicon::Creates(const Standard_CString afilename1, const Standard_Boolean amode) { Handle(Units_UnitsDictionary) unitsdictionary; - struct stat buf; thefilename = new TCollection_HAsciiString(afilename2); - - if(!stat(afilename2,&buf)) thetime = buf.st_ctime; + Standard_Time aTime2 = OSD_FileStatCTime (afilename2); + if (aTime2 != 0) + { + thetime = aTime2; + } Units_Lexicon::Creates(afilename1); @@ -63,18 +64,15 @@ void Units_UnitsLexicon::Creates(const Standard_CString afilename1, Standard_Boolean Units_UnitsLexicon::UpToDate() const { - struct stat buf; - TCollection_AsciiString string = FileName2(); - - if(Units_Lexicon::UpToDate()) - { - if(!stat(string.ToCString(),&buf)) - { - if(thetime >= (Standard_Time)buf.st_ctime) return Standard_True; - } - } - - return Standard_False; + TCollection_AsciiString aPath = FileName2(); + if (!Units_Lexicon::UpToDate()) + { + return Standard_False; + } + + Standard_Time aTime = OSD_FileStatCTime (aPath.ToCString()); + return aTime != 0 + && aTime <= thetime; } //=======================================================================