mirror of
https://github.com/flutter/flutter.git
synced 2026-02-20 02:29:02 +08:00
79 lines
3.0 KiB
C++
79 lines
3.0 KiB
C++
// 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_CPP_INCOMING_MESSAGE_DISPATCHER_H_
|
|
#define FLUTTER_SHELL_PLATFORM_CPP_INCOMING_MESSAGE_DISPATCHER_H_
|
|
|
|
#include <functional>
|
|
#include <map>
|
|
#include <set>
|
|
#include <string>
|
|
#include <utility>
|
|
|
|
#include "flutter/shell/platform/common/cpp/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 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_CPP_INCOMING_MESSAGE_DISPATCHER_H_
|