lbajardsilogic@8: /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ lbajardsilogic@8: lbajardsilogic@8: /* Sound Access lbajardsilogic@8: EASAIER client application. lbajardsilogic@8: Silogic 2007. Laure Bajard. lbajardsilogic@8: lbajardsilogic@8: This program is free software; you can redistribute it and/or lbajardsilogic@8: modify it under the terms of the GNU General Public License as lbajardsilogic@8: published by the Free Software Foundation; either version 2 of the lbajardsilogic@8: License, or (at your option) any later version. See the file lbajardsilogic@8: COPYING included with this distribution for more information. lbajardsilogic@8: */ lbajardsilogic@8: lbajardsilogic@8: #include "HttpClient.h" lbajardsilogic@8: lbajardsilogic@8: #include lbajardsilogic@8: lbajardsilogic@8: lbajardsilogic@8: HttpClient::HttpClient(const QString& configFileName) : QHttp() lbajardsilogic@8: { lbajardsilogic@8: QFile *config = new QFile(configFileName); lbajardsilogic@8: lbajardsilogic@8: m_useProxy = false; lbajardsilogic@8: m_proxy = ""; lbajardsilogic@8: m_proxyPort = 0; lbajardsilogic@8: m_userProxyId = ""; lbajardsilogic@8: m_pwdProxyId = ""; lbajardsilogic@8: lbajardsilogic@158: m_host = "easaier.silogic.fr"; lbajardsilogic@158: m_hostPort = 9876; lbajardsilogic@8: lbajardsilogic@227: m_servletName = "/easaier/RetrieverService"; lbajardsilogic@200: lbajardsilogic@8: if (config->exists()) lbajardsilogic@8: { lbajardsilogic@8: fromXmlString(config); lbajardsilogic@8: } lbajardsilogic@8: lbajardsilogic@8: if (useProxy()) lbajardsilogic@8: setProxy(m_proxy, m_proxyPort, m_userProxyId, m_pwdProxyId); lbajardsilogic@8: setHost(m_host, m_hostPort); lbajardsilogic@8: } lbajardsilogic@8: lbajardsilogic@8: lbajardsilogic@8: HttpClient::~HttpClient() lbajardsilogic@8: {} lbajardsilogic@8: lbajardsilogic@8: void HttpClient::valuesChanged(ConnectionSettings* dialogBox) lbajardsilogic@8: { lbajardsilogic@8: setUseProxy(dialogBox->useProxy()); lbajardsilogic@8: if (useProxy()) lbajardsilogic@8: { lbajardsilogic@8: m_proxy = dialogBox->getProxy(); lbajardsilogic@8: m_proxyPort = (dialogBox->getProxyPort()).toInt(); lbajardsilogic@8: m_userProxyId = dialogBox->getUserProxyId(); lbajardsilogic@8: m_pwdProxyId = dialogBox->getPwdProxyId(); lbajardsilogic@8: lbajardsilogic@8: setProxy(m_proxy, m_proxyPort, m_userProxyId, m_pwdProxyId); lbajardsilogic@8: } lbajardsilogic@8: lbajardsilogic@8: m_host = dialogBox->getHost(); lbajardsilogic@8: m_hostPort = (dialogBox->getHostPort()).toUShort(); lbajardsilogic@8: lbajardsilogic@8: setHost(m_host, m_hostPort); lbajardsilogic@8: } lbajardsilogic@8: lbajardsilogic@8: QString HttpClient::toXmlString(QString indent, QString extraAttributes) const lbajardsilogic@8: { lbajardsilogic@8: QString s; lbajardsilogic@8: lbajardsilogic@8: s += indent; lbajardsilogic@8: lbajardsilogic@8: s += QString("\n"); lbajardsilogic@8: lbajardsilogic@8: if (useProxy()) lbajardsilogic@8: { lbajardsilogic@8: s += indent; lbajardsilogic@8: s += QString("\t"); lbajardsilogic@8: s += QString("\n") lbajardsilogic@8: .arg(getProxy()) lbajardsilogic@8: .arg(QString::number(getProxyPort())) benoitrigolleau@104: .arg(encodeString(getUserProxyId())) benoitrigolleau@104: .arg(encodeString(getPwdProxyId())); lbajardsilogic@8: } lbajardsilogic@8: lbajardsilogic@8: s += indent; lbajardsilogic@8: s += QString("\t"); lbajardsilogic@8: s += QString("\n") lbajardsilogic@8: .arg(getHost()) lbajardsilogic@8: .arg(QString::number(getHostPort())); lbajardsilogic@8: lbajardsilogic@8: s += indent; benoitrigolleau@104: s += QString("\t"); benoitrigolleau@104: s += QString("\n") benoitrigolleau@104: .arg(getServletName()); benoitrigolleau@104: benoitrigolleau@104: s += indent; lbajardsilogic@8: s += QString("\n"); lbajardsilogic@8: lbajardsilogic@8: return s; lbajardsilogic@8: } lbajardsilogic@8: lbajardsilogic@8: bool HttpClient::fromXmlString(QIODevice* file) lbajardsilogic@8: { lbajardsilogic@8: HttpClientConfigXmlHandler handler(this); lbajardsilogic@8: QXmlSimpleReader reader; lbajardsilogic@8: reader.setContentHandler(&handler); lbajardsilogic@8: reader.setErrorHandler(&handler); lbajardsilogic@8: lbajardsilogic@8: if (!file->open(QFile::ReadOnly | QFile::Text)) { lbajardsilogic@8: return false; lbajardsilogic@8: } lbajardsilogic@8: lbajardsilogic@8: QXmlInputSource xmlInputSource(file); lbajardsilogic@8: if (reader.parse(xmlInputSource)) lbajardsilogic@8: return true; lbajardsilogic@8: lbajardsilogic@8: return false; lbajardsilogic@8: } lbajardsilogic@8: lbajardsilogic@8: HttpClientConfigXmlHandler::HttpClientConfigXmlHandler(HttpClient* httpClient) : QXmlDefaultHandler() lbajardsilogic@8: { lbajardsilogic@8: m_httpClient = httpClient; lbajardsilogic@8: } lbajardsilogic@8: lbajardsilogic@8: bool HttpClientConfigXmlHandler::startElement(const QString &namespaceURI, const QString &localName, lbajardsilogic@8: const QString &qName, const QXmlAttributes &attributes) lbajardsilogic@8: { lbajardsilogic@8: QString name = qName.toLower(); lbajardsilogic@8: bool ok = false; lbajardsilogic@8: lbajardsilogic@8: // Valid element names: lbajardsilogic@8: // config lbajardsilogic@8: // connexionSettings lbajardsilogic@8: // proxy lbajardsilogic@8: // host lbajardsilogic@8: lbajardsilogic@8: if (name == "config") { lbajardsilogic@8: // nothing needed lbajardsilogic@8: ok = true; lbajardsilogic@8: lbajardsilogic@8: } else if (name == "connexionsettings") { lbajardsilogic@8: // nothing needed lbajardsilogic@8: ok = true; lbajardsilogic@8: lbajardsilogic@8: } else if (name == "proxy") { lbajardsilogic@8: lbajardsilogic@8: m_httpClient->setProxyInfo(attributes.value("name")); lbajardsilogic@8: if (attributes.value("name") != "") lbajardsilogic@8: m_httpClient->setUseProxy(true); lbajardsilogic@8: m_httpClient->setProxyPortInfo(attributes.value("port").toInt()); benoitrigolleau@104: m_httpClient->setUserProxyId(HttpClient::decodeString(attributes.value("user"))); benoitrigolleau@104: m_httpClient->setPwdProxyId(HttpClient::decodeString(attributes.value("pwd"))); lbajardsilogic@8: ok = true; lbajardsilogic@8: lbajardsilogic@8: } else if (name == "host") { lbajardsilogic@8: lbajardsilogic@8: m_httpClient->setHostInfo(attributes.value("name")); lbajardsilogic@8: m_httpClient->setHostPortInfo(attributes.value("port").toUShort()); lbajardsilogic@8: ok = true; lbajardsilogic@8: benoitrigolleau@104: } else if (name == "servlet") { benoitrigolleau@104: benoitrigolleau@104: m_httpClient->setServletNameInfo(attributes.value("adresse")); benoitrigolleau@104: ok = true; lbajardsilogic@8: } lbajardsilogic@8: lbajardsilogic@8: if (!ok) { lbajardsilogic@8: std::cerr << "WARNING: connexion config-XML: Failed to completely process element \"" lbajardsilogic@8: << name.toLocal8Bit().data() << "\"" << std::endl; lbajardsilogic@8: } lbajardsilogic@8: lbajardsilogic@8: return true; lbajardsilogic@8: } lbajardsilogic@8: lbajardsilogic@8: bool HttpClientConfigXmlHandler::endElement(const QString &namespaceURI, const QString &localName, lbajardsilogic@8: const QString &qName) lbajardsilogic@8: { lbajardsilogic@8: return true; lbajardsilogic@8: } lbajardsilogic@8: lbajardsilogic@8: bool HttpClientConfigXmlHandler::characters(const QString &str) lbajardsilogic@8: { lbajardsilogic@8: return true; lbajardsilogic@8: } lbajardsilogic@8: lbajardsilogic@8: bool HttpClientConfigXmlHandler::error(const QXmlParseException &exception) lbajardsilogic@8: { lbajardsilogic@8: QString errorString; lbajardsilogic@8: errorString += QString("ERROR: connexion config-XML: %1 at line %2, column %3") lbajardsilogic@8: .arg(exception.message()) lbajardsilogic@8: .arg(exception.lineNumber()) lbajardsilogic@8: .arg(exception.columnNumber()); lbajardsilogic@8: std::cerr << errorString.toLocal8Bit().data() << std::endl; lbajardsilogic@8: return QXmlDefaultHandler::error(exception); lbajardsilogic@8: } lbajardsilogic@8: lbajardsilogic@8: bool HttpClientConfigXmlHandler::fatalError(const QXmlParseException &exception) lbajardsilogic@8: { lbajardsilogic@8: QString errorString; lbajardsilogic@8: errorString += QString("FATAL ERROR: connexion config-XML: %1 at line %2, column %3") lbajardsilogic@8: .arg(exception.message()) lbajardsilogic@8: .arg(exception.lineNumber()) lbajardsilogic@8: .arg(exception.columnNumber()); lbajardsilogic@8: std::cerr << errorString.toLocal8Bit().data() << std::endl; lbajardsilogic@8: return QXmlDefaultHandler::fatalError(exception); benoitrigolleau@104: } benoitrigolleau@104: benoitrigolleau@104: QString HttpClient::encodeString(const QString& str){ benoitrigolleau@104: QByteArray bytes = str.toAscii(); benoitrigolleau@104: for(int i=0; i