Load upper level map images from the cache
authorSami Rämö <sami.ramo@ixonos.com>
Fri, 30 Apr 2010 12:41:14 +0000 (15:41 +0300)
committerSami Rämö <sami.ramo@ixonos.com>
Fri, 30 Apr 2010 12:41:14 +0000 (15:41 +0300)
src/map/mapfetcher.cpp
src/map/mapfetcher.h

index 0617235..cd95ffa 100644 (file)
@@ -163,37 +163,60 @@ bool MapFetcher::loadImageFromCache(const QUrl &url)
 
     if (cache) {
 
-        QNetworkCacheMetaData metaData = cache->metaData(url);
+        int zoomLevel;
+        int x;
+        int y;
+        parseURL(url, zoomLevel, x, y);
+        int originalZoomLevel = zoomLevel;
 
-        if ((metaData.expirationDate().isValid()) && (url.isValid())) {
+        // try to fetch requested and upper level images until found or all levels tried
+        do {
+            QIODevice *cacheImage = cache->data(buildURL(zoomLevel, QPoint(x, y)));
+            if (cacheImage) {
+                QImage image;
 
-            if (metaData.expirationDate() < QDateTime::currentDateTime()) {
-                cache->remove(url);
-                return false;
-            }
-        }
+                if (image.load(cacheImage, 0)) {
+                    imageFound = true;
 
-        QIODevice *cacheImage = cache->data(url);
+                    emit mapImageReceived(zoomLevel, x, y, QPixmap::fromImage(image));
+                }
 
-        if (cacheImage) {
-            QImage image;
+                delete cacheImage;
+            }
+        } while (!imageFound && translateIndexesToUpperLevel(zoomLevel, x, y));
+
+        // check expiration if image was found from requested level
+        if (imageFound && (originalZoomLevel == zoomLevel)) {
+            // check if image is expired
+            QNetworkCacheMetaData metaData = cache->metaData(url);
+            if ((metaData.expirationDate().isValid()) && (url.isValid())) {
+
+                if (metaData.expirationDate() < QDateTime::currentDateTime()) {
+                    cache->remove(url);
+                    return false;
+                }
+            }
+        }
 
-            if (image.load(cacheImage, 0)) {
-                imageFound = true;
+        // if image was found, but from upper level, return false
+        if (imageFound && (originalZoomLevel != zoomLevel))
+            return false;
+    }
 
-                int zoomLevel;
-                int x;
-                int y;
-                parseURL(url, zoomLevel, x, y);
+    return imageFound;
+}
 
-                emit mapImageReceived(zoomLevel, x, y, QPixmap::fromImage(image));
-            }
+bool MapFetcher::translateIndexesToUpperLevel(int &zoomLevel, int &x, int &y)
+{
+    if (zoomLevel > MIN_MAP_ZOOM_LEVEL) {
+        zoomLevel--;
+        x /= 2;
+        y /= 2;
 
-            delete cacheImage;
-        }
+        return true;
     }
 
-    return imageFound;
+    return false;
 }
 
 int MapFetcher::newestRequestIndex(bool cacheChecked)
index b074b3b..00eb5d7 100644 (file)
@@ -104,12 +104,14 @@ private:
     void limitPendingRequestsListSize();
 
     /**
-    * @brief Loads image from cache if it's available and emits imageReveived
-    * signal with url and image. If image is in cache returns true, false
-    * otherwise.
+    * @brief Loads image from cache
     *
-    * @param url
-    * @return bool true if image was loaded from cache, false otherwise
+    * Tries to load requested, or upper zoom level image from the cache. Emits imageReveived signal
+    * if any image was found. If image found was from requested zoom level then expidation date is
+    * checked.
+    *
+    * @param url URL of the requested image
+    * @return True if requested zoom level image was found and was not expired. Otherwise false.
     */
     bool loadImageFromCache(const QUrl &url);
 
@@ -136,6 +138,15 @@ private:
     */
     void parseURL(const QUrl &url, int &zoom, int &x, int &y);
 
+    /**
+    * @brief Translate indexes to matching upper level map tile indexes
+    * @param[in,out] zoomLevel Zoom level
+    * @param[in,out] x x index
+    * @param[in,out] y y index
+    * @return true if translation succeeded, otherwise false
+    */
+    bool translateIndexesToUpperLevel(int &zoomLevel, int &x, int &y);
+
 private slots:
 
     /**