Main Page | Class Hierarchy | Alphabetical List | Class List | File List | Class Members | File Members | Related Pages

IO/vtkXMLDataParser.h

Go to the documentation of this file.
00001 /*=========================================================================
00002 
00003   Program:   Visualization Toolkit
00004   Module:    $RCSfile: vtkXMLDataParser.h,v $
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 
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   //BTX
00049 
00050   enum { BigEndian, LittleEndian };
00051   //ETX
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   // This parser does not support parsing from a string.
00139   virtual int Parse(const char*);
00140   virtual int Parse(const char*, unsigned int);
00141 
00142   // Implement parsing methods.
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   // Data reading methods.
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   // Ascii data reading methods.
00172   int ParseAsciiData(int wordType);
00173   void FreeAsciiBuffer();
00174 
00175   // Progress update methods.
00176   void UpdateProgress(float progress);
00177 
00178   // The root XML element.
00179   vtkXMLDataElement* RootElement;
00180 
00181   // The stack of elements currently being parsed.
00182   vtkXMLDataElement** OpenElements;
00183   unsigned int NumberOfOpenElements;
00184   unsigned int OpenElementsSize;
00185 
00186   // The position of the appended data section, if found.
00187   unsigned long AppendedDataPosition;
00188 
00189   // How much of the string "<AppendedData" has been matched in input.
00190   int AppendedDataMatched;
00191 
00192   // The byte order of the binary input.
00193   int ByteOrder;
00194 
00195   // The input stream used to read data.  Set by ReadAppendedData and
00196   // ReadInlineData methods.
00197   vtkInputStream* DataStream;
00198 
00199   // The input stream used to read inline data.  May transparently
00200   // decode the data.
00201   vtkInputStream* InlineDataStream;
00202 
00203   // The stream to use for appended data.
00204   vtkInputStream* AppendedDataStream;
00205 
00206   //BTX
00207   // We need a 32 bit unsigned integer type for platform-independent
00208   // binary headers.  Note that this is duplicated in vtkXMLWriter.h.
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   //ETX
00219 
00220   // Decompression data.
00221   vtkDataCompressor* Compressor;
00222   unsigned int NumberOfBlocks;
00223   unsigned int BlockUncompressedSize;
00224   unsigned int PartialLastBlockUncompressedSize;
00225   HeaderType* BlockCompressedSizes;
00226   unsigned long* BlockStartOffsets;
00227 
00228   // Ascii data parsing.
00229   unsigned char* AsciiDataBuffer;
00230   int AsciiDataBufferLength;
00231   int AsciiDataWordType;
00232   unsigned long AsciiDataPosition;
00233 
00234   // Progress during reading of data.
00235   float Progress;
00236 
00237   // Abort flag checked during reading of data.
00238   int Abort;
00239 
00240   int AttributesEncoding;
00241 
00242 private:
00243   vtkXMLDataParser(const vtkXMLDataParser&);  // Not implemented.
00244   void operator=(const vtkXMLDataParser&);  // Not implemented.
00245 };
00246 
00247 #endif