summaryrefslogtreecommitdiff
path: root/chromium/mojo/common/values_struct_traits.cc
blob: 9c5df7ab61ecd171a338fc1c7688c3cf3d62210a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
// Copyright 2016 The Chromium 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 "base/memory/ptr_util.h"
#include "mojo/common/values_struct_traits.h"

namespace mojo {

bool StructTraits<common::mojom::ListValueDataView,
                  std::unique_ptr<base::ListValue>>::
    Read(common::mojom::ListValueDataView data,
         std::unique_ptr<base::ListValue>* value_out) {
  mojo::ArrayDataView<common::mojom::ValueDataView> view;
  data.GetValuesDataView(&view);

  auto list_value = base::MakeUnique<base::ListValue>();
  for (size_t i = 0; i < view.size(); ++i) {
    std::unique_ptr<base::Value> value;
    if (!view.Read(i, &value))
      return false;

    list_value->Append(std::move(value));
  }
  *value_out = std::move(list_value);
  return true;
}

bool StructTraits<common::mojom::DictionaryValueDataView,
                  std::unique_ptr<base::DictionaryValue>>::
    Read(common::mojom::DictionaryValueDataView data,
         std::unique_ptr<base::DictionaryValue>* value_out) {
  mojo::MapDataView<mojo::StringDataView, common::mojom::ValueDataView> view;
  data.GetValuesDataView(&view);
  auto dictionary_value = base::MakeUnique<base::DictionaryValue>();
  for (size_t i = 0; i < view.size(); ++i) {
    base::StringPiece key;
    std::unique_ptr<base::Value> value;
    if (!view.keys().Read(i, &key) || !view.values().Read(i, &value))
      return false;

    dictionary_value->SetWithoutPathExpansion(key, std::move(value));
  }
  *value_out = std::move(dictionary_value);
  return true;
}

std::unique_ptr<base::DictionaryValue>
CloneTraits<std::unique_ptr<base::DictionaryValue>, false>::Clone(
    const std::unique_ptr<base::DictionaryValue>& input) {
  auto result = base::MakeUnique<base::DictionaryValue>();
  result->MergeDictionary(input.get());
  return result;
}

bool UnionTraits<common::mojom::ValueDataView, std::unique_ptr<base::Value>>::
    Read(common::mojom::ValueDataView data,
         std::unique_ptr<base::Value>* value_out) {
  switch (data.tag()) {
    case common::mojom::ValueDataView::Tag::NULL_VALUE: {
      *value_out = base::Value::CreateNullValue();
      return true;
    }
    case common::mojom::ValueDataView::Tag::BOOL_VALUE: {
      *value_out = base::MakeUnique<base::Value>(data.bool_value());
      return true;
    }
    case common::mojom::ValueDataView::Tag::INT_VALUE: {
      *value_out = base::MakeUnique<base::Value>(data.int_value());
      return true;
    }
    case common::mojom::ValueDataView::Tag::DOUBLE_VALUE: {
      *value_out = base::MakeUnique<base::Value>(data.double_value());
      return true;
    }
    case common::mojom::ValueDataView::Tag::STRING_VALUE: {
      base::StringPiece string_value;
      if (!data.ReadStringValue(&string_value))
        return false;
      *value_out = base::MakeUnique<base::StringValue>(string_value);
      return true;
    }
    case common::mojom::ValueDataView::Tag::BINARY_VALUE: {
      mojo::ArrayDataView<uint8_t> binary_data;
      data.GetBinaryValueDataView(&binary_data);
      *value_out = base::BinaryValue::CreateWithCopiedBuffer(
          reinterpret_cast<const char*>(binary_data.data()),
          binary_data.size());
      return true;
    }
    case common::mojom::ValueDataView::Tag::DICTIONARY_VALUE: {
      std::unique_ptr<base::DictionaryValue> dictionary_value;
      if (!data.ReadDictionaryValue(&dictionary_value))
        return false;
      *value_out = std::move(dictionary_value);
      return true;
    }
    case common::mojom::ValueDataView::Tag::LIST_VALUE: {
      std::unique_ptr<base::ListValue> list_value;
      if (!data.ReadListValue(&list_value))
        return false;
      *value_out = std::move(list_value);
      return true;
    }
  }
  return false;
}

}  // namespace mojo