annotate data/fileio/HttpClient.cpp @ 282:d9319859a4cf tip

(none)
author benoitrigolleau
date Fri, 31 Oct 2008 11:00:24 +0000
parents 59d84a8bb76c
children
rev   line source
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 }