Salome HOME
Updated copyright comment
[modules/gui.git] / src / LightApp / LightApp_Driver.cxx
index a10d2be1e9cf34e4761278182402f6ddf7b17393..0a24981100086d4d4639936df6b891796a6204b8 100644 (file)
@@ -1,3 +1,25 @@
+// Copyright (C) 2007-2024  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
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+//
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+
 #include "LightApp_Driver.h"
 
 #include <TCollection_AsciiString.hxx> 
 #include <OSD_Path.hxx>
 #include <OSD_File.hxx>
 #include <OSD_Directory.hxx>
-#include <OSD_Process.hxx>
-#include <OSD_Directory.hxx>
 #include <OSD_Protection.hxx>
-#include <OSD_SingleProtection.hxx>
 #include <OSD_FileIterator.hxx>
 
-#include <qfileinfo.h>
-#include <qdir.h>
+#include <QFileInfo>
+#include <QDir>
+
+#include <Qtx.h>
 
 #ifdef WIN32
 #include <time.h>
 #endif
 
+using namespace std;
+
 /*! Constructor.*/
 LightApp_Driver::LightApp_Driver()
+: myIsTemp( false )
 {
 }
  
@@ -28,12 +52,9 @@ LightApp_Driver::~LightApp_Driver()
 {
 }
 
-using namespace std;
-
-//================================================================
-// Function : SaveDatasInFile
-/*! Purpose  : save in file 'theFileName' datas from this driver*/
-//================================================================
+/*!
+  Save in file 'theFileName' datas from this driver
+*/
 bool LightApp_Driver::SaveDatasInFile( const char* theFileName, bool isMultiFile )
 {
   int aNbModules = 0;
@@ -53,7 +74,7 @@ bool LightApp_Driver::SaveDatasInFile( const char* theFileName, bool isMultiFile
   for (it = myMap.begin(); it != myMap.end(); ++it) {
     aModuleName[i] = const_cast<char*>(it->first.c_str());//(it->first);
     aFileBufferSize += 4;                                //Add 4 bytes: a length of the module name
-    aFileBufferSize += strlen(aModuleName[i])+1;
+    aFileBufferSize += (int)strlen(aModuleName[i])+1;          //!< TODO: conversion from size_t to int
     std::string aName(aModuleName[i]);
     PutFilesToStream(aName, aBuffer[i], aBufferSize[i], isMultiFile);
     aFileBufferSize += 8;                                //Add 8 bytes: a length of the buffer
@@ -66,7 +87,7 @@ bool LightApp_Driver::SaveDatasInFile( const char* theFileName, bool isMultiFile
   if(aFileBuffer == NULL)
     return false;
 
-  myTmpDir = QDir::convertSeparators( QFileInfo( theFileName ).dirPath( true ) + "/" ).latin1() ;
+  myTmpDir = QDir::toNativeSeparators( QFileInfo( theFileName ).absolutePath() + "/" ).toUtf8().constData() ;
 
   int aCurrentPos = 0;
 
@@ -78,7 +99,7 @@ bool LightApp_Driver::SaveDatasInFile( const char* theFileName, bool isMultiFile
 
   int aBufferNameSize = 0;
   for (i = 0; i < n; i++) {
-    aBufferNameSize = strlen(aModuleName[i])+1;
+    aBufferNameSize = (int)strlen(aModuleName[i])+1; //!< TODO: conversion from size_t to int
     //Initialize 4 bytes of the buffer by 0
     memset((aFileBuffer + aCurrentPos), 0, 4); 
     //Copy the length of the module name to the buffer
@@ -98,7 +119,7 @@ bool LightApp_Driver::SaveDatasInFile( const char* theFileName, bool isMultiFile
     aCurrentPos += aBufferSize[i];
   }
 
-#ifdef WNT  
+#ifdef WIN32
   ofstream aFile(theFileName, ios::out | ios::binary);
 #else
   ofstream aFile(theFileName);
@@ -114,19 +135,18 @@ bool LightApp_Driver::SaveDatasInFile( const char* theFileName, bool isMultiFile
   return true;
 }
 
-//=======================================================================
-// name    : ReaDatasFromFile
-/*! Purpose : filling current driver from file 'theFileName'*/
-//=======================================================================
+/*!
+  Filling current driver from file 'theFileName'
+*/
 bool LightApp_Driver::ReadDatasFromFile( const char* theFileName, bool isMultiFile )
 {
-#ifdef WNT
+#ifdef WIN32
   ifstream aFile(theFileName, ios::binary);
 #else
   ifstream aFile(theFileName);
 #endif  
 
-  myTmpDir = QDir::convertSeparators( QFileInfo( theFileName ).dirPath( true ) + "/" ).latin1() ;
+  myTmpDir = QDir::toNativeSeparators( QFileInfo( theFileName ).absolutePath() + "/" ).toUtf8().constData() ;
 
   aFile.seekg(0, ios::end);
   int aFileBufferSize = aFile.tellg();
@@ -174,10 +194,9 @@ bool LightApp_Driver::ReadDatasFromFile( const char* theFileName, bool isMultiFi
   return true;
 }
 
-//================================================================
-// Function : GetTmpDir
-/*! Purpose  : returns temp directory for path 'theURL'*/
-//================================================================
+/*!
+  \return temp directory for path 'theURL'
+*/
 std::string LightApp_Driver::GetTmpDir (const char* theURL, const bool  isMultiFile)
 {
   std::string anURLDir = GetDirFromPath(theURL);
@@ -186,10 +205,9 @@ std::string LightApp_Driver::GetTmpDir (const char* theURL, const bool  isMultiF
   return aTmpDir;
 }
 
-//================================================================
-// Function : GetListOfFiles
-/*! Purpose  : returns list of files for module with name 'theModuleName'*/
-//================================================================
+/*!
+  \return list of files for module with name 'theModuleName'
+*/
 LightApp_Driver::ListOfFiles LightApp_Driver::GetListOfFiles( const char* theModuleName )
 {
   ListOfFiles aListOfFiles;
@@ -198,23 +216,21 @@ LightApp_Driver::ListOfFiles LightApp_Driver::GetListOfFiles( const char* theMod
   if (myMap.count(aName))
     aListOfFiles = myMap[aName];
 
-    return aListOfFiles;
+  return aListOfFiles;
 }
 
-//================================================================
-// Function : SetListOfFiles
-/*! Purpose  : sets list of files for module with name 'theModuleName'*/
-//================================================================
+/*!
+  Sets list of files for module with name 'theModuleName'
+*/
 void LightApp_Driver::SetListOfFiles( const char* theModuleName, const ListOfFiles theListOfFiles )
 {
   std::string aName (theModuleName);
   myMap[aName] = theListOfFiles;
 }
 
-//============================================================================
-// function : PutFilesToStream
-/*! Purpose  : converts files which was created from module <theModuleName> into a byte sequence unsigned char*/
-//============================================================================
+/*!
+  Converts files which was created from module <theModuleName> into a byte sequence unsigned char
+*/
 void LightApp_Driver::PutFilesToStream( const std::string& theModuleName, unsigned char*& theBuffer,
                                         long& theBufferSize, bool theNamesOnly )
 {
@@ -222,7 +238,7 @@ void LightApp_Driver::PutFilesToStream( const std::string& theModuleName, unsign
   // aFiles must contain temporary directory name in its first item
   // and names of files (relatively the temporary directory) in the others
 
-  int i, aLength = aFiles.size() - 1;
+  int i, aLength = (int)aFiles.size() - 1; //!< TODO: conversion size_t to int
   if(aLength <= 0) {
     theBufferSize = 0;
     theBuffer = new unsigned char[theBufferSize];
@@ -248,7 +264,7 @@ void LightApp_Driver::PutFilesToStream( const std::string& theModuleName, unsign
       OSD_Path anOSDPath(aFullPath);
       OSD_File anOSDFile(anOSDPath);
       if(!anOSDFile.Exists()) continue;
-#ifdef WNT
+#ifdef WIN32
       ifstream aFile(aFullPath.ToCString(), ios::binary);
 #else
       ifstream aFile(aFullPath.ToCString());
@@ -257,7 +273,7 @@ void LightApp_Driver::PutFilesToStream( const std::string& theModuleName, unsign
       aFileSize[i] = aFile.tellg();
       aBufferSize += aFileSize[i];              //Add a space to store the file
     }
-    aFileNameSize[i] = strlen(aFName) + 1;
+    aFileNameSize[i] = (int)strlen(aFName) + 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
@@ -286,7 +302,7 @@ void LightApp_Driver::PutFilesToStream( const std::string& theModuleName, unsign
       OSD_Path anOSDPath(aFullPath);
       OSD_File anOSDFile(anOSDPath);
       if(!anOSDFile.Exists()) continue;
-#ifdef WNT
+#ifdef WIN32
       aFile = new ifstream(aFullPath.ToCString(), ios::binary);
 #else
       aFile = new ifstream(aFullPath.ToCString());
@@ -323,10 +339,9 @@ void LightApp_Driver::PutFilesToStream( const std::string& theModuleName, unsign
   theBufferSize = aBufferSize;
 }
 
-//============================================================================
-// function : PutStreamToFile
-/*! Purpose  : converts a byte sequence <theBuffer> to files and return list of them*/
-//============================================================================
+/*!
+  Converts a byte sequence <theBuffer> to files and return list of them
+*/
 LightApp_Driver::ListOfFiles LightApp_Driver::PutStreamToFiles( const unsigned char* theBuffer,
                                                                 const long theBufferSize, bool theNamesOnly )
 {
@@ -336,6 +351,10 @@ LightApp_Driver::ListOfFiles LightApp_Driver::PutStreamToFiles( const unsigned c
   // Create a temporary directory for the component's data files
   std::string aDir = GetTmpDir();
 
+  // Remember that the files are in a temporary location that should be deleted
+  // when a study is closed
+  SetIsTemporary( true );
+
   //Get a temporary directory for saving a file
   TCollection_AsciiString aTmpDir(const_cast<char*>(aDir.c_str()));
 
@@ -366,7 +385,7 @@ LightApp_Driver::ListOfFiles LightApp_Driver::PutStreamToFiles( const unsigned c
       
       TCollection_AsciiString aFullPath = aTmpDir + aFileName;
       
-#ifdef WNT  
+#ifdef WIN32
   ofstream aFile(aFullPath.ToCString(), ios::out | ios::binary);
 #else
   ofstream aFile(aFullPath.ToCString());
@@ -383,16 +402,14 @@ LightApp_Driver::ListOfFiles LightApp_Driver::PutStreamToFiles( const unsigned c
   return aFiles;
 }
 
-//============================================================================
-// function : RemoveFiles
-/*! Purpose  : Remove files. First item in <theFiles> is a directory with slash at the end.
-               Other items are names of files. If <IsDirDeleted> is true,
-              then the directory is also deleted.
+/*!
+  Remove files. First item in <theFiles> is a directory with slash at the end.
+  Other items are names of files. If <IsDirDeleted> is true,
+  then the directory is also deleted.
 */
-//============================================================================
 void LightApp_Driver::RemoveFiles( const ListOfFiles& theFiles, const bool IsDirDeleted)
 {
-  int i, aLength = theFiles.size() - 1;
+  int i, aLength = (int)theFiles.size() - 1; //!< TODO: conversion size_t to int
   if(aLength <= 0) {
     return;
   }
@@ -412,17 +429,24 @@ void LightApp_Driver::RemoveFiles( const ListOfFiles& theFiles, const bool IsDir
   if(IsDirDeleted) {
     OSD_Path aPath(aDirName);
     OSD_Directory aDir(aPath);
-    OSD_FileIterator anIterator(aPath, '*');
-
-    if(aDir.Exists() && !anIterator.More()) aDir.Remove();
+    // san -- Using a special code block below is essential - it ensures that
+    // OSD_FileIterator instance is destroyed by the moment when
+    // OSD_Directory::Remove() is called.
+    // Otherwise, the directory remains locked (at least on Windows)
+    // by the iterator and cannot be removed.
+    {
+      OSD_FileIterator anIterator(aPath, '*');
+      if(!aDir.Exists() || anIterator.More())
+        return;
+    }
+    aDir.Remove();
   }
 }
 
-//============================================================================
-// function : RemoveTemporaryFiles
-/*! Purpose  : removes files which was created from module theModuleName if 
-               <IsDirDeleted> is true tmp directory is also deleted if it is empty*/
-//============================================================================
+/*!
+  Removes files which was created from module theModuleName if 
+  <IsDirDeleted> is true tmp directory is also deleted if it is empty
+*/
 void LightApp_Driver::RemoveTemporaryFiles( const char* theModuleName, const bool IsDirDeleted )
 {
   std::string aModuleName(theModuleName);
@@ -433,25 +457,27 @@ void LightApp_Driver::RemoveTemporaryFiles( const char* theModuleName, const boo
 
 }
 
-//============================================================================
-// function : ClearDriverContents
-/*! Purpose  : clear map of list files*/ 
-//============================================================================ 
+/*!
+  Clears map of list files
+*/ 
 void LightApp_Driver::ClearDriverContents()
 {
   std::map<std::string, ListOfFiles>::iterator it;
   for ( it = myMap.begin(); it != myMap.end(); ++it ) 
   {
     const char* aModuleName = const_cast<char*>(it->first.c_str());
-    RemoveTemporaryFiles( aModuleName, false );
+    // If the driver contains temporary files - 
+    // remove them along with the temporary directory
+    RemoveTemporaryFiles( aModuleName, IsTemporary() );
   }
-  myMap.clear();
+  myMap.clear();  
+  // Reset the "temporary" flag
+  SetIsTemporary( false );
 }
 
-//============================================================================
-// function : GetTempDir
-/*! Purpose  : return a temp directory to store created files like "/tmp/sub_dir/" */
-//============================================================================ 
+/*!
+  \return a temp directory to store created files like "/tmp/sub_dir/"
+*/
 std::string LightApp_Driver::GetTmpDir()
 {
   if ( myTmpDir.length() != 0 )
@@ -505,15 +531,22 @@ std::string LightApp_Driver::GetTmpDir()
     aDir = OSD_Directory(aPath);
   }
 
+#ifdef WIN32
+  // Workaround for OSD_Protection bug on Windows
+  OSD_Protection aProtection(OSD_RWXD, OSD_RWXD, OSD_RWXD, OSD_RWXD);
+#else
+  OSD_Protection aProtection(OSD_RX, OSD_RWXD, OSD_RX, OSD_RX);
+#endif
+  aDir.Build(aProtection);
+
   myTmpDir = aTmpDir.ToCString();
 
   return aTmpDir.ToCString();
 }
 
-//============================================================================
-// function : GetDirFromPath
-/*! Purpose  : returns the dir by the path*/
-//============================================================================
+/*!
+  \return the dir by the path
+*/
 std::string LightApp_Driver::GetDirFromPath( const std::string& thePath ) {
   if(thePath == "")
     return "";