15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Custom binding for the Media Gallery API.
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)var binding = require('binding').Binding.create('mediaGalleries');
8a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)var blobNatives = requireNative('blob_natives');
95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)var mediaGalleriesNatives = requireNative('mediaGalleries');
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1134680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)var blobsAwaitingMetadata = {};
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)var mediaGalleriesMetadata = {};
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)function createFileSystemObjectsAndUpdateMetadata(response) {
15a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  var result = [];
165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  mediaGalleriesMetadata = {};  // Clear any previous metadata.
175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (response) {
185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    for (var i = 0; i < response.length; i++) {
195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      var filesystem = mediaGalleriesNatives.GetMediaFileSystemObject(
205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          response[i].fsid);
215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      $Array.push(result, filesystem);
225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      var metadata = response[i];
235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      delete metadata.fsid;
245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      mediaGalleriesMetadata[filesystem.name] = metadata;
255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return result;
285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)binding.registerCustomHook(function(bindingsAPI, extensionId) {
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var apiFunctions = bindingsAPI.apiFunctions;
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // getMediaFileSystems, addUserSelectedFolder, and addScanResults use a
345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // custom callback so that they can instantiate and return an array of file
355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // system objects.
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  apiFunctions.setCustomCallback('getMediaFileSystems',
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 function(name, request, response) {
385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    var result = createFileSystemObjectsAndUpdateMetadata(response);
395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (request.callback)
405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      request.callback(result);
415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    request.callback = null;
425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  });
435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  apiFunctions.setCustomCallback('addScanResults',
455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                 function(name, request, response) {
465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    var result = createFileSystemObjectsAndUpdateMetadata(response);
475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (request.callback)
485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      request.callback(result);
495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    request.callback = null;
505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  });
515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  apiFunctions.setCustomCallback('addUserSelectedFolder',
535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                 function(name, request, response) {
545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    var fileSystems = [];
555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    var selectedFileSystemName = "";
565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (response && 'mediaFileSystems' in response &&
575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        'selectedFileSystemIndex' in response) {
585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      fileSystems = createFileSystemObjectsAndUpdateMetadata(
595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          response['mediaFileSystems']);
605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      var selectedFileSystemIndex = response['selectedFileSystemIndex'];
615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      if (selectedFileSystemIndex >= 0) {
625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        selectedFileSystemName = fileSystems[selectedFileSystemIndex].name;
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (request.callback)
665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      request.callback(fileSystems, selectedFileSystemName);
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    request.callback = null;
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  });
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
70a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  apiFunctions.setCustomCallback('dropPermissionForMediaFileSystem',
71a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                                 function(name, request, response) {
72a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    var galleryId = response;
73a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
74a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    if (galleryId) {
75a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      for (var key in mediaGalleriesMetadata) {
76a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch        if (mediaGalleriesMetadata[key].galleryId == galleryId) {
77a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch          delete mediaGalleriesMetadata[key];
78a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch          break;
79a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch        }
80a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      }
81a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    }
82a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    if (request.callback)
83a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      request.callback();
84a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    request.callback = null;
85a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  });
86a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  apiFunctions.setHandleRequest('getMediaFileSystemMetadata',
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                function(filesystem) {
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (filesystem && filesystem.name &&
90a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch        filesystem.name in mediaGalleriesMetadata) {
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return mediaGalleriesMetadata[filesystem.name];
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
93a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    return {
94a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      'name': '',
95a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      'galleryId': '',
96a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      'isRemovable': false,
97a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      'isMediaDevice': false,
98a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      'isAvailable': false,
99a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    };
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  });
101a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
102a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  apiFunctions.setUpdateArgumentsPostValidate('getMetadata',
103a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      function(mediaFile, options, callback) {
104a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    var blobUuid = blobNatives.GetBlobUuid(mediaFile)
10534680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)    // Store the blob in a global object to keep its refcount nonzero -- this
10634680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)    // prevents the object from being garbage collected before any metadata
10734680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)    // parsing gets to occur (see crbug.com/415792).
10834680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)    blobsAwaitingMetadata[blobUuid] = mediaFile;
109a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    return [blobUuid, options, callback];
110a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  });
11146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
11246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  apiFunctions.setCustomCallback('getMetadata',
11346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                                 function(name, request, response) {
11446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    if (response.attachedImagesBlobInfo) {
11546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      for (var i = 0; i < response.attachedImagesBlobInfo.length; i++) {
11646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        var blobInfo = response.attachedImagesBlobInfo[i];
11746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        var blob = blobNatives.TakeBrowserProcessBlob(
11846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)            blobInfo.blobUUID, blobInfo.type, blobInfo.size);
11946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        response.metadata.attachedImages.push(blob);
12046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      }
12146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    }
12246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
12346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    if (request.callback)
12446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      request.callback(response.metadata);
12546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    request.callback = null;
12634680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)
12734680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)    // The UUID was in position 0 in the setUpdateArgumentsPostValidate
12834680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)    // function.
12934680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)    var uuid = request.args[0];
13034680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)    delete blobsAwaitingMetadata[uuid];
13146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  });
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)});
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)exports.binding = binding.generate();
135