| // 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_FLUTTER_DESKTOP_MESSENGER_H_ |
| #define FLUTTER_SHELL_PLATFORM_WINDOWS_FLUTTER_DESKTOP_MESSENGER_H_ |
| |
| #include <atomic> |
| #include <mutex> |
| |
| #include "flutter/shell/platform/common/public/flutter_messenger.h" |
| |
| namespace flutter { |
| |
| class FlutterWindowsEngine; |
| |
| /// A messenger object used to invoke platform messages. |
| /// |
| /// On Windows, the message handler is essentially the |FlutterWindowsEngine|, |
| /// this allows a handle to the |FlutterWindowsEngine| that will become |
| /// invalidated if the |FlutterWindowsEngine| is destroyed. |
| class FlutterDesktopMessenger { |
| public: |
| FlutterDesktopMessenger() = default; |
| |
| /// Convert to FlutterDesktopMessengerRef. |
| FlutterDesktopMessengerRef ToRef() { |
| return reinterpret_cast<FlutterDesktopMessengerRef>(this); |
| } |
| |
| /// Convert from FlutterDesktopMessengerRef. |
| static FlutterDesktopMessenger* FromRef(FlutterDesktopMessengerRef ref) { |
| return reinterpret_cast<FlutterDesktopMessenger*>(ref); |
| } |
| |
| /// Getter for the engine field. |
| flutter::FlutterWindowsEngine* GetEngine() const { return engine; } |
| |
| /// Setter for the engine field. |
| /// Thread-safe. |
| void SetEngine(flutter::FlutterWindowsEngine* arg_engine) { |
| std::scoped_lock lock(mutex_); |
| engine = arg_engine; |
| } |
| |
| /// Increments the reference count. |
| /// |
| /// Thread-safe. |
| FlutterDesktopMessenger* AddRef() { |
| ref_count_.fetch_add(1); |
| return this; |
| } |
| |
| /// Decrements the reference count and deletes the object if the count has |
| /// gone to zero. |
| /// |
| /// Thread-safe. |
| void Release() { |
| int32_t old_count = ref_count_.fetch_sub(1); |
| if (old_count <= 1) { |
| delete this; |
| } |
| } |
| |
| /// Returns the mutex associated with the |FlutterDesktopMessenger|. |
| /// |
| /// This mutex is used to synchronize reading or writing state inside the |
| /// |FlutterDesktopMessenger| (ie |engine|). |
| std::mutex& GetMutex() { return mutex_; } |
| |
| FlutterDesktopMessenger(const FlutterDesktopMessenger& value) = delete; |
| FlutterDesktopMessenger& operator=(const FlutterDesktopMessenger& value) = |
| delete; |
| |
| private: |
| // The engine that owns this state object. |
| flutter::FlutterWindowsEngine* engine = nullptr; |
| std::mutex mutex_; |
| std::atomic<int32_t> ref_count_ = 0; |
| }; |
| } // namespace flutter |
| |
| #endif // FLUTTER_SHELL_PLATFORM_WINDOWS_FLUTTER_WINDOW_STATE_H_ |