]> SALOME platform Git repositories - modules/gui.git/commitdiff
Salome HOME
Deletion of a temporary directory implemented
authorsan <san@opencascade.com>
Wed, 21 Dec 2005 12:28:53 +0000 (12:28 +0000)
committersan <san@opencascade.com>
Wed, 21 Dec 2005 12:28:53 +0000 (12:28 +0000)
src/LightApp/LightApp_Driver.cxx
src/LightApp/LightApp_Driver.h

index 2212357e795150f2056fa63cd4e34bc82adb0984..122890390b9f88c84a8a79bdb4f69d9bf04d7a21 100644 (file)
@@ -38,6 +38,7 @@
 
 /*! Constructor.*/
 LightApp_Driver::LightApp_Driver()
+: myIsTemp( false )
 {
 }
  
@@ -354,6 +355,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()));
 
@@ -430,9 +435,17 @@ 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();
   }
 }
 
@@ -461,9 +474,13 @@ void LightApp_Driver::ClearDriverContents()
   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 );
 }
 
 //============================================================================
index 917918e5ad6de53d21977f32a318b874a30f29ef..f995ce27d43e7a76b49858978010ad4a02239d77 100644 (file)
@@ -60,10 +60,16 @@ protected:
   std::string GetTmpDir();
   std::string GetDirFromPath(const std::string& thePath);
 
+  void                SetIsTemporary( bool theFlag ) { myIsTemp = theFlag; }
+  bool                IsTemporary() const { return myIsTemp; }
+
 protected:
   typedef std::map<std::string, ListOfFiles> MapOfListOfFiles;
   MapOfListOfFiles                           myMap;
   std::string                                myTmpDir;
+
+private:
+  bool                                       myIsTemp;
 };
 
 #endif