| OLD | NEW |
| 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 <stdint.h> | 7 #include <stdint.h> |
| 8 | 8 |
| 9 #include <limits> | 9 #include <limits> |
| 10 #include <utility> | 10 #include <utility> |
| (...skipping 20 matching lines...) Expand all Loading... |
| 31 ~Context() {} | 31 ~Context() {} |
| 32 Handle handle_; | 32 Handle handle_; |
| 33 | 33 |
| 34 DISALLOW_COPY_AND_ASSIGN(Context); | 34 DISALLOW_COPY_AND_ASSIGN(Context); |
| 35 }; | 35 }; |
| 36 | 36 |
| 37 WebDataConsumerHandleImpl::ReaderImpl::ReaderImpl( | 37 WebDataConsumerHandleImpl::ReaderImpl::ReaderImpl( |
| 38 scoped_refptr<Context> context, | 38 scoped_refptr<Context> context, |
| 39 Client* client) | 39 Client* client) |
| 40 : context_(context), | 40 : context_(context), |
| 41 handle_watcher_(FROM_HERE, mojo::SimpleWatcher::ArmingPolicy::AUTOMATIC), | 41 handle_watcher_(FROM_HERE, mojo::SimpleWatcher::ArmingPolicy::MANUAL), |
| 42 client_(client) { | 42 client_(client) { |
| 43 if (client_) | 43 if (client_) |
| 44 StartWatching(); | 44 StartWatching(); |
| 45 } | 45 } |
| 46 | 46 |
| 47 WebDataConsumerHandleImpl::ReaderImpl::~ReaderImpl() { | 47 WebDataConsumerHandleImpl::ReaderImpl::~ReaderImpl() { |
| 48 } | 48 } |
| 49 | 49 |
| 50 Result WebDataConsumerHandleImpl::ReaderImpl::Read(void* data, | 50 Result WebDataConsumerHandleImpl::ReaderImpl::Read(void* data, |
| 51 size_t size, | 51 size_t size, |
| (...skipping 18 matching lines...) Expand all Loading... |
| 70 return kDone; | 70 return kDone; |
| 71 return kShouldWait; | 71 return kShouldWait; |
| 72 } | 72 } |
| 73 | 73 |
| 74 uint32_t size_to_pass = size; | 74 uint32_t size_to_pass = size; |
| 75 MojoReadDataFlags flags_to_pass = MOJO_READ_DATA_FLAG_NONE; | 75 MojoReadDataFlags flags_to_pass = MOJO_READ_DATA_FLAG_NONE; |
| 76 MojoResult rv = mojo::ReadDataRaw(context_->handle().get(), data, | 76 MojoResult rv = mojo::ReadDataRaw(context_->handle().get(), data, |
| 77 &size_to_pass, flags_to_pass); | 77 &size_to_pass, flags_to_pass); |
| 78 if (rv == MOJO_RESULT_OK) | 78 if (rv == MOJO_RESULT_OK) |
| 79 *read_size = size_to_pass; | 79 *read_size = size_to_pass; |
| 80 if (rv == MOJO_RESULT_OK || rv == MOJO_RESULT_SHOULD_WAIT) |
| 81 handle_watcher_.ArmOrNotify(); |
| 80 | 82 |
| 81 return HandleReadResult(rv); | 83 return HandleReadResult(rv); |
| 82 } | 84 } |
| 83 | 85 |
| 84 Result WebDataConsumerHandleImpl::ReaderImpl::BeginRead(const void** buffer, | 86 Result WebDataConsumerHandleImpl::ReaderImpl::BeginRead(const void** buffer, |
| 85 Flags flags, | 87 Flags flags, |
| 86 size_t* available) { | 88 size_t* available) { |
| 87 // We need this variable definition to avoid a link error. | 89 // We need this variable definition to avoid a link error. |
| 88 const Flags kNone = kFlagNone; | 90 const Flags kNone = kFlagNone; |
| 89 DCHECK_EQ(flags, kNone); | 91 DCHECK_EQ(flags, kNone); |
| 90 | 92 |
| 91 *buffer = nullptr; | 93 *buffer = nullptr; |
| 92 *available = 0; | 94 *available = 0; |
| 93 | 95 |
| 94 uint32_t size_to_pass = 0; | 96 uint32_t size_to_pass = 0; |
| 95 MojoReadDataFlags flags_to_pass = MOJO_READ_DATA_FLAG_NONE; | 97 MojoReadDataFlags flags_to_pass = MOJO_READ_DATA_FLAG_NONE; |
| 96 | 98 |
| 97 MojoResult rv = mojo::BeginReadDataRaw(context_->handle().get(), buffer, | 99 MojoResult rv = mojo::BeginReadDataRaw(context_->handle().get(), buffer, |
| 98 &size_to_pass, flags_to_pass); | 100 &size_to_pass, flags_to_pass); |
| 99 if (rv == MOJO_RESULT_OK) | 101 if (rv == MOJO_RESULT_OK) |
| 100 *available = size_to_pass; | 102 *available = size_to_pass; |
| 101 return HandleReadResult(rv); | 103 return HandleReadResult(rv); |
| 102 } | 104 } |
| 103 | 105 |
| 104 Result WebDataConsumerHandleImpl::ReaderImpl::EndRead(size_t read_size) { | 106 Result WebDataConsumerHandleImpl::ReaderImpl::EndRead(size_t read_size) { |
| 105 MojoResult rv = mojo::EndReadDataRaw(context_->handle().get(), read_size); | 107 MojoResult rv = mojo::EndReadDataRaw(context_->handle().get(), read_size); |
| 108 if (rv == MOJO_RESULT_OK) |
| 109 handle_watcher_.ArmOrNotify(); |
| 106 return rv == MOJO_RESULT_OK ? kOk : kUnexpectedError; | 110 return rv == MOJO_RESULT_OK ? kOk : kUnexpectedError; |
| 107 } | 111 } |
| 108 | 112 |
| 109 Result WebDataConsumerHandleImpl::ReaderImpl::HandleReadResult( | 113 Result WebDataConsumerHandleImpl::ReaderImpl::HandleReadResult( |
| 110 MojoResult mojo_result) { | 114 MojoResult mojo_result) { |
| 111 switch (mojo_result) { | 115 switch (mojo_result) { |
| 112 case MOJO_RESULT_OK: | 116 case MOJO_RESULT_OK: |
| 113 return kOk; | 117 return kOk; |
| 114 case MOJO_RESULT_FAILED_PRECONDITION: | 118 case MOJO_RESULT_FAILED_PRECONDITION: |
| 115 return kDone; | 119 return kDone; |
| 116 case MOJO_RESULT_BUSY: | 120 case MOJO_RESULT_BUSY: |
| 117 return kBusy; | 121 return kBusy; |
| 118 case MOJO_RESULT_SHOULD_WAIT: | 122 case MOJO_RESULT_SHOULD_WAIT: |
| 119 return kShouldWait; | 123 return kShouldWait; |
| 120 case MOJO_RESULT_RESOURCE_EXHAUSTED: | 124 case MOJO_RESULT_RESOURCE_EXHAUSTED: |
| 121 return kResourceExhausted; | 125 return kResourceExhausted; |
| 122 default: | 126 default: |
| 123 return kUnexpectedError; | 127 return kUnexpectedError; |
| 124 } | 128 } |
| 125 } | 129 } |
| 126 | 130 |
| 127 void WebDataConsumerHandleImpl::ReaderImpl::StartWatching() { | 131 void WebDataConsumerHandleImpl::ReaderImpl::StartWatching() { |
| 128 handle_watcher_.Watch( | 132 handle_watcher_.Watch( |
| 129 context_->handle().get(), MOJO_HANDLE_SIGNAL_READABLE, | 133 context_->handle().get(), MOJO_HANDLE_SIGNAL_READABLE, |
| 130 base::Bind(&ReaderImpl::OnHandleGotReadable, base::Unretained(this))); | 134 base::Bind(&ReaderImpl::OnHandleGotReadable, base::Unretained(this))); |
| 135 handle_watcher_.ArmOrNotify(); |
| 131 } | 136 } |
| 132 | 137 |
| 133 void WebDataConsumerHandleImpl::ReaderImpl::OnHandleGotReadable(MojoResult) { | 138 void WebDataConsumerHandleImpl::ReaderImpl::OnHandleGotReadable(MojoResult) { |
| 134 DCHECK(client_); | 139 DCHECK(client_); |
| 135 client_->DidGetReadable(); | 140 client_->DidGetReadable(); |
| 136 } | 141 } |
| 137 | 142 |
| 138 WebDataConsumerHandleImpl::WebDataConsumerHandleImpl(Handle handle) | 143 WebDataConsumerHandleImpl::WebDataConsumerHandleImpl(Handle handle) |
| 139 : context_(new Context(std::move(handle))) {} | 144 : context_(new Context(std::move(handle))) {} |
| 140 | 145 |
| 141 WebDataConsumerHandleImpl::~WebDataConsumerHandleImpl() { | 146 WebDataConsumerHandleImpl::~WebDataConsumerHandleImpl() { |
| 142 } | 147 } |
| 143 | 148 |
| 144 std::unique_ptr<blink::WebDataConsumerHandle::Reader> | 149 std::unique_ptr<blink::WebDataConsumerHandle::Reader> |
| 145 WebDataConsumerHandleImpl::ObtainReader(Client* client) { | 150 WebDataConsumerHandleImpl::ObtainReader(Client* client) { |
| 146 return base::WrapUnique(new ReaderImpl(context_, client)); | 151 return base::WrapUnique(new ReaderImpl(context_, client)); |
| 147 } | 152 } |
| 148 | 153 |
| 149 const char* WebDataConsumerHandleImpl::DebugName() const { | 154 const char* WebDataConsumerHandleImpl::DebugName() const { |
| 150 return "WebDataConsumerHandleImpl"; | 155 return "WebDataConsumerHandleImpl"; |
| 151 } | 156 } |
| 152 | 157 |
| 153 } // namespace content | 158 } // namespace content |
| OLD | NEW |