Home | History | Annotate | Download | only in base
      1 // Copyright 2018 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "mojo/public/cpp/base/big_buffer_mojom_traits.h"
      6 
      7 #include <vector>
      8 
      9 #include "base/logging.h"
     10 #include "base/numerics/safe_conversions.h"
     11 #include "mojo/public/cpp/bindings/array_data_view.h"
     12 
     13 namespace mojo {
     14 
     15 // static
     16 uint32_t StructTraits<mojo_base::mojom::BigBufferSharedMemoryRegionDataView,
     17                       mojo_base::internal::BigBufferSharedMemoryRegion>::
     18     size(const mojo_base::internal::BigBufferSharedMemoryRegion& region) {
     19   return base::checked_cast<uint32_t>(region.size());
     20 }
     21 
     22 // static
     23 ScopedSharedBufferHandle
     24 StructTraits<mojo_base::mojom::BigBufferSharedMemoryRegionDataView,
     25              mojo_base::internal::BigBufferSharedMemoryRegion>::
     26     buffer_handle(mojo_base::internal::BigBufferSharedMemoryRegion& region) {
     27   return region.TakeBufferHandle();
     28 }
     29 
     30 // static
     31 bool StructTraits<mojo_base::mojom::BigBufferSharedMemoryRegionDataView,
     32                   mojo_base::internal::BigBufferSharedMemoryRegion>::
     33     Read(mojo_base::mojom::BigBufferSharedMemoryRegionDataView data,
     34          mojo_base::internal::BigBufferSharedMemoryRegion* out) {
     35   *out = mojo_base::internal::BigBufferSharedMemoryRegion(
     36       data.TakeBufferHandle(), data.size());
     37   return out->memory() != nullptr;
     38 }
     39 
     40 // static
     41 mojo_base::mojom::BigBufferDataView::Tag
     42 UnionTraits<mojo_base::mojom::BigBufferDataView, mojo_base::BigBuffer>::GetTag(
     43     const mojo_base::BigBuffer& buffer) {
     44   switch (buffer.storage_type()) {
     45     case mojo_base::BigBuffer::StorageType::kBytes:
     46       return mojo_base::mojom::BigBufferDataView::Tag::BYTES;
     47     case mojo_base::BigBuffer::StorageType::kSharedMemory:
     48       return mojo_base::mojom::BigBufferDataView::Tag::SHARED_MEMORY;
     49   }
     50 
     51   NOTREACHED();
     52   return mojo_base::mojom::BigBufferDataView::Tag::BYTES;
     53 }
     54 
     55 // static
     56 const std::vector<uint8_t>&
     57 UnionTraits<mojo_base::mojom::BigBufferDataView, mojo_base::BigBuffer>::bytes(
     58     const mojo_base::BigBuffer& buffer) {
     59   return buffer.bytes();
     60 }
     61 
     62 // static
     63 mojo_base::internal::BigBufferSharedMemoryRegion&
     64 UnionTraits<mojo_base::mojom::BigBufferDataView,
     65             mojo_base::BigBuffer>::shared_memory(mojo_base::BigBuffer& buffer) {
     66   return buffer.shared_memory();
     67 }
     68 
     69 // static
     70 bool UnionTraits<mojo_base::mojom::BigBufferDataView, mojo_base::BigBuffer>::
     71     Read(mojo_base::mojom::BigBufferDataView data, mojo_base::BigBuffer* out) {
     72   switch (data.tag()) {
     73     case mojo_base::mojom::BigBufferDataView::Tag::BYTES: {
     74       mojo::ArrayDataView<uint8_t> bytes_view;
     75       data.GetBytesDataView(&bytes_view);
     76       *out = mojo_base::BigBuffer(bytes_view);
     77       return true;
     78     }
     79 
     80     case mojo_base::mojom::BigBufferDataView::Tag::SHARED_MEMORY: {
     81       mojo_base::internal::BigBufferSharedMemoryRegion shared_memory;
     82       if (!data.ReadSharedMemory(&shared_memory))
     83         return false;
     84       *out = mojo_base::BigBuffer(std::move(shared_memory));
     85       return true;
     86     }
     87   }
     88 
     89   return false;
     90 }
     91 
     92 // static
     93 mojo_base::mojom::BigBufferDataView::Tag UnionTraits<
     94     mojo_base::mojom::BigBufferDataView,
     95     mojo_base::BigBufferView>::GetTag(const mojo_base::BigBufferView& view) {
     96   switch (view.storage_type()) {
     97     case mojo_base::BigBuffer::StorageType::kBytes:
     98       return mojo_base::mojom::BigBufferDataView::Tag::BYTES;
     99     case mojo_base::BigBuffer::StorageType::kSharedMemory:
    100       return mojo_base::mojom::BigBufferDataView::Tag::SHARED_MEMORY;
    101   }
    102 
    103   NOTREACHED();
    104   return mojo_base::mojom::BigBufferDataView::Tag::BYTES;
    105 }
    106 
    107 // static
    108 base::span<const uint8_t> UnionTraits<
    109     mojo_base::mojom::BigBufferDataView,
    110     mojo_base::BigBufferView>::bytes(const mojo_base::BigBufferView& view) {
    111   return view.bytes();
    112 }
    113 
    114 // static
    115 mojo_base::internal::BigBufferSharedMemoryRegion& UnionTraits<
    116     mojo_base::mojom::BigBufferDataView,
    117     mojo_base::BigBufferView>::shared_memory(mojo_base::BigBufferView& view) {
    118   return view.shared_memory();
    119 }
    120 
    121 // static
    122 bool UnionTraits<
    123     mojo_base::mojom::BigBufferDataView,
    124     mojo_base::BigBufferView>::Read(mojo_base::mojom::BigBufferDataView data,
    125                                     mojo_base::BigBufferView* out) {
    126   switch (data.tag()) {
    127     case mojo_base::mojom::BigBufferDataView::Tag::BYTES: {
    128       mojo::ArrayDataView<uint8_t> bytes_view;
    129       data.GetBytesDataView(&bytes_view);
    130       out->SetBytes(bytes_view);
    131       return true;
    132     }
    133 
    134     case mojo_base::mojom::BigBufferDataView::Tag::SHARED_MEMORY: {
    135       mojo_base::internal::BigBufferSharedMemoryRegion shared_memory;
    136       if (!data.ReadSharedMemory(&shared_memory))
    137         return false;
    138       out->SetSharedMemory(std::move(shared_memory));
    139       return true;
    140     }
    141   }
    142 
    143   return false;
    144 }
    145 
    146 }  // namespace mojo
    147