| OLD | NEW |
| 1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2009 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 "chrome_frame/urlmon_upload_data_stream.h" | 5 #include "chrome_frame/urlmon_upload_data_stream.h" |
| 6 | 6 |
| 7 #include "net/base/io_buffer.h" | 7 #include "net/base/io_buffer.h" |
| 8 #include "net/base/net_errors.h" | 8 #include "net/base/net_errors.h" |
| 9 | 9 |
| 10 void UrlmonUploadDataStream::Initialize(net::UploadData* upload_data) { | 10 void UrlmonUploadDataStream::Initialize(net::UploadData* upload_data) { |
| 11 upload_data_ = upload_data; | 11 upload_data_ = upload_data; |
| 12 request_body_stream_.reset(net::UploadDataStream::Create(upload_data, NULL)); | 12 request_body_stream_.reset(net::UploadDataStream::Create(upload_data, NULL)); |
| 13 DCHECK(request_body_stream_.get()); | 13 DCHECK(request_body_stream_.get()); |
| 14 } | 14 } |
| 15 | 15 |
| 16 STDMETHODIMP UrlmonUploadDataStream::Read(void* pv, ULONG cb, ULONG* read) { | 16 STDMETHODIMP UrlmonUploadDataStream::Read(void* pv, ULONG cb, ULONG* read) { |
| 17 if (pv == NULL) { | 17 if (pv == NULL) { |
| 18 NOTREACHED(); | 18 NOTREACHED(); |
| 19 return E_POINTER; | 19 return E_POINTER; |
| 20 } | 20 } |
| 21 | 21 |
| 22 // Have we already read past the end of the stream? | 22 // Have we already read past the end of the stream? |
| 23 if (request_body_stream_->position() >= request_body_stream_->size()) { | 23 if (request_body_stream_->eof()) { |
| 24 if (read) { | 24 if (read) { |
| 25 *read = 0; | 25 *read = 0; |
| 26 } | 26 } |
| 27 return S_FALSE; | 27 return S_FALSE; |
| 28 } | 28 } |
| 29 | 29 |
| 30 uint64 total_bytes_to_copy = std::min(static_cast<uint64>(cb), | 30 uint64 total_bytes_to_copy = std::min(static_cast<uint64>(cb), |
| 31 request_body_stream_->size() - request_body_stream_->position()); | 31 static_cast<uint64>(request_body_stream_->buf_len())); |
| 32 uint64 initial_position = request_body_stream_->position(); | |
| 33 | 32 |
| 34 uint64 bytes_copied = 0; | 33 uint64 bytes_copied = 0; |
| 35 | 34 |
| 36 char* write_pointer = reinterpret_cast<char*>(pv); | 35 char* write_pointer = reinterpret_cast<char*>(pv); |
| 37 while (bytes_copied < total_bytes_to_copy) { | 36 while (bytes_copied < total_bytes_to_copy) { |
| 38 net::IOBuffer* buf = request_body_stream_->buf(); | 37 net::IOBuffer* buf = request_body_stream_->buf(); |
| 39 | 38 |
| 40 // Make sure our length doesn't run past the end of the available data. | 39 // Make sure our length doesn't run past the end of the available data. |
| 41 size_t bytes_to_copy_now = static_cast<size_t>( | 40 size_t bytes_to_copy_now = static_cast<size_t>( |
| 42 std::min(static_cast<uint64>(request_body_stream_->buf_len()), | 41 std::min(static_cast<uint64>(request_body_stream_->buf_len()), |
| 43 total_bytes_to_copy - bytes_copied)); | 42 total_bytes_to_copy - bytes_copied)); |
| 44 | 43 |
| 45 memcpy(write_pointer, buf->data(), bytes_to_copy_now); | 44 memcpy(write_pointer, buf->data(), bytes_to_copy_now); |
| 46 | 45 |
| 47 // Advance our copy tally | 46 // Advance our copy tally |
| 48 bytes_copied += bytes_to_copy_now; | 47 bytes_copied += bytes_to_copy_now; |
| 49 | 48 |
| 50 // Advance our write pointer | 49 // Advance our write pointer |
| 51 write_pointer += bytes_to_copy_now; | 50 write_pointer += bytes_to_copy_now; |
| 52 | 51 |
| 53 // Advance the UploadDataStream read pointer: | 52 // Advance the UploadDataStream read pointer: |
| 54 request_body_stream_->MarkConsumedAndFillBuffer(bytes_to_copy_now); | 53 request_body_stream_->MarkConsumedAndFillBuffer(bytes_to_copy_now); |
| 55 } | 54 } |
| 56 | 55 |
| 57 DCHECK(bytes_copied == total_bytes_to_copy); | 56 DCHECK(bytes_copied == total_bytes_to_copy); |
| 58 DCHECK(request_body_stream_->position() == | |
| 59 initial_position + total_bytes_to_copy); | |
| 60 | 57 |
| 61 if (read) { | 58 if (read) { |
| 62 *read = static_cast<ULONG>(total_bytes_to_copy); | 59 *read = static_cast<ULONG>(total_bytes_to_copy); |
| 63 } | 60 } |
| 64 | 61 |
| 65 return S_OK; | 62 return S_OK; |
| 66 } | 63 } |
| 67 | 64 |
| 68 STDMETHODIMP UrlmonUploadDataStream::Seek(LARGE_INTEGER move, DWORD origin, | 65 STDMETHODIMP UrlmonUploadDataStream::Seek(LARGE_INTEGER move, DWORD origin, |
| 69 ULARGE_INTEGER* new_pos) { | 66 ULARGE_INTEGER* new_pos) { |
| (...skipping 24 matching lines...) Expand all Loading... |
| 94 if (0 == (grf_stat_flag & STATFLAG_NONAME)) { | 91 if (0 == (grf_stat_flag & STATFLAG_NONAME)) { |
| 95 const wchar_t kStreamBuffer[] = L"PostStream"; | 92 const wchar_t kStreamBuffer[] = L"PostStream"; |
| 96 stat_stg->pwcsName = | 93 stat_stg->pwcsName = |
| 97 static_cast<wchar_t*>(::CoTaskMemAlloc(sizeof(kStreamBuffer))); | 94 static_cast<wchar_t*>(::CoTaskMemAlloc(sizeof(kStreamBuffer))); |
| 98 lstrcpy(stat_stg->pwcsName, kStreamBuffer); | 95 lstrcpy(stat_stg->pwcsName, kStreamBuffer); |
| 99 } | 96 } |
| 100 stat_stg->type = STGTY_STREAM; | 97 stat_stg->type = STGTY_STREAM; |
| 101 stat_stg->cbSize.QuadPart = upload_data_->GetContentLength(); | 98 stat_stg->cbSize.QuadPart = upload_data_->GetContentLength(); |
| 102 return S_OK; | 99 return S_OK; |
| 103 } | 100 } |
| OLD | NEW |