Salome HOME
#18963 Minimize compiler warnings
[modules/smesh.git] / src / MEDWrapper / MED_Wrapper.cxx
index cc0e21b636bb5ccd75038762a2b0b110557c5e03..fea95266423a4a3c244ec86af5f8620e575ccb96 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2007-2016  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_
 static int MYDEBUG = 0;
 static int MYVALUEDEBUG = 0;
 #else
-static int MYDEBUG = 0;
-static int MYVALUEDEBUG = 0;
+static int MYDEBUG = 0;      // todo: unused in release mode
+static int MYVALUEDEBUG = 0; // todo: unused in release mode
 #endif
 
 namespace MED
@@ -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,12 +104,29 @@ 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);
       else if (myFid < 0)
-        EXCEPTION(std::runtime_error,"TFile - MEDfileVersionOpen('"<<myFileName<<"',"<<theMode<<"',"<< MED_MAJOR_NUM<<"',"<< myMinor<<"',"<< MED_RELEASE_NUM<<")");
+        EXCEPTION(std::runtime_error,"TFile - MEDfileVersionOpen('"<<myFileName<<"',"<<theMode<<"',"<< myMajor <<"',"<< myMinor<<"',"<< MED_RELEASE_NUM<<")");
     }
 
     const TIdt&
@@ -125,6 +148,7 @@ namespace MED
     TInt myCount;
     TIdt myFid;
     std::string myFileName;
+    TInt myMajor;
     TInt myMinor;
   };
 
@@ -187,23 +211,21 @@ namespace MED
 
   //---------------------------------------------------------------
   TWrapper
-  ::TWrapper(const std::string& theFileName, TInt theMinor):
-    myMinor(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;
-    myFile->Open(eLECTURE_ECRITURE, &aRet);
-    // if (aRet < 0)
-    //   myFile->Close();
-    //   myFile->Open(eLECTURE_AJOUT, &aRet);
-    // }
-    if (aRet < 0) {
-      myFile->Close();
-      myFile->Open(eLECTURE, &aRet);
+    if ( write ) {
+      myFile->Open(eLECTURE_ECRITURE, &aRet);
+      if (aRet < 0) {
+        myFile->Close();
+        myFile->Open(eCREATION, &aRet);
+      }
     }
-    if (aRet < 0) {
-      myFile->Close();
-      myFile->Open(eCREATION, &aRet);
+    else {
+      myFile->Open(eLECTURE, &aRet);
     }
   }
 
@@ -608,7 +630,7 @@ namespace MED
   void
   TWrapper
   ::GetNames(TElemInfo& theInfo,
-             TInt theNb,
+             TInt /*theNb*/,
              EEntiteMaillage theEntity,
              EGeometrieElement theGeom,
              TErr* theErr)
@@ -699,7 +721,7 @@ namespace MED
   void
   TWrapper
   ::GetNumeration(TElemInfo& theInfo,
-                  TInt theNb,
+                  TInt /*theNb*/,
                   EEntiteMaillage theEntity,
                   EGeometrieElement theGeom,
                   TErr* theErr)
@@ -790,7 +812,7 @@ namespace MED
   void
   TWrapper
   ::GetFamilies(TElemInfo& theInfo,
-                TInt theNb,
+                TInt /*theNb*/,
                 EEntiteMaillage theEntity,
                 EGeometrieElement theGeom,
                 TErr* theErr)
@@ -2061,6 +2083,24 @@ namespace MED
     TValueHolder<EConnectivite, med_connectivity_mode> aConnMode    (theInfo.myConnMode);
 
     TErr aRet;
+    med_bool dummy;
+    aRet = MEDmeshnEntity(myFile->Id(),
+                          &aMeshName,
+                          MED_NO_DT,
+                          MED_NO_IT,
+                          anEntity,
+                          aGeom,
+                          MED_NAME,
+                          aConnMode,
+                          &dummy, &dummy);
+    if ( aRet > 0 )
+    {
+      // names are present in the file, they will be read in spite of theInfo.myIsElemNames
+      theInfo.myIsElemNames = eVRAI;
+      theInfo.myElemNames.reset( new TString( theInfo.myNbElem * GetPNOMLength() + 1 ));
+      anElemNames.myRepresentation = & ((TString&) theInfo.myElemNames )[0];
+    }
+
     aRet = MEDmeshElementRd(myFile->Id(),
                             &aMeshName,
                             MED_NO_DT,
@@ -2083,11 +2123,11 @@ namespace MED
       EXCEPTION(std::runtime_error, "GetCellInfo - MEDmeshElementRd(...)");
 
     if (anIsFamNum == MED_FALSE)
-      {
-        int mySize = (int) theInfo.myFamNum->size();
-        theInfo.myFamNum->clear();
-        theInfo.myFamNum->resize(mySize, 0);
-      }
+    {
+      int mySize = (int) theInfo.myFamNum->size();
+      theInfo.myFamNum->clear();
+      theInfo.myFamNum->resize(mySize, 0);
+    }
 
   }
 
@@ -2171,7 +2211,7 @@ namespace MED
     if (theErr)
       *theErr = aRet;
     else if (aRet < 0)
-      EXCEPTION(std::runtime_error, "SetCellInfo - MEDmeshElementWr(...)");
+      EXCEPTION(std::runtime_error, "SetCellInfo - MEDmeshElementWr(...), ret="<< aRet);
   }
 
   //----------------------------------------------------------------------------
@@ -2283,7 +2323,7 @@ namespace MED
   //----------------------------------------------------------------------------
   EGeometrieElement
   TWrapper
-  ::GetBallGeom(const TMeshInfo& theMeshInfo)
+  ::GetBallGeom(const TMeshInfo& /*theMeshInfo*/)
   {
     TErr anError;
     TFileWrapper aFileWrapper(myFile, eLECTURE, &anError, myMinor);
@@ -2424,7 +2464,7 @@ namespace MED
 
     // write node ids
     SetCellInfo(theInfo, theMode, theErr);
-    if (theErr && theErr < 0)
+    if (theErr && *theErr < 0)
       return;
 
     // write diameter
@@ -2723,7 +2763,7 @@ namespace MED
   //----------------------------------------------------------------------------
   void
   TWrapper
-  ::GetGaussInfo(TInt theId,
+  ::GetGaussInfo(TInt /*theId*/,
                  TGaussInfo& theInfo,
                  TErr* theErr)
   {
@@ -3087,7 +3127,7 @@ namespace MED
   //----------------------------------------------------------------------------
   void
   TWrapper
-  ::GetProfileInfo(TInt theId,
+  ::GetProfileInfo(TInt /*theId*/,
                    TProfileInfo& theInfo,
                    TErr* theErr)
   {
@@ -3966,7 +4006,7 @@ namespace MED
   //----------------------------------------------------------------------------
   PGrilleInfo
   TWrapper
-  ::CrGrilleInfo(const PMeshInfo& theMeshInfo)
+  ::CrGrilleInfo(const PMeshInfo& /*theMeshInfo*/)
   {
     return PGrilleInfo(); // not implemented????
   }