// namespaces var dwv = dwv || {}; dwv.io = dwv.io || {}; /** * Memory loader. * @constructor */ dwv.io.MemoryLoader = function () { /** * Closure to self. * @private * @type Object */ var self = this; /** * Launched loader (used in abort). * @private * @type Object */ var runningLoader = null; /** * Number of data to load. * @private * @type Number */ var nToLoad = 0; /** * Number of loaded data. * @private * @type Number */ var nLoaded = 0; /** * The default character set (optional). * @private * @type String */ var defaultCharacterSet; /** * Get the default character set. * @return {String} The default character set. */ this.getDefaultCharacterSet = function () { return defaultCharacterSet; }; /** * Set the default character set. * @param {String} characterSet The character set. */ this.setDefaultCharacterSet = function (characterSet) { defaultCharacterSet = characterSet; }; /** * Store a launched loader. * @param {Object} loader The launched loader. */ this.storeLoader = function (loader) { runningLoader = loader; }; /** * Clear the stored loader. */ this.clearStoredLoader = function () { runningLoader = null; }; /** * Abort a memory load. */ this.abort = function () { // abort loader runningLoader.abort(); this.clearStoredLoaders(); }; /** * Set the number of data to load. * @param {Number} n The number of data to load. */ this.setNToLoad = function (n) { nToLoad = n; }; /** * Increment the number of loaded data * and call onloadend if loaded all data. */ this.addLoaded = function () { nLoaded++; if ( nLoaded === nToLoad ) { self.onloadend(); } }; }; // class Memory /** * Handle a load event. * @param {Object} event The load event, 'event.target' * should be the loaded data. * Default does nothing. */ dwv.io.MemoryLoader.prototype.onload = function (/*event*/) {}; /** * Handle a load end event. * Default does nothing. */ dwv.io.MemoryLoader.prototype.onloadend = function () {}; /** * Handle a progress event. * @param {Object} event The progress event. * Default does nothing. */ dwv.io.MemoryLoader.prototype.onprogress = function (/*event*/) {}; /** * Handle an error event. * @param {Object} event The error event with an * optional 'event.message'. * Default does nothing. */ dwv.io.MemoryLoader.prototype.onerror = function (/*event*/) {}; /** * Handle an abort event. * @param {Object} event The abort event with an * optional 'event.message'. * Default does nothing. */ dwv.io.MemoryLoader.prototype.onabort = function (/*event*/) {}; /** * Load a list of buffers. * @param {Array} ioArray The list of buffers to load. */ dwv.io.MemoryLoader.prototype.load = function (ioArray) { // clear storage this.clearStoredLoader(); // closure to self for handlers var self = this; // set the number of data to load this.setNToLoad( ioArray.length ); var mproghandler = new dwv.utils.MultiProgressHandler(self.onprogress); mproghandler.setNToLoad( ioArray.length ); // get loaders var loaders = []; for (var m = 0; m < dwv.io.loaderList.length; ++m) { loaders.push( new dwv.io[dwv.io.loaderList[m]]() ); } // set loaders callbacks var loader = null; for (var k = 0; k < loaders.length; ++k) { loader = loaders[k]; loader.onload = self.onload; loader.onloadend = self.addLoaded; loader.onerror = self.onerror; loader.onabort = self.onabort; loader.setOptions({ 'defaultCharacterSet': this.getDefaultCharacterSet() }); loader.onprogress = mproghandler.getUndefinedMonoProgressHandler(1); } // loop on I/O elements for (var i = 0; i < ioArray.length; ++i) { var iodata = ioArray[i]; // find a loader var foundLoader = false; for (var l = 0; l < loaders.length; ++l) { loader = loaders[l]; if (loader.canLoadUrl(iodata.filename)) { foundLoader = true; // store loader this.storeLoader(loader); // read loader.load(iodata.data, iodata.filename, i); // next file break; } } // TODO: throw? if (!foundLoader) { throw new Error("No loader found for file: "+iodata.filename); } } };