0027067: Avoid use of virtual methods for implementation of destructors in legacy...
[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 : ~CDM_Document
74 //purpose  : 
75 //=======================================================================
76
77 CDM_Document::~CDM_Document()
78 {
79   if(!myMetaData.IsNull()) myMetaData->UnsetDocument();
80 }
81
82 //=======================================================================
83 //function : Update
84 //purpose  : 
85 //=======================================================================
86
87 void 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
98 void CDM_Document::Update()
99 {
100 }
101
102 //=======================================================================
103 //function : Update
104 //purpose  : 
105 //=======================================================================
106
107 Standard_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
119 Standard_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
132 void CDM_Document::Extensions (TColStd_SequenceOfExtendedString& Extensions) const
133 {
134   Extensions.Clear();
135 }
136
137 //=======================================================================
138 //function : CreateReference
139 //purpose  : 
140 //=======================================================================
141
142 Standard_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
166 void 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
181 void 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
199 Handle(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
219 Handle(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
235 static CDM_ListOfDocument& getListOfDocumentToUpdate() {
236   static CDM_ListOfDocument theListOfDocumentToUpdate;
237   return theListOfDocumentToUpdate;
238 }
239
240 //=======================================================================
241 //function : IsInSession
242 //purpose  : 
243 //=======================================================================
244
245 Standard_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
261 Standard_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
277 TCollection_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
293 void 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
338 Standard_Integer CDM_Document::ToReferencesNumber() const
339 {
340   return myToReferences.Extent();
341 }
342
343 //=======================================================================
344 //function : FromReferencesNumber
345 //purpose  : 
346 //=======================================================================
347
348 Standard_Integer CDM_Document::FromReferencesNumber() const
349 {
350   return myFromReferences.Extent();
351 }
352
353 //=======================================================================
354 //function : ShallowReferences
355 //purpose  : 
356 //=======================================================================
357
358 Standard_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
373 Standard_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
392 Standard_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
416 void CDM_Document::Modify()
417 {
418   myVersion++;
419 }
420
421 //=======================================================================
422 //function : UnModify
423 //purpose  : 
424 //=======================================================================
425
426 void CDM_Document::UnModify()
427 {
428   myVersion = myStorageVersion;
429 }
430
431 //=======================================================================
432 //function : Modifications
433 //purpose  : 
434 //=======================================================================
435
436 Standard_Integer CDM_Document::Modifications() const
437 {
438   return myVersion;
439 }
440
441 //=======================================================================
442 //function : SetModifications
443 //purpose  : 
444 //=======================================================================
445
446 void CDM_Document::SetModifications(const Standard_Integer Modifications)
447 {
448   myVersion = Modifications;
449 }
450
451 //=======================================================================
452 //function : IsUpToDate
453 //purpose  : 
454 //=======================================================================
455
456 Standard_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
467 void CDM_Document::SetIsUpToDate (const Standard_Integer aReferenceIdentifier)
468 {
469   Reference(aReferenceIdentifier)->SetIsUpToDate();
470 }  
471
472 //=======================================================================
473 //function : SetComment
474 //purpose  : 
475 //=======================================================================
476
477 void 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
488 void CDM_Document::AddComment(const TCollection_ExtendedString& aComment)
489 {
490   myComments.Append(aComment);
491 }
492
493 //=======================================================================
494 //function : SetComments
495 //purpose  : 
496 //=======================================================================
497
498 void CDM_Document::SetComments(const TColStd_SequenceOfExtendedString& aComments)
499 {
500   myComments = aComments;
501 }
502
503 //=======================================================================
504 //function : Comments
505 //purpose  : 
506 //=======================================================================
507
508 void CDM_Document::Comments(TColStd_SequenceOfExtendedString& aComments) const
509 {
510   aComments = myComments;
511 }
512
513 //=======================================================================
514 //function : Comment
515 //purpose  : 
516 //=======================================================================
517
518 Standard_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
530 Standard_ExtString CDM_Document::Presentation()
531 {
532   if(!myValidPresentation) ComputePresentation();
533   return myPresentation.ToExtString();
534 }
535
536 //=======================================================================
537 //function : UnvalidPresentation
538 //purpose  : 
539 //=======================================================================
540
541 void 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
554 void 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
613 Handle(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
631 Standard_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
642 Standard_Boolean CDM_Document::IsStored() const
643 {
644   return !myMetaData.IsNull();
645 }
646
647 //=======================================================================
648 //function : StorageVersion
649 //purpose  : 
650 //=======================================================================
651
652 Standard_Integer CDM_Document::StorageVersion() const
653 {
654   return myStorageVersion;
655 }
656
657 //=======================================================================
658 //function : SetMetaData
659 //purpose  : 
660 //=======================================================================
661
662 void 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
700 void 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
713 Handle(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
726 void CDM_Document::SetRequestedComment(const TCollection_ExtendedString& aComment)
727 {
728   myRequestedComment=aComment;
729 }
730
731 //=======================================================================
732 //function : RequestedComment
733 //purpose  : 
734 //=======================================================================
735
736 TCollection_ExtendedString CDM_Document::RequestedComment() const
737 {
738   return myRequestedComment.ToExtString();
739 }
740
741 //=======================================================================
742 //function : Folder
743 //purpose  : 
744 //=======================================================================
745
746 TCollection_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
758 void 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
772 TCollection_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
784 Standard_Boolean CDM_Document::HasRequestedFolder() const
785 {
786   return myRequestedFolderIsDefined;
787 }
788
789 //=======================================================================
790 //function : SetRequestedName
791 //purpose  : 
792 //=======================================================================
793
794 void 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
805 TCollection_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
822 void 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
834 TCollection_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
846 Standard_Boolean CDM_Document::HasRequestedPreviousVersion() const
847 {
848   return myRequestedPreviousVersionIsDefined;
849 }
850
851 //=======================================================================
852 //function : UnsetRequestedPreviousVersion
853 //purpose  : 
854 //=======================================================================
855
856 void CDM_Document::UnsetRequestedPreviousVersion()
857 {
858   myRequestedPreviousVersionIsDefined=Standard_False;
859 }
860
861 //=======================================================================
862 //function : IsOpened
863 //purpose  : 
864 //=======================================================================
865
866 Standard_Boolean CDM_Document::IsOpened() const
867 {
868   return !myApplication.IsNull();
869 }
870
871 //=======================================================================
872 //function : IsOpened
873 //purpose  : 
874 //=======================================================================
875
876 Standard_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
893 void CDM_Document::Open(const Handle(CDM_Application)& anApplication)
894 {
895   myApplication=anApplication;
896 }
897
898 //=======================================================================
899 //function : Close
900 //purpose  : 
901 //=======================================================================
902
903 void 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;
920   default:
921     break;
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
941 CDM_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
964 Standard_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
976 void CDM_Document::CloseReference (const Handle(CDM_Document)& /*aDocument*/,
977                                    const Standard_Integer /*aReferenceIdentifier*/)
978 {
979 }
980
981 //=======================================================================
982 //function : Application
983 //purpose  : 
984 //=======================================================================
985
986 const 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
999 Standard_Boolean CDM_Document::IsModified() const
1000 {
1001   return Modifications() > StorageVersion();
1002 }
1003
1004 //=======================================================================
1005 //function : Print
1006 //purpose  : 
1007 //=======================================================================
1008
1009 Standard_OStream& CDM_Document::Print(Standard_OStream& anOStream) const
1010 {
1011   return anOStream;
1012 }
1013
1014 //=======================================================================
1015 //function : CreateReference
1016 //purpose  : 
1017 //=======================================================================
1018
1019 void 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
1052 Standard_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
1079 void CDM_Document::AddToReference(const Handle(CDM_Reference)& aReference)
1080 {
1081   myToReferences.Append(aReference);
1082 }
1083
1084 //=======================================================================
1085 //function : AddFromReference
1086 //purpose  : 
1087 //=======================================================================
1088
1089 void CDM_Document::AddFromReference(const Handle(CDM_Reference)& aReference)
1090 {
1091   myFromReferences.Append(aReference);
1092 }
1093
1094 //=======================================================================
1095 //function : RemoveFromReference
1096 //purpose  : 
1097 //=======================================================================
1098
1099 void 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
1116 TCollection_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
1126 static 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
1141 Handle(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
1157 void 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);
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     }
1207     myResourcesAreLoaded=Standard_True;
1208     
1209 //    cout << "resource Loaded: Format: " << theFormat << ", FileExtension:" << myFileExtension << ", DataType:" <<  myDataType << ", VersionDataType:" << myVersionDataType << ", Description:" << myDescription << ", Domain:" << myDomain << endl;
1210   }
1211   return;
1212 }
1213
1214 //=======================================================================
1215 //function : FindFileExtension
1216 //purpose  : 
1217 //=======================================================================
1218
1219 Standard_Boolean CDM_Document::FindFileExtension ()
1220 {
1221   LoadResources();
1222   return myFileExtensionWasFound;
1223 }
1224
1225 //=======================================================================
1226 //function : FileExtension
1227 //purpose  : 
1228 //=======================================================================
1229
1230 TCollection_ExtendedString CDM_Document::FileExtension()
1231 {
1232   LoadResources();
1233   return  myFileExtension;
1234 }
1235
1236 //=======================================================================
1237 //function : FindDataType
1238 //purpose  : 
1239 //=======================================================================
1240
1241 Standard_Boolean CDM_Document::FindDataType ()
1242 {
1243   LoadResources();
1244   return myDataTypeWasFound;
1245 }
1246
1247 //=======================================================================
1248 //function : DataType
1249 //purpose  : 
1250 //=======================================================================
1251
1252 TCollection_ExtendedString CDM_Document::DataType()
1253 {
1254   LoadResources();
1255   return myDataType;
1256 }
1257
1258 //=======================================================================
1259 //function : FindVersionDataType
1260 //purpose  : 
1261 //=======================================================================
1262
1263 Standard_Boolean CDM_Document::FindVersionDataType ()
1264 {
1265   LoadResources();
1266   return myVersionDataTypeWasFound;
1267 }
1268
1269 //=======================================================================
1270 //function : VersionDataType
1271 //purpose  : 
1272 //=======================================================================
1273
1274 TCollection_ExtendedString CDM_Document::VersionDataType()
1275 {
1276   LoadResources();
1277   return myVersionDataType;
1278 }
1279
1280 //=======================================================================
1281 //function : FindDescription
1282 //purpose  : 
1283 //=======================================================================
1284
1285 Standard_Boolean CDM_Document::FindDescription ()
1286 {
1287   LoadResources();
1288   return myDescriptionWasFound;
1289 }
1290
1291 //=======================================================================
1292 //function : Description
1293 //purpose  : 
1294 //=======================================================================
1295
1296 TCollection_ExtendedString CDM_Document::Description()
1297 {
1298   LoadResources();
1299   return myDescription;
1300 }
1301
1302 //=======================================================================
1303 //function : FindDomain
1304 //purpose  : 
1305 //=======================================================================
1306
1307 Standard_Boolean CDM_Document::FindDomain ()
1308 {
1309   LoadResources();
1310   return myDomainWasFound;
1311 }
1312
1313 //=======================================================================
1314 //function : Domain
1315 //purpose  : 
1316 //=======================================================================
1317
1318 TCollection_ExtendedString CDM_Document::Domain()
1319 {
1320   LoadResources();
1321   return myDomain;
1322 }
1323
1324 //=======================================================================
1325 //function : FindStoragePlugin
1326 //purpose  : 
1327 //=======================================================================
1328
1329 Standard_Boolean CDM_Document::FindStoragePlugin()
1330 {
1331   LoadResources();
1332   return myStoragePluginWasFound;
1333 }
1334
1335 //=======================================================================
1336 //function : StoragePlugin
1337 //purpose  : 
1338 //=======================================================================
1339
1340 Standard_GUID CDM_Document::StoragePlugin()
1341 {
1342   LoadResources();
1343   return myStoragePlugin;
1344 }
1345
1346 //=======================================================================
1347 //function : IsReadOnly
1348 //purpose  : 
1349 //=======================================================================
1350
1351 Standard_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
1362 Standard_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
1373 void CDM_Document::SetIsReadOnly()
1374 {
1375   if(IsStored()) myMetaData->SetIsReadOnly();
1376 }
1377     
1378 //=======================================================================
1379 //function : UnsetIsReadOnly
1380 //purpose  : 
1381 //=======================================================================
1382
1383 void CDM_Document::UnsetIsReadOnly()
1384 {
1385   if(IsStored()) myMetaData->UnsetIsReadOnly();
1386 }
1387
1388 //=======================================================================
1389 //function : ReferenceCounter
1390 //purpose  : 
1391 //=======================================================================
1392
1393 Standard_Integer CDM_Document::ReferenceCounter() const
1394 {
1395   return myActualReferenceIdentifier;
1396 }
1397
1398 //=======================================================================
1399 //function : SetReferenceCounter
1400 //purpose  : 
1401 //=======================================================================
1402
1403 void CDM_Document::SetReferenceCounter (const Standard_Integer aReferenceCounter)
1404 {
1405   myActualReferenceIdentifier=aReferenceCounter;
1406 }