|  | // 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. | 
|  |  | 
|  | #ifndef FLUTTER_SHELL_PLATFORM_COMMON_INCOMING_MESSAGE_DISPATCHER_H_ | 
|  | #define FLUTTER_SHELL_PLATFORM_COMMON_INCOMING_MESSAGE_DISPATCHER_H_ | 
|  |  | 
|  | #include <functional> | 
|  | #include <map> | 
|  | #include <set> | 
|  | #include <string> | 
|  | #include <utility> | 
|  |  | 
|  | #include "flutter/shell/platform/common/public/flutter_messenger.h" | 
|  |  | 
|  | namespace flutter { | 
|  |  | 
|  | // Manages per-channel registration of callbacks for handling messages from the | 
|  | // Flutter engine, and dispatching incoming messages to those handlers. | 
|  | class IncomingMessageDispatcher { | 
|  | public: | 
|  | // Creates a new IncomingMessageDispatcher. |messenger| must remain valid as | 
|  | // long as this object exists. | 
|  | explicit IncomingMessageDispatcher(FlutterDesktopMessengerRef messenger); | 
|  |  | 
|  | virtual ~IncomingMessageDispatcher(); | 
|  |  | 
|  | // Prevent copying. | 
|  | IncomingMessageDispatcher(IncomingMessageDispatcher const&) = delete; | 
|  | IncomingMessageDispatcher& operator=(IncomingMessageDispatcher const&) = | 
|  | delete; | 
|  |  | 
|  | // Routes |message| to the registered handler for its channel, if any. | 
|  | // | 
|  | // If input blocking has been enabled on that channel, wraps the call to the | 
|  | // handler with calls to the given callbacks to block and then unblock input. | 
|  | // | 
|  | // If no handler is registered for the message's channel, sends a | 
|  | // NotImplemented response to the engine. | 
|  | void HandleMessage( | 
|  | const FlutterDesktopMessage& message, | 
|  | const std::function<void(void)>& input_block_cb = [] {}, | 
|  | const std::function<void(void)>& input_unblock_cb = [] {}); | 
|  |  | 
|  | // Registers a message callback for incoming messages from the Flutter | 
|  | // side on the specified channel. |callback| will be called with the message | 
|  | // and |user_data| any time a message arrives on that channel. | 
|  | // | 
|  | // Replaces any existing callback. Pass a null callback to unregister the | 
|  | // existing callback. | 
|  | void SetMessageCallback(const std::string& channel, | 
|  | FlutterDesktopMessageCallback callback, | 
|  | void* user_data); | 
|  |  | 
|  | // Enables input blocking on the given channel name. | 
|  | // | 
|  | // If set, then the parent window should disable input callbacks | 
|  | // while waiting for the handler for messages on that channel to run. | 
|  | void EnableInputBlockingForChannel(const std::string& channel); | 
|  |  | 
|  | private: | 
|  | // Handle for interacting with the C messaging API. | 
|  | FlutterDesktopMessengerRef messenger_; | 
|  |  | 
|  | // A map from channel names to the FlutterDesktopMessageCallback that should | 
|  | // be called for incoming messages on that channel, along with the void* user | 
|  | // data to pass to it. | 
|  | std::map<std::string, std::pair<FlutterDesktopMessageCallback, void*>> | 
|  | callbacks_; | 
|  |  | 
|  | // Channel names for which input blocking should be enabled during the call to | 
|  | // that channel's handler. | 
|  | std::set<std::string> input_blocking_channels_; | 
|  | }; | 
|  |  | 
|  | }  // namespace flutter | 
|  |  | 
|  | #endif  // FLUTTER_SHELL_PLATFORM_COMMON_INCOMING_MESSAGE_DISPATCHER_H_ |