Chromium Code Reviews| Index: pdf/file_writer.cc |
| diff --git a/pdf/file_writer.cc b/pdf/file_writer.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..8ed465e9fb2e6ed89e56e1b9e11928f5fa85d017 |
| --- /dev/null |
| +++ b/pdf/file_writer.cc |
| @@ -0,0 +1,87 @@ |
| +// Copyright (c) 2014 The Chromium Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +#include "pdf/file_writer.h" |
| + |
| +#include "ppapi/c/ppb_file_io.h" |
| + |
| +namespace chrome_pdf { |
| + |
| +FileWriter::FileWriter( |
| + const pp::InstanceHandle& instance, |
| + const std::string& filename, |
| + const char* bytes, |
| + size_t length) |
| + : instance_(instance), |
| + filename_(filename), |
| + bytes_(bytes), |
| + length_(length), |
| + succeeded_(false), |
| + offset_(0), |
| + fs_(instance, PP_FILESYSTEMTYPE_ISOLATED), |
| + io_(instance), |
| + callback_factory_(this) { |
| +} |
| + |
| +void FileWriter::GetFile( |
| + pp::CompletionCallbackWithOutput<pp::FileRef> callback) { |
| + if (callback_) { |
| + callback.Run(PP_ERROR_INPROGRESS); |
| + return; |
| + } |
| + if (succeeded_) { |
| + *(callback.output()) = file_ref_.pp_resource(); |
| + callback.Run(PP_OK); |
| + return; |
| + } |
| + |
| + callback_.reset(new pp::CompletionCallbackWithOutput<pp::FileRef>(callback)); |
| + fs_.Open(length_, |
| + callback_factory_.NewCallback(&FileWriter::OnFileSystemOpen)); |
| +} |
| + |
| +void FileWriter::OnFileSystemOpen(int32_t result) { |
| + if (result != PP_OK) { |
| + callback_->Run(result); |
| + callback_.reset(); |
| + return; |
| + } |
| + file_ref_ = pp::FileRef(fs_, filename_.c_str()); |
| + io_.Open(file_ref_, |
| + PP_FILEOPENFLAG_CREATE | PP_FILEOPENFLAG_WRITE, |
| + callback_factory_.NewCallback(&FileWriter::OnWriteComplete)); |
| +} |
| + |
| +void FileWriter::OnWriteComplete(int32_t result) { |
| + if (result != PP_OK) { |
| + callback_->Run(result); |
|
Lei Zhang
2014/06/05 07:23:54
Do you need to call io_.Close() here? Same with th
raymes
2014/06/06 01:57:13
Done.
|
| + callback_.reset(); |
| + return; |
| + } |
| + if (offset_ == length_) { |
| + io_.Flush(callback_factory_.NewCallback(&FileWriter::OnFlushComplete)); |
| + return; |
| + } |
| + offset_ += io_.Write( |
| + offset_, |
| + bytes_, |
| + length_ - offset_, |
| + callback_factory_.NewCallback(&FileWriter::OnWriteComplete)); |
| +} |
| + |
| +void FileWriter::OnFlushComplete(int32_t result) { |
| + if (result != PP_OK) { |
| + callback_->Run(result); |
| + callback_.reset(); |
| + return; |
| + } |
| + |
| + succeeded_ = true; |
| + io_.Close(); |
| + *(callback_->output()) = file_ref_.pp_resource(); |
| + callback_->Run(result); |
| + callback_.reset(); |
| +} |
| + |
| +} // namespace chrome_pdf |