0025748: Parallel version of progress indicator
[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
29 #define theMetaDataDriver Handle(CDF_Application)::DownCast((myCurrentDocument->Application()))->MetaDataDriver()
30
31 static const Handle(TCollection_HExtendedString) blank = new TCollection_HExtendedString("");
32
33 CDF_Store::CDF_Store()
34 : myHasSubComponents(Standard_False),
35   myIsMainDocument(Standard_False),
36   myStatus(PCDM_SS_No_Obj)
37 {
38 }
39 CDF_Store::CDF_Store(const Handle(CDM_Document)& aDocument):myHasSubComponents(Standard_False) {
40   
41   myMainDocument = aDocument;
42   Init();
43 }
44
45 void CDF_Store::Init() {
46   
47   myCurrentDocument = myMainDocument;
48   myList = new CDF_StoreList(myCurrentDocument);
49
50   // getting the subcomponents.
51   //
52   myIsMainDocument = Standard_False;
53   myList->Init();
54   for ( myList->Init(); myList->More(); myList->Next()) {
55     myCurrentDocument = myList->Value();
56     if(myCurrentDocument != myMainDocument) {
57       myHasSubComponents  = Standard_True;
58       FindDefault();
59       
60     }
61   }
62   myIsMainDocument = Standard_True;
63   myCurrentDocument = myMainDocument;
64 }
65
66 Handle(TCollection_HExtendedString) CDF_Store::Folder() const {
67   if(myCurrentDocument->HasRequestedFolder())
68     return new TCollection_HExtendedString(myCurrentDocument->RequestedFolder());
69   return blank;
70 }
71
72 Handle(TCollection_HExtendedString) CDF_Store::Name() const {
73   return new TCollection_HExtendedString(myCurrentDocument->RequestedName());
74 }
75
76
77 Standard_Boolean  CDF_Store::SetFolder(const Standard_ExtString aFolder) {
78   TCollection_ExtendedString f(aFolder);
79   return SetFolder(f);
80 }
81 Standard_Boolean  CDF_Store::SetFolder(const TCollection_ExtendedString& aFolder) {
82
83   TCollection_ExtendedString theFolder(aFolder);
84   Standard_Integer l = theFolder.Length();
85
86   // if the last character is the folder separator (which is always the first character)
87   // it is removed.
88         // This is correct for Unix systems but not for Windows! VMS and MAC? Thomas Haller, 23.11.01
89   if(l > 1) {
90 #ifndef _WIN32
91     if(theFolder.Value(l) == theFolder.Value(1)) theFolder.Trunc(l-1);
92 #else
93         if (theFolder.Value(l) == '/' || theFolder.Value(l) == '\\')
94                 theFolder.Trunc(l-1);
95 #endif
96   }
97
98   if(theMetaDataDriver->FindFolder(theFolder))  {
99     myCurrentDocument->SetRequestedFolder(theFolder);
100     return Standard_True;
101   }
102   return Standard_False;
103 }
104
105
106 CDF_StoreSetNameStatus CDF_Store::RecheckName () {
107    return SetName(myCurrentDocument->RequestedName());
108 }
109
110 CDF_StoreSetNameStatus CDF_Store::SetName(const TCollection_ExtendedString&  aName)
111 {
112   TCollection_ExtendedString theName=theMetaDataDriver->SetName(myCurrentDocument,aName);
113
114   if(myCurrentDocument->IsStored ()) { 
115     Handle(CDM_MetaData)  E = myCurrentDocument->MetaData();
116     if(   E->Folder() == myCurrentDocument->RequestedFolder() 
117        && E->Name()   == theName) return CDF_SSNS_OK;
118   }
119   
120   if(myCurrentDocument->HasRequestedFolder()) {
121     if (theMetaDataDriver->Find(myCurrentDocument->RequestedFolder(),theName)) {
122       if(theMetaDataDriver->MetaData(myCurrentDocument->RequestedFolder(),theName)->IsRetrieved())
123         return CDF_SSNS_OpenDocument;
124       else {
125         myCurrentDocument->SetRequestedName(theName);
126         return CDF_SSNS_ReplacingAnExistentDocument;
127       }
128     }
129   }
130   myCurrentDocument->SetRequestedName(theName);
131   return  CDF_SSNS_OK;
132 }
133 CDF_StoreSetNameStatus CDF_Store::SetName(const Standard_ExtString aName)
134 {
135   TCollection_ExtendedString theName(aName);
136   return SetName(theName);
137 }
138
139 void CDF_Store::Realize (const Message_ProgressRange& theRange)
140 {
141   Standard_ProgramError_Raise_if(!myList->IsConsistent(),"information are missing");
142   Handle(CDM_MetaData) m;
143   myText = "";
144   myStatus = myList->Store(m, myText, theRange);
145   if(myStatus==PCDM_SS_OK) myPath = m->Path();
146 }
147 Standard_ExtString CDF_Store::Path() const {
148   return myPath.ToExtString();
149 }
150 Handle(TCollection_HExtendedString) CDF_Store::MetaDataPath() const {
151   if(myCurrentDocument->IsStored())
152     return new TCollection_HExtendedString(myCurrentDocument->MetaData()->Path());
153   return blank;
154 }
155 Handle(TCollection_HExtendedString) CDF_Store::Description() const {
156   if(myMainDocument->FindDescription())
157     return new TCollection_HExtendedString(myMainDocument->Description());
158   return blank;
159 }
160
161 Standard_Boolean CDF_Store::IsStored() const {
162   return myCurrentDocument->IsStored();
163 }
164 Standard_Boolean CDF_Store::IsModified() const {
165   return myCurrentDocument->IsModified();
166 }
167 Standard_Boolean CDF_Store::CurrentIsConsistent() const {
168   if(!myCurrentDocument->IsStored())
169     return myCurrentDocument->HasRequestedFolder();
170   return Standard_True;
171 }
172
173 Standard_Boolean CDF_Store::IsConsistent() const {
174   return myList->IsConsistent();
175 }
176 Standard_Boolean CDF_Store::HasAPreviousVersion() const {
177   return myCurrentDocument->HasRequestedPreviousVersion();
178 }
179
180 Handle(TCollection_HExtendedString) CDF_Store::PreviousVersion() const {
181   if(myCurrentDocument->HasRequestedPreviousVersion())
182     return new TCollection_HExtendedString(myCurrentDocument->RequestedPreviousVersion());
183   return blank;
184 }
185
186 Standard_Boolean CDF_Store::SetPreviousVersion (const Standard_ExtString aPreviousVersion) {
187   if(theMetaDataDriver->HasVersionCapability()) {
188     if(myCurrentDocument->HasRequestedFolder()) {
189       if(theMetaDataDriver->Find(myCurrentDocument->RequestedFolder(),myCurrentDocument->RequestedName(),aPreviousVersion)){
190         
191         myCurrentDocument->SetRequestedPreviousVersion(aPreviousVersion);
192         return Standard_True;
193       }
194       else
195         return Standard_False;
196     }
197     else 
198       return Standard_False;
199   }
200   return Standard_True;
201 }
202
203 void CDF_Store::SetCurrent(const Standard_ExtString /*aPresentation*/) {
204   myIsMainDocument = myCurrentDocument == myMainDocument;
205 }
206 void CDF_Store::SetMain() {
207   myCurrentDocument = myMainDocument;
208   myIsMainDocument = Standard_True;
209
210 }
211 Standard_Boolean CDF_Store::IsMainDocument() const {
212   return myIsMainDocument;
213 }
214
215 PCDM_StoreStatus CDF_Store::StoreStatus() const {
216   return myStatus;
217 }
218 Standard_ExtString CDF_Store::AssociatedStatusText() const {
219   return myText.ToExtString();
220 }
221
222
223 void CDF_Store::FindDefault() {
224   if (!myCurrentDocument->IsStored ()) {
225     myCurrentDocument->SetRequestedFolder(Handle(CDF_Application)::DownCast((myCurrentDocument->Application()))->DefaultFolder());
226     myCurrentDocument->SetRequestedName(theMetaDataDriver->SetName(myCurrentDocument,myCurrentDocument->RequestedName()));
227   }
228 }
229 void CDF_Store::SetComment(const Standard_ExtString aComment) {
230   myCurrentDocument->SetRequestedComment(aComment);
231 }
232
233 Handle(TCollection_HExtendedString) CDF_Store::Comment() const {
234   return new TCollection_HExtendedString(myCurrentDocument->RequestedComment());
235 }