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