blob: 8c08f428e0df6636a3b40c802757ae65e3122dd4 [file] [log] [blame]
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
'use strict';
// Fake data similar to a file system structure.
var MODIFICATION_DATE = new Date();
var SHORT_CONTENTS = 'Just another example.';
var LONGER_CONTENTS = 'It works!\nEverything gets displayed correctly.';
var METADATA = {
'/': {isDirectory: true, name: '', size: 0,
modificationTime: MODIFICATION_DATE},
'/file1.txt': {isDirectory: false, name: 'file1.txt',
size: LONGER_CONTENTS.length, modificationTime: MODIFICATION_DATE,
contents: LONGER_CONTENTS},
'/file2': {isDirectory: false, name: 'file2', size: 150,
modificationTime: MODIFICATION_DATE},
'/dir': {isDirectory: true, name: 'dir', size: 0,
modificationTime: MODIFICATION_DATE},
'/dir/file3.txt': {isDirectory: false, name: 'file3.txt',
size: SHORT_CONTENTS.length, modificationTime: MODIFICATION_DATE,
contents: SHORT_CONTENTS}};
// A map with currently opened files. As key it has requestId of
// openFileRequested and as a value the file path.
var openedFiles = {};
function onGetMetadataRequested(options, onSuccess, onError) {
if (!METADATA[options.entryPath])
onError('NOT_FOUND');
else
onSuccess(METADATA[options.entryPath]);
}
function onReadDirectoryRequested(options, onSuccess, onError) {
if (!METADATA[options.directoryPath]) {
onError('NOT_FOUND');
return;
}
if (!METADATA[options.directoryPath].isDirectory) {
onError('NOT_A_DIRECTORY');
return;
}
// Retrieve directory contents from METADATA.
var entries = [];
for (var entry in METADATA) {
// Do not add itself on the list.
if (entry == options.directoryPath)
continue;
// Check if the entry is a child of the requested directory.
if (entry.indexOf(options.directoryPath) != 0)
continue;
// Restrict to direct children only.
if (entry.substring(options.directoryPath.length + 1).indexOf('/') != -1)
continue;
entries.push(METADATA[entry]);
}
onSuccess(entries, false /* Last call. */);
}
function onOpenFileRequested(options, onSuccess, onError) {
if (options.mode != 'READ' || options.create) {
onError('INVALID_OPERATION');
} else {
openedFiles[options.requestId] = options.filePath;
onSuccess();
}
}
function onCloseFileRequested(options, onSuccess, onError) {
if (!openedFiles[options.openRequestId]) {
onError('INVALID_OPERATION');
} else {
delete openedFiles[options.openRequestId];
onSuccess();
}
}
function onReadFileRequested(options, onSuccess, onError) {
if (!openedFiles[options.openRequestId]) {
onError('INVALID_OPERATION');
return;
}
var contents =
METADATA[openedFiles[options.openRequestId]].contents;
var remaining = Math.max(0, contents.length - options.offset);
var length = Math.min(remaining, options.length);
// Write the contents as ASCII text.
var buffer = new ArrayBuffer(length);
var bufferView = new Uint8Array(buffer);
for (var i = 0; i < length; i++) {
bufferView[i] = contents.charCodeAt(i + options.offset);
}
onSuccess(buffer, false /* Last call. */);
}
function onMountRequested(onSuccess, onError) {
chrome.fileSystemProvider.mount(
{fileSystemId: 'sample-file-system', displayName: 'Sample File System'},
function() {
if (chrome.runtime.lastError) {
onError(chrome.runtime.lastError.message);
console.error('Failed to mount because of: ' +
chrome.runtime.lastError.message);
return;
}
onSuccess();
});
}
function onUnmountRequested(options, onSuccess, onError) {
chrome.fileSystemProvider.unmount(
{fileSystemId: options.fileSystemId},
function() {
if (chrome.runtime.lastError) {
onError(chrome.runtime.lastError.message);
console.error('Failed to unmount because of: ' +
chrome.runtime.lastError.message);
return;
}
onSuccess();
});
}
chrome.fileSystemProvider.onGetMetadataRequested.addListener(
onGetMetadataRequested);
chrome.fileSystemProvider.onReadDirectoryRequested.addListener(
onReadDirectoryRequested);
chrome.fileSystemProvider.onOpenFileRequested.addListener(onOpenFileRequested);
chrome.fileSystemProvider.onCloseFileRequested.addListener(
onCloseFileRequested);
chrome.fileSystemProvider.onReadFileRequested.addListener(onReadFileRequested);
chrome.fileSystemProvider.onMountRequested.addListener(onMountRequested);
chrome.fileSystemProvider.onUnmountRequested.addListener(onUnmountRequested);