Salome HOME
CCAR: remove memory leaks in non local SALOMEDS
[modules/kernel.git] / src / SALOMEDS / SALOMEDS_StudyBuilder_i.cxx
1 //  Copyright (C) 2007-2008  CEA/DEN, EDF R&D, OPEN CASCADE
2 //
3 //  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 //  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
5 //
6 //  This library is free software; you can redistribute it and/or
7 //  modify it under the terms of the GNU Lesser General Public
8 //  License as published by the Free Software Foundation; either
9 //  version 2.1 of the License.
10 //
11 //  This library is distributed in the hope that it will be useful,
12 //  but WITHOUT ANY WARRANTY; without even the implied warranty of
13 //  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 //  Lesser General Public License for more details.
15 //
16 //  You should have received a copy of the GNU Lesser General Public
17 //  License along with this library; if not, write to the Free Software
18 //  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
19 //
20 //  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
21 //
22 //  File   : SALOMEDS_StudyBuilder_i.cxx
23 //  Author : Seregy RUIN
24 //  Module : SALOME
25 //
26 #include "utilities.h"
27 #include "SALOMEDS_StudyBuilder_i.hxx"
28 #include "SALOMEDS_Study_i.hxx"
29 #include "SALOMEDS_SObject_i.hxx"
30 #include "SALOMEDS_SComponent_i.hxx"
31 #include "SALOMEDS_GenericAttribute_i.hxx"
32 #include "SALOMEDS_Driver_i.hxx"
33 #include "SALOMEDS.hxx"
34
35 #include "SALOMEDSImpl_Study.hxx"
36 #include "SALOMEDSImpl_SObject.hxx"
37 #include "SALOMEDSImpl_SComponent.hxx"
38
39 #include "Utils_CorbaException.hxx"
40 #include "Utils_ExceptHandlers.hxx"
41
42 #include <DF_Attribute.hxx>
43 #include <DF_Document.hxx>
44 #include <stdlib.h> 
45
46 using namespace std;
47
48 UNEXPECT_CATCH(SBSalomeException, SALOME::SALOME_Exception);
49 UNEXPECT_CATCH(SBLockProtection, SALOMEDS::StudyBuilder::LockProtection);
50
51 //============================================================================
52 /*! Function : constructor
53  *  Purpose  :
54  */
55 //============================================================================
56 SALOMEDS_StudyBuilder_i::SALOMEDS_StudyBuilder_i(SALOMEDSImpl_StudyBuilder* theImpl, 
57                                                  CORBA::ORB_ptr orb) 
58 {
59   _orb = CORBA::ORB::_duplicate(orb);
60   _impl = theImpl;
61 }
62
63 //============================================================================
64 /*! Function : destructor
65  *  Purpose  :
66  */
67 //============================================================================
68 SALOMEDS_StudyBuilder_i::~SALOMEDS_StudyBuilder_i()
69 {}
70
71 //============================================================================
72 /*! Function : NewComponent
73  *  Purpose  : Create a new component (Scomponent)
74  */
75 //============================================================================
76 SALOMEDS::SComponent_ptr SALOMEDS_StudyBuilder_i::NewComponent(const char* DataType)
77 {
78   SALOMEDS::Locker lock;
79   CheckLocked();
80   //char* aDataType = CORBA::string_dup(DataType);
81   SALOMEDSImpl_SComponent aSCO = _impl->NewComponent(string(DataType));
82   //CORBA::free_string(aDataType);
83   if(aSCO.IsNull()) return SALOMEDS::SComponent::_nil();
84
85   SALOMEDS::SComponent_var sco = SALOMEDS_SComponent_i::New (aSCO,_orb);
86   return sco._retn();
87 }
88
89 //============================================================================
90 /*! Function : DefineComponentInstance
91  *  Purpose  : Add IOR attribute of a Scomponent
92  */
93 //============================================================================
94 void SALOMEDS_StudyBuilder_i::DefineComponentInstance(SALOMEDS::SComponent_ptr aComponent,
95                                                       CORBA::Object_ptr IOR)
96 {
97   SALOMEDS::Locker lock;
98   CheckLocked();
99   CORBA::String_var anID=aComponent->GetID();
100   SALOMEDSImpl_SComponent aSCO = _impl->GetOwner()->GetSComponent(anID.in());
101
102   CORBA::String_var iorstr = _orb->object_to_string(IOR);
103   _impl->DefineComponentInstance(aSCO, (char*)iorstr.in());
104 }
105
106 //============================================================================
107 /*! Function : RemoveComponent
108  *  Purpose  : Delete a Scomponent
109  */
110 //============================================================================
111 void SALOMEDS_StudyBuilder_i::RemoveComponent(SALOMEDS::SComponent_ptr aComponent)
112 {
113   SALOMEDS::Locker lock;
114   CheckLocked();
115   ASSERT(!CORBA::is_nil(aComponent));
116   CORBA::String_var cid=aComponent->GetID();
117   SALOMEDSImpl_SComponent aSCO = _impl->GetOwner()->GetSComponent(cid.in());
118   _impl->RemoveComponent(aSCO);
119 }
120
121 //============================================================================
122 /*! Function : NewObject
123  *  Purpose  : Create a new SObject
124  */
125 //============================================================================
126 SALOMEDS::SObject_ptr SALOMEDS_StudyBuilder_i::NewObject(SALOMEDS::SObject_ptr theFatherObject)
127 {
128   SALOMEDS::Locker lock;
129   CheckLocked();
130   
131   SALOMEDSImpl_SObject aFO, aSO;
132   CORBA::String_var anID=theFatherObject->GetID();
133   aFO = _impl->GetOwner()->GetSObject(anID.in());
134   aSO = _impl->NewObject(aFO);
135   if(aSO.IsNull()) return SALOMEDS::SObject::_nil();
136   SALOMEDS::SObject_var so = SALOMEDS_SObject_i::New (aSO,_orb);
137
138   return so._retn();
139 }
140
141 //============================================================================
142 /*! Function : NewObjectToTag
143  *  Purpose  :
144  */
145 //============================================================================
146 SALOMEDS::SObject_ptr SALOMEDS_StudyBuilder_i::NewObjectToTag(SALOMEDS::SObject_ptr theFatherObject,
147                                                               CORBA::Long atag)
148 {
149   SALOMEDS::Locker lock;
150   CheckLocked();
151   SALOMEDSImpl_SObject aFO, aSO;
152   aFO = _impl->GetOwner()->GetSObject(theFatherObject->GetID());
153   aSO = _impl->NewObjectToTag(aFO, atag);
154   if(aSO.IsNull()) return SALOMEDS::SObject::_nil();
155   SALOMEDS::SObject_var so = SALOMEDS_SObject_i::New (aSO, _orb);
156   return so._retn();
157 }
158
159 //============================================================================
160 /*! Function : RemoveObject
161  *  Purpose  :
162  */
163 //============================================================================
164 void SALOMEDS_StudyBuilder_i::RemoveObject(SALOMEDS::SObject_ptr anObject)
165 {
166   SALOMEDS::Locker lock;
167   CheckLocked();
168   CORBA::String_var anID=anObject->GetID();
169   SALOMEDSImpl_SObject aSO = _impl->GetOwner()->GetSObject(anID.in());
170   _impl->RemoveObject(aSO);
171 }
172
173 //============================================================================
174 /*! Function : RemoveObjectWithChildren
175  *  Purpose  :
176  */
177 //============================================================================
178 void SALOMEDS_StudyBuilder_i::RemoveObjectWithChildren(SALOMEDS::SObject_ptr anObject)
179 {
180   SALOMEDS::Locker lock;
181   CheckLocked();
182   CORBA::String_var anID=anObject->GetID();
183   SALOMEDSImpl_SObject aSO = _impl->GetOwner()->GetSObject(anID.in());
184   _impl->RemoveObjectWithChildren(aSO);
185 }
186
187 //============================================================================
188 /*! Function : LoadWith
189  *  Purpose  : 
190  */
191 //============================================================================
192 void SALOMEDS_StudyBuilder_i::LoadWith(SALOMEDS::SComponent_ptr anSCO, 
193                                        SALOMEDS::Driver_ptr aDriver) throw(SALOME::SALOME_Exception)
194 {
195   SALOMEDS::Locker lock;
196   Unexpect aCatch(SBSalomeException);
197
198   CORBA::String_var anID=anSCO->GetID();
199   SALOMEDSImpl_SComponent aSCO = _impl->GetOwner()->GetSComponent(anID.in());
200   SALOMEDS_Driver_i* driver = new SALOMEDS_Driver_i(aDriver, _orb);
201   bool isDone = _impl->LoadWith(aSCO, driver); 
202   delete driver;
203
204   if(!isDone && _impl->IsError()) {
205     THROW_SALOME_CORBA_EXCEPTION(_impl->GetErrorCode().c_str(),SALOME::BAD_PARAM);
206   }
207 }
208
209
210 //============================================================================
211 /*! Function : Load
212  *  Purpose  : 
213  */
214 //============================================================================
215 void SALOMEDS_StudyBuilder_i::Load(SALOMEDS::SObject_ptr sco)
216 {
217   MESSAGE ( "This function is not yet implemented");
218 }
219
220 //============================================================================
221 /*! Function : FindOrCreateAttribute
222  *  Purpose  : Add attribute of given type to SObject, if there is attribute of such type, returns
223  *  existing one
224  */
225 //============================================================================
226 SALOMEDS::GenericAttribute_ptr SALOMEDS_StudyBuilder_i::FindOrCreateAttribute(SALOMEDS::SObject_ptr anObject, 
227                                                                               const char* aTypeOfAttribute)
228 {
229   SALOMEDS::Locker lock;
230   CORBA::String_var anID = anObject->GetID();
231   SALOMEDSImpl_SObject aSO = _impl->GetOwner()->GetSObject(anID.inout());
232   DF_Attribute* anAttr;
233   try {
234      anAttr = _impl->FindOrCreateAttribute(aSO, string(aTypeOfAttribute));
235   }
236   catch (...) {
237     throw SALOMEDS::StudyBuilder::LockProtection();
238   }
239
240   SALOMEDS::GenericAttribute_var anAttribute;
241   
242   if(anAttr)     
243      anAttribute = SALOMEDS_GenericAttribute_i::CreateAttribute(anAttr, _orb);
244
245   return anAttribute._retn();
246 }
247
248 //============================================================================
249 /*! Function : FindAttribute
250  *  Purpose  : Find attribute of given type assigned SObject, returns true if it is found
251  */
252 //============================================================================
253
254 CORBA::Boolean SALOMEDS_StudyBuilder_i::FindAttribute(SALOMEDS::SObject_ptr anObject, 
255                                                       SALOMEDS::GenericAttribute_out anAttribute, 
256                                                       const char* aTypeOfAttribute)
257 {
258   SALOMEDS::Locker lock;
259   ASSERT(!CORBA::is_nil(anObject));
260   CORBA::String_var anID = anObject->GetID();
261   SALOMEDSImpl_SObject aSO = _impl->GetOwner()->GetSObject(anID.in());
262   DF_Attribute* anAttr;
263
264   if(!_impl->FindAttribute(aSO, anAttr, string(aTypeOfAttribute))) return false;
265     
266   anAttribute = SALOMEDS_GenericAttribute_i::CreateAttribute(anAttr, _orb);
267   return true;  
268 }
269
270 //============================================================================
271 /*! Function : RemoveAttribute
272  *  Purpose  : Remove attribute of given type assigned SObject
273  */
274 //============================================================================
275
276 void SALOMEDS_StudyBuilder_i::RemoveAttribute(SALOMEDS::SObject_ptr anObject, 
277                                               const char* aTypeOfAttribute)
278 {
279   SALOMEDS::Locker lock;
280   CheckLocked();
281   ASSERT(!CORBA::is_nil(anObject));
282   CORBA::String_var anID = anObject->GetID();
283   SALOMEDSImpl_SObject aSO = _impl->GetOwner()->GetSObject(anID.in());
284   _impl->RemoveAttribute(aSO, string(aTypeOfAttribute));
285 }
286
287 //============================================================================
288 /*! Function : Addreference
289  *  Purpose  : 
290  */
291 //============================================================================
292 void SALOMEDS_StudyBuilder_i::Addreference(SALOMEDS::SObject_ptr me, 
293                                            SALOMEDS::SObject_ptr theReferencedObject)
294 {
295   SALOMEDS::Locker lock;
296   CheckLocked();
297   ASSERT(!CORBA::is_nil(me));
298   ASSERT(!CORBA::is_nil(theReferencedObject));
299  
300   SALOMEDSImpl_SObject aSO, aRefSO;
301   CORBA::String_var anID = me->GetID();
302   aSO = _impl->GetOwner()->GetSObject(anID.in());
303   anID=theReferencedObject->GetID();
304   aRefSO = _impl->GetOwner()->GetSObject(anID.in());
305   _impl->Addreference(aSO, aRefSO);
306 }
307
308 //============================================================================
309 /*! Function : RemoveReference
310  *  Purpose  : 
311  */
312 //============================================================================
313 void SALOMEDS_StudyBuilder_i::RemoveReference(SALOMEDS::SObject_ptr me)
314 {
315   SALOMEDS::Locker lock;
316   CheckLocked();
317   ASSERT(!CORBA::is_nil(me));
318   CORBA::String_var anID = me->GetID();
319   SALOMEDSImpl_SObject aSO = _impl->GetOwner()->GetSObject(anID.in());
320   _impl->RemoveReference(aSO);
321 }
322
323
324 //============================================================================
325 /*! Function : AddDirectory
326  *  Purpose  : adds a new directory with a path = thePath
327  */
328 //============================================================================
329 void SALOMEDS_StudyBuilder_i::AddDirectory(const char* thePath) 
330 {
331   SALOMEDS::Locker lock;
332   CheckLocked();
333   if(thePath == NULL || strlen(thePath) == 0) throw SALOMEDS::Study::StudyInvalidDirectory();
334   if(!_impl->AddDirectory(string(thePath))) {
335     string anErrorCode = _impl->GetErrorCode();
336     if(anErrorCode == "StudyNameAlreadyUsed") throw SALOMEDS::Study::StudyNameAlreadyUsed(); 
337     if(anErrorCode == "StudyInvalidDirectory") throw SALOMEDS::Study::StudyInvalidDirectory(); 
338     if(anErrorCode == "StudyInvalidComponent") throw SALOMEDS::Study::StudyInvalidComponent();  
339   }
340 }
341
342
343 //============================================================================
344 /*! Function : SetGUID
345  *  Purpose  : 
346  */
347 //============================================================================
348 void SALOMEDS_StudyBuilder_i::SetGUID(SALOMEDS::SObject_ptr anObject, const char* theGUID)
349 {
350   SALOMEDS::Locker lock;
351   CheckLocked();
352   ASSERT(!CORBA::is_nil(anObject));
353   CORBA::String_var anID=anObject->GetID();
354   SALOMEDSImpl_SObject aSO = _impl->GetOwner()->GetSObject(anID.in());
355   _impl->SetGUID(aSO, string(theGUID));
356 }
357
358 //============================================================================
359 /*! Function : IsGUID
360  *  Purpose  : 
361  */
362 //============================================================================
363 bool SALOMEDS_StudyBuilder_i::IsGUID(SALOMEDS::SObject_ptr anObject, const char* theGUID)
364 {
365   SALOMEDS::Locker lock;
366   ASSERT(!CORBA::is_nil(anObject));
367   CORBA::String_var anID=anObject->GetID();
368   SALOMEDSImpl_SObject aSO = _impl->GetOwner()->GetSObject(anID.in());
369   return _impl->IsGUID(aSO, string(theGUID));
370 }
371
372
373 //============================================================================
374 /*! Function : NewCommand
375  *  Purpose  : 
376  */
377 //============================================================================
378 void SALOMEDS_StudyBuilder_i::NewCommand()
379 {
380   SALOMEDS::Locker lock;
381   _impl->NewCommand();
382 }
383
384 //============================================================================
385 /*! Function : CommitCommand
386  *  Purpose  : 
387  */
388 //============================================================================
389 void SALOMEDS_StudyBuilder_i::CommitCommand() throw (SALOMEDS::StudyBuilder::LockProtection)
390 {
391   SALOMEDS::Locker lock;
392   Unexpect aCatch(SBLockProtection);
393   try {
394     _impl->CommitCommand();
395   }
396   catch(...) {
397     MESSAGE("Locked document modification !!!");
398     throw SALOMEDS::StudyBuilder::LockProtection();
399   }
400 }
401
402 //============================================================================
403 /*! Function : HasOpenCommand
404  *  Purpose  : 
405  */
406 //============================================================================
407 CORBA::Boolean SALOMEDS_StudyBuilder_i::HasOpenCommand()
408 {
409   SALOMEDS::Locker lock;
410   return _impl->HasOpenCommand();
411 }
412
413 //============================================================================
414 /*! Function : AbortCommand
415  *  Purpose  : 
416  */
417 //============================================================================
418 void SALOMEDS_StudyBuilder_i::AbortCommand()
419 {
420   SALOMEDS::Locker lock;
421   _impl->AbortCommand();
422 }
423
424 //============================================================================
425 /*! Function : Undo
426  *  Purpose  : 
427  */
428 //============================================================================
429 void SALOMEDS_StudyBuilder_i::Undo() throw (SALOMEDS::StudyBuilder::LockProtection)
430 {
431   SALOMEDS::Locker lock;
432   Unexpect aCatch(SBLockProtection);
433   try {
434     _impl->Undo();
435   }
436   catch(...) {
437     MESSAGE("Locked document modification !!!");
438     throw SALOMEDS::StudyBuilder::LockProtection();
439   }
440 }
441
442 //============================================================================
443 /*! Function : Redo
444  *  Purpose  : 
445  */
446 //============================================================================
447 void SALOMEDS_StudyBuilder_i::Redo() throw (SALOMEDS::StudyBuilder::LockProtection)
448 {
449   SALOMEDS::Locker lock;
450   Unexpect aCatch(SBLockProtection);
451   try {
452     _impl->Redo();
453   }
454   catch(...) {
455     MESSAGE("Locked document modification !!!");
456     throw SALOMEDS::StudyBuilder::LockProtection();
457   }
458 }
459
460 //============================================================================
461 /*! Function : GetAvailableUndos
462  *  Purpose  : 
463  */
464 //============================================================================
465 CORBA::Boolean SALOMEDS_StudyBuilder_i::GetAvailableUndos()
466 {
467   SALOMEDS::Locker lock;
468   return _impl->GetAvailableUndos();
469 }
470
471 //============================================================================
472 /*! Function : GetAvailableRedos
473  *  Purpose  : 
474  */
475 //============================================================================
476 CORBA::Boolean  SALOMEDS_StudyBuilder_i::GetAvailableRedos()
477 {
478   SALOMEDS::Locker lock;
479   return _impl->GetAvailableRedos();
480 }
481
482 //============================================================================
483 /*! Function : UndoLimit
484  *  Purpose  : 
485  */
486 //============================================================================
487 CORBA::Long  SALOMEDS_StudyBuilder_i::UndoLimit()
488 {
489   SALOMEDS::Locker lock;
490   return _impl->UndoLimit();
491 }
492
493 //============================================================================
494 /*! Function : UndoLimit
495  *  Purpose  : 
496  */
497 //============================================================================
498 void  SALOMEDS_StudyBuilder_i::UndoLimit(CORBA::Long n)
499 {
500   SALOMEDS::Locker lock;
501   CheckLocked();
502   _impl->UndoLimit(n);
503 }
504
505 //============================================================================
506 /*! Function : CheckLocked
507  *  Purpose  : 
508  */
509 //============================================================================
510 void SALOMEDS_StudyBuilder_i::CheckLocked() throw (SALOMEDS::StudyBuilder::LockProtection) 
511 {
512   SALOMEDS::Locker lock;
513   Unexpect aCatch(SBLockProtection);
514   try {
515     _impl->CheckLocked();
516   }
517   catch(...) {
518     throw SALOMEDS::StudyBuilder::LockProtection();
519   }
520 }
521
522 //============================================================================
523 /*! Function : SetName
524  *  Purpose  : 
525  */
526 //============================================================================
527 void SALOMEDS_StudyBuilder_i::SetName(SALOMEDS::SObject_ptr theSO, const char* theValue)
528      throw(SALOMEDS::StudyBuilder::LockProtection)
529 {
530   SALOMEDS::Locker lock;
531   Unexpect aCatch(SBLockProtection);
532   CheckLocked();
533  
534   CORBA::String_var anID=theSO->GetID();
535   SALOMEDSImpl_SObject aSO = _impl->GetOwner()->GetSObject(anID.in());  
536   _impl->SetName(aSO, string(theValue));
537 }
538
539 //============================================================================
540 /*! Function : SetComment
541  *  Purpose  : 
542  */
543 //============================================================================
544 void SALOMEDS_StudyBuilder_i::SetComment(SALOMEDS::SObject_ptr theSO, const char* theValue)
545      throw(SALOMEDS::StudyBuilder::LockProtection)
546 {
547   SALOMEDS::Locker lock;
548   Unexpect aCatch(SBLockProtection);
549   CheckLocked();
550
551   CORBA::String_var anID=theSO->GetID();
552   SALOMEDSImpl_SObject aSO = _impl->GetOwner()->GetSObject(anID.in());  
553   _impl->SetComment(aSO, string(theValue));
554 }
555
556 //============================================================================
557 /*! Function : SetIOR
558  *  Purpose  : 
559  */
560 //============================================================================
561 void SALOMEDS_StudyBuilder_i::SetIOR(SALOMEDS::SObject_ptr theSO, const char* theValue)
562  throw(SALOMEDS::StudyBuilder::LockProtection)
563 {
564   SALOMEDS::Locker lock;
565   Unexpect aCatch(SBLockProtection);
566   CheckLocked();
567
568   CORBA::String_var anID=theSO->GetID();
569   SALOMEDSImpl_SObject aSO = _impl->GetOwner()->GetSObject(anID.in());  
570   _impl->SetIOR(aSO, string(theValue));
571 }