/*
*
* This file is part of QMapControl,
* an open-source cross-platform map widget
*
* Copyright (C) 2007 - 2008 Kai Winter
*
* This program 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.
*
* This program 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 QMapControl. If not, see .
*
* Contact e-mail: kaiwinter@gmx.de
* Program URL : http://qmapcontrol.sourceforge.net/
*
*/
#include "mapnetwork.h"
#include
namespace qmapcontrol
{
MapNetwork::MapNetwork(ImageManager* parent)
:parent(parent), http(new QHttp(this)), loaded(0)
{
connect(http, SIGNAL(requestFinished(int, bool)),
this, SLOT(requestFinished(int, bool)));
}
MapNetwork::~MapNetwork()
{
http->clearPendingRequests();
delete http;
}
void MapNetwork::loadImage(const QString& host, const QString& url)
{
// qDebug() << "getting: " << QString(host).append(url);
// http->setHost(host);
// int getId = http->get(url);
http->setHost(host);
QHttpRequestHeader header("GET", url);
header.setValue("User-Agent", "Mozilla");
header.setValue("Host", host);
int getId = http->request(header);
if (vectorMutex.tryLock())
{
loadingMap[getId] = url;
vectorMutex.unlock();
}
}
void MapNetwork::requestFinished(int id, bool error)
{
// sleep(1);
qDebug() << "QMapControl: MapNetwork::requestFinished" << http->state() << ", id: " << id;
if (error)
{
qDebug() << "QMapControl: network error: " << http->errorString();
//restart query
}
else if (vectorMutex.tryLock())
{
// check if id is in map?
if (loadingMap.contains(id))
{
QString url = loadingMap[id];
loadingMap.remove(id);
vectorMutex.unlock();
//qDebug() << "QMapControl: request finished for id: " << id << ", belongs to: " << notifier.url << endl;
QByteArray ax;
if (http->bytesAvailable()>0)
{
QPixmap pm;
ax = http->readAll();
qDebug() << "QMapControl: Request consisted of " << ax.size() << "bytes";
if (pm.loadFromData(ax))
{
loaded += pm.size().width()*pm.size().height()*pm.depth()/8/1024;
qDebug() << "QMapControl: Network loaded: " << (loaded);
parent->receivedImage(pm, url);
}
else if (pm.width() == 0 || pm.height() == 0)
{
// Silently ignore map request for a
// 0xn pixel map
qDebug() << "QMapControl: IGNORED 0x0 pixel map request, widthxheight:" << pm.width() << "x" << pm.height();
qDebug() << "QMapControl: HTML ERROR MESSAGE:" << ax << "at " << __FILE__ << __LINE__;
}
else
{
// QGC FIXME Error is currently undetected
// TODO Error is currently undetected
//qDebug() << "NETWORK_PIXMAP_ERROR: " << ax;
qDebug() << "QMapControl external library: ERROR loading map:" << "width:" << pm.width() << "heigh:" << pm.height() << "at " << __FILE__ << __LINE__;
qDebug() << "QMapControl: HTML ERROR MESSAGE:" << ax << "at " << __FILE__ << __LINE__;
}
}
}
else
vectorMutex.unlock();
}
if (loadingMap.size() == 0)
{
// qDebug () << "all loaded";
parent->loadingQueueEmpty();
}
}
void MapNetwork::abortLoading()
{
http->clearPendingRequests();
if (vectorMutex.tryLock())
{
loadingMap.clear();
vectorMutex.unlock();
}
}
bool MapNetwork::imageIsLoading(QString url)
{
return loadingMap.values().contains(url);
}
void MapNetwork::setProxy(QString host, int port)
{
#ifndef Q_WS_QWS
// do not set proxy on qt/extended
http->setProxy(host, port);
#endif
}
}