--- /dev/null
+/*
+ * Copyright (c) 2009 Eetu Lehmusvuo.
+ *
+ * This file is part of QtMAds.
+ *
+ * QtMAds is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * QtMAds is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with QtMAds. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "qtmadsservice.h"
+
+#include <QHttp>
+#include <QUrl>
+#include <QDebug>
+#include <QImage>
+#include <QFile>
+#include <QXmlStreamReader>
+#include <QDir>
+#include <QPluginLoader>
+
+QtmadsService::QtmadsService()
+{
+}
+
+QtmadsService::~QtmadsService()
+{
+ http->close();
+ delete http;
+}
+
+bool QtmadsService::initializeService(QString service, quint32 adGroup, AdType defaultAdType)
+{
+ this->serviceName = service;
+ this->adGroupId = adGroup;
+ this->defAdType = defaultAdType;
+
+ bool parseSuccess = true;
+ // ../plugins/SERVICE_NAME_adconfigure.xml
+ QFile file(CONF_PATH + this->serviceName + CONF_FILE_POSTFIX );
+ parseSuccess = file.exists();
+
+ /*if(!file.exists()){
+ // ./default_adconfigure.xml
+ file.setFileName("." + CONF_FILE);
+ parseSuccess = file.exists();
+ }*/
+
+ if(parseSuccess){
+ file.open(QIODevice::ReadOnly);
+ this->parseXmlConfFile(file);
+ }
+
+ if(parseSuccess){
+ initialized = true;
+ }else{
+ qDebug() << "Ad service configure failed. " << CONF_PATH + this->serviceName + CONF_FILE_POSTFIX ;
+ initialized = false;
+ //TODO: parse failed
+ }
+
+ return isInitialized();
+}
+
+bool QtmadsService::isInitialized()
+{
+ return initialized;
+}
+
+void QtmadsService::getAd(QHash<QString, QVariant> &adParameters)
+{
+ //qDebug() << "QtmadsService::getAd()";
+ if(isInitialized()){
+ QList<QPair<QString,QString> > parameters;
+ this->parseUrlParameters(adParameters, parameters);
+
+ QUrl url(this->serviceUrl);
+ url.setQueryItems(parameters);
+ QByteArray path = QUrl::toPercentEncoding(url.path(), "!$&'()*+,;=:@/?");
+ if (path.isEmpty())
+ path = "/";
+ path.append(QUrl::toPercentEncoding("?", "!$&'()*+,;=:@/?"));
+ path.append(url.encodedQuery());
+
+ http = new QHttp(this);
+ connect(http, SIGNAL(requestFinished(int, bool)), this, SLOT(adRequestFinished(int, bool)));
+ http->setHost(url.host());
+ //qDebug() << "Url: " << url.toString();
+ adTrasactionId = http->get(path);
+ }else{
+ emit adRequestFailed();
+ }
+}
+
+
+void QtmadsService::adRequestFinished(int transactionId, bool error)
+{
+ //qDebug() << "adRequestFinished()";
+ if(adTrasactionId != transactionId){
+ return;
+ }
+ adTrasactionId = -1;
+
+ if(!error){
+ QByteArray data = http->readAll();
+
+ qDebug() << "Data: " << data;
+
+ QHash<QString, QVariant> adParams;// = new QHash<QString, QVariant>();
+ this->parseReceivedAd(data, adParams);
+ QHash<QString, QVariant>::iterator i;
+
+
+ /*for(i = adParams.begin(); i != adParams.end(); i++){
+ qDebug() << "key: " << i.key() << " value: " << i.value().toString();
+ }*/
+
+ emit adRequestReady(adParams);
+ }else{
+ qDebug() << "adRequestFailed()";
+ emit adRequestFailed();
+ }
+
+ disconnect(http, SIGNAL(requestFinished(int, bool)), this, SLOT(adRequestFinished(int, bool)));
+}
+
+void QtmadsService::getRemoteImage(QString urlString)
+{
+ QUrl url(urlString);
+ QByteArray path = QUrl::toPercentEncoding(url.path(), "!$&'()*+,;=:@/?");
+ if (path.isEmpty())
+ path = "/";
+
+ connect(http, SIGNAL(requestFinished(int, bool)), this, SLOT(imageRequestFinished(int, bool)));
+ http->setHost(url.host());
+ imageTrasactionId = http->get(path);
+}
+
+
+void QtmadsService::imageRequestFinished(int transactionId, bool error)
+{
+ if(imageTrasactionId != transactionId){
+ return;
+ }
+ imageTrasactionId = -1;
+
+ if(!error){
+ QImage *image = new QImage();
+ if(image->loadFromData(http->readAll())){
+ emit imageRequestReady(image);
+ delete image;
+ }else{
+ delete image;
+ emit imageRequestFailed();
+ }
+ }
+
+ disconnect(http, SIGNAL(requestFinished(int, bool)), this, SLOT(imageRequestFinished(int, bool)));
+}
+
+
+void QtmadsService::setDefaultAdType(AdType type)
+{
+ this->defAdType = type;
+}
+
+AdType QtmadsService::defaultAdType()
+{
+ return this->defAdType;
+}
+
+bool QtmadsService::parseXmlConfFile(QFile &file)
+{
+ qDebug() << "QtmadsService::parseXmlConfFile()";
+ bool success = false;
+ QXmlStreamReader xmlReader(&file);
+
+ while (!xmlReader.atEnd()) {
+ // find right servicename tag
+ if(QXmlStreamReader::StartElement == xmlReader.readNext()
+ && 0 == xmlReader.name().compare(TAG_SERVICE)
+ && 0 == xmlReader.attributes().value("name").compare(this->serviceName)){
+ this->serviceUrl.clear();
+ this->serviceUrl.append(xmlReader.attributes().value("url"));
+
+ // until </service>
+ while (!(QXmlStreamReader::EndElement == xmlReader.readNext()
+ && 0 == xmlReader.name().compare(TAG_SERVICE))) {
+ success = true;
+
+ if(QXmlStreamReader::StartElement == xmlReader.tokenType()){
+ if(0 == xmlReader.name().compare(TAG_ACCOUNTID)){
+ parameterTags.insert(
+ QString(TAG_ACCOUNTID),xmlReader.attributes().value(TAG_KEY).toString());
+ this->accountId.clear();
+ this->accountId.append(xmlReader.attributes().value(TAG_VALUE));
+ }else if(0 == xmlReader.name().compare(TAG_PASSWORD)){
+ parameterTags.insert(
+ QString(TAG_PASSWORD),xmlReader.attributes().value(TAG_KEY).toString());
+ this->password.clear();
+ this->password.append(xmlReader.attributes().value(TAG_VALUE));
+ }else if(0 == xmlReader.name().compare(TAG_CAMPAIGN)){
+
+ if(0 == xmlReader.attributes().value("id").compare(QString("%1").arg(this->adGroupId))){
+ // until </campaign>
+ while(!(QXmlStreamReader::EndElement == xmlReader.readNext()
+ && 0 == xmlReader.name().compare(TAG_CAMPAIGN))){
+ if(QXmlStreamReader::StartElement == xmlReader.tokenType()){
+ /*qDebug() << "name: " << xmlReader.name()
+ << "key: " << xmlReader.attributes().value(TAG_KEY).toString()
+ << "value: " << xmlReader.attributes().value(TAG_VALUE).toString();*/
+ if(0 == xmlReader.name().compare(TAG_ADTYPE)){
+ parameterTags.insert(
+ QString(TAG_ADTYPE),xmlReader.attributes().value(TAG_KEY).toString());
+ this->defAdType = this->getAdTypeFromString(xmlReader.attributes().value(TAG_VALUE).toString());
+
+ }else if(0 == xmlReader.name().compare(TAG_LANGUAGE)){
+ parameterTags.insert(
+ QString(TAG_LANGUAGE),xmlReader.attributes().value(TAG_KEY).toString());
+ this->language = xmlReader.attributes().value(TAG_VALUE).toString();
+
+ }else if(0 == xmlReader.name().compare(TAG_TRANSACTIONID)){
+ parameterTags.insert(
+ QString(TAG_TRANSACTIONID),xmlReader.attributes().value(TAG_KEY).toString());
+ this->transactionId = xmlReader.attributes().value(TAG_VALUE).toString();
+
+ }else{
+ qDebug() << "Unknown element: " << xmlReader.tokenString();
+ if(xmlReader.atEnd()){
+ // TODO: throw exception?
+ qDebug() << "Unexpected end of document!";
+ return false;
+ }
+
+ }
+ }
+ }
+ }
+ }else{
+ qDebug() << "Unknown element: " << xmlReader.tokenString();
+ if(xmlReader.atEnd()){
+ // TODO: throw exception?
+ qDebug() << "Unexpected end of document!";
+ return false;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ /*while (!xmlReader.atEnd()) {
+ qDebug() << "Type: "<< xmlReader.readNext();
+ qDebug() << " Tokenstring: " << xmlReader.tokenString();
+ qDebug() << " name: " << xmlReader.name(); //<< " key: " << xmlReader.attributes().value("key") << " value: " << xmlReader.attributes().value("value");
+ qDebug() << " ";
+ }*/
+
+ return success;
+}
+
+AdType QtmadsService::getAdTypeFromString(QString adStr)
+{
+ AdType adType = anyAd;
+
+ if(0 == adStr.compare("txtAd")){
+ adType = txtAd;
+ }else if(0 == adStr.compare("imageAd")){
+ adType = imageAd;
+ }else if(0 == adStr.compare("txtBannerAd")){
+ adType = txtBannerAd;
+ }else if(0 == adStr.compare("imageBannerAd")){
+ adType = imageBannerAd;
+ }else if(0 == adStr.compare("audioAd")){
+ adType = audioAd;
+ }else if(0 == adStr.compare("videoAd")){
+ adType = videoAd;
+ }
+ return adType;
+}
+
+QString QtmadsService::getStringFromAdType(AdType adType)
+{
+ QString adStr;
+ switch(adType){
+ default:
+ case anyAd:
+ adStr.append("anyAd");
+ break;
+ case txtAd:
+ adStr.append("txtAd");
+ break;
+ case imageAd:
+ adStr.append("imageAd");
+ break;
+ case txtBannerAd:
+ adStr.append("txtBannerAd");
+ break;
+ case imageBannerAd:
+ adStr.append("imageBannerAd");
+ break;
+ case audioAd:
+ adStr.append("audioAd");
+ break;
+ case videoAd:
+ adStr.append("videoAd");
+ break;
+ }
+ return adStr;
+}