blob: 8920068e511fe2d8a44fdeb611fffe135713976f [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_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_