VTK
dox/IO/XMLParser/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 "vtkIOXMLParserModule.h" // For export macro
00035 #include "vtkXMLParser.h"
00036 #include "vtkXMLDataElement.h"//For inline definition.
00037 
00038 class vtkInputStream;
00039 class vtkDataCompressor;
00040 
00041 class VTKIOXMLPARSER_EXPORT vtkXMLDataParser : public vtkXMLParser
00042 {
00043 public:
00044   vtkTypeMacro(vtkXMLDataParser,vtkXMLParser);
00045   void PrintSelf(ostream& os, vtkIndent indent);
00046   static vtkXMLDataParser* New();
00047 
00049   vtkXMLDataElement* GetRootElement();
00050 
00051   //BTX
00053   enum { BigEndian, LittleEndian };
00054 
00056 
00058   size_t ReadInlineData(vtkXMLDataElement* element, int isAscii,
00059                         void* buffer, vtkTypeUInt64 startWord,
00060                         size_t numWords, int wordType);
00061   size_t ReadInlineData(vtkXMLDataElement* element, int isAscii,
00062                         char* buffer, vtkTypeUInt64 startWord,
00063                         size_t numWords)
00064     { return this->ReadInlineData(element, isAscii, buffer, startWord,
00065                                   numWords, VTK_CHAR); }
00067 
00069 
00071   size_t ReadAppendedData(vtkTypeInt64 offset, void* buffer,
00072                           vtkTypeUInt64 startWord,
00073                           size_t numWords, int wordType);
00074   size_t ReadAppendedData(vtkTypeInt64 offset, char* buffer,
00075                           vtkTypeUInt64 startWord,
00076                           size_t numWords)
00077   { return this->ReadAppendedData(offset, buffer, startWord, numWords,
00078                                     VTK_CHAR); }
00080 
00082 
00084   size_t ReadAsciiData(void* buffer, vtkTypeUInt64 startWord,
00085                        size_t numWords, int wordType);
00087 
00089 
00091   size_t ReadBinaryData(void* buffer, vtkTypeUInt64 startWord,
00092                         size_t maxWords, int wordType);
00093   //ETX
00095 
00097 
00099   virtual void SetCompressor(vtkDataCompressor*);
00100   vtkGetObjectMacro(Compressor, vtkDataCompressor);
00102 
00104   size_t GetWordTypeSize(int wordType);
00105 
00108   virtual int Parse();
00109 
00111 
00113   vtkGetMacro(Abort, int);
00114   vtkSetMacro(Abort, int);
00116 
00118 
00120   vtkGetMacro(Progress, float);
00121   vtkSetMacro(Progress, float);
00123 
00125 
00132   vtkSetClampMacro(AttributesEncoding,int,VTK_ENCODING_NONE,VTK_ENCODING_UNKNOWN);
00133   vtkGetMacro(AttributesEncoding, int);
00135 
00140   virtual void CharacterDataHandler(const char* data, int length);
00141 
00143 
00145   vtkTypeInt64 GetAppendedDataPosition()
00146   {
00147     return this->AppendedDataPosition;
00148   }
00150 
00151 protected:
00152   vtkXMLDataParser();
00153   ~vtkXMLDataParser();
00154 
00155   // This parser does not support parsing from a string.
00156   virtual int Parse(const char*);
00157   virtual int Parse(const char*, unsigned int);
00158 
00159   // Implement parsing methods.
00160   virtual void StartElement(const char* name, const char** atts);
00161   virtual void EndElement(const char*);
00162 
00163   int ParsingComplete();
00164   int CheckPrimaryAttributes();
00165   void FindAppendedDataPosition();
00166   int ParseBuffer(const char* buffer, unsigned int count);
00167 
00168   void AddElement(vtkXMLDataElement* element);
00169   void PushOpenElement(vtkXMLDataElement* element);
00170   vtkXMLDataElement* PopOpenElement();
00171   void FreeAllElements();
00172   void PerformByteSwap(void* data, size_t numWords, size_t wordSize);
00173 
00174   // Data reading methods.
00175   void ReadCompressionHeader();
00176   size_t FindBlockSize(vtkTypeUInt64 block);
00177   int ReadBlock(vtkTypeUInt64 block, unsigned char* buffer);
00178   unsigned char* ReadBlock(vtkTypeUInt64 block);
00179   size_t ReadUncompressedData(unsigned char* data,
00180                               vtkTypeUInt64 startWord,
00181                               size_t numWords,
00182                               size_t wordSize);
00183   size_t ReadCompressedData(unsigned char* data,
00184                             vtkTypeUInt64 startWord,
00185                             size_t numWords,
00186                             size_t wordSize);
00187 
00188   // Go to the start of the inline data
00189   void SeekInlineDataPosition(vtkXMLDataElement *element);
00190 
00191   // Ascii data reading methods.
00192   int ParseAsciiData(int wordType);
00193   void FreeAsciiBuffer();
00194 
00195   // Progress update methods.
00196   void UpdateProgress(float progress);
00197 
00198   // The root XML element.
00199   vtkXMLDataElement* RootElement;
00200 
00201   // The stack of elements currently being parsed.
00202   vtkXMLDataElement** OpenElements;
00203   unsigned int NumberOfOpenElements;
00204   unsigned int OpenElementsSize;
00205 
00206   // The position of the appended data section, if found.
00207   vtkTypeInt64 AppendedDataPosition;
00208 
00209   // How much of the string "<AppendedData" has been matched in input.
00210   int AppendedDataMatched;
00211 
00212   // The byte order of the binary input.
00213   int ByteOrder;
00214 
00215   // The word type of binary input headers.
00216   int HeaderType;
00217 
00218   // The input stream used to read data.  Set by ReadAppendedData and
00219   // ReadInlineData methods.
00220   vtkInputStream* DataStream;
00221 
00222   // The input stream used to read inline data.  May transparently
00223   // decode the data.
00224   vtkInputStream* InlineDataStream;
00225 
00226   // The stream to use for appended data.
00227   vtkInputStream* AppendedDataStream;
00228 
00229   // Decompression data.
00230   vtkDataCompressor* Compressor;
00231   size_t NumberOfBlocks;
00232   size_t BlockUncompressedSize;
00233   size_t PartialLastBlockUncompressedSize;
00234   size_t* BlockCompressedSizes;
00235   vtkTypeInt64* BlockStartOffsets;
00236 
00237   // Ascii data parsing.
00238   unsigned char* AsciiDataBuffer;
00239   size_t AsciiDataBufferLength;
00240   int AsciiDataWordType;
00241   vtkTypeInt64 AsciiDataPosition;
00242 
00243   // Progress during reading of data.
00244   float Progress;
00245 
00246   // Abort flag checked during reading of data.
00247   int Abort;
00248 
00249   int AttributesEncoding;
00250 
00251 private:
00252   vtkXMLDataParser(const vtkXMLDataParser&);  // Not implemented.
00253   void operator=(const vtkXMLDataParser&);  // Not implemented.
00254 };
00255 
00256 //----------------------------------------------------------------------------
00257 inline
00258 void vtkXMLDataParser::CharacterDataHandler(const char* data, int length )
00259 {
00260   const unsigned int eid=this->NumberOfOpenElements-1;
00261   this->OpenElements[eid]->AddCharacterData(data, length);
00262 }
00263 
00264 
00265 #endif