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   Language:  C++
00006 
00007   Copyright (c) 1993-2002 Ken Martin, Will Schroeder, Bill Lorensen 
00008   All rights reserved.
00009   See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
00010 
00011      This software is distributed WITHOUT ANY WARRANTY; without even 
00012      the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
00013      PURPOSE.  See the above copyright notice for more information.
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   //BTX
00050 
00051   enum { BigEndian, LittleEndian };
00052   //ETX
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   // This parser does not support parsing from a string.
00114   virtual int Parse(const char*);
00115   virtual int Parse(const char*, unsigned int);
00116   
00117   // Implement parsing methods.
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   // Data reading methods.
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   // Ascii data reading methods.
00143   int ParseAsciiData(int wordType);
00144   void FreeAsciiBuffer();
00145     
00146   // The root XML element.
00147   vtkXMLDataElement* RootElement;
00148   
00149   // The stack of elements currently being parsed.
00150   vtkXMLDataElement** OpenElements;
00151   unsigned int NumberOfOpenElements;
00152   unsigned int OpenElementsSize;
00153   
00154   // The position of the appended data section, if found.
00155   unsigned long AppendedDataPosition;
00156   
00157   // How much of the string "<AppendedData" has been matched in input.
00158   int AppendedDataMatched;
00159   
00160   // The byte order of the binary input.
00161   int ByteOrder;
00162   
00163   // The input stream used to read data.  Set by ReadAppendedData and
00164   // ReadInlineData methods.
00165   vtkInputStream* DataStream;
00166   
00167   // The input stream used to read inline data.  May transparently
00168   // decode the data.
00169   vtkInputStream* InlineDataStream;
00170   
00171   // The stream to use for appended data.
00172   vtkInputStream* AppendedDataStream;
00173   
00174   // Decompression data.
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   // Ascii data parsing.
00183   unsigned char* AsciiDataBuffer;
00184   int AsciiDataBufferLength;
00185   int AsciiDataWordType;
00186   unsigned long AsciiDataPosition;
00187   
00188 private:
00189   vtkXMLDataParser(const vtkXMLDataParser&);  // Not implemented.
00190   void operator=(const vtkXMLDataParser&);  // Not implemented.
00191 };
00192 
00193 #endif