xref: /aosp_15_r20/external/libbrillo/brillo/streams/memory_containers.cc (revision 1a96fba65179ea7d3f56207137718607415c5953)
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