file_system_provider_custom_bindings.js revision 010d83a9304c5a91596085d917d248abff47903a
1// Copyright 2013 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5// Custom binding for the fileSystemProvider API. 6 7var binding = require('binding').Binding.create('fileSystemProvider'); 8var fileSystemProviderInternal = 9 require('binding').Binding.create('fileSystemProviderInternal').generate(); 10var eventBindings = require('event_bindings'); 11var fileSystemNatives = requireNative('file_system_natives'); 12var GetDOMError = fileSystemNatives.GetDOMError; 13 14/** 15 * Annotates a date with its serialized value. 16 * @param {Date} date Input date. 17 * @return {Date} Date with an extra <code>value</code> attribute. 18 */ 19function annotateDate(date) { 20 // Copy in case the input date is frozen. 21 var result = new Date(date.getTime()); 22 result.value = result.toString(); 23 return result; 24} 25 26/** 27 * Annotates an entry metadata by serializing its modifiedTime value. 28 * @param {EntryMetadata} metadata Input metadata. 29 * @return {EntryMetadata} metadata Annotated metadata, which can be passed 30 * back to the C++ layer. 31 */ 32function annotateMetadata(metadata) { 33 var result = { 34 isDirectory: metadata.isDirectory, 35 name: metadata.name, 36 size: metadata.size, 37 modificationTime: annotateDate(metadata.modificationTime) 38 }; 39 return result; 40} 41 42binding.registerCustomHook(function(bindingsAPI) { 43 var apiFunctions = bindingsAPI.apiFunctions; 44 45 apiFunctions.setUpdateArgumentsPostValidate( 46 'mount', 47 function(displayName, successCallback, errorCallback) { 48 // Piggyback the error callback onto the success callback, 49 // so we can use the error callback later. 50 successCallback.errorCallback_ = errorCallback; 51 return [displayName, successCallback]; 52 }); 53 54 apiFunctions.setCustomCallback( 55 'mount', 56 function(name, request, response) { 57 var fileSystemId = null; 58 var domError = null; 59 if (request.callback && response) { 60 fileSystemId = response[0]; 61 // DOMError is present only if mount() failed. 62 if (response[1]) { 63 // Convert a Dictionary to a DOMError. 64 domError = GetDOMError(response[1].name, response[1].message); 65 response.length = 1; 66 } 67 68 var successCallback = request.callback; 69 var errorCallback = request.callback.errorCallback_; 70 delete request.callback; 71 72 if (domError) 73 errorCallback(domError); 74 else 75 successCallback(fileSystemId); 76 } 77 }); 78 79 apiFunctions.setUpdateArgumentsPostValidate( 80 'unmount', 81 function(fileSystemId, successCallback, errorCallback) { 82 // Piggyback the error callback onto the success callback, 83 // so we can use the error callback later. 84 successCallback.errorCallback_ = errorCallback; 85 return [fileSystemId, successCallback]; 86 }); 87 88 apiFunctions.setCustomCallback( 89 'unmount', 90 function(name, request, response) { 91 var domError = null; 92 if (request.callback) { 93 // DOMError is present only if mount() failed. 94 if (response && response[0]) { 95 // Convert a Dictionary to a DOMError. 96 domError = GetDOMError(response[0].name, response[0].message); 97 response.length = 1; 98 } 99 100 var successCallback = request.callback; 101 var errorCallback = request.callback.errorCallback_; 102 delete request.callback; 103 104 if (domError) 105 errorCallback(domError); 106 else 107 successCallback(); 108 } 109 }); 110}); 111 112eventBindings.registerArgumentMassager( 113 'fileSystemProvider.onUnmountRequested', 114 function(args, dispatch) { 115 var fileSystemId = args[0]; 116 var requestId = args[1]; 117 var onSuccessCallback = function() { 118 fileSystemProviderInternal.unmountRequestedSuccess( 119 fileSystemId, requestId); 120 }; 121 var onErrorCallback = function(error) { 122 fileSystemProviderInternal.unmountRequestedError( 123 fileSystemId, requestId, error); 124 } 125 dispatch([fileSystemId, onSuccessCallback, onErrorCallback]); 126 }); 127 128eventBindings.registerArgumentMassager( 129 'fileSystemProvider.onGetMetadataRequested', 130 function(args, dispatch) { 131 var fileSystemId = args[0]; 132 var requestId = args[1]; 133 var entryPath = args[2]; 134 var onSuccessCallback = function(metadata) { 135 fileSystemProviderInternal.getMetadataRequestedSuccess( 136 fileSystemId, requestId, annotateMetadata(metadata)); 137 }; 138 var onErrorCallback = function(error) { 139 fileSystemProviderInternal.getMetadataRequestedError( 140 fileSystemId, requestId, error); 141 } 142 dispatch([fileSystemId, entryPath, onSuccessCallback, onErrorCallback]); 143 }); 144 145eventBindings.registerArgumentMassager( 146 'fileSystemProvider.onReadDirectoryRequested', 147 function(args, dispatch) { 148 var fileSystemId = args[0]; 149 var requestId = args[1]; 150 var directoryPath = args[2]; 151 var onSuccessCallback = function(entries, hasNext) { 152 var annotatedEntries = entries.map(annotateMetadata); 153 fileSystemProviderInternal.readDirectoryRequestedSuccess( 154 fileSystemId, requestId, annotatedEntries, hasNext); 155 }; 156 var onErrorCallback = function(error) { 157 fileSystemProviderInternal.readDirectoryRequestedError( 158 fileSystemId, requestId, error); 159 } 160 dispatch([ 161 fileSystemId, directoryPath, onSuccessCallback, onErrorCallback]); 162 }); 163 164exports.binding = binding.generate(); 165