From cf7ce0747118309908f471ad694256508712c554 Mon Sep 17 00:00:00 2001 From: Pawel Andruszkiewicz Date: Tue, 21 Apr 2015 17:06:32 +0200 Subject: [PATCH] [Filesystem] Refactoring of commonFS. Internal implementation hidden, just needed methods are exposed. Change-Id: I6a92b01c210f98c9496a98d5709697cdf3793bdb --- src/filesystem/js/common.js | 332 ++++++++++++++++++------------- src/filesystem/js/file_system_manager.js | 36 +--- 2 files changed, 197 insertions(+), 171 deletions(-) diff --git a/src/filesystem/js/common.js b/src/filesystem/js/common.js index 1daead2..f92ec25 100644 --- a/src/filesystem/js/common.js +++ b/src/filesystem/js/common.js @@ -32,175 +32,221 @@ var FileMode = { a: 'a' }; -function CommonFS() { - Object.defineProperties(this, { - PRIVILEGE_FILESYSTEM_READ: { - value: 'http://tizen.org/privilege/filesystem.read', - writable: false, - enumerable: true - }, - PRIVILEGE_FILESYSTEM_WRITE: { - value: 'http://tizen.org/privilege/filesystem.write', - writable: false, - enumerable: true - } - }); - - this.cacheVirtualToReal = {}; - this.cacheStorages = []; -} - -CommonFS.prototype.getFileInfo = function(aStatObj, secondIter, aMode) { - var _result = {}, - _pathTokens, - _fileParentPath = '', - i; - var aPath = this.toVirtualPath(aStatObj.path); - - _result.readOnly = aStatObj.readOnly; - _result.isFile = aStatObj.isFile; - _result.isDirectory = aStatObj.isDirectory; - _result.created = new Date(aStatObj.ctime * 1000); - _result.modified = new Date(aStatObj.mtime * 1000); - _result.fullPath = aPath; - _result.fileSize = aStatObj.size; - _result.mode = aMode; - if (_result.isDirectory) { - try { - _result.length = aStatObj.nlink; - } catch (err) { - _result.length = 0; - } - } else { - _result.length = undefined; +var commonFS_ = (function() { + var cacheReady = false; + var listenerRegistered = false; + var cacheVirtualToReal = {}; + var cacheStorages = []; + var uriPrefix = 'file://'; + + function clearCache() { + cacheVirtualToReal = {}; + cacheStorages = []; + cacheReady = false; } - _pathTokens = aPath.split('/'); - if (_pathTokens.length > 1) { - for (i = 0; i < _pathTokens.length - 1; ++i) { - _fileParentPath += _pathTokens[i] + '/'; - } - _result.path = _fileParentPath; - _result.name = _pathTokens[_pathTokens.length - 1]; - _result.parent = (secondIter) ? null : _fileParentPath; - } else { - _result.parent = null; - _result.path = aPath; - _result.name = ''; - } - return _result; -}; + function initCache() { + if (cacheReady) { + return; + } -CommonFS.prototype.isLocationAllowed = function(aPath) { - if (!aPath) { - return false; - } - if (aPath.indexOf(this.cacheVirtualToReal.ringtones.path) === 0) { - return false; - } - if (aPath.indexOf(this.cacheVirtualToReal['wgt-package'].path) === 0) { - return false; - } + var result = native_.callSync('Filesystem_fetchVirtualRoots', {}); + if (native_.isFailure(result)) { + throw native_.getErrorObject(result); + } + var virtualRoots = native_.getResultObject(result); + + for (var i = 0; i < virtualRoots.length; ++i) { + cacheVirtualToReal[virtualRoots[i].name] = { + path: virtualRoots[i].path, + type: FileSystemStorageType.INTERNAL, + state: FileSystemStorageState.MOUNTED + }; + } - return true; -}; + var result = native_.callSync('FileSystemManager_fetchStorages', {}); + if (native_.isFailure(result)) { + throw native_.getErrorObject(result); + } -CommonFS.prototype.f_isSubDir = function(fullPathToCheck, fullPath) { - return (-1 !== fullPathToCheck.indexOf(this.toRealPath(fullPath))); -}; + var storages = native_.getResultObject(result); + for (var i = 0; i < storages.length; ++i) { + cacheStorages.push({ + label: storages[i].name, + type: storages[i].type, + state: storages[i].state, + storage_id: storages[i].storage_id + }); + } -CommonFS.prototype.f_isCorrectRelativePath = function(relativePath) { - return ((-1 === relativePath.indexOf('/')) && - (-1 === relativePath.indexOf('\\')) && - (-1 === relativePath.indexOf('?')) && - (-1 === relativePath.indexOf('*')) && - (-1 === relativePath.indexOf(':')) && - (-1 === relativePath.indexOf('"')) && - (-1 === relativePath.indexOf('<')) && - (-1 === relativePath.indexOf('>'))); -}; + if (!listenerRegistered) { + try { + tizen.filesystem.addStorageStateChangeListener(function() { + clearCache(); + }); + listenerRegistered = true; + } catch (e) { + console.log('Failed to register storage change listener, ' + + 'storage information may be corrupted: ' + e.message); + } + } + + cacheReady = true; + } -CommonFS.prototype.toRealPath = function(aPath) { - var _fileRealPath = '', - _uriPrefix = 'file://', - i; - if (aPath.indexOf(_uriPrefix) === 0) { - _fileRealPath = aPath.substr(_uriPrefix.length); - } else if (aPath[0] !== '/') { - //virtual path - var _pathTokens = aPath.split('/'); - if (this.cacheVirtualToReal[_pathTokens[0]] && ( - this.cacheVirtualToReal[_pathTokens[0]].state === undefined || - this.cacheVirtualToReal[_pathTokens[0]].state === FileSystemStorageState.MOUNTED)) { - _fileRealPath = this.cacheVirtualToReal[_pathTokens[0]].path; - for (i = 1; i < _pathTokens.length; ++i) { - _fileRealPath += '/' + _pathTokens[i]; + function toRealPath(aPath) { + var _fileRealPath = ''; + + if (aPath.indexOf(uriPrefix) === 0) { + _fileRealPath = aPath.substr(uriPrefix.length); + } else if (aPath[0] !== '/') { + //virtual path + initCache(); + + var _pathTokens = aPath.split('/'); + + if (cacheVirtualToReal[_pathTokens[0]] && ( + cacheVirtualToReal[_pathTokens[0]].state === undefined || + cacheVirtualToReal[_pathTokens[0]].state === FileSystemStorageState.MOUNTED)) { + _fileRealPath = cacheVirtualToReal[_pathTokens[0]].path; + for (var i = 1; i < _pathTokens.length; ++i) { + _fileRealPath += '/' + _pathTokens[i]; + } + } else { + //If path token is not present in cache then it is invalid + _fileRealPath = undefined; } } else { - //If path token is not present in cache then it is invalid - _fileRealPath = undefined; + _fileRealPath = aPath; } - } else { - _fileRealPath = aPath; + + return _fileRealPath; } - return _fileRealPath; -}; + function toVirtualPath(aPath) { + var _virtualPath = aPath; + if (_virtualPath.indexOf(uriPrefix) === 0) { + _virtualPath = _virtualPath.substr(uriPrefix.length); + } -CommonFS.prototype.toVirtualPath = function(aPath) { - var _virtualPath = aPath; - if (_virtualPath.indexOf('file://') === 0) { - _virtualPath = _virtualPath.substr('file://'.length); - } + initCache(); - for (var virtual_root in this.cacheVirtualToReal) { - var real_root_path = this.cacheVirtualToReal[virtual_root].path; - if (aPath.indexOf(real_root_path, 0) === 0) { - return aPath.replace(real_root_path, virtual_root); + for (var virtual_root in cacheVirtualToReal) { + var real_root_path = cacheVirtualToReal[virtual_root].path; + if (aPath.indexOf(real_root_path, 0) === 0) { + return aPath.replace(real_root_path, virtual_root); + } } + + return aPath; } - return aPath; -}; + function getFileInfo(aStatObj, secondIter, aMode) { + var _result = {}, + _pathTokens, + _fileParentPath = '', + i; + var aPath = toVirtualPath(aStatObj.path); + + _result.readOnly = aStatObj.readOnly; + _result.isFile = aStatObj.isFile; + _result.isDirectory = aStatObj.isDirectory; + _result.created = new Date(aStatObj.ctime * 1000); + _result.modified = new Date(aStatObj.mtime * 1000); + _result.fullPath = aPath; + _result.fileSize = aStatObj.size; + _result.mode = aMode; + if (_result.isDirectory) { + try { + _result.length = aStatObj.nlink; + } catch (err) { + _result.length = 0; + } + } else { + _result.length = undefined; + } -CommonFS.prototype.initCache = function() { - if (this.cacheStorages.length > 0) { - return; + _pathTokens = aPath.split('/'); + if (_pathTokens.length > 1) { + for (i = 0; i < _pathTokens.length - 1; ++i) { + _fileParentPath += _pathTokens[i] + '/'; + } + _result.path = _fileParentPath; + _result.name = _pathTokens[_pathTokens.length - 1]; + _result.parent = (secondIter) ? null : _fileParentPath; + } else { + _result.parent = null; + _result.path = aPath; + _result.name = ''; + } + return _result; } - var result = native_.callSync('Filesystem_fetchVirtualRoots', {}); - if (native_.isFailure(result)) { - throw native_.getErrorObject(result); + function isLocationAllowed(aPath) { + if (!aPath) { + return false; + } + initCache(); + if (aPath.indexOf(cacheVirtualToReal.ringtones.path) === 0) { + return false; + } + if (aPath.indexOf(cacheVirtualToReal['wgt-package'].path) === 0) { + return false; + } + + return true; } - var virtualRoots = native_.getResultObject(result); - for (var i = 0; i < virtualRoots.length; ++i) { - this.cacheVirtualToReal[virtualRoots[i].name] = { - path: virtualRoots[i].path, - type: FileSystemStorageType.INTERNAL, - state: FileSystemStorageState.MOUNTED + function f_isSubDir(fullPathToCheck, fullPath) { + return (-1 !== fullPathToCheck.indexOf(toRealPath(fullPath))); + }; + + function f_isCorrectRelativePath(relativePath) { + return ((-1 === relativePath.indexOf('/')) && + (-1 === relativePath.indexOf('\\')) && + (-1 === relativePath.indexOf('?')) && + (-1 === relativePath.indexOf('*')) && + (-1 === relativePath.indexOf(':')) && + (-1 === relativePath.indexOf('"')) && + (-1 === relativePath.indexOf('<')) && + (-1 === relativePath.indexOf('>'))); + }; + + function cloneStorage(storage) { + return { + label: storage.label, + type: storage.type, + state: storage.state }; } - var result = native_.callSync('FileSystemManager_fetchStorages', {}); - if (native_.isFailure(result)) { - throw native_.getErrorObject(result); + function getStorage(label) { + initCache(); + for (var i = 0; i < cacheStorages.length; ++i) { + if (cacheStorages[i].label === label) { + return cloneStorage(cacheStorages[i]); + } + } + return null; } - var storages = native_.getResultObject(result); - for (var i = 0; i < storages.length; ++i) { - this.cacheStorages.push({ - label: storages[i].name, - type: storages[i].type, - state: storages[i].state, - storage_id: storages[i].storage_id - }); + function getAllStorages() { + var ret = []; + initCache(); + for (var i = 0; i < cacheStorages.length; ++i) { + ret.push(cloneStorage(cacheStorages[i])); + } + return ret; } -}; - -CommonFS.prototype.clearCache = function() { - this.cacheVirtualToReal = {}; - this.cacheStorages = []; -}; -var commonFS_ = new CommonFS(); + return { + toRealPath: toRealPath, + toVirtualPath: toVirtualPath, + getFileInfo: getFileInfo, + isLocationAllowed: isLocationAllowed, + f_isSubDir: f_isSubDir, + f_isCorrectRelativePath: f_isCorrectRelativePath, + getStorage: getStorage, + getAllStorages: getAllStorages + }; +})(); diff --git a/src/filesystem/js/file_system_manager.js b/src/filesystem/js/file_system_manager.js index 95654b0..765e87c 100644 --- a/src/filesystem/js/file_system_manager.js +++ b/src/filesystem/js/file_system_manager.js @@ -34,7 +34,6 @@ FileSystemManager.prototype.resolve = function(location, onsuccess, onerror, mod if (!args.has.mode) { args.mode = 'rw'; } - commonFS_.initCache(); if (args.location[0] === '/') { setTimeout(function() { @@ -87,21 +86,14 @@ FileSystemManager.prototype.getStorage = function(label, onsuccess, onerror) { {name: 'onerror', type: types_.FUNCTION, optional: true, nullable: true} ]); - commonFS_.initCache(); - - var storage, i; setTimeout(function() { - for (i = 0; i < commonFS_.cacheStorages.length; i++) { - if (commonFS_.cacheStorages[i].label === args.label) { - storage = new FileSystemStorage(commonFS_.cacheStorages[i]); - } - } + var storage = commonFS_.getStorage(args.label); - if (storage === undefined) { + if (!storage) { native_.callIfPossible(args.onerror, new WebAPIException(WebAPIException.NOT_FOUND_ERR, 'Storage not found.')); } else { - native_.callIfPossible(args.onsuccess, storage); + native_.callIfPossible(args.onsuccess, new FileSystemStorage(storage)); } }, 0); }; @@ -114,12 +106,11 @@ FileSystemManager.prototype.listStorages = function(onsuccess, onerror) { {name: 'onerror', type: types_.FUNCTION, optional: true, nullable: true} ]); - commonFS_.initCache(); - - var storages = [], i; setTimeout(function() { - for (i = 0; i < commonFS_.cacheStorages.length; i++) { - storages.push(new FileSystemStorage(commonFS_.cacheStorages[i])); + var storages = []; + var cache = commonFS_.getAllStorages(); + for (var i = 0; i < cache.length; ++i) { + storages.push(new FileSystemStorage(cache[i])); } native_.callIfPossible(args.onsuccess, storages); @@ -148,8 +139,6 @@ FileSystemManager.prototype.addStorageStateChangeListener = function(onsuccess, {name: 'onerror', type: types_.FUNCTION, optional: true, nullable: true} ]); - commonFS_.initCache(); - var register = false; if (type_.isEmptyObject(callbacks)) { register = true; @@ -195,13 +184,4 @@ FileSystemManager.prototype.removeStorageStateChangeListener = function(watchId) } }; -var filesystem = new FileSystemManager(); - -function onStorageStateChanged() { - commonFS_.clearCache(); - commonFS_.initCache(); -} - -filesystem.addStorageStateChangeListener(onStorageStateChanged); - -exports = filesystem; +exports = new FileSystemManager(); -- 2.7.4