Salome HOME
Compilation under Windows: add missing header
[modules/kernel.git] / src / TOOLSDS / SALOMEDS_Tool.cxx
index 9f9ffd6b74a608020b7b9cf4371d92fe228a0e7d..2b61d3fddcb726106b06b87a1c5049cdbd34e6a6 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2007-2016  CEA/DEN, EDF R&D, OPEN CASCADE
+// Copyright (C) 2007-2021  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
@@ -30,6 +30,7 @@
 
 #include "utilities.h"
 #include "Basics_DirUtils.hxx"
+#include "Basics_Utils.hxx"
 
 #ifndef WIN32
 #include <sys/time.h>
 
 #include <iostream> 
 #include <fstream>
-#include <stdlib.h>
 
 #include <SALOMEconfig.h>
 #include CORBA_SERVER_HEADER(SALOMEDS_Attributes)
 
 bool Exists(const std::string thePath) 
 {
-#ifdef WIN32 
-  if (  GetFileAttributes (  thePath.c_str()  ) == 0xFFFFFFFF  ) { 
-    if (  GetLastError () == ERROR_FILE_NOT_FOUND  ) {
-      return false;
-    }
-  }
-#else 
-  int status = access ( thePath.c_str() , F_OK ); 
-  if (status != 0) return false;
-#endif
-  return true;
+       return Kernel_Utils::IsExists(thePath);
 }
 
 
@@ -132,18 +122,24 @@ std::string SALOMEDS_Tool::GetTmpDir()
 // purpose  : Removes files listed in theFileList
 //============================================================================
 void SALOMEDS_Tool::RemoveTemporaryFiles(const std::string& theDirectory, 
-                                         const std::list<std::string>& theFiles,
+                                         const ListOfFiles& theFiles,
                                          const bool IsDirDeleted)
 {
   std::string aDirName = theDirectory;
 
-  for(std::list<std::string>::const_iterator it = theFiles.begin(); it != theFiles.end(); it++) {
+  size_t i, aLength = theFiles.size();
+  for(i=1; i<=aLength; i++) {
     std::string aFile(aDirName);
-    aFile += *it;
+    aFile += theFiles[i-1];
     if(!Exists(aFile)) continue;
 
 #ifdef WIN32
-    DeleteFile(aFile.c_str());
+#if defined(UNICODE)
+       std::wstring aFileToDelete = Kernel_Utils::utf8_decode_s(aFile);
+#else
+       std::string aFileToDelete = aFile;
+#endif
+    DeleteFile(aFileToDelete.c_str());
 #else 
     unlink(aFile.c_str());
 #endif
@@ -152,7 +148,12 @@ void SALOMEDS_Tool::RemoveTemporaryFiles(const std::string& theDirectory,
   if(IsDirDeleted) {
     if(Exists(aDirName)) {
 #ifdef WIN32
-      RemoveDirectory(aDirName.c_str());
+#if defined(UNICODE)
+               std::wstring aDirToDelete = Kernel_Utils::utf8_decode_s(aDirName);
+#else
+               std::string aDirToDelete = aDirName;
+#endif
+      RemoveDirectory(aDirToDelete.c_str());
 #else
       rmdir(aDirName.c_str());
 #endif
@@ -169,11 +170,11 @@ namespace
 {
   SALOMEDS::TMPFile* 
   PutFilesToStream(const std::string& theFromDirectory,
-                   const std::list<std::string>& theFiles,
-                   const std::list<std::string>& theFileNames,
+                   const std::vector<std::string>& theFiles,
+                   const std::vector<std::string>& theFileNames,
                    const int theNamesOnly)
   {
-    int i = 0, aLength = theFiles.size();
+    int i, aLength = (int)theFiles.size(); //!< TODO: conversion from size_t to int
     if(aLength == 0)
       return (new SALOMEDS::TMPFile);
     
@@ -189,25 +190,27 @@ namespace
     
     //Determine the required size of the buffer
     
-    std::list<std::string>::const_iterator it_files = theFiles.begin();
-    std::list<std::string>::const_iterator it_names = theFileNames.begin();
-    for(; it_files != theFiles.end(); it_files++, it_names++, i++) {
+    for(i=0; i<aLength; i++) {
       
       //Check if the file exists
       
       if (!theNamesOnly) { // mpv 15.01.2003: if only file names must be stroed, then size of files is zero
-        std::string aFullPath = aTmpDir + *it_files;
+        std::string aFullPath = aTmpDir + theFiles[i];
         if(!Exists(aFullPath)) continue;
 #ifdef WIN32
+#ifdef UNICODE
+               std::ifstream aFile(Kernel_Utils::utf8_decode_s(aFullPath).c_str(), std::ios::binary);
+#else
         std::ifstream aFile(aFullPath.c_str(), std::ios::binary);
+#endif
 #else
         std::ifstream aFile(aFullPath.c_str());
 #endif
         aFile.seekg(0, std::ios::end);
-        aFileSize[i] = aFile.tellg();
+        aFileSize[i] = (long)aFile.tellg(); //!< TODO: conversion from std::streamoff to long
         aBufferSize += aFileSize[i];              //Add a space to store the file
       }
-      aFileNameSize[i] = (*it_names).length()+1;
+      aFileNameSize[i] = (int)theFileNames[i].length()+1; //!< TODO: conversion from size_t to int
       aBufferSize += aFileNameSize[i];          //Add a space to store the file name
       aBufferSize += (theNamesOnly)?4:12;       //Add 4 bytes: a length of the file name,
       //    8 bytes: length of the file itself
@@ -216,7 +219,8 @@ namespace
     
     if ( aNbFiles == 0 ) return (new SALOMEDS::TMPFile);
     aBufferSize += 4;      //4 bytes for a number of the files that will be written to the stream;
-    unsigned char* aBuffer = new unsigned char[aBufferSize];  
+       unsigned char* aBuffer = new unsigned char[aBufferSize];
+
     if(aBuffer == NULL)
       return (new SALOMEDS::TMPFile);
     
@@ -228,15 +232,17 @@ namespace
     
     aCurrentPos = 4;
     
-    it_files = theFiles.begin();
-    it_names = theFileNames.begin();
-    for(; it_files != theFiles.end(); it_files++, it_names++, i++) {
-      std::ifstream *aFile;
+    for(i=0; i<aLength; i++) {
+         std::ifstream *aFile;
       if (!theNamesOnly) { // mpv 15.01.2003: we don't open any file if theNamesOnly = true
-        std::string aFullPath = aTmpDir + *it_files;
+        std::string aFullPath = aTmpDir + theFiles[i];
         if(!Exists(aFullPath)) continue;
 #ifdef WIN32
+#ifdef UNICODE
+               aFile = new std::ifstream (Kernel_Utils::utf8_decode_s(aFullPath).c_str(), std::ios::binary);
+#else
         aFile = new std::ifstream(aFullPath.c_str(), std::ios::binary);
+#endif
 #else
         aFile = new std::ifstream(aFullPath.c_str());
 #endif  
@@ -248,7 +254,7 @@ namespace
       aCurrentPos += 4;
       
       //Copy the file name to the buffer
-      memcpy((aBuffer + aCurrentPos), (*it_names).c_str(), aFileNameSize[i]);
+      memcpy((aBuffer + aCurrentPos), theFileNames[i].c_str(), aFileNameSize[i]);
       aCurrentPos += aFileNameSize[i];
       
       if (!theNamesOnly) { // mpv 15.01.2003: we don't copy file content to the buffer if !theNamesOnly
@@ -259,7 +265,7 @@ namespace
         aCurrentPos += 8;
         
         aFile->seekg(0, std::ios::beg);
-        aFile->read((char *)(aBuffer + aCurrentPos), aFileSize[i]);
+               aFile->read((char *)(aBuffer + aCurrentPos), aFileSize[i]);
         aFile->close();
         delete(aFile);
         aCurrentPos += aFileSize[i];
@@ -280,17 +286,17 @@ namespace
 
 SALOMEDS::TMPFile* 
 SALOMEDS_Tool::PutFilesToStream(const std::string& theFromDirectory,
-                                const std::list<std::string>& theFiles,
+                                const ListOfFiles& theFiles,
                                 const int theNamesOnly)
 {
-  std::list<std::string> aFileNames(theFiles);
+  ListOfFiles aFileNames(theFiles);
   return ::PutFilesToStream(theFromDirectory,theFiles,aFileNames,theNamesOnly);
 }
 
 
 SALOMEDS::TMPFile* 
-SALOMEDS_Tool::PutFilesToStream(const std::list<std::string>& theFiles,
-                                const std::list<std::string>& theFileNames)
+SALOMEDS_Tool::PutFilesToStream(const ListOfFiles& theFiles,
+                                const ListOfFiles& theFileNames)
 {
   return ::PutFilesToStream("",theFiles,theFileNames,0);
 }
@@ -299,19 +305,18 @@ SALOMEDS_Tool::PutFilesToStream(const std::list<std::string>& theFiles,
 // function : PutStreamToFile
 // purpose  : converts the stream "theStream" to the files
 //============================================================================
-std::list<std::string>
+SALOMEDS_Tool::ListOfFiles
 SALOMEDS_Tool::PutStreamToFiles(const SALOMEDS::TMPFile& theStream,
                                 const std::string& theToDirectory,
                                 const int theNamesOnly)
 {
-  std::list<std::string> aFiles;
+  ListOfFiles aFiles;
 
   if(theStream.length() == 0)
     return aFiles;
 
   //Get a temporary directory for saving a file
   std::string aTmpDir = theToDirectory;
-
   unsigned char *aBuffer = (unsigned char*)theStream.NP_data();
 
   if(aBuffer == NULL)
@@ -323,6 +328,8 @@ SALOMEDS_Tool::PutStreamToFiles(const SALOMEDS::TMPFile& theStream,
   //Copy the number of files in the stream
   memcpy(&aNbFiles, aBuffer, sizeof(int)); 
 
+  aFiles.reserve(aNbFiles);
+
   for(i=0; i<aNbFiles; i++) {
 
     //Put a length of the file name to aFileNameSize
@@ -333,10 +340,10 @@ SALOMEDS_Tool::PutStreamToFiles(const SALOMEDS::TMPFile& theStream,
     //Put a file name to aFileName
     memcpy(aFileName, (aBuffer + aCurrentPos), aFileNameSize); 
 #ifdef WIN32
-    for (int i = 0; i < strlen(aFileName); i++)
+    for (int j = 0; j < strlen(aFileName); j++)
     {
-      if (aFileName[i] == ':')
-       aFileName[i] = '_';
+      if (aFileName[j] == ':')
+        aFileName[j] = '_';
     }
 #endif
     aCurrentPos += aFileNameSize;
@@ -348,11 +355,15 @@ SALOMEDS_Tool::PutStreamToFiles(const SALOMEDS::TMPFile& theStream,
       
       std::string aFullPath = aTmpDir + aFileName;
 #ifdef WIN32
+#ifdef UNICODE
+         std::ofstream aFile(Kernel_Utils::utf8_decode_s(aFullPath).c_str(), std::ios::binary);
+#else
       std::ofstream aFile(aFullPath.c_str(), std::ios::binary);
+#endif
 #else
       std::ofstream aFile(aFullPath.c_str());
 #endif
-      aFile.write((char *)(aBuffer+aCurrentPos), aFileSize); 
+         aFile.write((char *)(aBuffer + aCurrentPos), aFileSize);
       aFile.close();  
       aCurrentPos += aFileSize;
     }
@@ -371,25 +382,25 @@ std::string SALOMEDS_Tool::GetNameFromPath(const std::string& thePath) {
   if (thePath.empty()) return "";
   std::string aPath = thePath;
   bool isFound = false;
-  int pos = aPath.rfind('/');
-  if(pos > 0) {
+  size_t pos = aPath.rfind('/');
+  if(pos != std::string::npos) {
     aPath = aPath.substr(pos+1, aPath.size());
     isFound = true;
   }    
   if(!isFound) {
     pos = aPath.rfind('\\'); 
-    if(pos > 0) {
+    if(pos != std::string::npos) {
       aPath = aPath.substr(pos+1, aPath.size()); 
       isFound = true;
     }  
   }  
   if(!isFound) {  
     pos = aPath.rfind('|');
-    if(pos > 0) aPath =  aPath.substr(pos+1, aPath.size()); 
+    if(pos != std::string::npos) aPath = aPath.substr(pos+1, aPath.size()); 
   }
 
   pos = aPath.rfind('.'); 
-  if(pos > 0)  aPath = aPath.substr(0, pos); //Remove extension
+  if(pos != std::string::npos)  aPath = aPath.substr(0, pos); //Remove extension
     
   return aPath;
 }
@@ -401,18 +412,18 @@ std::string SALOMEDS_Tool::GetNameFromPath(const std::string& thePath) {
 std::string SALOMEDS_Tool::GetDirFromPath(const std::string& thePath) {
   if (thePath.empty()) return "";
 
-  int pos = thePath.rfind('/');
+  size_t pos = thePath.rfind('/');
   std::string path;
-  if(pos > 0) {
+  if(pos != std::string::npos) {
     path = thePath.substr(0, pos+1);
   }
   if(path.empty()) {
     pos = thePath.rfind('\\');
-    if(pos > 0) path = thePath.substr(0, pos+1); 
+    if(pos != std::string::npos) path = thePath.substr(0, pos+1); 
   }
   if(path.empty()) {
     pos = thePath.rfind('|');
-    if(pos > 0) path = thePath.substr(0, pos+1); 
+    if(pos != std::string::npos) path = thePath.substr(0, pos+1); 
   }
   if(path.empty()) {
     path = thePath+"/";
@@ -422,7 +433,7 @@ std::string SALOMEDS_Tool::GetDirFromPath(const std::string& thePath) {
   if(path.size() == 2 && path[1] == ':') path +='\\';
 #endif
 
-  for(int i = 0, len = path.size(); i<len; i++) 
+  for(size_t i = 0, len = path.size(); i<len; i++) 
     if(path[i] == '|') path[i] = '/';
   return path;
 }
@@ -432,7 +443,7 @@ std::string SALOMEDS_Tool::GetDirFromPath(const std::string& thePath) {
 // Purpose : Retrieve specified flaf from "AttributeFlags" attribute
 //=======================================================================
 bool SALOMEDS_Tool::GetFlag( const int             theFlag,
-                             SALOMEDS::Study_var   theStudy,
+                             SALOMEDS::Study_var   /*theStudy*/,
                              SALOMEDS::SObject_var theObj )
 {
   SALOMEDS::GenericAttribute_var anAttr;
@@ -516,4 +527,3 @@ void SALOMEDS_Tool::GetAllChildren( SALOMEDS::Study_var               theStudy,
 }
 
 
-