Skip to content

Commit

Permalink
Added marshalling to main thread messages sent from native side (#422)
Browse files Browse the repository at this point in the history
* Added marshalling to main thread messages sent from native side

---------

Co-authored-by: Anton Sakhon <[email protected]@asakhon2.nb.ipa.dataart.net>
  • Loading branch information
Kofhein and Anton Sakhon authored Sep 6, 2024
1 parent 595f7f5 commit 30b3d4a
Show file tree
Hide file tree
Showing 4 changed files with 36 additions and 15 deletions.
1 change: 1 addition & 0 deletions AUTHORS
Original file line number Diff line number Diff line change
Expand Up @@ -16,3 +16,4 @@ Stanislav Shmarov <[email protected]>
Sebastian Urban <[email protected]>
Ómar Högni Guðmarsson <[email protected]>
Athaariq Ardhiansyah <[email protected]>
Anton Sakhon <[email protected]>
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,11 @@ BinaryMessengerImpl::BinaryMessengerImpl(

BinaryMessengerImpl::~BinaryMessengerImpl() = default;

void CaptureCleaner(void* lambda) {
auto& cleanup = *reinterpret_cast<std::function<void()>*>(lambda);
cleanup();
}

void BinaryMessengerImpl::Send(const std::string& channel,
const uint8_t* message,
size_t message_size,
Expand All @@ -89,10 +94,10 @@ void BinaryMessengerImpl::Send(const std::string& channel,
};
bool result = FlutterDesktopMessengerSendWithReply(
messenger_, channel.c_str(), message, message_size, message_reply,
captures);
if (!result) {
delete captures;
}
captures, [](void* captures_data) {
auto captures = reinterpret_cast<Captures*>(captures_data);
delete captures;
});
}

void BinaryMessengerImpl::SetMessageHandler(const std::string& channel,
Expand Down
3 changes: 2 additions & 1 deletion src/flutter/shell/platform/common/public/flutter_messenger.h
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,8 @@ FLUTTER_EXPORT bool FlutterDesktopMessengerSendWithReply(
const uint8_t* message,
const size_t message_size,
const FlutterDesktopBinaryReply reply,
void* user_data);
void* user_data,
void (*cleanup)(void* captures_data));

// Sends a reply to a FlutterDesktopMessage for the given response handle.
//
Expand Down
34 changes: 24 additions & 10 deletions src/flutter/shell/platform/linux_embedded/flutter_elinux.cc
Original file line number Diff line number Diff line change
Expand Up @@ -199,22 +199,36 @@ void FlutterDesktopPluginRegistrarSetDestructionHandler(
registrar->engine->SetPluginRegistrarDestructionCallback(callback);
}

bool FlutterDesktopMessengerSendWithReply(FlutterDesktopMessengerRef messenger,
const char* channel,
const uint8_t* message,
const size_t message_size,
const FlutterDesktopBinaryReply reply,
void* user_data) {
return messenger->GetEngine()->SendPlatformMessage(
channel, message, message_size, reply, user_data);
bool FlutterDesktopMessengerSendWithReply(
FlutterDesktopMessengerRef messenger,
const char* channel,
const uint8_t* message,
const size_t message_size,
const FlutterDesktopBinaryReply reply,
void* user_data,
void (*cleanup)(void* captures_data)) {
// As we pass data to lambda and it's pointers we need to make sure that we
// send valid data
std::string channel_copy(channel);
std::vector<uint8_t> message_copy(message, message + message_size);

messenger->GetEngine()->task_runner()->PostTask([=]() {
if (!messenger->GetEngine()->SendPlatformMessage(
channel_copy.c_str(), message_copy.data(), message_copy.size(),
reply, user_data) &&
user_data) {
cleanup(user_data);
}
});
return true;
}

bool FlutterDesktopMessengerSend(FlutterDesktopMessengerRef messenger,
const char* channel,
const uint8_t* message,
const size_t message_size) {
return FlutterDesktopMessengerSendWithReply(messenger, channel, message,
message_size, nullptr, nullptr);
return FlutterDesktopMessengerSendWithReply(
messenger, channel, message, message_size, nullptr, nullptr, nullptr);
}

void FlutterDesktopMessengerSendResponse(
Expand Down

0 comments on commit 30b3d4a

Please sign in to comment.