0024788: Foundation Classes - remove Dico_Dictionary
[occt.git] / src / IFSelect / IFSelect_SessionFile.cxx
CommitLineData
973c2be1 1// Copyright (c) 1999-2014 OPEN CASCADE SAS
b311480e 2//
973c2be1 3// This file is part of Open CASCADE Technology software library.
b311480e 4//
d5f74e42 5// This library is free software; you can redistribute it and/or modify it under
6// the terms of the GNU Lesser General Public License version 2.1 as published
973c2be1 7// by the Free Software Foundation, with special exception defined in the file
8// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
9// distribution for complete text of the license and disclaimer of any warranty.
b311480e 10//
973c2be1 11// Alternatively, this file may be used under the terms of Open CASCADE
12// commercial license or contractual agreement.
b311480e 13
42cf5bc1 14
7fd59977 15#include <IFSelect_BasicDumper.hxx>
42cf5bc1 16#include <IFSelect_Dispatch.hxx>
17#include <IFSelect_GeneralModifier.hxx>
7fd59977 18#include <IFSelect_IntParam.hxx>
42cf5bc1 19#include <IFSelect_Modifier.hxx>
7fd59977 20#include <IFSelect_SelectAnyList.hxx>
42cf5bc1 21#include <IFSelect_SelectAnyType.hxx>
22#include <IFSelect_SelectCombine.hxx>
23#include <IFSelect_SelectControl.hxx>
24#include <IFSelect_SelectDeduct.hxx>
25#include <IFSelect_SelectExtract.hxx>
26#include <IFSelect_Selection.hxx>
27#include <IFSelect_SessionDumper.hxx>
28#include <IFSelect_SessionFile.hxx>
c04c30b3 29#include <IFSelect_ShareOut.hxx>
7fd59977 30#include <IFSelect_Transformer.hxx>
42cf5bc1 31#include <IFSelect_WorkSession.hxx>
32#include <Interface_Macros.hxx>
33#include <Message.hxx>
34#include <Message_Messenger.hxx>
35#include <OSD_OpenFile.hxx>
36#include <Standard_Transient.hxx>
37#include <TCollection_AsciiString.hxx>
7fd59977 38#include <TCollection_HAsciiString.hxx>
39#include <TColStd_HSequenceOfInteger.hxx>
40
7fd59977 41#include <stdio.h>
7fd59977 42static int deja = 0;
43
44
45 IFSelect_SessionFile::IFSelect_SessionFile
46 (const Handle(IFSelect_WorkSession)& WS)
47{
48 ClearLines();
49 themode = Standard_False;
50 if (!deja) { // au moins celui-la :
51 Handle(IFSelect_BasicDumper) basedumper = new IFSelect_BasicDumper;
52 deja = 1;
53 }
54 thedone = Standard_False;
55 thelastgen = 0;
56 thesess = WS;
57}
58
59 IFSelect_SessionFile::IFSelect_SessionFile
60 (const Handle(IFSelect_WorkSession)& WS, const Standard_CString filename)
61{
62 ClearLines();
63 themode = Standard_True;
64 if (!deja) { // au moins celui-la :
65 Handle(IFSelect_BasicDumper) basedumper = new IFSelect_BasicDumper;
66 deja = 1;
67 }
68 thedone = Standard_False;
69 theownflag = Standard_False;
70 thelastgen = 0;
71 thesess = WS;
72 thedone = (Write (filename) == 0);
73// Close fait par Write (selon les cas)
74}
75
76
77 void IFSelect_SessionFile::ClearLines ()
78 { thelist.Clear(); thenl = 0; }
79
80 Standard_Integer IFSelect_SessionFile::NbLines () const
81 { return thelist.Length(); }
82
83
84 const TCollection_AsciiString& IFSelect_SessionFile::Line
85 (const Standard_Integer num) const
86 { return thelist.Value(num); }
87
88
89 void IFSelect_SessionFile::AddLine (const Standard_CString line)
90 { thelist.Append (TCollection_AsciiString(line) ); }
91
92 void IFSelect_SessionFile::RemoveLastLine ()
93 { if (thelist.Length() > 1) thelist.Remove(thelist.Length()); }
94
95
96 Standard_Boolean IFSelect_SessionFile::WriteFile
97 (const Standard_CString filename)
98{
94708556 99 FILE* lefic = OSD_OpenFile(filename,"w");
7fd59977 100 Standard_Integer nbl = thelist.Length();
101 for (Standard_Integer i = 1; i <= nbl; i ++)
102 fprintf (lefic,"%s\n",thelist.Value(i).ToCString());
103 fclose ( lefic );
104 ClearLines();
105 return Standard_True;
106}
107
108 Standard_Boolean IFSelect_SessionFile::ReadFile
109 (const Standard_CString filename)
110{
111 char ligne[201];
94708556 112 FILE* lefic = OSD_OpenFile(filename,"r");
7fd59977 113 if (!lefic) return Standard_False;
114 ClearLines();
115// read mode : lire les lignes
116// On charge le fichier dans "thelist"
117 Standard_Boolean header = Standard_False;
302f96fb 118 for(;;) {
7fd59977 119 ligne[0] = '\0';
98160038 120 if (fgets(ligne,200,lefic) == NULL
121 || feof(lefic) != 0)
122 {
123 break;
124 }
7fd59977 125 if (ligne[0] == '\0') continue;
126// D abord ligne initiale ?
127 if (!header)
128 { if (!RecognizeFile(ligne)) break; header = Standard_True; }
129 ligne[200] = '\0'; // fin forcee ...
130 TCollection_AsciiString onemore(ligne);
131 thelist.Append(onemore);
132 }
133 fclose ( lefic );
134 return header;
135}
136
137 Standard_Boolean IFSelect_SessionFile::RecognizeFile
138 (const Standard_CString headerline)
139{
140 Handle(Message_Messenger) sout = Message::DefaultMessenger();
141
142 SplitLine (headerline);
143 if (theline.Length() != 4) { sout<<"File Form Incorrect"<<endl; return Standard_False; }
144 Handle(Standard_Type) sesstype = thesess->DynamicType();
145 if (!theline.Value(1).IsEqual("!XSTEP") ||
146 !theline.Value(2).IsEqual("SESSION") ||
147 !theline.Value(4).IsEqual(sesstype->Name()) )
148 { sout<<"Lineno."<<thenl<<" : File Header Description Incorrect"<<endl; return Standard_False; }
149// Value(3) definit la VERSION du format de fichier
150 return Standard_True;
151}
152
153
154 Standard_Integer IFSelect_SessionFile::Write
155 (const Standard_CString filename)
156{
157 thenewnum = 0;
158 Standard_Integer stat = WriteSession();
159 if (stat != 0) return stat;
160 stat = WriteEnd();
161 if (stat != 0) return stat;
162 return (WriteFile(filename) ? 0 : -1);
163}
164
165 Standard_Integer IFSelect_SessionFile::Read
166 (const Standard_CString filename)
167{
168 if (!ReadFile(filename)) return -1;
169 thenewnum = 0;
170 Standard_Integer stat = ReadSession();
171 if (stat != 0) return stat;
172 stat = ReadEnd();
173 return stat;
174}
175
176
177// ##################################################################
178// ######## WriteSession : Ecriture du contenu ########
179
180 Standard_Integer IFSelect_SessionFile::WriteSession ()
181{
182 char laligne[200];
183 thedone = Standard_True;
184// ... Preparation Specifique
997e128f 185 thenames.Clear();
7fd59977 186 Standard_Integer nbidents = thesess->MaxIdent();
187 thenums = new TColStd_HArray1OfInteger (0,nbidents); thenums->Init(0);
188 Standard_Integer i; // svv Jan11 2000 : porting on DEC
189 for ( i = 1; i <= nbidents; i ++) {
190 Handle(Standard_Transient) item = thesess->Item(i);
191 if (!item.IsNull()) thenums->SetValue(i,-1);
192 }
193
194// ... ECRITURE
195 sprintf (laligne,"!XSTEP SESSION V1 %s",thesess->DynamicType()->Name());
196 WriteLine(laligne,'\n');
197 sprintf (laligne,"!GENERALS");
198 WriteLine(laligne,'\n');
199 sprintf (laligne,"ErrorHandle %d", (thesess->ErrorHandle() ? 1 : 0));
200 WriteLine(laligne,'\n');
201 Handle(TColStd_HSequenceOfInteger) idents;
202 Standard_Integer nb;
203 Handle(TCollection_HAsciiString) name;
204
205 idents = thesess->ItemIdents(STANDARD_TYPE(IFSelect_IntParam));
206 nb = idents->Length();
207 if (nb > 0) WriteLine ("!INTEGERS",'\n');
208 Standard_Integer j; // svv Jan11 2000 : porting on DEC
209 for (j = 1; j <= nb; j ++) {
210 i = idents->Value(j);
211 Handle(IFSelect_IntParam) P = thesess->IntParam(i);
212 name = thesess->Name(P);
213 if (name.IsNull()) {
214 thenewnum ++; idents->SetValue(i,thenewnum);
215 sprintf(laligne," #%d %d",thenewnum,P->Value());
216 }
217 else sprintf(laligne," %s %d",name->ToCString(),P->Value());
218 WriteLine(laligne,'\n');
219 }
220
221 idents = thesess->ItemIdents(STANDARD_TYPE(TCollection_HAsciiString));
222 nb = idents->Length();
223 if (nb > 0) WriteLine ("!TEXTS",'\n');
224 for (j = 1; j <= nb; j ++) {
225 i = idents->Value(j);
226 Handle(TCollection_HAsciiString) P = thesess->TextParam(i);
227 name = thesess->Name(P);
228 if (name.IsNull()) {
229 thenewnum ++; thenums->SetValue(i,thenewnum);
230 sprintf(laligne," #%d %s",thenewnum,P->ToCString());
231 }
232 else sprintf(laligne," %s %s",name->ToCString(),P->ToCString());
233 WriteLine(laligne,'\n');
234 }
235
236 idents = thesess->ItemIdents(STANDARD_TYPE(IFSelect_Selection));
237 nb = idents->Length();
238 if (nb > 0) WriteLine ("!SELECTIONS",'\n');
239 for (j = 1; j <= nb; j ++) {
240 i = idents->Value(j);
241 Handle(IFSelect_Selection) P = thesess->Selection(i);
242 NewItem (i,P);
243// .. Ecritures particulieres
244// -> Traiter les principaux sous-types : Extract,AnyList,AnyType
245 DeclareAndCast(IFSelect_SelectExtract,sxt,P);
246 if (!sxt.IsNull()) {
247 sprintf(laligne," %c", (sxt->IsDirect() ? 'D' : 'R'));
248 WriteLine(laligne);
249 }
250 DeclareAndCast(IFSelect_SelectAnyList,sli,P);
251 if (!sli.IsNull()) {
252 SetOwn(Standard_False);
253 WriteLine(" LIST");
254 SendItem(sli->Lower());
255 SendItem(sli->Upper());
256 SetOwn(Standard_True);
257 }
258// .. Ecritures specifiques selon dumpers
259 WriteOwn(P);
260 WriteLine("",'\n');
261 }
262
263 SetOwn(Standard_False);
264 if (nb > 0) WriteLine ("!SOURCES",'\n');
265 for (j = 1; j <= nb; j ++) {
266 i = idents->Value(j);
267 Handle(IFSelect_Selection) P = thesess->Selection(i);
268 Standard_Integer nbs = thesess->NbSources(P);
269 if (nbs == 0) continue;
270 name = thesess->Name(P);
271 if (name.IsNull()) sprintf(laligne," #%d %d",thenums->Value(i),nbs);
272 else sprintf(laligne," %s %d",name->ToCString(),nbs);
273 WriteLine(laligne);
274 for (Standard_Integer k = 1; k <= nbs; k ++)
275 SendItem (thesess->Source(P,k));
276 WriteLine("",'\n');
277 }
278
279 idents = thesess->ItemIdents(STANDARD_TYPE(IFSelect_GeneralModifier));
280 nb = idents->Length();
281 if (nb > 0) WriteLine ("!MODIFIERS",'\n');
282 for (j = 1; j <= nb; j ++) {
283// Description de base des Modifiers, donc sans Selection ni Dispatch-Rank
284 i = idents->Value(j);
285 Handle(IFSelect_GeneralModifier) P = thesess->GeneralModifier(i);
286 NewItem (i,P);
287 SetOwn(Standard_True);
288// .. Ecritures specifiques selon dumpers
289 WriteOwn(P);
290 WriteLine("",'\n');
291 }
292
293 idents = thesess->ItemIdents(STANDARD_TYPE(IFSelect_Transformer));
294 nb = idents->Length();
295 if (nb > 0) WriteLine ("!TRANSFORMERS",'\n');
296 for (j = 1; j <= nb; j ++) {
297// Description des Transformers
298 i = idents->Value(j);
299 Handle(IFSelect_Transformer) P = thesess->Transformer(i);
300 NewItem (i,P);
301 SetOwn(Standard_True);
302// .. Ecritures specifiques selon dumpers
303 WriteOwn(P);
304 WriteLine("",'\n');
305 }
306
307 SetOwn(Standard_False);
308 idents = thesess->ItemIdents(STANDARD_TYPE(IFSelect_Dispatch));
309 nb = idents->Length();
310 if (nb > 0) WriteLine ("!DISPATCHES",'\n');
311 for (j = 1; j <= nb; j ++) {
312 i = idents->Value(j);
313 Handle(IFSelect_Dispatch) P = thesess->Dispatch(i);
314 NewItem (i,P);
315// .. Final Selection
316 SetOwn(Standard_False);
317 SendItem(P->FinalSelection());
318 SetOwn(Standard_True);
319// .. Ecritures specifiques selon dumpers
320 WriteOwn(P);
321 WriteLine("",'\n');
322 }
323
324 WriteLine ("!FILENAMING");
325 SetOwn(Standard_False);
326 Handle(TCollection_HAsciiString) namingpart = thesess->FilePrefix();
327 if (namingpart->IsEmpty()) namingpart.Nullify();
328 if (namingpart.IsNull()) SendVoid();
329 else SendText(namingpart->ToCString());
330 namingpart = thesess->DefaultFileRoot();
331 if (namingpart->IsEmpty()) namingpart.Nullify();
332 if (namingpart.IsNull()) SendVoid();
333 else SendText(namingpart->ToCString());
334 namingpart = thesess->FileExtension();
335 if (namingpart->IsEmpty()) namingpart.Nullify();
336 if (namingpart.IsNull()) SendVoid();
337 else SendText(namingpart->ToCString());
338 WriteLine("",'\n');
339
340 for (j = 1; j <= nb; j ++) {
341 i = idents->Value(j);
342 Handle(IFSelect_Dispatch) P = thesess->Dispatch(i);
343 if (!P->HasRootName()) continue;
344 namingpart = P->RootName();
345 SetOwn(Standard_False);
346 SendItem(P);
347 sprintf(laligne," %s",namingpart->ToCString());
348 WriteLine(laligne,' ');
349 WriteLine("",'\n');
350 }
351
352// Pour les Modifiers, ATTENTION car il faut respecter l ORDRE effectif
353// Or il y a deux listes : Model Modifiers; File Modifiers
354// Les Modifiers eux-memes ont deja ete ecrits
355// Ici, on ecrit simplement leur utilisation dans l envoi final
356 for (Standard_Integer formod = 1; formod >= 0; formod --) {
357 idents = thesess->FinalModifierIdents((formod > 0)); // donnes dans l ordre d application
358 nb = idents->Length();
359 if (nb == 0) continue;
360 if (formod > 0) WriteLine ("!MODELMODIFIERS",'\n');
361 else WriteLine ("!FILEMODIFIERS",'\n');
362 for (j = 1; j <= nb; j ++) {
363 i = idents->Value(j);
364 Handle(IFSelect_GeneralModifier) P = thesess->GeneralModifier(i);
365 SetOwn(Standard_False);
366 SendItem(P);
367 // .. Parametres Generaux (les specifiques ont deja ete envoyes)
368 SendItem(P->Selection());
369 SendItem(P->Dispatch());
370 WriteLine("",'\n');
371 }
372 }
373
374// ... Conclusion
375 theline.Clear();
376 return 0;
377}
378
379 Standard_Integer IFSelect_SessionFile::WriteEnd ()
380{
381 WriteLine("!XSTEP END",'\n'); // sinon, cf sous-types de SessionFile ...
382 return 0;
383}
384
385
386 void IFSelect_SessionFile::WriteLine
387 (const Standard_CString line, const Standard_Character follow)
388{
389 if (line[0] != '\0') thebuff.AssignCat (line);
390 if (follow == '\0') return;
391 if (follow != '\n') thebuff.AssignCat(follow);
392 else {
393 thelist.Append(thebuff);
394 thebuff.Clear();
395 thenl ++;
396 }
397}
398
399 Standard_Boolean IFSelect_SessionFile::WriteOwn
400 (const Handle(Standard_Transient)& item)
401{
402 if (item.IsNull()) return Standard_False;
403 SetOwn(Standard_True);
404 Handle(IFSelect_SessionDumper) dumper = IFSelect_SessionDumper::First();
405 while (!dumper.IsNull()) {
406 if (dumper->WriteOwn(*this,item)) break;
407 dumper = dumper->Next();
408 }
409 SetOwn(Standard_False);
410 return (!dumper.IsNull()); // IsNull -> echec
411}
412
413
414
415// ##################################################################
416// ######## ReadSession : Lecture du contenu ########
417
418 Standard_Integer IFSelect_SessionFile::ReadSession ()
419{
420 Handle(Message_Messenger) sout = Message::DefaultMessenger();
421
422 thedone = Standard_True;
423// ... Preparation Specifique
424 thenums.Nullify();
997e128f 425 thenames.Clear();
7fd59977 426// .. Donnees generales, controle
427 if (!ReadLine()) return 1;
428 if (theline.Length() != 4) { sout<<"File Form Incorrect"<<endl; return 1; }
429 Handle(Standard_Type) sesstype = thesess->DynamicType();
430 if (!theline.Value(1).IsEqual("!XSTEP") ||
431 !theline.Value(2).IsEqual("SESSION") ||
432 !theline.Value(4).IsEqual(sesstype->Name()) )
433 { sout<<"Lineno."<<thenl<<" : File Header Description Incorrect"<<endl; return 1; }
434// Value(3) definit la VERSION du format de fichier
435 if (!ReadLine()) return 1;
436
437// .. Parametres Generaux
438 Standard_Integer rubr =
439 (theline.Length() == 1 && theline.Value(1).IsEqual("!GENERALS"));
440 while (rubr) {
441 if (!ReadLine()) return 1;
442 if (theline.Length() == 0) continue;
443 const TCollection_AsciiString& ungen = theline.Value(1);
444 if (ungen.Value(1) == '!') break; // fin des generaux
445 if (ungen.IsEqual("ErrorHandle")) {
446 if (theline.Length() != 2)
447 { sout<<"Lineno."<<thenl<<" : ErrorHandle Description Incorrect"<<endl; continue; }
448 if (theline.Value(2).IsEqual("0"))
449 thesess->SetErrorHandle(Standard_False);
450 else if (theline.Value(2).IsEqual("1"))
451 thesess->SetErrorHandle(Standard_True);
452 else { sout<<"Lineno."<<thenl<<" : ErrorHandle Incorrect : "<<theline.Value(2)<<endl; continue; }
453 continue;
454 }
455 else sout<<"Lineno."<<thenl<<" : Unknown General Parameter : "<<ungen<<" , ignored"<<endl;
456 }
457
458// .. IntParams
459// deja fait if (!ReadLine()) return 1;
460 rubr = (theline.Length() == 1 && theline.Value(1).IsEqual("!INTEGERS"));
461 while (rubr) {
462 if (!ReadLine()) return 1;
463 if (theline.Value(1).Value(1) == '!') break; // liste suivante
464 if (theline.Length() != 2)
465 { sout<<"Lineno."<<thenl<<" : An Integer Parameter is badly defined"<<endl; continue; }
466 Handle(IFSelect_IntParam) par = new IFSelect_IntParam;
467 par->SetValue ( atoi(theline.Value(2).ToCString()) );
468 AddItem (par);
469 }
470
471// .. TextParams (ligne de garde deja lue)
472 rubr = (theline.Length() == 1 && theline.Value(1).IsEqual("!TEXTS"));
473 while (rubr) {
474 if (!ReadLine()) return 1;
475 if (theline.Value(1).Value(1) == '!') break; // liste suivante
476 if (theline.Length() != 2)
477 { sout<<"Lineno."<<thenl<<" : A Text Parameter is badly defined"<<endl; continue; }
478// Attention, un texte peut contenir des blancs ... repartir de line(thenl)
479 TCollection_AsciiString oneline = thelist.Value(thenl);
480 Standard_Integer iw = 0, inc = 0;
481 for (Standard_Integer ic = 1; ic <= oneline.Length(); ic ++) {
482 char unc = oneline.Value(1);
483 inc = ic;
484 if (unc == ' ') iw = 1;
485 else if (iw > 0) break;
486 }
487 oneline.Remove (1,inc);
488 AddItem ( new TCollection_HAsciiString (oneline.ToCString()) );
489 }
490
491// .. Selections (ligne de garde deja lue)
492 rubr = (theline.Length() == 1 && theline.Value(1).IsEqual("!SELECTIONS"));
493 while (rubr) {
494 if (!ReadLine()) return 1;
495 if (theline.Value(1).Value(1) == '!') break; // liste suivante
496 if (theline.Length() < 2)
497 { sout<<"Lineno."<<thenl<<" : A Selection is badly defined"<<endl; continue; }
498// .. Analyse de certains cas generaux
499 Handle(IFSelect_IntParam) low,up;
500 Standard_Integer firstown = 3;
501 Standard_Integer direct = 0;
502 Standard_Integer numlist = 0;
503 if (theline.Length() > 2) {
504 if (theline.Value(3).IsEqual("D")) direct = 1;
505 else if (theline.Value(3).IsEqual("R")) direct = -1;
506 if (direct != 0) firstown ++;
507 if (firstown+2 <= theline.Length()) {
508 if (theline.Value(firstown).IsEqual("LIST")) {
509 numlist = firstown; firstown += 3;
510 low = GetCasted(IFSelect_IntParam,ItemValue(numlist+1));
511 up = GetCasted(IFSelect_IntParam,ItemValue(numlist+2));
512 }
513 }
514 SetLastGeneral (firstown-1);
515 }
516 Handle(Standard_Transient) item; // a fournir ...
517 ReadOwn(item);
518 if (item.IsNull()) continue;
519 DeclareAndCast(IFSelect_SelectExtract,sxt,item);
520 if (!sxt.IsNull()) {
521 if (direct == 0) sout<<"Lineno."<<thenl<<" : A SelectExtract is badly defined"<<endl;
522 else sxt->SetDirect( (direct > 0) );
523 }
524 DeclareAndCast(IFSelect_SelectAnyList,sli,item);
525 if (!sli.IsNull()) {
526 if (numlist == 0) sout<<"Lineno."<<thenl<<" : A SelectAnyList is badly defined"<<endl;
527 else sli->SetRange(low,up);
528 }
529 AddItem(item);
530 }
531
532// .. Sources
533 rubr = (theline.Length() == 1 && theline.Value(1).IsEqual("!SOURCES"));
534 while (rubr) {
535 if (!ReadLine()) return 1;
536 if (theline.Value(1).Value(1) == '!') break; // liste suivante
537 if (theline.Length() < 3)
538 { sout<<"Lineno."<<thenl<<" : A Selection Source List is badly defined"<<endl; continue; }
539 DeclareAndCast(IFSelect_Selection,sel,ItemValue(1));
540 if (sel.IsNull())
541 { sout<<"Lineno."<<thenl<<" : A Source List is not for a Selection"<<endl; continue; }
542 Standard_Integer nbs = atoi(theline.Value(2).ToCString());
543// .. Differents cas reconnus
544 DeclareAndCast(IFSelect_SelectExtract,sxt,sel);
545 if (!sxt.IsNull()) {
546 if (nbs > 1)
547 sout<<"Lineno."<<thenl<<" : SelectExtract, more than one source, followings ignored"<<endl;
548 DeclareAndCast(IFSelect_Selection,source,ItemValue(3));
549 sxt->SetInput(source);
550 }
551 DeclareAndCast(IFSelect_SelectDeduct,sdt,sel);
552 if (!sdt.IsNull()) {
553 if (nbs > 1)
554 sout<<"Lineno."<<thenl<<" : SelectDeduct, more than one source, followings ignored"<<endl;
555 sdt->SetInput(GetCasted(IFSelect_Selection,ItemValue(3)));
556 }
557 DeclareAndCast(IFSelect_SelectControl,sct,sel);
558 if (!sct.IsNull()) {
559 if (nbs != 2)
560 sout<<"Lineno."<<thenl<<" : SelectControl, not two sources, followings ignored"<<endl;
561 sct->SetMainInput (GetCasted(IFSelect_Selection,ItemValue(3)));
562 sct->SetSecondInput (GetCasted(IFSelect_Selection,ItemValue(4)));
563 }
564 DeclareAndCast(IFSelect_SelectCombine,sco,sel);
565 if (!sco.IsNull()) {
566 for (Standard_Integer j = 1; j <= nbs; j ++)
567 sco->Add(GetCasted(IFSelect_Selection,ItemValue(j+2)));
568 }
569 }
570
571// ... Modifiers en tout genre
572 rubr = (theline.Length() == 1 && theline.Value(1).IsEqual("!MODIFIERS"));
573 while (rubr) {
574 if (!ReadLine()) return 1;
575 if (theline.Value(1).Value(1) == '!') break; // liste suivante
576 if (theline.Length() < 2)
577 { sout<<"Lineno."<<thenl<<" : A Modifier is badly defined"<<endl; continue; }
578 Handle(Standard_Transient) item; // a fournir ...
579 ReadOwn(item);
580 if (item.IsNull()) continue;
581 DeclareAndCast(IFSelect_GeneralModifier,modif,item);
582 if (modif.IsNull())
583 { sout<<"Lineno."<<thenl<<" : A Modifier has not been Recognized"<<endl; continue; }
584 AddItem(modif,Standard_False); // active plus tard
585 }
586
587// ... Transformers
588 rubr = (theline.Length() == 1 && theline.Value(1).IsEqual("!TRANSFORMERS"));
589 while (rubr) {
590 if (!ReadLine()) return 1;
591 if (theline.Value(1).Value(1) == '!') break; // liste suivante
592 if (theline.Length() < 2)
593 { sout<<"Lineno."<<thenl<<" : A Transformer is badly defined"<<endl; continue; }
594 Handle(Standard_Transient) item; // a fournir ...
595 ReadOwn(item);
596 if (item.IsNull()) continue;
597 DeclareAndCast(IFSelect_Transformer,trf,item);
598 if (trf.IsNull())
599 { sout<<"Lineno."<<thenl<<" : A Transformer has not been Recognized"<<endl; continue; }
600 AddItem(trf,Standard_False); // active plus tard
601 }
602
603// ... Dispatches (ligne de garde deja lue)
604 rubr = (theline.Length() == 1 && theline.Value(1).IsEqual("!DISPATCHES"));
605 while (rubr) {
606 if (!ReadLine()) return 1;
607 if (theline.Value(1).Value(1) == '!') break; // liste suivante
608 if (theline.Length() < 3)
609 { sout<<"Lineno."<<thenl<<" : A Dispatch is badly defined"<<endl; continue; }
610 DeclareAndCast(IFSelect_Selection,input,ItemValue(3));
611 SetLastGeneral(3);
612 Handle(Standard_Transient) item; // a fournir ...
613 ReadOwn(item);
614 if (item.IsNull()) continue;
615 DeclareAndCast(IFSelect_Dispatch,disp,item);
616 if (disp.IsNull())
617 { sout<<"Lineno."<<thenl<<" : A Dispatch has not been Recognized"<<endl; continue; }
618 AddItem(disp);
619 thesess->SetItemSelection(disp,input);
620 }
621
622// ... FileNaming (ligne de garde deja lue)
623// .. Modifiers deja lus et charges
624 rubr = (theline.Length() == 4 && theline.Value(1).IsEqual("!FILENAMING"));
625 if (rubr) {
626 if (!IsVoid(2)) thesess->SetFilePrefix (TextValue(2).ToCString());
627 if (!IsVoid(3)) thesess->SetDefaultFileRoot (TextValue(3).ToCString());
628 if (!IsVoid(4)) thesess->SetFileExtension (TextValue(4).ToCString());
629 }
630 while (rubr) {
631 if (!ReadLine()) return 1;
632 if (theline.Value(1).Value(1) == '!') break; // liste suivante
633 if (theline.Length() != 2)
634 { sout<<"Lineno."<<thenl<<" : A File Root is badly defined"<<endl; continue; }
635 DeclareAndCast(IFSelect_Dispatch,disp,ItemValue(1));
636 thesess->SetFileRoot (disp,theline.Value(2).ToCString());
637 }
638
639// ... Modifiers (ligne de garde deja lue)
640// ... Attention, deux listes (MODELMODIFIERS et FILEMODIFIERS)
641 for (Standard_Integer formod = 1; formod >= 0; formod --) {
642 rubr = (theline.Length() == 1 &&
643 ( (formod == 1 && theline.Value(1).IsEqual("!MODELMODIFIERS")) ||
644 (formod == 0 && theline.Value(1).IsEqual("!FILEMODIFIERS")) ) );
645// if ( formod == 1 && ( theline.Length() != 1 ||
646// !theline.Value(1).IsEqual("!MODELMODIFIERS")) )
647// { sout<<"Lineno."<<thenl<<" : Model Modifier List Incorrect"<<endl; return 1; }
648// if ( formod == 0 && ( theline.Length() != 1 ||
649// !theline.Value(1).IsEqual("!FILEMODIFIERS")) )
650// { sout<<"Lineno."<<thenl<<" : File Modifier List Incorrect"<<endl; return 1; }
651 while (rubr) {
652 if (!ReadLine()) return 1;
653 if (theline.Value(1).Value(1) == '!') break; // liste suivante
654 if (theline.Length() < 3)
655 { sout<<"Lineno."<<thenl<<" : A General Modifier is badly defined"<<endl; continue; }
656 DeclareAndCast(IFSelect_GeneralModifier,modif,ItemValue(1));
657 DeclareAndCast(IFSelect_Selection,input,ItemValue(2));
658 DeclareAndCast(IFSelect_Dispatch,disp,ItemValue(3));
659 if (modif.IsNull())
660 { sout<<"Lineno."<<thenl<<" : A General Modifier has not been Recognized"<<endl; continue; }
661 thesess->SetItemSelection (modif,input);
662 if (!disp.IsNull()) thesess->SetAppliedModifier (modif,disp);
663 else thesess->SetAppliedModifier (modif,thesess->ShareOut());
664 }
665 }
666
667// ... Conclusion : voir ReadEnd (separe)
668 return 0;
669}
670
671 Standard_Integer IFSelect_SessionFile::ReadEnd ()
672{
673 Handle(Message_Messenger) sout = Message::DefaultMessenger();
674 if ( theline.Length() != 2 ||
675 !theline.Value(1).IsEqual("!XSTEP") ||
676 !theline.Value(2).IsEqual("END"))
677 { sout<<"End of File Incorrect, lineno"<<thenl<<endl; return 1; }
678 return 0;
679}
680
681
682 Standard_Boolean IFSelect_SessionFile::ReadLine ()
683{
684 if (thenl >= thelist.Length()) return Standard_False;
685 thenl ++;
686 Standard_CString ligne = thelist.Value(thenl).ToCString();
687// Lignes vides ?
688 if (ligne[0] == '\0') return ReadLine();
689 SplitLine (ligne);
690 return Standard_True;
691}
692
693
694 void IFSelect_SessionFile::SplitLine (const Standard_CString line)
695{
696 char mot[80];
697 theline.Clear();
698 Standard_Integer nbc = 0;
699 Standard_Boolean word = (line[0] > ' ');
700 for (Standard_Integer i = 0; line[i] != '\0'; i ++) {
701 if (line[i] > ' ') {
702 if (!word) { nbc = 0; word = Standard_True; }
703 mot[nbc] = line[i]; nbc ++;
704 } else {
705 if (word) {
706 word = Standard_False;
707 mot[nbc] = '\0';
708 theline.Append (TCollection_AsciiString(mot));
709 }
710 if (line[i] == '\0' || line[i] == '\n') break;
711 }
712 }
713 thelastgen = 0;
714}
715
716 Standard_Boolean IFSelect_SessionFile::ReadOwn
717 (Handle(Standard_Transient)& item)
718{
719 Handle(Message_Messenger) sout = Message::DefaultMessenger();
720
721 if (theline.Length() < 2) return Standard_False;
722 const TCollection_AsciiString& type = theline.Value(2);
723 if (thelastgen < 2) thelastgen = 2; // mini : ident+type d abord
724// thelastgen = theline.Length();
725// for (Standard_Integer i = theline.Length(); i > 0; i --) {
726// if (theline.Value(i).Value(1) == ':') thelastgen = i - 1;
727// }
728 Handle(IFSelect_SessionDumper) dumper = IFSelect_SessionDumper::First();
729 while (!dumper.IsNull()) {
730 if (dumper->ReadOwn(*this,type,item)) break;
731 dumper = dumper->Next();
732 }
733 if (dumper.IsNull()) sout<<" -- Lineno."<<thenl<<" : an Item could not be read"<<endl;
734 return (!dumper.IsNull()); // IsNull -> echec
735}
736
737
738 void IFSelect_SessionFile::AddItem
739 (const Handle(Standard_Transient)& item, const Standard_Boolean active)
740{
741 Handle(Message_Messenger) sout = Message::DefaultMessenger();
742
743 const TCollection_AsciiString& name = theline.Value(1);
744 Standard_Integer id = 0;
745 if (!item.IsNull()) {
746 if (name.Value(1) == '#') id = thesess->AddItem(item,active);
747 else if (!thesess->NamedItem(name.ToCString()).IsNull()) id =
748 thesess->AddItem(item,active);
749 else id = thesess->AddNamedItem(name.ToCString(),item,active);
750 }
751 else sout<<"Lineno."<<thenl<<" -- Name : "<<name
752 <<" : Item could not be defined" << endl;
997e128f 753 thenames.Bind(name,id);
7fd59977 754}
755
756 Standard_Boolean IFSelect_SessionFile::IsDone () const
757 { return thedone; }
758
759 Handle(IFSelect_WorkSession) IFSelect_SessionFile::WorkSession () const
760 { return thesess; }
761
762// ######## Actions Unitaires d ECRITURE ########
763
764 void IFSelect_SessionFile::NewItem
765 (const Standard_Integer ident, const Handle(Standard_Transient)& par)
766{
767 char laligne[100];
768 if (!thesess->HasName(par)) {
769 thenewnum ++; thenums->SetValue(ident,thenewnum);
770 sprintf(laligne," #%d %s",thenewnum,par->DynamicType()->Name());
771 }
772 else sprintf(laligne," %s %s",thesess->Name(par)->ToCString(),
773 par->DynamicType()->Name());
774 WriteLine(laligne);
775}
776
777 void IFSelect_SessionFile::SetOwn (const Standard_Boolean mode)
778 { theownflag = mode; }
779
780 void IFSelect_SessionFile::SendVoid ()
781{
782//// if (theownflag) WriteLine(" :$");
783 WriteLine(" $");
784}
785
786 void IFSelect_SessionFile::SendItem (const Handle(Standard_Transient)& par)
787{
788 Handle(Message_Messenger) sout = Message::DefaultMessenger();
789
790 char laligne[100];
791 Standard_Integer filenum = 0;
792 Standard_Integer id = thesess->ItemIdent(par);
793 if (id != 0) filenum = thenums->Value(id);
794 if (filenum == 0) {
795 if (!par.IsNull()) sout << "Lineno " << thenl << " -- Unknown Item : "
796 << " Type:" << par->DynamicType()->Name() << endl; //sout<<Handle par
797 SendVoid();
798 thedone = Standard_False;
799 return;
800 }
801//// if (theownflag) WriteLine(" :");
802//// else WriteLine(" ");
803 if (filenum < 0) sprintf(laligne," :%s",thesess->Name(par)->ToCString());
804 else sprintf(laligne," #%d",filenum);
805 WriteLine(laligne);
806}
807
808 void IFSelect_SessionFile::SendText (const Standard_CString text)
809{
810 char laligne[100];
811//// if (theownflag) sprintf(laligne," :%s",text);
812 sprintf(laligne," %s",text);
813 WriteLine(laligne);
814}
815
816
817// ######## Actions Unitaires de LECTURE ########
818
819 void IFSelect_SessionFile::SetLastGeneral (const Standard_Integer lastgen)
820 { thelastgen = lastgen; }
821
822 Standard_Integer IFSelect_SessionFile::NbParams () const
823 { return theline.Length() - thelastgen; }
824
825
826 Standard_Boolean IFSelect_SessionFile::IsVoid
827 (const Standard_Integer num) const
828{
829 Standard_Integer nm = num + thelastgen;
830 if (nm <= 0 || nm > theline.Length()) return Standard_True;
831 const TCollection_AsciiString& term = theline.Value(nm);
832 return (term.IsEqual ("$") || term.IsEqual (":$") );
833}
834
835 Standard_Boolean IFSelect_SessionFile::IsText
836 (const Standard_Integer num) const
837{
838 Standard_Integer nm = num + thelastgen;
839 if (nm <= 0 || nm > theline.Length()) return Standard_False;
840 const TCollection_AsciiString& term = theline.Value(nm);
841 if (term.Value(1) == ':') return Standard_False;
842 if (term.Value(1) == '#') return Standard_False;
843 if (term.IsEqual("$")) return Standard_False;
844 return Standard_True;
845}
846
847 const TCollection_AsciiString& IFSelect_SessionFile::ParamValue
848 (const Standard_Integer num) const
849 { return theline.Value(num+thelastgen); }
850
851
852 TCollection_AsciiString IFSelect_SessionFile::TextValue
853 (const Standard_Integer num) const
854{
855 Standard_Integer nm = num + thelastgen;
856 TCollection_AsciiString res;
857 if (nm <= 0 || nm > theline.Length()) return res;
858 res = theline.Value(nm);
859 if (res.Value( res.Length() ) == '"') res.Remove(res.Length());
860 if (res.Value(1) == ':') res.Remove(1);
861 if (res.Value(1) == '"') res.Remove(1);
862 return res;
863}
864
865 Handle(Standard_Transient) IFSelect_SessionFile::ItemValue
866 (const Standard_Integer num) const
867{
868 Handle(Message_Messenger) sout = Message::DefaultMessenger();
869
870 Handle(Standard_Transient) res;
871 Standard_Integer nm = num + thelastgen;
872 if (nm <= 0 || nm > theline.Length()) return res;
873 Standard_Integer id;
874 TCollection_AsciiString name = theline.Value(nm);
875 if (name.Value(1) == ':') name.Remove(1);
876 if (name.IsEqual("$")) return res; // item non-defini justement
997e128f 877 if (!thenames.Find(name, id)) {
7fd59977 878 sout << " -- Item Unknown in File : " << name
879 << " lineno " << thenl << " param." << nm << endl;
880 id = 0;
881 }
882 return thesess->Item(id);
883}
884
885
886 void IFSelect_SessionFile::Destroy ()
887{ } // agit si File non ferme, sinon ne fait rien