00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
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
00049
00050 enum { BigEndian, LittleEndian };
00051
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
00139 virtual int Parse(const char*);
00140 virtual int Parse(const char*, unsigned int);
00141
00142
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
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
00172 int ParseAsciiData(int wordType);
00173 void FreeAsciiBuffer();
00174
00175
00176 void UpdateProgress(float progress);
00177
00178
00179 vtkXMLDataElement* RootElement;
00180
00181
00182 vtkXMLDataElement** OpenElements;
00183 unsigned int NumberOfOpenElements;
00184 unsigned int OpenElementsSize;
00185
00186
00187 unsigned long AppendedDataPosition;
00188
00189
00190 int AppendedDataMatched;
00191
00192
00193 int ByteOrder;
00194
00195
00196
00197 vtkInputStream* DataStream;
00198
00199
00200
00201 vtkInputStream* InlineDataStream;
00202
00203
00204 vtkInputStream* AppendedDataStream;
00205
00206
00207
00208
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
00219
00220
00221 vtkDataCompressor* Compressor;
00222 unsigned int NumberOfBlocks;
00223 unsigned int BlockUncompressedSize;
00224 unsigned int PartialLastBlockUncompressedSize;
00225 HeaderType* BlockCompressedSizes;
00226 unsigned long* BlockStartOffsets;
00227
00228
00229 unsigned char* AsciiDataBuffer;
00230 int AsciiDataBufferLength;
00231 int AsciiDataWordType;
00232 unsigned long AsciiDataPosition;
00233
00234
00235 float Progress;
00236
00237
00238 int Abort;
00239
00240 int AttributesEncoding;
00241
00242 private:
00243 vtkXMLDataParser(const vtkXMLDataParser&);
00244 void operator=(const vtkXMLDataParser&);
00245 };
00246
00247 #endif