/dojo-release-1.6.1-src/dojo-release-1.6.1-src/dojox/storage/AirEncryptedLocalStorageProvider.js

https://github.com/johnjbarton/JavaScriptLibraries · JavaScript · 217 lines · 175 code · 34 blank · 8 comment · 47 complexity · 248d106fdd6cad8d62d2d9b352dfef54 MD5 · raw file

  1. dojo.provide("dojox.storage.AirEncryptedLocalStorageProvider");
  2. dojo.require("dojox.storage.manager");
  3. dojo.require("dojox.storage.Provider");
  4. if (dojo.isAIR) {
  5. (function(){
  6. if (!air) {
  7. var air = {};
  8. }
  9. air.ByteArray = window.runtime.flash.utils.ByteArray;
  10. air.EncryptedLocalStore = window.runtime.flash.data.EncryptedLocalStore,
  11. // summary:
  12. // Storage provider that uses features in the Adobe AIR runtime to achieve
  13. // permanent storage
  14. dojo.declare("dojox.storage.AirEncryptedLocalStorageProvider", [ dojox.storage.Provider ], {
  15. initialize: function(){
  16. // indicate that this storage provider is now loaded
  17. dojox.storage.manager.loaded();
  18. },
  19. isAvailable: function(){
  20. return true;
  21. },
  22. _getItem: function(key){
  23. var storedValue = air.EncryptedLocalStore.getItem("__dojo_" + key);
  24. return storedValue ? storedValue.readUTFBytes(storedValue.length) : "";
  25. },
  26. _setItem: function(key, value){
  27. var bytes = new air.ByteArray();
  28. bytes.writeUTFBytes(value);
  29. air.EncryptedLocalStore.setItem("__dojo_" + key, bytes);
  30. },
  31. _removeItem: function(key){
  32. air.EncryptedLocalStore.removeItem("__dojo_" + key);
  33. },
  34. put: function(key, value, resultsHandler, namespace){
  35. if(this.isValidKey(key) == false){
  36. throw new Error("Invalid key given: " + key);
  37. }
  38. namespace = namespace||this.DEFAULT_NAMESPACE;
  39. if(this.isValidKey(namespace) == false){
  40. throw new Error("Invalid namespace given: " + namespace);
  41. }
  42. // try to store the value
  43. try{
  44. var namespaces = this._getItem("namespaces")||'|';
  45. if(namespaces.indexOf('|'+namespace+'|')==-1){
  46. this._setItem("namespaces", namespaces + namespace + '|');
  47. }
  48. var keys = this._getItem(namespace + "_keys")||'|';
  49. if(keys.indexOf('|'+key+'|')==-1){
  50. this._setItem(namespace + "_keys", keys + key + '|');
  51. }
  52. this._setItem('_' + namespace + '_' + key, value);
  53. }catch(e){
  54. // indicate we failed
  55. console.debug("dojox.storage.AirEncryptedLocalStorageProvider.put:", e);
  56. resultsHandler(this.FAILED, key, e.toString(), namespace);
  57. return;
  58. }
  59. if(resultsHandler){
  60. resultsHandler(this.SUCCESS, key, null, namespace);
  61. }
  62. },
  63. get: function(key, namespace){
  64. if(this.isValidKey(key) == false){
  65. throw new Error("Invalid key given: " + key);
  66. }
  67. namespace = namespace||this.DEFAULT_NAMESPACE;
  68. return this._getItem('_' + namespace + '_' + key);
  69. },
  70. getNamespaces: function(){
  71. var results = [ this.DEFAULT_NAMESPACE ];
  72. var namespaces = (this._getItem("namespaces")||'|').split('|');
  73. for (var i=0;i<namespaces.length;i++){
  74. if(namespaces[i].length && namespaces[i] != this.DEFAULT_NAMESPACE){
  75. results.push(namespaces[i]);
  76. }
  77. }
  78. return results;
  79. },
  80. getKeys: function(namespace){
  81. namespace = namespace||this.DEFAULT_NAMESPACE;
  82. if(this.isValidKey(namespace) == false){
  83. throw new Error("Invalid namespace given: " + namespace);
  84. }
  85. var results = [];
  86. var keys = (this._getItem(namespace + "_keys")||'|').split('|');
  87. for (var i=0;i<keys.length;i++){
  88. if (keys[i].length){
  89. results.push(keys[i]);
  90. }
  91. }
  92. return results;
  93. },
  94. clear: function(namespace){
  95. if(this.isValidKey(namespace) == false){
  96. throw new Error("Invalid namespace given: " + namespace);
  97. }
  98. var namespaces = this._getItem("namespaces")||'|';
  99. if(namespaces.indexOf('|'+namespace+'|')!=-1){
  100. this._setItem("namespaces", namespaces.replace('|' + namespace + '|', '|'));
  101. }
  102. var keys = (this._getItem(namespace + "_keys")||'|').split('|');
  103. for (var i=0;i<keys.length;i++){
  104. if (keys[i].length){
  105. this._removeItem(namespace + "_" + keys[i]);
  106. }
  107. }
  108. this._removeItem(namespace + "_keys");
  109. },
  110. remove: function(key, namespace){
  111. namespace = namespace||this.DEFAULT_NAMESPACE;
  112. var keys = this._getItem(namespace + "_keys")||'|';
  113. if(keys.indexOf('|'+key+'|')!=-1){
  114. this._setItem(namespace + "_keys", keys.replace('|' + key + '|', '|'));
  115. }
  116. this._removeItem('_' + namespace + '_' + key);
  117. },
  118. putMultiple: function(keys, values, resultsHandler, namespace) {
  119. if(this.isValidKeyArray(keys) === false
  120. || ! values instanceof Array
  121. || keys.length != values.length){
  122. throw new Error("Invalid arguments: keys = [" + keys + "], values = [" + values + "]");
  123. }
  124. if(namespace == null || typeof namespace == "undefined"){
  125. namespace = this.DEFAULT_NAMESPACE;
  126. }
  127. if(this.isValidKey(namespace) == false){
  128. throw new Error("Invalid namespace given: " + namespace);
  129. }
  130. this._statusHandler = resultsHandler;
  131. // try to store the value
  132. try{
  133. for(var i=0;i<keys.length;i++) {
  134. this.put(keys[i], values[i], null, namespace);
  135. }
  136. }catch(e){
  137. // indicate we failed
  138. console.debug("dojox.storage.AirEncryptedLocalStorageProvider.putMultiple:", e);
  139. if(resultsHandler){
  140. resultsHandler(this.FAILED, keys, e.toString(), namespace);
  141. }
  142. return;
  143. }
  144. if(resultsHandler){
  145. resultsHandler(this.SUCCESS, keys, null);
  146. }
  147. },
  148. getMultiple: function(keys, namespace){
  149. if(this.isValidKeyArray(keys) === false){
  150. throw new Error("Invalid key array given: " + keys);
  151. }
  152. if(namespace == null || typeof namespace == "undefined"){
  153. namespace = this.DEFAULT_NAMESPACE;
  154. }
  155. if(this.isValidKey(namespace) == false){
  156. throw new Error("Invalid namespace given: " + namespace);
  157. }
  158. var results = [];
  159. for(var i=0;i<keys.length;i++){
  160. results[i] = this.get(keys[i], namespace);
  161. }
  162. return results;
  163. },
  164. removeMultiple: function(keys, namespace){
  165. namespace = namespace||this.DEFAULT_NAMESPACE;
  166. for(var i=0;i<keys.length;i++){
  167. this.remove(keys[i], namespace);
  168. }
  169. },
  170. isPermanent: function(){ return true; },
  171. getMaximumSize: function(){ return this.SIZE_NO_LIMIT; },
  172. hasSettingsUI: function(){ return false; },
  173. showSettingsUI: function(){
  174. throw new Error(this.declaredClass + " does not support a storage settings user-interface");
  175. },
  176. hideSettingsUI: function(){
  177. throw new Error(this.declaredClass + " does not support a storage settings user-interface");
  178. }
  179. });
  180. dojox.storage.manager.register("dojox.storage.AirEncryptedLocalStorageProvider", new dojox.storage.AirEncryptedLocalStorageProvider());
  181. dojox.storage.manager.initialize();
  182. })();
  183. }