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)
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);
*/
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:
/**