| // Copyright (c) 2014 The Chromium Embedded Framework Authors. All rights |
| // reserved. Use of this source code is governed by a BSD-style license that |
| // can be found in the LICENSE file. |
| |
| #include "tests/cefclient/browser/bytes_write_handler.h" |
| |
| #include <cstdio> |
| #include <cstdlib> |
| |
| #include "include/wrapper/cef_helpers.h" |
| |
| namespace client { |
| |
| BytesWriteHandler::BytesWriteHandler(size_t grow) |
| : grow_(grow), datasize_(grow), offset_(0) { |
| DCHECK_GT(grow, 0U); |
| data_ = malloc(grow); |
| DCHECK(data_ != nullptr); |
| } |
| |
| BytesWriteHandler::~BytesWriteHandler() { |
| if (data_) |
| free(data_); |
| } |
| |
| size_t BytesWriteHandler::Write(const void* ptr, size_t size, size_t n) { |
| base::AutoLock lock_scope(lock_); |
| size_t rv; |
| if (offset_ + static_cast<int64>(size * n) >= datasize_ && |
| Grow(size * n) == 0) { |
| rv = 0; |
| } else { |
| memcpy(reinterpret_cast<char*>(data_) + offset_, ptr, size * n); |
| offset_ += size * n; |
| rv = n; |
| } |
| |
| return rv; |
| } |
| |
| int BytesWriteHandler::Seek(int64 offset, int whence) { |
| int rv = -1L; |
| base::AutoLock lock_scope(lock_); |
| switch (whence) { |
| case SEEK_CUR: |
| if (offset_ + offset > datasize_ || offset_ + offset < 0) |
| break; |
| offset_ += offset; |
| rv = 0; |
| break; |
| case SEEK_END: { |
| int64 offset_abs = std::abs(offset); |
| if (offset_abs > datasize_) |
| break; |
| offset_ = datasize_ - offset_abs; |
| rv = 0; |
| break; |
| } |
| case SEEK_SET: |
| if (offset > datasize_ || offset < 0) |
| break; |
| offset_ = offset; |
| rv = 0; |
| break; |
| } |
| |
| return rv; |
| } |
| |
| int64 BytesWriteHandler::Tell() { |
| base::AutoLock lock_scope(lock_); |
| return offset_; |
| } |
| |
| int BytesWriteHandler::Flush() { |
| return 0; |
| } |
| |
| size_t BytesWriteHandler::Grow(size_t size) { |
| lock_.AssertAcquired(); |
| size_t rv; |
| size_t s = (size > grow_ ? size : grow_); |
| void* tmp = realloc(data_, datasize_ + s); |
| DCHECK(tmp != nullptr); |
| if (tmp) { |
| data_ = tmp; |
| datasize_ += s; |
| rv = datasize_; |
| } else { |
| rv = 0; |
| } |
| |
| return rv; |
| } |
| |
| } // namespace client |