1 // Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE
3 // Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
6 // This library is free software; you can redistribute it and/or
7 // modify it under the terms of the GNU Lesser General Public
8 // License as published by the Free Software Foundation; either
9 // version 2.1 of the License, or (at your option) any later version.
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 // Lesser General Public License for more details.
16 // You should have received a copy of the GNU Lesser General Public
17 // License along with this library; if not, write to the Free Software
18 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
23 // File : SALOMEDS_Tool.cxx
24 // Created : Mon Oct 21 16:24:34 2002
25 // Author : Sergey RUIN
29 #include "SALOMEDS_Tool.hxx"
31 #include "utilities.h"
32 #include "Basics_DirUtils.hxx"
37 #include <sys/types.h>
49 #include <SALOMEconfig.h>
50 #include CORBA_SERVER_HEADER(SALOMEDS_Attributes)
52 bool Exists(const std::string thePath)
55 if ( GetFileAttributes ( thePath.c_str() ) == 0xFFFFFFFF ) {
56 if ( GetLastError () == ERROR_FILE_NOT_FOUND ) {
61 int status = access ( thePath.c_str() , F_OK );
62 if (status != 0) return false;
68 //============================================================================
69 // function : GetTempDir
70 // purpose : Return a temp directory to store created files like "/tmp/sub_dir/"
71 //============================================================================
72 std::string SALOMEDS_Tool::GetTmpDir()
74 return Kernel_Utils::GetTmpDirByEnv("SALOME_TMP_DIR");
75 //Find a temporary directory to store a file
77 /*string aTmpDir = "";
79 char *Tmp_dir = getenv("SALOME_TMP_DIR");
81 aTmpDir = string(Tmp_dir);
83 if(aTmpDir[aTmpDir.size()-1] != '\\') aTmpDir+='\\';
85 if(aTmpDir[aTmpDir.size()-1] != '/') aTmpDir+='/';
90 aTmpDir = string("C:\\");
92 aTmpDir = string("/tmp/");
96 srand((unsigned int)time(NULL));
97 int aRND = 999 + (int)(100000.0*rand()/(RAND_MAX+1.0)); //Get a random number to present a name of a sub directory
99 sprintf(buffer, "%d", aRND);
100 string aSubDir(buffer);
101 if(aSubDir.size() <= 1) aSubDir = string("123409876");
103 aTmpDir += aSubDir; //Get RND sub directory
105 string aDir = aTmpDir;
108 for(aRND = 0; Exists(aDir); aRND++) {
109 sprintf(buffer, "%d", aRND);
110 aDir = aTmpDir+buffer; //Build a unique directory name
115 if(aDir[aDir.size()-1] != '\\') aDir+='\\';
117 if(aDir[aTmpDir.size()-1] != '/') aDir+='/';
122 CreateDirectory(aDir.c_str(), NULL);
124 mkdir(aDir.c_str(), 0x1ff);
130 //============================================================================
131 // function : RemoveTemporaryFiles
132 // purpose : Removes files listed in theFileList
133 //============================================================================
134 void SALOMEDS_Tool::RemoveTemporaryFiles(const std::string& theDirectory,
135 const std::list<std::string>& theFiles,
136 const bool IsDirDeleted)
138 std::string aDirName = theDirectory;
140 for(std::list<std::string>::const_iterator it = theFiles.begin(); it != theFiles.end(); it++) {
141 std::string aFile(aDirName);
143 if(!Exists(aFile)) continue;
146 DeleteFile(aFile.c_str());
148 unlink(aFile.c_str());
153 if(Exists(aDirName)) {
155 RemoveDirectory(aDirName.c_str());
157 rmdir(aDirName.c_str());
164 //============================================================================
165 // function : PutFilesToStream
166 // purpose : converts the files from a list 'theFiles' to the stream
167 //============================================================================
171 PutFilesToStream(const std::string& theFromDirectory,
172 const std::list<std::string>& theFiles,
173 const std::list<std::string>& theFileNames,
174 const int theNamesOnly)
176 int i = 0, aLength = theFiles.size();
178 return (new SALOMEDS::TMPFile);
180 //Get a temporary directory for saved a file
181 std::string aTmpDir = theFromDirectory;
183 long aBufferSize = 0;
187 int* aFileNameSize= new int[aLength];
188 long* aFileSize= new long[aLength];
190 //Determine the required size of the buffer
192 std::list<std::string>::const_iterator it_files = theFiles.begin();
193 std::list<std::string>::const_iterator it_names = theFileNames.begin();
194 for(; it_files != theFiles.end(); it_files++, it_names++, i++) {
196 //Check if the file exists
198 if (!theNamesOnly) { // mpv 15.01.2003: if only file names must be stroed, then size of files is zero
199 std::string aFullPath = aTmpDir + *it_files;
200 if(!Exists(aFullPath)) continue;
202 std::ifstream aFile(aFullPath.c_str(), std::ios::binary);
204 std::ifstream aFile(aFullPath.c_str());
206 aFile.seekg(0, std::ios::end);
207 aFileSize[i] = aFile.tellg();
208 aBufferSize += aFileSize[i]; //Add a space to store the file
210 aFileNameSize[i] = (*it_names).length()+1;
211 aBufferSize += aFileNameSize[i]; //Add a space to store the file name
212 aBufferSize += (theNamesOnly)?4:12; //Add 4 bytes: a length of the file name,
213 // 8 bytes: length of the file itself
217 if ( aNbFiles == 0 ) return (new SALOMEDS::TMPFile);
218 aBufferSize += 4; //4 bytes for a number of the files that will be written to the stream;
219 unsigned char* aBuffer = new unsigned char[aBufferSize];
221 return (new SALOMEDS::TMPFile);
223 //Initialize 4 bytes of the buffer by 0
224 memset(aBuffer, 0, 4);
225 //Copy the number of files that will be written to the stream
226 memcpy(aBuffer, &aNbFiles, ((sizeof(int) > 4) ? 4 : sizeof(int)));
231 it_files = theFiles.begin();
232 it_names = theFileNames.begin();
233 for(; it_files != theFiles.end(); it_files++, it_names++, i++) {
234 std::ifstream *aFile;
235 if (!theNamesOnly) { // mpv 15.01.2003: we don't open any file if theNamesOnly = true
236 std::string aFullPath = aTmpDir + *it_files;
237 if(!Exists(aFullPath)) continue;
239 aFile = new std::ifstream(aFullPath.c_str(), std::ios::binary);
241 aFile = new std::ifstream(aFullPath.c_str());
244 //Initialize 4 bytes of the buffer by 0
245 memset((aBuffer + aCurrentPos), 0, 4);
246 //Copy the length of the file name to the buffer
247 memcpy((aBuffer + aCurrentPos), (aFileNameSize + i), ((sizeof(int) > 4) ? 4 : sizeof(int)));
250 //Copy the file name to the buffer
251 memcpy((aBuffer + aCurrentPos), (*it_names).c_str(), aFileNameSize[i]);
252 aCurrentPos += aFileNameSize[i];
254 if (!theNamesOnly) { // mpv 15.01.2003: we don't copy file content to the buffer if !theNamesOnly
255 //Initialize 8 bytes of the buffer by 0
256 memset((aBuffer + aCurrentPos), 0, 8);
257 //Copy the length of the file to the buffer
258 memcpy((aBuffer + aCurrentPos), (aFileSize + i), ((sizeof(long) > 8) ? 8 : sizeof(long)));
261 aFile->seekg(0, std::ios::beg);
262 aFile->read((char *)(aBuffer + aCurrentPos), aFileSize[i]);
265 aCurrentPos += aFileSize[i];
269 delete[] aFileNameSize;
273 CORBA::Octet* anOctetBuf = (CORBA::Octet*)aBuffer;
275 return (new SALOMEDS::TMPFile(aBufferSize, aBufferSize, anOctetBuf, 1));
282 SALOMEDS_Tool::PutFilesToStream(const std::string& theFromDirectory,
283 const std::list<std::string>& theFiles,
284 const int theNamesOnly)
286 std::list<std::string> aFileNames(theFiles);
287 return ::PutFilesToStream(theFromDirectory,theFiles,aFileNames,theNamesOnly);
292 SALOMEDS_Tool::PutFilesToStream(const std::list<std::string>& theFiles,
293 const std::list<std::string>& theFileNames)
295 return ::PutFilesToStream("",theFiles,theFileNames,0);
298 //============================================================================
299 // function : PutStreamToFile
300 // purpose : converts the stream "theStream" to the files
301 //============================================================================
302 std::list<std::string>
303 SALOMEDS_Tool::PutStreamToFiles(const SALOMEDS::TMPFile& theStream,
304 const std::string& theToDirectory,
305 const int theNamesOnly)
307 std::list<std::string> aFiles;
309 if(theStream.length() == 0)
312 //Get a temporary directory for saving a file
313 std::string aTmpDir = theToDirectory;
315 unsigned char *aBuffer = (unsigned char*)theStream.NP_data();
320 long aFileSize, aCurrentPos = 4;
321 int i, aFileNameSize, aNbFiles = 0;
323 //Copy the number of files in the stream
324 memcpy(&aNbFiles, aBuffer, sizeof(int));
326 for(i=0; i<aNbFiles; i++) {
328 //Put a length of the file name to aFileNameSize
329 memcpy(&aFileNameSize, (aBuffer + aCurrentPos), ((sizeof(int) > 4) ? 4 : sizeof(int)));
332 char *aFileName = new char[aFileNameSize];
333 //Put a file name to aFileName
334 memcpy(aFileName, (aBuffer + aCurrentPos), aFileNameSize);
336 for (int i = 0; i < strlen(aFileName); i++)
338 if (aFileName[i] == ':')
342 aCurrentPos += aFileNameSize;
344 //Put a length of the file to aFileSize
346 memcpy(&aFileSize, (aBuffer + aCurrentPos), ((sizeof(long) > 8) ? 8 : sizeof(long)));
349 std::string aFullPath = aTmpDir + aFileName;
351 std::ofstream aFile(aFullPath.c_str(), std::ios::binary);
353 std::ofstream aFile(aFullPath.c_str());
355 aFile.write((char *)(aBuffer+aCurrentPos), aFileSize);
357 aCurrentPos += aFileSize;
359 aFiles.push_back(CORBA::string_dup(aFileName));
366 //============================================================================
367 // function : GetNameFromPath
368 // purpose : Returns the name by the path
369 //============================================================================
370 std::string SALOMEDS_Tool::GetNameFromPath(const std::string& thePath) {
371 if (thePath.empty()) return "";
372 std::string aPath = thePath;
373 bool isFound = false;
374 int pos = aPath.rfind('/');
376 aPath = aPath.substr(pos+1, aPath.size());
380 pos = aPath.rfind('\\');
382 aPath = aPath.substr(pos+1, aPath.size());
387 pos = aPath.rfind('|');
388 if(pos > 0) aPath = aPath.substr(pos+1, aPath.size());
391 pos = aPath.rfind('.');
392 if(pos > 0) aPath = aPath.substr(0, pos); //Remove extension
397 //============================================================================
398 // function : GetDirFromPath
399 // purpose : Returns the dir by the path
400 //============================================================================
401 std::string SALOMEDS_Tool::GetDirFromPath(const std::string& thePath) {
402 if (thePath.empty()) return "";
404 int pos = thePath.rfind('/');
407 path = thePath.substr(0, pos+1);
410 pos = thePath.rfind('\\');
411 if(pos > 0) path = thePath.substr(0, pos+1);
414 pos = thePath.rfind('|');
415 if(pos > 0) path = thePath.substr(0, pos+1);
421 #ifdef WIN32 //Check if the only disk letter is given as path
422 if(path.size() == 2 && path[1] == ':') path +='\\';
425 for(int i = 0, len = path.size(); i<len; i++)
426 if(path[i] == '|') path[i] = '/';
430 //=======================================================================
432 // Purpose : Retrieve specified flaf from "AttributeFlags" attribute
433 //=======================================================================
434 bool SALOMEDS_Tool::GetFlag( const int theFlag,
435 SALOMEDS::Study_var theStudy,
436 SALOMEDS::SObject_var theObj )
438 SALOMEDS::GenericAttribute_var anAttr;
439 if ( !theObj->_is_nil() && theObj->FindAttribute( anAttr, "AttributeFlags" ) )
441 SALOMEDS::AttributeFlags_var aFlags = SALOMEDS::AttributeFlags::_narrow( anAttr );
442 return aFlags->Get( theFlag );
448 //=======================================================================
450 // Purpose : Set/Unset specified flaf from "AttributeFlags" attribute
451 //=======================================================================
452 bool SALOMEDS_Tool::SetFlag( const int theFlag,
453 SALOMEDS::Study_var theStudy,
454 const std::string& theEntry,
455 const bool theValue )
457 SALOMEDS::SObject_var anObj = theStudy->FindObjectID(theEntry.c_str());
459 if ( !anObj->_is_nil() )
461 SALOMEDS::GenericAttribute_var aGAttr;
462 if ( anObj->FindAttribute( aGAttr, "AttributeFlags" ) )
464 SALOMEDS::AttributeFlags_var anAttr = SALOMEDS::AttributeFlags::_narrow( aGAttr );
465 anAttr->Set( theFlag, theValue );
469 SALOMEDS::StudyBuilder_var aBuilder = theStudy->NewBuilder();
470 SALOMEDS::AttributeFlags_var anAttr = SALOMEDS::AttributeFlags::_narrow(
471 aBuilder->FindOrCreateAttribute( anObj, "AttributeFlags" ) );
472 anAttr->Set( theFlag, theValue );
480 //=======================================================================
481 // name : getAllChildren
482 // Purpose : Get all children of object.
483 // If theObj is null all objects of study are returned
484 //=======================================================================
485 void SALOMEDS_Tool::GetAllChildren( SALOMEDS::Study_var theStudy,
486 SALOMEDS::SObject_var theObj,
487 std::list<SALOMEDS::SObject_var>& theList )
489 if ( theObj->_is_nil() )
491 SALOMEDS::SComponentIterator_var anIter = theStudy->NewComponentIterator();
492 for ( ; anIter->More(); anIter->Next() )
494 SALOMEDS::SObject_var anObj = SALOMEDS::SObject::_narrow( anIter->Value() );
495 if ( !anObj->_is_nil() )
497 theList.push_back( anObj );
498 GetAllChildren( theStudy, anObj, theList );
504 SALOMEDS::ChildIterator_var anIter = theStudy->NewChildIterator( theObj );
505 for ( ; anIter->More(); anIter->Next() )
507 SALOMEDS::SObject_var anObj = anIter->Value();
508 SALOMEDS::SObject_var aRef;
509 if ( !anObj->ReferencedObject( aRef ) )
511 theList.push_back( anObj );
512 GetAllChildren( theStudy, anObj, theList );