/* * * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. * */ /* * resolveLocalFileSystemURI * * IN * args * 0 - escaped local filesystem URI * 1 - options (standard HTML5 file system options) * 2 - size * OUT * success - Entry object * - isDirectory * - isFile * - name * - fullPath * - nativeURL * - fileSystemName * fail - FileError code */ var info = require('cordova-plugin-file.bb10FileSystemInfo'), requestAnimationFrame = cordova.require('cordova-plugin-file.bb10RequestAnimationFrame'), createEntryFromNative = require('cordova-plugin-file.bb10CreateEntryFromNative'), SANDBOXED = true, UNSANDBOXED = false; module.exports = function (success, fail, args) { var request = args[0], options = args[1], size = args[2]; if (request) { request = decodeURIComponent(request); if (request.indexOf('?') > -1) { //bb10 does not support params; strip them off request = request.substring(0, request.indexOf('?')); } if (request.indexOf('file://localhost/') === 0) { //remove localhost prefix request = request.replace('file://localhost/', 'file:///'); } //requests to sandboxed locations should use cdvfile request = request.replace(info.persistentPath, 'cdvfile://localhost/persistent'); request = request.replace(info.temporaryPath, 'cdvfile://localhost/temporary'); //pick appropriate handler if (request.indexOf('file:///') === 0) { resolveFile(success, fail, request, options); } else if (request.indexOf('cdvfile://localhost/') === 0) { resolveCdvFile(success, fail, request, options, size); } else if (request.indexOf('local:///') === 0) { resolveLocal(success, fail, request, options); } else { fail(FileError.ENCODING_ERR); } } else { fail(FileError.NOT_FOUND_ERR); } }; //resolve file:/// function resolveFile(success, fail, request, options) { var path = request.substring(7); resolve(success, fail, path, window.PERSISTENT, UNSANDBOXED, options); } //resolve cdvfile://localhost/filesystemname/ function resolveCdvFile(success, fail, request, options, size) { var components = /cdvfile:\/\/localhost\/([^\/]+)\/(.*)/.exec(request), fsType = components[1], path = components[2]; if (fsType === 'persistent') { resolve(success, fail, path, window.PERSISTENT, SANDBOXED, options, size); } else if (fsType === 'temporary') { resolve(success, fail, path, window.TEMPORARY, SANDBOXED, options, size); } else if (fsType === 'root') { resolve(success, fail, path, window.PERSISTENT, UNSANDBOXED, options); } else { fail(FileError.NOT_FOUND_ERR); } } //resolve local:/// function resolveLocal(success, fail, request, options) { var path = localPath + request.substring(8); resolve(success, fail, path, window.PERSISTENT, UNSANDBOXED, options); } //validate parameters and set sandbox function resolve(success, fail, path, fsType, sandbox, options, size) { options = options || { create: false }; size = size || info.MAX_SIZE; if (size > info.MAX_SIZE) { //bb10 does not respect quota; fail at unreasonably large size fail(FileError.QUOTA_EXCEEDED_ERR); } else if (path.indexOf(':') > -1) { //files with : character are not valid in Cordova apps fail(FileError.ENCODING_ERR); } else { requestAnimationFrame(function () { cordova.exec(function () { requestAnimationFrame(function () { resolveNative(success, fail, path, fsType, options, size); }); }, fail, 'File', 'setSandbox', [sandbox], false); }); } } //find path using webkit file system function resolveNative(success, fail, path, fsType, options, size) { window.webkitRequestFileSystem( fsType, size, function (fs) { if (path === '') { //no path provided, call success with root file system success(createEntryFromNative(fs.root)); } else { //otherwise attempt to resolve as file fs.root.getFile( path, options, function (entry) { success(createEntryFromNative(entry)); }, function (fileError) { //file not found, attempt to resolve as directory fs.root.getDirectory( path, options, function (entry) { success(createEntryFromNative(entry)); }, function (dirError) { //path cannot be resolved if (fileError.code === FileError.INVALID_MODIFICATION_ERR && options.exclusive) { //mobile-spec expects this error code fail(FileError.PATH_EXISTS_ERR); } else { fail(FileError.NOT_FOUND_ERR); } } ); } ); } } ); }