Salome HOME
updated copyright message
[modules/kernel.git] / src / SALOMEDSImpl / SALOMEDSImpl_Study.cxx
index c8d893cf7897bd710e73a48db5bca0070e524c65..cc063bd8f74772be6699aeeb22df66b10e69b93c 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2007-2016  CEA/DEN, EDF R&D, OPEN CASCADE
+// Copyright (C) 2007-2023  CEA, EDF, OPEN CASCADE
 //
 // Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
@@ -373,8 +373,8 @@ bool SALOMEDSImpl_Study::Impl_SaveProperties(HDFgroup *hdf_group)
 
   int aLength = 0, aLength1 = 0, anIndex, i, unitsSize = 0, commentSize = 0;
 
-  for(i=1; i<=aNames.size(); i++)
-    aLength += aNames[i-1].size() + 1;
+  for(i=1; i<=(int)aNames.size(); i++)
+    aLength += (int)aNames[i-1].size() + 1; //!< TODO: conversion from size_t to int
 
   std::map< std::string, std::vector<std::string> >::const_iterator it;
   for (it = allVersions.begin(); it != allVersions.end(); ++it ) {
@@ -386,11 +386,11 @@ bool SALOMEDSImpl_Study::Impl_SaveProperties(HDFgroup *hdf_group)
       vlist += *vlit;
     }
     versions[ it->first ] = vlist;
-    aLength1 += it->first.size() + vlist.size() + 2;
+    aLength1 += int(it->first.size() + vlist.size() + 2); //!< TODO: conversion from size_t to int
   }
 
-  unitsSize = units.size();
-  commentSize = comment.size();
+  unitsSize = (int)units.size(); //!< TODO: conversion from size_t to int
+  commentSize = (int)comment.size(); //!< TODO: conversion from size_t to int
 
   //string format:
   //locked flag, modified flag,
@@ -413,7 +413,7 @@ bool SALOMEDSImpl_Study::Impl_SaveProperties(HDFgroup *hdf_group)
 
   sprintf(aProperty,"%c%c", (char)aProp->GetCreationMode(),  (aProp->IsLocked())?'l':'u');
 
-  aLength = aNames.size();
+  aLength = (int)aNames.size(); //!< TODO: conversion from size_t to int
   int a = 2;
   for(anIndex = 0; anIndex<aLength; anIndex++) {
     sprintf(&(aProperty[a]),"%2d%2d%2d%2d%4d%s",
@@ -423,7 +423,7 @@ bool SALOMEDSImpl_Study::Impl_SaveProperties(HDFgroup *hdf_group)
             (int)(aMonths[anIndex]),
             (int)(aYears[anIndex]),
             aNames[anIndex].c_str());
-    a = strlen(aProperty);
+    a = (int)strlen(aProperty); //!< TODO: conversion from size_t to int
     aProperty[a++] = 1;
   }
 
@@ -433,7 +433,7 @@ bool SALOMEDSImpl_Study::Impl_SaveProperties(HDFgroup *hdf_group)
   //Write units if need
   if(units.size() > 0) {
     sprintf(&(aProperty[a]),"%s",units.c_str());
-    a = strlen(aProperty);
+    a = (int)strlen(aProperty); //!< TODO: conversion from size_t to int
   }
 
   aProperty[a++] = 1;
@@ -441,7 +441,7 @@ bool SALOMEDSImpl_Study::Impl_SaveProperties(HDFgroup *hdf_group)
   //Write comments if need
   if(comment.size() > 0) {
     sprintf(&(aProperty[a]),"%s",comment.c_str());
-    a = strlen(aProperty);
+    a = (int)strlen(aProperty); //!< TODO: conversion from size_t to int
   }
 
   aProperty[a++] = 30; //delimiter of the component versions
@@ -451,7 +451,7 @@ bool SALOMEDSImpl_Study::Impl_SaveProperties(HDFgroup *hdf_group)
     sprintf(&(aProperty[a]),"%s=%s",
             (char*)(versionsIt->first.c_str()),
             (char*)(versionsIt->second.c_str()));
-    a = a + versionsIt->first.size() + versionsIt->second.size() + 1;
+    a = a + (int)versionsIt->first.size() + (int)versionsIt->second.size() + 1; //!< TODO: conversion from size_t to int
     aProperty[a++] = 1;
   }
 
@@ -678,7 +678,7 @@ bool SALOMEDSImpl_Study::Impl_SaveAs(const std::string& aStudyUrl,
     std::string varType;
     std::string varIndex;
 
-    for (int i=0 ;i < myNoteBookVars.size(); i++ ) {
+    for (int i=0 ;i < (int)myNoteBookVars.size(); i++ ) {
       // For each variable create HDF group
       hdf_notebook_var = new HDFgroup((char*)myNoteBookVars[i]->Name().c_str(),hdf_notebook_vars);
       hdf_notebook_var->CreateOnDisk();
@@ -773,14 +773,24 @@ bool SALOMEDSImpl_Study::Impl_SaveAs(const std::string& aStudyUrl,
   std::string aStudyTmpDir = SALOMEDSImpl_Tool::GetDirFromPath(aUrl);
 
 #ifdef WIN32
-  aCmd = "dir /B \"" + aStudyTmpDir +"\" > " + aTmpFile;
+  aCmd = "dir /B \"" + aStudyTmpDir +"\" > \"" + aTmpFile + "\"";
 #else
   aCmd ="ls -1 \"" + aStudyTmpDir +"\" > " + aTmpFile;
 #endif
+#if defined(WIN32) && defined(UNICODE)
+  std::wstring awCmd = Kernel_Utils::utf8_decode_s(aCmd);
+  _wsystem( awCmd.c_str() );
+#else  
   system(aCmd.c_str());
+#endif
 
   // Iterate and move files in the temporary directory
+#if defined(WIN32) && defined(UNICODE)
+  std::wstring awTmpFile = Kernel_Utils::utf8_decode_s(aTmpFile);
+  FILE* fp = _wfopen(awTmpFile.c_str(), L"rb");
+#else
   FILE* fp = fopen(aTmpFile.c_str(), "rb");
+#endif
   if (!fp) {
     URL( anOldName ); // VSR: restore previous url if operation is failed
     return false;
@@ -791,12 +801,27 @@ bool SALOMEDSImpl_Study::Impl_SaveAs(const std::string& aStudyUrl,
     if ((fgets(buffer, 2046, fp)) == NULL) break;
     size_t aLen = strlen(buffer);
     if (buffer[aLen-1] == '\n') buffer[aLen-1] = char(0);
-#ifdef WIN32
-    aCmd = "move /Y \"" + aStudyTmpDir + std::string(buffer) + "\" \"" + SALOMEDSImpl_Tool::GetDirFromPath(aStudyUrl) +"\"";
+
+#ifdef WIN32    
+    // Force removing readonly attribute from a file under Windows, because of a but in the HDF
+    std::string aReadOlnyRmCmd = "attrib -r \"" + aStudyTmpDir + std::string(buffer)+ "\" > nul 2>&1";
+#ifdef UNICODE
+    std::wstring awReadOlnyRmCmd = Kernel_Utils::utf8_decode_s(aReadOlnyRmCmd);
+    _wsystem(awReadOlnyRmCmd.c_str());
+#else  
+    system(aReadOlnyRmCmd.c_str());
+#endif
+
+    aCmd = "move /Y \"" + aStudyTmpDir + std::string(buffer) + "\" \"" + SALOMEDSImpl_Tool::GetDirFromPath(aStudyUrl) +"\" > nul 2>&1";
 #else
     aCmd = "mv -f \"" + aStudyTmpDir + std::string(buffer) + "\" \"" + SALOMEDSImpl_Tool::GetDirFromPath(aStudyUrl)+"\"";
 #endif
+#if defined(WIN32) && defined(UNICODE)
+    std::wstring awCmd = Kernel_Utils::utf8_decode_s(aCmd);
+    errors = _wsystem(awCmd.c_str());
+#else  
     errors = system(aCmd.c_str());
+#endif
   }
 
   delete []buffer;
@@ -804,14 +829,27 @@ bool SALOMEDSImpl_Study::Impl_SaveAs(const std::string& aStudyUrl,
 
   // Perform cleanup
 #ifdef WIN32
-  DeleteFileA(aTmpFile.c_str());
+#ifdef UNICODE
+  std::wstring aTmpFileToDelete = Kernel_Utils::utf8_decode_s(aTmpFile);
+#else
+  std::string aTmpFileToDelete = aTmpFile;
+#endif
+  DeleteFile(aTmpFileToDelete.c_str());
 #else
   unlink(aTmpFile.c_str());
 #endif
 
 #ifdef WIN32
-  RemoveDirectoryA(aTmpFileDir.c_str());
-  RemoveDirectoryA(aStudyTmpDir.c_str());
+#ifdef UNICODE
+  std::wstring aTmpFileDirToDelete = Kernel_Utils::utf8_decode_s( aTmpFileDir );
+  std::wstring aStudyTmpDirToDelete = Kernel_Utils::utf8_decode_s( aStudyTmpDir );
+#else
+  std::string aTmpFileDirToDelete = aTmpFileDir;
+  std::string aStudyTmpDirToDelete = aStudyTmpDir;
+#endif  
+  RemoveDirectory( aTmpFileDirToDelete.c_str() );
+  RemoveDirectory( aStudyTmpDirToDelete.c_str() );
 #else
   rmdir(aTmpFileDir.c_str());
   rmdir(aStudyTmpDir.c_str());
@@ -919,7 +957,7 @@ bool SALOMEDSImpl_Study::CopyLabel(SALOMEDSImpl_Driver* theEngine,
   }
   // iterate attributes
   std::vector<DF_Attribute*> attrList = theSource.GetAttributes();
-  for(int i = 0, len = attrList.size(); i<len; i++) {
+  for(int i = 0, len = (int)attrList.size(); i<len; i++) { //!< TODO: conversion from size_t to int
     DF_Attribute* anAttr = attrList[i];
     std::string type = SALOMEDSImpl_GenericAttribute::Impl_GetType(anAttr);
     if (type.substr(0, 17) == std::string("AttributeTreeNode")) continue; // never copy tree node attribute
@@ -1084,7 +1122,7 @@ DF_Label SALOMEDSImpl_Study::PasteLabel(SALOMEDSImpl_Driver* theEngine,
 
     if (theEngine->CanPaste(aCompName, anObjID->Value())) {
       std::string aTMPStr = aNameAttribute->Value();
-      int aLen = aTMPStr.size();
+      int aLen = (int)aTMPStr.size(); //!< TODO: conversion from size_t to int
       unsigned char* aStream = NULL;
       if(aLen > 0) {
         aStream = new unsigned char[aLen+10];
@@ -1111,7 +1149,7 @@ DF_Label SALOMEDSImpl_Study::PasteLabel(SALOMEDSImpl_Driver* theEngine,
 
   // iterate attributes
   std::vector<DF_Attribute*> attrList = theSource.GetAttributes();
-  for(int i = 0, len = attrList.size(); i<len; i++) {
+  for(int i = 0, len = (int)attrList.size(); i<len; i++) { //!< TODO: conversion from size_t to int
     DF_Attribute* anAttr = attrList[i];
     if (aTargetLabel.FindAttribute(anAttr->ID())) {
       aTargetLabel.ForgetAttribute(anAttr->ID());
@@ -1438,7 +1476,7 @@ SALOMEDSImpl_SObject SALOMEDSImpl_Study::FindObjectByPath(const std::string& the
 
   std::string aPath(thePath), aToken;
   SALOMEDSImpl_SObject aSO;
-  int aLength = aPath.size();
+  int aLength = (int)aPath.size(); //!< TODO: conversion from size_t to int
   bool isRelative = false;
 
   if(aLength == 0) {  //Empty path - return the current context
@@ -1463,7 +1501,7 @@ SALOMEDSImpl_SObject SALOMEDSImpl_Study::FindObjectByPath(const std::string& the
   }
 
   std::vector<std::string> vs = SALOMEDSImpl_Tool::splitString(aPath, '/');
-  for(int i = 0, len = vs.size(); i<len; i++) {
+  for(int i = 0, len = (int)vs.size(); i<len; i++) { //!< TODO: conversion from size_t to int
 
     aToken = vs[i];
     if(aToken.size() == 0) break;
@@ -1781,7 +1819,7 @@ std::string SALOMEDSImpl_Study::_GetStudyVariablesScript()
   std::string set_method = _GetNoteBookAccessor()+".set(";
   std::string varName;
   std::string varValue;
-  for(int i = 0 ; i < myNoteBookVars.size();i++ ) {
+  for(int i = 0 ; i < (int)myNoteBookVars.size();i++ ) {
     varName = myNoteBookVars[i]->Name();
     varValue = myNoteBookVars[i]->SaveToScript();
     dump+=set_method+"\""+varName+"\", "+varValue+")\n";
@@ -1886,7 +1924,7 @@ std::string SALOMEDSImpl_Study::GetLastModificationDate()
   std::vector<int> aMinutes, aHours, aDays, aMonths, aYears;
   aProp->GetModifications(aNames, aMinutes, aHours, aDays, aMonths, aYears);
 
-  int aLastIndex = aNames.size()-1;
+  int aLastIndex = (int)aNames.size()-1; //!< TODO: conversion from size_t to int
   char aResult[20];
   sprintf(aResult, "%2.2d/%2.2d/%4.4d %2.2d:%2.2d",
           (int)(aDays[aLastIndex]),(int)(aMonths[aLastIndex]), (int)(aYears[aLastIndex]),
@@ -1904,7 +1942,7 @@ std::vector<std::string> SALOMEDSImpl_Study::GetModificationsDate()
   std::vector<int> aMinutes, aHours, aDays, aMonths, aYears;
   aProp->GetModifications(aNames, aMinutes, aHours, aDays, aMonths, aYears);
 
-  int anIndex, aLength = aNames.size();
+  int anIndex, aLength = (int)aNames.size(); //!< TODO: conversion from size_t to int
   std::vector<std::string> aDates;
 
   for (anIndex = 1; anIndex < aLength; anIndex++) {
@@ -2047,19 +2085,24 @@ bool SALOMEDSImpl_Study::DumpStudy(const std::string& thePath,
   }
 
   std::vector<std::string> aSeq;
-  std::string aCompType, aFactoryType;
+  std::string aFactoryType;
 
   //Build a list of all components in the Study
   SALOMEDSImpl_SComponentIterator itcomponent = NewComponentIterator();
 
-  for (; itcomponent.More(); itcomponent.Next()) {
-    SALOMEDSImpl_SComponent sco = itcomponent.Value();
-    aCompType = sco.ComponentDataType();
-   if (aCompType == "GEOM")
-      aSeq.insert(aSeq.begin(), aCompType);
-    else
-      aSeq.push_back(aCompType);
+  for (; itcomponent.More(); itcomponent.Next())
+    aSeq.push_back(itcomponent.Value().ComponentDataType());
+
+  std::vector<std::string>::iterator it;
+  if ( (it = std::find( aSeq.begin(), aSeq.end(), "GEOM" )) != aSeq.end() ) {
+    aSeq.erase( it );
+    aSeq.insert(aSeq.begin(), "GEOM" );
   }
+  if ( (it = std::find( aSeq.begin(), aSeq.end(), "SHAPER" )) != aSeq.end() ) {
+    aSeq.erase( it );
+    aSeq.insert(aSeq.begin(), "SHAPER" );
+  }
+
   // re-arrange modules in the sequence, if specific order is given via SALOME_MODULES_ORDER environment variable.
   if ( getenv("SALOME_MODULES_ORDER") != 0 ) {
     std::string order = getenv("SALOME_MODULES_ORDER");
@@ -2091,7 +2134,12 @@ bool SALOMEDSImpl_Study::DumpStudy(const std::string& thePath,
 
   //Create a file that will contain a main Study script
   std::fstream fp;
+#if defined(WIN32) && defined(UNICODE)
+  std::wstring aConverterFN = Kernel_Utils::utf8_decode_s(aFileName);
+  fp.open(aConverterFN.c_str(), std::ios::out);
+#else
   fp.open(aFileName.c_str(), std::ios::out);
+#endif
 
 #ifdef WIN32
   bool isOpened = fp.is_open();
@@ -2103,6 +2151,7 @@ bool SALOMEDSImpl_Study::DumpStudy(const std::string& thePath,
     _errorCode = std::string("Can't create a file ")+aFileName;
     return false;
   }
+  _dumpPath = thePath;
 
   std::stringstream sfp;
 
@@ -2144,10 +2193,10 @@ bool SALOMEDSImpl_Study::DumpStudy(const std::string& thePath,
 
   // dump all components and create the components specific scripts
   bool isOk = true;
-  int aLength = aSeq.size();
+  int aLength = (int)aSeq.size(); //!< TODO: conversion from size_t to int
   for(int i = 1; i <= aLength; i++) {
 
-    aCompType = aSeq[i-1];
+    std::string aCompType = aSeq[i-1];
     SALOMEDSImpl_SComponent sco = FindComponent(aCompType);
     SALOMEDSImpl_Driver* aDriver = NULL;
     // if there is an associated Engine call its method for saving
@@ -2209,7 +2258,12 @@ bool SALOMEDSImpl_Study::DumpStudy(const std::string& thePath,
       aFileName += aScriptName+ std::string(".py");
       aSeqOfFileNames.push_back(aFileName);
 
+#if defined(WIN32) && defined(UNICODE)
+      std::wstring aConverterFN2 = Kernel_Utils::utf8_decode_s(aFileName);
+      fp2.open(aConverterFN2.c_str(), std::ios::out);
+#else
       fp2.open(aFileName.c_str(), std::ios::out);
+#endif
 
 #ifdef WIN32
       isOpened = fp2.is_open();
@@ -2251,9 +2305,18 @@ bool SALOMEDSImpl_Study::DumpStudy(const std::string& thePath,
 
   fp.close();
 
+  _dumpPath.clear();
+
   return isOk;
 }
 
+// Returns the folder of the python script which is currently dumped
+std::string SALOMEDSImpl_Study::GetDumpPath()
+{
+  return _dumpPath;
+}
+
+
 //=======================================================================
 //function : GetDumpStudyComment
 //purpose  : return a header comment for a DumpStudy script
@@ -2322,7 +2385,7 @@ void dumpSO(const SALOMEDSImpl_SObject& theSO,
   std::string aTab(Tab), anID(theSO.GetID());
   fp << aTab << anID << std::endl;
   std::vector<DF_Attribute*> attribs = theSO.GetLabel().GetAttributes();
-  for(int i = 0; i<attribs.size(); i++) {
+  for(int i = 0; i<(int)attribs.size(); i++) {
     SALOMEDSImpl_GenericAttribute* anAttr = dynamic_cast<SALOMEDSImpl_GenericAttribute*>(attribs[i]);
 
     if(!anAttr) {
@@ -2469,7 +2532,7 @@ bool SALOMEDSImpl_Study::IsStudyLocked()
 void SALOMEDSImpl_Study::UnLockStudy(const char* theLockerID)
 {
   std::vector<std::string>::iterator vsI = _lockers.begin();
-  int length = _lockers.size();
+  int length = (int)_lockers.size(); //!< TODO: conversion from size_t to int
   bool isFound = false;
   std::string id(theLockerID);
   for(int i = 0; i<length; i++, vsI++) {
@@ -2558,7 +2621,7 @@ void SALOMEDSImpl_Study::SetStringVariable(const std::string& theVarName,
 //============================================================================
 void SALOMEDSImpl_Study::SetStringVariableAsDouble(const std::string& theVarName,
                                                    const double theValue,
-                                                   const SALOMEDSImpl_GenericVariable::VariableTypes theType)
+                                                   const SALOMEDSImpl_GenericVariable::VariableTypes /*theType*/)
 {
   SALOMEDSImpl_GenericVariable* aGVar = GetVariable(theVarName);
   if(SALOMEDSImpl_ScalarVariable* aSVar = dynamic_cast<SALOMEDSImpl_ScalarVariable*>(aGVar))
@@ -2634,7 +2697,7 @@ std::vector<std::string> SALOMEDSImpl_Study::GetVariableNames() const
 {
   std::vector<std::string> aResult;
 
-  for(int i = 0; i < myNoteBookVars.size(); i++)
+  for(int i = 0; i < (int)myNoteBookVars.size(); i++)
     aResult.push_back(myNoteBookVars[i]->Name());
 
   return aResult;
@@ -2658,7 +2721,7 @@ void SALOMEDSImpl_Study::AddVariable(SALOMEDSImpl_GenericVariable* theVariable)
 SALOMEDSImpl_GenericVariable* SALOMEDSImpl_Study::GetVariable(const std::string& theName) const
 {
   SALOMEDSImpl_GenericVariable* aResult = NULL;
-  for(int i = 0; i < myNoteBookVars.size();i++) {
+  for(int i = 0; i < (int)myNoteBookVars.size();i++) {
     if(theName.compare(myNoteBookVars[i]->Name()) == 0) {
       aResult = myNoteBookVars[i];
       break;
@@ -2756,10 +2819,10 @@ bool SALOMEDSImpl_Study::FindVariableAttribute(SALOMEDSImpl_StudyBuilder* theStu
       std::string aString = aStringAttr->Value();
 
       std::vector< std::vector<std::string> > aSections = ParseVariables( aString );
-      for( int i = 0, n = aSections.size(); i < n; i++ )
+      for( int i = 0, n = (int)aSections.size(); i < n; i++ ) //!< TODO: conversion from size_t to int
       {
         std::vector<std::string> aVector = aSections[i];
-        for( int j = 0, m = aVector.size(); j < m; j++ )
+        for( int j = 0, m = (int)aVector.size(); j < m; j++ ) //!< TODO: conversion from size_t to int
         {
           std::string aStr = aVector[j];
           if( aStr.compare( theName ) == 0 )
@@ -2812,10 +2875,10 @@ void SALOMEDSImpl_Study::ReplaceVariableAttribute(SALOMEDSImpl_StudyBuilder* the
       std::string aNewString, aCurrentString = aStringAttr->Value();
 
       std::vector< std::vector<std::string> > aSections = ParseVariables( aCurrentString );
-      for( int i = 0, n = aSections.size(); i < n; i++ )
+      for( int i = 0, n = (int)aSections.size(); i < n; i++ ) //!< TODO: conversion from size_t to int
       {
         std::vector<std::string> aVector = aSections[i];
-        for( int j = 0, m = aVector.size(); j < m; j++ )
+        for( int j = 0, m = (int)aVector.size(); j < m; j++ ) //!< TODO: conversion from size_t to int
         {
           std::string aStr = aVector[j];
           if( aStr.compare( theSource ) == 0 )
@@ -3004,7 +3067,7 @@ static void SaveAttributes(const SALOMEDSImpl_SObject& aSO, HDFgroup *hdf_group_
   hdf_size size[1];
   std::vector<DF_Attribute*> attrList = aSO.GetLabel().GetAttributes();
   DF_Attribute* anAttr = NULL;
-  for(int i = 0, len = attrList.size(); i<len; i++) {
+  for(int i = 0, len = (int)attrList.size(); i<len; i++) { //!< TODO: conversion from size_t to int
     anAttr = attrList[i];
     //The following attributes are not supposed to be written to the file
     std::string type = SALOMEDSImpl_GenericAttribute::Impl_GetType(anAttr);