0027067: Avoid use of virtual methods for implementation of destructors in legacy...
[occt.git] / src / CDM / CDM_Document.cxx
CommitLineData
b311480e 1// Created on: 1997-07-30
2// Created by: Jean-Louis Frenkel
3// Copyright (c) 1997-1999 Matra Datavision
973c2be1 4// Copyright (c) 1999-2014 OPEN CASCADE SAS
b311480e 5//
973c2be1 6// This file is part of Open CASCADE Technology software library.
b311480e 7//
d5f74e42 8// This library is free software; you can redistribute it and/or modify it under
9// the terms of the GNU Lesser General Public License version 2.1 as published
973c2be1 10// by the Free Software Foundation, with special exception defined in the file
11// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
12// distribution for complete text of the license and disclaimer of any warranty.
b311480e 13//
973c2be1 14// Alternatively, this file may be used under the terms of Open CASCADE
15// commercial license or contractual agreement.
b311480e 16
7fd59977 17// Modified by rmi, Tue Nov 18 08:17:41 1997
18
42cf5bc1 19#include <CDM_Application.hxx>
20#include <CDM_DataMapIteratorOfMetaDataLookUpTable.hxx>
21#include <CDM_Document.hxx>
22#include <CDM_ListIteratorOfListOfDocument.hxx>
23#include <CDM_ListOfDocument.hxx>
24#include <CDM_MetaData.hxx>
25#include <CDM_NamesDirectory.hxx>
26#include <CDM_PresentationDirectory.hxx>
27#include <CDM_Reference.hxx>
28#include <CDM_ReferenceIterator.hxx>
29#include <Resource_Manager.hxx>
30#include <Standard_DomainError.hxx>
31#include <Standard_Failure.hxx>
32#include <Standard_GUID.hxx>
33#include <Standard_NoSuchObject.hxx>
7fd59977 34#include <Standard_NullObject.hxx>
7fd59977 35#include <Standard_ProgramError.hxx>
42cf5bc1 36#include <Standard_Type.hxx>
37#include <TCollection_ExtendedString.hxx>
7fd59977 38#include <UTL.hxx>
7fd59977 39
92efcf78 40IMPLEMENT_STANDARD_RTTIEXT(CDM_Document,Standard_Transient)
41
7fd59977 42static CDM_PresentationDirectory& getPresentations() {
43 static CDM_PresentationDirectory thePresentations;
44 return thePresentations;
45}
46
47//=======================================================================
48//function : CDM_Document
49//purpose :
50//=======================================================================
51
52CDM_Document::CDM_Document():
53 myResourcesAreLoaded (Standard_False),
54 myValidPresentation (Standard_False),
55 myVersion (1),
56 myActualReferenceIdentifier (0),
57 myStorageVersion (0),
58 myRequestedComment (""),
59 myRequestedFolderIsDefined (Standard_False),
60 myRequestedNameIsDefined (Standard_False),
61 myRequestedPreviousVersionIsDefined(Standard_False),
62 myFileExtensionWasFound (Standard_False),
63 myDataTypeWasFound (Standard_False),
64 myVersionDataTypeWasFound (Standard_False),
65 myDescriptionWasFound (Standard_False),
66 myDomainWasFound (Standard_False),
67 myStoragePluginWasFound (Standard_False),
68 myDefaultPresentationWasFound (Standard_False)
69{}
70
71
72//=======================================================================
e6f550da 73//function : ~CDM_Document
7fd59977 74//purpose :
75//=======================================================================
76
e6f550da 77CDM_Document::~CDM_Document()
78{
7fd59977 79 if(!myMetaData.IsNull()) myMetaData->UnsetDocument();
80}
81
82//=======================================================================
83//function : Update
84//purpose :
85//=======================================================================
86
87void CDM_Document::Update (const Handle(CDM_Document)& /*aToDocument*/,
88 const Standard_Integer /*aReferenceIdentifier*/,
89 const Standard_Address /*aModifContext*/)
90{
91}
92
93//=======================================================================
94//function : Update
95//purpose :
96//=======================================================================
97
98void CDM_Document::Update()
99{
100}
101
102//=======================================================================
103//function : Update
104//purpose :
105//=======================================================================
106
107Standard_Boolean CDM_Document::Update(TCollection_ExtendedString& ErrorString)
108{
109 ErrorString.Clear();
110 Update();
111 return Standard_True;
112}
113
114//=======================================================================
115//function : GetAlternativeDocument
116//purpose :
117//=======================================================================
118
119Standard_Boolean CDM_Document::GetAlternativeDocument
120 (const TCollection_ExtendedString& aFormat,
121 Handle(CDM_Document)& anAlternativeDocument)
122{
123 anAlternativeDocument = this;
124 return aFormat == StorageFormat();
125}
126
127//=======================================================================
128//function : Extensions
129//purpose :
130//=======================================================================
131
132void CDM_Document::Extensions (TColStd_SequenceOfExtendedString& Extensions) const
133{
134 Extensions.Clear();
135}
136
137//=======================================================================
138//function : CreateReference
139//purpose :
140//=======================================================================
141
142Standard_Integer CDM_Document::CreateReference
143 (const Handle(CDM_Document)& anOtherDocument)
144{
145 CDM_ListIteratorOfListOfReferences it(myToReferences);
146
147 for(; it.More(); it.Next()) {
148 if(anOtherDocument == it.Value()->Document())
149 return it.Value()->ReferenceIdentifier();
150 }
151
152 Handle(CDM_Reference) r = new CDM_Reference (this,
153 anOtherDocument,
154 ++myActualReferenceIdentifier,
155 anOtherDocument->Modifications());
156 AddToReference(r);
157 anOtherDocument->AddFromReference(r);
158 return r->ReferenceIdentifier();
159}
160
161//=======================================================================
162//function : RemoveAllReferences
163//purpose :
164//=======================================================================
165
166void CDM_Document::RemoveAllReferences()
167{
168 CDM_ListIteratorOfListOfReferences it(myToReferences);
169
170 for(; it.More(); it.Next()) {
171 it.Value()->ToDocument()->RemoveFromReference(it.Value()->ReferenceIdentifier());
172 }
173 myToReferences.Clear();
174}
175
176//=======================================================================
177//function : RemoveReference
178//purpose :
179//=======================================================================
180
181void CDM_Document::RemoveReference(const Standard_Integer aReferenceIdentifier)
182{
183 CDM_ListIteratorOfListOfReferences it(myToReferences);
184
185 for(; it.More(); it.Next()) {
186 if(aReferenceIdentifier == it.Value()->ReferenceIdentifier()) {
187 it.Value()->ToDocument()->RemoveFromReference(aReferenceIdentifier);
188 myToReferences.Remove(it);
189 return;
190 }
191 }
192}
193
194//=======================================================================
195//function : Document
196//purpose :
197//=======================================================================
198
199Handle(CDM_Document) CDM_Document::Document
200 (const Standard_Integer aReferenceIdentifier) const
201{
202 Handle(CDM_Document) theDocument;
203
204 if(aReferenceIdentifier == 0)
205 theDocument = this;
206
207 else {
208 Handle(CDM_Reference) theReference = Reference(aReferenceIdentifier);
209 if(!theReference.IsNull()) theDocument = theReference->ToDocument();
210 }
211 return theDocument;
212}
213
214//=======================================================================
215//function : Reference
216//purpose :
217//=======================================================================
218
219Handle(CDM_Reference) CDM_Document::Reference
220 (const Standard_Integer aReferenceIdentifier) const
221{
222 Handle(CDM_Reference) theReference;
223
224 CDM_ListIteratorOfListOfReferences it(myToReferences);
225
226 Standard_Boolean found = Standard_False;
227
228 for(; it.More() && !found; it.Next()) {
229 found = aReferenceIdentifier == it.Value()->ReferenceIdentifier();
230 if(found) theReference = it.Value();
231 }
232 return theReference;
233}
234
235static CDM_ListOfDocument& getListOfDocumentToUpdate() {
236 static CDM_ListOfDocument theListOfDocumentToUpdate;
237 return theListOfDocumentToUpdate;
238}
239
240//=======================================================================
241//function : IsInSession
242//purpose :
243//=======================================================================
244
245Standard_Boolean CDM_Document::IsInSession
246 (const Standard_Integer aReferenceIdentifier) const
247{
248 if(aReferenceIdentifier == 0) return Standard_True;
249 Handle(CDM_Reference) theReference=Reference(aReferenceIdentifier);
250 if(theReference.IsNull())
251 Standard_NoSuchObject::Raise("CDM_Document::IsInSession: "
252 "invalid reference identifier");
253 return theReference->IsInSession();
254}
255
256//=======================================================================
257//function : IsStored
258//purpose :
259//=======================================================================
260
261Standard_Boolean CDM_Document::IsStored
262 (const Standard_Integer aReferenceIdentifier) const
263{
264 if(aReferenceIdentifier == 0) return IsStored();
265 Handle(CDM_Reference) theReference=Reference(aReferenceIdentifier);
266 if(theReference.IsNull())
267 Standard_NoSuchObject::Raise("CDM_Document::IsInSession: "
268 "invalid reference identifier");
269 return theReference->IsStored();
270}
271
272//=======================================================================
273//function : Name
274//purpose :
275//=======================================================================
276
277TCollection_ExtendedString CDM_Document::Name
278 (const Standard_Integer aReferenceIdentifier) const
279{
280 if(!IsStored(aReferenceIdentifier))
281 Standard_DomainError::Raise("CDM_Document::Name: document is not stored");
282
283 if(aReferenceIdentifier == 0) return myMetaData->Name();
284
285 return Reference(aReferenceIdentifier)->MetaData()->Name();
286}
287
288//=======================================================================
289//function : UpdateFromDocuments
290//purpose :
291//=======================================================================
292
293void CDM_Document::UpdateFromDocuments(const Standard_Address aModifContext) const
294{
295 Standard_Boolean StartUpdateCycle=getListOfDocumentToUpdate().IsEmpty();
296
297 CDM_ListIteratorOfListOfReferences it(myFromReferences);
298 for(; it.More() ; it.Next()) {
299 Handle(CDM_Document) theFromDocument=it.Value()->FromDocument();
300 CDM_ListIteratorOfListOfDocument itUpdate;
301
302 for(; itUpdate.More(); itUpdate.Next()) {
303 if(itUpdate.Value() == theFromDocument) break;
304
305 if(itUpdate.Value()->ShallowReferences(theFromDocument)) {
306 getListOfDocumentToUpdate().InsertBefore(theFromDocument,itUpdate);
307 break;
308 }
309 }
310 if(!itUpdate.More()) getListOfDocumentToUpdate().Append(theFromDocument);
311 theFromDocument->Update(this,it.Value()->ReferenceIdentifier(),aModifContext);
312 }
313
314 if(StartUpdateCycle) {
315
316 Handle(CDM_Document) theDocumentToUpdate;
317 Handle(CDM_Application) theApplication;
318 TCollection_ExtendedString ErrorString;
319
320 while(!getListOfDocumentToUpdate().IsEmpty()) {
321 theDocumentToUpdate=getListOfDocumentToUpdate().First();
322 theApplication=theDocumentToUpdate->Application();
323 ErrorString.Clear();
324 theApplication->BeginOfUpdate(theDocumentToUpdate);
325 theApplication->EndOfUpdate (theDocumentToUpdate,
326 theDocumentToUpdate->Update(ErrorString),
327 ErrorString);
328 getListOfDocumentToUpdate().RemoveFirst();
329 }
330 }
331}
332
333//=======================================================================
334//function : ToReferencesNumber
335//purpose :
336//=======================================================================
337
338Standard_Integer CDM_Document::ToReferencesNumber() const
339{
340 return myToReferences.Extent();
341}
342
343//=======================================================================
344//function : FromReferencesNumber
345//purpose :
346//=======================================================================
347
348Standard_Integer CDM_Document::FromReferencesNumber() const
349{
350 return myFromReferences.Extent();
351}
352
353//=======================================================================
354//function : ShallowReferences
355//purpose :
356//=======================================================================
357
358Standard_Boolean CDM_Document::ShallowReferences
359 (const Handle(CDM_Document)& aDocument) const
360{
361 CDM_ListIteratorOfListOfReferences it(myFromReferences);
362 for(; it.More() ; it.Next()) {
363 if(it.Value()->Document() == aDocument) return Standard_True;
364 }
365 return Standard_False;
366}
367
368//=======================================================================
369//function : DeepReferences
370//purpose :
371//=======================================================================
372
373Standard_Boolean CDM_Document::DeepReferences
374 (const Handle(CDM_Document)& aDocument) const
375{
376 CDM_ListIteratorOfListOfReferences it(myFromReferences);
377 for(; it.More() ; it.Next()) {
378 Handle(CDM_Document) theToDocument=it.Value()->Document();
379 if(!theToDocument.IsNull()) {
380 if(theToDocument == aDocument) return Standard_True;
381 if(theToDocument->DeepReferences(aDocument)) return Standard_True;
382 }
383 }
384 return Standard_False;
385}
386
387//=======================================================================
388//function : CopyReference
389//purpose :
390//=======================================================================
391
392Standard_Integer CDM_Document::CopyReference
393 (const Handle(CDM_Document)& /*aFromDocument*/,
394 const Standard_Integer aReferenceIdentifier)
395{
396 Handle(CDM_Reference) theReference = Reference(aReferenceIdentifier);
397 if(!theReference.IsNull()) {
398 Handle(CDM_Document) theDocument = theReference->Document();
399 if(!theDocument.IsNull()) {
400 return CreateReference(theDocument);
401 }
402 else
403 return CreateReference(theReference->MetaData(),
404 theReference->Application(),
405 theReference->DocumentVersion(),
406 theReference->UseStorageConfiguration());
407 }
408 return 0; //for NT ...
409}
410
411//=======================================================================
412//function : Modify
413//purpose :
414//=======================================================================
415
416void CDM_Document::Modify()
417{
418 myVersion++;
419}
420
421//=======================================================================
422//function : UnModify
423//purpose :
424//=======================================================================
425
426void CDM_Document::UnModify()
427{
428 myVersion = myStorageVersion;
429}
430
431//=======================================================================
432//function : Modifications
433//purpose :
434//=======================================================================
435
436Standard_Integer CDM_Document::Modifications() const
437{
438 return myVersion;
439}
440
441//=======================================================================
442//function : SetModifications
443//purpose :
444//=======================================================================
445
446void CDM_Document::SetModifications(const Standard_Integer Modifications)
447{
448 myVersion = Modifications;
449}
450
451//=======================================================================
452//function : IsUpToDate
453//purpose :
454//=======================================================================
455
456Standard_Boolean CDM_Document::IsUpToDate
457 (const Standard_Integer aReferenceIdentifier) const
458{
459 return Reference(aReferenceIdentifier)->IsUpToDate();
460}
461
462//=======================================================================
463//function : SetIsUpToDate
464//purpose :
465//=======================================================================
466
467void CDM_Document::SetIsUpToDate (const Standard_Integer aReferenceIdentifier)
468{
469 Reference(aReferenceIdentifier)->SetIsUpToDate();
470}
471
472//=======================================================================
473//function : SetComment
474//purpose :
475//=======================================================================
476
477void CDM_Document::SetComment(const TCollection_ExtendedString& aComment)
478{
479 myComments.Clear();
480 myComments.Append(aComment);
481}
482
483//=======================================================================
484//function : AddComment
485//purpose :
486//=======================================================================
487
488void CDM_Document::AddComment(const TCollection_ExtendedString& aComment)
489{
490 myComments.Append(aComment);
491}
492
493//=======================================================================
494//function : SetComments
495//purpose :
496//=======================================================================
497
498void CDM_Document::SetComments(const TColStd_SequenceOfExtendedString& aComments)
499{
500 myComments = aComments;
501}
502
503//=======================================================================
504//function : Comments
505//purpose :
506//=======================================================================
507
508void CDM_Document::Comments(TColStd_SequenceOfExtendedString& aComments) const
509{
510 aComments = myComments;
511}
512
513//=======================================================================
514//function : Comment
515//purpose :
516//=======================================================================
517
518Standard_ExtString CDM_Document::Comment() const
519{
520 if (myComments.Length() < 1)
521 return TCollection_ExtendedString().ToExtString();
522 return myComments(1).ToExtString();
523}
524
525//=======================================================================
526//function : Presentation
527//purpose :
528//=======================================================================
529
530Standard_ExtString CDM_Document::Presentation()
531{
532 if(!myValidPresentation) ComputePresentation();
533 return myPresentation.ToExtString();
534}
535
536//=======================================================================
537//function : UnvalidPresentation
538//purpose :
539//=======================================================================
540
541void CDM_Document::UnvalidPresentation()
542{
543 if(myValidPresentation) {
544 getPresentations().UnBind(myPresentation);
545 myValidPresentation=Standard_False;
546 }
547}
548
549//=======================================================================
550//function : ComputePresentation
551//purpose :
552//=======================================================================
553
554void CDM_Document::ComputePresentation()
555{
556 TCollection_ExtendedString presentation("");
557 static Standard_Integer theUnnamedDocuments(0);
558 static CDM_NamesDirectory theNames;
559 static CDM_NamesDirectory theTypes;
560
561 if(!myMetaData.IsNull()) {
562 presentation += myMetaData->Name();
563 if(!theNames.IsBound(presentation)) theNames.Bind(presentation,0);
564 Standard_Integer range = theNames(presentation);
565 range += 1;
566 theNames(presentation) = range;
567 if(range != 1) {
568 presentation += "<";
569 presentation += range;
570 presentation += ">";
571 }
572 }
573 else {
574 LoadResources();
575 if(myDefaultPresentationWasFound) {
576// presentation += "$";
577 presentation += myDefaultPresentation;
578 if(!theTypes.IsBound(presentation)) theTypes.Bind(presentation,0);
579 Standard_Integer range = theTypes(presentation);
580 range +=1;
581 theTypes(presentation) = range;
582 presentation += "_";
583 presentation += range;
584 }
585 else {
586 presentation += TCollection_ExtendedString("Document_");
587 presentation += ++theUnnamedDocuments;
588 }
589 }
590
591 if(getPresentations().IsBound(presentation)) {
592 TCollection_ExtendedString Test = presentation;
593 Test += "!";
594 Standard_Integer Count=0;
595 while (getPresentations().IsBound(Test)) {
596 Count++;
597 Test = presentation; Test+= "!"; Test+= Count;
598 }
599 presentation = Test;
600 }
601
602
603 myPresentation = TCollection_ExtendedString(presentation);
604 myValidPresentation = Standard_True;
605 getPresentations().Bind(presentation,this);
606}
607
608//=======================================================================
609//function : FindFromPresentation
610//purpose :
611//=======================================================================
612
613Handle(CDM_Document) CDM_Document::FindFromPresentation
614 (const TCollection_ExtendedString& aPresentation)
615{
616 TCollection_ExtendedString x(aPresentation);
617 if(!getPresentations().IsBound(x)) {
618 Standard_SStream aMsg;
619 aMsg <<"No document having this presentation: " << x << " does exist."
620 << endl << (char)0;
621 Standard_NoSuchObject::Raise(aMsg);
622 }
623 return getPresentations()(x);
624}
625
626//=======================================================================
627//function : FindPresentation
628//purpose :
629//=======================================================================
630
631Standard_Boolean CDM_Document::FindPresentation
632 (const TCollection_ExtendedString& aPresentation)
633{
634 return getPresentations().IsBound(aPresentation);
635}
636
637//=======================================================================
638//function : IsStored
639//purpose :
640//=======================================================================
641
642Standard_Boolean CDM_Document::IsStored() const
643{
644 return !myMetaData.IsNull();
645}
646
647//=======================================================================
648//function : StorageVersion
649//purpose :
650//=======================================================================
651
652Standard_Integer CDM_Document::StorageVersion() const
653{
654 return myStorageVersion;
655}
656
657//=======================================================================
658//function : SetMetaData
659//purpose :
660//=======================================================================
661
662void CDM_Document::SetMetaData(const Handle(CDM_MetaData)& aMetaData)
663{
664 if(!aMetaData->IsRetrieved() || aMetaData->Document() != This()) {
665
666 aMetaData->SetDocument(this);
667
668// Update the document refencing this MetaData:
669 CDM_DataMapIteratorOfMetaDataLookUpTable it(CDM_MetaData::LookUpTable());
670 for(;it.More();it.Next()) {
671 const Handle(CDM_MetaData)& theMetaData=it.Value();
672 if(theMetaData != aMetaData && theMetaData->IsRetrieved()) {
673 CDM_ListIteratorOfListOfReferences rit(theMetaData->Document()->myToReferences);
674 for(;rit.More();rit.Next()) {
675 rit.Value()->Update(aMetaData);
676 }
677 }
678 }
679 if(!myMetaData.IsNull()) {
680 if(myMetaData->Name() != aMetaData->Name()) UnvalidPresentation();
681 myMetaData->UnsetDocument();
682 }
683 else
684 UnvalidPresentation();
685 }
686
687 myStorageVersion = Modifications();
688
689 myMetaData = aMetaData;
690
691 SetRequestedFolder(aMetaData->Folder());
692 if(aMetaData->HasVersion()) SetRequestedPreviousVersion(aMetaData->Version());
693}
694
695//=======================================================================
696//function : UnsetIsStored
697//purpose :
698//=======================================================================
699
700void CDM_Document::UnsetIsStored()
701{
702 if(!myMetaData.IsNull()) {
703 myMetaData->UnsetDocument();
704// myMetaData.Nullify();
705 }
706}
707
708//=======================================================================
709//function : MetaData
710//purpose :
711//=======================================================================
712
713Handle(CDM_MetaData) CDM_Document::MetaData() const
714{
715 if(myMetaData.IsNull())
716 Standard_NoSuchObject::Raise("cannot furnish the MetaData of an object "
717 "which is not stored");
718 return myMetaData;
719}
720
721//=======================================================================
722//function : SetRequestedComment
723//purpose :
724//=======================================================================
725
726void CDM_Document::SetRequestedComment(const TCollection_ExtendedString& aComment)
727{
728 myRequestedComment=aComment;
729}
730
731//=======================================================================
732//function : RequestedComment
733//purpose :
734//=======================================================================
735
736TCollection_ExtendedString CDM_Document::RequestedComment() const
737{
738 return myRequestedComment.ToExtString();
739}
740
741//=======================================================================
742//function : Folder
743//purpose :
744//=======================================================================
745
746TCollection_ExtendedString CDM_Document::Folder() const {
747 if(myMetaData.IsNull())
748 Standard_NoSuchObject::Raise("cannot furnish the folder of an object "
749 "which is not stored");
750 return myMetaData->Folder();
751}
752
753//=======================================================================
754//function : SetRequestedFolder
755//purpose :
756//=======================================================================
757
758void CDM_Document::SetRequestedFolder(const TCollection_ExtendedString& aFolder)
759{
760 TCollection_ExtendedString f(aFolder);
761 if(f.Length() != 0) {
762 myRequestedFolderIsDefined=Standard_True;
763 myRequestedFolder=aFolder;
764 }
765}
766
767//=======================================================================
768//function : RequestedFolder
769//purpose :
770//=======================================================================
771
772TCollection_ExtendedString CDM_Document::RequestedFolder() const
773{
774 Standard_NoSuchObject_Raise_if (!myRequestedFolderIsDefined,
775 "storage folder is undefined for this document");
776 return myRequestedFolder;
777}
778
779//=======================================================================
780//function : HasRequestedFolder
781//purpose :
782//=======================================================================
783
784Standard_Boolean CDM_Document::HasRequestedFolder() const
785{
786 return myRequestedFolderIsDefined;
787}
788
789//=======================================================================
790//function : SetRequestedName
791//purpose :
792//=======================================================================
793
794void CDM_Document::SetRequestedName(const TCollection_ExtendedString& aName)
795{
796 myRequestedName=aName;
797 myRequestedNameIsDefined=Standard_True;
798}
799
800//=======================================================================
801//function : RequestedName
802//purpose :
803//=======================================================================
804
805TCollection_ExtendedString CDM_Document::RequestedName()
806{
807 if(!myRequestedNameIsDefined) {
808 if(!myMetaData.IsNull())
809 myRequestedName=myMetaData->Name();
810 else
811 myRequestedName=Presentation();
812 }
813 myRequestedNameIsDefined=Standard_True;
814 return myRequestedName;
815}
816
817//=======================================================================
818//function : SetRequestedPreviousVersion
819//purpose :
820//=======================================================================
821
822void CDM_Document::SetRequestedPreviousVersion
823 (const TCollection_ExtendedString& aPreviousVersion)
824{
825 myRequestedPreviousVersionIsDefined=Standard_True;
826 myRequestedPreviousVersion=aPreviousVersion;
827}
828
829//=======================================================================
830//function : RequestedPreviousVersion
831//purpose :
832//=======================================================================
833
834TCollection_ExtendedString CDM_Document::RequestedPreviousVersion() const
835{
836 Standard_NoSuchObject_Raise_if (!myRequestedPreviousVersionIsDefined,
837 "PreviousVersion is undefined fro this document");
838 return myRequestedPreviousVersion;
839}
840
841//=======================================================================
842//function : HasRequestedPreviousVersion
843//purpose :
844//=======================================================================
845
846Standard_Boolean CDM_Document::HasRequestedPreviousVersion() const
847{
848 return myRequestedPreviousVersionIsDefined;
849}
850
851//=======================================================================
852//function : UnsetRequestedPreviousVersion
853//purpose :
854//=======================================================================
855
856void CDM_Document::UnsetRequestedPreviousVersion()
857{
858 myRequestedPreviousVersionIsDefined=Standard_False;
859}
860
861//=======================================================================
862//function : IsOpened
863//purpose :
864//=======================================================================
865
866Standard_Boolean CDM_Document::IsOpened() const
867{
868 return !myApplication.IsNull();
869}
870
871//=======================================================================
872//function : IsOpened
873//purpose :
874//=======================================================================
875
876Standard_Boolean CDM_Document::IsOpened
877 (const Standard_Integer aReferenceIdentifier) const
878{
879 CDM_ListIteratorOfListOfReferences it(myToReferences);
880
881 for (; it.More(); it.Next()) {
882 if (aReferenceIdentifier == it.Value()->ReferenceIdentifier())
883 return it.Value()->IsOpened();
884 }
885 return Standard_False;
886}
887
888//=======================================================================
889//function : Open
890//purpose :
891//=======================================================================
892
893void CDM_Document::Open(const Handle(CDM_Application)& anApplication)
894{
895 myApplication=anApplication;
896}
897
898//=======================================================================
899//function : Close
900//purpose :
901//=======================================================================
902
903void CDM_Document::Close()
904{
905 switch (CanClose()) {
906 case CDM_CCS_NotOpen:
907 Standard_Failure::Raise("cannot close a document that has not been opened");
908 break;
909 case CDM_CCS_UnstoredReferenced:
910 Standard_Failure::Raise("cannot close an unstored document which is referenced");
911 break;
912 case CDM_CCS_ModifiedReferenced:
913 Standard_Failure::Raise("cannot close a document which is referenced when "
914 "the document has been modified since it was stored.");
915 break;
916 case CDM_CCS_ReferenceRejection:
917 Standard_Failure::Raise("cannot close this document because a document "
918 "referencing it refuses");
919 break;
7fd59977 920 default:
921 break;
7fd59977 922 }
923 if(FromReferencesNumber() != 0) {
924 CDM_ListIteratorOfListOfReferences it(myFromReferences);
925 for(; it.More(); it.Next()) {
926 it.Value()->UnsetToDocument(MetaData(),myApplication);
927 }
928 }
929 RemoveAllReferences();
930 UnsetIsStored();
931 myApplication.Nullify();
932 UnvalidPresentation();
933
934}
935
936//=======================================================================
937//function : CanClose
938//purpose :
939//=======================================================================
940
941CDM_CanCloseStatus CDM_Document::CanClose() const
942{
943 if(!IsOpened()) return CDM_CCS_NotOpen;
944
945 if(FromReferencesNumber() != 0) {
946 if(!IsStored()) return CDM_CCS_UnstoredReferenced;
947 if(IsModified()) return CDM_CCS_ModifiedReferenced;
948
949
950 CDM_ListIteratorOfListOfReferences it(myFromReferences);
951 for(; it.More(); it.Next()) {
952 if(!it.Value()->FromDocument()->CanCloseReference(this, it.Value()->ReferenceIdentifier()))
953 return CDM_CCS_ReferenceRejection;
954 }
955 }
956 return CDM_CCS_OK;
957}
958
959//=======================================================================
960//function : CanCloseReference
961//purpose :
962//=======================================================================
963
964Standard_Boolean CDM_Document::CanCloseReference
965 (const Handle(CDM_Document)& /*aDocument*/,
966 const Standard_Integer /*(aReferenceIdent*/) const
967{
968 return Standard_True;
969}
970
971//=======================================================================
972//function : CloseReference
973//purpose :
974//=======================================================================
975
976void CDM_Document::CloseReference (const Handle(CDM_Document)& /*aDocument*/,
977 const Standard_Integer /*aReferenceIdentifier*/)
978{
979}
980
981//=======================================================================
982//function : Application
983//purpose :
984//=======================================================================
985
986const Handle(CDM_Application)& CDM_Document::Application() const
987{
988 if(!IsOpened())
989 Standard_Failure::Raise("this document has not yet been opened "
990 "by any application");
991 return myApplication;
992}
993
994//=======================================================================
995//function : IsModified
996//purpose :
997//=======================================================================
998
999Standard_Boolean CDM_Document::IsModified() const
1000{
1001 return Modifications() > StorageVersion();
1002}
1003
1004//=======================================================================
1005//function : Print
1006//purpose :
1007//=======================================================================
1008
1009Standard_OStream& CDM_Document::Print(Standard_OStream& anOStream) const
1010{
1011 return anOStream;
1012}
1013
1014//=======================================================================
1015//function : CreateReference
1016//purpose :
1017//=======================================================================
1018
1019void CDM_Document::CreateReference(const Handle(CDM_MetaData)& aMetaData,
1020 const Standard_Integer aReferenceIdentifier,
1021 const Handle(CDM_Application)& anApplication,
1022 const Standard_Integer aToDocumentVersion,
1023 const Standard_Boolean UseStorageConfiguration)
1024{
1025 myActualReferenceIdentifier=Max(myActualReferenceIdentifier,aReferenceIdentifier);
1026
1027 if(aMetaData->IsRetrieved()) {
1028 Handle(CDM_Reference) r = new CDM_Reference (this,
1029 aMetaData->Document(),
1030 aReferenceIdentifier,
1031 aToDocumentVersion);
1032 AddToReference(r);
1033 aMetaData->Document()->AddFromReference(r);
1034
1035 }
1036 else {
1037 Handle(CDM_Reference) r = new CDM_Reference (this,
1038 aMetaData,
1039 aReferenceIdentifier,
1040 anApplication,
1041 aToDocumentVersion,
1042 UseStorageConfiguration);
1043 AddToReference(r);
1044 }
1045}
1046
1047//=======================================================================
1048//function : CreateReference
1049//purpose :
1050//=======================================================================
1051
1052Standard_Integer CDM_Document::CreateReference
1053 (const Handle(CDM_MetaData)& aMetaData,
1054 const Handle(CDM_Application)& anApplication,
1055 const Standard_Integer aDocumentVersion,
1056 const Standard_Boolean UseStorageConfiguration)
1057{
1058 CDM_ListIteratorOfListOfReferences it(myToReferences);
1059
1060 for(; it.More(); it.Next()) {
1061 if(aMetaData == it.Value()->MetaData())
1062 return it.Value()->ReferenceIdentifier();
1063 }
1064 Handle(CDM_Reference) r = new CDM_Reference (this,
1065 aMetaData,
1066 ++myActualReferenceIdentifier,
1067 anApplication,
1068 aDocumentVersion,
1069 UseStorageConfiguration);
1070 AddToReference(r);
1071 return r->ReferenceIdentifier();
1072}
1073
1074//=======================================================================
1075//function : AddToReference
1076//purpose :
1077//=======================================================================
1078
1079void CDM_Document::AddToReference(const Handle(CDM_Reference)& aReference)
1080{
1081 myToReferences.Append(aReference);
1082}
1083
1084//=======================================================================
1085//function : AddFromReference
1086//purpose :
1087//=======================================================================
1088
1089void CDM_Document::AddFromReference(const Handle(CDM_Reference)& aReference)
1090{
1091 myFromReferences.Append(aReference);
1092}
1093
1094//=======================================================================
1095//function : RemoveFromReference
1096//purpose :
1097//=======================================================================
1098
1099void CDM_Document::RemoveFromReference(const Standard_Integer aReferenceIdentifier)
1100{
1101 CDM_ListIteratorOfListOfReferences it(myFromReferences);
1102
1103 for(; it.More(); it.Next()) {
1104 if(aReferenceIdentifier == it.Value()->ReferenceIdentifier()) {
1105 myFromReferences.Remove(it);
1106 return;
1107 }
1108 }
1109}
1110
1111//=======================================================================
1112//function : GetResource
1113//purpose :
1114//=======================================================================
1115
1116TCollection_ExtendedString GetResource (const TCollection_ExtendedString aFormat,
1117 const TCollection_ExtendedString anItem)
1118{
1119 TCollection_ExtendedString theResource;
1120 theResource+= aFormat;
1121 theResource+= ".";
1122 theResource+= anItem;
1123 return theResource;
1124}
1125
1126static void FIND (const Handle(Resource_Manager)& theDocumentResource,
1127 const TCollection_ExtendedString& theResourceName,
1128 Standard_Boolean& IsDef,
1129 TCollection_ExtendedString& theValue)
1130{
1131 IsDef=UTL::Find(theDocumentResource,theResourceName);
1132 if(IsDef) theValue=UTL::Value(theDocumentResource,theResourceName);
1133
1134}
1135
1136//=======================================================================
1137//function : StorageResource
1138//purpose :
1139//=======================================================================
1140
1141Handle(Resource_Manager) CDM_Document::StorageResource()
1142{
1143 if(myApplication.IsNull()) {
1144 Standard_SStream aMsg;
1145 aMsg << "this document of format "<< StorageFormat()
1146 << " has not yet been opened by any application. "<< endl;
1147 Standard_Failure::Raise(aMsg);
1148 }
1149 return myApplication->Resources();
1150}
1151
1152//=======================================================================
1153//function : LoadResources
1154//purpose :
1155//=======================================================================
1156
1157void CDM_Document::LoadResources()
1158{
1159 if(!myResourcesAreLoaded) {
1160 Handle(Resource_Manager) theDocumentResource = StorageResource();
1161
1162 TCollection_ExtendedString theFormat=StorageFormat(); theFormat+=".";
1163 TCollection_ExtendedString theResourceName;
1164
1165 theResourceName=theFormat;
1166 theResourceName+="FileExtension";
1167 FIND(theDocumentResource,
1168 theResourceName,myFileExtensionWasFound,myFileExtension);
1169
1170 theResourceName=theFormat;
1171 theResourceName+="DataType";
1172 FIND(theDocumentResource,theResourceName,myDataTypeWasFound,myDataType);
1173
1174
1175 theResourceName=theFormat;
1176 theResourceName+="VersionDataType";
1177 FIND(theDocumentResource,
1178 theResourceName,myVersionDataTypeWasFound,myVersionDataType);
1179
1180 theResourceName=theFormat;
1181 theResourceName+="Description";
1182 FIND(theDocumentResource,theResourceName,myDescriptionWasFound,myDescription);
1183
1184 theResourceName=theFormat;
1185 theResourceName+="Domain";
1186 FIND(theDocumentResource,theResourceName,myDomainWasFound,myDomain);
1187
1188 theResourceName=theFormat;
1189 theResourceName+="Presentation";
1190 FIND(theDocumentResource,
1191 theResourceName,myDefaultPresentationWasFound,myDefaultPresentation);
1192
1193 theResourceName=theFormat;
1194 theResourceName+="StoragePlugin";
1195 TCollection_ExtendedString thePluginId;
1196 FIND(theDocumentResource,theResourceName,myStoragePluginWasFound,thePluginId);
bf4bf038 1197 if(myStoragePluginWasFound)
1198 {
1199 // Check whether the GUID (as a string) contains blanks before and after the string.
1200 // If it is so, remove them.
1201 if (thePluginId.Search(' ') != -1)
1202 thePluginId.RemoveAll(' ');
1203
1204 // Convert to GUID.
1205 myStoragePlugin=UTL::GUID(thePluginId);
1206 }
7fd59977 1207 myResourcesAreLoaded=Standard_True;
1208
586db386 1209// cout << "resource Loaded: Format: " << theFormat << ", FileExtension:" << myFileExtension << ", DataType:" << myDataType << ", VersionDataType:" << myVersionDataType << ", Description:" << myDescription << ", Domain:" << myDomain << endl;
7fd59977 1210 }
1211 return;
1212}
1213
1214//=======================================================================
1215//function : FindFileExtension
1216//purpose :
1217//=======================================================================
1218
1219Standard_Boolean CDM_Document::FindFileExtension ()
1220{
1221 LoadResources();
1222 return myFileExtensionWasFound;
1223}
1224
1225//=======================================================================
1226//function : FileExtension
1227//purpose :
1228//=======================================================================
1229
1230TCollection_ExtendedString CDM_Document::FileExtension()
1231{
1232 LoadResources();
1233 return myFileExtension;
1234}
1235
1236//=======================================================================
1237//function : FindDataType
1238//purpose :
1239//=======================================================================
1240
1241Standard_Boolean CDM_Document::FindDataType ()
1242{
1243 LoadResources();
1244 return myDataTypeWasFound;
1245}
1246
1247//=======================================================================
1248//function : DataType
1249//purpose :
1250//=======================================================================
1251
1252TCollection_ExtendedString CDM_Document::DataType()
1253{
1254 LoadResources();
1255 return myDataType;
1256}
1257
1258//=======================================================================
1259//function : FindVersionDataType
1260//purpose :
1261//=======================================================================
1262
1263Standard_Boolean CDM_Document::FindVersionDataType ()
1264{
1265 LoadResources();
1266 return myVersionDataTypeWasFound;
1267}
1268
1269//=======================================================================
1270//function : VersionDataType
1271//purpose :
1272//=======================================================================
1273
1274TCollection_ExtendedString CDM_Document::VersionDataType()
1275{
1276 LoadResources();
1277 return myVersionDataType;
1278}
1279
1280//=======================================================================
1281//function : FindDescription
1282//purpose :
1283//=======================================================================
1284
1285Standard_Boolean CDM_Document::FindDescription ()
1286{
1287 LoadResources();
1288 return myDescriptionWasFound;
1289}
1290
1291//=======================================================================
1292//function : Description
1293//purpose :
1294//=======================================================================
1295
1296TCollection_ExtendedString CDM_Document::Description()
1297{
1298 LoadResources();
1299 return myDescription;
1300}
1301
1302//=======================================================================
1303//function : FindDomain
1304//purpose :
1305//=======================================================================
1306
1307Standard_Boolean CDM_Document::FindDomain ()
1308{
1309 LoadResources();
1310 return myDomainWasFound;
1311}
1312
1313//=======================================================================
1314//function : Domain
1315//purpose :
1316//=======================================================================
1317
1318TCollection_ExtendedString CDM_Document::Domain()
1319{
1320 LoadResources();
1321 return myDomain;
1322}
1323
1324//=======================================================================
1325//function : FindStoragePlugin
1326//purpose :
1327//=======================================================================
1328
1329Standard_Boolean CDM_Document::FindStoragePlugin()
1330{
1331 LoadResources();
1332 return myStoragePluginWasFound;
1333}
1334
1335//=======================================================================
1336//function : StoragePlugin
1337//purpose :
1338//=======================================================================
1339
1340Standard_GUID CDM_Document::StoragePlugin()
1341{
1342 LoadResources();
1343 return myStoragePlugin;
1344}
1345
1346//=======================================================================
1347//function : IsReadOnly
1348//purpose :
1349//=======================================================================
1350
1351Standard_Boolean CDM_Document::IsReadOnly() const
1352{
1353 if(IsStored()) return myMetaData->IsReadOnly();
1354 return Standard_False;
1355}
1356
1357//=======================================================================
1358//function : IsReadOnly
1359//purpose :
1360//=======================================================================
1361
1362Standard_Boolean CDM_Document::IsReadOnly
1363 (const Standard_Integer aReferenceIdentifier) const
1364{
1365 return Reference(aReferenceIdentifier)->IsReadOnly();
1366}
1367
1368//=======================================================================
1369//function : SetIsReadOnly
1370//purpose :
1371//=======================================================================
1372
1373void CDM_Document::SetIsReadOnly()
1374{
1375 if(IsStored()) myMetaData->SetIsReadOnly();
1376}
1377
1378//=======================================================================
1379//function : UnsetIsReadOnly
1380//purpose :
1381//=======================================================================
1382
1383void CDM_Document::UnsetIsReadOnly()
1384{
1385 if(IsStored()) myMetaData->UnsetIsReadOnly();
1386}
1387
1388//=======================================================================
1389//function : ReferenceCounter
1390//purpose :
1391//=======================================================================
1392
1393Standard_Integer CDM_Document::ReferenceCounter() const
1394{
1395 return myActualReferenceIdentifier;
1396}
1397
1398//=======================================================================
1399//function : SetReferenceCounter
1400//purpose :
1401//=======================================================================
1402
1403void CDM_Document::SetReferenceCounter (const Standard_Integer aReferenceCounter)
1404{
1405 myActualReferenceIdentifier=aReferenceCounter;
1406}