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