+// 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 )
{
}
{
}
-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;
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
if(aFileBuffer == NULL)
return false;
- myTmpDir = QDir::convertSeparators( QFileInfo( theFileName ).dirPath( true ) + "/" ).latin1() ;
+ myTmpDir = QDir::toNativeSeparators( QFileInfo( theFileName ).absolutePath() + "/" ).toUtf8().constData() ;
int aCurrentPos = 0;
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
aCurrentPos += aBufferSize[i];
}
-#ifdef WNT
+#ifdef WIN32
ofstream aFile(theFileName, ios::out | ios::binary);
#else
ofstream aFile(theFileName);
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();
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);
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;
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 )
{
// 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];
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());
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
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());
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 )
{
// 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()));
TCollection_AsciiString aFullPath = aTmpDir + aFileName;
-#ifdef WNT
+#ifdef WIN32
ofstream aFile(aFullPath.ToCString(), ios::out | ios::binary);
#else
ofstream aFile(aFullPath.ToCString());
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;
}
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);
}
-//============================================================================
-// 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 )
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 "";