VTK
dox/IO/vtkXMLDataParser.h
Go to the documentation of this file.
00001 /*=========================================================================
00002 
00003   Program:   Visualization Toolkit
00004   Module:    vtkXMLDataParser.h
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 #include "vtkXMLDataElement.h"//For inline definition.
00036 
00037 class vtkInputStream;
00038 class vtkDataCompressor;
00039 
00040 class VTK_IO_EXPORT vtkXMLDataParser : public vtkXMLParser
00041 {
00042 public:
00043   vtkTypeMacro(vtkXMLDataParser,vtkXMLParser);
00044   void PrintSelf(ostream& os, vtkIndent indent);
00045   static vtkXMLDataParser* New();
00046 
00048   vtkXMLDataElement* GetRootElement();
00049 
00050   //BTX
00052   enum { BigEndian, LittleEndian };
00053 
00058   typedef vtkIdType OffsetType;
00059 
00061 
00063   OffsetType ReadInlineData(vtkXMLDataElement* element, int isAscii,
00064                             void* buffer, OffsetType startWord,
00065                             OffsetType numWords, int wordType);
00066   OffsetType ReadInlineData(vtkXMLDataElement* element, int isAscii,
00067                             char* buffer, OffsetType startWord,
00068                             OffsetType numWords)
00069     { return this->ReadInlineData(element, isAscii, buffer, startWord,
00070                                   numWords, VTK_CHAR); }
00072 
00074 
00076   OffsetType ReadAppendedData(OffsetType offset, void* buffer,
00077                               OffsetType startWord,
00078                               OffsetType numWords, int wordType);
00079   OffsetType ReadAppendedData(OffsetType offset, char* buffer,
00080                               OffsetType startWord,
00081                               OffsetType numWords)
00082     { return this->ReadAppendedData(offset, buffer, startWord, numWords,
00083                                     VTK_CHAR); }
00085 
00087 
00089   OffsetType ReadAsciiData(void* buffer, OffsetType startWord,
00090                            OffsetType numWords, int wordType);
00092 
00094 
00096   OffsetType ReadBinaryData(void* buffer, OffsetType startWord,
00097                             OffsetType maxWords, int wordType);
00098   //ETX
00100 
00102 
00104   virtual void SetCompressor(vtkDataCompressor*);
00105   vtkGetObjectMacro(Compressor, vtkDataCompressor);
00107 
00109   unsigned long GetWordTypeSize(int wordType);
00110 
00113   virtual int Parse();
00114 
00116 
00118   vtkGetMacro(Abort, int);
00119   vtkSetMacro(Abort, int);
00121 
00123 
00125   vtkGetMacro(Progress, float);
00126   vtkSetMacro(Progress, float);
00128 
00130 
00137   vtkSetClampMacro(AttributesEncoding,int,VTK_ENCODING_NONE,VTK_ENCODING_UNKNOWN);
00138   vtkGetMacro(AttributesEncoding, int);
00140 
00145   virtual void CharacterDataHandler(const char* data, int length);
00146 
00147 protected:
00148   vtkXMLDataParser();
00149   ~vtkXMLDataParser();
00150 
00151   // This parser does not support parsing from a string.
00152   virtual int Parse(const char*);
00153   virtual int Parse(const char*, unsigned int);
00154 
00155   // Implement parsing methods.
00156   virtual void StartElement(const char* name, const char** atts);
00157   virtual void EndElement(const char*);
00158 
00159   int ParsingComplete();
00160   int CheckPrimaryAttributes();
00161   void FindAppendedDataPosition();
00162   OffsetType FindInlineDataPosition(OffsetType start);
00163   int ParseBuffer(const char* buffer, unsigned int count);
00164 
00165   void AddElement(vtkXMLDataElement* element);
00166   void PushOpenElement(vtkXMLDataElement* element);
00167   vtkXMLDataElement* PopOpenElement();
00168   void FreeAllElements();
00169   void PerformByteSwap(void* data, OffsetType numWords, int wordSize);
00170 
00171   // Data reading methods.
00172   void ReadCompressionHeader();
00173   unsigned int FindBlockSize(unsigned int block);
00174   int ReadBlock(unsigned int block, unsigned char* buffer);
00175   unsigned char* ReadBlock(unsigned int block);
00176   OffsetType ReadUncompressedData(unsigned char* data,
00177                                   OffsetType startWord,
00178                                   OffsetType numWords,
00179                                   int wordSize);
00180   OffsetType ReadCompressedData(unsigned char* data,
00181                                 OffsetType startWord,
00182                                 OffsetType numWords,
00183                                 int wordSize);
00184 
00185   // Go to the start of the inline data
00186   void SeekInlineDataPosition(vtkXMLDataElement *element);
00187 
00188   // Ascii data reading methods.
00189   int ParseAsciiData(int wordType);
00190   void FreeAsciiBuffer();
00191 
00192   // Progress update methods.
00193   void UpdateProgress(float progress);
00194 
00195   // The root XML element.
00196   vtkXMLDataElement* RootElement;
00197 
00198   // The stack of elements currently being parsed.
00199   vtkXMLDataElement** OpenElements;
00200   unsigned int NumberOfOpenElements;
00201   unsigned int OpenElementsSize;
00202 
00203   // The position of the appended data section, if found.
00204   OffsetType AppendedDataPosition;
00205 
00206   // How much of the string "<AppendedData" has been matched in input.
00207   int AppendedDataMatched;
00208 
00209   // The byte order of the binary input.
00210   int ByteOrder;
00211 
00212   // The input stream used to read data.  Set by ReadAppendedData and
00213   // ReadInlineData methods.
00214   vtkInputStream* DataStream;
00215 
00216   // The input stream used to read inline data.  May transparently
00217   // decode the data.
00218   vtkInputStream* InlineDataStream;
00219 
00220   // The stream to use for appended data.
00221   vtkInputStream* AppendedDataStream;
00222 
00223   //BTX
00224   // We need a 32 bit unsigned integer type for platform-independent
00225   // binary headers.  Note that this is duplicated in vtkXMLWriter.h.
00226 #if VTK_SIZEOF_SHORT == 4
00227   typedef unsigned short HeaderType;
00228 #elif VTK_SIZEOF_INT == 4
00229   typedef unsigned int HeaderType;
00230 #elif VTK_SIZEOF_LONG == 4
00231   typedef unsigned long HeaderType;
00232 #else
00233 # error "No native data type can represent an unsigned 32-bit integer."
00234 #endif
00235   //ETX
00236 
00237   // Decompression data.
00238   vtkDataCompressor* Compressor;
00239   unsigned int NumberOfBlocks;
00240   unsigned int BlockUncompressedSize;
00241   unsigned int PartialLastBlockUncompressedSize;
00242   HeaderType* BlockCompressedSizes;
00243   OffsetType* BlockStartOffsets;
00244 
00245   // Ascii data parsing.
00246   unsigned char* AsciiDataBuffer;
00247   OffsetType AsciiDataBufferLength;
00248   int AsciiDataWordType;
00249   OffsetType AsciiDataPosition;
00250 
00251   // Progress during reading of data.
00252   float Progress;
00253 
00254   // Abort flag checked during reading of data.
00255   int Abort;
00256 
00257   int AttributesEncoding;
00258 
00259 private:
00260   vtkXMLDataParser(const vtkXMLDataParser&);  // Not implemented.
00261   void operator=(const vtkXMLDataParser&);  // Not implemented.
00262 };
00263 
00264 //----------------------------------------------------------------------------
00265 inline
00266 void vtkXMLDataParser::CharacterDataHandler(const char* data, int length )
00267 {
00268   const unsigned int eid=this->NumberOfOpenElements-1;
00269   this->OpenElements[eid]->AddCharacterData(data, length);
00270 }
00271 
00272 
00273 #endif