1// Copyright 2016 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/bindings/string_traits_wtf.h"
6
7#include <string.h>
8
9#include "base/logging.h"
10#include "mojo/public/cpp/bindings/lib/array_internal.h"
11#include "third_party/WebKit/Source/wtf/text/StringUTF8Adaptor.h"
12
13namespace mojo {
14namespace {
15
16struct UTF8AdaptorInfo {
17  explicit UTF8AdaptorInfo(const WTF::String& input) : utf8_adaptor(input) {
18#if DCHECK_IS_ON()
19    original_size_in_bytes = static_cast<size_t>(input.sizeInBytes());
20#endif
21  }
22
23  ~UTF8AdaptorInfo() {}
24
25  WTF::StringUTF8Adaptor utf8_adaptor;
26
27#if DCHECK_IS_ON()
28  // For sanity check only.
29  size_t original_size_in_bytes;
30#endif
31};
32
33UTF8AdaptorInfo* ToAdaptor(const WTF::String& input, void* context) {
34  UTF8AdaptorInfo* adaptor = static_cast<UTF8AdaptorInfo*>(context);
35
36#if DCHECK_IS_ON()
37  DCHECK_EQ(adaptor->original_size_in_bytes,
38            static_cast<size_t>(input.sizeInBytes()));
39#endif
40  return adaptor;
41}
42
43}  // namespace
44
45// static
46void StringTraits<WTF::String>::SetToNull(WTF::String* output) {
47  if (output->isNull())
48    return;
49
50  WTF::String result;
51  output->swap(result);
52}
53
54// static
55void* StringTraits<WTF::String>::SetUpContext(const WTF::String& input) {
56  return new UTF8AdaptorInfo(input);
57}
58
59// static
60void StringTraits<WTF::String>::TearDownContext(const WTF::String& input,
61                                                void* context) {
62  delete ToAdaptor(input, context);
63}
64
65// static
66size_t StringTraits<WTF::String>::GetSize(const WTF::String& input,
67                                          void* context) {
68  return ToAdaptor(input, context)->utf8_adaptor.length();
69}
70
71// static
72const char* StringTraits<WTF::String>::GetData(const WTF::String& input,
73                                               void* context) {
74  return ToAdaptor(input, context)->utf8_adaptor.data();
75}
76
77// static
78bool StringTraits<WTF::String>::Read(StringDataView input,
79                                     WTF::String* output) {
80  WTF::String result = WTF::String::fromUTF8(input.storage(), input.size());
81  output->swap(result);
82  return true;
83}
84
85}  // namespace mojo
86