| // 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/shell/platform/common/incoming_message_dispatcher.h" |
| |
| namespace flutter { |
| |
| IncomingMessageDispatcher::IncomingMessageDispatcher( |
| FlutterDesktopMessengerRef messenger) |
| : messenger_(messenger) {} |
| |
| IncomingMessageDispatcher::~IncomingMessageDispatcher() = default; |
| |
| /// @note Procedure doesn't copy all closures. |
| void IncomingMessageDispatcher::HandleMessage( |
| const FlutterDesktopMessage& message, |
| const std::function<void(void)>& input_block_cb, |
| const std::function<void(void)>& input_unblock_cb) { |
| std::string channel(message.channel); |
| |
| // Find the handler for the channel; if there isn't one, report the failure. |
| if (callbacks_.find(channel) == callbacks_.end()) { |
| FlutterDesktopMessengerSendResponse(messenger_, message.response_handle, |
| nullptr, 0); |
| return; |
| } |
| auto& callback_info = callbacks_[channel]; |
| FlutterDesktopMessageCallback message_callback = callback_info.first; |
| |
| // Process the call, handling input blocking if requested. |
| bool block_input = input_blocking_channels_.count(channel) > 0; |
| if (block_input) { |
| input_block_cb(); |
| } |
| message_callback(messenger_, &message, callback_info.second); |
| if (block_input) { |
| input_unblock_cb(); |
| } |
| } |
| |
| void IncomingMessageDispatcher::SetMessageCallback( |
| const std::string& channel, |
| FlutterDesktopMessageCallback callback, |
| void* user_data) { |
| if (!callback) { |
| callbacks_.erase(channel); |
| return; |
| } |
| callbacks_[channel] = std::make_pair(callback, user_data); |
| } |
| |
| void IncomingMessageDispatcher::EnableInputBlockingForChannel( |
| const std::string& channel) { |
| input_blocking_channels_.insert(channel); |
| } |
| |
| } // namespace flutter |