1*1a96fba6SXin Li // Copyright 2015 The Chromium OS Authors. All rights reserved.
2*1a96fba6SXin Li // Use of this source code is governed by a BSD-style license that can be
3*1a96fba6SXin Li // found in the LICENSE file.
4*1a96fba6SXin Li
5*1a96fba6SXin Li #include <brillo/streams/memory_containers.h>
6*1a96fba6SXin Li
7*1a96fba6SXin Li #include <base/callback.h>
8*1a96fba6SXin Li #include <brillo/streams/stream_errors.h>
9*1a96fba6SXin Li
10*1a96fba6SXin Li namespace brillo {
11*1a96fba6SXin Li namespace data_container {
12*1a96fba6SXin Li
13*1a96fba6SXin Li namespace {
14*1a96fba6SXin Li
ErrorStreamReadOnly(const base::Location & location,ErrorPtr * error)15*1a96fba6SXin Li bool ErrorStreamReadOnly(const base::Location& location,
16*1a96fba6SXin Li ErrorPtr* error) {
17*1a96fba6SXin Li Error::AddTo(error,
18*1a96fba6SXin Li location,
19*1a96fba6SXin Li errors::stream::kDomain,
20*1a96fba6SXin Li errors::stream::kOperationNotSupported,
21*1a96fba6SXin Li "Stream is read-only");
22*1a96fba6SXin Li return false;
23*1a96fba6SXin Li }
24*1a96fba6SXin Li
25*1a96fba6SXin Li } // anonymous namespace
26*1a96fba6SXin Li
CopyMemoryBlock(void * dest,const void * src,size_t size) const27*1a96fba6SXin Li void ContiguousBufferBase::CopyMemoryBlock(void* dest,
28*1a96fba6SXin Li const void* src,
29*1a96fba6SXin Li size_t size) const {
30*1a96fba6SXin Li memcpy(dest, src, size);
31*1a96fba6SXin Li }
32*1a96fba6SXin Li
Read(void * buffer,size_t size_to_read,size_t offset,size_t * size_read,ErrorPtr * error)33*1a96fba6SXin Li bool ContiguousBufferBase::Read(void* buffer,
34*1a96fba6SXin Li size_t size_to_read,
35*1a96fba6SXin Li size_t offset,
36*1a96fba6SXin Li size_t* size_read,
37*1a96fba6SXin Li ErrorPtr* error) {
38*1a96fba6SXin Li size_t buf_size = GetSize();
39*1a96fba6SXin Li if (offset < buf_size) {
40*1a96fba6SXin Li size_t remaining = buf_size - offset;
41*1a96fba6SXin Li if (size_to_read >= remaining) {
42*1a96fba6SXin Li size_to_read = remaining;
43*1a96fba6SXin Li }
44*1a96fba6SXin Li const void* src_buffer = GetReadOnlyBuffer(offset, error);
45*1a96fba6SXin Li if (!src_buffer)
46*1a96fba6SXin Li return false;
47*1a96fba6SXin Li
48*1a96fba6SXin Li CopyMemoryBlock(buffer, src_buffer, size_to_read);
49*1a96fba6SXin Li } else {
50*1a96fba6SXin Li size_to_read = 0;
51*1a96fba6SXin Li }
52*1a96fba6SXin Li if (size_read)
53*1a96fba6SXin Li *size_read = size_to_read;
54*1a96fba6SXin Li return true;
55*1a96fba6SXin Li }
56*1a96fba6SXin Li
Write(const void * buffer,size_t size_to_write,size_t offset,size_t * size_written,ErrorPtr * error)57*1a96fba6SXin Li bool ContiguousBufferBase::Write(const void* buffer,
58*1a96fba6SXin Li size_t size_to_write,
59*1a96fba6SXin Li size_t offset,
60*1a96fba6SXin Li size_t* size_written,
61*1a96fba6SXin Li ErrorPtr* error) {
62*1a96fba6SXin Li if (size_to_write) {
63*1a96fba6SXin Li size_t new_size = offset + size_to_write;
64*1a96fba6SXin Li if (GetSize() < new_size && !Resize(new_size, error))
65*1a96fba6SXin Li return false;
66*1a96fba6SXin Li void* ptr = GetBuffer(offset, error);
67*1a96fba6SXin Li if (!ptr)
68*1a96fba6SXin Li return false;
69*1a96fba6SXin Li CopyMemoryBlock(ptr, buffer, size_to_write);
70*1a96fba6SXin Li if (size_written)
71*1a96fba6SXin Li *size_written = size_to_write;
72*1a96fba6SXin Li }
73*1a96fba6SXin Li return true;
74*1a96fba6SXin Li }
75*1a96fba6SXin Li
Write(const void *,size_t,size_t,size_t *,ErrorPtr * error)76*1a96fba6SXin Li bool ContiguousReadOnlyBufferBase::Write(const void* /* buffer */,
77*1a96fba6SXin Li size_t /* size_to_write */,
78*1a96fba6SXin Li size_t /* offset */,
79*1a96fba6SXin Li size_t* /* size_written */,
80*1a96fba6SXin Li ErrorPtr* error) {
81*1a96fba6SXin Li return ErrorStreamReadOnly(FROM_HERE, error);
82*1a96fba6SXin Li }
83*1a96fba6SXin Li
Resize(size_t,ErrorPtr * error)84*1a96fba6SXin Li bool ContiguousReadOnlyBufferBase::Resize(size_t /* new_size */,
85*1a96fba6SXin Li ErrorPtr* error) {
86*1a96fba6SXin Li return ErrorStreamReadOnly(FROM_HERE, error);
87*1a96fba6SXin Li }
88*1a96fba6SXin Li
GetBuffer(size_t,ErrorPtr * error)89*1a96fba6SXin Li void* ContiguousReadOnlyBufferBase::GetBuffer(size_t /* offset */,
90*1a96fba6SXin Li ErrorPtr* error) {
91*1a96fba6SXin Li ErrorStreamReadOnly(FROM_HERE, error);
92*1a96fba6SXin Li return nullptr;
93*1a96fba6SXin Li }
94*1a96fba6SXin Li
ByteBuffer(size_t reserve_size)95*1a96fba6SXin Li ByteBuffer::ByteBuffer(size_t reserve_size)
96*1a96fba6SXin Li : VectorPtr(new std::vector<uint8_t>()) {
97*1a96fba6SXin Li vector_ptr_->reserve(reserve_size);
98*1a96fba6SXin Li }
99*1a96fba6SXin Li
~ByteBuffer()100*1a96fba6SXin Li ByteBuffer::~ByteBuffer() {
101*1a96fba6SXin Li delete vector_ptr_;
102*1a96fba6SXin Li }
103*1a96fba6SXin Li
StringPtr(std::string * string)104*1a96fba6SXin Li StringPtr::StringPtr(std::string* string) : string_ptr_(string) {}
105*1a96fba6SXin Li
Resize(size_t new_size,ErrorPtr *)106*1a96fba6SXin Li bool StringPtr::Resize(size_t new_size, ErrorPtr* /* error */) {
107*1a96fba6SXin Li string_ptr_->resize(new_size);
108*1a96fba6SXin Li return true;
109*1a96fba6SXin Li }
110*1a96fba6SXin Li
GetReadOnlyBuffer(size_t offset,ErrorPtr *) const111*1a96fba6SXin Li const void* StringPtr::GetReadOnlyBuffer(size_t offset,
112*1a96fba6SXin Li ErrorPtr* /* error */) const {
113*1a96fba6SXin Li return string_ptr_->data() + offset;
114*1a96fba6SXin Li }
115*1a96fba6SXin Li
GetBuffer(size_t offset,ErrorPtr *)116*1a96fba6SXin Li void* StringPtr::GetBuffer(size_t offset, ErrorPtr* /* error */) {
117*1a96fba6SXin Li return &(*string_ptr_)[offset];
118*1a96fba6SXin Li }
119*1a96fba6SXin Li
ReadOnlyStringRef(const std::string & string)120*1a96fba6SXin Li ReadOnlyStringRef::ReadOnlyStringRef(const std::string& string)
121*1a96fba6SXin Li : string_ref_(string) {}
122*1a96fba6SXin Li
GetReadOnlyBuffer(size_t offset,ErrorPtr *) const123*1a96fba6SXin Li const void* ReadOnlyStringRef::GetReadOnlyBuffer(size_t offset,
124*1a96fba6SXin Li ErrorPtr* /* error */) const {
125*1a96fba6SXin Li return string_ref_.data() + offset;
126*1a96fba6SXin Li }
127*1a96fba6SXin Li
ReadOnlyStringCopy(std::string string)128*1a96fba6SXin Li ReadOnlyStringCopy::ReadOnlyStringCopy(std::string string)
129*1a96fba6SXin Li : ReadOnlyStringRef(string_copy_), string_copy_(std::move(string)) {}
130*1a96fba6SXin Li
131*1a96fba6SXin Li } // namespace data_container
132*1a96fba6SXin Li } // namespace brillo
133