• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1// Copyright (c) 2012 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 syncFileSystem API.
6
7var binding = require('binding').Binding.create('syncFileSystem');
8
9var eventBindings = require('event_bindings');
10var fileSystemNatives = requireNative('file_system_natives');
11var syncFileSystemNatives = requireNative('sync_file_system');
12
13binding.registerCustomHook(function(bindingsAPI) {
14  var apiFunctions = bindingsAPI.apiFunctions;
15
16  // Functions which take in an [instanceOf=FileEntry].
17  function bindFileEntryFunction(functionName) {
18    apiFunctions.setUpdateArgumentsPostValidate(
19        functionName, function(entry, callback) {
20      var fileSystemUrl = entry.toURL();
21      return [fileSystemUrl, callback];
22    });
23  }
24  $Array.forEach(['getFileStatus'], bindFileEntryFunction);
25
26  // Functions which take in a FileEntry array.
27  function bindFileEntryArrayFunction(functionName) {
28    apiFunctions.setUpdateArgumentsPostValidate(
29        functionName, function(entries, callback) {
30      var fileSystemUrlArray = [];
31      for (var i=0; i < entries.length; i++) {
32        $Array.push(fileSystemUrlArray, entries[i].toURL());
33      }
34      return [fileSystemUrlArray, callback];
35    });
36  }
37  $Array.forEach(['getFileStatuses'], bindFileEntryArrayFunction);
38
39  // Functions which take in an [instanceOf=DOMFileSystem].
40  function bindFileSystemFunction(functionName) {
41    apiFunctions.setUpdateArgumentsPostValidate(
42        functionName, function(filesystem, callback) {
43      var fileSystemUrl = filesystem.root.toURL();
44      return [fileSystemUrl, callback];
45    });
46  }
47  $Array.forEach(['getUsageAndQuota'], bindFileSystemFunction);
48
49  // Functions which return an [instanceOf=DOMFileSystem].
50  apiFunctions.setCustomCallback('requestFileSystem',
51                                 function(name, request, response) {
52    var result = null;
53    if (response) {
54      result = syncFileSystemNatives.GetSyncFileSystemObject(
55          response.name, response.root);
56    }
57    if (request.callback)
58      request.callback(result);
59    request.callback = null;
60  });
61
62  // Functions which return an array of FileStatusInfo object
63  // which has [instanceOf=FileEntry].
64  apiFunctions.setCustomCallback('getFileStatuses',
65                                 function(name, request, response) {
66    var results = [];
67    if (response) {
68      for (var i = 0; i < response.length; i++) {
69        var result = {};
70        var entry = response[i].entry;
71        result.fileEntry = fileSystemNatives.GetFileEntry(
72            entry.fileSystemType,
73            entry.fileSystemName,
74            entry.rootUrl,
75            entry.filePath,
76            entry.isDirectory);
77        result.status = response[i].status;
78        result.error = response[i].error;
79        $Array.push(results, result);
80      }
81    }
82    if (request.callback)
83      request.callback(results);
84    request.callback = null;
85  });
86});
87
88eventBindings.registerArgumentMassager(
89    'syncFileSystem.onFileStatusChanged', function(args, dispatch) {
90  // Make FileEntry object using all the base string fields.
91  var fileEntry = fileSystemNatives.GetFileEntry(
92      args[0].fileSystemType,
93      args[0].fileSystemName,
94      args[0].rootUrl,
95      args[0].filePath,
96      args[0].isDirectory);
97
98  // Combine into a single dictionary.
99  var fileInfo = new Object();
100  fileInfo.fileEntry = fileEntry;
101  fileInfo.status = args[1];
102  if (fileInfo.status == "synced") {
103    fileInfo.action = args[2];
104    fileInfo.direction = args[3];
105  }
106  dispatch([fileInfo]);
107});
108
109exports.binding = binding.generate();
110