diff --git a/lib/tiles/OfflineTilesEnablerLayer.js b/lib/tiles/OfflineTilesEnablerLayer.js index 385dce4..98078cf 100644 --- a/lib/tiles/OfflineTilesEnablerLayer.js +++ b/lib/tiles/OfflineTilesEnablerLayer.js @@ -2,6 +2,7 @@ define([ "dojo/query", "dojo/request", "dojo/_base/declare", + "tiles/TilesCore", "tiles/base64utils", "tiles/TilesStore", "tiles/tilingScheme", @@ -12,7 +13,7 @@ define([ "esri/layers/TileInfo", "esri/SpatialReference", "esri/layers/TiledMapServiceLayer" -], function(query, request, declare,Base64Utils,TilesStore,TilingScheme, +], function(query, request, declare,TilesCore,Base64Utils,TilesStore,TilingScheme, FileSaver,LOD,Point,Extent,TileInfo,SpatialReference,TiledMapServerLayer) { "use strict"; @@ -23,6 +24,7 @@ define([ _level: null, //current zoom level _minZoom: null, _maxZoom: null, + _tilesCore:null, constructor:function(url,callback,state){ @@ -31,6 +33,8 @@ define([ callback(false); } + this._tilesCore = new TilesCore(); + //For calculating minZoom and maxZoom Array.prototype.sortNumber = function(){return this.sort(function(a,b){return a - b})}; @@ -545,7 +549,9 @@ define([ { var cell = cells[i]; - this._storeTile(cell.level,cell.row,cell.col, function(success, error) + var url = this._getTileUrl(cell.level,cell.row,cell.col); + + this._tilesCore._storeTile(url,this.offline.proxyPath,this.offline.store,function(success, error) { if(!success) { @@ -567,45 +573,6 @@ define([ }.bind(this)); }, - _storeTile : function(level,row,col,callback) // callback(success, msg) - { - var store = this.offline.store; - var url = this._getTileUrl(level,row,col); - url = url.split("?")[0]; - - /* download the tile */ - var imgurl = this.offline.proxyPath? this.offline.proxyPath + "?" + url : url; - var req = new XMLHttpRequest(); - req.open("GET", imgurl, true); - req.overrideMimeType("text/plain; charset=x-user-defined"); // https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/Using_XMLHttpRequest?redirectlocale=en-US&redirectslug=DOM%2FXMLHttpRequest%2FUsing_XMLHttpRequest#Handling_binary_data - - req.onload = function() - { - if( req.status === 200 && req.responseText !== "") - { - var img = Base64Utils.wordToBase64(Base64Utils.stringToWord(this.responseText)); - - var tile = { - url: url, - img: img - }; - - store.store(tile,callback); - } - else - { - console.log("xhr failed for", imgurl); - callback(false, req.status + " " + req.statusText + ": " + req.response + " when downloading " + imgurl); - } - }; - req.onerror = function(e) - { - console.log("xhr failed for", imgurl); - callback(false, e); - }; - req.send(null); - }, - parseGetTileInfo: function(data,callback){ var fixedResponse = data.replace(/\\'/g, "'"); diff --git a/lib/tiles/TilesCore.js b/lib/tiles/TilesCore.js index d705aac..964e67b 100644 --- a/lib/tiles/TilesCore.js +++ b/lib/tiles/TilesCore.js @@ -3,10 +3,46 @@ * and OfflineTilesEnablerLayer.js */ define([ - "dojo/_base/declare"], - function(declare){ + "dojo/query", + "tiles/base64utils", + ], + function(query,Base64Utils){ "use strict"; - return declare([],{ + var TilesCore = function(){ + this._storeTile= function(url,proxyPath,store,callback) // callback(success, msg) + { + url = url.split("?")[0]; - }) -}) + /* download the tile */ + var imgurl = proxyPath ? proxyPath + "?" + url : url; + var req = new XMLHttpRequest(); + req.open("GET", imgurl, true); + req.overrideMimeType("text/plain; charset=x-user-defined"); // https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/Using_XMLHttpRequest?redirectlocale=en-US&redirectslug=DOM%2FXMLHttpRequest%2FUsing_XMLHttpRequest#Handling_binary_data + + req.onload = function () { + if (req.status === 200 && req.responseText !== "") { + var img = Base64Utils.wordToBase64(Base64Utils.stringToWord(this.responseText)); + + var tile = { + url: url, + img: img + }; + + store.store(tile, callback); + } + else { + console.log("xhr failed for", imgurl); + callback(false, req.status + " " + req.statusText + ": " + req.response + " when downloading " + imgurl); + } + }; + req.onerror = function (e) { + console.log("xhr failed for", imgurl); + callback(false, e); + }; + req.send(null); + } + } + + return TilesCore; + } +) diff --git a/lib/tiles/offlineTilesEnabler.js b/lib/tiles/offlineTilesEnabler.js index d732e85..f5bcaff 100644 --- a/lib/tiles/offlineTilesEnabler.js +++ b/lib/tiles/offlineTilesEnabler.js @@ -2,11 +2,12 @@ define([ "dojo/query", "dojo/request", "dojo/_base/declare", + "tiles/TilesCore", "tiles/base64utils", "tiles/TilesStore", "tiles/tilingScheme", "tiles/FileSaver" - ], function(query, request, declare,Base64Utils,TilesStore,TilingScheme,FileSaver) + ], function(query, request, declare,TilesCore,Base64Utils,TilesStore,TilingScheme,FileSaver) { "use strict"; return declare([],{ @@ -34,6 +35,7 @@ define([ { console.log("extending layer", layer.url); + layer._tilesCore = new TilesCore(); layer._lastTileUrl = ""; layer._imageType = ""; @@ -461,7 +463,9 @@ define([ { var cell = cells[i]; - this._storeTile(cell.level,cell.row,cell.col, function(success, error) + var url = this._getTileUrl(cell.level,cell.row,cell.col); + + layer._tilesCore._storeTile(url,this.offline.proxyPath,this.offline.store, function(success, error) { if(!success) { @@ -482,45 +486,6 @@ define([ }.bind(this)); }; - - layer._storeTile = function(level,row,col,callback) // callback(success, msg) - { - var store = this.offline.store; - var url = this._getTileUrl(level,row,col); - url = url.split("?")[0]; - - /* download the tile */ - var imgurl = this.offline.proxyPath? this.offline.proxyPath + "?" + url : url; - var req = new XMLHttpRequest(); - req.open("GET", imgurl, true); - req.overrideMimeType("text/plain; charset=x-user-defined"); // https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/Using_XMLHttpRequest?redirectlocale=en-US&redirectslug=DOM%2FXMLHttpRequest%2FUsing_XMLHttpRequest#Handling_binary_data - - req.onload = function() - { - if( req.status === 200 && req.responseText !== "") - { - var img = Base64Utils.wordToBase64(Base64Utils.stringToWord(this.responseText)); - - var tile = { - url: url, - img: img - }; - - store.store(tile,callback); - } - else - { - console.log("xhr failed for", imgurl); - callback(false, req.status + " " + req.statusText + ": " + req.response + " when downloading " + imgurl); - } - }; - req.onerror = function(e) - { - console.log("xhr failed for", imgurl); - callback(false, e); - }; - req.send(null); - }; } }); // declare }); // define diff --git a/test/SpecRunner.offlineTilesEnabler.html b/test/SpecRunner.offlineTilesEnabler.html index 36e3967..606e5b7 100755 --- a/test/SpecRunner.offlineTilesEnabler.html +++ b/test/SpecRunner.offlineTilesEnabler.html @@ -28,6 +28,7 @@ var g_map; var g_basemapLayer; var g_offlineTilesEnabler; + var g_tilesCore; require(["esri/map", "esri/layers/GraphicsLayer", "esri/graphic", "esri/symbols/SimpleFillSymbol", @@ -60,7 +61,7 @@ var jasmineEnv = jasmine.getEnv(); jasmineEnv.updateInterval = 1000; - jasmineEnv.defaultTimeoutInterval = 10000; // 10 sec + jasmineEnv.defaultTimeoutInterval = 15000; // 15 sec var htmlReporter = new jasmine.HtmlReporter(); jasmineEnv.addReporter(htmlReporter); diff --git a/test/SpecRunner.offlineTilesEnablerLayer.html b/test/SpecRunner.offlineTilesEnablerLayer.html index 77616c6..e74353f 100644 --- a/test/SpecRunner.offlineTilesEnablerLayer.html +++ b/test/SpecRunner.offlineTilesEnablerLayer.html @@ -27,6 +27,7 @@ var g_map; var g_basemapLayer; + var tilesCore; require(["esri/map", "esri/layers/GraphicsLayer", "esri/graphic", "esri/symbols/SimpleFillSymbol", @@ -34,13 +35,14 @@ "dojo/dom", "dojo/on", "dojo/query", "esri/urlUtils", "esri/geometry/webMercatorUtils", "tiles/OfflineTilesEnablerLayer", + "tiles/TilesCore", "dojo/dom-construct", "dojo/domReady!"], function(Map, GraphicsLayer, Graphic, SimpleFillSymbol, Scalebar, esriUtils, geometry, dom, on, query, urlUtils, webMercatorUtils, - OfflineTilesEnablerLayer, + OfflineTilesEnablerLayer,TilesCore, domConstruct) { g_basemapLayer = new OfflineTilesEnablerLayer("http://server.arcgisonline.com/ArcGIS/rest/services/World_Topo_Map/MapServer",function(evt){ @@ -57,6 +59,8 @@ g_map.addLayer(g_basemapLayer); + tilesCore = new TilesCore(); + function test() { var jasmineEnv = jasmine.getEnv(); diff --git a/test/spec/offlineTilesEnablerLayerSpec.js b/test/spec/offlineTilesEnablerLayerSpec.js index 6ec1c88..4933a94 100644 --- a/test/spec/offlineTilesEnablerLayerSpec.js +++ b/test/spec/offlineTilesEnablerLayerSpec.js @@ -78,7 +78,10 @@ describe("offline enabler custom layer library", function() g_basemapLayer.getOfflineUsage(function(usage) { expect(usage.tileCount).toEqual(0); - g_basemapLayer._storeTile(14,6177,8023, function(success) + + var url = g_basemapLayer._getTileUrl(14,6177,8023); + + tilesCore._storeTile(url,g_basemapLayer.offline.proxyPath,g_basemapLayer.offline.store, function(success) { expect(success).toEqual(true); g_basemapLayer.getOfflineUsage(function(usage) @@ -95,7 +98,10 @@ describe("offline enabler custom layer library", function() g_basemapLayer.getOfflineUsage(function(usage) { expect(usage.tileCount).toEqual(1); - g_basemapLayer._storeTile(14,6177,8023, function(success) + + var url = g_basemapLayer._getTileUrl(14,6177,8023); + + tilesCore._storeTile(url,g_basemapLayer.offline.proxyPath,g_basemapLayer.offline.store, function(success) { expect(success).toEqual(true); g_basemapLayer.getOfflineUsage(function(usage) diff --git a/test/spec/offlineTilesEnablerSpec.js b/test/spec/offlineTilesEnablerSpec.js index aefed18..9f399be 100644 --- a/test/spec/offlineTilesEnablerSpec.js +++ b/test/spec/offlineTilesEnablerSpec.js @@ -29,10 +29,10 @@ describe("offline enabler library", function() expect(g_basemapLayer.getTileUrl).toEqual(jasmine.any(Function)); expect(g_basemapLayer._getTileUrl).toEqual(jasmine.any(Function)); expect(g_basemapLayer.prepareForOffline).toEqual(jasmine.any(Function)); - expect(g_basemapLayer._storeTile).toEqual(jasmine.any(Function)); expect(g_basemapLayer.deleteAllTiles).toEqual(jasmine.any(Function)); expect(g_basemapLayer.offline).toEqual(jasmine.any(Object)); expect(g_basemapLayer.offline.store).toEqual(jasmine.any(Object)); + expect(g_basemapLayer._tilesCore._storeTile).toEqual(jasmine.any(Function)); g_basemapLayer.offline.proxyPath = "../lib/resource-proxy/proxy.php"; done(); @@ -78,7 +78,10 @@ describe("offline enabler library", function() g_basemapLayer.getOfflineUsage(function(usage) { expect(usage.tileCount).toEqual(0); - g_basemapLayer._storeTile(14,6177,8023, function(success) + + var url = g_basemapLayer._getTileUrl(14,6177,8023); + + g_basemapLayer._tilesCore._storeTile(url,g_basemapLayer.offline.proxyPath,g_basemapLayer.offline.store, function(success) { expect(success).toEqual(true); g_basemapLayer.getOfflineUsage(function(usage) @@ -95,8 +98,10 @@ describe("offline enabler library", function() g_basemapLayer.getOfflineUsage(function(usage) { expect(usage.tileCount).toEqual(1); - g_basemapLayer._storeTile(14,6177,8023, function(success) - { + var url = g_basemapLayer._getTileUrl(14,6177,8023); + + g_basemapLayer._tilesCore._storeTile(url,g_basemapLayer.offline.proxyPath,g_basemapLayer.offline.store, function(success) + { expect(success).toEqual(true); g_basemapLayer.getOfflineUsage(function(usage) {