Salome HOME
bos #18963 [CEA 18962] Warnings in module compilations
[modules/smesh.git] / src / MEDWrapper / MED_Wrapper.cxx
index 85a8d9f35d1214b01962c4f13f3c2735f404f654..79dc1996b22bc375040d5f9fa6756a1a7efa4f63 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2007-2019  CEA/DEN, EDF R&D, OPEN CASCADE
+// Copyright (C) 2007-2020  CEA/DEN, EDF R&D, OPEN CASCADE
 //
 // Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
 #include <med_err.h>
 #include <med_proto.h>
 
+#ifdef WIN32
+#include <windows.h>
+#endif
+
 #include <boost/version.hpp>
 
 #ifdef _DEBUG_
@@ -78,13 +82,15 @@ namespace MED
     TFile(const TFile&);
 
   public:
-    TFile(const std::string& theFileName, TInt theMinor=-1):
+    TFile(const std::string& theFileName, TInt theMajor=-1, TInt theMinor=-1):
       myCount(0),
       myFid(0),
       myFileName(theFileName),
+      myMajor(theMajor),
       myMinor(theMinor)
     {
-      if ((myMinor < 0) || (myMinor > MED_MINOR_NUM)) myMinor = MED_MINOR_NUM;
+      if ((myMajor < 0) || (myMajor > MED_MAJOR_NUM)) myMajor = MED_MAJOR_NUM;
+      if ((myMinor < 0) || (myMajor == MED_MAJOR_NUM && myMinor > MED_MINOR_NUM)) myMinor = MED_MINOR_NUM;
     }
 
     ~TFile()
@@ -98,7 +104,24 @@ namespace MED
     {
       if (myCount++ == 0) {
         const char* aFileName = myFileName.c_str();
-        myFid = MEDfileVersionOpen(aFileName,med_access_mode(theMode), MED_MAJOR_NUM, myMinor, MED_RELEASE_NUM);
+#ifdef WIN32
+               if (med_access_mode(theMode) == MED_ACC_RDWR) {
+                       // Force removing readonly attribute from a file under Windows, because of a bug in the HDF5
+                       std::string aReadOlnyRmCmd = "attrib -r \"" + myFileName + "\"> nul 2>&1";
+#ifdef UNICODE
+                       const char* to_decode = aReadOlnyRmCmd.c_str();
+                       int size_needed = MultiByteToWideChar(CP_UTF8, 0, to_decode, strlen(to_decode), NULL, 0);
+                       wchar_t* awReadOlnyRmCmd = new wchar_t[size_needed + 1];
+                       MultiByteToWideChar(CP_UTF8, 0, to_decode, strlen(to_decode), awReadOlnyRmCmd, size_needed);
+                       awReadOlnyRmCmd[size_needed] = '\0';
+                       _wsystem(awReadOlnyRmCmd);
+                       delete[] awReadOlnyRmCmd;
+#else  
+                       system(aReadOlnyRmCmd.c_str());
+#endif
+               }
+#endif
+        myFid = MEDfileVersionOpen(aFileName,med_access_mode(theMode), myMajor, myMinor, MED_RELEASE_NUM);
       }
       if (theErr)
         *theErr = TErr(myFid);
@@ -125,6 +148,7 @@ namespace MED
     TInt myCount;
     TIdt myFid;
     std::string myFileName;
+    TInt myMajor;
     TInt myMinor;
   };
 
@@ -187,8 +211,9 @@ namespace MED
 
   //---------------------------------------------------------------
   TWrapper
-  ::TWrapper(const std::string& theFileName, bool write, TInt theMinor):
-    myFile(new TFile(theFileName, theMinor)),
+  ::TWrapper(const std::string& theFileName, bool write, TInt theMajor, TInt theMinor):
+    myFile(new TFile(theFileName, theMajor, theMinor)),
+    myMajor(theMajor),
     myMinor(theMinor)
   {
     TErr aRet;
@@ -2439,7 +2464,7 @@ namespace MED
 
     // write node ids
     SetCellInfo(theInfo, theMode, theErr);
-    if (theErr && theErr < 0)
+    if (theErr && *theErr < 0)
       return;
 
     // write diameter