// 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& input_block_cb, const std::function& input_unblock_cb) { std::string channel(message.channel); auto callback_iterator = callbacks_.find(channel); // Find the handler for the channel; if there isn't one, report the failure. if (callback_iterator == callbacks_.end()) { FlutterDesktopMessengerSendResponse(messenger_, message.response_handle, nullptr, 0); return; } auto& callback_info = callback_iterator->second; const 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