1 // Copyright (C) 2005 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
2 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
4 // This library is free software; you can redistribute it and/or
5 // modify it under the terms of the GNU Lesser General Public
6 // License as published by the Free Software Foundation; either
7 // version 2.1 of the License.
9 // This library is distributed in the hope that it will be useful
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 // Lesser General Public License for more details.
14 // You should have received a copy of the GNU Lesser General Public
15 // License along with this library; if not, write to the Free Software
16 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
20 // File : SALOMEDS_Study_i.cxx
21 // Author : Sergey RUIN
25 #include "utilities.h"
26 #include "SALOMEDS_Study_i.hxx"
27 #include "SALOMEDS_UseCaseIterator_i.hxx"
28 #include "SALOMEDS_GenericAttribute_i.hxx"
29 #include "SALOMEDS_AttributeStudyProperties_i.hxx"
30 #include "SALOMEDS_AttributeParameter_i.hxx"
31 #include "SALOMEDS_ChildIterator_i.hxx"
32 #include "SALOMEDS_Driver_i.hxx"
33 #include "SALOMEDS.hxx"
35 #include "SALOMEDSImpl_SObject.hxx"
36 #include "SALOMEDSImpl_SComponent.hxx"
37 #include "SALOMEDSImpl_UseCaseBuilder.hxx"
38 #include "SALOMEDSImpl_AttributeStudyProperties.hxx"
39 #include "SALOMEDSImpl_AttributeParameter.hxx"
40 #include "SALOMEDSImpl_ChildIterator.hxx"
41 #include "SALOMEDSImpl_IParameters.hxx"
43 #include <TColStd_SequenceOfExtendedString.hxx>
44 #include <TColStd_HSequenceOfAsciiString.hxx>
45 #include <TColStd_HSequenceOfTransient.hxx>
46 #include <TCollection_AsciiString.hxx>
47 #include <TCollection_ExtendedString.hxx>
49 #include <TDF_Label.hxx>
50 #include <TDF_Attribute.hxx>
55 #include <sys/types.h>
63 //============================================================================
64 /*! Function : SALOMEDS_Study_i
65 * Purpose : SALOMEDS_Study_i constructor
67 //============================================================================
68 SALOMEDS_Study_i::SALOMEDS_Study_i(const Handle(SALOMEDSImpl_Study) theImpl,
71 _orb = CORBA::ORB::_duplicate(orb);
74 _builder = new SALOMEDS_StudyBuilder_i(_impl->NewBuilder(), _orb);
77 //============================================================================
78 /*! Function : ~SALOMEDS_Study_i
79 * Purpose : SALOMEDS_Study_i destructor
81 //============================================================================
82 SALOMEDS_Study_i::~SALOMEDS_Study_i()
86 //============================================================================
87 /*! Function : GetPersistentReference
88 * Purpose : Get persistent reference of study (idem URL())
90 //============================================================================
91 char* SALOMEDS_Study_i::GetPersistentReference()
93 SALOMEDS::Locker lock;
94 return CORBA::string_dup(_impl->GetPersistentReference().ToCString());
96 //============================================================================
97 /*! Function : GetTransientReference
98 * Purpose : Get IOR of the Study (registred in OCAF document in doc->Root)
100 //============================================================================
101 char* SALOMEDS_Study_i::GetTransientReference()
103 SALOMEDS::Locker lock;
104 return CORBA::string_dup(_impl->GetTransientReference().ToCString());
107 //============================================================================
108 /*! Function : IsEmpty
109 * Purpose : Detect if study is empty
111 //============================================================================
112 CORBA::Boolean SALOMEDS_Study_i::IsEmpty()
114 SALOMEDS::Locker lock;
115 return _impl->IsEmpty();
118 //============================================================================
119 /*! Function : FindComponent
120 * Purpose : Find a Component with ComponentDataType = aComponentName
122 //============================================================================
123 SALOMEDS::SComponent_ptr SALOMEDS_Study_i::FindComponent (const char* aComponentName)
125 SALOMEDS::Locker lock;
127 Handle(SALOMEDSImpl_SComponent) aCompImpl = _impl->FindComponent(TCollection_AsciiString((char*)aComponentName));
128 if(aCompImpl.IsNull()) return SALOMEDS::SComponent::_nil();
130 SALOMEDS::SComponent_var sco = SALOMEDS_SComponent_i::New (aCompImpl, _orb);
134 //============================================================================
135 /*! Function : FindComponentID
136 * Purpose : Find a Component from it's ID
138 //============================================================================
139 SALOMEDS::SComponent_ptr SALOMEDS_Study_i::FindComponentID(const char* aComponentID)
141 SALOMEDS::Locker lock;
143 Handle(SALOMEDSImpl_SComponent) aCompImpl = _impl->FindComponentID(TCollection_AsciiString((char*)aComponentID));
144 if(aCompImpl.IsNull()) return SALOMEDS::SComponent::_nil();
146 SALOMEDS::SComponent_var sco = SALOMEDS_SComponent_i::New (aCompImpl, _orb);
150 //============================================================================
151 /*! Function : FindObject
152 * Purpose : Find an Object with SALOMEDS::Name = anObjectName
154 //============================================================================
155 SALOMEDS::SObject_ptr SALOMEDS_Study_i::FindObject(const char* anObjectName)
157 SALOMEDS::Locker lock;
159 Handle(SALOMEDSImpl_SObject) aSO = _impl->FindObject(TCollection_AsciiString((char*)anObjectName));
160 if(aSO.IsNull()) return SALOMEDS::SObject::_nil();
162 if(aSO->DynamicType() == STANDARD_TYPE(SALOMEDSImpl_SComponent)) {
163 Handle(SALOMEDSImpl_SComponent) aSCO = Handle(SALOMEDSImpl_SComponent)::DownCast(aSO);
164 SALOMEDS::SComponent_var sco = SALOMEDS_SComponent_i::New (aSCO, _orb);
168 SALOMEDS::SObject_var so = SALOMEDS_SObject_i::New (aSO, _orb);
173 //============================================================================
174 /*! Function : FindObjectID
175 * Purpose : Find an Object with ID = anObjectID
177 //============================================================================
178 SALOMEDS::SObject_ptr SALOMEDS_Study_i::FindObjectID(const char* anObjectID)
180 SALOMEDS::Locker lock;
182 Handle(SALOMEDSImpl_SObject) aSO = _impl->FindObjectID(TCollection_AsciiString((char*)anObjectID));
183 if(aSO.IsNull()) return SALOMEDS::SObject::_nil();
184 SALOMEDS::SObject_var so = SALOMEDS_SObject_i::New (aSO, _orb);
188 //============================================================================
189 /*! Function : CreateObjectID
190 * Purpose : Creates an Object with ID = anObjectID
192 //============================================================================
193 SALOMEDS::SObject_ptr SALOMEDS_Study_i::CreateObjectID(const char* anObjectID)
195 SALOMEDS::Locker lock;
197 if(!anObjectID || strlen(anObjectID) == 0) return SALOMEDS::SObject::_nil();
199 Handle(SALOMEDSImpl_SObject) aSO = _impl->CreateObjectID((char*)anObjectID);
200 if(aSO.IsNull()) return SALOMEDS::SObject::_nil();
202 SALOMEDS::SObject_var so = SALOMEDS_SObject_i::New (aSO, _orb);
206 //============================================================================
207 /*! Function : FindObjectByName
208 * Purpose : Find Objects with SALOMEDS::Name = anObjectName in a Component
209 * : with ComponentDataType = aComponentName
211 //============================================================================
212 SALOMEDS::Study::ListOfSObject* SALOMEDS_Study_i::FindObjectByName( const char* anObjectName,
213 const char* aComponentName )
215 SALOMEDS::Locker lock;
217 Handle(TColStd_HSequenceOfTransient) aSeq = _impl->FindObjectByName(TCollection_AsciiString((char*)anObjectName),
218 TCollection_AsciiString((char*)aComponentName));
219 int aLength = aSeq->Length();
220 SALOMEDS::Study::ListOfSObject_var listSO = new SALOMEDS::Study::ListOfSObject ;
221 listSO->length(aLength);
222 for(int i = 1; i<=aLength; i++) {
223 Handle(SALOMEDSImpl_SObject) aSO = Handle(SALOMEDSImpl_SObject)::DownCast(aSeq->Value(i));
224 SALOMEDS::SObject_var so = SALOMEDS_SObject_i::New (aSO, _orb);
227 return listSO._retn() ;
230 //============================================================================
231 /*! Function : FindObjectIOR
232 * Purpose : Find an Object with IOR = anObjectIOR
234 //============================================================================
235 SALOMEDS::SObject_ptr SALOMEDS_Study_i::FindObjectIOR(const char* anObjectIOR)
237 SALOMEDS::Locker lock;
239 Handle(SALOMEDSImpl_SObject) aSO = _impl->FindObjectIOR(TCollection_AsciiString((char*)anObjectIOR));
240 if(aSO.IsNull()) return SALOMEDS::SObject::_nil();
242 SALOMEDS::SObject_var so = SALOMEDS_SObject_i::New (aSO, _orb);
246 //============================================================================
247 /*! Function : FindObjectByPath
248 * Purpose : Find an Object by its path = thePath
250 //============================================================================
251 SALOMEDS::SObject_ptr SALOMEDS_Study_i::FindObjectByPath(const char* thePath)
253 SALOMEDS::Locker lock;
255 Handle(SALOMEDSImpl_SObject) aSO = _impl->FindObjectByPath(TCollection_AsciiString((char*)thePath));
256 if(aSO.IsNull()) return SALOMEDS::SObject::_nil();
258 SALOMEDS::SObject_var so = SALOMEDS_SObject_i::New (aSO, _orb);
262 //============================================================================
263 /*! Function : GetObjectPath
266 //============================================================================
267 char* SALOMEDS_Study_i::GetObjectPath(CORBA::Object_ptr theObject)
269 SALOMEDS::Locker lock;
271 TCollection_AsciiString aPath("");
272 if(CORBA::is_nil(theObject)) return CORBA::string_dup(aPath.ToCString());
273 Handle(SALOMEDSImpl_SObject) aSO;
274 SALOMEDS::SObject_var aSObj = SALOMEDS::SObject::_narrow(theObject);
276 if(!CORBA::is_nil(aSObj)) {
277 aSO = _impl->FindObjectID(aSObj->GetID());
280 aSO = _impl->FindObjectIOR(_orb->object_to_string(theObject));
283 if(aSO.IsNull()) return CORBA::string_dup(aPath.ToCString());
285 aPath = _impl->GetObjectPath(aSO);
286 return CORBA::string_dup(aPath.ToCString());
290 //============================================================================
291 /*! Function : SetContext
292 * Purpose : Sets the current context
294 //============================================================================
295 void SALOMEDS_Study_i::SetContext(const char* thePath)
297 SALOMEDS::Locker lock;
299 _impl->SetContext(TCollection_AsciiString((char*)thePath));
300 if(_impl->IsError() && _impl->GetErrorCode() == "InvalidContext")
301 throw SALOMEDS::Study::StudyInvalidContext();
304 //============================================================================
305 /*! Function : GetContext
306 * Purpose : Gets the current context
308 //============================================================================
309 char* SALOMEDS_Study_i::GetContext()
311 SALOMEDS::Locker lock;
313 if(!_impl->HasCurrentContext()) throw SALOMEDS::Study::StudyInvalidContext();
314 return CORBA::string_dup(_impl->GetContext().ToCString());
317 //============================================================================
318 /*! Function : GetObjectNames
319 * Purpose : method to get all object names in the given context (or in the current context, if 'theContext' is empty)
321 //============================================================================
322 SALOMEDS::ListOfStrings* SALOMEDS_Study_i::GetObjectNames(const char* theContext)
324 SALOMEDS::Locker lock;
326 SALOMEDS::ListOfStrings_var aResult = new SALOMEDS::ListOfStrings;
328 if (strlen(theContext) == 0 && !_impl->HasCurrentContext())
329 throw SALOMEDS::Study::StudyInvalidContext();
331 Handle(TColStd_HSequenceOfAsciiString) aSeq =
332 _impl->GetObjectNames(TCollection_AsciiString((char*)theContext));
333 if (_impl->GetErrorCode() == "InvalidContext")
334 throw SALOMEDS::Study::StudyInvalidContext();
336 int aLength = aSeq->Length();
337 aResult->length(aLength);
338 for (int anIndex = 1; anIndex <= aLength; anIndex++) {
339 aResult[anIndex-1] = CORBA::string_dup(TCollection_AsciiString(aSeq->Value(anIndex)).ToCString());
342 return aResult._retn();
345 //============================================================================
346 /*! Function : GetDirectoryNames
347 * Purpose : method to get all directory names in the given context (or in the current context, if 'theContext' is empty)
349 //============================================================================
350 SALOMEDS::ListOfStrings* SALOMEDS_Study_i::GetDirectoryNames(const char* theContext)
352 SALOMEDS::Locker lock;
354 SALOMEDS::ListOfStrings_var aResult = new SALOMEDS::ListOfStrings;
356 if (strlen(theContext) == 0 && !_impl->HasCurrentContext())
357 throw SALOMEDS::Study::StudyInvalidContext();
359 Handle(TColStd_HSequenceOfAsciiString) aSeq =
360 _impl->GetDirectoryNames(TCollection_AsciiString((char*)theContext));
361 if (_impl->GetErrorCode() == "InvalidContext")
362 throw SALOMEDS::Study::StudyInvalidContext();
364 int aLength = aSeq->Length();
365 aResult->length(aLength);
366 for (int anIndex = 1; anIndex <= aLength; anIndex++) {
367 aResult[anIndex-1] = CORBA::string_dup(TCollection_AsciiString(aSeq->Value(anIndex)).ToCString());
370 return aResult._retn();
373 //============================================================================
374 /*! Function : GetFileNames
375 * Purpose : method to get all file names in the given context (or in the current context, if 'theContext' is empty)
377 //============================================================================
378 SALOMEDS::ListOfStrings* SALOMEDS_Study_i::GetFileNames(const char* theContext)
380 SALOMEDS::Locker lock;
382 SALOMEDS::ListOfStrings_var aResult = new SALOMEDS::ListOfStrings;
384 if (strlen(theContext) == 0 && !_impl->HasCurrentContext())
385 throw SALOMEDS::Study::StudyInvalidContext();
387 Handle(TColStd_HSequenceOfAsciiString) aSeq =
388 _impl->GetFileNames(TCollection_AsciiString((char*)theContext));
389 if (_impl->GetErrorCode() == "InvalidContext")
390 throw SALOMEDS::Study::StudyInvalidContext();
392 int aLength = aSeq->Length();
393 aResult->length(aLength);
394 for (int anIndex = 1; anIndex <= aLength; anIndex++) {
395 aResult[anIndex-1] = CORBA::string_dup(TCollection_AsciiString(aSeq->Value(anIndex)).ToCString());
398 return aResult._retn();
401 //============================================================================
402 /*! Function : GetComponentNames
403 * Purpose : method to get all components names
404 * SRN: Note, theContext can be any, it doesn't matter
406 //============================================================================
407 SALOMEDS::ListOfStrings* SALOMEDS_Study_i::GetComponentNames(const char* theContext)
409 SALOMEDS::Locker lock;
411 SALOMEDS::ListOfStrings_var aResult = new SALOMEDS::ListOfStrings;
413 Handle(TColStd_HSequenceOfAsciiString) aSeq =
414 _impl->GetComponentNames(TCollection_AsciiString((char*)theContext));
416 int aLength = aSeq->Length();
417 aResult->length(aLength);
418 for(int anIndex = 1; anIndex <= aLength; anIndex++) {
419 aResult[anIndex-1] = CORBA::string_dup(TCollection_AsciiString(aSeq->Value(anIndex)).ToCString());
422 return aResult._retn();
425 //============================================================================
426 /*! Function : NewChildIterator
427 * Purpose : Create a ChildIterator from an SObject
429 //============================================================================
430 SALOMEDS::ChildIterator_ptr SALOMEDS_Study_i::NewChildIterator(SALOMEDS::SObject_ptr theSO)
432 SALOMEDS::Locker lock;
434 Handle(SALOMEDSImpl_SObject) aSO = _impl->GetSObject(theSO->GetID());
435 Handle(SALOMEDSImpl_ChildIterator) anItr = new SALOMEDSImpl_ChildIterator(aSO);
438 SALOMEDS_ChildIterator_i* it_servant = new SALOMEDS_ChildIterator_i(anItr, _orb);
439 SALOMEDS::ChildIterator_var it = SALOMEDS::ChildIterator::_narrow(it_servant->_this());
445 //============================================================================
446 /*! Function : NewComponentIterator
447 * Purpose : Create a SComponentIterator
449 //============================================================================
450 SALOMEDS::SComponentIterator_ptr SALOMEDS_Study_i::NewComponentIterator()
452 SALOMEDS::Locker lock;
453 SALOMEDS_SComponentIterator_i* _it = new SALOMEDS_SComponentIterator_i(_impl->NewComponentIterator(), _orb);
459 //============================================================================
460 /*! Function : NewBuilder
461 * Purpose : Create a StudyBuilder
463 //============================================================================
464 SALOMEDS::StudyBuilder_ptr SALOMEDS_Study_i::NewBuilder()
466 SALOMEDS::Locker lock;
467 return _builder->_this();
470 //============================================================================
472 * Purpose : get study name
474 //============================================================================
475 char* SALOMEDS_Study_i::Name()
477 SALOMEDS::Locker lock;
478 return CORBA::string_dup(_impl->Name().ToCString());
481 //============================================================================
483 * Purpose : set study name
485 //============================================================================
486 void SALOMEDS_Study_i::Name(const char* name)
488 SALOMEDS::Locker lock;
489 _impl->Name(TCollection_AsciiString((char*)name));
492 //============================================================================
493 /*! Function : IsSaved
494 * Purpose : get if study has been saved
496 //============================================================================
497 CORBA::Boolean SALOMEDS_Study_i::IsSaved()
499 SALOMEDS::Locker lock;
500 return _impl->IsSaved();
503 //============================================================================
504 /*! Function : IsSaved
505 * Purpose : set if study has been saved
507 //============================================================================
508 void SALOMEDS_Study_i::IsSaved(CORBA::Boolean save)
510 SALOMEDS::Locker lock;
511 _impl->IsSaved(save);
514 //============================================================================
515 /*! Function : IsModified
516 * Purpose : Detect if a Study has been modified since it has been saved
518 //============================================================================
519 CORBA::Boolean SALOMEDS_Study_i::IsModified()
521 SALOMEDS::Locker lock;
522 return _impl->IsModified();
525 //============================================================================
526 /*! Function : Modified
527 * Purpose : Set a Modified flag of a Study to True
529 //============================================================================
530 void SALOMEDS_Study_i::Modified()
532 SALOMEDS::Locker lock;
537 //============================================================================
539 * Purpose : get URL of the study (persistent reference of the study)
541 //============================================================================
542 char* SALOMEDS_Study_i::URL()
544 SALOMEDS::Locker lock;
545 return CORBA::string_dup(_impl->URL().ToCString());
548 //============================================================================
550 * Purpose : set URL of the study (persistent reference of the study)
552 //============================================================================
553 void SALOMEDS_Study_i::URL(const char* url)
555 SALOMEDS::Locker lock;
556 _impl->URL(TCollection_AsciiString((char*)url));
560 CORBA::Short SALOMEDS_Study_i::StudyId()
562 SALOMEDS::Locker lock;
563 return _impl->StudyId();
566 void SALOMEDS_Study_i::StudyId(CORBA::Short id)
568 SALOMEDS::Locker lock;
572 void SALOMEDS_Study_i::UpdateIORLabelMap(const char* anIOR,const char* anEntry)
574 SALOMEDS::Locker lock;
575 _impl->UpdateIORLabelMap(TCollection_AsciiString((char*)anIOR), TCollection_AsciiString((char*)anEntry));
578 SALOMEDS::Study_ptr SALOMEDS_Study_i::GetStudy(const TDF_Label theLabel, CORBA::ORB_ptr orb)
580 SALOMEDS::Locker lock;
582 Handle(SALOMEDSImpl_AttributeIOR) Att;
583 if (theLabel.Root().FindAttribute(SALOMEDSImpl_AttributeIOR::GetID(),Att)){
584 char* IOR = CORBA::string_dup(TCollection_AsciiString(Att->Value()).ToCString());
585 CORBA::Object_var obj = orb->string_to_object(IOR);
586 SALOMEDS::Study_ptr aStudy = SALOMEDS::Study::_narrow(obj) ;
587 ASSERT(!CORBA::is_nil(aStudy));
588 return SALOMEDS::Study::_duplicate(aStudy);
590 MESSAGE("GetStudy: Problem to get study");
592 return SALOMEDS::Study::_nil();
595 void SALOMEDS_Study_i::IORUpdated(const Handle(SALOMEDSImpl_AttributeIOR) theAttribute)
597 SALOMEDS::Locker lock;
598 SALOMEDSImpl_Study::IORUpdated(theAttribute);
601 SALOMEDS::Study::ListOfSObject* SALOMEDS_Study_i::FindDependances(SALOMEDS::SObject_ptr anObject)
603 SALOMEDS::Locker lock;
605 SALOMEDS::GenericAttribute_ptr aTarget;
606 if (anObject->FindAttribute(aTarget,"AttributeTarget")) {
607 return SALOMEDS::AttributeTarget::_narrow(aTarget)->Get();
609 SALOMEDS::Study::ListOfSObject* aList = new SALOMEDS::Study::ListOfSObject;
615 SALOMEDS::AttributeStudyProperties_ptr SALOMEDS_Study_i::GetProperties()
617 SALOMEDS::Locker lock;
619 Handle(SALOMEDSImpl_AttributeStudyProperties) anAttr = _impl->GetProperties();
620 SALOMEDS_AttributeStudyProperties_i* SP = new SALOMEDS_AttributeStudyProperties_i(anAttr, _orb);
621 return SP->AttributeStudyProperties::_this();
624 char* SALOMEDS_Study_i::GetLastModificationDate()
626 SALOMEDS::Locker lock;
627 return CORBA::string_dup(_impl->GetLastModificationDate().ToCString());
630 SALOMEDS::ListOfDates* SALOMEDS_Study_i::GetModificationsDate()
632 SALOMEDS::Locker lock;
634 Handle(TColStd_HSequenceOfAsciiString) aSeq = _impl->GetModificationsDate();
635 int aLength = aSeq->Length();
636 SALOMEDS::ListOfDates_var aDates = new SALOMEDS::ListOfDates;
637 aDates->length(aLength);
639 for(int anIndex = 1; anIndex <= aLength; anIndex++) {
640 aDates[anIndex-1] = CORBA::string_dup(aSeq->Value(anIndex).ToCString());
642 return aDates._retn();
647 //============================================================================
648 /*! Function : GetUseCaseBuilder
649 * Purpose : Returns a UseCase builder
651 //============================================================================
652 SALOMEDS::UseCaseBuilder_ptr SALOMEDS_Study_i::GetUseCaseBuilder()
654 SALOMEDS::Locker lock;
655 SALOMEDS_UseCaseBuilder_i* UCBuilder = new SALOMEDS_UseCaseBuilder_i(_impl->GetUseCaseBuilder(), _orb);
656 return UCBuilder->_this();
660 //============================================================================
664 //============================================================================
665 void SALOMEDS_Study_i::Close()
667 SALOMEDS::Locker lock;
671 SALOMEDS::SComponentIterator_var itcomponent = NewComponentIterator();
673 for (; itcomponent->More(); itcomponent->Next()) {
674 SALOMEDS::SComponent_var sco = itcomponent->Value();
676 MESSAGE ( "Look for an engine for data type :"<< sco->ComponentDataType());
677 // if there is an associated Engine call its method for closing
678 CORBA::String_var IOREngine;
679 if (sco->ComponentIOR(IOREngine)) {
680 // we have found the associated engine to write the data
681 MESSAGE ( "We have found an engine for data type :"<< sco->ComponentDataType());
682 CORBA::Object_var obj = _orb->string_to_object(IOREngine);
683 if (!CORBA::is_nil(obj)) {
684 SALOMEDS::Driver_var anEngine = SALOMEDS::Driver::_narrow(obj) ;
686 if (!anEngine->_is_nil()) {
688 anEngine->Close(sco);
697 //============================================================================
698 /*! Function : AddPostponed
701 //============================================================================
702 void SALOMEDS_Study_i::AddPostponed(const char* theIOR)
704 SALOMEDS::Locker lock;
706 CORBA::Object_var obj = _orb->string_to_object(theIOR);
707 if (!CORBA::is_nil(obj)) {
708 SALOME::GenericObj_var aGeneric = SALOME::GenericObj::_narrow(obj) ;
709 if (!CORBA::is_nil(aGeneric)) _impl->AddPostponed((char*)theIOR);
713 void SALOMEDS_Study_i::AddCreatedPostponed(const char* theIOR)
715 SALOMEDS::Locker lock;
717 CORBA::Object_var obj = _orb->string_to_object(theIOR);
718 if (!CORBA::is_nil(obj)) {
719 SALOME::GenericObj_var aGeneric = SALOME::GenericObj::_narrow(obj) ;
720 if (!CORBA::is_nil(aGeneric)) _impl->AddCreatedPostponed((char*)theIOR);
724 //============================================================================
725 /*! Function : RemovePostponed
728 //============================================================================
730 void SALOMEDS_Study_i::RemovePostponed(const CORBA::Long theUndoLimit)
732 void SALOMEDS_Study_i::RemovePostponed(CORBA::Long theUndoLimit)
735 SALOMEDS::Locker lock;
737 Handle(TColStd_HSequenceOfAsciiString) aSeq = _impl->RemovePostponed(theUndoLimit);
738 int aLegth = aSeq->Length();
739 for(int i = 1; i <= aLegth; i++) {
740 TCollection_AsciiString anIOR = aSeq->Value(i);
741 //mkr : fix for bug IPAL9408 : check the length of anIOR
742 // before take value from it
743 if ( !anIOR.IsEmpty() && anIOR.Value(1) == 'c') {
744 CORBA::Object_var obj = _orb->string_to_object(anIOR.Split(1).ToCString());
745 SALOME::GenericObj_var aGeneric = SALOME::GenericObj::_narrow(obj);
746 if (!CORBA::is_nil(aGeneric)) aGeneric->Destroy();
748 else if ( !anIOR.IsEmpty() && anIOR.Value(1) == 'd') {
749 CORBA::Object_var obj = _orb->string_to_object(anIOR.Split(1).ToCString());
750 SALOME::GenericObj_var aGeneric = SALOME::GenericObj::_narrow(obj);
751 if (!CORBA::is_nil(aGeneric)) aGeneric->Destroy();
755 CORBA::Object_var obj = _orb->string_to_object(anIOR.ToCString());
756 SALOME::GenericObj_var aGeneric = SALOME::GenericObj::_narrow(obj);
757 if (!CORBA::is_nil(aGeneric)) aGeneric->Destroy();
763 //============================================================================
764 /*! Function : UndoPostponed
767 //============================================================================
769 void SALOMEDS_Study_i::UndoPostponed(const CORBA::Long theWay)
771 void SALOMEDS_Study_i::UndoPostponed(CORBA::Long theWay)
774 SALOMEDS::Locker lock;
776 _impl->UndoPostponed(theWay);
780 //============================================================================
781 /*! Function : DumpStudy
784 //============================================================================
785 CORBA::Boolean SALOMEDS_Study_i::DumpStudy(const char* thePath,
786 const char* theBaseName,
787 CORBA::Boolean isPublished)
789 SALOMEDS::Locker lock;
791 TCollection_AsciiString aPath((char*)thePath), aBaseName((char*)theBaseName);
792 SALOMEDS_DriverFactory_i* factory = new SALOMEDS_DriverFactory_i(_orb);
793 CORBA::Boolean ret = _impl->DumpStudy(aPath, aBaseName, isPublished, factory);
798 //============================================================================
799 /*! Function : GetCommonParameters
802 //============================================================================
803 SALOMEDS::AttributeParameter_ptr SALOMEDS_Study_i::GetCommonParameters(const char* theID, CORBA::Long theSavePoint)
805 SALOMEDS::Locker lock;
807 Handle(SALOMEDSImpl_AttributeParameter) anAttr = _impl->GetCommonParameters(theID, theSavePoint);
808 SALOMEDS_AttributeParameter_i* SP = new SALOMEDS_AttributeParameter_i(anAttr, _orb);
809 return SP->AttributeParameter::_this();
812 //============================================================================
813 /*! Function : GetCommonModuleParameters
816 //============================================================================
817 SALOMEDS::AttributeParameter_ptr SALOMEDS_Study_i::GetModuleParameters(const char* theID,
818 const char* theModuleName,
819 CORBA::Long theSavePoint)
821 SALOMEDS::Locker lock;
823 Handle(SALOMEDSImpl_AttributeParameter) anAttr = _impl->GetModuleParameters(theID, theModuleName, theSavePoint);
824 SALOMEDS_AttributeParameter_i* SP = new SALOMEDS_AttributeParameter_i(anAttr, _orb);
825 return SP->AttributeParameter::_this();
828 //============================================================================
829 /*! Function : SetStudyLock
832 //============================================================================
833 void SALOMEDS_Study_i::SetStudyLock(const char* theLockerID)
835 SALOMEDS::Locker lock;
836 _impl->SetStudyLock(theLockerID);
839 //============================================================================
840 /*! Function : IsStudyLocked
843 //============================================================================
844 bool SALOMEDS_Study_i::IsStudyLocked()
846 SALOMEDS::Locker lock;
847 return _impl->IsStudyLocked();
850 //============================================================================
851 /*! Function : UnLockStudy
854 //============================================================================
855 void SALOMEDS_Study_i::UnLockStudy(const char* theLockerID)
857 SALOMEDS::Locker lock;
858 _impl->UnLockStudy(theLockerID);
861 //============================================================================
862 /*! Function : GetLockerID
865 //============================================================================
866 SALOMEDS::ListOfStrings* SALOMEDS_Study_i::GetLockerID()
868 SALOMEDS::Locker lock;
870 SALOMEDS::ListOfStrings_var aResult = new SALOMEDS::ListOfStrings;
872 Handle(TColStd_HSequenceOfAsciiString) aSeq = _impl->GetLockerID();
874 int aLength = aSeq->Length();
875 aResult->length(aLength);
876 for(int anIndex = 1; anIndex <= aLength; anIndex++) {
877 aResult[anIndex-1] = CORBA::string_dup(TCollection_AsciiString(aSeq->Value(anIndex)).ToCString());
879 return aResult._retn();
882 //============================================================================
883 /*! Function : GetDefaultScript
886 //============================================================================
887 char* SALOMEDS_Study_i::GetDefaultScript(const char* theModuleName, const char* theShift)
889 SALOMEDS::Locker lock;
891 string script = SALOMEDSImpl_IParameters::getDefaultScript(_impl, theModuleName, theShift);
892 return CORBA::string_dup(script.c_str());
895 //============================================================================
896 /*! Function : EnableUseCaseAutoFilling
899 //============================================================================
900 void SALOMEDS_Study_i::EnableUseCaseAutoFilling(CORBA::Boolean isEnabled)
902 _impl->EnableUseCaseAutoFilling(isEnabled);
903 Handle(SALOMEDSImpl_StudyBuilder) builder = _builder->GetImpl();
904 if(!builder.IsNull()) {
906 builder->SetOnAddSObject(_impl->GetCallback());
907 builder->SetOnRemoveSObject(_impl->GetCallback());
910 builder->SetOnAddSObject(NULL);
911 builder->SetOnRemoveSObject(NULL);
916 //===========================================================================
918 //===========================================================================
919 CORBA::LongLong SALOMEDS_Study_i::GetLocalImpl(const char* theHostname, CORBA::Long thePID, CORBA::Boolean& isLocal)
922 long pid = (long)_getpid();
924 long pid = (long)getpid();
926 isLocal = (strcmp(theHostname, GetHostname().c_str()) == 0 && pid == thePID)?1:0;
927 SALOMEDSImpl_Study* local_impl = _impl.operator->();
928 return ((CORBA::LongLong)local_impl);