0026377: Passing Handle objects as arguments to functions as non-const reference...
[occt.git] / src / DDF / DDF_TransactionCommands.cxx
1 // Created by: DAUTRY Philippe
2 // Copyright (c) 1997-1999 Matra Datavision
3 // Copyright (c) 1999-2014 OPEN CASCADE SAS
4 //
5 // This file is part of Open CASCADE Technology software library.
6 //
7 // This library is free software; you can redistribute it and/or modify it under
8 // the terms of the GNU Lesser General Public License version 2.1 as published
9 // by the Free Software Foundation, with special exception defined in the file
10 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
11 // distribution for complete text of the license and disclaimer of any warranty.
12 //
13 // Alternatively, this file may be used under the terms of Open CASCADE
14 // commercial license or contractual agreement.
15
16 //              ---------------------------
17 // Version:     0.0
18 //Version       Date            Purpose
19 //              0.0     Sep 30 1997     Creation
20
21
22
23 #include <DDF.hxx>
24 #include <DDF_Data.hxx>
25 #include <DDF_Transaction.hxx>
26 #include <DDF_TransactionStack.hxx>
27
28 #include <Draw.hxx>
29 #include <Draw_Appli.hxx>
30 #include <Draw_Drawable3D.hxx>
31 #include <Draw_Interpretor.hxx>
32
33 #include <TDF_Data.hxx>
34 #include <TDF_Delta.hxx>
35 #include <TDF_Transaction.hxx>
36
37 static DDF_TransactionStack DDF_TStack;
38 static Handle(TDF_Delta)    DDF_LastDelta;
39
40 // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
41 // Transaction commands
42 // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
43
44
45
46 //=======================================================================
47 //function : OpenTran
48 //purpose  : Opens a transaction
49 //=======================================================================
50
51 static Standard_Integer OpenTran (Draw_Interpretor& di, 
52                                   Standard_Integer  n, 
53                                   const char**            a)
54 {
55   if (n < 2) return 1;
56
57   Handle(TDF_Data) DF;
58   if (DDF::GetDF (a[1], DF)) {
59     Handle(DDF_Transaction) tr = new DDF_Transaction(DF);
60     di<<"Open transaction # "<<tr->Open()<<" # "<<DF->Transaction()<<"\n";
61     DDF_TStack.Prepend(tr);
62   }
63   return 0;
64 }
65
66
67 //=======================================================================
68 //function : AbortTran
69 //purpose  : Aborts a transaction
70 //=======================================================================
71
72 static Standard_Integer AbortTran (Draw_Interpretor& di, 
73                                    Standard_Integer  n, 
74                                    const char**            a)
75
76   if (n < 2) return 1;
77
78   Handle(TDF_Data) DF;
79   if (DDF::GetDF (a[1], DF)) {
80     if (DF->Transaction () > 0) {
81       Handle(DDF_Transaction) tr = DDF_TStack.First();
82       di<<"Abort transaction # "<<tr->Transaction()<<" # "<<DF->Transaction()<<"\n";
83       tr->Abort();
84       DDF_TStack.RemoveFirst();
85     }
86     else {
87       di<<"DDF_BasicCommands::AbortTran - No more transaction to abort\n";
88     }
89   }
90   return 0;
91 }
92
93
94 //=======================================================================
95 //function : CommitTran
96 //purpose  : Commits a transaction
97 //=======================================================================
98
99 static Standard_Integer CommitTran (Draw_Interpretor& di, 
100                                     Standard_Integer  n, 
101                                     const char**            a)
102 {
103   if (n < 2) return 1;
104
105   Handle(TDF_Data) DF;
106   if (DDF::GetDF (a[1], DF)) {
107     if (DF->Transaction () > 0) {
108       Handle(DDF_Transaction) tr = DDF_TStack.First();
109       di<<"Commit transaction # "<<tr->Transaction()<<" # "<<DF->Transaction()<<"\n";
110       Standard_Boolean withDelta = Standard_False;
111       if (n > 2) withDelta = (Draw::Atoi(a[2]) != 0);
112       DDF_LastDelta = tr->Commit(withDelta);
113       DDF_TStack.RemoveFirst();
114     }
115     else {
116       di<<"DDF_BasicCommands::CommitTran - No more transaction to commit\n";
117     }
118   }
119   return 0;
120 }
121
122
123 //=======================================================================
124 //function : CurrentTran
125 //purpose  : Current transaction number.
126 //=======================================================================
127
128 static Standard_Integer CurrentTran (Draw_Interpretor& di, 
129                                      Standard_Integer  n, 
130                                      const char**            a)
131 {
132   if (n < 2) return 1;
133
134   Handle(TDF_Data) DF;
135   if (DDF::GetDF (a[1], DF)) {
136     di<<"# "<<DF->Transaction()<<"\n";
137     if (!DDF_TStack.IsEmpty())
138       if (DF->Transaction() != DDF_TStack.First()->Transaction())
139         di<<"Transaction object said # "<<DDF_TStack.First()->Transaction()<<"\n";
140   }
141   return 0;
142
143 }
144
145
146
147
148 // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
149 // Delta commands
150 // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
151
152
153
154 //=======================================================================
155 //function : Undo
156 //purpose  : Undo
157 //=======================================================================
158
159 static Standard_Integer Undo (Draw_Interpretor& di, 
160                               Standard_Integer  n, 
161                               const char**            a)
162
163   if (n < 2) return 1;
164
165   Handle(TDF_Data) DF;
166   if (DDF::GetDF (a[1], DF)) {
167     Standard_Boolean withDelta = Standard_False;
168     if (n > 2) withDelta = (Draw::Atoi(a[2]) != 0);
169     if (!DDF_LastDelta.IsNull()) {
170       if (DF->IsApplicable(DDF_LastDelta)) {
171         Handle(TDF_Delta) tmp = DF->Undo(DDF_LastDelta,withDelta);
172         DDF_LastDelta = tmp;
173       }
174       else {
175         di<<"Undo not applicable HERE and NOW.\n";
176         return 1;
177       }
178     }
179     else {
180       di<<"No undo to apply.\n";
181       return 1;
182     }
183   }
184   else {
185     di<<"Unknown DF.\n";
186     return 1;
187   }
188   return 0;
189 }
190
191
192 // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
193
194
195
196
197 //=======================================================================
198 //function : TransactionCommands
199 //purpose  : 
200 //=======================================================================
201
202 void DDF::TransactionCommands (Draw_Interpretor& theCommands) 
203 {
204   static Standard_Boolean done = Standard_False;
205   if (done) return;
206   done = Standard_True;
207
208   const char* g = "DF transaction and undo commands";
209
210   // Transaction :
211   // +++++++++++++
212   theCommands.Add
213     ("OpenTran",
214      "Opens a transaction on a DF: OpenTran dfname",
215      __FILE__, OpenTran, g);
216
217   theCommands.Add
218     ("AbortTran",
219      "Aborts a transaction on a DF: AbortTran dfname",
220      __FILE__, AbortTran, g);
221
222   theCommands.Add
223     ("CommitTran",
224      "Commits a transaction on a DF with/without delta generation : CommitTran dfname [withDelta]",
225      __FILE__, CommitTran, g);
226
227   theCommands.Add
228     ("CurrentTran",
229      "Returns the current transaction number on a DF : CurrentTran dfname",
230      __FILE__, CurrentTran, g);
231
232   // Undo :
233   // ++++++
234   theCommands.Add
235     ("DFUndo",
236      " Undos last DF commit modifications: Undo dfname [withDelta]",
237      __FILE__, Undo, g);
238
239
240 }