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