Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1058)

Unified Diff: content/child/web_data_producer_handle_impl.cc

Issue 850043008: [DO NOT REVIEW][DO NOT COMMIT] Implement WebDataProducerHandleImpl. Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: content/child/web_data_producer_handle_impl.cc
diff --git a/content/child/web_data_producer_handle_impl.cc b/content/child/web_data_producer_handle_impl.cc
new file mode 100644
index 0000000000000000000000000000000000000000..411cf5343fc6809440261df4beac16731adb1611
--- /dev/null
+++ b/content/child/web_data_producer_handle_impl.cc
@@ -0,0 +1,113 @@
+// Copyright 2015 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 "content/child/web_data_producer_handle_impl.h"
+
+#include <limits>
+#include "base/bind.h"
+#include "base/logging.h"
+#include "mojo/public/c/system/types.h"
+
+namespace content {
+
+using Result = blink::WebDataProducerHandle::Result;
+
+WebDataProducerHandleImpl::WebDataProducerHandleImpl(Handle handle)
+ : handle_(handle.Pass()), client_(nullptr) {}
+
+WebDataProducerHandleImpl::~WebDataProducerHandleImpl() {}
+
+Result WebDataProducerHandleImpl::write(const void* data,
+ size_t size,
+ Flags flags,
+ size_t* written_size) {
+ // We need this variable definition to avoid a link error.
+ const Flags kNone = FlagNone;
+ DCHECK_EQ(flags, kNone);
+ DCHECK_LE(size, std::numeric_limits<uint32_t>::max());
+
+ *written_size = 0;
+
+ uint32_t size_to_pass = size;
+ MojoReadDataFlags flags_to_pass = MOJO_WRITE_DATA_FLAG_NONE;
+ MojoResult rv =
+ mojo::WriteDataRaw(handle_.get(), data, &size_to_pass, flags_to_pass);
+ if (rv == MOJO_RESULT_OK)
+ *written_size = size_to_pass;
+
+ return HandleWriteResult(rv);
+}
+
+Result WebDataProducerHandleImpl::beginWrite(void** buffer,
+ Flags flags,
+ size_t* available) {
+ // We need this variable definition to avoid a link error.
+ const Flags kNone = FlagNone;
+ DCHECK_EQ(flags, kNone);
+
+ *buffer = nullptr;
+ *available = 0;
+
+ uint32_t size_to_pass = 0;
+ MojoReadDataFlags flags_to_pass = MOJO_WRITE_DATA_FLAG_NONE;
+
+ MojoResult rv = mojo::BeginWriteDataRaw(handle_.get(), buffer,
+ &size_to_pass, flags_to_pass);
+ if (rv == MOJO_RESULT_OK)
+ *available = size_to_pass;
+ return HandleWriteResult(rv);
+}
+
+Result WebDataProducerHandleImpl::endWrite(size_t written_size) {
+ MojoResult rv = mojo::EndWriteDataRaw(handle_.get(), written_size);
+ return
+ rv == MOJO_RESULT_OK ? Ok : UnexpectedError;
+}
+
+void WebDataProducerHandleImpl::registerClient(Client* client) {
+ DCHECK(!client_);
+ DCHECK(client);
+ client_ = client;
+
+ handle_watcher_.Start(
+ handle_.get(),
+ MOJO_HANDLE_SIGNAL_WRITABLE,
+ MOJO_DEADLINE_INDEFINITE,
+ base::Bind(&WebDataProducerHandleImpl::OnHandleGotWritable,
+ base::Unretained(this)));
+}
+
+void WebDataProducerHandleImpl::unregisterClient() {
+ DCHECK(client_);
+ client_ = nullptr;
+ handle_watcher_.Stop();
+}
+
+Result WebDataProducerHandleImpl::HandleWriteResult(MojoResult mojo_result) {
+ switch (mojo_result) {
+ case MOJO_RESULT_OK:
+ return Ok;
+ case MOJO_RESULT_FAILED_PRECONDITION:
+ return AlreadyClosed;
+ case MOJO_RESULT_SHOULD_WAIT:
+ if (client_) {
+ handle_watcher_.Start(
+ handle_.get(),
+ MOJO_HANDLE_SIGNAL_WRITABLE,
+ MOJO_DEADLINE_INDEFINITE,
+ base::Bind(&WebDataProducerHandleImpl::OnHandleGotWritable,
+ base::Unretained(this)));
+ }
+ return ShouldWait;
+ default:
+ return UnexpectedError;
+ }
+}
+
+void WebDataProducerHandleImpl::OnHandleGotWritable(MojoResult) {
+ DCHECK(client_);
+ client_->didGetWritable();
+}
+
+} // namespace content
« no previous file with comments | « content/child/web_data_producer_handle_impl.h ('k') | content/child/web_data_producer_handle_impl_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698