| // 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_ |