Subversion Repositories Applications.papyrus

Rev

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.edu 
dojo.declare("dojox.storage.FlashStorageProvider", [ dojox.storage.Provider ], {
                initialized: false,
                
                _available: null,
                _statusHandler: null,
                
                initialize: function(){
                        if(djConfig["disableFlashStorage"] == true){
                                return;
                        }
                        
                        // initialize our Flash
                        var loadedListener = function(){
                                // indicate our Flash subsystem is now loaded
                                dojox.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 flush
                setFlushDelay: 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 !namespace
                        if(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 performance
                        if(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 Flash
                        var 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.map
                        for(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 performance
                        if(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 them
                        results = 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 them
                        results = 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 dialog
                        dojox.flash.obj.setVisible(false);
                        
                        // call anyone who wants to know the dialog is
                        // now hidden
                        if(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 namespaces
                        this._allNamespaces = this.getNamespaces();
                        
                        this._initialized = true;

                        // indicate that this storage provider is now loaded
                        dojox.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.

}