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/values_mojom_traits.h"
      6 
      7 #include <memory>
      8 #include <utility>
      9 
     10 #include "base/strings/string_piece.h"
     11 
     12 namespace mojo {
     13 
     14 bool StructTraits<mojo_base::mojom::DictionaryValueDataView, base::Value>::Read(
     15     mojo_base::mojom::DictionaryValueDataView data,
     16     base::Value* value_out) {
     17   mojo::MapDataView<mojo::StringDataView, mojo_base::mojom::ValueDataView> view;
     18   data.GetStorageDataView(&view);
     19   std::vector<base::Value::DictStorage::value_type> dict_storage;
     20   dict_storage.reserve(view.size());
     21   for (size_t i = 0; i < view.size(); ++i) {
     22     base::StringPiece key;
     23     auto value = std::make_unique<base::Value>();
     24     if (!view.keys().Read(i, &key) || !view.values().Read(i, value.get()))
     25       return false;
     26     dict_storage.emplace_back(key.as_string(), std::move(value));
     27   }
     28   *value_out = base::Value(base::Value::DictStorage(std::move(dict_storage),
     29                                                     base::KEEP_LAST_OF_DUPES));
     30   return true;
     31 }
     32 
     33 bool StructTraits<mojo_base::mojom::ListValueDataView, base::Value>::Read(
     34     mojo_base::mojom::ListValueDataView data,
     35     base::Value* value_out) {
     36   mojo::ArrayDataView<mojo_base::mojom::ValueDataView> view;
     37   data.GetStorageDataView(&view);
     38   base::Value::ListStorage list_storage(view.size());
     39   for (size_t i = 0; i < view.size(); ++i) {
     40     if (!view.Read(i, &list_storage[i]))
     41       return false;
     42   }
     43   *value_out = base::Value(std::move(list_storage));
     44   return true;
     45 }
     46 
     47 bool UnionTraits<mojo_base::mojom::ValueDataView, base::Value>::Read(
     48     mojo_base::mojom::ValueDataView data,
     49     base::Value* value_out) {
     50   switch (data.tag()) {
     51     case mojo_base::mojom::ValueDataView::Tag::NULL_VALUE: {
     52       *value_out = base::Value();
     53       return true;
     54     }
     55     case mojo_base::mojom::ValueDataView::Tag::BOOL_VALUE: {
     56       *value_out = base::Value(data.bool_value());
     57       return true;
     58     }
     59     case mojo_base::mojom::ValueDataView::Tag::INT_VALUE: {
     60       *value_out = base::Value(data.int_value());
     61       return true;
     62     }
     63     case mojo_base::mojom::ValueDataView::Tag::DOUBLE_VALUE: {
     64       *value_out = base::Value(data.double_value());
     65       return true;
     66     }
     67     case mojo_base::mojom::ValueDataView::Tag::STRING_VALUE: {
     68       base::StringPiece string_piece;
     69       if (!data.ReadStringValue(&string_piece))
     70         return false;
     71       *value_out = base::Value(string_piece);
     72       return true;
     73     }
     74     case mojo_base::mojom::ValueDataView::Tag::BINARY_VALUE: {
     75       mojo::ArrayDataView<uint8_t> binary_data_view;
     76       data.GetBinaryValueDataView(&binary_data_view);
     77       const char* data_pointer =
     78           reinterpret_cast<const char*>(binary_data_view.data());
     79       base::Value::BlobStorage blob_storage(
     80           data_pointer, data_pointer + binary_data_view.size());
     81       *value_out = base::Value(std::move(blob_storage));
     82       return true;
     83     }
     84     case mojo_base::mojom::ValueDataView::Tag::DICTIONARY_VALUE: {
     85       return data.ReadDictionaryValue(value_out);
     86     }
     87     case mojo_base::mojom::ValueDataView::Tag::LIST_VALUE: {
     88       return data.ReadListValue(value_out);
     89     }
     90   }
     91   return false;
     92 }
     93 
     94 }  // namespace mojo
     95