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

Side by Side Diff: content/child/web_data_consumer_handle_impl.cc

Issue 1164493008: Implement WebDataConsumerHandle::Reader. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 6 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 unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/child/web_data_consumer_handle_impl.h" 5 #include "content/child/web_data_consumer_handle_impl.h"
6 6
7 #include <limits> 7 #include <limits>
8 #include "base/bind.h" 8 #include "base/bind.h"
9 #include "base/logging.h" 9 #include "base/logging.h"
10 #include "third_party/mojo/src/mojo/public/c/system/types.h" 10 #include "third_party/mojo/src/mojo/public/c/system/types.h"
11 11
12 namespace content { 12 namespace content {
13 13
14 typedef blink::WebDataConsumerHandle::Result Result; 14 using Result = blink::WebDataConsumerHandle::Result;
15 15
16 WebDataConsumerHandleImpl::WebDataConsumerHandleImpl(Handle handle) 16 class WebDataConsumerHandleImpl::Context
17 : handle_(handle.Pass()), client_(nullptr) {} 17 : public base::RefCountedThreadSafe<Context> {
18 public:
19 explicit Context(Handle handle) : handle_(handle.Pass()) {}
18 20
19 WebDataConsumerHandleImpl::~WebDataConsumerHandleImpl() {} 21 const Handle& handle() { return handle_; }
20 22
21 Result WebDataConsumerHandleImpl::read( 23 private:
22 void* data, 24 friend class base::RefCountedThreadSafe<Context>;
23 size_t size, 25 ~Context() {}
24 Flags flags, 26 Handle handle_;
25 size_t* read_size) { 27
28 DISALLOW_COPY_AND_ASSIGN(Context);
29 };
30
31 WebDataConsumerHandleImpl::ReaderImpl::ReaderImpl(
32 scoped_refptr<Context> context,
33 Client* client)
34 : context_(context), client_(client) {
35 if (client_)
36 StartWatching();
37 }
38
39 WebDataConsumerHandleImpl::ReaderImpl::~ReaderImpl() {
40 }
41
42 Result WebDataConsumerHandleImpl::ReaderImpl::read(void* data,
43 size_t size,
44 Flags flags,
45 size_t* read_size) {
26 // We need this variable definition to avoid a link error. 46 // We need this variable definition to avoid a link error.
27 const Flags kNone = FlagNone; 47 const Flags kNone = FlagNone;
28 DCHECK_EQ(flags, kNone); 48 DCHECK_EQ(flags, kNone);
29 DCHECK_LE(size, std::numeric_limits<uint32_t>::max()); 49 DCHECK_LE(size, std::numeric_limits<uint32_t>::max());
30 50
31 *read_size = 0; 51 *read_size = 0;
32 52
33 uint32_t size_to_pass = size; 53 uint32_t size_to_pass = size;
34 MojoReadDataFlags flags_to_pass = MOJO_READ_DATA_FLAG_NONE; 54 MojoReadDataFlags flags_to_pass = MOJO_READ_DATA_FLAG_NONE;
35 MojoResult rv = 55 MojoResult rv = mojo::ReadDataRaw(context_->handle().get(), data,
36 mojo::ReadDataRaw(handle_.get(), data, &size_to_pass, flags_to_pass); 56 &size_to_pass, flags_to_pass);
37 if (rv == MOJO_RESULT_OK) 57 if (rv == MOJO_RESULT_OK)
38 *read_size = size_to_pass; 58 *read_size = size_to_pass;
39 59
40 return HandleReadResult(rv); 60 return HandleReadResult(rv);
41 } 61 }
42 62
43 Result WebDataConsumerHandleImpl::beginRead( 63 Result WebDataConsumerHandleImpl::ReaderImpl::beginRead(const void** buffer,
44 const void** buffer, Flags flags, size_t* available) { 64 Flags flags,
65 size_t* available) {
45 // We need this variable definition to avoid a link error. 66 // We need this variable definition to avoid a link error.
46 const Flags kNone = FlagNone; 67 const Flags kNone = FlagNone;
47 DCHECK_EQ(flags, kNone); 68 DCHECK_EQ(flags, kNone);
48 69
49 *buffer = nullptr; 70 *buffer = nullptr;
50 *available = 0; 71 *available = 0;
51 72
52 uint32_t size_to_pass = 0; 73 uint32_t size_to_pass = 0;
53 MojoReadDataFlags flags_to_pass = MOJO_READ_DATA_FLAG_NONE; 74 MojoReadDataFlags flags_to_pass = MOJO_READ_DATA_FLAG_NONE;
54 75
55 MojoResult rv = mojo::BeginReadDataRaw(handle_.get(), buffer, 76 MojoResult rv = mojo::BeginReadDataRaw(context_->handle().get(), buffer,
56 &size_to_pass, flags_to_pass); 77 &size_to_pass, flags_to_pass);
57 if (rv == MOJO_RESULT_OK) 78 if (rv == MOJO_RESULT_OK)
58 *available = size_to_pass; 79 *available = size_to_pass;
59 return HandleReadResult(rv); 80 return HandleReadResult(rv);
60 } 81 }
61 82
62 Result WebDataConsumerHandleImpl::endRead(size_t read_size) { 83 Result WebDataConsumerHandleImpl::ReaderImpl::endRead(size_t read_size) {
63 MojoResult rv = mojo::EndReadDataRaw(handle_.get(), read_size); 84 MojoResult rv = mojo::EndReadDataRaw(context_->handle().get(), read_size);
64 return 85 return rv == MOJO_RESULT_OK ? Ok : UnexpectedError;
65 rv == MOJO_RESULT_OK ? Ok : UnexpectedError;
66 } 86 }
67 87
68 void WebDataConsumerHandleImpl::registerClient(Client* client) { 88 Result WebDataConsumerHandleImpl::ReaderImpl::HandleReadResult(
69 DCHECK(!client_); 89 MojoResult mojo_result) {
70 DCHECK(client);
71 client_ = client;
72
73 handle_watcher_.Start(
74 handle_.get(),
75 MOJO_HANDLE_SIGNAL_READABLE,
76 MOJO_DEADLINE_INDEFINITE,
77 base::Bind(&WebDataConsumerHandleImpl::OnHandleGotReadable,
78 base::Unretained(this)));
79 }
80
81 void WebDataConsumerHandleImpl::unregisterClient() {
82 client_ = nullptr;
83 handle_watcher_.Stop();
84 }
85
86 Result WebDataConsumerHandleImpl::HandleReadResult(MojoResult mojo_result) {
87 switch (mojo_result) { 90 switch (mojo_result) {
88 case MOJO_RESULT_OK: 91 case MOJO_RESULT_OK:
89 return Ok; 92 return Ok;
90 case MOJO_RESULT_FAILED_PRECONDITION: 93 case MOJO_RESULT_FAILED_PRECONDITION:
91 return Done; 94 return Done;
92 case MOJO_RESULT_BUSY: 95 case MOJO_RESULT_BUSY:
93 return Busy; 96 return Busy;
94 case MOJO_RESULT_SHOULD_WAIT: 97 case MOJO_RESULT_SHOULD_WAIT:
95 if (client_) { 98 if (client_)
96 handle_watcher_.Start( 99 StartWatching();
97 handle_.get(),
98 MOJO_HANDLE_SIGNAL_READABLE,
99 MOJO_DEADLINE_INDEFINITE,
100 base::Bind(&WebDataConsumerHandleImpl::OnHandleGotReadable,
101 base::Unretained(this)));
102 }
103 return ShouldWait; 100 return ShouldWait;
104 case MOJO_RESULT_RESOURCE_EXHAUSTED: 101 case MOJO_RESULT_RESOURCE_EXHAUSTED:
105 return ResourceExhausted; 102 return ResourceExhausted;
106 default: 103 default:
107 return UnexpectedError; 104 return UnexpectedError;
108 } 105 }
109 } 106 }
110 107
111 void WebDataConsumerHandleImpl::OnHandleGotReadable(MojoResult) { 108 void WebDataConsumerHandleImpl::ReaderImpl::StartWatching() {
109 handle_watcher_.Start(
110 context_->handle().get(), MOJO_HANDLE_SIGNAL_READABLE,
111 MOJO_DEADLINE_INDEFINITE,
112 base::Bind(&ReaderImpl::OnHandleGotReadable, base::Unretained(this)));
113 }
114
115 void WebDataConsumerHandleImpl::ReaderImpl::OnHandleGotReadable(MojoResult) {
112 DCHECK(client_); 116 DCHECK(client_);
113 client_->didGetReadable(); 117 client_->didGetReadable();
114 } 118 }
115 119
120 WebDataConsumerHandleImpl::WebDataConsumerHandleImpl(Handle handle)
121 : context_(new Context(handle.Pass())) {
122 }
123
124 WebDataConsumerHandleImpl::~WebDataConsumerHandleImpl() {
125 }
126
127 scoped_ptr<blink::WebDataConsumerHandle::Reader>
128 WebDataConsumerHandleImpl::ObtainReader(Client* client) {
129 return make_scoped_ptr(obtainReaderInternal(client));
130 }
131
132 WebDataConsumerHandleImpl::ReaderImpl*
133 WebDataConsumerHandleImpl::obtainReaderInternal(Client* client) {
134 return new ReaderImpl(context_, client);
135 }
136
116 } // namespace content 137 } // namespace content
OLDNEW
« no previous file with comments | « content/child/web_data_consumer_handle_impl.h ('k') | content/child/web_data_consumer_handle_impl_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698