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 "vtkIOXMLParserModule.h" // For export macro 00035 #include "vtkXMLParser.h" 00036 #include "vtkXMLDataElement.h"//For inline definition. 00037 00038 class vtkInputStream; 00039 class vtkDataCompressor; 00040 00041 class VTKIOXMLPARSER_EXPORT vtkXMLDataParser : public vtkXMLParser 00042 { 00043 public: 00044 vtkTypeMacro(vtkXMLDataParser,vtkXMLParser); 00045 void PrintSelf(ostream& os, vtkIndent indent); 00046 static vtkXMLDataParser* New(); 00047 00049 vtkXMLDataElement* GetRootElement(); 00050 00051 //BTX 00053 enum { BigEndian, LittleEndian }; 00054 00056 00058 size_t ReadInlineData(vtkXMLDataElement* element, int isAscii, 00059 void* buffer, vtkTypeUInt64 startWord, 00060 size_t numWords, int wordType); 00061 size_t ReadInlineData(vtkXMLDataElement* element, int isAscii, 00062 char* buffer, vtkTypeUInt64 startWord, 00063 size_t numWords) 00064 { return this->ReadInlineData(element, isAscii, buffer, startWord, 00065 numWords, VTK_CHAR); } 00067 00069 00071 size_t ReadAppendedData(vtkTypeInt64 offset, void* buffer, 00072 vtkTypeUInt64 startWord, 00073 size_t numWords, int wordType); 00074 size_t ReadAppendedData(vtkTypeInt64 offset, char* buffer, 00075 vtkTypeUInt64 startWord, 00076 size_t numWords) 00077 { return this->ReadAppendedData(offset, buffer, startWord, numWords, 00078 VTK_CHAR); } 00080 00082 00084 size_t ReadAsciiData(void* buffer, vtkTypeUInt64 startWord, 00085 size_t numWords, int wordType); 00087 00089 00091 size_t ReadBinaryData(void* buffer, vtkTypeUInt64 startWord, 00092 size_t maxWords, int wordType); 00093 //ETX 00095 00097 00099 virtual void SetCompressor(vtkDataCompressor*); 00100 vtkGetObjectMacro(Compressor, vtkDataCompressor); 00102 00104 size_t GetWordTypeSize(int wordType); 00105 00108 virtual int Parse(); 00109 00111 00113 vtkGetMacro(Abort, int); 00114 vtkSetMacro(Abort, int); 00116 00118 00120 vtkGetMacro(Progress, float); 00121 vtkSetMacro(Progress, float); 00123 00125 00132 vtkSetClampMacro(AttributesEncoding,int,VTK_ENCODING_NONE,VTK_ENCODING_UNKNOWN); 00133 vtkGetMacro(AttributesEncoding, int); 00135 00140 virtual void CharacterDataHandler(const char* data, int length); 00141 00143 00145 vtkTypeInt64 GetAppendedDataPosition() 00146 { 00147 return this->AppendedDataPosition; 00148 } 00150 00151 protected: 00152 vtkXMLDataParser(); 00153 ~vtkXMLDataParser(); 00154 00155 // This parser does not support parsing from a string. 00156 virtual int Parse(const char*); 00157 virtual int Parse(const char*, unsigned int); 00158 00159 // Implement parsing methods. 00160 virtual void StartElement(const char* name, const char** atts); 00161 virtual void EndElement(const char*); 00162 00163 int ParsingComplete(); 00164 int CheckPrimaryAttributes(); 00165 void FindAppendedDataPosition(); 00166 int ParseBuffer(const char* buffer, unsigned int count); 00167 00168 void AddElement(vtkXMLDataElement* element); 00169 void PushOpenElement(vtkXMLDataElement* element); 00170 vtkXMLDataElement* PopOpenElement(); 00171 void FreeAllElements(); 00172 void PerformByteSwap(void* data, size_t numWords, size_t wordSize); 00173 00174 // Data reading methods. 00175 void ReadCompressionHeader(); 00176 size_t FindBlockSize(vtkTypeUInt64 block); 00177 int ReadBlock(vtkTypeUInt64 block, unsigned char* buffer); 00178 unsigned char* ReadBlock(vtkTypeUInt64 block); 00179 size_t ReadUncompressedData(unsigned char* data, 00180 vtkTypeUInt64 startWord, 00181 size_t numWords, 00182 size_t wordSize); 00183 size_t ReadCompressedData(unsigned char* data, 00184 vtkTypeUInt64 startWord, 00185 size_t numWords, 00186 size_t wordSize); 00187 00188 // Go to the start of the inline data 00189 void SeekInlineDataPosition(vtkXMLDataElement *element); 00190 00191 // Ascii data reading methods. 00192 int ParseAsciiData(int wordType); 00193 void FreeAsciiBuffer(); 00194 00195 // Progress update methods. 00196 void UpdateProgress(float progress); 00197 00198 // The root XML element. 00199 vtkXMLDataElement* RootElement; 00200 00201 // The stack of elements currently being parsed. 00202 vtkXMLDataElement** OpenElements; 00203 unsigned int NumberOfOpenElements; 00204 unsigned int OpenElementsSize; 00205 00206 // The position of the appended data section, if found. 00207 vtkTypeInt64 AppendedDataPosition; 00208 00209 // How much of the string "<AppendedData" has been matched in input. 00210 int AppendedDataMatched; 00211 00212 // The byte order of the binary input. 00213 int ByteOrder; 00214 00215 // The word type of binary input headers. 00216 int HeaderType; 00217 00218 // The input stream used to read data. Set by ReadAppendedData and 00219 // ReadInlineData methods. 00220 vtkInputStream* DataStream; 00221 00222 // The input stream used to read inline data. May transparently 00223 // decode the data. 00224 vtkInputStream* InlineDataStream; 00225 00226 // The stream to use for appended data. 00227 vtkInputStream* AppendedDataStream; 00228 00229 // Decompression data. 00230 vtkDataCompressor* Compressor; 00231 size_t NumberOfBlocks; 00232 size_t BlockUncompressedSize; 00233 size_t PartialLastBlockUncompressedSize; 00234 size_t* BlockCompressedSizes; 00235 vtkTypeInt64* BlockStartOffsets; 00236 00237 // Ascii data parsing. 00238 unsigned char* AsciiDataBuffer; 00239 size_t AsciiDataBufferLength; 00240 int AsciiDataWordType; 00241 vtkTypeInt64 AsciiDataPosition; 00242 00243 // Progress during reading of data. 00244 float Progress; 00245 00246 // Abort flag checked during reading of data. 00247 int Abort; 00248 00249 int AttributesEncoding; 00250 00251 private: 00252 vtkXMLDataParser(const vtkXMLDataParser&); // Not implemented. 00253 void operator=(const vtkXMLDataParser&); // Not implemented. 00254 }; 00255 00256 //---------------------------------------------------------------------------- 00257 inline 00258 void vtkXMLDataParser::CharacterDataHandler(const char* data, int length ) 00259 { 00260 const unsigned int eid=this->NumberOfOpenElements-1; 00261 this->OpenElements[eid]->AddCharacterData(data, length); 00262 } 00263 00264 00265 #endif