Main Page | Class Hierarchy | Alphabetical List | Class List | File List | Class Members | File Members | Related Pages

dox/IO/vtkXMLDataParser.h

Go to the documentation of this file.
00001 /*========================================================================= 00002 00003 Program: Visualization Toolkit 00004 Module: $RCSfile: vtkXMLDataParser.h,v $ 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 00036 class vtkXMLDataElement; 00037 class vtkInputStream; 00038 class vtkDataCompressor; 00039 00040 class VTK_IO_EXPORT vtkXMLDataParser : public vtkXMLParser 00041 { 00042 public: 00043 vtkTypeRevisionMacro(vtkXMLDataParser,vtkXMLParser); 00044 void PrintSelf(ostream& os, vtkIndent indent); 00045 static vtkXMLDataParser* New(); 00046 00047 //BTX 00049 00050 enum { BigEndian, LittleEndian }; 00051 //ETX 00053 00055 vtkXMLDataElement* GetRootElement(); 00056 00058 00060 unsigned long ReadInlineData(vtkXMLDataElement* element, int isAscii, 00061 void* buffer, int startWord, int numWords, 00062 int wordType); 00063 unsigned long ReadInlineData(vtkXMLDataElement* element, int isAscii, 00064 char* buffer, int startWord, int numWords) 00065 { return this->ReadInlineData(element, isAscii, buffer, startWord, 00066 numWords, VTK_CHAR); } 00068 00070 00072 unsigned long ReadAppendedData(unsigned long offset, void* buffer, 00073 int startWord, int numWords, int wordType); 00074 unsigned long ReadAppendedData(unsigned long offset, char* buffer, 00075 int startWord, int numWords) 00076 { return this->ReadAppendedData(offset, buffer, startWord, numWords, 00077 VTK_CHAR); } 00079 00081 00083 unsigned long ReadAsciiData(void* buffer, int startWord, int numWords, 00084 int wordType); 00086 00088 00090 unsigned long ReadBinaryData(void* buffer, int startWord, int maxWords, 00091 int wordType); 00093 00095 00097 virtual void SetCompressor(vtkDataCompressor*); 00098 vtkGetObjectMacro(Compressor, vtkDataCompressor); 00100 00102 unsigned long GetWordTypeSize(int wordType); 00103 00106 virtual int Parse(); 00107 00109 00111 vtkGetMacro(Abort, int); 00112 vtkSetMacro(Abort, int); 00114 00116 00118 vtkGetMacro(Progress, float); 00119 vtkSetMacro(Progress, float); 00121 00123 00130 vtkSetClampMacro(AttributesEncoding,int,VTK_ENCODING_NONE,VTK_ENCODING_UNKNOWN); 00131 vtkGetMacro(AttributesEncoding, int); 00133 00134 protected: 00135 vtkXMLDataParser(); 00136 ~vtkXMLDataParser(); 00137 00138 // This parser does not support parsing from a string. 00139 virtual int Parse(const char*); 00140 virtual int Parse(const char*, unsigned int); 00141 00142 // Implement parsing methods. 00143 void StartElement(const char* name, const char** atts); 00144 void EndElement(const char*); 00145 int ParsingComplete(); 00146 int CheckPrimaryAttributes(); 00147 void FindAppendedDataPosition(); 00148 unsigned long FindInlineDataPosition(unsigned long start); 00149 int ParseBuffer(const char* buffer, unsigned int count); 00150 00151 void AddElement(vtkXMLDataElement* element); 00152 void PushOpenElement(vtkXMLDataElement* element); 00153 vtkXMLDataElement* PopOpenElement(); 00154 void FreeAllElements(); 00155 void PerformByteSwap(void* data, int numWords, int wordSize); 00156 00157 // Data reading methods. 00158 void ReadCompressionHeader(); 00159 unsigned int FindBlockSize(unsigned int block); 00160 int ReadBlock(unsigned int block, unsigned char* buffer); 00161 unsigned char* ReadBlock(unsigned int block); 00162 unsigned long ReadUncompressedData(unsigned char* data, 00163 unsigned long startWord, 00164 unsigned long numWords, 00165 int wordSize); 00166 unsigned long ReadCompressedData(unsigned char* data, 00167 unsigned long startWord, 00168 unsigned long numWords, 00169 int wordSize); 00170 00171 // Ascii data reading methods. 00172 int ParseAsciiData(int wordType); 00173 void FreeAsciiBuffer(); 00174 00175 // Progress update methods. 00176 void UpdateProgress(float progress); 00177 00178 // The root XML element. 00179 vtkXMLDataElement* RootElement; 00180 00181 // The stack of elements currently being parsed. 00182 vtkXMLDataElement** OpenElements; 00183 unsigned int NumberOfOpenElements; 00184 unsigned int OpenElementsSize; 00185 00186 // The position of the appended data section, if found. 00187 unsigned long AppendedDataPosition; 00188 00189 // How much of the string "<AppendedData" has been matched in input. 00190 int AppendedDataMatched; 00191 00192 // The byte order of the binary input. 00193 int ByteOrder; 00194 00195 // The input stream used to read data. Set by ReadAppendedData and 00196 // ReadInlineData methods. 00197 vtkInputStream* DataStream; 00198 00199 // The input stream used to read inline data. May transparently 00200 // decode the data. 00201 vtkInputStream* InlineDataStream; 00202 00203 // The stream to use for appended data. 00204 vtkInputStream* AppendedDataStream; 00205 00206 //BTX 00207 // We need a 32 bit unsigned integer type for platform-independent 00208 // binary headers. Note that this is duplicated in vtkXMLWriter.h. 00209 #if VTK_SIZEOF_SHORT == 4 00210 typedef unsigned short HeaderType; 00211 #elif VTK_SIZEOF_INT == 4 00212 typedef unsigned int HeaderType; 00213 #elif VTK_SIZEOF_LONG == 4 00214 typedef unsigned long HeaderType; 00215 #else 00216 # error "No native data type can represent an unsigned 32-bit integer." 00217 #endif 00218 //ETX 00219 00220 // Decompression data. 00221 vtkDataCompressor* Compressor; 00222 unsigned int NumberOfBlocks; 00223 unsigned int BlockUncompressedSize; 00224 unsigned int PartialLastBlockUncompressedSize; 00225 HeaderType* BlockCompressedSizes; 00226 unsigned long* BlockStartOffsets; 00227 00228 // Ascii data parsing. 00229 unsigned char* AsciiDataBuffer; 00230 int AsciiDataBufferLength; 00231 int AsciiDataWordType; 00232 unsigned long AsciiDataPosition; 00233 00234 // Progress during reading of data. 00235 float Progress; 00236 00237 // Abort flag checked during reading of data. 00238 int Abort; 00239 00240 int AttributesEncoding; 00241 00242 private: 00243 vtkXMLDataParser(const vtkXMLDataParser&); // Not implemented. 00244 void operator=(const vtkXMLDataParser&); // Not implemented. 00245 }; 00246 00247 #endif