| /* |
| 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(); |
| |