blob: 8088b16a874773b32faf3273cbae1707e1c34fd5 [file] [log] [blame]
// 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_WINDOWS_PLATFORM_HANDLER_H_
#define FLUTTER_SHELL_PLATFORM_WINDOWS_PLATFORM_HANDLER_H_
#include <Windows.h>
#include <functional>
#include <memory>
#include <optional>
#include <variant>
#include "flutter/fml/macros.h"
#include "flutter/shell/platform/common/client_wrapper/include/flutter/binary_messenger.h"
#include "flutter/shell/platform/common/client_wrapper/include/flutter/method_channel.h"
#include "rapidjson/document.h"
namespace flutter {
class FlutterWindowsEngine;
class ScopedClipboardInterface;
// Indicates whether an exit request may be canceled by the framework.
// These values must be kept in sync with kExitTypeNames in platform_handler.cc
enum class AppExitType {
required,
cancelable,
};
// Handler for internal system channels.
class PlatformHandler {
public:
explicit PlatformHandler(
BinaryMessenger* messenger,
FlutterWindowsEngine* engine,
std::optional<std::function<std::unique_ptr<ScopedClipboardInterface>()>>
scoped_clipboard_provider = std::nullopt);
virtual ~PlatformHandler();
// String values used for encoding/decoding exit requests.
static constexpr char kExitTypeCancelable[] = "cancelable";
static constexpr char kExitTypeRequired[] = "required";
// Send a request to the framework to test if a cancelable exit request
// should be canceled or honored. hwnd is std::nullopt for a request to quit
// the process, otherwise it holds the HWND of the window that initiated the
// quit request.
virtual void RequestAppExit(std::optional<HWND> hwnd,
std::optional<WPARAM> wparam,
std::optional<LPARAM> lparam,
AppExitType exit_type,
UINT exit_code);
protected:
// Gets plain text from the clipboard and provides it to |result| as the
// value in a dictionary with the given |key|.
virtual void GetPlainText(
std::unique_ptr<MethodResult<rapidjson::Document>> result,
std::string_view key);
// Provides a boolean to |result| as the value in a dictionary at key
// "value" representing whether or not the clipboard has a non-empty string.
virtual void GetHasStrings(
std::unique_ptr<MethodResult<rapidjson::Document>> result);
// Sets the clipboard's plain text to |text|, and reports the result (either
// an error, or null for success) to |result|.
virtual void SetPlainText(
const std::string& text,
std::unique_ptr<MethodResult<rapidjson::Document>> result);
virtual void SystemSoundPlay(
const std::string& sound_type,
std::unique_ptr<MethodResult<rapidjson::Document>> result);
// Handle a request from the framework to exit the application.
virtual void SystemExitApplication(
AppExitType exit_type,
UINT exit_code,
std::unique_ptr<MethodResult<rapidjson::Document>> result);
// Actually quit the application with the provided exit code. hwnd is
// std::nullopt for a request to quit the process, otherwise it holds the HWND
// of the window that initiated the quit request.
virtual void QuitApplication(std::optional<HWND> hwnd,
std::optional<WPARAM> wparam,
std::optional<LPARAM> lparam,
UINT exit_code);
// Callback from when the cancelable exit request response request is
// answered by the framework. hwnd is std::nullopt for a request to quit the
// process, otherwise it holds the HWND of the window that initiated the quit
// request.
virtual void RequestAppExitSuccess(std::optional<HWND> hwnd,
std::optional<WPARAM> wparam,
std::optional<LPARAM> lparam,
const rapidjson::Document* result,
UINT exit_code);
// A error type to use for error responses.
static constexpr char kClipboardError[] = "Clipboard error";
static constexpr char kSoundTypeAlert[] = "SystemSoundType.alert";
private:
// Called when a method is called on |channel_|;
void HandleMethodCall(
const MethodCall<rapidjson::Document>& method_call,
std::unique_ptr<MethodResult<rapidjson::Document>> result);
// The MethodChannel used for communication with the Flutter engine.
std::unique_ptr<MethodChannel<rapidjson::Document>> channel_;
// A reference to the Flutter engine.
FlutterWindowsEngine* engine_;
// A scoped clipboard provider that can be passed in for mocking in tests.
// Use this to acquire clipboard in each operation to avoid blocking clipboard
// unnecessarily. See flutter/flutter#103205.
std::function<std::unique_ptr<ScopedClipboardInterface>()>
scoped_clipboard_provider_;
FML_DISALLOW_COPY_AND_ASSIGN(PlatformHandler);
};
// A public interface for ScopedClipboard, so that it can be injected into
// PlatformHandler.
class ScopedClipboardInterface {
public:
virtual ~ScopedClipboardInterface(){};
// Attempts to open the clipboard for the given window, returning the error
// code in the case of failure and 0 otherwise.
virtual int Open(HWND window) = 0;
// Returns true if there is string data available to get.
virtual bool HasString() = 0;
// Returns string data from the clipboard.
//
// If getting a string fails, returns the error code.
//
// Open(...) must have succeeded to call this method.
virtual std::variant<std::wstring, int> GetString() = 0;
// Sets the string content of the clipboard, returning the error code on
// failure and 0 otherwise.
//
// Open(...) must have succeeded to call this method.
virtual int SetString(const std::wstring string) = 0;
};
} // namespace flutter
#endif // FLUTTER_SHELL_PLATFORM_WINDOWS_PLATFORM_HANDLER_H_