diff options
Diffstat (limited to 'data/extensions/jid1-KtlZuoiikVfFew@jetpack/node_modules/pathfinder/lib/storage.js')
-rw-r--r-- | data/extensions/jid1-KtlZuoiikVfFew@jetpack/node_modules/pathfinder/lib/storage.js | 126 |
1 files changed, 126 insertions, 0 deletions
diff --git a/data/extensions/jid1-KtlZuoiikVfFew@jetpack/node_modules/pathfinder/lib/storage.js b/data/extensions/jid1-KtlZuoiikVfFew@jetpack/node_modules/pathfinder/lib/storage.js new file mode 100644 index 0000000..3ed13d0 --- /dev/null +++ b/data/extensions/jid1-KtlZuoiikVfFew@jetpack/node_modules/pathfinder/lib/storage.js @@ -0,0 +1,126 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +'use strict'; + +const { Cc, Ci, Cu, components } = require('chrome'); +const { id } = require('sdk/self'); +const unload = require('sdk/system/unload'); +const { defer } = require('sdk/core/promise'); + +const { Instances } = require('./chrome/instances'); +const { Services } = require('./chrome/services'); +const { NetUtil } = require('./chrome/net-utils'); + +const { FileUtils } = Cu.import('resource://gre/modules/FileUtils.jsm', {}); + +const JETPACK_DIR_BASENAME = "jetpack"; + +let saving = false; + +function getStorageFile() { + const file = Services.dirsvc.get('ProfD', Ci.nsIFile); + file.append(JETPACK_DIR_BASENAME); + file.append(id); + file.append('pathfinder'); + file.append('storage'); + + if (!file.exists()) + file.create(Ci.nsIFile.DIRECTORY_TYPE, parseInt('0755', 8)); + + file.append('storage.blob'); + return file; +} + +function get(options) { + options = options || {}; + let charset = options.charset || 'UTF-8'; + + const { promise, resolve } = defer(); + const file = getStorageFile(); + const channel = NetUtil.newChannel(file); + + if (!file.exists()) { + resolve({ data: '' }); + } + else { + NetUtil.asyncFetch(channel, function(iStream, aResult) { + if (!components.isSuccessCode(aResult)) { + reject(); + } + else { + let text = NetUtil.readInputStreamToString(iStream, iStream.available()); + + let conv = Instances.suc; + conv.charset = charset; + + text = conv.ConvertToUnicode(text); + + resolve({ + data: text, + charset: charset + }); + } + }); + } + + return promise; +} +exports.get = get; + +function set({ data, charset }) { + charset = charset || 'UTF-8'; + data = data || ''; + const { promise, resolve, reject } = defer(); + const file = getStorageFile(); + + if (data == '') { + if (file.exists()) { + file.remove(false); + } + + resolve({ + data: '', + charset: charset + }); + } + else { + const converter = Instances.suc; + converter.charset = "UTF-8"; + + if (isSaving()) { + throw Error('Storage is currently in the process of saving..'); + } + saving = true; + + let iStream = converter.convertToInputStream(data); + let oStream = FileUtils.openSafeFileOutputStream(file); + + NetUtil.asyncCopy( + iStream, + oStream, + function(aResult) { + FileUtils.closeSafeFileOutputStream(oStream); + saving = false; + + if (!components.isSuccessCode(aResult)) { + reject(); + } + else { + resolve({ + data: data, + charset: charset + }); + } + } + ); + } + + return promise; +} +exports.set = set; + +function isSaving() { + return saving; +} +exports.isSaving = isSaving; |