From 2f0b005c7855d83073326fe0d0de8e0c75e1c510 Mon Sep 17 00:00:00 2001 From: "1992414357@qq.com" <1992414357@qq.com> Date: Sat, 14 Jun 2025 19:39:53 +0800 Subject: Update ngpd_message.rs free methods --- core/bindings/lang/clang/src/data/ngpd_message.rs | 92 +++++++++++++++++++---- 1 file changed, 76 insertions(+), 16 deletions(-) diff --git a/core/bindings/lang/clang/src/data/ngpd_message.rs b/core/bindings/lang/clang/src/data/ngpd_message.rs index 466b50d..624d0b8 100644 --- a/core/bindings/lang/clang/src/data/ngpd_message.rs +++ b/core/bindings/lang/clang/src/data/ngpd_message.rs @@ -1,7 +1,7 @@ -use std::ffi::{c_char, c_double}; +use std::ffi::{c_char, c_double, CString}; use crate::converter::string_converter::{str_c_to_rs, str_rs_to_c}; -use crate::data::ngpd_game_info::FfiGameInfo; -use crate::data::ngpd_player::FfiPlayer; +use crate::data::ngpd_game_info::{free_game_info, FfiGameInfo}; +use crate::data::ngpd_player::{free_player, FfiPlayer}; use nogamepads_core::data::message::message_enums::{ConnectionMessage, ConnectionResponseMessage, ControlMessage, ExitReason, GameMessage, JoinFailedMessage}; use std::mem::ManuallyDrop; use std::ops::Deref; @@ -483,36 +483,96 @@ impl From<&FfiJoinFailedMessage> for JoinFailedMessage { /// Free ControlMessage #[unsafe(no_mangle)] -pub extern "C" fn free_control_message(msg: FfiControlMessage) { - let _ = msg; +pub unsafe extern "C" fn free_control_message(msg: *mut FfiControlMessage) { + if msg.is_null() { return; } + let msg = Box::from_raw(msg); + + match msg.tag { + FfiControlMessageTag::CtrlMsg => { + if !msg.data.message.is_null() { + drop(CString::from_raw(msg.data.message)); + } + } + FfiControlMessageTag::CtrlAxis => { + let ptr = ManuallyDrop::into_inner(msg.data.key_and_axis); + drop(ptr); + } + FfiControlMessageTag::CtrlDir => { + let ptr = ManuallyDrop::into_inner(msg.data.key_and_direction); + drop(ptr); + } + _ => {} + } } /// Free GameMessage #[unsafe(no_mangle)] -pub extern "C" fn free_game_message(msg: FfiGameMessage) { - let _ = msg; +pub unsafe extern "C" fn free_game_message(msg: *mut FfiGameMessage) { + if msg.is_null() { return; } + let msg = Box::from_raw(msg); + + match msg.tag { + FfiGameMessageTag::GameMsg => { + if !msg.data.message.is_null() { + drop(CString::from_raw(msg.data.message)); + } + } + FfiGameMessageTag::GameLetExit => { + let reason = ManuallyDrop::into_inner(msg.data.exit_reason); + drop(reason); + } + _ => {} + } } /// Free ExitReason #[unsafe(no_mangle)] -pub extern "C" fn free_exit_reason(msg: FfiExitReason) { - let _ = msg; +pub unsafe extern "C" fn free_exit_reason(msg: *mut FfiExitReason) { + if !msg.is_null() { + drop(Box::from_raw(msg)); + } } - /// Free ConnectionMessage #[unsafe(no_mangle)] -pub extern "C" fn free_connection_message(msg: FfiConnectionMessage) { - let _ = msg; +pub unsafe extern "C" fn free_connection_message(msg: *mut FfiConnectionMessage) { + if msg.is_null() { return; } + let msg = Box::from_raw(msg); + + match msg.tag { + FfiConnectionMessageTag::ConnectionJoin => { + let player = ManuallyDrop::into_inner(msg.data.player); + let player_ptr = Box::into_raw(Box::new(player)); + + free_player(player_ptr); + } + _ => {} + } } /// Free ConnectionResponseMessage #[unsafe(no_mangle)] -pub extern "C" fn free_connection_response_message(msg: FfiConnectionResponseMessage) { - let _ = msg; +pub unsafe extern "C" fn free_connection_response_message(msg: *mut FfiConnectionResponseMessage) { + if msg.is_null() { return; } + let msg = Box::from_raw(msg); + + match msg.tag { + FfiConnectionResponseMessageTag::GameInfosResponse => { + let game_info = ManuallyDrop::into_inner(msg.data.game_info); + free_game_info(game_info); + } + FfiConnectionResponseMessageTag::DenyResponse | + FfiConnectionResponseMessageTag::FailResponse => { + let failed_msg = ManuallyDrop::into_inner(msg.data.failed_message); + drop(failed_msg); + } + _ => {} + } } /// Free JoinFailedMessage #[unsafe(no_mangle)] -pub extern "C" fn free_join_failed_message(msg: FfiJoinFailedMessage) { - let _ = msg; +pub unsafe extern "C" fn free_join_failed_message(msg: *mut FfiJoinFailedMessage) { + if !msg.is_null() { + drop(Box::from_raw(msg)); + } } \ No newline at end of file -- cgit