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/
20 // File : SALOMEDS_StudyBuilder.cxx
21 // Author : Sergey RUIN
26 #include "utilities.h"
28 #include "SALOMEDS_StudyBuilder.hxx"
30 #include "SALOMEDS.hxx"
31 #include "SALOMEDS_SObject.hxx"
32 #include "SALOMEDS_SComponent.hxx"
33 #include "SALOMEDS_GenericAttribute.hxx"
34 #include "SALOMEDS_StudyManager.hxx"
35 #include "SALOMEDS_StudyBuilder_i.hxx"
37 #include "SALOMEDS_Driver_i.hxx"
39 #include "SALOMEDSImpl_SObject.hxx"
40 #include "SALOMEDSImpl_SComponent.hxx"
41 #include "SALOMEDSImpl_GenericAttribute.hxx"
45 #include <TCollection_AsciiString.hxx>
46 #include <TDF_Attribute.hxx>
48 #include "Utils_CorbaException.hxx"
49 #include "Utils_ORB_INIT.hxx"
50 #include "Utils_SINGLETON.hxx"
54 SALOMEDS_StudyBuilder::SALOMEDS_StudyBuilder(const Handle(SALOMEDSImpl_StudyBuilder)& theBuilder)
57 _local_impl = theBuilder;
58 _corba_impl = SALOMEDS::StudyBuilder::_nil();
63 SALOMEDS_StudyBuilder::SALOMEDS_StudyBuilder(SALOMEDS::StudyBuilder_ptr theBuilder)
67 _corba_impl = SALOMEDS::StudyBuilder::_duplicate(theBuilder);
72 SALOMEDS_StudyBuilder::~SALOMEDS_StudyBuilder()
76 _PTR(SComponent) SALOMEDS_StudyBuilder::NewComponent(const std::string& ComponentDataType)
78 SALOMEDSClient_SComponent* aSCO = NULL;
82 SALOMEDS::Locker lock;
84 Handle(SALOMEDSImpl_SComponent) aSCO_impl =_local_impl->NewComponent((char*)ComponentDataType.c_str());
85 if(aSCO_impl.IsNull()) return _PTR(SComponent)(aSCO);
86 aSCO = new SALOMEDS_SComponent(aSCO_impl);
89 SALOMEDS::SComponent_var aSCO_impl = _corba_impl->NewComponent((char*)ComponentDataType.c_str());
90 if(CORBA::is_nil(aSCO_impl)) return _PTR(SComponent)(aSCO);
91 aSCO = new SALOMEDS_SComponent(aSCO_impl);
94 return _PTR(SComponent)(aSCO);
97 void SALOMEDS_StudyBuilder::DefineComponentInstance (const _PTR(SComponent)& theSCO,
98 const std::string& ComponentIOR)
100 SALOMEDS_SComponent* aSCO = dynamic_cast<SALOMEDS_SComponent*>(theSCO.get());
103 SALOMEDS::Locker lock;
105 _local_impl->DefineComponentInstance(Handle(SALOMEDSImpl_SComponent)::DownCast(aSCO->GetLocalImpl()),
106 (char*)ComponentIOR.c_str());
109 CORBA::Object_var obj = _orb->string_to_object(ComponentIOR.c_str());
110 _corba_impl->DefineComponentInstance(SALOMEDS::SComponent::_narrow(aSCO->GetCORBAImpl()), obj);
114 void SALOMEDS_StudyBuilder::RemoveComponent(const _PTR(SComponent)& theSCO)
116 SALOMEDS_SComponent* aSCO = dynamic_cast<SALOMEDS_SComponent*>(theSCO.get());
119 SALOMEDS::Locker lock;
121 _local_impl->RemoveComponent(Handle(SALOMEDSImpl_SComponent)::DownCast(aSCO->GetLocalImpl()));
123 else _corba_impl->RemoveComponent(SALOMEDS::SComponent::_narrow(aSCO->GetCORBAImpl()));
126 _PTR(SObject) SALOMEDS_StudyBuilder::NewObject(const _PTR(SObject)& theFatherObject)
130 SALOMEDSClient_SObject* aSO = NULL;
131 SALOMEDS_SObject* father = dynamic_cast< SALOMEDS_SObject*>(theFatherObject.get());
132 if (father == NULL) return _PTR(SObject)(aSO);
134 SALOMEDS::Locker lock;
136 Handle(SALOMEDSImpl_SObject) aSO_impl = _local_impl->NewObject(father->GetLocalImpl());
137 if(aSO_impl.IsNull()) return _PTR(SObject)(aSO);
138 aSO = new SALOMEDS_SObject(aSO_impl);
141 SALOMEDS::SObject_var aSO_impl = _corba_impl->NewObject(father->GetCORBAImpl());
142 if(CORBA::is_nil(aSO_impl)) return _PTR(SObject)(aSO);
143 aSO = new SALOMEDS_SObject(aSO_impl);
146 return _PTR(SObject)(aSO);
149 _PTR(SObject) SALOMEDS_StudyBuilder::NewObjectToTag(const _PTR(SObject)& theFatherObject, int theTag)
153 SALOMEDSClient_SObject* aSO = NULL;
154 SALOMEDS_SObject* father = dynamic_cast< SALOMEDS_SObject*>(theFatherObject.get());
155 if (father == NULL) return _PTR(SObject)(aSO);
157 SALOMEDS::Locker lock;
159 Handle(SALOMEDSImpl_SObject) aSO_impl = _local_impl->NewObjectToTag(father->GetLocalImpl(), theTag);
160 if(aSO_impl.IsNull()) return _PTR(SObject)(aSO);
161 aSO = new SALOMEDS_SObject(aSO_impl);
164 SALOMEDS::SObject_var aSO_impl = _corba_impl->NewObjectToTag(father->GetCORBAImpl(), theTag);
165 if(CORBA::is_nil(aSO_impl)) return _PTR(SObject)(aSO);
166 aSO = new SALOMEDS_SObject(aSO_impl);
169 return _PTR(SObject)(aSO);
172 void SALOMEDS_StudyBuilder::AddDirectory(const std::string& thePath)
176 SALOMEDS::Locker lock;
178 _local_impl->AddDirectory((char*)thePath.c_str());
179 if (_local_impl->IsError()) {
180 std::string anErrorCode = _local_impl->GetErrorCode().ToCString();
181 if (anErrorCode == "StudyNameAlreadyUsed") throw SALOMEDS::Study::StudyNameAlreadyUsed();
182 if (anErrorCode == "StudyInvalidDirectory") throw SALOMEDS::Study::StudyInvalidDirectory();
183 if (anErrorCode == "StudyInvalidComponent") throw SALOMEDS::Study::StudyInvalidComponent();
186 else _corba_impl->AddDirectory((char*)thePath.c_str());
189 void SALOMEDS_StudyBuilder::LoadWith(const _PTR(SComponent)& theSCO, const std::string& theIOR)
191 SALOMEDS_SComponent* aSCO = dynamic_cast<SALOMEDS_SComponent*>(theSCO.get());
192 CORBA::Object_var obj = _orb->string_to_object(theIOR.c_str());
193 SALOMEDS::Driver_var aDriver = SALOMEDS::Driver::_narrow(obj);
196 SALOMEDS::Locker lock;
198 SALOMEDS_Driver_i* drv = new SALOMEDS_Driver_i(aDriver, _orb);
199 Handle(SALOMEDSImpl_SComponent) aSCO_impl =
200 Handle(SALOMEDSImpl_SComponent)::DownCast(aSCO->GetLocalImpl());
201 bool isDone = _local_impl->LoadWith(aSCO_impl, drv);
203 if(!isDone && _local_impl->IsError())
204 THROW_SALOME_CORBA_EXCEPTION(_local_impl->GetErrorCode().ToCString(),SALOME::BAD_PARAM);
207 _corba_impl->LoadWith(SALOMEDS::SComponent::_narrow(aSCO->GetCORBAImpl()), aDriver);
211 void SALOMEDS_StudyBuilder::Load(const _PTR(SObject)& theSCO)
213 SALOMEDS_SComponent* aSCO = dynamic_cast<SALOMEDS_SComponent*>(theSCO.get());
214 if (_isLocal) _local_impl->Load(Handle(SALOMEDSImpl_SComponent)::DownCast(aSCO->GetLocalImpl()));
215 else _corba_impl->Load(SALOMEDS::SComponent::_narrow(aSCO->GetCORBAImpl()));
218 void SALOMEDS_StudyBuilder::RemoveObject(const _PTR(SObject)& theSO)
220 SALOMEDS_SObject* aSO = dynamic_cast<SALOMEDS_SObject*>(theSO.get());
223 SALOMEDS::Locker lock;
225 _local_impl->RemoveObject(aSO->GetLocalImpl());
227 else _corba_impl->RemoveObject(aSO->GetCORBAImpl());
230 void SALOMEDS_StudyBuilder::RemoveObjectWithChildren(const _PTR(SObject)& theSO)
232 SALOMEDS_SObject* aSO = dynamic_cast<SALOMEDS_SObject*>(theSO.get());
235 SALOMEDS::Locker lock;
237 _local_impl->RemoveObjectWithChildren(aSO->GetLocalImpl());
239 else _corba_impl->RemoveObjectWithChildren(aSO->GetCORBAImpl());
242 _PTR(GenericAttribute) SALOMEDS_StudyBuilder::FindOrCreateAttribute(const _PTR(SObject)& theSO,
243 const std::string& aTypeOfAttribute)
245 SALOMEDS_SObject* aSO = dynamic_cast<SALOMEDS_SObject*>(theSO.get());
246 SALOMEDSClient_GenericAttribute* anAttr = NULL;
248 SALOMEDS::Locker lock;
250 Handle(SALOMEDSImpl_GenericAttribute) aGA;
252 aGA = Handle(SALOMEDSImpl_GenericAttribute)::DownCast
253 (_local_impl->FindOrCreateAttribute(aSO->GetLocalImpl(), (char*)aTypeOfAttribute.c_str()));
256 throw SALOMEDS::StudyBuilder::LockProtection();
258 anAttr = SALOMEDS_GenericAttribute::CreateAttribute(aGA);
261 SALOMEDS::GenericAttribute_var aGA =
262 _corba_impl->FindOrCreateAttribute(aSO->GetCORBAImpl(), (char*)aTypeOfAttribute.c_str());
263 anAttr = SALOMEDS_GenericAttribute::CreateAttribute(aGA);
266 return _PTR(GenericAttribute)(anAttr);
269 bool SALOMEDS_StudyBuilder::FindAttribute(const _PTR(SObject)& theSO,
270 _PTR(GenericAttribute)& anAttribute,
271 const std::string& aTypeOfAttribute)
274 SALOMEDS_SObject* aSO = dynamic_cast<SALOMEDS_SObject*>(theSO.get());
276 SALOMEDS::Locker lock;
278 Handle(SALOMEDSImpl_GenericAttribute) aGA;
279 ret = _local_impl->FindAttribute(aSO->GetLocalImpl(), aGA, (char*)aTypeOfAttribute.c_str());
280 if(ret) anAttribute = _PTR(GenericAttribute)(SALOMEDS_GenericAttribute::CreateAttribute(aGA));
283 SALOMEDS::GenericAttribute_var aGA;
284 ret = _corba_impl->FindAttribute(aSO->GetCORBAImpl(), aGA.out(), (char*)aTypeOfAttribute.c_str());
285 if(ret) anAttribute = _PTR(GenericAttribute)(SALOMEDS_GenericAttribute::CreateAttribute(aGA));
291 void SALOMEDS_StudyBuilder::RemoveAttribute(const _PTR(SObject)& theSO, const std::string& aTypeOfAttribute)
293 SALOMEDS_SObject* aSO = dynamic_cast<SALOMEDS_SObject*>(theSO.get());
296 SALOMEDS::Locker lock;
298 _local_impl->RemoveAttribute(aSO->GetLocalImpl(), (char*)aTypeOfAttribute.c_str());
300 else _corba_impl->RemoveAttribute(aSO->GetCORBAImpl(), (char*)aTypeOfAttribute.c_str());
303 void SALOMEDS_StudyBuilder::Addreference(const _PTR(SObject)& me, const _PTR(SObject)& thereferencedObject)
305 SALOMEDS_SObject* aSO = dynamic_cast<SALOMEDS_SObject*>(me.get());
306 SALOMEDS_SObject* aRefSO = dynamic_cast<SALOMEDS_SObject*>(thereferencedObject.get());
309 SALOMEDS::Locker lock;
311 _local_impl->Addreference(aSO->GetLocalImpl(), aRefSO->GetLocalImpl());
313 else _corba_impl->Addreference(aSO->GetCORBAImpl(), aRefSO->GetCORBAImpl());
316 void SALOMEDS_StudyBuilder::RemoveReference(const _PTR(SObject)& me)
318 SALOMEDS_SObject* aSO = dynamic_cast<SALOMEDS_SObject*>(me.get());
321 SALOMEDS::Locker lock;
323 _local_impl->RemoveReference(aSO->GetLocalImpl());
325 else _corba_impl->RemoveReference(aSO->GetCORBAImpl());
328 void SALOMEDS_StudyBuilder::SetGUID(const _PTR(SObject)& theSO, const std::string& theGUID)
330 SALOMEDS_SObject* aSO = dynamic_cast<SALOMEDS_SObject*>(theSO.get());
333 SALOMEDS::Locker lock;
335 _local_impl->SetGUID(aSO->GetLocalImpl(), (char*)theGUID.c_str());
337 else _corba_impl->SetGUID(aSO->GetCORBAImpl(), (char*)theGUID.c_str());
340 bool SALOMEDS_StudyBuilder::IsGUID(const _PTR(SObject)& theSO, const std::string& theGUID)
342 SALOMEDS_SObject* aSO = dynamic_cast<SALOMEDS_SObject*>(theSO.get());
345 SALOMEDS::Locker lock;
347 ret = _local_impl->IsGUID(aSO->GetLocalImpl(), (char*)theGUID.c_str());
349 else ret = _corba_impl->IsGUID(aSO->GetCORBAImpl(), (char*)theGUID.c_str());
354 void SALOMEDS_StudyBuilder::NewCommand()
357 SALOMEDS::Locker lock;
358 _local_impl->NewCommand();
360 else _corba_impl->NewCommand();
363 void SALOMEDS_StudyBuilder::CommitCommand()
366 SALOMEDS::Locker lock;
368 _local_impl->CommitCommand();
371 throw SALOMEDS::StudyBuilder::LockProtection();
374 else _corba_impl->CommitCommand();
377 bool SALOMEDS_StudyBuilder::HasOpenCommand()
381 SALOMEDS::Locker lock;
382 ret = _local_impl->HasOpenCommand();
384 else ret = _corba_impl->HasOpenCommand();
388 void SALOMEDS_StudyBuilder::AbortCommand()
391 SALOMEDS::Locker lock;
392 _local_impl->AbortCommand();
394 else _corba_impl->AbortCommand();
397 void SALOMEDS_StudyBuilder::Undo()
400 SALOMEDS::Locker lock;
405 throw SALOMEDS::StudyBuilder::LockProtection();
408 else _corba_impl->Undo();
411 void SALOMEDS_StudyBuilder::Redo()
414 SALOMEDS::Locker lock;
419 throw SALOMEDS::StudyBuilder::LockProtection();
422 else _corba_impl->Redo();
425 bool SALOMEDS_StudyBuilder::GetAvailableUndos()
429 SALOMEDS::Locker lock;
430 ret = _local_impl->GetAvailableUndos();
432 else ret = _corba_impl->GetAvailableUndos();
436 bool SALOMEDS_StudyBuilder::GetAvailableRedos()
440 SALOMEDS::Locker lock;
441 ret = _local_impl->GetAvailableRedos();
443 else ret = _corba_impl->GetAvailableRedos();
447 int SALOMEDS_StudyBuilder::UndoLimit()
451 SALOMEDS::Locker lock;
452 aLimit = _local_impl->UndoLimit();
454 else aLimit = _corba_impl->UndoLimit();
458 void SALOMEDS_StudyBuilder::UndoLimit(int theLimit)
462 SALOMEDS::Locker lock;
464 _local_impl->UndoLimit(theLimit);
466 else _corba_impl->UndoLimit(theLimit);
469 void SALOMEDS_StudyBuilder::CheckLocked()
471 //There is only local part as CORBA part throws the correct exeception
473 SALOMEDS::Locker lock;
475 _local_impl->CheckLocked();
478 throw SALOMEDS::StudyBuilder::LockProtection();
483 void SALOMEDS_StudyBuilder::SetName(const _PTR(SObject)& theSO, const std::string& theValue)
485 SALOMEDS_SObject* aSO = dynamic_cast<SALOMEDS_SObject*>(theSO.get());
488 SALOMEDS::Locker lock;
490 _local_impl->SetName(aSO->GetLocalImpl(), (char*)theValue.c_str());
492 else _corba_impl->SetName(aSO->GetCORBAImpl(), (char*)theValue.c_str());
495 void SALOMEDS_StudyBuilder::SetComment(const _PTR(SObject)& theSO, const std::string& theValue)
497 SALOMEDS_SObject* aSO = dynamic_cast<SALOMEDS_SObject*>(theSO.get());
500 SALOMEDS::Locker lock;
502 _local_impl->SetComment(aSO->GetLocalImpl(), (char*)theValue.c_str());
504 else _corba_impl->SetComment(aSO->GetCORBAImpl(), (char*)theValue.c_str());
507 void SALOMEDS_StudyBuilder::SetIOR(const _PTR(SObject)& theSO, const std::string& theValue)
509 SALOMEDS_SObject* aSO = dynamic_cast<SALOMEDS_SObject*>(theSO.get());
512 SALOMEDS::Locker lock;
514 _local_impl->SetIOR(aSO->GetLocalImpl(), (char*)theValue.c_str());
516 else _corba_impl->SetIOR(aSO->GetCORBAImpl(), (char*)theValue.c_str());
519 SALOMEDS::StudyBuilder_ptr SALOMEDS_StudyBuilder::GetBuilder()
522 if(!CORBA::is_nil(_corba_impl)) return SALOMEDS::StudyBuilder::_duplicate(_corba_impl);
523 SALOMEDS_StudyBuilder_i* servant = new SALOMEDS_StudyBuilder_i(_local_impl, _orb);
524 SALOMEDS::StudyBuilder_var aBuilder = servant->StudyBuilder::_this();
525 _corba_impl = SALOMEDS::StudyBuilder::_duplicate(aBuilder);
526 return aBuilder._retn();
529 return SALOMEDS::StudyBuilder::_duplicate(_corba_impl);
531 return SALOMEDS::StudyBuilder::_nil();
534 void SALOMEDS_StudyBuilder::init_orb()
536 ORB_INIT &init = *SINGLETON_<ORB_INIT>::Instance();
537 ASSERT(SINGLETON_<ORB_INIT>::IsAlreadyExisting());