Initial version
[gpssportsniffer] / tilesMap.cpp
index cff06cb..aa7efbe 100755 (executable)
@@ -1,3 +1,22 @@
+/****************************************************************************
+**
+**  Copyright (C) 2011  Tito Eritja Real <jtitoo@gmail.com>
+**
+**  This program is free software: you can redistribute it and/or modify
+**  it under the terms of the GNU 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 General Public License for more details.
+**
+**  You should have received a copy of the GNU General Public License
+**  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+**
+****************************************************************************/
+
 #include "tilesMap.h"
 #include "constants.h"
 #include "log.h"
 #include "tilesMap.h"
 #include "constants.h"
 #include "log.h"
@@ -39,7 +58,8 @@ TilesMap::TilesMap(QNetworkSession *session, QObject *parent = 0, Log* log=0, in
     longitude(0),
     width(WIDTH_DEFAULT),
     height(HEIGHT_DEFAULT),
     longitude(0),
     width(WIDTH_DEFAULT),
     height(HEIGHT_DEFAULT),
-    tilesD(0){
+    tilesD(0),
+    cache(false){
 
     m_mapsDir = QDir(QString(APPLICATION_PATH).append(MAPS_DIR));
     m_manager = new QNetworkAccessManager(this);
 
     m_mapsDir = QDir(QString(APPLICATION_PATH).append(MAPS_DIR));
     m_manager = new QNetworkAccessManager(this);
@@ -49,9 +69,9 @@ TilesMap::TilesMap(QNetworkSession *session, QObject *parent = 0, Log* log=0, in
     m_emptyTile.fill(Qt::lightGray);
 
     //log->debug(QString("Is Network accessible?:%1").arg(m_manager->networkAccessible()));
     m_emptyTile.fill(Qt::lightGray);
 
     //log->debug(QString("Is Network accessible?:%1").arg(m_manager->networkAccessible()));
-    QNetworkDiskCache *cache = new QNetworkDiskCache;
-    cache->setCacheDirectory(QDesktopServices::storageLocation(QDesktopServices::CacheLocation));
-    m_manager->setCache(cache);
+    QNetworkDiskCache *nCache = new QNetworkDiskCache;
+    nCache->setCacheDirectory(QDesktopServices::storageLocation(QDesktopServices::CacheLocation));
+    m_manager->setCache(nCache);
     connect(m_manager, SIGNAL(finished(QNetworkReply*)),
             this, SLOT(handleReplies(QNetworkReply*)));
 
     connect(m_manager, SIGNAL(finished(QNetworkReply*)),
             this, SLOT(handleReplies(QNetworkReply*)));
 
@@ -158,13 +178,17 @@ void TilesMap::getTiles() {
                 request.setAttribute(QNetworkRequest::User, QVariant(grab));
                 m_pendingReplies << m_manager->get(request);
 
                 request.setAttribute(QNetworkRequest::User, QVariant(grab));
                 m_pendingReplies << m_manager->get(request);
 
-                m_tileRequests[grab]=TileRequest(zoom,QDateTime::currentDateTime(),false);
+                m_tileRequests[grab]=TileRequest(zoom,QDateTime::currentDateTime(),cache,false);
 
             }
         }
     }
 }
 
 
             }
         }
     }
 }
 
+void TilesMap::cancelDownloading(){
+
+}
+
 int TilesMap::downloadMaps(Track* track_p){
     int numTiles = 0;
     tilesD=0;
 int TilesMap::downloadMaps(Track* track_p){
     int numTiles = 0;
     tilesD=0;
@@ -180,7 +204,7 @@ int TilesMap::downloadMaps(Track* track_p){
     // ading tiles needed by track
     QList<GpsPoint*> gpsPoints = track_p->getGpsPoints();
     int updateProgress=0;
     // ading tiles needed by track
     QList<GpsPoint*> gpsPoints = track_p->getGpsPoints();
     int updateProgress=0;
-    for(int zoom_temp=zoom; zoom_temp < 17; zoom_temp++){
+    for(int zoom_temp=zoom; zoom_temp <= MAX_ZOOM_DOWNL; zoom_temp++){
         for (int i = 0; i < gpsPoints.size(); ++i) {
             GpsPoint* point = gpsPoints.at(i);
             downloadTiles(point->getLatitude(), point->getLongitude(),zoom_temp,&numTiles);
         for (int i = 0; i < gpsPoints.size(); ++i) {
             GpsPoint* point = gpsPoints.at(i);
             downloadTiles(point->getLatitude(), point->getLongitude(),zoom_temp,&numTiles);
@@ -242,7 +266,7 @@ void TilesMap::downloadWindow(int* numTiles,int zoom){
                     request.setAttribute(QNetworkRequest::User, QVariant(grab));
                 m_pendingReplies << m_manager->get(request);
 
                     request.setAttribute(QNetworkRequest::User, QVariant(grab));
                 m_pendingReplies << m_manager->get(request);
 
-                m_tileRequests[grab]= TileRequest(zoom,QDateTime::currentDateTime(),true);
+                m_tileRequests[grab]= TileRequest(zoom,QDateTime::currentDateTime(),true,true);
                 (*numTiles)++;
             }
         }
                 (*numTiles)++;
             }
         }
@@ -250,8 +274,6 @@ void TilesMap::downloadWindow(int* numTiles,int zoom){
 }
 
 
 }
 
 
-
-
 void TilesMap::render(QPainter *p, const QRect &rect) {
     //log->debug("rendering maps...");
     for (int x = 0; x <= m_tilesRect.width(); ++x)
 void TilesMap::render(QPainter *p, const QRect &rect) {
     //log->debug("rendering maps...");
     for (int x = 0; x <= m_tilesRect.width(); ++x)
@@ -301,33 +323,38 @@ void TilesMap::handleReplies(QNetworkReply *reply){
         QDir().mkdir(mapsDir());
     }
     if (!reply->error()){
         QDir().mkdir(mapsDir());
     }
     if (!reply->error()){
+
         if (!img.load(reply, 0)){
             img = QImage();
         }else{
 
 
         if (!img.load(reply, 0)){
             img = QImage();
         }else{
 
 
-            if(tr.save){
+            if(tr.downloading){
                 zoomReply=tr.zoom;
             }
                 zoomReply=tr.zoom;
             }
-            QString fileString = QString(fileUrlProvider()).arg(zoomReply).arg(tp.x()).arg(tp.y());
 
 
-            if(!QDir(urlProvider()).exists())
-                QDir().mkdir(urlProvider());
+            if(tr.save){
+                QString fileString = QString(fileUrlProvider()).arg(zoomReply).arg(tp.x()).arg(tp.y());
+
+                if(!QDir(urlProvider()).exists())
+                    QDir().mkdir(urlProvider());
 
 
-            if(!QDir(urlProvider().append("%1/").arg(zoomReply)).exists())
-                QDir().mkdir(urlProvider().append("%1").arg(zoomReply));
+                if(!QDir(urlProvider().append("%1/").arg(zoomReply)).exists())
+                    QDir().mkdir(urlProvider().append("%1").arg(zoomReply));
+
+                if(!QDir(urlProvider().append("%1/").arg(zoomReply).append("%1/").arg(tp.x())).exists())
+                    QDir().mkdir(urlProvider().append("%1/").arg(zoomReply).append("%1/").arg(tp.x()));
 
 
-            if(!QDir(urlProvider().append("%1/").arg(zoomReply).append("%1/").arg(tp.x())).exists())
-                QDir().mkdir(urlProvider().append("%1/").arg(zoomReply).append("%1/").arg(tp.x()));
 
 
-            if(tr.save){
                 QFile file(fileString);
 
                 if (!file.open(QIODevice::WriteOnly)) {
                     qDebug() << QString("Cannot open file for writing: %1").arg(file.errorString());
                 }
                 img.save(fileString);
                 QFile file(fileString);
 
                 if (!file.open(QIODevice::WriteOnly)) {
                     qDebug() << QString("Cannot open file for writing: %1").arg(file.errorString());
                 }
                 img.save(fileString);
-                tilesD++;
+
+                if(tr.downloading)
+                    tilesD++;
             }
         }
     }
             }
         }
     }
@@ -336,7 +363,7 @@ void TilesMap::handleReplies(QNetworkReply *reply){
 
     m_tileRequests.remove(tp);
 
 
     m_tileRequests.remove(tp);
 
-    if(!tr.save){
+    if(!tr.downloading){
 
         m_tileMaps[tp] = QPixmap::fromImage(img);
         if (img.isNull()){
 
         m_tileMaps[tp] = QPixmap::fromImage(img);
         if (img.isNull()){
@@ -350,6 +377,7 @@ void TilesMap::handleReplies(QNetworkReply *reply){
         foreach(QPoint tp, m_tileMaps.keys())
             if (!bound.contains(tp))
                 m_tileMaps.remove(tp);
         foreach(QPoint tp, m_tileMaps.keys())
             if (!bound.contains(tp))
                 m_tileMaps.remove(tp);
+
     }else{
         emit tilesDownloaded(tilesD);
     }
     }else{
         emit tilesDownloaded(tilesD);
     }
@@ -396,6 +424,9 @@ QString TilesMap::fileUrlProvider(){
     case MapTypeICC:
         dir.append("/icc/%1/%2/%3.png");
         break;
     case MapTypeICC:
         dir.append("/icc/%1/%2/%3.png");
         break;
+    case MapTypeCloudMade:
+        dir.append("/cloudmade/%1/%2/%3.png");
+        break;
     case MapTypeOpenCycleMaps:
         dir.append("/ocm/%1/%2/%3.png");
         break;
     case MapTypeOpenCycleMaps:
         dir.append("/ocm/%1/%2/%3.png");
         break;
@@ -422,6 +453,9 @@ QString TilesMap::urlProvider(){
     case MapTypeICC:
         dir.append("/icc/");
         break;
     case MapTypeICC:
         dir.append("/icc/");
         break;
+    case MapTypeCloudMade:
+        dir.append("/cloudmade/");
+        break;
     case MapTypeOpenCycleMaps:
         dir.append("/ocm/");
         break;
     case MapTypeOpenCycleMaps:
         dir.append("/ocm/");
         break;
@@ -438,9 +472,14 @@ QString TilesMap::mapUrlProvider(){
     //m_log->debug("--- mapUrlProvider ---");
     QString url("http://");
     //m_log->debug(QString("mapType:%1").arg(mapType));
     //m_log->debug("--- mapUrlProvider ---");
     QString url("http://");
     //m_log->debug(QString("mapType:%1").arg(mapType));
+
     switch(mapType){
     switch(mapType){
+    case MapTypeCloudMade:
+        url.append("tile.cloudmade.com/e63d1732f3be48299e0c19d6bcefe25c/3/256/%1/%2/%3.png");
+        break;
     case MapTypeGoogleMaps:
     case MapTypeGoogleMaps:
-        url.append("mt1.google.com/vt/&x=%2&y=%3&z=%1");
+        url.append("mt1.google.com/vt/lyrs=m@121,bike&hl=es&x=%2&y=%3&z=%1");
+        //url.append("mt1.google.com/vt/&x=%2&y=%3&z=%1");
         break;
     case MapTypeICC:
         url.append("norma.icc.cat/tilecache/tilecache.py/1.0.0/topo3857/%1/%2/%3.png?type=google");
         break;
     case MapTypeICC:
         url.append("norma.icc.cat/tilecache/tilecache.py/1.0.0/topo3857/%1/%2/%3.png?type=google");