fe91752b4ee4c110f24bd80e8d6a1d0604a643a0
[occt.git] / src / CDF / CDF_Store.cxx
1 // Copyright (c) 1999-2014 OPEN CASCADE SAS
2 //
3 // This file is part of Open CASCADE Technology software library.
4 //
5 // This library is free software; you can redistribute it and/or modify it under
6 // the terms of the GNU Lesser General Public License version 2.1 as published
7 // by the Free Software Foundation, with special exception defined in the file
8 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
9 // distribution for complete text of the license and disclaimer of any warranty.
10 //
11 // Alternatively, this file may be used under the terms of Open CASCADE
12 // commercial license or contractual agreement.
13
14 // Modified by rmi, Thu Dec  4 14:24:24 1997
15
16 #include <CDF_Application.hxx>
17 #include <CDF_MetaDataDriver.hxx>
18 #include <CDF_Session.hxx>
19 #include <CDF_Store.hxx>
20 #include <CDF_StoreList.hxx>
21 #include <CDF_StoreSetNameStatus.hxx>
22 #include <CDM_Document.hxx>
23 #include <CDM_MetaData.hxx>
24 #include <PCDM.hxx>
25 #include <PCDM_StorageDriver.hxx>
26 #include <PCDM_StoreStatus.hxx>
27 #include <Standard_ProgramError.hxx>
28 #include <TCollection_ExtendedString.hxx>
29
30 #define theMetaDataDriver CDF_Session::CurrentSession()->MetaDataDriver()
31
32
33 static TCollection_ExtendedString blank("");
34
35
36
37 CDF_Store::CDF_Store()
38 : myHasSubComponents(Standard_False),
39   myIsMainDocument(Standard_False),
40   myStatus(PCDM_SS_No_Obj)
41 {
42 }
43 CDF_Store::CDF_Store(const Handle(CDM_Document)& aDocument):myHasSubComponents(Standard_False) {
44   
45   myMainDocument = aDocument;
46   Init();
47 }
48
49 void CDF_Store::Init() {
50   
51   myCurrentDocument = myMainDocument;
52   myList = new CDF_StoreList(myCurrentDocument);
53
54   // getting the subcomponents.
55   //
56   myIsMainDocument = Standard_False;
57   myList->Init();
58   for ( myList->Init(); myList->More(); myList->Next()) {
59     myCurrentDocument = myList->Value();
60     if(myCurrentDocument != myMainDocument) {
61       myHasSubComponents  = Standard_True;
62       FindDefault();
63       
64     }
65   }
66   myIsMainDocument = Standard_True;
67   myCurrentDocument = myMainDocument;
68 }
69
70 Standard_ExtString CDF_Store::Folder() const {
71   static TCollection_ExtendedString retv;
72   if(myCurrentDocument->HasRequestedFolder())
73     retv =  myCurrentDocument->RequestedFolder();
74   else
75     retv= blank;
76   return retv.ToExtString();
77 }
78
79 Standard_ExtString CDF_Store::Name() const {
80   static TCollection_ExtendedString retv;
81   retv = myCurrentDocument->RequestedName();
82   return retv.ToExtString();
83 }
84
85
86 Standard_Boolean  CDF_Store::SetFolder(const Standard_ExtString aFolder) {
87   TCollection_ExtendedString f(aFolder);
88   return SetFolder(f);
89 }
90 Standard_Boolean  CDF_Store::SetFolder(const TCollection_ExtendedString& aFolder) {
91
92   TCollection_ExtendedString theFolder(aFolder);
93   Standard_Integer l = theFolder.Length();
94
95   // if the last character is the folder separator (which is always the first character)
96   // it is removed.
97         // This is correct for Unix systems but not for Windows! VMS and MAC? Thomas Haller, 23.11.01
98   if(l > 1) {
99 #ifndef _WIN32
100     if(theFolder.Value(l) == theFolder.Value(1)) theFolder.Trunc(l-1);
101 #else
102         if (theFolder.Value(l) == '/' || theFolder.Value(l) == '\\')
103                 theFolder.Trunc(l-1);
104 #endif
105   }
106
107   if(theMetaDataDriver->FindFolder(theFolder))  {
108     myCurrentDocument->SetRequestedFolder(theFolder);
109     return Standard_True;
110   }
111   return Standard_False;
112 }
113
114
115 CDF_StoreSetNameStatus CDF_Store::RecheckName () {
116    return SetName(myCurrentDocument->RequestedName());
117 }
118
119 CDF_StoreSetNameStatus CDF_Store::SetName(const TCollection_ExtendedString&  aName)
120 {
121   TCollection_ExtendedString theName=theMetaDataDriver->SetName(myCurrentDocument,aName);
122
123   if(myCurrentDocument->IsStored ()) { 
124     Handle(CDM_MetaData)  E = myCurrentDocument->MetaData();
125     if(   E->Folder() == myCurrentDocument->RequestedFolder() 
126        && E->Name()   == theName) return CDF_SSNS_OK;
127   }
128   
129   if(myCurrentDocument->HasRequestedFolder()) {
130     if (theMetaDataDriver->Find(myCurrentDocument->RequestedFolder(),theName)) {
131       if(theMetaDataDriver->MetaData(myCurrentDocument->RequestedFolder(),theName)->IsRetrieved())
132         return CDF_SSNS_OpenDocument;
133       else {
134         myCurrentDocument->SetRequestedName(theName);
135         return CDF_SSNS_ReplacingAnExistentDocument;
136       }
137     }
138   }
139   myCurrentDocument->SetRequestedName(theName);
140   return  CDF_SSNS_OK;
141 }
142 CDF_StoreSetNameStatus CDF_Store::SetName(const Standard_ExtString aName)
143 {
144   TCollection_ExtendedString theName(aName);
145   return SetName(theName);
146 }
147
148 void CDF_Store::Realize (const Handle(Message_ProgressIndicator)& theProgress)
149 {
150   Standard_ProgramError_Raise_if(!myList->IsConsistent(),"information are missing");
151   Handle(CDM_MetaData) m;
152   myText = "";
153   myStatus = myList->Store(m, myText, theProgress);
154   if(myStatus==PCDM_SS_OK) myPath = m->Path();
155 }
156 Standard_ExtString CDF_Store::Path() const {
157   return myPath.ToExtString();
158 }
159 Standard_ExtString CDF_Store::MetaDataPath() const {
160   static TCollection_ExtendedString retv;
161   retv="";
162   if(myCurrentDocument->IsStored()) retv=myCurrentDocument->MetaData()->Path();
163   return retv.ToExtString();
164 }
165 Standard_ExtString CDF_Store::Description() const {
166   static TCollection_ExtendedString retv;
167
168   if(myMainDocument->FindDescription())
169     retv = myMainDocument->Description();
170   else
171     retv= blank;
172
173   return retv.ToExtString();
174 }
175
176 Standard_Boolean CDF_Store::IsStored() const {
177   return myCurrentDocument->IsStored();
178 }
179 Standard_Boolean CDF_Store::IsModified() const {
180   return myCurrentDocument->IsModified();
181 }
182 Standard_Boolean CDF_Store::CurrentIsConsistent() const {
183   if(!myCurrentDocument->IsStored())
184     return myCurrentDocument->HasRequestedFolder();
185   return Standard_True;
186 }
187
188 Standard_Boolean CDF_Store::IsConsistent() const {
189   return myList->IsConsistent();
190 }
191 Standard_Boolean CDF_Store::HasAPreviousVersion() const {
192   return myCurrentDocument->HasRequestedPreviousVersion();
193 }
194
195 Standard_ExtString CDF_Store::PreviousVersion() const {
196   static TCollection_ExtendedString retv;
197   if(myCurrentDocument->HasRequestedPreviousVersion())
198     retv= myCurrentDocument->RequestedPreviousVersion();
199   else
200     retv=blank;
201   return retv.ToExtString();
202 }
203
204 Standard_Boolean CDF_Store::SetPreviousVersion (const Standard_ExtString aPreviousVersion) {
205   if(theMetaDataDriver->HasVersionCapability()) {
206     if(myCurrentDocument->HasRequestedFolder()) {
207       if(theMetaDataDriver->Find(myCurrentDocument->RequestedFolder(),myCurrentDocument->RequestedName(),aPreviousVersion)){
208         
209         myCurrentDocument->SetRequestedPreviousVersion(aPreviousVersion);
210         return Standard_True;
211       }
212       else
213         return Standard_False;
214     }
215     else 
216       return Standard_False;
217   }
218   return Standard_True;
219 }
220
221 void CDF_Store::InitComponent() {
222    myList->Init();
223 }
224
225 Standard_Boolean CDF_Store::MoreComponent() const {
226   return myList->More();
227 }
228
229 void CDF_Store::NextComponent()  {
230   myList->Next();
231 }
232 void CDF_Store::SetCurrent() {
233   myCurrentDocument = myList->Value();
234   myIsMainDocument = myCurrentDocument == myMainDocument;
235
236
237 }
238
239 Standard_ExtString CDF_Store::Component() const {
240   
241   static TCollection_ExtendedString retv;
242   retv=myList->Value()->Presentation();
243   return retv.ToExtString();
244 }
245 Standard_Boolean CDF_Store::HasSubComponents () const {
246    return myHasSubComponents;
247 }
248
249 void CDF_Store::SetCurrent(const Standard_ExtString aPresentation) {
250   myCurrentDocument = CDM_Document::FindFromPresentation(aPresentation);
251   myIsMainDocument = myCurrentDocument == myMainDocument;
252 }
253 void CDF_Store::SetMain() {
254   myCurrentDocument = myMainDocument;
255   myIsMainDocument = Standard_True;
256
257 }
258 Standard_Boolean CDF_Store::IsMainDocument() const {
259   return myIsMainDocument;
260 }
261
262 CDF_SubComponentStatus CDF_Store::SubComponentStatus(const Standard_ExtString aPresentation) const {
263    Handle(CDM_Document) d = CDM_Document::FindFromPresentation(aPresentation);
264
265   if(!d->IsStored()) 
266     return d->HasRequestedFolder()? CDF_SCS_Consistent : CDF_SCS_Unconsistent;
267
268   if(d->IsModified()) return CDF_SCS_Modified;
269   return CDF_SCS_Stored;
270 }
271
272
273
274 PCDM_StoreStatus CDF_Store::StoreStatus() const {
275   return myStatus;
276 }
277 Standard_ExtString CDF_Store::AssociatedStatusText() const {
278   return myText.ToExtString();
279 }
280
281
282 void CDF_Store::FindDefault() {
283   if (!myCurrentDocument->IsStored ()) {
284     myCurrentDocument->SetRequestedFolder(CDF_Session::CurrentSession()->CurrentApplication()->DefaultFolder());
285 //    myCurrentDocument->SetRequestedName(theMetaDataDriver->SetName(myCurrentDocument,myCurrentDocument->Presentation()));
286     myCurrentDocument->SetRequestedName(theMetaDataDriver->SetName(myCurrentDocument,myCurrentDocument->RequestedName()));
287   }
288 }
289 void CDF_Store::SetComment(const Standard_ExtString aComment) {
290   myCurrentDocument->SetRequestedComment(aComment);
291 }
292
293 Standard_ExtString CDF_Store::Comment() const {
294   static TCollection_ExtendedString retv;
295   retv=myCurrentDocument->RequestedComment();
296   return retv.ToExtString();
297 }