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 fileManagerPrivate API.
6
7// Bindings
8var binding = require('binding').Binding.create('fileManagerPrivate');
9var eventBindings = require('event_bindings');
10
11// Natives
12var fileManagerPrivateNatives = requireNative('file_manager_private');
13var fileBrowserHandlerNatives = requireNative('file_browser_handler');
14
15// Internals
16var fileManagerPrivateInternal =
17    require('binding').Binding.create('fileManagerPrivateInternal').generate();
18
19// Shorthands
20var GetFileSystem = fileManagerPrivateNatives.GetFileSystem;
21var GetExternalFileEntry = fileBrowserHandlerNatives.GetExternalFileEntry;
22
23binding.registerCustomHook(function(bindingsAPI) {
24  var apiFunctions = bindingsAPI.apiFunctions;
25
26  apiFunctions.setCustomCallback('requestFileSystem',
27                                 function(name, request, response) {
28    var fs = null;
29    if (response && !response.error)
30      fs = GetFileSystem(response.name, response.root_url);
31    if (request.callback)
32      request.callback(fs);
33    request.callback = null;
34  });
35
36  apiFunctions.setCustomCallback('searchDrive',
37                                 function(name, request, response) {
38    if (response && !response.error && response.entries) {
39      response.entries = response.entries.map(function(entry) {
40        return GetExternalFileEntry(entry);
41      });
42    }
43
44    // So |request.callback| doesn't break if response is not defined.
45    if (!response)
46      response = {};
47
48    if (request.callback)
49      request.callback(response.entries, response.nextFeed);
50    request.callback = null;
51  });
52
53  apiFunctions.setCustomCallback('searchDriveMetadata',
54                                 function(name, request, response) {
55    if (response && !response.error) {
56      for (var i = 0; i < response.length; i++) {
57        response[i].entry =
58            GetExternalFileEntry(response[i].entry);
59      }
60    }
61
62    // So |request.callback| doesn't break if response is not defined.
63    if (!response)
64      response = {};
65
66    if (request.callback)
67      request.callback(response);
68    request.callback = null;
69  });
70
71  apiFunctions.setHandleRequest('resolveIsolatedEntries',
72                                function(entries, callback) {
73    var urls = entries.map(function(entry) {
74      return fileBrowserHandlerNatives.GetEntryURL(entry);
75    });
76    fileManagerPrivateInternal.resolveIsolatedEntries(urls, function(
77        entryDescriptions) {
78      callback(entryDescriptions.map(function(description) {
79        return GetExternalFileEntry(description);
80      }));
81    });
82  });
83});
84
85eventBindings.registerArgumentMassager(
86    'fileManagerPrivate.onDirectoryChanged', function(args, dispatch) {
87  // Convert the entry arguments into a real Entry object.
88  args[0].entry = GetExternalFileEntry(args[0].entry);
89  dispatch(args);
90});
91
92exports.binding = binding.generate();
93