| 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(std::uniq
ue_ptr<FetchDataConsumerHandle> handle) |
| 13 : m_reader(handle->obtainFetchDataReader(this)) |
| 14 { |
| 15 } |
| 16 |
| 17 BytesConsumerForDataConsumerHandle::~BytesConsumerForDataConsumerHandle() {} |
| 18 |
| 19 BytesConsumer::Result BytesConsumerForDataConsumerHandle::read(char* buffer, siz
e_t size, size_t* readSize) |
| 20 { |
| 21 *readSize = 0; |
| 22 if (m_state == InternalState::Closed) |
| 23 return Result::Done; |
| 24 if (m_state == InternalState::Errored) |
| 25 return Result::Error; |
| 26 |
| 27 WebDataConsumerHandle::Result r = m_reader->read(buffer, size, WebDataConsum
erHandle::FlagNone, readSize); |
| 28 switch (r) { |
| 29 case WebDataConsumerHandle::Ok: |
| 30 return Result::Ok; |
| 31 case WebDataConsumerHandle::ShouldWait: |
| 32 return Result::ShouldWait; |
| 33 case WebDataConsumerHandle::Done: |
| 34 close(); |
| 35 return Result::Done; |
| 36 case WebDataConsumerHandle::Busy: |
| 37 case WebDataConsumerHandle::ResourceExhausted: |
| 38 case WebDataConsumerHandle::UnexpectedError: |
| 39 error(); |
| 40 return Result::Error; |
| 41 } |
| 42 NOTREACHED(); |
| 43 return Result::Error; |
| 44 } |
| 45 |
| 46 BytesConsumer::Result BytesConsumerForDataConsumerHandle::beginRead(const char**
buffer, size_t* available) |
| 47 { |
| 48 *buffer = nullptr; |
| 49 *available = 0; |
| 50 if (m_state == InternalState::Closed) |
| 51 return Result::Done; |
| 52 if (m_state == InternalState::Errored) |
| 53 return Result::Error; |
| 54 |
| 55 WebDataConsumerHandle::Result r = m_reader->beginRead(reinterpret_cast<const
void**>(buffer), WebDataConsumerHandle::FlagNone, available); |
| 56 switch (r) { |
| 57 case WebDataConsumerHandle::Ok: |
| 58 return Result::Ok; |
| 59 case WebDataConsumerHandle::ShouldWait: |
| 60 return Result::ShouldWait; |
| 61 case WebDataConsumerHandle::Done: |
| 62 close(); |
| 63 return Result::Done; |
| 64 case WebDataConsumerHandle::Busy: |
| 65 case WebDataConsumerHandle::ResourceExhausted: |
| 66 case WebDataConsumerHandle::UnexpectedError: |
| 67 error(); |
| 68 return Result::Error; |
| 69 } |
| 70 NOTREACHED(); |
| 71 return Result::Error; |
| 72 } |
| 73 |
| 74 BytesConsumer::Result BytesConsumerForDataConsumerHandle::endRead(size_t read) |
| 75 { |
| 76 DCHECK(m_state == InternalState::Readable || m_state == InternalState::Waiti
ng); |
| 77 WebDataConsumerHandle::Result r = m_reader->endRead(read); |
| 78 if (r == WebDataConsumerHandle::Ok) |
| 79 return Result::Ok; |
| 80 error(); |
| 81 return Result::Error; |
| 82 } |
| 83 |
| 84 PassRefPtr<BlobDataHandle> BytesConsumerForDataConsumerHandle::drainAsBlobDataHa
ndle(BlobSizePolicy policy) |
| 85 { |
| 86 if (!m_reader) |
| 87 return nullptr; |
| 88 |
| 89 RefPtr<BlobDataHandle> handle; |
| 90 if (policy == BlobSizePolicy::DisallowBlobWithInvalidSize) { |
| 91 handle = m_reader->drainAsBlobDataHandle(FetchDataConsumerHandle::Reader
::DisallowBlobWithInvalidSize); |
| 92 } else { |
| 93 DCHECK_EQ(BlobSizePolicy::AllowBlobWithInvalidSize, policy); |
| 94 handle = m_reader->drainAsBlobDataHandle(FetchDataConsumerHandle::Reader
::AllowBlobWithInvalidSize); |
| 95 } |
| 96 |
| 97 if (handle) |
| 98 close(); |
| 99 return handle.release(); |
| 100 } |
| 101 |
| 102 PassRefPtr<EncodedFormData> BytesConsumerForDataConsumerHandle::drainAsFormData(
) |
| 103 { |
| 104 if (!m_reader) |
| 105 return nullptr; |
| 106 RefPtr<EncodedFormData> formData = m_reader->drainAsFormData(); |
| 107 if (formData) |
| 108 close(); |
| 109 return formData.release(); |
| 110 } |
| 111 |
| 112 void BytesConsumerForDataConsumerHandle::setClient(BytesConsumer::Client* client
) |
| 113 { |
| 114 DCHECK(!m_client); |
| 115 DCHECK(client); |
| 116 m_client = client; |
| 117 } |
| 118 |
| 119 void BytesConsumerForDataConsumerHandle::clearClient() |
| 120 { |
| 121 DCHECK(m_client); |
| 122 m_client = nullptr; |
| 123 } |
| 124 |
| 125 void BytesConsumerForDataConsumerHandle::cancel() |
| 126 { |
| 127 if (m_state == InternalState::Readable || m_state == InternalState::Waiting)
{ |
| 128 // We don't want the client to be notified in this case. |
| 129 BytesConsumer::Client* client = m_client; |
| 130 m_client = nullptr; |
| 131 close(); |
| 132 m_client = client; |
| 133 } |
| 134 } |
| 135 |
| 136 BytesConsumer::PublicState BytesConsumerForDataConsumerHandle::getPublicState()
const |
| 137 { |
| 138 return getPublicStateFromInternalState(m_state); |
| 139 } |
| 140 |
| 141 void BytesConsumerForDataConsumerHandle::didGetReadable() |
| 142 { |
| 143 DCHECK(m_state == InternalState::Readable || m_state == InternalState::Waiti
ng); |
| 144 // Perform zero-length read to call check handle's status. |
| 145 size_t readSize; |
| 146 WebDataConsumerHandle::Result result = m_reader->read(nullptr, 0, WebDataCon
sumerHandle::FlagNone, &readSize); |
| 147 switch (result) { |
| 148 case WebDataConsumerHandle::Ok: |
| 149 case WebDataConsumerHandle::ShouldWait: |
| 150 if (m_client) |
| 151 m_client->onStateChange(); |
| 152 return; |
| 153 case WebDataConsumerHandle::Done: |
| 154 close(); |
| 155 if (m_client) |
| 156 m_client->onStateChange(); |
| 157 return; |
| 158 case WebDataConsumerHandle::Busy: |
| 159 case WebDataConsumerHandle::ResourceExhausted: |
| 160 case WebDataConsumerHandle::UnexpectedError: |
| 161 error(); |
| 162 if (m_client) |
| 163 m_client->onStateChange(); |
| 164 return; |
| 165 } |
| 166 return; |
| 167 } |
| 168 |
| 169 DEFINE_TRACE(BytesConsumerForDataConsumerHandle) |
| 170 { |
| 171 visitor->trace(m_client); |
| 172 BytesConsumer::trace(visitor); |
| 173 } |
| 174 |
| 175 void BytesConsumerForDataConsumerHandle::close() |
| 176 { |
| 177 if (m_state == InternalState::Closed) |
| 178 return; |
| 179 DCHECK(m_state == InternalState::Readable || m_state == InternalState::Waiti
ng); |
| 180 m_state = InternalState::Closed; |
| 181 m_reader = nullptr; |
| 182 } |
| 183 |
| 184 void BytesConsumerForDataConsumerHandle::error() |
| 185 { |
| 186 if (m_state == InternalState::Errored) |
| 187 return; |
| 188 DCHECK(m_state == InternalState::Readable || m_state == InternalState::Waiti
ng); |
| 189 m_state = InternalState::Errored; |
| 190 m_reader = nullptr; |
| 191 m_error = Error("error"); |
| 192 } |
| 193 |
| 194 } // namespace blink |
| OLD | NEW |