Commit | Line | Data |
---|---|---|
b311480e | 1 | // Created on: 2001-07-09 |
2 | // Created by: Julia DOROVSKIKH | |
973c2be1 | 3 | // Copyright (c) 2001-2014 OPEN CASCADE SAS |
b311480e | 4 | // |
973c2be1 | 5 | // This file is part of Open CASCADE Technology software library. |
b311480e | 6 | // |
d5f74e42 | 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 | |
973c2be1 | 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. | |
b311480e | 12 | // |
973c2be1 | 13 | // Alternatively, this file may be used under the terms of Open CASCADE |
14 | // commercial license or contractual agreement. | |
7fd59977 | 15 | |
7fd59977 | 16 | |
42cf5bc1 | 17 | #include <CDM_Application.hxx> |
18 | #include <CDM_Document.hxx> | |
83ae3591 | 19 | #include <Message_Messenger.hxx> |
7e785937 | 20 | #include <Message_ProgressScope.hxx> |
42cf5bc1 | 21 | #include <CDM_MetaData.hxx> |
7fd59977 | 22 | #include <LDOM_DocumentType.hxx> |
42cf5bc1 | 23 | #include <LDOM_LDOMImplementation.hxx> |
7fd59977 | 24 | #include <LDOMParser.hxx> |
42cf5bc1 | 25 | #include <OSD_Path.hxx> |
4ff92abe | 26 | #include <OSD_OpenFile.hxx> |
42cf5bc1 | 27 | #include <PCDM_Document.hxx> |
4ff92abe | 28 | #include <PCDM_DOMHeaderParser.hxx> |
42cf5bc1 | 29 | #include <Standard_Type.hxx> |
30 | #include <TCollection_AsciiString.hxx> | |
31 | #include <TCollection_ExtendedString.hxx> | |
7fd59977 | 32 | #include <TDF_Data.hxx> |
7fd59977 | 33 | #include <TDocStd_Document.hxx> |
42cf5bc1 | 34 | #include <TDocStd_Owner.hxx> |
7fd59977 | 35 | #include <UTL.hxx> |
42cf5bc1 | 36 | #include <XmlLDrivers.hxx> |
37 | #include <XmlLDrivers_DocumentRetrievalDriver.hxx> | |
42cf5bc1 | 38 | #include <XmlMDF.hxx> |
39 | #include <XmlMDF_ADriver.hxx> | |
40 | #include <XmlMDF_ADriverTable.hxx> | |
41 | #include <XmlObjMgt.hxx> | |
42 | #include <XmlObjMgt_Document.hxx> | |
43 | #include <XmlObjMgt_RRelocationTable.hxx> | |
7fd59977 | 44 | |
92efcf78 | 45 | IMPLEMENT_STANDARD_RTTIEXT(XmlLDrivers_DocumentRetrievalDriver,PCDM_RetrievalDriver) |
46 | ||
57c28b61 | 47 | #ifdef _MSC_VER |
7fd59977 | 48 | # include <tchar.h> |
57c28b61 | 49 | #endif // _MSC_VER |
7fd59977 | 50 | |
51 | #include <locale.h> | |
52 | #include <Standard_Failure.hxx> | |
53 | #include <Standard_ErrorHandler.hxx> | |
54 | ||
55 | #define START_REF "START_REF" | |
56 | #define END_REF "END_REF" | |
4ff92abe | 57 | |
58 | #define MODIFICATION_COUNTER "MODIFICATION_COUNTER: " | |
59 | #define REFERENCE_COUNTER "REFERENCE_COUNTER: " | |
7fd59977 | 60 | |
7fd59977 | 61 | //#define TAKE_TIMES |
62 | static void take_time (const Standard_Integer, const char *, | |
83ae3591 | 63 | const Handle(Message_Messenger)&) |
7fd59977 | 64 | #ifdef TAKE_TIMES |
65 | ; | |
66 | #else | |
67 | {} | |
68 | #endif | |
69 | ||
70 | static Standard_Integer RemoveExtraSeparator(TCollection_AsciiString& aString) { | |
71 | ||
72 | Standard_Integer i, j, len ; | |
73 | ||
74 | len = aString.Length() ; | |
57c28b61 | 75 | #ifdef _WIN32 |
7fd59977 | 76 | // Case of network path, such as \\MACHINE\dir |
77 | for (i = j = 2 ; j <= len ; i++,j++) { | |
78 | #else | |
79 | for (i = j = 1 ; j <= len ; i++,j++) { | |
80 | #endif | |
81 | Standard_Character c = aString.Value(j) ; | |
82 | aString.SetValue(i,c) ; | |
83 | if (c == '/') | |
84 | while(j < len && aString.Value(j+1) == '/') j++ ; | |
85 | } | |
86 | len = i-1 ; | |
87 | if (aString.Value(len) == '/') len-- ; | |
88 | aString.Trunc(len) ; | |
89 | return len ; | |
90 | } | |
91 | static TCollection_AsciiString GetDirFromFile(const TCollection_ExtendedString& aFileName) { | |
92 | TCollection_AsciiString theCFile=UTL::CString(aFileName); | |
93 | TCollection_AsciiString theDirectory; | |
94 | Standard_Integer i=theCFile.SearchFromEnd("/"); | |
57c28b61 | 95 | #ifdef _WIN32 |
7fd59977 | 96 | // if(i==-1) i=theCFile.SearchFromEnd("\\"); |
97 | if(theCFile.SearchFromEnd("\\") > i) | |
98 | i=theCFile.SearchFromEnd("\\"); | |
99 | #endif | |
100 | if(i!=-1) theDirectory=theCFile.SubString(1,i); | |
101 | return theDirectory; | |
102 | } | |
103 | ||
104 | static TCollection_AsciiString AbsolutePath( | |
105 | const TCollection_AsciiString& aDirPath, | |
106 | const TCollection_AsciiString& aRelFilePath) | |
107 | { | |
108 | TCollection_AsciiString EmptyString = "" ; | |
57c28b61 | 109 | #ifdef _WIN32 |
7fd59977 | 110 | if (aRelFilePath.Search(":") == 2 || |
111 | (aRelFilePath.Search("\\") == 1 && aRelFilePath.Value(2) == '\\')) | |
112 | #else | |
113 | if(aRelFilePath.Search("/") == 1) | |
114 | #endif | |
115 | return aRelFilePath ; | |
116 | ||
117 | TCollection_AsciiString DirPath = aDirPath, RelFilePath = aRelFilePath ; | |
118 | Standard_Integer i,len ; | |
119 | ||
57c28b61 | 120 | #ifdef _WIN32 |
7fd59977 | 121 | if(DirPath.Search(":") != 2 && |
122 | (DirPath.Search("\\") != 1 || DirPath.Value(2) != '\\')) | |
123 | #else | |
124 | if (DirPath.Search("/") != 1 ) | |
125 | #endif | |
126 | return EmptyString ; | |
127 | ||
57c28b61 | 128 | #ifdef _WIN32 |
7fd59977 | 129 | DirPath.ChangeAll('\\','/') ; |
130 | RelFilePath.ChangeAll('\\','/') ; | |
131 | #endif | |
132 | ||
133 | RemoveExtraSeparator(DirPath) ; | |
134 | len = RemoveExtraSeparator(RelFilePath) ; | |
135 | ||
136 | while (RelFilePath.Search("../") == 1) { | |
137 | if (len == 3) | |
4fbddc7c | 138 | return EmptyString ; |
7fd59977 | 139 | RelFilePath = RelFilePath.SubString(4,len) ; |
140 | len -= 3 ; | |
141 | if (DirPath.IsEmpty()) | |
4fbddc7c | 142 | return EmptyString ; |
7fd59977 | 143 | i = DirPath.SearchFromEnd("/") ; |
144 | if (i < 0) | |
145 | return EmptyString ; | |
146 | DirPath.Trunc(i-1) ; | |
147 | } | |
148 | TCollection_AsciiString retx; | |
149 | retx= DirPath; | |
150 | retx+= "/"; | |
151 | retx+=RelFilePath ; | |
152 | return retx; | |
153 | } | |
154 | ||
155 | //======================================================================= | |
156 | //function : XmlLDrivers_DocumentRetrievalDriver | |
157 | //purpose : Constructor | |
158 | //======================================================================= | |
159 | XmlLDrivers_DocumentRetrievalDriver::XmlLDrivers_DocumentRetrievalDriver() | |
160 | { | |
161 | myReaderStatus = PCDM_RS_OK; | |
162 | } | |
163 | ||
164 | //======================================================================= | |
165 | //function : CreateDocument | |
166 | //purpose : pure virtual method definition | |
167 | //======================================================================= | |
168 | Handle(CDM_Document) XmlLDrivers_DocumentRetrievalDriver::CreateDocument() | |
169 | { | |
170 | return new TDocStd_Document(PCDM_RetrievalDriver::GetFormat()); | |
171 | } | |
172 | ||
7fd59977 | 173 | //======================================================================= |
174 | //function : Read | |
175 | //purpose : | |
176 | //======================================================================= | |
177 | void XmlLDrivers_DocumentRetrievalDriver::Read | |
6d8f9f4a | 178 | (const TCollection_ExtendedString& theFileName, |
179 | const Handle(CDM_Document)& theNewDocument, | |
180 | const Handle(CDM_Application)& theApplication, | |
7e785937 | 181 | const Message_ProgressRange& theRange) |
7fd59977 | 182 | { |
183 | myReaderStatus = PCDM_RS_DriverFailure; | |
184 | myFileName = theFileName; | |
4ff92abe | 185 | |
186 | std::ifstream aFileStream; | |
187 | OSD_OpenStream (aFileStream, myFileName, std::ios::in); | |
188 | ||
189 | if (aFileStream.is_open() && aFileStream.good()) | |
190 | { | |
7e785937 | 191 | Read (aFileStream, NULL, theNewDocument, theApplication, theRange); |
4ff92abe | 192 | } |
193 | else | |
194 | { | |
195 | myReaderStatus = PCDM_RS_OpenError; | |
196 | ||
197 | TCollection_ExtendedString aMsg = TCollection_ExtendedString("Error: the file ") + | |
198 | theFileName + " cannot be opened for reading"; | |
199 | ||
83ae3591 | 200 | theApplication->MessageDriver()->Send (aMsg.ToExtString(), Message_Fail); |
9775fa61 | 201 | throw Standard_Failure("File cannot be opened for reading"); |
4ff92abe | 202 | } |
203 | } | |
204 | ||
205 | //======================================================================= | |
206 | //function : Read | |
207 | //purpose : | |
208 | //======================================================================= | |
209 | void XmlLDrivers_DocumentRetrievalDriver::Read (Standard_IStream& theIStream, | |
210 | const Handle(Storage_Data)& /*theStorageData*/, | |
211 | const Handle(CDM_Document)& theNewDocument, | |
6d8f9f4a | 212 | const Handle(CDM_Application)& theApplication, |
7e785937 | 213 | const Message_ProgressRange& theRange) |
4ff92abe | 214 | { |
83ae3591 | 215 | Handle(Message_Messenger) aMessageDriver = theApplication -> MessageDriver(); |
7fd59977 | 216 | ::take_time (~0, " +++++ Start RETRIEVE procedures ++++++", aMessageDriver); |
217 | ||
218 | // 1. Read DOM_Document from file | |
219 | LDOMParser aParser; | |
4ff92abe | 220 | |
5fce1605 | 221 | // if myFileName is not empty, "document" tag is required to be read |
222 | // from the received document | |
223 | Standard_Boolean aWithoutRoot = myFileName.IsEmpty(); | |
224 | ||
225 | if (aParser.parse(theIStream, Standard_False, aWithoutRoot)) | |
7fd59977 | 226 | { |
227 | TCollection_AsciiString aData; | |
04232180 | 228 | std::cout << aParser.GetError(aData) << ": " << aData << std::endl; |
7fd59977 | 229 | myReaderStatus = PCDM_RS_FormatFailure; |
230 | return; | |
231 | } | |
232 | const XmlObjMgt_Element anElement= aParser.getDocument().getDocumentElement(); | |
233 | ::take_time (0, " +++++ Fin parsing XML : ", aMessageDriver); | |
234 | ||
7e785937 | 235 | ReadFromDomDocument (anElement, theNewDocument, theApplication, theRange); |
7fd59977 | 236 | } |
237 | ||
238 | //======================================================================= | |
239 | //function : ReadFromDomDocument | |
240 | //purpose : management of the macro-structure of XML document data | |
241 | //remark : If the application needs to use myRelocTable to retrieve additional | |
242 | // data from LDOM, this method should be reimplemented | |
243 | //======================================================================= | |
244 | ||
245 | void XmlLDrivers_DocumentRetrievalDriver::ReadFromDomDocument | |
246 | (const XmlObjMgt_Element& theElement, | |
247 | const Handle(CDM_Document)& theNewDocument, | |
6d8f9f4a | 248 | const Handle(CDM_Application)& theApplication, |
7e785937 | 249 | const Message_ProgressRange& theRange) |
7fd59977 | 250 | { |
83ae3591 | 251 | const Handle(Message_Messenger) aMsgDriver = |
7fd59977 | 252 | theApplication -> MessageDriver(); |
253 | // 1. Read info // to be done | |
254 | TCollection_AsciiString anAbsoluteDirectory = GetDirFromFile(myFileName); | |
255 | Standard_Integer aCurDocVersion = 0; | |
256 | TCollection_ExtendedString anInfo; | |
257 | const XmlObjMgt_Element anInfoElem = | |
258 | theElement.GetChildByTagName ("info"); | |
259 | if (anInfoElem != NULL) { | |
260 | XmlObjMgt_DOMString aDocVerStr = anInfoElem.getAttribute("DocVersion"); | |
261 | if(aDocVerStr == NULL) | |
262 | aCurDocVersion = 2; | |
263 | else if (!aDocVerStr.GetInteger(aCurDocVersion)) { | |
264 | TCollection_ExtendedString aMsg = | |
4fbddc7c | 265 | TCollection_ExtendedString ("Cannot retrieve the current Document version" |
7fd59977 | 266 | " attribute as \"") + aDocVerStr + "\""; |
267 | if(!aMsgDriver.IsNull()) | |
83ae3591 | 268 | aMsgDriver->Send(aMsg.ToExtString(), Message_Fail); |
4fbddc7c O |
269 | } |
270 | ||
271 | // oan: OCC22305 - check a document verison and if it's greater than | |
272 | // current version of storage driver set an error status and return | |
c2f5b821 | 273 | if( aCurDocVersion > XmlLDrivers::StorageVersion() ) |
4fbddc7c O |
274 | { |
275 | TCollection_ExtendedString aMsg = | |
276 | TCollection_ExtendedString ("error: wrong file version: ") + | |
277 | aDocVerStr + " while current is " + | |
278 | XmlLDrivers::StorageVersion(); | |
279 | myReaderStatus = PCDM_RS_NoVersion; | |
280 | if(!aMsgDriver.IsNull()) | |
83ae3591 | 281 | aMsgDriver->Send(aMsg.ToExtString(), Message_Fail); |
4fbddc7c | 282 | return; |
7fd59977 | 283 | } |
4fbddc7c O |
284 | |
285 | if( aCurDocVersion < 2) aCurDocVersion = 2; | |
7fd59977 | 286 | Standard_Boolean isRef = Standard_False; |
287 | for (LDOM_Node aNode = anInfoElem.getFirstChild(); | |
288 | aNode != NULL; aNode = aNode.getNextSibling()) { | |
289 | if (aNode.getNodeType() == LDOM_Node::ELEMENT_NODE) { | |
290 | if (XmlObjMgt::GetExtendedString ((LDOM_Element&)aNode, anInfo)) { | |
291 | ||
4fbddc7c O |
292 | // Read ref counter |
293 | if(anInfo.Search(REFERENCE_COUNTER) != -1) { | |
294 | try { | |
295 | OCC_CATCH_SIGNALS | |
296 | TCollection_AsciiString anInf(anInfo,'?'); | |
4ff92abe | 297 | Standard_Integer aRefCounter = anInf.Token(" ",2).IntegerValue(); |
298 | theNewDocument->SetReferenceCounter(aRefCounter); | |
4fbddc7c | 299 | } |
a738b534 | 300 | catch (Standard_Failure const&) { |
04232180 | 301 | // std::cout << "warning: could not read the reference counter in " << aFileName << std::endl; |
4fbddc7c O |
302 | TCollection_ExtendedString aMsg("Warning: "); |
303 | aMsg = aMsg.Cat("could not read the reference counter").Cat("\0"); | |
304 | if(!aMsgDriver.IsNull()) | |
83ae3591 | 305 | aMsgDriver->Send(aMsg.ToExtString(), Message_Warning); |
4fbddc7c O |
306 | } |
307 | } | |
4ff92abe | 308 | else if (anInfo.Search(MODIFICATION_COUNTER) != -1) { |
309 | try { | |
310 | OCC_CATCH_SIGNALS | |
311 | ||
312 | TCollection_AsciiString anInf(anInfo,'?'); | |
313 | Standard_Integer aModCounter = anInf.Token(" ",2).IntegerValue(); | |
314 | theNewDocument->SetModifications (aModCounter); | |
315 | } | |
a738b534 | 316 | catch (Standard_Failure const&) { |
4ff92abe | 317 | TCollection_ExtendedString aMsg("Warning: could not read the modification counter\0"); |
318 | if(!aMsgDriver.IsNull()) | |
83ae3591 | 319 | aMsgDriver->Send(aMsg.ToExtString(), Message_Warning); |
4ff92abe | 320 | } |
321 | } | |
4fbddc7c O |
322 | |
323 | if(anInfo == END_REF) | |
324 | isRef = Standard_False; | |
325 | if(isRef) { // Process References | |
326 | ||
327 | Standard_Integer pos=anInfo.Search(" "); | |
328 | if(pos != -1) { | |
329 | // Parce RefId, DocumentVersion and FileName | |
330 | Standard_Integer aRefId; | |
331 | TCollection_ExtendedString aFileName; | |
332 | Standard_Integer aDocumentVersion; | |
333 | ||
334 | ||
335 | TCollection_ExtendedString aRest=anInfo.Split(pos); | |
336 | aRefId = UTL::IntegerValue(anInfo); | |
337 | ||
338 | Standard_Integer pos2 = aRest.Search(" "); | |
339 | ||
340 | aFileName = aRest.Split(pos2); | |
341 | aDocumentVersion = UTL::IntegerValue(aRest); | |
342 | ||
343 | TCollection_AsciiString aPath = UTL::CString(aFileName); | |
344 | TCollection_AsciiString anAbsolutePath; | |
345 | if(!anAbsoluteDirectory.IsEmpty()) { | |
346 | anAbsolutePath = AbsolutePath(anAbsoluteDirectory,aPath); | |
347 | if(!anAbsolutePath.IsEmpty()) aPath=anAbsolutePath; | |
348 | } | |
349 | if(!aMsgDriver.IsNull()) { | |
04232180 | 350 | // std::cout << "reference found; ReferenceIdentifier: " << theReferenceIdentifier << "; File:" << thePath << ", version:" << theDocumentVersion; |
83ae3591 | 351 | TCollection_ExtendedString aMsg("Warning: "); |
352 | aMsg = aMsg.Cat("reference found; ReferenceIdentifier: ").Cat(aRefId).Cat("; File:").Cat(aPath).Cat(", version:").Cat(aDocumentVersion).Cat("\0"); | |
353 | aMsgDriver->Send(aMsg.ToExtString(), Message_Warning); | |
4fbddc7c O |
354 | } |
355 | // Add new ref! | |
356 | ///////////// | |
357 | TCollection_ExtendedString theFolder,theName; | |
358 | //TCollection_ExtendedString theFile=myReferences(myIterator).FileName(); | |
359 | TCollection_ExtendedString f(aPath); | |
57c28b61 | 360 | #ifndef _WIN32 |
4fbddc7c O |
361 | |
362 | Standard_Integer i= f.SearchFromEnd("/"); | |
363 | TCollection_ExtendedString n = f.Split(i); | |
364 | f.Trunc(f.Length()-1); | |
365 | theFolder = f; | |
366 | theName = n; | |
7fd59977 | 367 | #else |
4fbddc7c O |
368 | OSD_Path p = UTL::Path(f); |
369 | Standard_ExtCharacter chr; | |
370 | TCollection_ExtendedString dir, dirRet, name; | |
371 | ||
372 | dir = UTL::Disk(p); | |
373 | dir += UTL::Trek(p); | |
374 | ||
375 | for ( int i = 1; i <= dir.Length (); ++i ) { | |
376 | ||
377 | chr = dir.Value ( i ); | |
378 | ||
379 | switch ( chr ) { | |
7c65581d | 380 | |
381 | case '|': | |
382 | dirRet += "/"; | |
4fbddc7c | 383 | break; |
7c65581d | 384 | |
385 | case '^': | |
386 | ||
387 | dirRet += ".."; | |
4fbddc7c | 388 | break; |
7fd59977 | 389 | |
4fbddc7c O |
390 | default: |
391 | dirRet += chr; | |
392 | ||
393 | } | |
394 | } | |
395 | theFolder = dirRet; | |
396 | theName = UTL::Name(p); theName+= UTL::Extension(p); | |
57c28b61 | 397 | #endif // _WIN32 |
4fbddc7c O |
398 | |
399 | Handle(CDM_MetaData) aMetaData = CDM_MetaData::LookUp(theFolder,theName,aPath,aPath,UTL::IsReadOnly(aFileName)); | |
7fd59977 | 400 | //////////// |
4fbddc7c O |
401 | theNewDocument->CreateReference(aMetaData,aRefId, |
402 | theApplication,aDocumentVersion,Standard_False); | |
7fd59977 | 403 | |
4fbddc7c O |
404 | |
405 | } | |
7fd59977 | 406 | |
4fbddc7c O |
407 | |
408 | } | |
409 | if(anInfo == START_REF) | |
410 | isRef = Standard_True; | |
7fd59977 | 411 | } |
412 | } | |
413 | } | |
414 | } | |
415 | ||
416 | // 2. Read comments | |
417 | TCollection_ExtendedString aComment; | |
418 | const XmlObjMgt_Element aCommentsElem = | |
419 | theElement.GetChildByTagName ("comments"); | |
420 | if (aCommentsElem != NULL) | |
421 | { | |
422 | for (LDOM_Node aNode = aCommentsElem.getFirstChild(); | |
423 | aNode != NULL; aNode = aNode.getNextSibling()) | |
424 | { | |
425 | if (aNode.getNodeType() == LDOM_Node::ELEMENT_NODE) | |
426 | { | |
427 | if (XmlObjMgt::GetExtendedString ((LDOM_Element&)aNode, aComment)) | |
428 | { | |
429 | theNewDocument->AddComment(aComment); | |
430 | } | |
431 | } | |
432 | } | |
433 | } | |
7e785937 | 434 | Message_ProgressScope aPS(theRange, "Reading document", 2); |
7fd59977 | 435 | // 2. Read Shapes section |
436 | if (myDrivers.IsNull()) myDrivers = AttributeDrivers (aMsgDriver); | |
7e785937 | 437 | const Handle(XmlMDF_ADriver) aNSDriver = ReadShapeSection(theElement, aMsgDriver, aPS.Next()); |
7fd59977 | 438 | if(!aNSDriver.IsNull()) |
439 | ::take_time (0, " +++++ Fin reading Shapes : ", aMsgDriver); | |
440 | ||
6d8f9f4a | 441 | if (!aPS.More()) |
442 | { | |
443 | myReaderStatus = PCDM_RS_UserBreak; | |
444 | return; | |
445 | } | |
6d8f9f4a | 446 | |
b34d86cb | 447 | // 2.1. Keep document format version in RT |
448 | Handle(Storage_HeaderData) aHeaderData = new Storage_HeaderData(); | |
449 | aHeaderData->SetStorageVersion(aCurDocVersion); | |
450 | myRelocTable.Clear(); | |
451 | myRelocTable.SetHeaderData(aHeaderData); | |
452 | ||
7fd59977 | 453 | // 5. Read document contents |
454 | try | |
455 | { | |
456 | OCC_CATCH_SIGNALS | |
0797d9d3 | 457 | #ifdef OCCT_DEBUG |
7fd59977 | 458 | TCollection_ExtendedString aMessage ("PasteDocument"); |
83ae3591 | 459 | aMsgDriver ->Send (aMessage.ToExtString(), Message_Trace); |
7fd59977 | 460 | #endif |
7e785937 | 461 | if (!MakeDocument(theElement, theNewDocument, aPS.Next())) |
7fd59977 | 462 | myReaderStatus = PCDM_RS_MakeFailure; |
463 | else | |
464 | myReaderStatus = PCDM_RS_OK; | |
465 | } | |
9775fa61 | 466 | catch (Standard_Failure const& anException) |
7fd59977 | 467 | { |
9775fa61 | 468 | TCollection_ExtendedString anErrorString (anException.GetMessageString()); |
83ae3591 | 469 | aMsgDriver ->Send (anErrorString.ToExtString(), Message_Fail); |
7fd59977 | 470 | } |
6d8f9f4a | 471 | if (!aPS.More()) |
472 | { | |
473 | myReaderStatus = PCDM_RS_UserBreak; | |
474 | return; | |
475 | } | |
7fd59977 | 476 | |
477 | // Wipe off the shapes written to the <shapes> section | |
478 | ShapeSetCleaning(aNSDriver); | |
479 | ||
480 | // Clean the relocation table. | |
481 | // If the application needs to use myRelocTable to retrieve additional | |
482 | // data from LDOM, this method should be reimplemented avoiding this step | |
483 | myRelocTable.Clear(); | |
484 | ::take_time (0, " +++++ Fin reading data OCAF : ", aMsgDriver); | |
485 | } | |
486 | ||
487 | //======================================================================= | |
488 | //function : MakeDocument | |
489 | //purpose : | |
490 | //======================================================================= | |
491 | Standard_Boolean XmlLDrivers_DocumentRetrievalDriver::MakeDocument | |
492 | (const XmlObjMgt_Element& theElement, | |
6d8f9f4a | 493 | const Handle(CDM_Document)& theTDoc, |
7e785937 | 494 | const Message_ProgressRange& theRange) |
7fd59977 | 495 | { |
496 | Standard_Boolean aResult = Standard_False; | |
497 | Handle(TDocStd_Document) TDOC = Handle(TDocStd_Document)::DownCast(theTDoc); | |
7fd59977 | 498 | if (!TDOC.IsNull()) |
499 | { | |
500 | Handle(TDF_Data) aTDF = new TDF_Data(); | |
7e785937 | 501 | aResult = XmlMDF::FromTo (theElement, aTDF, myRelocTable, myDrivers, theRange); |
7fd59977 | 502 | if (aResult) { |
503 | TDOC->SetData (aTDF); | |
504 | TDocStd_Owner::SetDocument (aTDF, TDOC); | |
505 | } | |
506 | } | |
507 | return aResult; | |
508 | } | |
509 | ||
510 | //======================================================================= | |
511 | //function : AttributeDrivers | |
512 | //purpose : | |
513 | //======================================================================= | |
514 | Handle(XmlMDF_ADriverTable) XmlLDrivers_DocumentRetrievalDriver::AttributeDrivers | |
83ae3591 | 515 | (const Handle(Message_Messenger)& theMessageDriver) |
7fd59977 | 516 | { |
517 | return XmlLDrivers::AttributeDrivers (theMessageDriver); | |
518 | } | |
519 | ||
520 | //======================================================================= | |
521 | //function : take_time | |
522 | //class : static | |
523 | //purpose : output astronomical time elapsed | |
524 | //======================================================================= | |
525 | #ifdef TAKE_TIMES | |
526 | #include <time.h> | |
527 | #include <sys/timeb.h> | |
528 | #include <sys/types.h> | |
529 | #include <stdio.h> | |
57c28b61 | 530 | #ifndef _WIN32 |
7fd59977 | 531 | extern "C" int ftime (struct timeb *tp); |
532 | #endif | |
533 | extern struct timeb tmbuf0; | |
534 | ||
535 | static void take_time (const Standard_Integer isReset, const char * aHeader, | |
83ae3591 | 536 | const Handle(Message_Messenger)& aMessageDriver) |
7fd59977 | 537 | { |
538 | struct timeb tmbuf; | |
539 | ftime (&tmbuf); | |
540 | TCollection_ExtendedString aMessage ((Standard_CString)aHeader); | |
541 | if (isReset) tmbuf0 = tmbuf; | |
542 | else { | |
543 | char take_tm_buf [64]; | |
91322f44 | 544 | Sprintf (take_tm_buf, "%9.2f s ++++", |
7fd59977 | 545 | double(tmbuf.time - tmbuf0.time) + |
546 | double(tmbuf.millitm - tmbuf0.millitm)/1000.); | |
547 | aMessage += take_tm_buf; | |
548 | } | |
549 | aMessageDriver -> Write (aMessage.ToExtString()); | |
550 | } | |
551 | #endif | |
552 | ||
7fd59977 | 553 | //======================================================================= |
554 | //function : ReadShapeSection | |
555 | //purpose : definition of ReadShapeSection | |
556 | //======================================================================= | |
557 | Handle(XmlMDF_ADriver) XmlLDrivers_DocumentRetrievalDriver::ReadShapeSection( | |
558 | const XmlObjMgt_Element& /*theElement*/, | |
6d8f9f4a | 559 | const Handle(Message_Messenger)& /*aMsgDriver*/, |
7e785937 | 560 | const Message_ProgressRange& /*theRange*/) |
7fd59977 | 561 | { |
562 | Handle(XmlMDF_ADriver) aDriver; | |
563 | //empty; to be redefined | |
564 | return aDriver; | |
565 | } | |
566 | ||
567 | //======================================================================= | |
568 | //function : ShapeSetCleaning | |
569 | //purpose : definition of ShapeSetCleaning | |
570 | //======================================================================= | |
571 | void XmlLDrivers_DocumentRetrievalDriver::ShapeSetCleaning( | |
4fbddc7c | 572 | const Handle(XmlMDF_ADriver)& /*theDriver*/) |
7fd59977 | 573 | {} |