00001
00002
00003
00004
00005
00006
00007
00008
00012 #ifndef ZYPP_PARSER_TAGPARSER_H
00013 #define ZYPP_PARSER_TAGPARSER_H
00014
00015 #include <iosfwd>
00016 #include <string>
00017 #include <list>
00018
00019 #include "zypp/base/PtrTypes.h"
00020 #include "zypp/base/NonCopyable.h"
00021 #include "zypp/base/InputStream.h"
00022
00023 #include "zypp/ProgressData.h"
00024
00026 namespace zypp
00027 {
00028
00029 namespace parser
00030 {
00031
00033
00034
00035
00039 class TagParser : private base::NonCopyable
00040 {
00041 public:
00042
00043 struct Tag
00044 {
00045 Tag( unsigned lineNo_r = 0, std::streamoff tagStart_r = -1 )
00046 : lineNo( lineNo_r ), tagStart( tagStart_r ), dataStart( -1 ), dataLength( 0 )
00047 {}
00049 std::string asString() const;
00050
00051 unsigned lineNo;
00052 std::streamoff tagStart;
00053 std::streamoff dataStart;
00054 std::streamoff dataLength;
00055
00056 std::string name;
00057 std::string modifier;
00058 };
00059
00060 struct SingleTag : Tag
00061 {
00062 SingleTag( unsigned lineNo_r = 0, std::streamoff tagStart_r = -1 )
00063 : Tag( lineNo_r, tagStart_r )
00064 {}
00065 std::string value;
00066 };
00067
00068 struct MultiTag : Tag
00069 {
00070 MultiTag( unsigned lineNo_r = 0, std::streamoff tagStart_r = -1 )
00071 : Tag( lineNo_r, tagStart_r )
00072 {}
00073 std::list<std::string> value;
00074 };
00075
00076 typedef shared_ptr<SingleTag> SingleTagPtr;
00077 typedef shared_ptr<MultiTag> MultiTagPtr;
00078
00079 public:
00081 TagParser();
00083 virtual ~TagParser();
00090 virtual void parse( const InputStream & input_r,
00091 const ProgressData::ReceiverFnc & fnc_r = ProgressData::ReceiverFnc() );
00092
00093 protected:
00095 virtual void beginParse();
00097 virtual void consume( const SingleTagPtr & tag_r );
00099 virtual void consume( const MultiTagPtr & tag_r );
00101 virtual void endParse();
00102
00103 protected:
00107 virtual void userRequestedAbort( unsigned lineNo_r );
00108
00109 protected:
00111 std::string errPrefix( unsigned lineNo_r,
00112 const std::string & msg_r = std::string() ) const;
00114 std::string errPrefix( const SingleTagPtr & tag_r,
00115 const std::string & msg_r = std::string() ) const;
00117 std::string errPrefix( const MultiTagPtr & tag_r,
00118 const std::string & msg_r = std::string() ) const;
00120 const std::string & inputname() const
00121 { return _inputname; }
00122
00123 private:
00124 std::string _inputname;
00125 };
00127
00129 std::ostream & operator<<( std::ostream & str, const TagParser::Tag & obj );
00130
00132 std::ostream & operator<<( std::ostream & str, const TagParser::SingleTag & obj );
00133
00135 std::ostream & operator<<( std::ostream & str, const TagParser::MultiTag & obj );
00136
00138 }
00141 }
00143 #endif // ZYPP_PARSER_TAGPARSER_H