Files
OCCT/src/IFSelect/IFSelect_SessionFile.cxx
abv d5f74e42d6 0024624: Lost word in license statement in source files
License statement text corrected; compiler warnings caused by Bison 2.41 disabled for MSVC; a few other compiler warnings on 54-bit Windows eliminated by appropriate type cast
Wrong license statements corrected in several files.
Copyright and license statements added in XSD and GLSL files.
Copyright year updated in some files.
Obsolete documentation files removed from DrawResources.
2014-02-20 16:15:17 +04:00

880 lines
30 KiB
C++

// Copyright (c) 1999-2014 OPEN CASCADE SAS
//
// This file is part of Open CASCADE Technology software library.
//
// This library is free software; you can redistribute it and/or modify it under
// the terms of the GNU Lesser General Public License version 2.1 as published
// by the Free Software Foundation, with special exception defined in the file
// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
// distribution for complete text of the license and disclaimer of any warranty.
//
// Alternatively, this file may be used under the terms of Open CASCADE
// commercial license or contractual agreement.
#include <IFSelect_SessionFile.ixx>
#include <IFSelect_SessionDumper.hxx>
#include <IFSelect_BasicDumper.hxx>
#include <IFSelect_IntParam.hxx>
#include <IFSelect_Selection.hxx>
#include <IFSelect_SelectExtract.hxx>
#include <IFSelect_SelectDeduct.hxx>
#include <IFSelect_SelectControl.hxx>
#include <IFSelect_SelectCombine.hxx>
#include <IFSelect_SelectAnyType.hxx>
#include <IFSelect_SelectAnyList.hxx>
#include <IFSelect_Dispatch.hxx>
#include <IFSelect_Modifier.hxx>
#include <IFSelect_Transformer.hxx>
#include <TCollection_HAsciiString.hxx>
#include <TColStd_HSequenceOfInteger.hxx>
#include <Message_Messenger.hxx>
#include <Message.hxx>
#include <Interface_Macros.hxx>
#include <stdio.h>
static int deja = 0;
IFSelect_SessionFile::IFSelect_SessionFile
(const Handle(IFSelect_WorkSession)& WS)
{
ClearLines();
themode = Standard_False;
if (!deja) { // au moins celui-la :
Handle(IFSelect_BasicDumper) basedumper = new IFSelect_BasicDumper;
deja = 1;
}
thedone = Standard_False;
thelastgen = 0;
thesess = WS;
}
IFSelect_SessionFile::IFSelect_SessionFile
(const Handle(IFSelect_WorkSession)& WS, const Standard_CString filename)
{
ClearLines();
themode = Standard_True;
if (!deja) { // au moins celui-la :
Handle(IFSelect_BasicDumper) basedumper = new IFSelect_BasicDumper;
deja = 1;
}
thedone = Standard_False;
theownflag = Standard_False;
thelastgen = 0;
thesess = WS;
thedone = (Write (filename) == 0);
// Close fait par Write (selon les cas)
}
void IFSelect_SessionFile::ClearLines ()
{ thelist.Clear(); thenl = 0; }
Standard_Integer IFSelect_SessionFile::NbLines () const
{ return thelist.Length(); }
const TCollection_AsciiString& IFSelect_SessionFile::Line
(const Standard_Integer num) const
{ return thelist.Value(num); }
void IFSelect_SessionFile::AddLine (const Standard_CString line)
{ thelist.Append (TCollection_AsciiString(line) ); }
void IFSelect_SessionFile::RemoveLastLine ()
{ if (thelist.Length() > 1) thelist.Remove(thelist.Length()); }
Standard_Boolean IFSelect_SessionFile::WriteFile
(const Standard_CString filename)
{
FILE* lefic = fopen(filename,"w");
Standard_Integer nbl = thelist.Length();
for (Standard_Integer i = 1; i <= nbl; i ++)
fprintf (lefic,"%s\n",thelist.Value(i).ToCString());
fclose ( lefic );
ClearLines();
return Standard_True;
}
Standard_Boolean IFSelect_SessionFile::ReadFile
(const Standard_CString filename)
{
char ligne[201];
FILE* lefic = fopen(filename,"r");
if (!lefic) return Standard_False;
ClearLines();
// read mode : lire les lignes
// On charge le fichier dans "thelist"
Standard_Boolean header = Standard_False;
for(;;) {
ligne[0] = '\0';
fgets(ligne,200,lefic);
if (feof(lefic)) break;
if (ligne[0] == '\0') continue;
// D abord ligne initiale ?
if (!header)
{ if (!RecognizeFile(ligne)) break; header = Standard_True; }
ligne[200] = '\0'; // fin forcee ...
TCollection_AsciiString onemore(ligne);
thelist.Append(onemore);
}
fclose ( lefic );
return header;
}
Standard_Boolean IFSelect_SessionFile::RecognizeFile
(const Standard_CString headerline)
{
Handle(Message_Messenger) sout = Message::DefaultMessenger();
SplitLine (headerline);
if (theline.Length() != 4) { sout<<"File Form Incorrect"<<endl; return Standard_False; }
Handle(Standard_Type) sesstype = thesess->DynamicType();
if (!theline.Value(1).IsEqual("!XSTEP") ||
!theline.Value(2).IsEqual("SESSION") ||
!theline.Value(4).IsEqual(sesstype->Name()) )
{ sout<<"Lineno."<<thenl<<" : File Header Description Incorrect"<<endl; return Standard_False; }
// Value(3) definit la VERSION du format de fichier
return Standard_True;
}
Standard_Integer IFSelect_SessionFile::Write
(const Standard_CString filename)
{
thenewnum = 0;
Standard_Integer stat = WriteSession();
if (stat != 0) return stat;
stat = WriteEnd();
if (stat != 0) return stat;
return (WriteFile(filename) ? 0 : -1);
}
Standard_Integer IFSelect_SessionFile::Read
(const Standard_CString filename)
{
if (!ReadFile(filename)) return -1;
thenewnum = 0;
Standard_Integer stat = ReadSession();
if (stat != 0) return stat;
stat = ReadEnd();
return stat;
}
// ##################################################################
// ######## WriteSession : Ecriture du contenu ########
Standard_Integer IFSelect_SessionFile::WriteSession ()
{
char laligne[200];
thedone = Standard_True;
// ... Preparation Specifique
thenames.Nullify();
Standard_Integer nbidents = thesess->MaxIdent();
thenums = new TColStd_HArray1OfInteger (0,nbidents); thenums->Init(0);
Standard_Integer i; // svv Jan11 2000 : porting on DEC
for ( i = 1; i <= nbidents; i ++) {
Handle(Standard_Transient) item = thesess->Item(i);
if (!item.IsNull()) thenums->SetValue(i,-1);
}
// ... ECRITURE
sprintf (laligne,"!XSTEP SESSION V1 %s",thesess->DynamicType()->Name());
WriteLine(laligne,'\n');
sprintf (laligne,"!GENERALS");
WriteLine(laligne,'\n');
sprintf (laligne,"ErrorHandle %d", (thesess->ErrorHandle() ? 1 : 0));
WriteLine(laligne,'\n');
Handle(TColStd_HSequenceOfInteger) idents;
Standard_Integer nb;
Handle(TCollection_HAsciiString) name;
idents = thesess->ItemIdents(STANDARD_TYPE(IFSelect_IntParam));
nb = idents->Length();
if (nb > 0) WriteLine ("!INTEGERS",'\n');
Standard_Integer j; // svv Jan11 2000 : porting on DEC
for (j = 1; j <= nb; j ++) {
i = idents->Value(j);
Handle(IFSelect_IntParam) P = thesess->IntParam(i);
name = thesess->Name(P);
if (name.IsNull()) {
thenewnum ++; idents->SetValue(i,thenewnum);
sprintf(laligne," #%d %d",thenewnum,P->Value());
}
else sprintf(laligne," %s %d",name->ToCString(),P->Value());
WriteLine(laligne,'\n');
}
idents = thesess->ItemIdents(STANDARD_TYPE(TCollection_HAsciiString));
nb = idents->Length();
if (nb > 0) WriteLine ("!TEXTS",'\n');
for (j = 1; j <= nb; j ++) {
i = idents->Value(j);
Handle(TCollection_HAsciiString) P = thesess->TextParam(i);
name = thesess->Name(P);
if (name.IsNull()) {
thenewnum ++; thenums->SetValue(i,thenewnum);
sprintf(laligne," #%d %s",thenewnum,P->ToCString());
}
else sprintf(laligne," %s %s",name->ToCString(),P->ToCString());
WriteLine(laligne,'\n');
}
idents = thesess->ItemIdents(STANDARD_TYPE(IFSelect_Selection));
nb = idents->Length();
if (nb > 0) WriteLine ("!SELECTIONS",'\n');
for (j = 1; j <= nb; j ++) {
i = idents->Value(j);
Handle(IFSelect_Selection) P = thesess->Selection(i);
NewItem (i,P);
// .. Ecritures particulieres
// -> Traiter les principaux sous-types : Extract,AnyList,AnyType
DeclareAndCast(IFSelect_SelectExtract,sxt,P);
if (!sxt.IsNull()) {
sprintf(laligne," %c", (sxt->IsDirect() ? 'D' : 'R'));
WriteLine(laligne);
}
DeclareAndCast(IFSelect_SelectAnyList,sli,P);
if (!sli.IsNull()) {
SetOwn(Standard_False);
WriteLine(" LIST");
SendItem(sli->Lower());
SendItem(sli->Upper());
SetOwn(Standard_True);
}
// .. Ecritures specifiques selon dumpers
WriteOwn(P);
WriteLine("",'\n');
}
SetOwn(Standard_False);
if (nb > 0) WriteLine ("!SOURCES",'\n');
for (j = 1; j <= nb; j ++) {
i = idents->Value(j);
Handle(IFSelect_Selection) P = thesess->Selection(i);
Standard_Integer nbs = thesess->NbSources(P);
if (nbs == 0) continue;
name = thesess->Name(P);
if (name.IsNull()) sprintf(laligne," #%d %d",thenums->Value(i),nbs);
else sprintf(laligne," %s %d",name->ToCString(),nbs);
WriteLine(laligne);
for (Standard_Integer k = 1; k <= nbs; k ++)
SendItem (thesess->Source(P,k));
WriteLine("",'\n');
}
idents = thesess->ItemIdents(STANDARD_TYPE(IFSelect_GeneralModifier));
nb = idents->Length();
if (nb > 0) WriteLine ("!MODIFIERS",'\n');
for (j = 1; j <= nb; j ++) {
// Description de base des Modifiers, donc sans Selection ni Dispatch-Rank
i = idents->Value(j);
Handle(IFSelect_GeneralModifier) P = thesess->GeneralModifier(i);
NewItem (i,P);
SetOwn(Standard_True);
// .. Ecritures specifiques selon dumpers
WriteOwn(P);
WriteLine("",'\n');
}
idents = thesess->ItemIdents(STANDARD_TYPE(IFSelect_Transformer));
nb = idents->Length();
if (nb > 0) WriteLine ("!TRANSFORMERS",'\n');
for (j = 1; j <= nb; j ++) {
// Description des Transformers
i = idents->Value(j);
Handle(IFSelect_Transformer) P = thesess->Transformer(i);
NewItem (i,P);
SetOwn(Standard_True);
// .. Ecritures specifiques selon dumpers
WriteOwn(P);
WriteLine("",'\n');
}
SetOwn(Standard_False);
idents = thesess->ItemIdents(STANDARD_TYPE(IFSelect_Dispatch));
nb = idents->Length();
if (nb > 0) WriteLine ("!DISPATCHES",'\n');
for (j = 1; j <= nb; j ++) {
i = idents->Value(j);
Handle(IFSelect_Dispatch) P = thesess->Dispatch(i);
NewItem (i,P);
// .. Final Selection
SetOwn(Standard_False);
SendItem(P->FinalSelection());
SetOwn(Standard_True);
// .. Ecritures specifiques selon dumpers
WriteOwn(P);
WriteLine("",'\n');
}
WriteLine ("!FILENAMING");
SetOwn(Standard_False);
Handle(TCollection_HAsciiString) namingpart = thesess->FilePrefix();
if (namingpart->IsEmpty()) namingpart.Nullify();
if (namingpart.IsNull()) SendVoid();
else SendText(namingpart->ToCString());
namingpart = thesess->DefaultFileRoot();
if (namingpart->IsEmpty()) namingpart.Nullify();
if (namingpart.IsNull()) SendVoid();
else SendText(namingpart->ToCString());
namingpart = thesess->FileExtension();
if (namingpart->IsEmpty()) namingpart.Nullify();
if (namingpart.IsNull()) SendVoid();
else SendText(namingpart->ToCString());
WriteLine("",'\n');
for (j = 1; j <= nb; j ++) {
i = idents->Value(j);
Handle(IFSelect_Dispatch) P = thesess->Dispatch(i);
if (!P->HasRootName()) continue;
namingpart = P->RootName();
SetOwn(Standard_False);
SendItem(P);
sprintf(laligne," %s",namingpart->ToCString());
WriteLine(laligne,' ');
WriteLine("",'\n');
}
// Pour les Modifiers, ATTENTION car il faut respecter l ORDRE effectif
// Or il y a deux listes : Model Modifiers; File Modifiers
// Les Modifiers eux-memes ont deja ete ecrits
// Ici, on ecrit simplement leur utilisation dans l envoi final
for (Standard_Integer formod = 1; formod >= 0; formod --) {
idents = thesess->FinalModifierIdents((formod > 0)); // donnes dans l ordre d application
nb = idents->Length();
if (nb == 0) continue;
if (formod > 0) WriteLine ("!MODELMODIFIERS",'\n');
else WriteLine ("!FILEMODIFIERS",'\n');
for (j = 1; j <= nb; j ++) {
i = idents->Value(j);
Handle(IFSelect_GeneralModifier) P = thesess->GeneralModifier(i);
SetOwn(Standard_False);
SendItem(P);
// .. Parametres Generaux (les specifiques ont deja ete envoyes)
SendItem(P->Selection());
SendItem(P->Dispatch());
WriteLine("",'\n');
}
}
// ... Conclusion
theline.Clear();
return 0;
}
Standard_Integer IFSelect_SessionFile::WriteEnd ()
{
WriteLine("!XSTEP END",'\n'); // sinon, cf sous-types de SessionFile ...
return 0;
}
void IFSelect_SessionFile::WriteLine
(const Standard_CString line, const Standard_Character follow)
{
if (line[0] != '\0') thebuff.AssignCat (line);
if (follow == '\0') return;
if (follow != '\n') thebuff.AssignCat(follow);
else {
thelist.Append(thebuff);
thebuff.Clear();
thenl ++;
}
}
Standard_Boolean IFSelect_SessionFile::WriteOwn
(const Handle(Standard_Transient)& item)
{
if (item.IsNull()) return Standard_False;
SetOwn(Standard_True);
Handle(IFSelect_SessionDumper) dumper = IFSelect_SessionDumper::First();
while (!dumper.IsNull()) {
if (dumper->WriteOwn(*this,item)) break;
dumper = dumper->Next();
}
SetOwn(Standard_False);
return (!dumper.IsNull()); // IsNull -> echec
}
// ##################################################################
// ######## ReadSession : Lecture du contenu ########
Standard_Integer IFSelect_SessionFile::ReadSession ()
{
Handle(Message_Messenger) sout = Message::DefaultMessenger();
thedone = Standard_True;
// ... Preparation Specifique
thenums.Nullify();
thenames = new Dico_DictionaryOfInteger;
// .. Donnees generales, controle
if (!ReadLine()) return 1;
if (theline.Length() != 4) { sout<<"File Form Incorrect"<<endl; return 1; }
Handle(Standard_Type) sesstype = thesess->DynamicType();
if (!theline.Value(1).IsEqual("!XSTEP") ||
!theline.Value(2).IsEqual("SESSION") ||
!theline.Value(4).IsEqual(sesstype->Name()) )
{ sout<<"Lineno."<<thenl<<" : File Header Description Incorrect"<<endl; return 1; }
// Value(3) definit la VERSION du format de fichier
if (!ReadLine()) return 1;
// .. Parametres Generaux
Standard_Integer rubr =
(theline.Length() == 1 && theline.Value(1).IsEqual("!GENERALS"));
while (rubr) {
if (!ReadLine()) return 1;
if (theline.Length() == 0) continue;
const TCollection_AsciiString& ungen = theline.Value(1);
if (ungen.Value(1) == '!') break; // fin des generaux
if (ungen.IsEqual("ErrorHandle")) {
if (theline.Length() != 2)
{ sout<<"Lineno."<<thenl<<" : ErrorHandle Description Incorrect"<<endl; continue; }
if (theline.Value(2).IsEqual("0"))
thesess->SetErrorHandle(Standard_False);
else if (theline.Value(2).IsEqual("1"))
thesess->SetErrorHandle(Standard_True);
else { sout<<"Lineno."<<thenl<<" : ErrorHandle Incorrect : "<<theline.Value(2)<<endl; continue; }
continue;
}
else sout<<"Lineno."<<thenl<<" : Unknown General Parameter : "<<ungen<<" , ignored"<<endl;
}
// .. IntParams
// deja fait if (!ReadLine()) return 1;
rubr = (theline.Length() == 1 && theline.Value(1).IsEqual("!INTEGERS"));
while (rubr) {
if (!ReadLine()) return 1;
if (theline.Value(1).Value(1) == '!') break; // liste suivante
if (theline.Length() != 2)
{ sout<<"Lineno."<<thenl<<" : An Integer Parameter is badly defined"<<endl; continue; }
Handle(IFSelect_IntParam) par = new IFSelect_IntParam;
par->SetValue ( atoi(theline.Value(2).ToCString()) );
AddItem (par);
}
// .. TextParams (ligne de garde deja lue)
rubr = (theline.Length() == 1 && theline.Value(1).IsEqual("!TEXTS"));
while (rubr) {
if (!ReadLine()) return 1;
if (theline.Value(1).Value(1) == '!') break; // liste suivante
if (theline.Length() != 2)
{ sout<<"Lineno."<<thenl<<" : A Text Parameter is badly defined"<<endl; continue; }
// Attention, un texte peut contenir des blancs ... repartir de line(thenl)
TCollection_AsciiString oneline = thelist.Value(thenl);
Standard_Integer iw = 0, inc = 0;
for (Standard_Integer ic = 1; ic <= oneline.Length(); ic ++) {
char unc = oneline.Value(1);
inc = ic;
if (unc == ' ') iw = 1;
else if (iw > 0) break;
}
oneline.Remove (1,inc);
AddItem ( new TCollection_HAsciiString (oneline.ToCString()) );
}
// .. Selections (ligne de garde deja lue)
rubr = (theline.Length() == 1 && theline.Value(1).IsEqual("!SELECTIONS"));
while (rubr) {
if (!ReadLine()) return 1;
if (theline.Value(1).Value(1) == '!') break; // liste suivante
if (theline.Length() < 2)
{ sout<<"Lineno."<<thenl<<" : A Selection is badly defined"<<endl; continue; }
// .. Analyse de certains cas generaux
Handle(IFSelect_IntParam) low,up;
Standard_Integer firstown = 3;
Standard_Integer direct = 0;
Standard_Integer numlist = 0;
if (theline.Length() > 2) {
if (theline.Value(3).IsEqual("D")) direct = 1;
else if (theline.Value(3).IsEqual("R")) direct = -1;
if (direct != 0) firstown ++;
if (firstown+2 <= theline.Length()) {
if (theline.Value(firstown).IsEqual("LIST")) {
numlist = firstown; firstown += 3;
low = GetCasted(IFSelect_IntParam,ItemValue(numlist+1));
up = GetCasted(IFSelect_IntParam,ItemValue(numlist+2));
}
}
SetLastGeneral (firstown-1);
}
Handle(Standard_Transient) item; // a fournir ...
ReadOwn(item);
if (item.IsNull()) continue;
DeclareAndCast(IFSelect_SelectExtract,sxt,item);
if (!sxt.IsNull()) {
if (direct == 0) sout<<"Lineno."<<thenl<<" : A SelectExtract is badly defined"<<endl;
else sxt->SetDirect( (direct > 0) );
}
DeclareAndCast(IFSelect_SelectAnyList,sli,item);
if (!sli.IsNull()) {
if (numlist == 0) sout<<"Lineno."<<thenl<<" : A SelectAnyList is badly defined"<<endl;
else sli->SetRange(low,up);
}
AddItem(item);
}
// .. Sources
rubr = (theline.Length() == 1 && theline.Value(1).IsEqual("!SOURCES"));
while (rubr) {
if (!ReadLine()) return 1;
if (theline.Value(1).Value(1) == '!') break; // liste suivante
if (theline.Length() < 3)
{ sout<<"Lineno."<<thenl<<" : A Selection Source List is badly defined"<<endl; continue; }
DeclareAndCast(IFSelect_Selection,sel,ItemValue(1));
if (sel.IsNull())
{ sout<<"Lineno."<<thenl<<" : A Source List is not for a Selection"<<endl; continue; }
Standard_Integer nbs = atoi(theline.Value(2).ToCString());
// .. Differents cas reconnus
DeclareAndCast(IFSelect_SelectExtract,sxt,sel);
if (!sxt.IsNull()) {
if (nbs > 1)
sout<<"Lineno."<<thenl<<" : SelectExtract, more than one source, followings ignored"<<endl;
DeclareAndCast(IFSelect_Selection,source,ItemValue(3));
sxt->SetInput(source);
}
DeclareAndCast(IFSelect_SelectDeduct,sdt,sel);
if (!sdt.IsNull()) {
if (nbs > 1)
sout<<"Lineno."<<thenl<<" : SelectDeduct, more than one source, followings ignored"<<endl;
sdt->SetInput(GetCasted(IFSelect_Selection,ItemValue(3)));
}
DeclareAndCast(IFSelect_SelectControl,sct,sel);
if (!sct.IsNull()) {
if (nbs != 2)
sout<<"Lineno."<<thenl<<" : SelectControl, not two sources, followings ignored"<<endl;
sct->SetMainInput (GetCasted(IFSelect_Selection,ItemValue(3)));
sct->SetSecondInput (GetCasted(IFSelect_Selection,ItemValue(4)));
}
DeclareAndCast(IFSelect_SelectCombine,sco,sel);
if (!sco.IsNull()) {
for (Standard_Integer j = 1; j <= nbs; j ++)
sco->Add(GetCasted(IFSelect_Selection,ItemValue(j+2)));
}
}
// ... Modifiers en tout genre
rubr = (theline.Length() == 1 && theline.Value(1).IsEqual("!MODIFIERS"));
while (rubr) {
if (!ReadLine()) return 1;
if (theline.Value(1).Value(1) == '!') break; // liste suivante
if (theline.Length() < 2)
{ sout<<"Lineno."<<thenl<<" : A Modifier is badly defined"<<endl; continue; }
Handle(Standard_Transient) item; // a fournir ...
ReadOwn(item);
if (item.IsNull()) continue;
DeclareAndCast(IFSelect_GeneralModifier,modif,item);
if (modif.IsNull())
{ sout<<"Lineno."<<thenl<<" : A Modifier has not been Recognized"<<endl; continue; }
AddItem(modif,Standard_False); // active plus tard
}
// ... Transformers
rubr = (theline.Length() == 1 && theline.Value(1).IsEqual("!TRANSFORMERS"));
while (rubr) {
if (!ReadLine()) return 1;
if (theline.Value(1).Value(1) == '!') break; // liste suivante
if (theline.Length() < 2)
{ sout<<"Lineno."<<thenl<<" : A Transformer is badly defined"<<endl; continue; }
Handle(Standard_Transient) item; // a fournir ...
ReadOwn(item);
if (item.IsNull()) continue;
DeclareAndCast(IFSelect_Transformer,trf,item);
if (trf.IsNull())
{ sout<<"Lineno."<<thenl<<" : A Transformer has not been Recognized"<<endl; continue; }
AddItem(trf,Standard_False); // active plus tard
}
// ... Dispatches (ligne de garde deja lue)
rubr = (theline.Length() == 1 && theline.Value(1).IsEqual("!DISPATCHES"));
while (rubr) {
if (!ReadLine()) return 1;
if (theline.Value(1).Value(1) == '!') break; // liste suivante
if (theline.Length() < 3)
{ sout<<"Lineno."<<thenl<<" : A Dispatch is badly defined"<<endl; continue; }
DeclareAndCast(IFSelect_Selection,input,ItemValue(3));
SetLastGeneral(3);
Handle(Standard_Transient) item; // a fournir ...
ReadOwn(item);
if (item.IsNull()) continue;
DeclareAndCast(IFSelect_Dispatch,disp,item);
if (disp.IsNull())
{ sout<<"Lineno."<<thenl<<" : A Dispatch has not been Recognized"<<endl; continue; }
AddItem(disp);
thesess->SetItemSelection(disp,input);
}
// ... FileNaming (ligne de garde deja lue)
// .. Modifiers deja lus et charges
rubr = (theline.Length() == 4 && theline.Value(1).IsEqual("!FILENAMING"));
if (rubr) {
if (!IsVoid(2)) thesess->SetFilePrefix (TextValue(2).ToCString());
if (!IsVoid(3)) thesess->SetDefaultFileRoot (TextValue(3).ToCString());
if (!IsVoid(4)) thesess->SetFileExtension (TextValue(4).ToCString());
}
while (rubr) {
if (!ReadLine()) return 1;
if (theline.Value(1).Value(1) == '!') break; // liste suivante
if (theline.Length() != 2)
{ sout<<"Lineno."<<thenl<<" : A File Root is badly defined"<<endl; continue; }
DeclareAndCast(IFSelect_Dispatch,disp,ItemValue(1));
thesess->SetFileRoot (disp,theline.Value(2).ToCString());
}
// ... Modifiers (ligne de garde deja lue)
// ... Attention, deux listes (MODELMODIFIERS et FILEMODIFIERS)
for (Standard_Integer formod = 1; formod >= 0; formod --) {
rubr = (theline.Length() == 1 &&
( (formod == 1 && theline.Value(1).IsEqual("!MODELMODIFIERS")) ||
(formod == 0 && theline.Value(1).IsEqual("!FILEMODIFIERS")) ) );
// if ( formod == 1 && ( theline.Length() != 1 ||
// !theline.Value(1).IsEqual("!MODELMODIFIERS")) )
// { sout<<"Lineno."<<thenl<<" : Model Modifier List Incorrect"<<endl; return 1; }
// if ( formod == 0 && ( theline.Length() != 1 ||
// !theline.Value(1).IsEqual("!FILEMODIFIERS")) )
// { sout<<"Lineno."<<thenl<<" : File Modifier List Incorrect"<<endl; return 1; }
while (rubr) {
if (!ReadLine()) return 1;
if (theline.Value(1).Value(1) == '!') break; // liste suivante
if (theline.Length() < 3)
{ sout<<"Lineno."<<thenl<<" : A General Modifier is badly defined"<<endl; continue; }
DeclareAndCast(IFSelect_GeneralModifier,modif,ItemValue(1));
DeclareAndCast(IFSelect_Selection,input,ItemValue(2));
DeclareAndCast(IFSelect_Dispatch,disp,ItemValue(3));
if (modif.IsNull())
{ sout<<"Lineno."<<thenl<<" : A General Modifier has not been Recognized"<<endl; continue; }
thesess->SetItemSelection (modif,input);
if (!disp.IsNull()) thesess->SetAppliedModifier (modif,disp);
else thesess->SetAppliedModifier (modif,thesess->ShareOut());
}
}
// ... Conclusion : voir ReadEnd (separe)
return 0;
}
Standard_Integer IFSelect_SessionFile::ReadEnd ()
{
Handle(Message_Messenger) sout = Message::DefaultMessenger();
if ( theline.Length() != 2 ||
!theline.Value(1).IsEqual("!XSTEP") ||
!theline.Value(2).IsEqual("END"))
{ sout<<"End of File Incorrect, lineno"<<thenl<<endl; return 1; }
return 0;
}
Standard_Boolean IFSelect_SessionFile::ReadLine ()
{
if (thenl >= thelist.Length()) return Standard_False;
thenl ++;
Standard_CString ligne = thelist.Value(thenl).ToCString();
// Lignes vides ?
if (ligne[0] == '\0') return ReadLine();
SplitLine (ligne);
return Standard_True;
}
void IFSelect_SessionFile::SplitLine (const Standard_CString line)
{
char mot[80];
theline.Clear();
Standard_Integer nbc = 0;
Standard_Boolean word = (line[0] > ' ');
for (Standard_Integer i = 0; line[i] != '\0'; i ++) {
if (line[i] > ' ') {
if (!word) { nbc = 0; word = Standard_True; }
mot[nbc] = line[i]; nbc ++;
} else {
if (word) {
word = Standard_False;
mot[nbc] = '\0';
theline.Append (TCollection_AsciiString(mot));
}
if (line[i] == '\0' || line[i] == '\n') break;
}
}
thelastgen = 0;
}
Standard_Boolean IFSelect_SessionFile::ReadOwn
(Handle(Standard_Transient)& item)
{
Handle(Message_Messenger) sout = Message::DefaultMessenger();
if (theline.Length() < 2) return Standard_False;
const TCollection_AsciiString& type = theline.Value(2);
if (thelastgen < 2) thelastgen = 2; // mini : ident+type d abord
// thelastgen = theline.Length();
// for (Standard_Integer i = theline.Length(); i > 0; i --) {
// if (theline.Value(i).Value(1) == ':') thelastgen = i - 1;
// }
Handle(IFSelect_SessionDumper) dumper = IFSelect_SessionDumper::First();
while (!dumper.IsNull()) {
if (dumper->ReadOwn(*this,type,item)) break;
dumper = dumper->Next();
}
if (dumper.IsNull()) sout<<" -- Lineno."<<thenl<<" : an Item could not be read"<<endl;
return (!dumper.IsNull()); // IsNull -> echec
}
void IFSelect_SessionFile::AddItem
(const Handle(Standard_Transient)& item, const Standard_Boolean active)
{
Handle(Message_Messenger) sout = Message::DefaultMessenger();
const TCollection_AsciiString& name = theline.Value(1);
Standard_Integer id = 0;
if (!item.IsNull()) {
if (name.Value(1) == '#') id = thesess->AddItem(item,active);
else if (!thesess->NamedItem(name.ToCString()).IsNull()) id =
thesess->AddItem(item,active);
else id = thesess->AddNamedItem(name.ToCString(),item,active);
}
else sout<<"Lineno."<<thenl<<" -- Name : "<<name
<<" : Item could not be defined" << endl;
thenames->SetItem(name.ToCString(),id);
}
Standard_Boolean IFSelect_SessionFile::IsDone () const
{ return thedone; }
Handle(IFSelect_WorkSession) IFSelect_SessionFile::WorkSession () const
{ return thesess; }
// ######## Actions Unitaires d ECRITURE ########
void IFSelect_SessionFile::NewItem
(const Standard_Integer ident, const Handle(Standard_Transient)& par)
{
char laligne[100];
if (!thesess->HasName(par)) {
thenewnum ++; thenums->SetValue(ident,thenewnum);
sprintf(laligne," #%d %s",thenewnum,par->DynamicType()->Name());
}
else sprintf(laligne," %s %s",thesess->Name(par)->ToCString(),
par->DynamicType()->Name());
WriteLine(laligne);
}
void IFSelect_SessionFile::SetOwn (const Standard_Boolean mode)
{ theownflag = mode; }
void IFSelect_SessionFile::SendVoid ()
{
//// if (theownflag) WriteLine(" :$");
WriteLine(" $");
}
void IFSelect_SessionFile::SendItem (const Handle(Standard_Transient)& par)
{
Handle(Message_Messenger) sout = Message::DefaultMessenger();
char laligne[100];
Standard_Integer filenum = 0;
Standard_Integer id = thesess->ItemIdent(par);
if (id != 0) filenum = thenums->Value(id);
if (filenum == 0) {
if (!par.IsNull()) sout << "Lineno " << thenl << " -- Unknown Item : "
<< " Type:" << par->DynamicType()->Name() << endl; //sout<<Handle par
SendVoid();
thedone = Standard_False;
return;
}
//// if (theownflag) WriteLine(" :");
//// else WriteLine(" ");
if (filenum < 0) sprintf(laligne," :%s",thesess->Name(par)->ToCString());
else sprintf(laligne," #%d",filenum);
WriteLine(laligne);
}
void IFSelect_SessionFile::SendText (const Standard_CString text)
{
char laligne[100];
//// if (theownflag) sprintf(laligne," :%s",text);
sprintf(laligne," %s",text);
WriteLine(laligne);
}
// ######## Actions Unitaires de LECTURE ########
void IFSelect_SessionFile::SetLastGeneral (const Standard_Integer lastgen)
{ thelastgen = lastgen; }
Standard_Integer IFSelect_SessionFile::NbParams () const
{ return theline.Length() - thelastgen; }
Standard_Boolean IFSelect_SessionFile::IsVoid
(const Standard_Integer num) const
{
Standard_Integer nm = num + thelastgen;
if (nm <= 0 || nm > theline.Length()) return Standard_True;
const TCollection_AsciiString& term = theline.Value(nm);
return (term.IsEqual ("$") || term.IsEqual (":$") );
}
Standard_Boolean IFSelect_SessionFile::IsText
(const Standard_Integer num) const
{
Standard_Integer nm = num + thelastgen;
if (nm <= 0 || nm > theline.Length()) return Standard_False;
const TCollection_AsciiString& term = theline.Value(nm);
if (term.Value(1) == ':') return Standard_False;
if (term.Value(1) == '#') return Standard_False;
if (term.IsEqual("$")) return Standard_False;
return Standard_True;
}
const TCollection_AsciiString& IFSelect_SessionFile::ParamValue
(const Standard_Integer num) const
{ return theline.Value(num+thelastgen); }
TCollection_AsciiString IFSelect_SessionFile::TextValue
(const Standard_Integer num) const
{
Standard_Integer nm = num + thelastgen;
TCollection_AsciiString res;
if (nm <= 0 || nm > theline.Length()) return res;
res = theline.Value(nm);
if (res.Value( res.Length() ) == '"') res.Remove(res.Length());
if (res.Value(1) == ':') res.Remove(1);
if (res.Value(1) == '"') res.Remove(1);
return res;
}
Handle(Standard_Transient) IFSelect_SessionFile::ItemValue
(const Standard_Integer num) const
{
Handle(Message_Messenger) sout = Message::DefaultMessenger();
Handle(Standard_Transient) res;
Standard_Integer nm = num + thelastgen;
if (nm <= 0 || nm > theline.Length()) return res;
Standard_Integer id;
TCollection_AsciiString name = theline.Value(nm);
if (name.Value(1) == ':') name.Remove(1);
if (name.IsEqual("$")) return res; // item non-defini justement
if (!thenames->GetItem(name.ToCString(),id)) {
sout << " -- Item Unknown in File : " << name
<< " lineno " << thenl << " param." << nm << endl;
id = 0;
}
return thesess->Item(id);
}
void IFSelect_SessionFile::Destroy ()
{ } // agit si File non ferme, sinon ne fait rien