HSAdmin Backend Domains, E-Mail, Datenbanken
Purodha
2013-02-20 4a7e12928010374d76e677c8ec3ea4f5e63e9487
commit | author | age
c64ab5 1 /***************************************************************************
CD 2  *   Copyright (C) 2005 by Christof Donat   *
3  *   cdonat@gmx.de   *
4  *                                                                         *
5  *   This program is free software; you can redistribute it and/or modify  *
6  *   it under the terms of the GNU General Public License as published by  *
7  *   the Free Software Foundation; either version 2 of the License, or     *
8  *   (at your option) any later version.                                   *
9  *                                                                         *
10  *   This program is distributed in the hope that it will be useful,       *
11  *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
12  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
13  *   GNU General Public License for more details.                          *
14  *                                                                         *
15  *   You should have received a copy of the GNU General Public License     *
16  *   along with this program; if not, write to the                         *
17  *   Free Software Foundation, Inc.,                                       *
18  *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
19  ***************************************************************************/
20
21 #include "xmlparser.h"
22 #include "logger.h"
23
24 namespace xmlParser {
25
26 bool parser::operator()(const string& content, int &pos, responseParserHook *hook) { return false; }
27
28 bool spaceParser::operator()(const string& content, int &pos, responseParserHook *hook) { 
29     if( content[pos] == ' ' || content[pos] == '\t' || content[pos] == '\n' || content[pos] == '\r' ) {
30         pos++; return true;
31     }
32     return false;
33 }
34
35 bool commentParser::operator()(const string& content, int &pos, responseParserHook *hook) {
36     int oldpos = pos;
37     if( content.substr(pos,4) == "<!--" ) {
38         pos+= 4;
39         while( content.substr(pos,3) != "-->" && pos < content.length() ) pos++;
40         if(pos < content.length()) {
41             pos += 3; return (*hook)(8,content.substr(oldpos+4,(pos-oldpos)-7));
42         }
43         pos = oldpos;
44         return false;
45     }
46     return false;
47 }
48
49 bool nameParser::operator()(const string& content, int &pos, responseParserHook *hook) {
50     int oldpos = pos;
51     if( !( (content[pos] >= '0' && content[pos] <= '9' ) || 
52            (content[pos] >= 'a' && content[pos] <= 'z' ) ||
53            (content[pos] >= 'A' && content[pos] <= 'Z' ) ||
54             content[pos] == '.' || 
55             content[pos] == ':' || 
56             content[pos] == '_' ) )
57         return false;
58     while( (content[pos] >= '0' && content[pos] <= '9' ) || 
59            (content[pos] >= 'a' && content[pos] <= 'z' ) ||
60            (content[pos] >= 'A' && content[pos] <= 'Z' ) ||
61             content[pos] == '.' || 
62             content[pos] == ':' || 
63             content[pos] == '_' ) pos++;
64     return true;
65 }
66
67 bool attributeValueParser::operator()(const string& content, int &pos, responseParserHook *hook) {
68     int oldpos = pos;
69     if( content[pos] == '"' ) {
70         pos++;
71         while( content[pos] != '"' && pos < content.length() ) pos++;
72         if( pos >= content.length() ) { pos = oldpos; return false; }
73         pos++;
74     }
75     else if( content[pos] == '\'' ) {
76         pos++;
77         while( content[pos] != '\'' && pos < content.length() ) pos++;
78         if( pos >= content.length() ) { pos = oldpos; return false; }
79         pos++;
80     } else {
81         pos = oldpos;
82         return false;
83     }
84     return (*hook)(32,content.substr(oldpos+1,(pos-oldpos)-2));
85 }
86
87 bool attributeParser::operator()(const string& content, int &pos, responseParserHook *hook) {
88     int oldpos = pos;
89     if( ! space(content,pos,hook) ) return false;
90     while(space(content,pos,hook) && pos < content.length() );
91     int namestartpos = pos;
92     if( ! name(content,pos,hook) ) { pos = oldpos; return false; }
93     int nameendpos = pos;
94     if( content[pos] != '=' ) { pos = oldpos; return false; }
95     pos++;
96     if( ! value(content,pos,hook) ) { pos = oldpos; return false; }
97     return (*hook)(2,content.substr(oldpos+1,(nameendpos-oldpos)-1));
98 };
99
100 bool emptyelemParser::operator()(const string& content, int &pos, responseParserHook *hook) {
101     int oldpos = pos;
102     if( content[pos] != '<' ) return false;
103     pos++;
104     if( !name(content,pos,hook) ) { pos = oldpos; return false; }
105     int nameendpos = pos;
106     
107     while(attrib(content,pos,hook) && pos < content.length() );
108     while(space(content,pos,hook) && pos < content.length() );
109         if( content.substr(pos,2) != "/>" ) { pos = oldpos; return false; }
110     pos += 2;
111     return (*hook)(18,content.substr(oldpos+1,(nameendpos-oldpos)-1));
112 }
113
114 bool startelemParser::operator()(const string& content, int &pos, responseParserHook *hook) {
115     int oldpos = pos;
116     if( content[pos] != '<' ) return false;
117     pos++;
118     if( !name(content,pos,hook) ) { pos = oldpos; return false; }
119     int nameendpos = pos;
120     
121     while(attrib(content,pos,hook) && pos < content.length() );
122     while(space(content,pos,hook) && pos < content.length() );
123         if( content[pos] != '>' ) { pos = oldpos; return false; }
124     pos ++;
125
126     return (*hook)(16,content.substr(oldpos+1,(nameendpos-oldpos)-1));
127 }
128
129 bool endelemParser::operator()(const string& content, int &pos, responseParserHook *hook) {
130     int oldpos = pos;
131     if( content.substr(pos,2) != "</" ) return false;
132     pos += 2;
133     if( !name(content,pos,hook) ) { pos = oldpos; return false; }
134     int nameendpos = pos;
135     
136     while(space(content,pos,hook) && pos < content.length() );
137         if( content[pos] != '>' ) { pos = oldpos; return false; }
138     pos ++;
139
140     return (*hook)(17,content.substr(oldpos+2,(nameendpos-oldpos)-2));
141 }
142
143 bool textParser::operator()(const string& content, int &pos, responseParserHook *hook) {
144     int oldpos = pos;
145     if( content[pos] == '<' )
146         return false;
147     while( content[pos] != '<' && pos < content.length() ) pos++;
148     return (*hook)(3,content.substr(oldpos,pos-oldpos));
149 };
150
151 bool cdataParser::operator()(const string& content, int &pos, responseParserHook *hook) {
152     int oldpos = pos;
153     if( content.substr(pos,9) != "<![CDATA[" ) return false;
154     bool foundend = false;
155     while( !( foundend = (content.substr(pos,3) == "]]>") ) && pos < content.length() ) pos++;
156     if( !foundend ) { pos = oldpos; return false; }
157     pos += 3;
158     return (*hook)(4,content.substr(oldpos+9,(pos-oldpos)-12));
159 };
160
161 bool elemParser::operator()(const string& content, int &pos, responseParserHook *hook) {
162     int oldpos = pos;
163     if( emptyelem(content,pos,hook) ) return (*hook)(1,content.substr(oldpos,pos-oldpos));
164     if( ! elemstart(content,pos,hook) ) return false;
165     
166     bool foundend = false;
167     while( !(foundend = endelem(content,pos,hook)) && pos < content.length() ) {
168         if( ! ( comspace(content,pos,hook) ||
169             text(content,pos,hook)     ||
170             (*this)(content,pos,hook)  ||
171             cdata(content,pos,hook)      ) ) {
172                 pos = oldpos;
173                 return false;
174         }
175     }
176     if( foundend ) return (*hook)(1,content.substr(oldpos,pos-oldpos));
177     return false;
178 }
179
180 bool xmlpcParser::operator()(const string& content, int &pos, responseParserHook *hook) {
181     int oldpos = pos;
182     if( content.substr(pos,5) != "<?xml" ) return false;
183     pos += 5;
184
185     while(attrib(content,pos,hook) && pos < content.length() );
186     while(space(content,pos,hook) && pos < content.length() );
187     if( content.substr(pos,2) != "?>" ) { pos = oldpos; return false; }
188     pos += 2;
189     return (*hook)(7,string("xml"));
190 }
191
192 bool XMLParser::operator()(const string& content, int &pos, responseParserHook *hook) {
193     int oldpos = pos;
194     while(space(content,pos,hook) && pos < content.length() );
195     if( ! xmlpc(content,pos,hook) ) { pos = oldpos; return false; }
196     while(comspace(content,pos,hook) && pos < content.length() );
197     if( ! elem(content,pos,hook) ) { pos = oldpos; return false; }
198     while(comspace(content,pos,hook) && pos < content.length() );
199     return (*hook)(9,content.substr(oldpos,pos-oldpos));
200 }
201
202 bool ResponseParser::operator()(const string& content, responseParserHook *hook) { 
203     int pos = 0; 
204     bool rval = xml(content,pos,hook);
205     if( pos < content.length() ) return false;
206     return rval;
207 }
208
209 }