1010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 2010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// found in the LICENSE file. 4010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 5010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "chrome/browser/chromeos/file_system_provider/operations/get_metadata.h" 6010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include <algorithm> 8010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include <string> 9010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 10010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "chrome/common/extensions/api/file_system_provider.h" 11010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "chrome/common/extensions/api/file_system_provider_internal.h" 12010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 13010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)namespace chromeos { 14010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)namespace file_system_provider { 15010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)namespace operations { 16010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)namespace { 17010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 18010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Convert |value| into |output|. If parsing fails, then returns false. 19010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)bool ConvertRequestValueToFileInfo(scoped_ptr<RequestValue> value, 20116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EntryMetadata* output) { 21010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) using extensions::api::file_system_provider::EntryMetadata; 22010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) using extensions::api::file_system_provider_internal:: 23010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GetMetadataRequestedSuccess::Params; 24010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 25010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const Params* params = value->get_metadata_success_params(); 26010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (!params) 27010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return false; 28010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 29116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch output->name = params->metadata.name; 30010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) output->is_directory = params->metadata.is_directory; 31010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) output->size = static_cast<int64>(params->metadata.size); 32116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 33010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) std::string input_modification_time; 34010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (!params->metadata.modification_time.additional_properties.GetString( 35010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) "value", &input_modification_time)) { 36010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return false; 37010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 38cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 39cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Allow to pass invalid modification time, since there is no way to verify 40cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // it easily on any earlier stage. 41cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::Time::FromString(input_modification_time.c_str(), 42116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch &output->modification_time); 43010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (params->metadata.mime_type.get()) 451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci output->mime_type = *params->metadata.mime_type.get(); 461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (params->metadata.thumbnail.get()) { 481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Sanity check for the thumbnail format. Note, that another, more granural 491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // check is done in custom bindings. Note, this is an extra check only for 501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // the security reasons. 511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const std::string expected_prefix = "data:"; 521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci std::string thumbnail_prefix = 531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci params->metadata.thumbnail.get()->substr(0, expected_prefix.size()); 541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci std::transform(thumbnail_prefix.begin(), 551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci thumbnail_prefix.end(), 561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci thumbnail_prefix.begin(), 571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ::tolower); 581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (expected_prefix != thumbnail_prefix) 601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return false; 611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci output->thumbnail = *params->metadata.thumbnail.get(); 631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 65010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return true; 66010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 67010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 68010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} // namespace 69010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 70010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)GetMetadata::GetMetadata( 71010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) extensions::EventRouter* event_router, 72010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const ProvidedFileSystemInfo& file_system_info, 73f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const base::FilePath& entry_path, 741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ProvidedFileSystemInterface::MetadataFieldMask fields, 75116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const ProvidedFileSystemInterface::GetMetadataCallback& callback) 76010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) : Operation(event_router, file_system_info), 77f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) entry_path_(entry_path), 781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci fields_(fields), 79010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) callback_(callback) { 80010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 81010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 82010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)GetMetadata::~GetMetadata() { 83010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 84010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 85010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)bool GetMetadata::Execute(int request_id) { 861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci using extensions::api::file_system_provider::GetMetadataRequestedOptions; 871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci GetMetadataRequestedOptions options; 891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci options.file_system_id = file_system_info_.file_system_id(); 901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci options.request_id = request_id; 911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci options.entry_path = entry_path_.AsUTF8Unsafe(); 921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci options.thumbnail = 931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci fields_ & ProvidedFileSystemInterface::METADATA_FIELD_THUMBNAIL; 941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 95010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return SendEvent( 96010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) request_id, 97010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) extensions::api::file_system_provider::OnGetMetadataRequested::kEventName, 981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci extensions::api::file_system_provider::OnGetMetadataRequested::Create( 991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci options)); 100010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 101010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 102010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void GetMetadata::OnSuccess(int /* request_id */, 103010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) scoped_ptr<RequestValue> result, 10446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) bool has_more) { 1051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<EntryMetadata> metadata(new EntryMetadata); 106010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const bool convert_result = 1071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ConvertRequestValueToFileInfo(result.Pass(), metadata.get()); 108116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 109116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (!convert_result) { 110116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch LOG(ERROR) << "Failed to parse a response for the get metadata operation."; 1111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci callback_.Run(make_scoped_ptr<EntryMetadata>(NULL), 1121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::File::FILE_ERROR_IO); 113116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return; 114116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 115116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci callback_.Run(metadata.Pass(), base::File::FILE_OK); 117010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 118010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 119116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid GetMetadata::OnError(int /* request_id */, 120116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_ptr<RequestValue> /* result */, 121116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::File::Error error) { 1221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci callback_.Run(make_scoped_ptr<EntryMetadata>(NULL), error); 123010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 124010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} // namespace operations 125010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} // namespace file_system_provider 126010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} // namespace chromeos 127