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