00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00026 
00027 
00028 
00029 
00030 
00035 #ifndef OW_XMLPARSERCORE_HPP_INCLUDE_GUARD_
00036 #define OW_XMLPARSERCORE_HPP_INCLUDE_GUARD_
00037 #include "OW_config.h"
00038 #include "OW_String.hpp"
00039 #include "OW_StringBuffer.hpp"
00040 #include "OW_IstreamBufIterator.hpp"
00041 #include <stack>
00042 #include <iosfwd>
00043 
00044 namespace OW_NAMESPACE
00045 {
00046 
00048 struct OW_XML_API XMLToken
00049 {
00050    XMLToken() : type(INVALID), text(8096), attributeCount(0)
00051    {}
00052    enum XMLType
00053    {
00054       INVALID,
00055       XML_DECLARATION,
00056       START_TAG,
00057       END_TAG,
00058       COMMENT,
00059       CDATA,
00060       DOCTYPE,
00061       CONTENT
00062    };
00063    struct OW_XML_API Attribute
00064    {
00065       Attribute(): name(64), value(512)
00066       {
00067       }
00068       StringBuffer name;
00069       StringBuffer value;
00070    };
00071    enum { MAX_ATTRIBUTES = 10 };
00072    XMLType type;
00073    StringBuffer text;
00074    Attribute attributes[MAX_ATTRIBUTES];
00075    unsigned int attributeCount;
00076 };
00077 
00079 class OW_XML_API XMLParserCore
00080 {
00081 public:
00082    XMLParserCore(std::istream& input) : m_line(1), m_current(), m_foundRoot(false), m_tagIsEmpty(false)
00083    {
00084       setInput(input);
00085    }
00086    XMLParserCore(): m_line(1), m_current(), m_foundRoot(false), m_tagIsEmpty(false)
00087    {
00088    }
00089    ~XMLParserCore()
00090    {
00091    }
00092    void setInput(std::istream& input)
00093    {
00094       m_current = IstreamBufIterator(input);
00095    }
00096    bool next(XMLToken& entry);
00097    unsigned int getLine() const
00098    {
00099       return m_line;
00100    }
00101 private:
00102    void skipWhitespace();
00103    bool getElementName(XMLToken& entry);
00104    bool getOpenElementName(XMLToken& entry, bool& openCloseElement);
00105    void getAttributeNameAndEqual(XMLToken::Attribute& att);
00106    void getAttributeValue(XMLToken::Attribute& att);
00107    void getComment();
00108    void getCData(XMLToken& entry);
00109    void getDocType();
00110    void getContent(XMLToken& entry);
00111    void getElement(XMLToken& entry);
00112 
00113 #ifdef OW_WIN32
00114 #pragma warning (push)
00115 #pragma warning (disable: 4251)
00116 #endif
00117 
00118    unsigned int m_line;
00119    IstreamBufIterator m_current;
00120 
00121 
00122    
00123    std::stack<String> m_stack;
00124    bool m_foundRoot;
00125    bool m_tagIsEmpty;
00126 
00127 #ifdef OW_WIN32
00128 #pragma warning (pop)
00129 #endif
00130 
00131 };
00132 
00133 } 
00134 
00135 #endif