1// Copyright 2014 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "chrome/browser/chromeos/file_system_provider/operations/write_file.h"
6
7#include "base/debug/trace_event.h"
8#include "base/values.h"
9#include "chrome/common/extensions/api/file_system_provider.h"
10#include "chrome/common/extensions/api/file_system_provider_internal.h"
11
12namespace chromeos {
13namespace file_system_provider {
14namespace operations {
15
16WriteFile::WriteFile(extensions::EventRouter* event_router,
17                     const ProvidedFileSystemInfo& file_system_info,
18                     int file_handle,
19                     scoped_refptr<net::IOBuffer> buffer,
20                     int64 offset,
21                     int length,
22                     const storage::AsyncFileUtil::StatusCallback& callback)
23    : Operation(event_router, file_system_info),
24      file_handle_(file_handle),
25      buffer_(buffer),
26      offset_(offset),
27      length_(length),
28      callback_(callback) {
29}
30
31WriteFile::~WriteFile() {
32}
33
34bool WriteFile::Execute(int request_id) {
35  TRACE_EVENT0("file_system_provider", "WriteFile::Execute");
36  using extensions::api::file_system_provider::WriteFileRequestedOptions;
37
38  if (!file_system_info_.writable())
39    return false;
40
41  WriteFileRequestedOptions options;
42  options.file_system_id = file_system_info_.file_system_id();
43  options.request_id = request_id;
44  options.open_request_id = file_handle_;
45  options.offset = offset_;
46  // Length is not passed directly since it can be accessed via data.byteLength.
47
48  // Set the data directly on base::Value() to avoid an extra string copy.
49  DCHECK(buffer_.get());
50  scoped_ptr<base::DictionaryValue> options_as_value = options.ToValue();
51  options_as_value->Set(
52      "data",
53      base::BinaryValue::CreateWithCopiedBuffer(buffer_->data(), length_));
54
55  scoped_ptr<base::ListValue> event_args(new base::ListValue);
56  event_args->Append(options_as_value.release());
57
58  return SendEvent(
59      request_id,
60      extensions::api::file_system_provider::OnWriteFileRequested::kEventName,
61      event_args.Pass());
62}
63
64void WriteFile::OnSuccess(int /* request_id */,
65                          scoped_ptr<RequestValue> /* result */,
66                          bool /* has_more */) {
67  TRACE_EVENT0("file_system_provider", "WriteFile::OnSuccess");
68  callback_.Run(base::File::FILE_OK);
69}
70
71void WriteFile::OnError(int /* request_id */,
72                        scoped_ptr<RequestValue> /* result */,
73                        base::File::Error error) {
74  TRACE_EVENT0("file_system_provider", "WriteFile::OnError");
75  callback_.Run(error);
76}
77
78}  // namespace operations
79}  // namespace file_system_provider
80}  // namespace chromeos
81