Home | History | Annotate | Download | only in extensions
      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 
      7 var binding = require('binding').Binding.create('syncFileSystem');
      8 
      9 var eventBindings = require('event_bindings');
     10 var fileSystemNatives = requireNative('file_system_natives');
     11 var syncFileSystemNatives = requireNative('sync_file_system');
     12 
     13 binding.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 
     88 eventBindings.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 
    109 exports.binding = binding.generate();
    110