1// Copyright 2013 The Flutter 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#ifndef LIB_TONIC_TYPED_DATA_DART_BYTE_DATA_H_
6#define LIB_TONIC_TYPED_DATA_DART_BYTE_DATA_H_
7
8#include <vector>
9
10#include "third_party/dart/runtime/include/dart_api.h"
11#include "tonic/converter/dart_converter.h"
12
13namespace tonic {
14
15class DartByteData {
16 public:
17 static Dart_Handle Create(const void* data, size_t length);
18
19 explicit DartByteData(Dart_Handle list);
20 DartByteData(DartByteData&& other);
21 DartByteData();
22 ~DartByteData();
23
24 const void* data() const { return data_; }
25 void* data() { return data_; }
26 size_t length_in_bytes() const { return length_in_bytes_; }
27 Dart_Handle dart_handle() const { return dart_handle_; }
28
29 std::vector<char> Copy() const;
30 void Release() const;
31
32 explicit operator bool() const { return data_ != nullptr; }
33
34 private:
35 mutable void* data_;
36 intptr_t length_in_bytes_;
37 Dart_Handle dart_handle_;
38
39 DartByteData(const DartByteData& other) = delete;
40 DartByteData(const void* data, size_t length);
41};
42
43template <>
44struct DartConverter<DartByteData> {
45 static void SetReturnValue(Dart_NativeArguments args, DartByteData val);
46 static DartByteData FromArguments(Dart_NativeArguments args,
47 int index,
48 Dart_Handle& exception);
49};
50
51} // namespace tonic
52
53#endif // LIB_TONIC_TYPED_DATA_DART_BYTE_DATA_H_
54