Blame | Last modification | View Log | RSS feed
if(!dojo._hasResource["dojox.storage.FlashStorageProvider"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.dojo._hasResource["dojox.storage.FlashStorageProvider"] = true;dojo.provide("dojox.storage.FlashStorageProvider");dojo.require("dojox.flash");dojo.require("dojox.storage.manager");dojo.require("dojox.storage.Provider");// summary:// Storage provider that uses features in Flash to achieve permanent// storage// description:// Authors of this storage provider-// Brad Neuberg, bkn3@columbia.edudojo.declare("dojox.storage.FlashStorageProvider", [ dojox.storage.Provider ], {initialized: false,_available: null,_statusHandler: null,initialize: function(){if(djConfig["disableFlashStorage"] == true){return;}// initialize our Flashvar loadedListener = function(){// indicate our Flash subsystem is now loadeddojox.storage._flashLoaded();}dojox.flash.addLoadedListener(loadedListener);dojox.flash.setSwf({flash6: dojo.moduleUrl("dojox", "storage/Storage_version6.swf").toString(),flash8: dojo.moduleUrl("dojox", "storage/Storage_version8.swf").toString(),visible: false});},// Set a new value for the flush delay timer.// Possible values:// 0 : Perform the flush synchronously after each "put" request// > 0 : Wait until 'newDelay' ms have passed without any "put" request to flush// -1 : Do not automatically flushsetFlushDelay: function(newDelay){if(newDelay === null || typeof newDelay === "undefined" || isNaN(newDelay)){throw new Error("Invalid argunment: " + newDelay);}dojox.flash.comm.setFlushDelay(String(newDelay));},getFlushDelay: function(){return Number(dojox.flash.comm.getFlushDelay());},flush: function(namespace){//FIXME: is this test necessary? Just use !namespaceif(namespace == null || typeof namespace == "undefined"){namespace = dojox.storage.DEFAULT_NAMESPACE;}dojox.flash.comm.flush(namespace);},isAvailable: function(){return (this._available = !djConfig["disableFlashStorage"]);},put: function(key, value, resultsHandler, namespace){if(this.isValidKey(key) == false){throw new Error("Invalid key given: " + key);}if(namespace == null || typeof namespace == "undefined"){namespace = dojox.storage.DEFAULT_NAMESPACE;}if(this.isValidKey(namespace) == false){throw new Error("Invalid namespace given: " + namespace);}this._statusHandler = resultsHandler;// serialize the value;// handle strings differently so they have better performanceif(dojo.isString(value)){value = "string:" + value;}else{value = dojo.toJson(value);}dojox.flash.comm.put(key, value, namespace);},putMultiple: function(keys, values, resultsHandler, namespace){if(this.isValidKeyArray(keys) === false || ! values instanceof Array || keys.length != values.length){throw new Error("Invalid arguments: keys = [" + keys + "], values = [" + values + "]");}if(namespace == null || typeof namespace == "undefined"){namespace = dojox.storage.DEFAULT_NAMESPACE;}if(this.isValidKey(namespace) == false){throw new Error("Invalid namespace given: " + namespace);}this._statusHandler = resultsHandler;// Convert the arguments on strings we can pass along to Flashvar metaKey = keys.join(",");var lengths = [];for(var i=0;i<values.length;i++){if(dojo.isString(values[i])){values[i] = "string:" + values[i];}else{values[i] = dojo.toJson(values[i]);}lengths[i] = values[i].length;}var metaValue = values.join("");var metaLengths = lengths.join(",");dojox.flash.comm.putMultiple(metaKey, metaValue, metaLengths, this.namespace);},get: function(key, namespace){if(this.isValidKey(key) == false){throw new Error("Invalid key given: " + key);}if(namespace == null || typeof namespace == "undefined"){namespace = dojox.storage.DEFAULT_NAMESPACE;}if(this.isValidKey(namespace) == false){throw new Error("Invalid namespace given: " + namespace);}var results = dojox.flash.comm.get(key, namespace);if(results == ""){return null;}return this._destringify(results);},getMultiple: function(/*array*/ keys, /*string?*/ namespace){ /*Object*/if(this.isValidKeyArray(keys) === false){throw new ("Invalid key array given: " + keys);}if(namespace == null || typeof namespace == "undefined"){namespace = dojox.storage.DEFAULT_NAMESPACE;}if(this.isValidKey(namespace) == false){throw new Error("Invalid namespace given: " + namespace);}var metaKey = keys.join(",");var metaResults = dojox.flash.comm.getMultiple(metaKey, this.namespace);var results = eval("(" + metaResults + ")");// destringify each entry back into a real JS object//FIXME: use dojo.mapfor(var i=0;i<results.length;i++){results[i] = (results[i] == "") ? null : this._destringify(results[i]);}return results;},_destringify: function(results){// destringify the content back into a// real JavaScript object;// handle strings differently so they have better performanceif(dojo.isString(results) && (/^string:/.test(results))){results = results.substring("string:".length);}else{results = dojo.fromJson(results);}return results;},getKeys: function(namespace){if(namespace == null || typeof namespace == "undefined"){namespace = dojox.storage.DEFAULT_NAMESPACE;}if(this.isValidKey(namespace) == false){throw new Error("Invalid namespace given: " + namespace);}var results = dojox.flash.comm.getKeys(namespace);if(results == ""){return [];}// the results are returned comma seperated; split themresults = results.split(",");return results;},getNamespaces: function(){var results = dojox.flash.comm.getNamespaces();if(results == ""){return [dojox.storage.DEFAULT_NAMESPACE];}// the results are returned comma seperated; split themresults = results.split(",");return results;},clear: function(namespace){if(namespace == null || typeof namespace == "undefined"){namespace = dojox.storage.DEFAULT_NAMESPACE;}if(this.isValidKey(namespace) == false){throw new Error("Invalid namespace given: " + namespace);}dojox.flash.comm.clear(namespace);},remove: function(key, namespace){if(namespace == null || typeof namespace == "undefined"){namespace = dojox.storage.DEFAULT_NAMESPACE;}if(this.isValidKey(namespace) == false){throw new Error("Invalid namespace given: " + namespace);}dojox.flash.comm.remove(key, namespace);},removeMultiple: function(/*array*/ keys, /*string?*/ namespace){ /*Object*/if(this.isValidKeyArray(keys) === false){dojo.raise("Invalid key array given: " + keys);}if(namespace == null || typeof namespace == "undefined"){namespace = dojox.storage.DEFAULT_NAMESPACE;}if(this.isValidKey(namespace) == false){throw new Error("Invalid namespace given: " + namespace);}var metaKey = keys.join(",");dojox.flash.comm.removeMultiple(metaKey, this.namespace);},isPermanent: function(){return true;},getMaximumSize: function(){return dojox.storage.SIZE_NO_LIMIT;},hasSettingsUI: function(){return true;},showSettingsUI: function(){dojox.flash.comm.showSettings();dojox.flash.obj.setVisible(true);dojox.flash.obj.center();},hideSettingsUI: function(){// hide the dialogdojox.flash.obj.setVisible(false);// call anyone who wants to know the dialog is// now hiddenif(dojo.isFunction(dojox.storage.onHideSettingsUI)){dojox.storage.onHideSettingsUI.call(null);}},getResourceList: function(){ /* Array[] */var swfloc6 = dojo.moduleUrl("dojox", "storage/Storage_version6.swf").toString();var swfloc8 = dojo.moduleUrl("dojox", "storage/Storage_version8.swf").toString();var results = dojox.flash.info.getResourceList(swfloc6, swfloc8);results.push(dojo.moduleUrl("dojox", "storage/storage_dialog.swf").toString());return results;},/** Called when the Flash is finished loading. */_flashLoaded: function(){// get available namespacesthis._allNamespaces = this.getNamespaces();this._initialized = true;// indicate that this storage provider is now loadeddojox.storage.manager.loaded();},// Called if the storage system needs to tell us about the status// of a put() request._onStatus: function(statusResult, key){var ds = dojox.storage;var dfo = dojox.flash.obj;if(statusResult == ds.PENDING){dfo.center();dfo.setVisible(true);}else{dfo.setVisible(false);}if(ds._statusHandler){ds._statusHandler.call(null, statusResult, key);}}});dojox.storage.manager.register("dojox.storage.FlashStorageProvider",new dojox.storage.FlashStorageProvider());dojox.storage.manager.initialize(); // is this redundant? GearsStorageProvider does this.}