mirror of
https://github.com/flutter/flutter.git
synced 2026-02-20 02:29:02 +08:00
161 lines
4.8 KiB
C++
161 lines
4.8 KiB
C++
// Copyright 2015 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 <stdint.h>
|
|
#include "mojo/dart/embedder/common.h"
|
|
|
|
namespace mojo {
|
|
namespace dart {
|
|
|
|
int64_t DartEmbedder::GetIntegerValue(Dart_Handle value_obj) {
|
|
int64_t value = 0;
|
|
Dart_Handle result = Dart_IntegerToInt64(value_obj, &value);
|
|
if (Dart_IsError(result)) {
|
|
Dart_PropagateError(result);
|
|
}
|
|
return value;
|
|
}
|
|
|
|
int64_t DartEmbedder::GetInt64ValueCheckRange(
|
|
Dart_Handle value_obj, int64_t lower, int64_t upper) {
|
|
int64_t value = DartEmbedder::GetIntegerValue(value_obj);
|
|
if (value < lower || upper < value) {
|
|
Dart_PropagateError(Dart_NewApiError("Value outside expected range"));
|
|
}
|
|
return value;
|
|
}
|
|
|
|
intptr_t DartEmbedder::GetIntptrValue(Dart_Handle value_obj) {
|
|
int64_t value = 0;
|
|
Dart_Handle result = Dart_IntegerToInt64(value_obj, &value);
|
|
if (Dart_IsError(result)) {
|
|
Dart_PropagateError(result);
|
|
}
|
|
if (value < INTPTR_MIN || INTPTR_MAX < value) {
|
|
Dart_PropagateError(Dart_NewApiError("Value outside intptr_t range"));
|
|
}
|
|
return static_cast<intptr_t>(value);
|
|
}
|
|
|
|
const char* DartEmbedder::GetStringValue(Dart_Handle str_obj) {
|
|
const char* cstring = nullptr;
|
|
Dart_Handle result = Dart_StringToCString(str_obj, &cstring);
|
|
if (Dart_IsError(result)) {
|
|
Dart_PropagateError(result);
|
|
}
|
|
return cstring;
|
|
}
|
|
|
|
bool DartEmbedder::GetBooleanValue(Dart_Handle bool_obj) {
|
|
bool value = false;
|
|
Dart_Handle result = Dart_BooleanValue(bool_obj, &value);
|
|
if (Dart_IsError(result)) {
|
|
Dart_PropagateError(result);
|
|
}
|
|
return value;
|
|
}
|
|
|
|
void DartEmbedder::SetIntegerField(Dart_Handle handle,
|
|
const char* name,
|
|
int64_t val) {
|
|
Dart_Handle result = Dart_SetField(handle,
|
|
NewCString(name),
|
|
Dart_NewInteger(val));
|
|
if (Dart_IsError(result)) {
|
|
Dart_PropagateError(result);
|
|
}
|
|
}
|
|
|
|
void DartEmbedder::SetStringField(Dart_Handle handle,
|
|
const char* name,
|
|
const char* val) {
|
|
Dart_Handle result = Dart_SetField(handle, NewCString(name), NewCString(val));
|
|
if (Dart_IsError(result)) {
|
|
Dart_PropagateError(result);
|
|
}
|
|
}
|
|
|
|
Dart_Handle DartEmbedder::NewCString(const char* str) {
|
|
CHECK(str != nullptr);
|
|
Dart_Handle result = Dart_NewStringFromCString(str);
|
|
if (Dart_IsError(result)) {
|
|
Dart_PropagateError(result);
|
|
}
|
|
return result;
|
|
}
|
|
|
|
void DartEmbedder::SetNullReturn(Dart_NativeArguments arguments) {
|
|
Dart_SetReturnValue(arguments, Dart_Null());
|
|
}
|
|
|
|
void DartEmbedder::SetCStringReturn(Dart_NativeArguments arguments,
|
|
const char* str) {
|
|
Dart_SetReturnValue(arguments, NewCString(str));
|
|
}
|
|
|
|
const char* DartEmbedder::GetStringArgument(Dart_NativeArguments arguments,
|
|
intptr_t index) {
|
|
Dart_Handle str_arg = Dart_GetNativeArgument(arguments, index);
|
|
const char* cstring = NULL;
|
|
Dart_Handle result = Dart_StringToCString(str_arg, &cstring);
|
|
if (Dart_IsError(result)) {
|
|
Dart_PropagateError(result);
|
|
}
|
|
return cstring;
|
|
}
|
|
|
|
void DartEmbedder::GetTypedDataListArgument(Dart_NativeArguments arguments,
|
|
intptr_t index,
|
|
uint8_t** out,
|
|
intptr_t* out_len) {
|
|
// Initialize outputs.
|
|
*out = NULL;
|
|
*out_len = 0;
|
|
Dart_Handle list_arg = Dart_GetNativeArgument(arguments, index);
|
|
if (Dart_IsError(list_arg)) {
|
|
Dart_PropagateError(list_arg);
|
|
return;
|
|
}
|
|
// Acquire data.
|
|
Dart_TypedData_Type type = Dart_TypedData_kInvalid;
|
|
void* data = NULL;
|
|
intptr_t data_len = 0;
|
|
Dart_Handle result =
|
|
Dart_TypedDataAcquireData(list_arg, &type, &data, &data_len);
|
|
if (Dart_IsError(result)) {
|
|
Dart_PropagateError(result);
|
|
return;
|
|
}
|
|
// Only support Uint8List for now.
|
|
if (type != Dart_TypedData_kUint8) {
|
|
// Release data.
|
|
Dart_TypedDataReleaseData(list_arg);
|
|
Dart_PropagateError(
|
|
Dart_NewApiError("Unimplemented type in "
|
|
"DartEmbedder::GetTypedDataListArgument"));
|
|
return;
|
|
}
|
|
// Copy payload.
|
|
*out = reinterpret_cast<uint8_t*>(malloc(data_len));
|
|
*out_len = data_len;
|
|
memmove(*out, data, data_len);
|
|
// Release data.
|
|
Dart_TypedDataReleaseData(list_arg);
|
|
}
|
|
|
|
Dart_Handle DartEmbedder::MakeUint8TypedData(uint8_t* bytes, intptr_t length) {
|
|
Dart_Handle result = Dart_NewTypedData(Dart_TypedData_kUint8, length);
|
|
if (Dart_IsError(result)) {
|
|
Dart_PropagateError(result);
|
|
}
|
|
Dart_Handle err = Dart_ListSetAsBytes(result, 0, bytes, length);
|
|
if (Dart_IsError(err)) {
|
|
Dart_PropagateError(err);
|
|
}
|
|
return result;
|
|
}
|
|
|
|
} // namespace dart
|
|
} // namespace mojo
|