blob: 8f559bf3983a6d76893bcf8d784875ef95c709f6 [file] [log] [blame]
// Copyright 2013 The Flutter 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 "flutter/lib/ui/window/platform_message_response_dart_port.h"
#include <array>
#include <utility>
#include "flutter/common/task_runners.h"
#include "flutter/fml/make_copyable.h"
#include "flutter/fml/trace_event.h"
#include "third_party/dart/runtime/include/dart_native_api.h"
#include "third_party/tonic/converter/dart_converter.h"
#include "third_party/tonic/dart_state.h"
#include "third_party/tonic/logging/dart_invoke.h"
#include "third_party/tonic/typed_data/dart_byte_data.h"
namespace flutter {
PlatformMessageResponseDartPort::PlatformMessageResponseDartPort(
Dart_Port send_port,
int64_t identifier,
const std::string& channel)
: send_port_(send_port), identifier_(identifier), channel_(channel) {
FML_DCHECK(send_port != ILLEGAL_PORT);
}
void PlatformMessageResponseDartPort::Complete(
std::unique_ptr<fml::Mapping> data) {
is_complete_ = true;
Dart_CObject response_identifier = {
.type = Dart_CObject_kInt64,
};
response_identifier.value.as_int64 = identifier_;
Dart_CObject response_data = {
.type = Dart_CObject_kTypedData,
};
response_data.value.as_typed_data.type = Dart_TypedData_kUint8;
response_data.value.as_typed_data.length = data->GetSize();
response_data.value.as_typed_data.values = data->GetMapping();
std::array<Dart_CObject*, 2> response_values = {&response_identifier,
&response_data};
Dart_CObject response = {
.type = Dart_CObject_kArray,
};
response.value.as_array.length = response_values.size();
response.value.as_array.values = response_values.data();
bool did_send = Dart_PostCObject(send_port_, &response);
FML_CHECK(did_send);
}
void PlatformMessageResponseDartPort::CompleteEmpty() {
is_complete_ = true;
Dart_CObject response = {
.type = Dart_CObject_kNull,
};
bool did_send = Dart_PostCObject(send_port_, &response);
FML_CHECK(did_send);
}
} // namespace flutter