]> git.llucax.com Git - z.facultad/75.42/plaqui.git/blob - Server/src/response_parser.cpp
Se arregla el bug que hacia que el cliente levante mal archivos XML grandes.
[z.facultad/75.42/plaqui.git] / Server / src / response_parser.cpp
1 // vim: set noexpandtab tabstop=4 shiftwidth=4:
2 //----------------------------------------------------------------------------
3 //                                  PlaQui
4 //----------------------------------------------------------------------------
5 // This file is part of PlaQui.
6 //
7 // PlaQui is free software; you can redistribute it and/or modify it under the
8 // terms of the GNU General Public License as published by the Free Software
9 // Foundation; either version 2 of the License, or (at your option) any later
10 // version.
11 //
12 // PlaQui is distributed in the hope that it will be useful, but WITHOUT ANY
13 // WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
14 // FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
15 // details.
16 //
17 // You should have received a copy of the GNU General Public License along
18 // with PlaQui; if not, write to the Free Software Foundation, Inc., 59 Temple
19 // Place, Suite 330, Boston, MA  02111-1307  USA
20 //----------------------------------------------------------------------------
21 // Creado:  jue nov 27 13:33:22 ART 2003
22 // Autores: Leandro Lucarella <llucare@fi.uba.ar>
23 //----------------------------------------------------------------------------
24 //
25 // $Id$
26 //
27
28 #include "plaqui/server/response.h"
29 #include "plaqui/server/string.h"
30 #include <sstream>
31 #ifdef DEBUG
32 #       include <iostream>
33 #endif // DEBUG
34
35 using namespace std;
36
37 namespace PlaQui {
38
39 namespace Server {
40
41 Response::Parser::~Parser(void) {
42 #ifdef DEBUG
43         cerr << __FILE__ << "(" << __LINE__ << ")"
44                 << ": destructor." << endl;
45 #endif // DEBUG
46 }
47
48 Response::Parser::Parser(Response& resp): response(&resp), root(true) {
49 #ifdef DEBUG
50         cerr << __FILE__ << "(" << __LINE__ << ")"
51                 << ": constructor();" << endl;
52 #endif // DEBUG
53 }
54
55 void Response::Parser::on_start_element(const string& name,
56                 const AttributeMap& attrs) {
57 #ifdef DEBUG
58         cerr << __FILE__ << "(" << __LINE__ << ")"
59                 << ": on_start_element(name = " << name << ", attrs = [";
60         for (AttributeMap::const_iterator i = attrs.begin();
61                         i != attrs.end(); i++) {
62                 cerr << i->first << " = " << i->second << ", ";
63         }
64         cerr << "]);" << endl;
65 #endif // DEBUG
66         if (root) {
67                 // Si es el elemento raíz, debe ser la respuesta.
68                 if (name == "plaqui-response") {
69                         AttributeMap::const_iterator i = attrs.find("version");
70                         if (i != attrs.end()) {
71                                 response->xml_version = i->second;
72                         }
73                         i = attrs.find("code");
74                         if (i != attrs.end()) {
75                                 int c;
76                                 to(i->second, c);
77                                 response->xml_code = static_cast<Response::Code>(c);
78                         }
79                         i = attrs.find("description");
80                         if (i != attrs.end()) {
81                                 response->xml_description = i->second;
82                         }
83                         root = false;
84                 }
85         // Si no es el elemento raíz, lo agrego al body.
86         } else {
87                 response->xml_contents += "<";
88                 response->xml_contents += name + " ";
89                 for (AttributeMap::const_iterator i = attrs.begin();
90                                 i != attrs.end(); i++) {
91                         response->xml_contents += i->first + " = \"" + i->second + "\" ";
92                 }
93                 response->xml_contents += ">";
94         }
95 }
96
97 void Response::Parser::on_end_element(const string& name) {
98 #ifdef DEBUG
99         cerr << __FILE__ << "(" << __LINE__ << ")"
100                 << ": on_end_element(name = " << name << ");" << endl;
101 #endif // DEBUG
102         // Si es el fin de la respuesta, volvemos a la raíz.
103         if (name == "plaqui-response") {
104                 root = true;
105         // Si no, agrega al cuerpo.
106         } else {
107                 response->xml_contents += "</";
108                 response->xml_contents += name + ">";
109         }
110 }
111
112 void Response::Parser::on_characters(const string& chars) {
113 #ifdef DEBUG
114         cerr << __FILE__ << "(" << __LINE__ << ")"
115                 << ": on_characters(chars = " << chars << ");" << endl;
116 #endif // DEBUG
117         // Sólo nos importa el contenido, lo agregamos.
118         if (!root) {
119                 response->xml_contents += chars;
120         }
121 }
122
123 /*void Response::Parser::on_comment(const string& text) {
124 #ifdef DEBUG
125         cerr << __FILE__ << "(" << __LINE__ << ")"
126                 << ": on_comment(text = " << text << ");" << endl;
127 #endif // DEBUG
128 }*/
129
130 } // namespace Server
131
132 } // namespace PlaQui
133