| // 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.h" |
| |
| #include <utility> |
| |
| #include "flutter/common/task_runners.h" |
| #include "flutter/fml/make_copyable.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 { |
| |
| PlatformMessageResponseDart::PlatformMessageResponseDart( |
| tonic::DartPersistentValue callback, |
| fml::RefPtr<fml::TaskRunner> ui_task_runner) |
| : callback_(std::move(callback)), |
| ui_task_runner_(std::move(ui_task_runner)) {} |
| |
| PlatformMessageResponseDart::~PlatformMessageResponseDart() { |
| if (!callback_.is_empty()) { |
| ui_task_runner_->PostTask(fml::MakeCopyable( |
| [callback = std::move(callback_)]() mutable { callback.Clear(); })); |
| } |
| } |
| |
| void PlatformMessageResponseDart::Complete(std::unique_ptr<fml::Mapping> data) { |
| if (callback_.is_empty()) { |
| return; |
| } |
| FML_DCHECK(!is_complete_); |
| is_complete_ = true; |
| ui_task_runner_->PostTask(fml::MakeCopyable( |
| [callback = std::move(callback_), data = std::move(data)]() mutable { |
| std::shared_ptr<tonic::DartState> dart_state = |
| callback.dart_state().lock(); |
| if (!dart_state) { |
| return; |
| } |
| tonic::DartState::Scope scope(dart_state); |
| |
| Dart_Handle byte_buffer = |
| tonic::DartByteData::Create(data->GetMapping(), data->GetSize()); |
| tonic::DartInvoke(callback.Release(), {byte_buffer}); |
| })); |
| } |
| |
| void PlatformMessageResponseDart::CompleteEmpty() { |
| if (callback_.is_empty()) { |
| return; |
| } |
| FML_DCHECK(!is_complete_); |
| is_complete_ = true; |
| ui_task_runner_->PostTask( |
| fml::MakeCopyable([callback = std::move(callback_)]() mutable { |
| std::shared_ptr<tonic::DartState> dart_state = |
| callback.dart_state().lock(); |
| if (!dart_state) { |
| return; |
| } |
| tonic::DartState::Scope scope(dart_state); |
| tonic::DartInvoke(callback.Release(), {Dart_Null()}); |
| })); |
| } |
| |
| } // namespace flutter |