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;
44 SalomeApp_Engine_i::SalomeApp_Engine_i()
52 SalomeApp_Engine_i::~SalomeApp_Engine_i()
56 SALOMEDS::TMPFile* SalomeApp_Engine_i::Save (SALOMEDS::SComponent_ptr theComponent,
60 SALOMEDS::TMPFile_var aStreamFile = new SALOMEDS::TMPFile;
62 cout << "SalomeApp_Engine_i::Save() isMultiFile = " << isMultiFile << endl;
63 if (CORBA::is_nil(theComponent) || CORBA::is_nil(theComponent->GetStudy()))
64 return aStreamFile._retn();
66 const int studyId = theComponent->GetStudy()->StudyId();
67 cout << "SalomeApp_Engine_i::Save() - studyId = " << studyId << endl;
69 // Get a temporary directory to store a file
70 //std::string aTmpDir = isMultiFile ? theURL : SALOMEDS_Tool::GetTmpDir();
72 if (myMap.count(studyId)) {
73 cout << "SalomeApp_Engine_i::Save() - myMap.count(studyId)" << endl;
74 MapOfListOfFiles mapOfListOfFiles = myMap[studyId];
75 std::string componentName (theComponent->ComponentDataType());
76 cout << "SalomeApp_Engine_i::Save() - componentName = " << componentName << endl;
77 ListOfFiles listOfFiles = mapOfListOfFiles[componentName];
79 // listOfFiles must contain temporary directory name in its first item
80 // and names of files (relatively the temporary directory) in the others
81 const int n = listOfFiles.size() - 1;
83 if (n > 0) { // there are some files, containing persistent data of the component
84 std::string aTmpDir = listOfFiles[0];
85 cout << "SalomeApp_Engine_i::Save() - aTmpDir = " << aTmpDir << endl;
87 // Create a list to store names of created files
88 SALOMEDS::ListOfFileNames_var aSeq = new SALOMEDS::ListOfFileNames;
90 for (int i = 0; i < n; i++)
91 aSeq[i] = CORBA::string_dup(listOfFiles[i + 1].c_str());
93 // Convert a file to the byte stream
94 aStreamFile = SALOMEDS_Tool::PutFilesToStream(aTmpDir.c_str(), aSeq.in(), isMultiFile);
96 // Remove the files and tmp directory, created by the component storage procedure
97 if (!isMultiFile) SALOMEDS_Tool::RemoveTemporaryFiles(aTmpDir.c_str(), aSeq.in(), true);
101 return aStreamFile._retn();
104 CORBA::Boolean SalomeApp_Engine_i::Load (SALOMEDS::SComponent_ptr theComponent,
105 const SALOMEDS::TMPFile& theFile,
109 cout << "SalomeApp_Engine_i::Load() isMultiFile = " << isMultiFile << endl;
110 if (CORBA::is_nil(theComponent) || CORBA::is_nil(theComponent->GetStudy()))
113 const int studyId = theComponent->GetStudy()->StudyId();
115 // Create a temporary directory for the component's data files
116 std::string aTmpDir = isMultiFile ? theURL : SALOMEDS_Tool::GetTmpDir();
118 // Convert the byte stream theStream to a files and place them in the tmp directory.
119 // The files and temporary directory must be deleted by the component loading procedure.
120 SALOMEDS::ListOfFileNames_var aSeq =
121 SALOMEDS_Tool::PutStreamToFiles(theFile, aTmpDir.c_str(), isMultiFile);
123 // Store list of file names to be used by the component loading procedure
124 const int n = aSeq->length() + 1;
125 ListOfFiles listOfFiles (n);
126 listOfFiles[0] = aTmpDir;
127 for (int i = 1; i < n; i++)
128 listOfFiles[i] = std::string(aSeq[i - 1]);
130 //MapOfListOfFiles mapOfListOfFiles;
131 //if (myMap.count(studyId))
132 // mapOfListOfFiles = myMap[studyId];
133 //std::string componentName (theComponent->ComponentDataType());
134 //mapOfListOfFiles[componentName] = listOfFiles;
135 //myMap[studyId] = mapOfListOfFiles;
137 SetListOfFiles(listOfFiles, studyId, theComponent->ComponentDataType());
142 SalomeApp_Engine_i::ListOfFiles SalomeApp_Engine_i::GetListOfFiles (const int theStudyId,
143 const char* theComponentName)
145 ListOfFiles aListOfFiles;
147 if (myMap.count(theStudyId))
149 MapOfListOfFiles mapOfListOfFiles = myMap[theStudyId];
150 std::string componentName (theComponentName);
151 if (mapOfListOfFiles.count(componentName))
152 aListOfFiles = mapOfListOfFiles[componentName];
158 void SalomeApp_Engine_i::SetListOfFiles (const ListOfFiles theListOfFiles,
159 const int theStudyId,
160 const char* theComponentName)
162 //if (!myMap.count(theStudyId)) {
163 // MapOfListOfFiles mapOfListOfFiles;
164 // myMap[theStudyId] = mapOfListOfFiles;
167 MapOfListOfFiles& mapOfListOfFiles = myMap[theStudyId];
168 std::string componentName (theComponentName);
169 mapOfListOfFiles[componentName] = theListOfFiles;
173 \return shared instance of engine
175 SalomeApp_Engine_i* SalomeApp_Engine_i::GetInstance()