VTK
|
00001 /*========================================================================= 00002 00003 Program: Visualization Toolkit 00004 Module: vtkXMLDataParser.h 00005 00006 Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen 00007 All rights reserved. 00008 See Copyright.txt or http://www.kitware.com/Copyright.htm for details. 00009 00010 This software is distributed WITHOUT ANY WARRANTY; without even 00011 the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 00012 PURPOSE. See the above copyright notice for more information. 00013 00014 =========================================================================*/ 00031 #ifndef __vtkXMLDataParser_h 00032 #define __vtkXMLDataParser_h 00033 00034 #include "vtkXMLParser.h" 00035 #include "vtkXMLDataElement.h"//For inline definition. 00036 00037 class vtkInputStream; 00038 class vtkDataCompressor; 00039 00040 class VTK_IO_EXPORT vtkXMLDataParser : public vtkXMLParser 00041 { 00042 public: 00043 vtkTypeMacro(vtkXMLDataParser,vtkXMLParser); 00044 void PrintSelf(ostream& os, vtkIndent indent); 00045 static vtkXMLDataParser* New(); 00046 00048 vtkXMLDataElement* GetRootElement(); 00049 00050 //BTX 00052 enum { BigEndian, LittleEndian }; 00053 00058 typedef vtkIdType OffsetType; 00059 00061 00063 OffsetType ReadInlineData(vtkXMLDataElement* element, int isAscii, 00064 void* buffer, OffsetType startWord, 00065 OffsetType numWords, int wordType); 00066 OffsetType ReadInlineData(vtkXMLDataElement* element, int isAscii, 00067 char* buffer, OffsetType startWord, 00068 OffsetType numWords) 00069 { return this->ReadInlineData(element, isAscii, buffer, startWord, 00070 numWords, VTK_CHAR); } 00072 00074 00076 OffsetType ReadAppendedData(OffsetType offset, void* buffer, 00077 OffsetType startWord, 00078 OffsetType numWords, int wordType); 00079 OffsetType ReadAppendedData(OffsetType offset, char* buffer, 00080 OffsetType startWord, 00081 OffsetType numWords) 00082 { return this->ReadAppendedData(offset, buffer, startWord, numWords, 00083 VTK_CHAR); } 00085 00087 00089 OffsetType ReadAsciiData(void* buffer, OffsetType startWord, 00090 OffsetType numWords, int wordType); 00092 00094 00096 OffsetType ReadBinaryData(void* buffer, OffsetType startWord, 00097 OffsetType maxWords, int wordType); 00098 //ETX 00100 00102 00104 virtual void SetCompressor(vtkDataCompressor*); 00105 vtkGetObjectMacro(Compressor, vtkDataCompressor); 00107 00109 unsigned long GetWordTypeSize(int wordType); 00110 00113 virtual int Parse(); 00114 00116 00118 vtkGetMacro(Abort, int); 00119 vtkSetMacro(Abort, int); 00121 00123 00125 vtkGetMacro(Progress, float); 00126 vtkSetMacro(Progress, float); 00128 00130 00137 vtkSetClampMacro(AttributesEncoding,int,VTK_ENCODING_NONE,VTK_ENCODING_UNKNOWN); 00138 vtkGetMacro(AttributesEncoding, int); 00140 00145 virtual void CharacterDataHandler(const char* data, int length); 00146 00147 protected: 00148 vtkXMLDataParser(); 00149 ~vtkXMLDataParser(); 00150 00151 // This parser does not support parsing from a string. 00152 virtual int Parse(const char*); 00153 virtual int Parse(const char*, unsigned int); 00154 00155 // Implement parsing methods. 00156 virtual void StartElement(const char* name, const char** atts); 00157 virtual void EndElement(const char*); 00158 00159 int ParsingComplete(); 00160 int CheckPrimaryAttributes(); 00161 void FindAppendedDataPosition(); 00162 OffsetType FindInlineDataPosition(OffsetType start); 00163 int ParseBuffer(const char* buffer, unsigned int count); 00164 00165 void AddElement(vtkXMLDataElement* element); 00166 void PushOpenElement(vtkXMLDataElement* element); 00167 vtkXMLDataElement* PopOpenElement(); 00168 void FreeAllElements(); 00169 void PerformByteSwap(void* data, OffsetType numWords, int wordSize); 00170 00171 // Data reading methods. 00172 void ReadCompressionHeader(); 00173 unsigned int FindBlockSize(unsigned int block); 00174 int ReadBlock(unsigned int block, unsigned char* buffer); 00175 unsigned char* ReadBlock(unsigned int block); 00176 OffsetType ReadUncompressedData(unsigned char* data, 00177 OffsetType startWord, 00178 OffsetType numWords, 00179 int wordSize); 00180 OffsetType ReadCompressedData(unsigned char* data, 00181 OffsetType startWord, 00182 OffsetType numWords, 00183 int wordSize); 00184 00185 // Go to the start of the inline data 00186 void SeekInlineDataPosition(vtkXMLDataElement *element); 00187 00188 // Ascii data reading methods. 00189 int ParseAsciiData(int wordType); 00190 void FreeAsciiBuffer(); 00191 00192 // Progress update methods. 00193 void UpdateProgress(float progress); 00194 00195 // The root XML element. 00196 vtkXMLDataElement* RootElement; 00197 00198 // The stack of elements currently being parsed. 00199 vtkXMLDataElement** OpenElements; 00200 unsigned int NumberOfOpenElements; 00201 unsigned int OpenElementsSize; 00202 00203 // The position of the appended data section, if found. 00204 OffsetType AppendedDataPosition; 00205 00206 // How much of the string "<AppendedData" has been matched in input. 00207 int AppendedDataMatched; 00208 00209 // The byte order of the binary input. 00210 int ByteOrder; 00211 00212 // The input stream used to read data. Set by ReadAppendedData and 00213 // ReadInlineData methods. 00214 vtkInputStream* DataStream; 00215 00216 // The input stream used to read inline data. May transparently 00217 // decode the data. 00218 vtkInputStream* InlineDataStream; 00219 00220 // The stream to use for appended data. 00221 vtkInputStream* AppendedDataStream; 00222 00223 //BTX 00224 // We need a 32 bit unsigned integer type for platform-independent 00225 // binary headers. Note that this is duplicated in vtkXMLWriter.h. 00226 #if VTK_SIZEOF_SHORT == 4 00227 typedef unsigned short HeaderType; 00228 #elif VTK_SIZEOF_INT == 4 00229 typedef unsigned int HeaderType; 00230 #elif VTK_SIZEOF_LONG == 4 00231 typedef unsigned long HeaderType; 00232 #else 00233 # error "No native data type can represent an unsigned 32-bit integer." 00234 #endif 00235 //ETX 00236 00237 // Decompression data. 00238 vtkDataCompressor* Compressor; 00239 unsigned int NumberOfBlocks; 00240 unsigned int BlockUncompressedSize; 00241 unsigned int PartialLastBlockUncompressedSize; 00242 HeaderType* BlockCompressedSizes; 00243 OffsetType* BlockStartOffsets; 00244 00245 // Ascii data parsing. 00246 unsigned char* AsciiDataBuffer; 00247 OffsetType AsciiDataBufferLength; 00248 int AsciiDataWordType; 00249 OffsetType AsciiDataPosition; 00250 00251 // Progress during reading of data. 00252 float Progress; 00253 00254 // Abort flag checked during reading of data. 00255 int Abort; 00256 00257 int AttributesEncoding; 00258 00259 private: 00260 vtkXMLDataParser(const vtkXMLDataParser&); // Not implemented. 00261 void operator=(const vtkXMLDataParser&); // Not implemented. 00262 }; 00263 00264 //---------------------------------------------------------------------------- 00265 inline 00266 void vtkXMLDataParser::CharacterDataHandler(const char* data, int length ) 00267 { 00268 const unsigned int eid=this->NumberOfOpenElements-1; 00269 this->OpenElements[eid]->AddCharacterData(data, length); 00270 } 00271 00272 00273 #endif