0032115: Data Exchange, STEP reader - Incorrect full path to file is not caught
[occt.git] / src / StepFile / StepFile_Read.cxx
1 // Created on: 1991-08-30
2 // Created by: Christian CAILLET
3 // Copyright (c) 1991-1999 Matra Datavision
4 // Copyright (c) 1999-2014 OPEN CASCADE SAS
5 //
6 // This file is part of Open CASCADE Technology software library.
7 //
8 // This library is free software; you can redistribute it and/or modify it under
9 // the terms of the GNU Lesser General Public License version 2.1 as published
10 // by the Free Software Foundation, with special exception defined in the file
11 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
12 // distribution for complete text of the license and disclaimer of any warranty.
13 //
14 // Alternatively, this file may be used under the terms of Open CASCADE
15 // commercial license or contractual agreement.
16
17 //   StepFile_Read
18
19 //   routine assurant l enchainement des operations de lecture d un fichier
20 //   STEP dans un StepModel, en fonction d une cle de reconnaissance
21 //   Retour de la fonction :
22 //     0 si OK  (le StepModel a ete charge)
23 //    -1 si abandon car fichier pas pu etre ouvert
24 //     1 si erreur en cours de lecture
25
26 //   Compilation conditionnelle : concerne les mesures de performances
27
28 #include <stdio.h>
29 #include <iostream> 
30
31 #include <step.tab.hxx>
32 #include <StepFile_Read.hxx>
33 #include <StepFile_ReadData.hxx>
34
35 #include <Interface_Check.hxx>
36 #include <Interface_InterfaceError.hxx>
37 #include <Interface_ParamType.hxx>
38 #include <Interface_Protocol.hxx>
39
40 #include <StepData_FileRecognizer.hxx>
41 #include <StepData_Protocol.hxx>
42 #include <StepData_StepModel.hxx>
43 #include <StepData_StepReaderData.hxx>
44 #include <StepData_StepReaderTool.hxx>
45
46 #include <Standard_ErrorHandler.hxx>
47 #include <Standard_Failure.hxx>
48
49 #include <Message.hxx>
50 #include <Message_Messenger.hxx>
51
52 #include <OSD_OpenFile.hxx>
53 #include <OSD_Timer.hxx>
54
55 #ifdef OCCT_DEBUG
56 #define CHRONOMESURE
57 #endif
58
59 void StepFile_Interrupt(Standard_CString theErrorMessage, const Standard_Boolean theIsFail)
60 {
61   if (theErrorMessage == NULL)
62     return;
63
64   Message_Messenger::StreamBuffer sout = theIsFail ? Message::SendFail() : Message::SendTrace();
65   sout << "**** ERR StepFile : " << theErrorMessage << "    ****" << std::endl;
66 }
67
68 static Standard_Integer StepFile_Read (const char* theName,
69                                        std::istream* theIStream,
70                                        const Handle(StepData_StepModel)& theStepModel,
71                                        const Handle(StepData_Protocol)& theProtocol,
72                                        const Handle(StepData_FileRecognizer)& theRecogHeader,
73                                        const Handle(StepData_FileRecognizer)& theRecogData)
74 {
75   // if stream is not provided, open file stream here
76   std::istream *aStreamPtr = theIStream;
77   std::ifstream aFileStream;
78   if (!aStreamPtr) {
79     OSD_OpenStream(aFileStream, theName, std::ios_base::in | std::ios_base::binary);
80     aStreamPtr = &aFileStream;
81   }
82
83   if (aStreamPtr->fail())
84   {
85     return -1;
86   }
87
88 #ifdef CHRONOMESURE
89   OSD_Timer c;
90   c.Reset();
91   c.Start();
92 #endif
93
94   Message_Messenger::StreamBuffer sout = Message::SendTrace();
95   sout << "      ...    Step File Reading : '" << theName << "'";
96
97   StepFile_ReadData aFileDataModel;
98   try {
99     OCC_CATCH_SIGNALS
100     int aLetat = 0;
101     step::scanner aScanner(&aFileDataModel, aStreamPtr);
102     aScanner.yyrestart(aStreamPtr);
103     step::parser aParser(&aScanner);
104     aLetat = aParser.parse();
105     if (aLetat != 0) {
106       StepFile_Interrupt(aFileDataModel.GetLastError(), Standard_True);
107       return 1;
108     }
109   }
110   catch (Standard_Failure const& anException) {
111     Message::SendFail() << " ...  Exception Raised while reading Step File : '" << theName << "':\n"
112                         << anException << "    ...";
113     return 1;
114   }
115
116 #ifdef CHRONOMESURE
117   c.Show(sout);
118 #endif
119
120   sout << "      ...    STEP File   Read    ...\n";
121
122   Standard_Integer nbhead, nbrec, nbpar;
123   aFileDataModel.GetFileNbR (&nbhead,&nbrec,&nbpar);  // renvoi par lex/yacc
124   Handle(StepData_StepReaderData) undirec =
125     new StepData_StepReaderData(nbhead,nbrec,nbpar, theStepModel->SourceCodePage());  // creation tableau de records
126   for ( Standard_Integer nr = 1; nr <= nbrec; nr ++) {
127     int nbarg; char* ident; char* typrec = 0;
128     aFileDataModel.GetRecordDescription(&ident, &typrec, &nbarg);
129     undirec->SetRecord (nr, ident, typrec, nbarg);
130
131     if (nbarg>0) {
132       Interface_ParamType typa; char* val;
133       while(aFileDataModel.GetArgDescription (&typa, &val) == 1) {
134         undirec->AddStepParam (nr, val, typa);
135       }
136     }
137     undirec->InitParams(nr);
138     aFileDataModel.NextRecord();
139   }
140
141   aFileDataModel.ErrorHandle(undirec->GlobalCheck());
142   Standard_Integer anFailsCount = undirec->GlobalCheck()->NbFails();
143   if (anFailsCount > 0)
144   {
145     Message::SendInfo() << "**** ERR StepFile : Incorrect Syntax : Fails Count : "
146       << anFailsCount << " ****";
147   }
148
149   aFileDataModel.ClearRecorder(1);
150
151   sout << "      ... Step File loaded  ...\n";
152   sout << "   " << undirec->NbRecords() << " records (entities,sub-lists,scopes), " << nbpar << " parameters";
153
154 #ifdef CHRONOMESURE
155   c.Show(sout);
156 #endif
157
158 //   Analyse : par StepReaderTool
159
160   StepData_StepReaderTool readtool (undirec, theProtocol);
161   readtool.SetErrorHandle (Standard_True);
162
163   readtool.PrepareHeader(theRecogHeader);  // Header. reco nul -> pour Protocol
164   readtool.Prepare(theRecogData);          // Data.   reco nul -> pour Protocol
165
166   sout << "      ... Parameters prepared ...\n";
167
168 #ifdef CHRONOMESURE
169   c.Show(sout);
170 #endif
171
172   readtool.LoadModel(theStepModel);
173   if (theStepModel->Protocol().IsNull()) theStepModel->SetProtocol (theProtocol);
174   aFileDataModel.ClearRecorder(2);
175   anFailsCount = undirec->GlobalCheck()->NbFails() - anFailsCount;
176   if (anFailsCount > 0)
177   {
178     Message::SendInfo() << "*** ERR StepReaderData : Unresolved Reference : Fails Count : "
179       << anFailsCount << " ***";
180   }
181
182   readtool.Clear();
183   undirec.Nullify();
184
185   sout << "      ...   Objects analysed  ...\n";
186   Standard_Integer n = theStepModel->NbEntities();
187   sout << "  STEP Loading done : " << n << " Entities";
188
189 #ifdef CHRONOMESURE
190   c.Show(sout);
191 #endif
192
193   return 0;
194 }
195
196 Standard_Integer StepFile_Read(const char* theName,
197                                std::istream* theIStream,
198                                const Handle(StepData_StepModel)& theStepModel,
199                                const Handle(StepData_Protocol)& theProtocol)
200 {
201   Handle(StepData_FileRecognizer) aNulRecog;
202   return StepFile_Read(theName, theIStream, theStepModel, theProtocol, aNulRecog, aNulRecog);
203 }