lbajardsilogic@8
|
1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
|
lbajardsilogic@8
|
2
|
lbajardsilogic@8
|
3 /* Sound Access
|
lbajardsilogic@8
|
4 EASAIER client application.
|
lbajardsilogic@8
|
5 Silogic 2007. Laure Bajard.
|
lbajardsilogic@8
|
6
|
lbajardsilogic@8
|
7 This program is free software; you can redistribute it and/or
|
lbajardsilogic@8
|
8 modify it under the terms of the GNU General Public License as
|
lbajardsilogic@8
|
9 published by the Free Software Foundation; either version 2 of the
|
lbajardsilogic@8
|
10 License, or (at your option) any later version. See the file
|
lbajardsilogic@8
|
11 COPYING included with this distribution for more information.
|
lbajardsilogic@8
|
12 */
|
lbajardsilogic@8
|
13
|
lbajardsilogic@8
|
14 #include "HttpClient.h"
|
lbajardsilogic@8
|
15
|
lbajardsilogic@8
|
16 #include <iostream>
|
lbajardsilogic@8
|
17
|
lbajardsilogic@8
|
18
|
lbajardsilogic@8
|
19 HttpClient::HttpClient(const QString& configFileName) : QHttp()
|
lbajardsilogic@8
|
20 {
|
lbajardsilogic@8
|
21 QFile *config = new QFile(configFileName);
|
lbajardsilogic@8
|
22
|
lbajardsilogic@8
|
23 m_useProxy = false;
|
lbajardsilogic@8
|
24 m_proxy = "";
|
lbajardsilogic@8
|
25 m_proxyPort = 0;
|
lbajardsilogic@8
|
26 m_userProxyId = "";
|
lbajardsilogic@8
|
27 m_pwdProxyId = "";
|
lbajardsilogic@8
|
28
|
lbajardsilogic@158
|
29 m_host = "easaier.silogic.fr";
|
lbajardsilogic@158
|
30 m_hostPort = 9876;
|
lbajardsilogic@8
|
31
|
lbajardsilogic@227
|
32 m_servletName = "/easaier/RetrieverService";
|
lbajardsilogic@200
|
33
|
lbajardsilogic@8
|
34 if (config->exists())
|
lbajardsilogic@8
|
35 {
|
lbajardsilogic@8
|
36 fromXmlString(config);
|
lbajardsilogic@8
|
37 }
|
lbajardsilogic@8
|
38
|
lbajardsilogic@8
|
39 if (useProxy())
|
lbajardsilogic@8
|
40 setProxy(m_proxy, m_proxyPort, m_userProxyId, m_pwdProxyId);
|
lbajardsilogic@8
|
41 setHost(m_host, m_hostPort);
|
lbajardsilogic@8
|
42 }
|
lbajardsilogic@8
|
43
|
lbajardsilogic@8
|
44
|
lbajardsilogic@8
|
45 HttpClient::~HttpClient()
|
lbajardsilogic@8
|
46 {}
|
lbajardsilogic@8
|
47
|
lbajardsilogic@8
|
48 void HttpClient::valuesChanged(ConnectionSettings* dialogBox)
|
lbajardsilogic@8
|
49 {
|
lbajardsilogic@8
|
50 setUseProxy(dialogBox->useProxy());
|
lbajardsilogic@8
|
51 if (useProxy())
|
lbajardsilogic@8
|
52 {
|
lbajardsilogic@8
|
53 m_proxy = dialogBox->getProxy();
|
lbajardsilogic@8
|
54 m_proxyPort = (dialogBox->getProxyPort()).toInt();
|
lbajardsilogic@8
|
55 m_userProxyId = dialogBox->getUserProxyId();
|
lbajardsilogic@8
|
56 m_pwdProxyId = dialogBox->getPwdProxyId();
|
lbajardsilogic@8
|
57
|
lbajardsilogic@8
|
58 setProxy(m_proxy, m_proxyPort, m_userProxyId, m_pwdProxyId);
|
lbajardsilogic@8
|
59 }
|
lbajardsilogic@8
|
60
|
lbajardsilogic@8
|
61 m_host = dialogBox->getHost();
|
lbajardsilogic@8
|
62 m_hostPort = (dialogBox->getHostPort()).toUShort();
|
lbajardsilogic@8
|
63
|
lbajardsilogic@8
|
64 setHost(m_host, m_hostPort);
|
lbajardsilogic@8
|
65 }
|
lbajardsilogic@8
|
66
|
lbajardsilogic@8
|
67 QString HttpClient::toXmlString(QString indent, QString extraAttributes) const
|
lbajardsilogic@8
|
68 {
|
lbajardsilogic@8
|
69 QString s;
|
lbajardsilogic@8
|
70
|
lbajardsilogic@8
|
71 s += indent;
|
lbajardsilogic@8
|
72
|
lbajardsilogic@8
|
73 s += QString("<connexionSettings>\n");
|
lbajardsilogic@8
|
74
|
lbajardsilogic@8
|
75 if (useProxy())
|
lbajardsilogic@8
|
76 {
|
lbajardsilogic@8
|
77 s += indent;
|
lbajardsilogic@8
|
78 s += QString("\t");
|
lbajardsilogic@8
|
79 s += QString("<proxy name=\"%1\" port=\"%2\" user=\"%3\" pwd=\"%4\" />\n")
|
lbajardsilogic@8
|
80 .arg(getProxy())
|
lbajardsilogic@8
|
81 .arg(QString::number(getProxyPort()))
|
benoitrigolleau@104
|
82 .arg(encodeString(getUserProxyId()))
|
benoitrigolleau@104
|
83 .arg(encodeString(getPwdProxyId()));
|
lbajardsilogic@8
|
84 }
|
lbajardsilogic@8
|
85
|
lbajardsilogic@8
|
86 s += indent;
|
lbajardsilogic@8
|
87 s += QString("\t");
|
lbajardsilogic@8
|
88 s += QString("<host name=\"%1\" port=\"%2\" />\n")
|
lbajardsilogic@8
|
89 .arg(getHost())
|
lbajardsilogic@8
|
90 .arg(QString::number(getHostPort()));
|
lbajardsilogic@8
|
91
|
lbajardsilogic@8
|
92 s += indent;
|
benoitrigolleau@104
|
93 s += QString("\t");
|
benoitrigolleau@104
|
94 s += QString("<servlet adresse=\"%1\" />\n")
|
benoitrigolleau@104
|
95 .arg(getServletName());
|
benoitrigolleau@104
|
96
|
benoitrigolleau@104
|
97 s += indent;
|
lbajardsilogic@8
|
98 s += QString("</connexionSettings>\n");
|
lbajardsilogic@8
|
99
|
lbajardsilogic@8
|
100 return s;
|
lbajardsilogic@8
|
101 }
|
lbajardsilogic@8
|
102
|
lbajardsilogic@8
|
103 bool HttpClient::fromXmlString(QIODevice* file)
|
lbajardsilogic@8
|
104 {
|
lbajardsilogic@8
|
105 HttpClientConfigXmlHandler handler(this);
|
lbajardsilogic@8
|
106 QXmlSimpleReader reader;
|
lbajardsilogic@8
|
107 reader.setContentHandler(&handler);
|
lbajardsilogic@8
|
108 reader.setErrorHandler(&handler);
|
lbajardsilogic@8
|
109
|
lbajardsilogic@8
|
110 if (!file->open(QFile::ReadOnly | QFile::Text)) {
|
lbajardsilogic@8
|
111 return false;
|
lbajardsilogic@8
|
112 }
|
lbajardsilogic@8
|
113
|
lbajardsilogic@8
|
114 QXmlInputSource xmlInputSource(file);
|
lbajardsilogic@8
|
115 if (reader.parse(xmlInputSource))
|
lbajardsilogic@8
|
116 return true;
|
lbajardsilogic@8
|
117
|
lbajardsilogic@8
|
118 return false;
|
lbajardsilogic@8
|
119 }
|
lbajardsilogic@8
|
120
|
lbajardsilogic@8
|
121 HttpClientConfigXmlHandler::HttpClientConfigXmlHandler(HttpClient* httpClient) : QXmlDefaultHandler()
|
lbajardsilogic@8
|
122 {
|
lbajardsilogic@8
|
123 m_httpClient = httpClient;
|
lbajardsilogic@8
|
124 }
|
lbajardsilogic@8
|
125
|
lbajardsilogic@8
|
126 bool HttpClientConfigXmlHandler::startElement(const QString &namespaceURI, const QString &localName,
|
lbajardsilogic@8
|
127 const QString &qName, const QXmlAttributes &attributes)
|
lbajardsilogic@8
|
128 {
|
lbajardsilogic@8
|
129 QString name = qName.toLower();
|
lbajardsilogic@8
|
130 bool ok = false;
|
lbajardsilogic@8
|
131
|
lbajardsilogic@8
|
132 // Valid element names:
|
lbajardsilogic@8
|
133 // config
|
lbajardsilogic@8
|
134 // connexionSettings
|
lbajardsilogic@8
|
135 // proxy
|
lbajardsilogic@8
|
136 // host
|
lbajardsilogic@8
|
137
|
lbajardsilogic@8
|
138 if (name == "config") {
|
lbajardsilogic@8
|
139 // nothing needed
|
lbajardsilogic@8
|
140 ok = true;
|
lbajardsilogic@8
|
141
|
lbajardsilogic@8
|
142 } else if (name == "connexionsettings") {
|
lbajardsilogic@8
|
143 // nothing needed
|
lbajardsilogic@8
|
144 ok = true;
|
lbajardsilogic@8
|
145
|
lbajardsilogic@8
|
146 } else if (name == "proxy") {
|
lbajardsilogic@8
|
147
|
lbajardsilogic@8
|
148 m_httpClient->setProxyInfo(attributes.value("name"));
|
lbajardsilogic@8
|
149 if (attributes.value("name") != "")
|
lbajardsilogic@8
|
150 m_httpClient->setUseProxy(true);
|
lbajardsilogic@8
|
151 m_httpClient->setProxyPortInfo(attributes.value("port").toInt());
|
benoitrigolleau@104
|
152 m_httpClient->setUserProxyId(HttpClient::decodeString(attributes.value("user")));
|
benoitrigolleau@104
|
153 m_httpClient->setPwdProxyId(HttpClient::decodeString(attributes.value("pwd")));
|
lbajardsilogic@8
|
154 ok = true;
|
lbajardsilogic@8
|
155
|
lbajardsilogic@8
|
156 } else if (name == "host") {
|
lbajardsilogic@8
|
157
|
lbajardsilogic@8
|
158 m_httpClient->setHostInfo(attributes.value("name"));
|
lbajardsilogic@8
|
159 m_httpClient->setHostPortInfo(attributes.value("port").toUShort());
|
lbajardsilogic@8
|
160 ok = true;
|
lbajardsilogic@8
|
161
|
benoitrigolleau@104
|
162 } else if (name == "servlet") {
|
benoitrigolleau@104
|
163
|
benoitrigolleau@104
|
164 m_httpClient->setServletNameInfo(attributes.value("adresse"));
|
benoitrigolleau@104
|
165 ok = true;
|
lbajardsilogic@8
|
166 }
|
lbajardsilogic@8
|
167
|
lbajardsilogic@8
|
168 if (!ok) {
|
lbajardsilogic@8
|
169 std::cerr << "WARNING: connexion config-XML: Failed to completely process element \""
|
lbajardsilogic@8
|
170 << name.toLocal8Bit().data() << "\"" << std::endl;
|
lbajardsilogic@8
|
171 }
|
lbajardsilogic@8
|
172
|
lbajardsilogic@8
|
173 return true;
|
lbajardsilogic@8
|
174 }
|
lbajardsilogic@8
|
175
|
lbajardsilogic@8
|
176 bool HttpClientConfigXmlHandler::endElement(const QString &namespaceURI, const QString &localName,
|
lbajardsilogic@8
|
177 const QString &qName)
|
lbajardsilogic@8
|
178 {
|
lbajardsilogic@8
|
179 return true;
|
lbajardsilogic@8
|
180 }
|
lbajardsilogic@8
|
181
|
lbajardsilogic@8
|
182 bool HttpClientConfigXmlHandler::characters(const QString &str)
|
lbajardsilogic@8
|
183 {
|
lbajardsilogic@8
|
184 return true;
|
lbajardsilogic@8
|
185 }
|
lbajardsilogic@8
|
186
|
lbajardsilogic@8
|
187 bool HttpClientConfigXmlHandler::error(const QXmlParseException &exception)
|
lbajardsilogic@8
|
188 {
|
lbajardsilogic@8
|
189 QString errorString;
|
lbajardsilogic@8
|
190 errorString += QString("ERROR: connexion config-XML: %1 at line %2, column %3")
|
lbajardsilogic@8
|
191 .arg(exception.message())
|
lbajardsilogic@8
|
192 .arg(exception.lineNumber())
|
lbajardsilogic@8
|
193 .arg(exception.columnNumber());
|
lbajardsilogic@8
|
194 std::cerr << errorString.toLocal8Bit().data() << std::endl;
|
lbajardsilogic@8
|
195 return QXmlDefaultHandler::error(exception);
|
lbajardsilogic@8
|
196 }
|
lbajardsilogic@8
|
197
|
lbajardsilogic@8
|
198 bool HttpClientConfigXmlHandler::fatalError(const QXmlParseException &exception)
|
lbajardsilogic@8
|
199 {
|
lbajardsilogic@8
|
200 QString errorString;
|
lbajardsilogic@8
|
201 errorString += QString("FATAL ERROR: connexion config-XML: %1 at line %2, column %3")
|
lbajardsilogic@8
|
202 .arg(exception.message())
|
lbajardsilogic@8
|
203 .arg(exception.lineNumber())
|
lbajardsilogic@8
|
204 .arg(exception.columnNumber());
|
lbajardsilogic@8
|
205 std::cerr << errorString.toLocal8Bit().data() << std::endl;
|
lbajardsilogic@8
|
206 return QXmlDefaultHandler::fatalError(exception);
|
benoitrigolleau@104
|
207 }
|
benoitrigolleau@104
|
208
|
benoitrigolleau@104
|
209 QString HttpClient::encodeString(const QString& str){
|
benoitrigolleau@104
|
210 QByteArray bytes = str.toAscii();
|
benoitrigolleau@104
|
211 for(int i=0; i<bytes.count();i++){
|
benoitrigolleau@104
|
212 bytes[i] = bytes[i] ^ 1;
|
benoitrigolleau@104
|
213 }
|
benoitrigolleau@104
|
214 return QString(bytes.toBase64());
|
benoitrigolleau@104
|
215 }
|
benoitrigolleau@104
|
216
|
benoitrigolleau@104
|
217 QString HttpClient::decodeString(const QString& str){
|
benoitrigolleau@104
|
218 QByteArray bytes = str.toAscii().fromBase64(str.toAscii());
|
benoitrigolleau@104
|
219 for(int i=0; i<bytes.count();i++){
|
benoitrigolleau@104
|
220 bytes[i] = bytes[i] ^ 1;
|
benoitrigolleau@104
|
221 }
|
benoitrigolleau@104
|
222 return QString(bytes);
|
lbajardsilogic@8
|
223 } |