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