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