| OLD | NEW |
| (Empty) | |
| 1 // Copyright 2016 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 "modules/fetch/BytesConsumerForDataConsumerHandle.h" |
| 6 |
| 7 #include <algorithm> |
| 8 #include <string.h> |
| 9 |
| 10 namespace blink { |
| 11 |
| 12 BytesConsumerForDataConsumerHandle::BytesConsumerForDataConsumerHandle(PassOwnPt
r<FetchDataConsumerHandle> handle) |
| 13 : m_reader(handle->obtainReader(this)) |
| 14 { |
| 15 } |
| 16 |
| 17 BytesConsumerForDataConsumerHandle::~BytesConsumerForDataConsumerHandle() {} |
| 18 |
| 19 BytesConsumer::Result BytesConsumerForDataConsumerHandle::read(char* buffer, siz
e_t size, size_t* readSize) |
| 20 { |
| 21 if (m_state == State::Closed) |
| 22 return Result::Done; |
| 23 if (m_state == State::Errored) |
| 24 return Result::Error; |
| 25 |
| 26 WebDataConsumerHandle::Result r = m_reader->read(buffer, size, WebDataConsum
erHandle::FlagNone, readSize); |
| 27 switch (r) { |
| 28 case WebDataConsumerHandle::Ok: |
| 29 return Result::Ok; |
| 30 case WebDataConsumerHandle::ShouldWait: |
| 31 return Result::ShouldWait; |
| 32 case WebDataConsumerHandle::Done: |
| 33 close(); |
| 34 return Result::Done; |
| 35 default: |
| 36 error(); |
| 37 return Result::Error; |
| 38 } |
| 39 } |
| 40 |
| 41 BytesConsumer::Result BytesConsumerForDataConsumerHandle::beginRead(const char**
buffer, size_t* available) |
| 42 { |
| 43 if (m_state == State::Closed) |
| 44 return Result::Done; |
| 45 if (m_state == State::Errored) |
| 46 return Result::Error; |
| 47 |
| 48 WebDataConsumerHandle::Result r = m_reader->beginRead(reinterpret_cast<const
void**>(buffer), WebDataConsumerHandle::FlagNone, available); |
| 49 switch (r) { |
| 50 case WebDataConsumerHandle::Ok: |
| 51 return Result::Ok; |
| 52 case WebDataConsumerHandle::ShouldWait: |
| 53 return Result::ShouldWait; |
| 54 case WebDataConsumerHandle::Done: |
| 55 close(); |
| 56 return Result::Done; |
| 57 default: |
| 58 error(); |
| 59 return Result::Error; |
| 60 } |
| 61 } |
| 62 |
| 63 BytesConsumer::Result BytesConsumerForDataConsumerHandle::endRead(size_t read) |
| 64 { |
| 65 DCHECK(m_state == State::Readable || m_state == State::Waiting); |
| 66 WebDataConsumerHandle::Result r = m_reader->endRead(read); |
| 67 if (r == WebDataConsumerHandle::Ok) |
| 68 return Result::Ok; |
| 69 error(); |
| 70 return Result::Error; |
| 71 } |
| 72 |
| 73 PassRefPtr<BlobDataHandle> BytesConsumerForDataConsumerHandle::drainAsBlobDataHa
ndle(BlobSizePolicy policy) |
| 74 { |
| 75 if (!m_reader) |
| 76 return nullptr; |
| 77 if (policy == BlobSizePolicy::DisallowBlobWithInvalidSize) |
| 78 return m_reader->drainAsBlobDataHandle(FetchDataConsumerHandle::Reader::
DisallowBlobWithInvalidSize); |
| 79 DCHECK_EQ(BlobSizePolicy::AllowBlobWithInvalidSize, policy); |
| 80 return m_reader->drainAsBlobDataHandle(FetchDataConsumerHandle::Reader::Allo
wBlobWithInvalidSize); |
| 81 } |
| 82 |
| 83 PassRefPtr<EncodedFormData> BytesConsumerForDataConsumerHandle::drainAsFormData(
) |
| 84 { |
| 85 if (!m_reader) |
| 86 return nullptr; |
| 87 return m_reader->drainAsFormData(); |
| 88 } |
| 89 |
| 90 void BytesConsumerForDataConsumerHandle::setClient(BytesConsumer::Client* client
) |
| 91 { |
| 92 DCHECK(!m_client); |
| 93 DCHECK(client); |
| 94 m_client = client; |
| 95 } |
| 96 |
| 97 void BytesConsumerForDataConsumerHandle::clearClient() |
| 98 { |
| 99 DCHECK(m_client); |
| 100 m_client = nullptr; |
| 101 } |
| 102 |
| 103 void BytesConsumerForDataConsumerHandle::cancel() |
| 104 { |
| 105 if (m_state == State::Readable || m_state == State::Waiting) { |
| 106 // We don't want the client to be notified in this case. |
| 107 BytesConsumer::Client* client = m_client; |
| 108 m_client = nullptr; |
| 109 close(); |
| 110 m_client = client; |
| 111 } |
| 112 } |
| 113 |
| 114 void BytesConsumerForDataConsumerHandle::didGetReadable() |
| 115 { |
| 116 DCHECK(m_state == State::Readable || m_state == State::Waiting); |
| 117 // Perform zero-length read to call check handle's status. |
| 118 size_t readSize; |
| 119 WebDataConsumerHandle::Result result = m_reader->read(nullptr, 0, WebDataCon
sumerHandle::FlagNone, &readSize); |
| 120 switch (result) { |
| 121 case WebDataConsumerHandle::Ok: |
| 122 case WebDataConsumerHandle::ShouldWait: |
| 123 if (m_client) |
| 124 m_client->onReadable(); |
| 125 return; |
| 126 case WebDataConsumerHandle::Done: |
| 127 close(); |
| 128 return; |
| 129 case WebDataConsumerHandle::Busy: |
| 130 case WebDataConsumerHandle::ResourceExhausted: |
| 131 case WebDataConsumerHandle::UnexpectedError: |
| 132 error(); |
| 133 return; |
| 134 } |
| 135 return; |
| 136 } |
| 137 |
| 138 DEFINE_TRACE(BytesConsumerForDataConsumerHandle) |
| 139 { |
| 140 visitor->trace(m_client); |
| 141 BytesConsumer::trace(visitor); |
| 142 } |
| 143 |
| 144 void BytesConsumerForDataConsumerHandle::close() |
| 145 { |
| 146 if (m_state == State::Closed) |
| 147 return; |
| 148 DCHECK(m_state == State::Readable || m_state == State::Waiting); |
| 149 m_state = State::Closed; |
| 150 m_reader = nullptr; |
| 151 if (m_client) |
| 152 m_client->onClose(); |
| 153 } |
| 154 |
| 155 void BytesConsumerForDataConsumerHandle::error() |
| 156 { |
| 157 if (m_state == State::Errored) |
| 158 return; |
| 159 DCHECK(m_state == State::Readable || m_state == State::Waiting); |
| 160 m_state = State::Errored; |
| 161 m_reader = nullptr; |
| 162 m_error = Error("error"); |
| 163 if (m_client) |
| 164 m_client->onError(m_error); |
| 165 } |
| 166 |
| 167 } // namespace blink |
| OLD | NEW |