parser.h

00001 /*
00002   Copyright (c) 2004-2009 by Jakob Schroeter <js@camaya.net>
00003   This file is part of the gloox library. http://camaya.net/gloox
00004 
00005   This software is distributed under a license. The full license
00006   agreement can be found in the file LICENSE in this distribution.
00007   This software may not be copied, modified, sold or distributed
00008   other than expressed in the named license agreement.
00009 
00010   This software is distributed without any warranty.
00011 */
00012 
00013 
00014 
00015 #ifndef PARSER_H__
00016 #define PARSER_H__
00017 
00018 #include "gloox.h"
00019 #include "taghandler.h"
00020 #include "tag.h"
00021 
00022 #include <string>
00023 
00024 namespace gloox
00025 {
00026 
00027 
00034   class GLOOX_API Parser
00035   {
00036     public:
00043       Parser( TagHandler* ph, bool deleteRoot = true );
00044 
00048       virtual ~Parser();
00049 
00056       int feed( std::string& data );
00057 
00063       void cleanup( bool deleteRoot = true );
00064 
00065     private:
00066       enum ParserInternalState
00067       {
00068         Initial,
00069         InterTag,
00070         TagOpening,
00071         TagOpeningSlash,
00072         TagOpeningLt,
00073         TagInside,
00074         TagNameCollect,
00075         TagNameComplete,
00076         TagNameAlmostComplete,
00077         TagAttribute,
00078         TagAttributeComplete,
00079         TagAttributeEqual,
00080         TagClosing,
00081         TagClosingSlash,
00082         TagValueApos,
00083         TagAttributeValue,
00084         TagPreamble,
00085         TagCDATASection
00086       };
00087 
00088       enum ForwardScanState
00089       {
00090         ForwardFound,
00091         ForwardNotFound,
00092         ForwardInsufficientSize
00093       };
00094 
00095       enum DecodeState
00096       {
00097         DecodeValid,
00098         DecodeInvalid,
00099         DecodeInsufficient
00100       };
00101 
00102       void addTag();
00103       void addAttribute();
00104       void addCData();
00105       bool closeTag();
00106       bool isWhitespace( unsigned char c );
00107       bool isValid( unsigned char c );
00108       void streamEvent( Tag* tag );
00109       ForwardScanState forwardScan( std::string::size_type& pos, const std::string& data,
00110                                     const std::string& needle );
00111       DecodeState decode( std::string::size_type& pos, const std::string& data );
00112 
00113       TagHandler* m_tagHandler;
00114       Tag* m_current;
00115       Tag* m_root;
00116       StringMap* m_xmlnss;
00117 
00118       ParserInternalState m_state;
00119       Tag::AttributeList m_attribs;
00120       std::string m_tag;
00121       std::string m_cdata;
00122       std::string m_attrib;
00123       std::string m_value;
00124       std::string m_xmlns;
00125       std::string m_tagPrefix;
00126       std::string m_attribPrefix;
00127       std::string m_backBuffer;
00128       int m_preamble;
00129       bool m_quote;
00130       bool m_haveTagPrefix;
00131       bool m_haveAttribPrefix;
00132       bool m_attribIsXmlns;
00133       bool m_deleteRoot;
00134 
00135   };
00136 
00137 }
00138 
00139 #endif // PARSER_H__
Generated on Tue Jun 8 23:37:54 2010 for gloox by  doxygen 1.6.3