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/read_directory.h" 6010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 7010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include <string> 8010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 9010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "base/memory/linked_ptr.h" 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 |input| into |output|. If parsing fails, then returns false. 19010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)bool ConvertRequestValueToEntryList(scoped_ptr<RequestValue> value, 2003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) storage::AsyncFileUtil::EntryList* output) { 21010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) using extensions::api::file_system_provider::EntryMetadata; 22010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) using extensions::api::file_system_provider_internal:: 23010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ReadDirectoryRequestedSuccess::Params; 24010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 25010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const Params* params = value->read_directory_success_params(); 26010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (!params) 27010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return false; 28010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 29010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) for (size_t i = 0; i < params->entries.size(); ++i) { 30010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const linked_ptr<EntryMetadata> entry_metadata = params->entries[i]; 31010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 3203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) storage::DirectoryEntry output_entry; 33010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) output_entry.is_directory = entry_metadata->is_directory; 34010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) output_entry.name = entry_metadata->name; 35010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) output_entry.size = static_cast<int64>(entry_metadata->size); 36010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 37010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) std::string input_modification_time; 38010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (!entry_metadata->modification_time.additional_properties.GetString( 39010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) "value", &input_modification_time)) { 40010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return false; 41010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 42010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (!base::Time::FromString(input_modification_time.c_str(), 43010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) &output_entry.last_modified_time)) { 44010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return false; 45010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 46010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 47010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) output->push_back(output_entry); 48010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 49010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 50010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return true; 51010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 52010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 53010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} // namespace 54010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 55010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)ReadDirectory::ReadDirectory( 56010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) extensions::EventRouter* event_router, 57010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const ProvidedFileSystemInfo& file_system_info, 58010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const base::FilePath& directory_path, 5903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) const storage::AsyncFileUtil::ReadDirectoryCallback& callback) 60010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) : Operation(event_router, file_system_info), 61010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) directory_path_(directory_path), 62010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) callback_(callback) { 63010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 64010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 65010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)ReadDirectory::~ReadDirectory() { 66010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 67010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 68010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)bool ReadDirectory::Execute(int request_id) { 691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci using extensions::api::file_system_provider::ReadDirectoryRequestedOptions; 701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ReadDirectoryRequestedOptions options; 721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci options.file_system_id = file_system_info_.file_system_id(); 731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci options.request_id = request_id; 741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci options.directory_path = directory_path_.AsUTF8Unsafe(); 751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return SendEvent( 771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci request_id, 781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci extensions::api::file_system_provider::OnReadDirectoryRequested:: 791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci kEventName, 801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci extensions::api::file_system_provider::OnReadDirectoryRequested::Create( 811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci options)); 82010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 83010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 84010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void ReadDirectory::OnSuccess(int /* request_id */, 85010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) scoped_ptr<RequestValue> result, 8646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) bool has_more) { 8703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) storage::AsyncFileUtil::EntryList entry_list; 88010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const bool convert_result = 89010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ConvertRequestValueToEntryList(result.Pass(), &entry_list); 90116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 91116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (!convert_result) { 92116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch LOG(ERROR) 93116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch << "Failed to parse a response for the read directory operation."; 94116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch callback_.Run(base::File::FILE_ERROR_IO, 9503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) storage::AsyncFileUtil::EntryList(), 96116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch false /* has_more */); 97116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return; 98116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 99116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 10046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) callback_.Run(base::File::FILE_OK, entry_list, has_more); 101010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 102010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 103116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid ReadDirectory::OnError(int /* request_id */, 104116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_ptr<RequestValue> /* result */, 105116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::File::Error error) { 106010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) callback_.Run( 10703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) error, storage::AsyncFileUtil::EntryList(), false /* has_more */); 108010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 109010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 110010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} // namespace operations 111010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} // namespace file_system_provider 112010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} // namespace chromeos 113