1 // SalomeApp_Engine_i : implementation of SalomeApp_Engine.idl
3 // Copyright (C) 2003 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.
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.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
24 // File : SalomeApp_Engine_i.cxx
25 // Author : Alexander SLADKOV
29 #include "SalomeApp_Engine_i.hxx"
31 #include "SALOMEDS_Tool.hxx"
33 #include "utilities.h"
39 SalomeApp_Engine_i* SalomeApp_Engine_i::myInstance = NULL;
41 SalomeApp_Engine_i::SalomeApp_Engine_i()
46 SalomeApp_Engine_i::~SalomeApp_Engine_i()
50 SALOMEDS::TMPFile* SalomeApp_Engine_i::Save (SALOMEDS::SComponent_ptr theComponent,
54 SALOMEDS::TMPFile_var aStreamFile = new SALOMEDS::TMPFile;
56 cout << "SalomeApp_Engine_i::Save() isMultiFile = " << isMultiFile << endl;
57 if (CORBA::is_nil(theComponent) || CORBA::is_nil(theComponent->GetStudy()))
58 return aStreamFile._retn();
60 const int studyId = theComponent->GetStudy()->StudyId();
61 cout << "SalomeApp_Engine_i::Save() - studyId = " << studyId << endl;
63 // Get a temporary directory to store a file
64 //std::string aTmpDir = isMultiFile ? theURL : SALOMEDS_Tool::GetTmpDir();
66 if (myMap.count(studyId)) {
67 cout << "SalomeApp_Engine_i::Save() - myMap.count(studyId)" << endl;
68 MapOfListOfFiles mapOfListOfFiles = myMap[studyId];
69 std::string componentName (theComponent->ComponentDataType());
70 cout << "SalomeApp_Engine_i::Save() - componentName = " << componentName << endl;
71 ListOfFiles listOfFiles = mapOfListOfFiles[componentName];
73 // listOfFiles must contain temporary directory name in its first item
74 // and names of files (relatively the temporary directory) in the others
75 const int n = listOfFiles.size() - 1;
77 if (n > 0) { // there are some files, containing persistent data of the component
78 std::string aTmpDir = listOfFiles[0];
79 cout << "SalomeApp_Engine_i::Save() - aTmpDir = " << aTmpDir << endl;
81 // Create a list to store names of created files
82 SALOMEDS::ListOfFileNames_var aSeq = new SALOMEDS::ListOfFileNames;
84 for (int i = 0; i < n; i++)
85 aSeq[i] = CORBA::string_dup(listOfFiles[i + 1].c_str());
87 // Convert a file to the byte stream
88 aStreamFile = SALOMEDS_Tool::PutFilesToStream(aTmpDir.c_str(), aSeq.in(), isMultiFile);
90 // Remove the files and tmp directory, created by the component storage procedure
91 if (!isMultiFile) SALOMEDS_Tool::RemoveTemporaryFiles(aTmpDir.c_str(), aSeq.in(), true);
95 return aStreamFile._retn();
98 CORBA::Boolean SalomeApp_Engine_i::Load (SALOMEDS::SComponent_ptr theComponent,
99 const SALOMEDS::TMPFile& theFile,
103 cout << "SalomeApp_Engine_i::Load() isMultiFile = " << isMultiFile << endl;
104 if (CORBA::is_nil(theComponent) || CORBA::is_nil(theComponent->GetStudy()))
107 const int studyId = theComponent->GetStudy()->StudyId();
109 // Create a temporary directory for the component's data files
110 std::string aTmpDir = isMultiFile ? theURL : SALOMEDS_Tool::GetTmpDir();
112 // Convert the byte stream theStream to a files and place them in the tmp directory.
113 // The files and temporary directory must be deleted by the component loading procedure.
114 SALOMEDS::ListOfFileNames_var aSeq =
115 SALOMEDS_Tool::PutStreamToFiles(theFile, aTmpDir.c_str(), isMultiFile);
117 // Store list of file names to be used by the component loading procedure
118 const int n = aSeq->length() + 1;
119 ListOfFiles listOfFiles (n);
120 listOfFiles[0] = aTmpDir;
121 for (int i = 1; i < n; i++)
122 listOfFiles[i] = std::string(aSeq[i - 1]);
124 //MapOfListOfFiles mapOfListOfFiles;
125 //if (myMap.count(studyId))
126 // mapOfListOfFiles = myMap[studyId];
127 //std::string componentName (theComponent->ComponentDataType());
128 //mapOfListOfFiles[componentName] = listOfFiles;
129 //myMap[studyId] = mapOfListOfFiles;
131 SetListOfFiles(listOfFiles, studyId, theComponent->ComponentDataType());
136 SalomeApp_Engine_i::ListOfFiles SalomeApp_Engine_i::GetListOfFiles (const int theStudyId,
137 const char* theComponentName)
139 ListOfFiles aListOfFiles;
141 if (myMap.count(theStudyId))
143 MapOfListOfFiles mapOfListOfFiles = myMap[theStudyId];
144 std::string componentName (theComponentName);
145 if (mapOfListOfFiles.count(componentName))
146 aListOfFiles = mapOfListOfFiles[componentName];
152 void SalomeApp_Engine_i::SetListOfFiles (const ListOfFiles theListOfFiles,
153 const int theStudyId,
154 const char* theComponentName)
156 //if (!myMap.count(theStudyId)) {
157 // MapOfListOfFiles mapOfListOfFiles;
158 // myMap[theStudyId] = mapOfListOfFiles;
161 MapOfListOfFiles& mapOfListOfFiles = myMap[theStudyId];
162 std::string componentName (theComponentName);
163 mapOfListOfFiles[componentName] = theListOfFiles;
166 SalomeApp_Engine_i* SalomeApp_Engine_i::GetInstance()