00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00032 #ifndef __vtkXMLDataParser_h
00033 #define __vtkXMLDataParser_h
00034
00035 #include "vtkXMLParser.h"
00036
00037 class vtkXMLDataElement;
00038 class vtkInputStream;
00039 class vtkDataCompressor;
00040
00041 class VTK_IO_EXPORT vtkXMLDataParser : public vtkXMLParser
00042 {
00043 public:
00044 vtkTypeRevisionMacro(vtkXMLDataParser,vtkXMLParser);
00045 void PrintSelf(ostream& os, vtkIndent indent);
00046 static vtkXMLDataParser* New();
00047
00048
00050
00051 enum { BigEndian, LittleEndian };
00052
00054
00056 vtkXMLDataElement* GetRootElement();
00057
00059
00061 unsigned long ReadInlineData(vtkXMLDataElement* element, int isAscii,
00062 void* buffer, int startWord, int numWords,
00063 int wordType);
00064 unsigned long ReadInlineData(vtkXMLDataElement* element, int isAscii,
00065 char* buffer, int startWord, int numWords)
00066 { return this->ReadInlineData(element, isAscii, buffer, startWord,
00067 numWords, VTK_CHAR); }
00069
00071
00073 unsigned long ReadAppendedData(unsigned long offset, void* buffer,
00074 int startWord, int numWords, int wordType);
00075 unsigned long ReadAppendedData(unsigned long offset, char* buffer,
00076 int startWord, int numWords)
00077 { return this->ReadAppendedData(offset, buffer, startWord, numWords,
00078 VTK_CHAR); }
00080
00082
00084 unsigned long ReadAsciiData(void* buffer, int startWord, int numWords,
00085 int wordType);
00087
00089
00091 unsigned long ReadBinaryData(void* buffer, int startWord, int maxWords,
00092 int wordType);
00094
00096
00098 virtual void SetCompressor(vtkDataCompressor*);
00099 vtkGetObjectMacro(Compressor, vtkDataCompressor);
00101
00103 unsigned long GetWordTypeSize(int wordType);
00104
00107 virtual int Parse();
00108
00109 protected:
00110 vtkXMLDataParser();
00111 ~vtkXMLDataParser();
00112
00113
00114 virtual int Parse(const char*);
00115 virtual int Parse(const char*, unsigned int);
00116
00117
00118 void StartElement(const char* name, const char** atts);
00119 void EndElement(const char*);
00120 int ParsingComplete();
00121 void ClearStreamEOF();
00122 int CheckPrimaryAttributes();
00123 void FindAppendedDataPosition();
00124 unsigned long FindInlineDataPosition(unsigned long start);
00125 int ParseBuffer(const char* buffer, unsigned int count);
00126
00127 void AddElement(vtkXMLDataElement* element);
00128 void PushOpenElement(vtkXMLDataElement* element);
00129 vtkXMLDataElement* PopOpenElement();
00130 void PerformByteSwap(void* data, int numWords, int wordSize);
00131
00132
00133 void ReadCompressionHeader();
00134 unsigned int FindBlockSize(unsigned int block);
00135 int ReadBlock(unsigned int block, unsigned char* buffer);
00136 unsigned char* ReadBlock(unsigned int block);
00137 unsigned long ReadUncompressedData(unsigned char* data, unsigned long offset,
00138 unsigned long length);
00139 unsigned long ReadCompressedData(unsigned char* data, unsigned long offset,
00140 unsigned long length);
00141
00142
00143 int ParseAsciiData(int wordType);
00144 void FreeAsciiBuffer();
00145
00146
00147 vtkXMLDataElement* RootElement;
00148
00149
00150 vtkXMLDataElement** OpenElements;
00151 unsigned int NumberOfOpenElements;
00152 unsigned int OpenElementsSize;
00153
00154
00155 unsigned long AppendedDataPosition;
00156
00157
00158 int AppendedDataMatched;
00159
00160
00161 int ByteOrder;
00162
00163
00164
00165 vtkInputStream* DataStream;
00166
00167
00168
00169 vtkInputStream* InlineDataStream;
00170
00171
00172 vtkInputStream* AppendedDataStream;
00173
00174
00175 vtkDataCompressor* Compressor;
00176 unsigned int NumberOfBlocks;
00177 unsigned int BlockUncompressedSize;
00178 unsigned int PartialLastBlockUncompressedSize;
00179 unsigned int* BlockCompressedSizes;
00180 unsigned long* BlockStartOffsets;
00181
00182
00183 unsigned char* AsciiDataBuffer;
00184 int AsciiDataBufferLength;
00185 int AsciiDataWordType;
00186 unsigned long AsciiDataPosition;
00187
00188 private:
00189 vtkXMLDataParser(const vtkXMLDataParser&);
00190 void operator=(const vtkXMLDataParser&);
00191 };
00192
00193 #endif