VTK
vtkXMLDataParser.h
Go to the documentation of this file.
1 /*=========================================================================
2 
3  Program: Visualization Toolkit
4  Module: vtkXMLDataParser.h
5 
6  Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
7  All rights reserved.
8  See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
9 
10  This software is distributed WITHOUT ANY WARRANTY; without even
11  the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
12  PURPOSE. See the above copyright notice for more information.
13 
14 =========================================================================*/
31 #ifndef __vtkXMLDataParser_h
32 #define __vtkXMLDataParser_h
33 
34 #include "vtkXMLParser.h"
35 #include "vtkXMLDataElement.h"//For inline definition.
36 
37 class vtkInputStream;
38 class vtkDataCompressor;
39 
41 {
42 public:
44  void PrintSelf(ostream& os, vtkIndent indent);
45  static vtkXMLDataParser* New();
46 
48  vtkXMLDataElement* GetRootElement();
49 
50  //BTX
52  enum { BigEndian, LittleEndian };
53 
59 
61 
63  OffsetType ReadInlineData(vtkXMLDataElement* element, int isAscii,
64  void* buffer, OffsetType startWord,
65  OffsetType numWords, int wordType);
66  OffsetType ReadInlineData(vtkXMLDataElement* element, int isAscii,
67  char* buffer, OffsetType startWord,
68  OffsetType numWords)
69  { return this->ReadInlineData(element, isAscii, buffer, startWord,
70  numWords, VTK_CHAR); }
72 
74 
76  OffsetType ReadAppendedData(OffsetType offset, void* buffer,
77  OffsetType startWord,
78  OffsetType numWords, int wordType);
79  OffsetType ReadAppendedData(OffsetType offset, char* buffer,
80  OffsetType startWord,
81  OffsetType numWords)
82  { return this->ReadAppendedData(offset, buffer, startWord, numWords,
83  VTK_CHAR); }
85 
87 
89  OffsetType ReadAsciiData(void* buffer, OffsetType startWord,
90  OffsetType numWords, int wordType);
92 
94 
96  OffsetType ReadBinaryData(void* buffer, OffsetType startWord,
97  OffsetType maxWords, int wordType);
98  //ETX
100 
102 
104  virtual void SetCompressor(vtkDataCompressor*);
105  vtkGetObjectMacro(Compressor, vtkDataCompressor);
107 
109  unsigned long GetWordTypeSize(int wordType);
110 
113  virtual int Parse();
114 
116 
118  vtkGetMacro(Abort, int);
119  vtkSetMacro(Abort, int);
121 
123 
125  vtkGetMacro(Progress, float);
126  vtkSetMacro(Progress, float);
128 
130 
137  vtkSetClampMacro(AttributesEncoding,int,VTK_ENCODING_NONE,VTK_ENCODING_UNKNOWN);
138  vtkGetMacro(AttributesEncoding, int);
140 
145  virtual void CharacterDataHandler(const char* data, int length);
146 
147 protected:
149  ~vtkXMLDataParser();
150 
151  // This parser does not support parsing from a string.
152  virtual int Parse(const char*);
153  virtual int Parse(const char*, unsigned int);
154 
155  // Implement parsing methods.
156  virtual void StartElement(const char* name, const char** atts);
157  virtual void EndElement(const char*);
158 
159  int ParsingComplete();
160  int CheckPrimaryAttributes();
161  void FindAppendedDataPosition();
162  OffsetType FindInlineDataPosition(OffsetType start);
163  int ParseBuffer(const char* buffer, unsigned int count);
164 
165  void AddElement(vtkXMLDataElement* element);
166  void PushOpenElement(vtkXMLDataElement* element);
167  vtkXMLDataElement* PopOpenElement();
168  void FreeAllElements();
169  void PerformByteSwap(void* data, OffsetType numWords, int wordSize);
170 
171  // Data reading methods.
172  void ReadCompressionHeader();
173  unsigned int FindBlockSize(unsigned int block);
174  int ReadBlock(unsigned int block, unsigned char* buffer);
175  unsigned char* ReadBlock(unsigned int block);
176  OffsetType ReadUncompressedData(unsigned char* data,
177  OffsetType startWord,
178  OffsetType numWords,
179  int wordSize);
180  OffsetType ReadCompressedData(unsigned char* data,
181  OffsetType startWord,
182  OffsetType numWords,
183  int wordSize);
184 
185  // Go to the start of the inline data
186  void SeekInlineDataPosition(vtkXMLDataElement *element);
187 
188  // Ascii data reading methods.
189  int ParseAsciiData(int wordType);
190  void FreeAsciiBuffer();
191 
192  // Progress update methods.
193  void UpdateProgress(float progress);
194 
195  // The root XML element.
197 
198  // The stack of elements currently being parsed.
200  unsigned int NumberOfOpenElements;
201  unsigned int OpenElementsSize;
202 
203  // The position of the appended data section, if found.
205 
206  // How much of the string "<AppendedData" has been matched in input.
208 
209  // The byte order of the binary input.
211 
212  // The input stream used to read data. Set by ReadAppendedData and
213  // ReadInlineData methods.
215 
216  // The input stream used to read inline data. May transparently
217  // decode the data.
219 
220  // The stream to use for appended data.
222 
223  //BTX
224  // We need a 32 bit unsigned integer type for platform-independent
225  // binary headers. Note that this is duplicated in vtkXMLWriter.h.
226 #if VTK_SIZEOF_SHORT == 4
227  typedef unsigned short HeaderType;
228 #elif VTK_SIZEOF_INT == 4
229  typedef unsigned int HeaderType;
230 #elif VTK_SIZEOF_LONG == 4
231  typedef unsigned long HeaderType;
232 #else
233 # error "No native data type can represent an unsigned 32-bit integer."
234 #endif
235  //ETX
236 
237  // Decompression data.
239  unsigned int NumberOfBlocks;
240  unsigned int BlockUncompressedSize;
242  HeaderType* BlockCompressedSizes;
243  OffsetType* BlockStartOffsets;
244 
245  // Ascii data parsing.
246  unsigned char* AsciiDataBuffer;
249  OffsetType AsciiDataPosition;
250 
251  // Progress during reading of data.
252  float Progress;
253 
254  // Abort flag checked during reading of data.
255  int Abort;
256 
258 
259 private:
260  vtkXMLDataParser(const vtkXMLDataParser&); // Not implemented.
261  void operator=(const vtkXMLDataParser&); // Not implemented.
262 };
263 
264 //----------------------------------------------------------------------------
265 inline
267 {
268  const unsigned int eid=this->NumberOfOpenElements-1;
269  this->OpenElements[eid]->AddCharacterData(data, length);
270 }
271 
272 
273 #endif
virtual int Parse()
Abstract interface for data compression classes.
OffsetType AsciiDataBufferLength
Parse XML to handle element tags and attributes.
Definition: vtkXMLParser.h:40
Represents an XML element and those nested inside.
OffsetType AsciiDataPosition
vtkInputStream * InlineDataStream
OffsetType ReadAppendedData(OffsetType offset, char *buffer, OffsetType startWord, OffsetType numWords)
virtual void StartElement(const char *name, const char **atts)
vtkInputStream * AppendedDataStream
int vtkIdType
Definition: vtkType.h:255
#define VTK_ENCODING_UNKNOWN
Wraps a binary input stream with a VTK interface.
unsigned int BlockUncompressedSize
virtual void CharacterDataHandler(const char *data, int length)
vtkXMLDataElement ** OpenElements
void AddCharacterData(const char *c, size_t length)
OffsetType ReadInlineData(vtkXMLDataElement *element, int isAscii, char *buffer, OffsetType startWord, OffsetType numWords)
virtual void CharacterDataHandler(const char *data, int length)
a simple class to control print indentation
Definition: vtkIndent.h:37
void PrintSelf(ostream &os, vtkIndent indent)
OffsetType AppendedDataPosition
#define VTK_ENCODING_NONE
#define VTK_CHAR
Definition: vtkType.h:26
vtkXMLDataElement * RootElement
vtkDataCompressor * Compressor
unsigned int NumberOfOpenElements
virtual int ParsingComplete()
vtkInputStream * DataStream
unsigned int NumberOfBlocks
unsigned int PartialLastBlockUncompressedSize
Used by vtkXMLReader to parse VTK XML files.
virtual void EndElement(const char *name)
virtual int ParseBuffer(const char *buffer, unsigned int count)
#define VTK_IO_EXPORT
HeaderType * BlockCompressedSizes
unsigned int OpenElementsSize
static vtkXMLParser * New()
OffsetType * BlockStartOffsets
unsigned char * AsciiDataBuffer