aboutsummaryrefslogtreecommitdiff
path: root/core
diff options
context:
space:
mode:
Diffstat (limited to 'core')
-rw-r--r--core/bindings/lang/clang/src/data/ngpd_message.rs92
1 files 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