Subversion Repositories Applications.papyrus

Rev

Rev 1372 | Blame | Last modification | View Log | RSS feed

/*
        Copyright (c) 2004-2006, The Dojo Foundation
        All Rights Reserved.

        Licensed under the Academic Free License version 2.1 or above OR the
        modified BSD license. For more information on Dojo licensing, see:

                http://dojotoolkit.org/community/licensing.shtml
*/



dojo.provide("dojo.storage.browser");
dojo.require("dojo.storage");
dojo.require("dojo.flash");
dojo.require("dojo.json");
dojo.require("dojo.uri.*");
dojo.storage.browser.FileStorageProvider = function () {
};
dojo.inherits(dojo.storage.browser.FileStorageProvider, dojo.storage);
dojo.storage.browser.FileStorageProvider._KEY_INDEX_FILENAME = "__dojoAllKeys";
dojo.storage.browser.FileStorageProvider._APPLET_ID = "__dojoFileJavaObj";
dojo.lang.extend(dojo.storage.browser.FileStorageProvider, {namespace:"default", initialized:false, _available:null, _statusHandler:null, _keyIndex:new Array(), initialize:function () {
        if (djConfig["disableFileStorage"] == true) {
                return;
        }
        this._loadKeyIndex();
        this.initialized = true;
        dojo.storage.manager.loaded();
}, isAvailable:function () {
        this._available = false;
        var protocol = window.location.protocol;
        if (protocol.indexOf("file") != -1 || protocol.indexOf("chrome") != -1) {
                this._available = this._isAvailableXPCOM();
                if (this._available == false) {
                        this._available = this._isAvailableActiveX();
                }
        }
        return this._available;
}, put:function (key, value, resultsHandler) {
        if (this.isValidKey(key) == false) {
                dojo.raise("Invalid key given: " + key);
        }
        this._statusHandler = resultsHandler;
        try {
                this._save(key, value);
                resultsHandler.call(null, dojo.storage.SUCCESS, key);
        }
        catch (e) {
                this._statusHandler.call(null, dojo.storage.FAILED, key, e.toString());
        }
}, get:function (key) {
        if (this.isValidKey(key) == false) {
                dojo.raise("Invalid key given: " + key);
        }
        var results = this._load(key);
        return results;
}, getKeys:function () {
        return this._keyIndex;
}, hasKey:function (key) {
        if (this.isValidKey(key) == false) {
                dojo.raise("Invalid key given: " + key);
        }
        this._loadKeyIndex();
        var exists = false;
        for (var i = 0; i < this._keyIndex.length; i++) {
                if (this._keyIndex[i] == key) {
                        exists = true;
                }
        }
        return exists;
}, clear:function () {
        this._loadKeyIndex();
        var keyIndex = new Array();
        for (var i = 0; i < this._keyIndex.length; i++) {
                keyIndex[keyIndex.length] = new String(this._keyIndex[i]);
        }
        for (var i = 0; i < keyIndex.length; i++) {
                this.remove(keyIndex[i]);
        }
}, remove:function (key) {
        if (this.isValidKey(key) == false) {
                dojo.raise("Invalid key given: " + key);
        }
        this._loadKeyIndex();
        for (var i = 0; i < this._keyIndex.length; i++) {
                if (this._keyIndex[i] == key) {
                        this._keyIndex.splice(i, 1);
                        break;
                }
        }
        this._save(dojo.storage.browser.FileStorageProvider._KEY_INDEX_FILENAME, this._keyIndex, false);
        var fullPath = this._getPagePath() + key + ".txt";
        if (this._isAvailableXPCOM()) {
                this._removeXPCOM(fullPath);
        } else {
                if (this._isAvailableActiveX()) {
                        this._removeActiveX(fullPath);
                }
        }
}, isPermanent:function () {
        return true;
}, getMaximumSize:function () {
        return dojo.storage.SIZE_NO_LIMIT;
}, hasSettingsUI:function () {
        return false;
}, showSettingsUI:function () {
        dojo.raise(this.getType() + " does not support a storage settings user-interface");
}, hideSettingsUI:function () {
        dojo.raise(this.getType() + " does not support a storage settings user-interface");
}, getType:function () {
        return "dojo.storage.browser.FileStorageProvider";
}, _save:function (key, value, updateKeyIndex) {
        if (typeof updateKeyIndex == "undefined") {
                updateKeyIndex = true;
        }
        if (dojo.lang.isString(value) == false) {
                value = dojo.json.serialize(value);
                value = "/* JavaScript */\n" + value + "\n\n";
        }
        var fullPath = this._getPagePath() + key + ".txt";
        if (this._isAvailableXPCOM()) {
                this._saveFileXPCOM(fullPath, value);
        } else {
                if (this._isAvailableActiveX()) {
                        this._saveFileActiveX(fullPath, value);
                }
        }
        if (updateKeyIndex) {
                this._updateKeyIndex(key);
        }
}, _load:function (key) {
        var fullPath = this._getPagePath() + key + ".txt";
        var results = null;
        if (this._isAvailableXPCOM()) {
                results = this._loadFileXPCOM(fullPath);
        } else {
                if (this._isAvailableActiveX()) {
                        results = this._loadFileActiveX(fullPath);
                } else {
                        if (this._isAvailableJava()) {
                                results = this._loadFileJava(fullPath);
                        }
                }
        }
        if (results == null) {
                return null;
        }
        if (!dojo.lang.isUndefined(results) && results != null && /^\/\* JavaScript \*\//.test(results)) {
                results = dojo.json.evalJson(results);
        }
        return results;
}, _updateKeyIndex:function (key) {
        this._loadKeyIndex();
        var alreadyAdded = false;
        for (var i = 0; i < this._keyIndex.length; i++) {
                if (this._keyIndex[i] == key) {
                        alreadyAdded = true;
                        break;
                }
        }
        if (alreadyAdded == false) {
                this._keyIndex[this._keyIndex.length] = key;
        }
        this._save(dojo.storage.browser.FileStorageProvider._KEY_INDEX_FILENAME, this._keyIndex, false);
}, _loadKeyIndex:function () {
        var indexContents = this._load(dojo.storage.browser.FileStorageProvider._KEY_INDEX_FILENAME);
        if (indexContents == null) {
                this._keyIndex = new Array();
        } else {
                this._keyIndex = indexContents;
        }
}, _saveFileXPCOM:function (filename, value) {
        try {
                netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
                var f = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile);
                f.initWithPath(filename);
                var ouputStream = Components.classes["@mozilla.org/network/file-output-stream;1"].createInstance(Components.interfaces.nsIFileOutputStream);
                ouputStream.init(f, 32 | 4 | 8, 256 + 128, null);
                ouputStream.write(value, value.length);
                ouputStream.close();
        }
        catch (e) {
                var msg = e.toString();
                if (e.name && e.message) {
                        msg = e.name + ": " + e.message;
                }
                dojo.raise("dojo.storage.browser.FileStorageProvider._saveFileXPCOM(): " + msg);
        }
}, _loadFileXPCOM:function (filename) {
        try {
                netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
                var f = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile);
                f.initWithPath(filename);
                if (f.exists() == false) {
                        return null;
                }
                var inp = Components.classes["@mozilla.org/network/file-input-stream;1"].createInstance(Components.interfaces.nsIFileInputStream);
                inp.init(f, 1, 4, null);
                var inputStream = Components.classes["@mozilla.org/scriptableinputstream;1"].createInstance(Components.interfaces.nsIScriptableInputStream);
                inputStream.init(inp);
                var results = inputStream.read(inputStream.available());
                return results;
        }
        catch (e) {
                var msg = e.toString();
                if (e.name && e.message) {
                        msg = e.name + ": " + e.message;
                }
                dojo.raise("dojo.storage.browser.FileStorageProvider._loadFileXPCOM(): " + msg);
        }
        return null;
}, _saveFileActiveX:function (filename, value) {
        try {
                var fileSystem = new ActiveXObject("Scripting.FileSystemObject");
                var f = fileSystem.OpenTextFile(filename, 2, true);
                f.Write(value);
                f.Close();
        }
        catch (e) {
                var msg = e.toString();
                if (e.name && e.message) {
                        msg = e.name + ": " + e.message;
                }
                dojo.raise("dojo.storage.browser.FileStorageProvider._saveFileActiveX(): " + msg);
        }
}, _loadFileActiveX:function (filename) {
        try {
                var fileSystem = new ActiveXObject("Scripting.FileSystemObject");
                if (fileSystem.FileExists(filename) == false) {
                        return null;
                }
                var f = fileSystem.OpenTextFile(filename, 1);
                var results = f.ReadAll();
                f.Close();
                return results;
        }
        catch (e) {
                var msg = e.toString();
                if (e.name && e.message) {
                        msg = e.name + ": " + e.message;
                }
                dojo.raise("dojo.storage.browser.FileStorageProvider._loadFileActiveX(): " + msg);
        }
}, _saveFileJava:function (filename, value) {
        try {
                var applet = dojo.byId(dojo.storage.browser.FileStorageProvider._APPLET_ID);
                applet.save(filename, value);
        }
        catch (e) {
                var msg = e.toString();
                if (e.name && e.message) {
                        msg = e.name + ": " + e.message;
                }
                dojo.raise("dojo.storage.browser.FileStorageProvider._saveFileJava(): " + msg);
        }
}, _loadFileJava:function (filename) {
        try {
                var applet = dojo.byId(dojo.storage.browser.FileStorageProvider._APPLET_ID);
                var results = applet.load(filename);
                return results;
        }
        catch (e) {
                var msg = e.toString();
                if (e.name && e.message) {
                        msg = e.name + ": " + e.message;
                }
                dojo.raise("dojo.storage.browser.FileStorageProvider._loadFileJava(): " + msg);
        }
}, _isAvailableActiveX:function () {
        try {
                if (window.ActiveXObject) {
                        var fileSystem = new window.ActiveXObject("Scripting.FileSystemObject");
                        return true;
                }
        }
        catch (e) {
                dojo.debug(e);
        }
        return false;
}, _isAvailableXPCOM:function () {
        try {
                if (window.Components) {
                        netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
                        Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile);
                        return true;
                }
        }
        catch (e) {
                dojo.debug(e);
        }
        return false;
}, _isAvailableJava:function () {
        try {
                if (dojo.render.html.safari == true || dojo.render.html.opera == true()) {
                        if (navigator.javaEnabled() == true) {
                                return true;
                        }
                }
        }
        catch (e) {
                dojo.debug(e);
        }
        return false;
}, _getPagePath:function () {
        var path = window.location.pathname;
        if (/\.html?$/i.test(path)) {
                path = path.replace(/(?:\/|\\)?[^\.\/\\]*\.html?$/, "");
        }
        if (/^\/?[a-z]+\:/i.test(path)) {
                path = path.replace(/^\/?/, "");
                path = path.replace(/\//g, "\\");
        } else {
                if (/^[\/\\]{2,3}[^\/]/.test(path)) {
                        path = path.replace(/^[\/\\]{2,3}/, "");
                        path = path.replace(/\//g, "\\");
                        path = "\\\\" + path;
                }
        }
        if (/\/$/.test(path) == false && /\\$/.test(path) == false) {
                if (/\//.test(path)) {
                        path += "/";
                } else {
                        path += "\\";
                }
        }
        path = unescape(path);
        return path;
}, _removeXPCOM:function (filename) {
        try {
                netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
                var f = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile);
                f.initWithPath(filename);
                if (f.exists() == false || f.isDirectory()) {
                        return;
                }
                if (f.isFile()) {
                        f.remove(false);
                }
        }
        catch (e) {
                dojo.raise("dojo.storage.browser.FileStorageProvider.remove(): " + e.toString());
        }
}, _removeActiveX:function (filename) {
        try {
                var fileSystem = new ActiveXObject("Scripting.FileSystemObject");
                fileSystem.DeleteFile(filename);
        }
        catch (e) {
                dojo.raise("dojo.storage.browser.FileStorageProvider.remove(): " + e.toString());
        }
}, _removeJava:function (filename) {
        try {
                var applet = dojo.byId(dojo.storage.browser.FileStorageProvider._APPLET_ID);
                applet.remove(filename);
        }
        catch (e) {
                var msg = e.toString();
                if (e.name && e.message) {
                        msg = e.name + ": " + e.message;
                }
                dojo.raise("dojo.storage.browser.FileStorageProvider._removeJava(): " + msg);
        }
}, _writeApplet:function () {
        var archive = dojo.uri.moduleUri("dojo", "../DojoFileStorageProvider.jar").toString();
        var tag = "<applet " + "id='" + dojo.storage.browser.FileStorageProvider._APPLET_ID + "' " + "style='position: absolute; top: -500px; left: -500px; width: 1px; height: 1px;' " + "code='DojoFileStorageProvider.class' " + "archive='" + archive + "' " + "width='1' " + "height='1' " + ">" + "</applet>";
        document.writeln(tag);
}});
dojo.storage.browser.WhatWGStorageProvider = function () {
};
dojo.inherits(dojo.storage.browser.WhatWGStorageProvider, dojo.storage);
dojo.lang.extend(dojo.storage.browser.WhatWGStorageProvider, {namespace:"default", initialized:false, _domain:null, _available:null, _statusHandler:null, initialize:function () {
        if (djConfig["disableWhatWGStorage"] == true) {
                return;
        }
        this._domain = location.hostname;
        this.initialized = true;
        dojo.storage.manager.loaded();
}, isAvailable:function () {
        try {
                var myStorage = globalStorage[location.hostname];
        }
        catch (e) {
                this._available = false;
                return this._available;
        }
        this._available = true;
        return this._available;
}, put:function (key, value, resultsHandler) {
        if (this.isValidKey(key) == false) {
                dojo.raise("Invalid key given: " + key);
        }
        this._statusHandler = resultsHandler;
        if (dojo.lang.isString(value)) {
                value = "string:" + value;
        } else {
                value = dojo.json.serialize(value);
        }
        window.addEventListener("storage", function (evt) {
                resultsHandler.call(null, dojo.storage.SUCCESS, key);
        }, false);
        try {
                var myStorage = globalStorage[this._domain];
                myStorage.setItem(key, value);
        }
        catch (e) {
                this._statusHandler.call(null, dojo.storage.FAILED, key, e.toString());
        }
}, get:function (key) {
        if (this.isValidKey(key) == false) {
                dojo.raise("Invalid key given: " + key);
        }
        var myStorage = globalStorage[this._domain];
        var results = myStorage.getItem(key);
        if (results == null) {
                return null;
        }
        results = results.value;
        if (!dojo.lang.isUndefined(results) && results != null && /^string:/.test(results)) {
                results = results.substring("string:".length);
        } else {
                results = dojo.json.evalJson(results);
        }
        return results;
}, getKeys:function () {
        var myStorage = globalStorage[this._domain];
        var keysArray = new Array();
        for (i = 0; i < myStorage.length; i++) {
                keysArray[i] = myStorage.key(i);
        }
        return keysArray;
}, clear:function () {
        var myStorage = globalStorage[this._domain];
        var keys = new Array();
        for (var i = 0; i < myStorage.length; i++) {
                keys[keys.length] = myStorage.key(i);
        }
        for (var i = 0; i < keys.length; i++) {
                myStorage.removeItem(keys[i]);
        }
}, remove:function (key) {
        var myStorage = globalStorage[this._domain];
        myStorage.removeItem(key);
}, isPermanent:function () {
        return true;
}, getMaximumSize:function () {
        return dojo.storage.SIZE_NO_LIMIT;
}, hasSettingsUI:function () {
        return false;
}, showSettingsUI:function () {
        dojo.raise(this.getType() + " does not support a storage settings user-interface");
}, hideSettingsUI:function () {
        dojo.raise(this.getType() + " does not support a storage settings user-interface");
}, getType:function () {
        return "dojo.storage.browser.WhatWGProvider";
}});
dojo.storage.browser.FlashStorageProvider = function () {
};
dojo.inherits(dojo.storage.browser.FlashStorageProvider, dojo.storage);
dojo.lang.extend(dojo.storage.browser.FlashStorageProvider, {namespace:"default", initialized:false, _available:null, _statusHandler:null, initialize:function () {
        if (djConfig["disableFlashStorage"] == true) {
                return;
        }
        var loadedListener = function () {
                dojo.storage._flashLoaded();
        };
        dojo.flash.addLoadedListener(loadedListener);
        var swfloc6 = dojo.uri.moduleUri("dojo", "../Storage_version6.swf").toString();
        var swfloc8 = dojo.uri.moduleUri("dojo", "../Storage_version8.swf").toString();
        dojo.flash.setSwf({flash6:swfloc6, flash8:swfloc8, visible:false});
}, isAvailable:function () {
        if (djConfig["disableFlashStorage"] == true) {
                this._available = false;
        } else {
                this._available = true;
        }
        return this._available;
}, put:function (key, value, resultsHandler) {
        if (this.isValidKey(key) == false) {
                dojo.raise("Invalid key given: " + key);
        }
        this._statusHandler = resultsHandler;
        if (dojo.lang.isString(value)) {
                value = "string:" + value;
        } else {
                value = dojo.json.serialize(value);
        }
        dojo.flash.comm.put(key, value, this.namespace);
}, get:function (key) {
        if (this.isValidKey(key) == false) {
                dojo.raise("Invalid key given: " + key);
        }
        var results = dojo.flash.comm.get(key, this.namespace);
        if (results == "") {
                return null;
        }
        if (!dojo.lang.isUndefined(results) && results != null && /^string:/.test(results)) {
                results = results.substring("string:".length);
        } else {
                results = dojo.json.evalJson(results);
        }
        return results;
}, getKeys:function () {
        var results = dojo.flash.comm.getKeys(this.namespace);
        if (results == "") {
                return [];
        }
        return results.split(",");
}, clear:function () {
        dojo.flash.comm.clear(this.namespace);
}, remove:function (key) {
        dojo.unimplemented("dojo.storage.browser.FlashStorageProvider.remove");
}, isPermanent:function () {
        return true;
}, getMaximumSize:function () {
        return dojo.storage.SIZE_NO_LIMIT;
}, hasSettingsUI:function () {
        return true;
}, showSettingsUI:function () {
        dojo.flash.comm.showSettings();
        dojo.flash.obj.setVisible(true);
        dojo.flash.obj.center();
}, hideSettingsUI:function () {
        dojo.flash.obj.setVisible(false);
        if (dojo.storage.onHideSettingsUI != null && !dojo.lang.isUndefined(dojo.storage.onHideSettingsUI)) {
                dojo.storage.onHideSettingsUI.call(null);
        }
}, getType:function () {
        return "dojo.storage.browser.FlashStorageProvider";
}, _flashLoaded:function () {
        this._initialized = true;
        dojo.storage.manager.loaded();
}, _onStatus:function (statusResult, key) {
        var ds = dojo.storage;
        var dfo = dojo.flash.obj;
        if (statusResult == ds.PENDING) {
                dfo.center();
                dfo.setVisible(true);
        } else {
                dfo.setVisible(false);
        }
        if ((!dj_undef("_statusHandler", ds)) && (ds._statusHandler != null)) {
                ds._statusHandler.call(null, statusResult, key);
        }
}});
dojo.storage.manager.register("dojo.storage.browser.FileStorageProvider", new dojo.storage.browser.FileStorageProvider());
dojo.storage.manager.register("dojo.storage.browser.WhatWGStorageProvider", new dojo.storage.browser.WhatWGStorageProvider());
dojo.storage.manager.register("dojo.storage.browser.FlashStorageProvider", new dojo.storage.browser.FlashStorageProvider());
dojo.storage.manager.initialize();