--- /dev/null
+// Copyright (c) 2010 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 "include/wrapper/cef_byte_read_handler.h"
+
+#include <algorithm>
+#include <cstdio>
+#include <cstdlib>
+
+CefByteReadHandler::CefByteReadHandler(const unsigned char* bytes, size_t size,
+ CefRefPtr<CefBaseRefCounted> source)
+ : bytes_(bytes), size_(size), offset_(0), source_(source) {
+}
+
+size_t CefByteReadHandler::Read(void* ptr, size_t size, size_t n) {
+ base::AutoLock lock_scope(lock_);
+ size_t s = static_cast<size_t>(size_ - offset_) / size;
+ size_t ret = std::min(n, s);
+ memcpy(ptr, bytes_ + offset_, ret * size);
+ offset_ += ret * size;
+ return ret;
+}
+
+int CefByteReadHandler::Seek(int64 offset, int whence) {
+ int rv = -1L;
+ base::AutoLock lock_scope(lock_);
+ switch (whence) {
+ case SEEK_CUR:
+ if (offset_ + offset > size_ || offset_ + offset < 0)
+ break;
+ offset_ += offset;
+ rv = 0;
+ break;
+ case SEEK_END: {
+#if defined(OS_WIN)
+ int64 offset_abs = _abs64(offset);
+#else
+ int64 offset_abs = std::abs(offset);
+#endif
+ if (offset_abs > size_)
+ break;
+ offset_ = size_ - offset_abs;
+ rv = 0;
+ break;
+ }
+ case SEEK_SET:
+ if (offset > size_ || offset < 0)
+ break;
+ offset_ = offset;
+ rv = 0;
+ break;
+ }
+
+ return rv;
+}
+
+int64 CefByteReadHandler::Tell() {
+ base::AutoLock lock_scope(lock_);
+ return offset_;
+}
+
+int CefByteReadHandler::Eof() {
+ base::AutoLock lock_scope(lock_);
+ return (offset_ >= size_);
+}