aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author1992414357@qq.com <1992414357@qq.com>2025-05-29 07:55:41 +0800
committer1992414357@qq.com <1992414357@qq.com>2025-05-29 07:55:41 +0800
commit9d3d6d4195e58c51166811d8357a331d53c4cdd4 (patch)
tree2e1d8abfee06a05b3ded9c6d5cd99574412af665
parent7bf8e1f24f95d87e1a30765b1904473cf75b435b (diff)
正在编写 C# 绑定部分
-rw-r--r--.idea/runConfigurations/Release_Project.xml2
-rw-r--r--.idea/runConfigurations/Run_Client_Console.xml19
-rw-r--r--.idea/runConfigurations/Run_Server_Console.xml19
-rw-r--r--core/src/pad_service/client.rs24
-rw-r--r--core_c/src/data_c/connection_callback_message_c.rs30
-rw-r--r--core_c/src/data_c/connection_message_c.rs20
-rw-r--r--core_c/src/data_c/control_message_c.rs28
-rw-r--r--core_c/src/data_c/game_message_c.rs18
-rw-r--r--core_c/src/data_c/game_profile_c.rs101
-rw-r--r--core_c/src/data_c/player_info_c.rs96
-rw-r--r--core_c/src/data_c/player_info_list_c.rs4
-rw-r--r--core_c/src/lib.rs4
-rw-r--r--core_c/src/service_c/padclient.rs99
-rw-r--r--core_c/src/service_c/padserver.rs65
-rw-r--r--core_csharp/NoGamepadsSharp/NoGamepadsSharp_Core/Data/HsvColor.cs158
-rw-r--r--core_csharp/NoGamepadsSharp/NoGamepadsSharp_Core/Data/PlayerInfo.cs15
-rw-r--r--core_csharp/NoGamepadsSharp/NoGamepadsSharp_Core/obj/Debug/net8.0/NoGamepadsSharp_Core.AssemblyInfo.cs2
-rw-r--r--core_csharp/NoGamepadsSharp/NoGamepadsSharp_Core/obj/Debug/net8.0/NoGamepadsSharp_Core.AssemblyInfoInputs.cache2
-rw-r--r--core_csharp/NoGamepadsSharp/NoGamepadsSharp_Execute/Program.cs13
-rw-r--r--core_csharp/NoGamepadsSharp/NoGamepadsSharp_Execute/bin/Debug/net8.0/NoGamepadsSharp_Execute.deps.json23
-rw-r--r--core_csharp/NoGamepadsSharp/NoGamepadsSharp_Execute/bin/Debug/net8.0/NoGamepadsSharp_Execute.dllbin0 -> 5120 bytes
-rw-r--r--core_csharp/NoGamepadsSharp/NoGamepadsSharp_Execute/bin/Debug/net8.0/NoGamepadsSharp_Execute.exebin0 -> 139264 bytes
-rw-r--r--core_csharp/NoGamepadsSharp/NoGamepadsSharp_Execute/bin/Debug/net8.0/NoGamepadsSharp_Execute.pdbbin0 -> 10760 bytes
-rw-r--r--core_csharp/NoGamepadsSharp/NoGamepadsSharp_Execute/bin/Debug/net8.0/NoGamepadsSharp_Execute.runtimeconfig.json12
-rw-r--r--core_csharp/NoGamepadsSharp/NoGamepadsSharp_Execute/bin/Debug/net8.0/nogamepads_lib_c.dllbin0 -> 2128896 bytes
-rw-r--r--core_csharp/NoGamepadsSharp/NoGamepadsSharp_Execute/obj/Debug/net8.0/NoGamepadsSharp_Execute.AssemblyInfo.cs2
-rw-r--r--core_csharp/NoGamepadsSharp/NoGamepadsSharp_Execute/obj/Debug/net8.0/NoGamepadsSharp_Execute.AssemblyInfoInputs.cache2
-rw-r--r--core_csharp/NoGamepadsSharp/NoGamepadsSharp_Execute/obj/Debug/net8.0/NoGamepadsSharp_Execute.csproj.CoreCompileInputs.cache1
-rw-r--r--core_csharp/NoGamepadsSharp/NoGamepadsSharp_Execute/obj/Debug/net8.0/NoGamepadsSharp_Execute.csproj.FileListAbsolute.txt15
-rw-r--r--core_csharp/NoGamepadsSharp/NoGamepadsSharp_Execute/obj/Debug/net8.0/NoGamepadsSharp_Execute.dllbin0 -> 5120 bytes
-rw-r--r--core_csharp/NoGamepadsSharp/NoGamepadsSharp_Execute/obj/Debug/net8.0/NoGamepadsSharp_Execute.genruntimeconfig.cache1
-rw-r--r--core_csharp/NoGamepadsSharp/NoGamepadsSharp_Execute/obj/Debug/net8.0/NoGamepadsSharp_Execute.pdbbin0 -> 10760 bytes
-rw-r--r--core_csharp/NoGamepadsSharp/NoGamepadsSharp_Execute/obj/Debug/net8.0/NoGamepadsSharp_Execute.sourcelink.json1
-rw-r--r--core_csharp/NoGamepadsSharp/NoGamepadsSharp_Execute/obj/Debug/net8.0/apphost.exebin0 -> 139264 bytes
-rw-r--r--core_csharp/NoGamepadsSharp/NoGamepadsSharp_Execute/obj/Debug/net8.0/ref/NoGamepadsSharp_Execute.dllbin0 -> 6144 bytes
-rw-r--r--core_csharp/NoGamepadsSharp/NoGamepadsSharp_Execute/obj/Debug/net8.0/refint/NoGamepadsSharp_Execute.dllbin0 -> 6144 bytes
-rw-r--r--core_csharp/NoGamepadsSharp/NoGamepadsSharp_Execute/obj/rider.project.model.nuget.info1
-rw-r--r--release/0.1.0/bin/nogpadc.exebin2237440 -> 2237440 bytes
-rw-r--r--release/0.1.0/bin/nogpads.exebin2194432 -> 2195456 bytes
-rw-r--r--release/0.1.0/bridge/nogamepads.h106
-rw-r--r--release/0.1.0/bridge/nogamepads_cpp.h94
-rw-r--r--release/0.1.0/bridge/nogamepads_lib_c.dllbin2114560 -> 2128896 bytes
42 files changed, 755 insertions, 222 deletions
diff --git a/.idea/runConfigurations/Release_Project.xml b/.idea/runConfigurations/Release_Project.xml
index 8cd901d..b614f1b 100644
--- a/.idea/runConfigurations/Release_Project.xml
+++ b/.idea/runConfigurations/Release_Project.xml
@@ -14,7 +14,7 @@
<option name="isRedirectInput" value="false" />
<option name="redirectInputPath" value="" />
<method v="2">
- <option name="CARGO.BUILD_TASK_PROVIDER" enabled="true" />
+ <option name="RunConfigurationTask" enabled="true" run_configuration_name="Final Build" run_configuration_type="CargoCommandRunConfiguration" />
</method>
</configuration>
</component> \ No newline at end of file
diff --git a/.idea/runConfigurations/Run_Client_Console.xml b/.idea/runConfigurations/Run_Client_Console.xml
new file mode 100644
index 0000000..f0ea024
--- /dev/null
+++ b/.idea/runConfigurations/Run_Client_Console.xml
@@ -0,0 +1,19 @@
+<component name="ProjectRunConfigurationManager">
+ <configuration default="false" name="Run Client Console" type="CargoCommandRunConfiguration" factoryName="Cargo Command">
+ <option name="command" value="run --package nogamepads-core --example start_client_console" />
+ <option name="workingDirectory" value="file://$PROJECT_DIR$" />
+ <envs />
+ <option name="emulateTerminal" value="true" />
+ <option name="channel" value="DEFAULT" />
+ <option name="requiredFeatures" value="true" />
+ <option name="allFeatures" value="false" />
+ <option name="withSudo" value="false" />
+ <option name="buildTarget" value="REMOTE" />
+ <option name="backtrace" value="SHORT" />
+ <option name="isRedirectInput" value="false" />
+ <option name="redirectInputPath" value="" />
+ <method v="2">
+ <option name="CARGO.BUILD_TASK_PROVIDER" enabled="true" />
+ </method>
+ </configuration>
+</component> \ No newline at end of file
diff --git a/.idea/runConfigurations/Run_Server_Console.xml b/.idea/runConfigurations/Run_Server_Console.xml
new file mode 100644
index 0000000..14e6f92
--- /dev/null
+++ b/.idea/runConfigurations/Run_Server_Console.xml
@@ -0,0 +1,19 @@
+<component name="ProjectRunConfigurationManager">
+ <configuration default="false" name="Run Server Console" type="CargoCommandRunConfiguration" factoryName="Cargo Command">
+ <option name="command" value="run --package nogamepads-core --example start_server_console" />
+ <option name="workingDirectory" value="file://$PROJECT_DIR$" />
+ <envs />
+ <option name="emulateTerminal" value="true" />
+ <option name="channel" value="DEFAULT" />
+ <option name="requiredFeatures" value="true" />
+ <option name="allFeatures" value="false" />
+ <option name="withSudo" value="false" />
+ <option name="buildTarget" value="REMOTE" />
+ <option name="backtrace" value="SHORT" />
+ <option name="isRedirectInput" value="false" />
+ <option name="redirectInputPath" value="" />
+ <method v="2">
+ <option name="CARGO.BUILD_TASK_PROVIDER" enabled="true" />
+ </method>
+ </configuration>
+</component> \ No newline at end of file
diff --git a/core/src/pad_service/client.rs b/core/src/pad_service/client.rs
index be7784d..c0b8282 100644
--- a/core/src/pad_service/client.rs
+++ b/core/src/pad_service/client.rs
@@ -92,8 +92,9 @@ pub mod nogamepads_client {
}
}
- pub fn enable_console(&mut self) {
+ pub fn enable_console(&mut self) -> &mut PadClient {
self.enable_console = true;
+ self
}
pub fn quiet(&mut self) -> &mut PadClient {
@@ -101,8 +102,27 @@ pub mod nogamepads_client {
self
}
- pub fn bind_player(&mut self, player: PlayerInfo) {
+ pub fn bind_player(&mut self, player: PlayerInfo) -> &mut PadClient {
self.bind_player = player;
+ self
+ }
+
+ pub fn clone_addr(&self) -> (IpAddr, u16) {
+ (self.target_address, self.target_port)
+ }
+
+ pub fn is_quiet(&self) -> bool {
+ self.quiet
+ }
+
+ pub fn is_enable_console(&self) -> bool {
+ self.enable_console
+ }
+
+ pub fn unbind_player(&mut self) -> PlayerInfo {
+ let player = self.bind_player.clone();
+ self.bind_player = PlayerInfo::new();
+ player
}
}
diff --git a/core_c/src/data_c/connection_callback_message_c.rs b/core_c/src/data_c/connection_callback_message_c.rs
index bb96a0d..e23b6f6 100644
--- a/core_c/src/data_c/connection_callback_message_c.rs
+++ b/core_c/src/data_c/connection_callback_message_c.rs
@@ -1,12 +1,12 @@
+use crate::data_c::game_profile_c::GameProfileC;
+use nogamepads_lib_rs::pad_data::pad_messages::nogamepads_messages::{ConnectionCallbackMessage, ConnectionErrorType};
use std::ffi::c_void;
use std::mem::ManuallyDrop;
use std::ptr::null_mut;
-use nogamepads_lib_rs::pad_data::game_profile::game_profile::GameProfile;
-use nogamepads_lib_rs::pad_data::pad_messages::nogamepads_messages::{ConnectionCallbackMessage, ConnectionErrorType};
#[repr(C)]
#[allow(unused_imports)]
-pub struct ConnCallbackMsgC {
+pub struct ConnectionCallbackMessageC {
tag: ConnCallbackMsgCTag,
data: ConnCallbackMsgCUnion,
}
@@ -21,7 +21,7 @@ pub enum ConnCallbackMsgCTag {
#[allow(unused_imports)]
pub union ConnCallbackMsgCUnion {
nul: *mut c_void,
- profile: ManuallyDrop<GameProfile>,
+ profile: ManuallyDrop<GameProfileC>,
conn_err: ConnErrTypeC
}
@@ -56,12 +56,12 @@ impl From<ConnectionErrorType> for ConnErrTypeC {
}
}
-impl From<ConnCallbackMsgC> for ConnectionCallbackMessage {
- fn from(mut value: ConnCallbackMsgC) -> Self {
+impl From<ConnectionCallbackMessageC> for ConnectionCallbackMessage {
+ fn from(mut value: ConnectionCallbackMessageC) -> Self {
match value.tag {
ConnCallbackMsgCTag::Profile => unsafe {
let profile = ManuallyDrop::take(&mut value.data.profile);
- ConnectionCallbackMessage::Profile(profile)
+ ConnectionCallbackMessage::Profile(profile.into())
}
ConnCallbackMsgCTag::Deny => unsafe {
ConnectionCallbackMessage::Deny(value.data.conn_err.into())
@@ -83,43 +83,43 @@ impl From<ConnCallbackMsgC> for ConnectionCallbackMessage {
}
}
-impl From<ConnectionCallbackMessage> for ConnCallbackMsgC {
+impl From<ConnectionCallbackMessage> for ConnectionCallbackMessageC {
fn from(value: ConnectionCallbackMessage) -> Self {
match value {
ConnectionCallbackMessage::Profile(profile) => {
- ConnCallbackMsgC {
+ ConnectionCallbackMessageC {
tag: ConnCallbackMsgCTag::Profile,
data: ConnCallbackMsgCUnion {
- profile: ManuallyDrop::new(profile)
+ profile: ManuallyDrop::new(profile.into())
}
}
}
ConnectionCallbackMessage::Deny(conn_err) => {
- ConnCallbackMsgC {
+ ConnectionCallbackMessageC {
tag: ConnCallbackMsgCTag::Deny,
data: ConnCallbackMsgCUnion { conn_err: conn_err.into() }
}
}
ConnectionCallbackMessage::Fail(conn_err) => {
- ConnCallbackMsgC {
+ ConnectionCallbackMessageC {
tag: ConnCallbackMsgCTag::Fail,
data: ConnCallbackMsgCUnion { conn_err: conn_err.into() }
}
}
ConnectionCallbackMessage::Ok => {
- ConnCallbackMsgC {
+ ConnectionCallbackMessageC {
tag: ConnCallbackMsgCTag::Ok,
data: ConnCallbackMsgCUnion { nul: null_mut() }
}
}
ConnectionCallbackMessage::Welcome => {
- ConnCallbackMsgC {
+ ConnectionCallbackMessageC {
tag: ConnCallbackMsgCTag::Welcome,
data: ConnCallbackMsgCUnion { nul: null_mut() }
}
}
ConnectionCallbackMessage::Err => {
- ConnCallbackMsgC {
+ ConnectionCallbackMessageC {
tag: ConnCallbackMsgCTag::Err,
data: ConnCallbackMsgCUnion { nul: null_mut() }
}
diff --git a/core_c/src/data_c/connection_message_c.rs b/core_c/src/data_c/connection_message_c.rs
index 14a49ac..418342d 100644
--- a/core_c/src/data_c/connection_message_c.rs
+++ b/core_c/src/data_c/connection_message_c.rs
@@ -7,7 +7,7 @@ use nogamepads_lib_rs::pad_data::pad_player_info::nogamepads_player_info::Player
#[repr(C)]
#[allow(unused_imports)]
-pub struct ConnMsgC {
+pub struct ConnectionMessageC {
tag: ConnMsgCTag,
data: ConnMsgCUnion
}
@@ -25,8 +25,8 @@ pub union ConnMsgCUnion {
info: ManuallyDrop<PlayerInfo>
}
-impl From<ConnMsgC> for ConnectionMessage {
- fn from(mut value: ConnMsgC) -> Self {
+impl From<ConnectionMessageC> for ConnectionMessage {
+ fn from(mut value: ConnectionMessageC) -> Self {
match value.tag {
Connection => unsafe {
let info = ManuallyDrop::take(&mut value.data.info);
@@ -51,41 +51,41 @@ impl From<ConnMsgC> for ConnectionMessage {
}
}
-impl From<ConnectionMessage> for ConnMsgC {
+impl From<ConnectionMessage> for ConnectionMessageC {
fn from(value: ConnectionMessage) -> Self {
match value {
ConnectionMessage::Connection(info) => {
- ConnMsgC {
+ ConnectionMessageC {
tag: Connection,
data: ConnMsgCUnion { info: ManuallyDrop::new(info) }
}
}
ConnectionMessage::RequestProfile => {
- ConnMsgC {
+ ConnectionMessageC {
tag: RequestProfile,
data: ConnMsgCUnion { nul: null_mut() }
}
}
ConnectionMessage::RequestLayoutConfigure => {
- ConnMsgC {
+ ConnectionMessageC {
tag: RequestLayoutConfigure,
data: ConnMsgCUnion { nul: null_mut() }
}
}
ConnectionMessage::RequestSkinPackage => {
- ConnMsgC {
+ ConnectionMessageC {
tag: RequestSkinPackage,
data: ConnMsgCUnion { nul: null_mut() }
}
}
ConnectionMessage::Ready => {
- ConnMsgC {
+ ConnectionMessageC {
tag: Ready,
data: ConnMsgCUnion { nul: null_mut() }
}
}
ConnectionMessage::Err => {
- ConnMsgC {
+ ConnectionMessageC {
tag: ConnMsgCTag::Err,
data: ConnMsgCUnion { nul: null_mut() }
}
diff --git a/core_c/src/data_c/control_message_c.rs b/core_c/src/data_c/control_message_c.rs
index 41a3e09..84f2288 100644
--- a/core_c/src/data_c/control_message_c.rs
+++ b/core_c/src/data_c/control_message_c.rs
@@ -1,12 +1,12 @@
use crate::data_c::common::KeyData;
-use crate::{c_char_to_string_safe, string_to_c_char_safe};
+use crate::{str_c_to_rs, str_rs_to_c};
use nogamepads_lib_rs::pad_data::pad_messages::nogamepads_messages::ControlMessage;
use std::ffi::{c_char, c_void};
use std::ptr::null_mut;
#[repr(C)]
#[allow(unused_imports)]
-pub struct CtrlMsgC {
+pub struct ControlMessageC {
tag: CtrlMsgCTag,
data: CtrlMsgCUnion
}
@@ -51,11 +51,11 @@ pub struct StrData {
str: *const c_char
}
-impl From<CtrlMsgC> for ControlMessage {
- fn from(msg_c: CtrlMsgC) -> Self {
+impl From<ControlMessageC> for ControlMessage {
+ fn from(msg_c: ControlMessageC) -> Self {
match msg_c.tag {
CtrlMsgCTag::Msg => unsafe {
- let str = c_char_to_string_safe(msg_c.data.str.str);
+ let str = str_c_to_rs(msg_c.data.str.str);
if str.is_some() {
ControlMessage::Msg(str.unwrap())
} else {
@@ -86,19 +86,19 @@ impl From<CtrlMsgC> for ControlMessage {
}
}
-impl From<ControlMessage> for CtrlMsgC {
+impl From<ControlMessage> for ControlMessageC {
fn from(msg_rs: ControlMessage) -> Self {
match msg_rs {
ControlMessage::Msg(str_msg) => {
- CtrlMsgC {
+ ControlMessageC {
tag: CtrlMsgCTag::Msg,
data: CtrlMsgCUnion {
- str: StrData { str: string_to_c_char_safe(str_msg).1 },
+ str: StrData { str: str_rs_to_c(str_msg).1 },
}
}
}
ControlMessage::Pressed(key) => {
- CtrlMsgC {
+ ControlMessageC {
tag: CtrlMsgCTag::Pressed,
data: CtrlMsgCUnion {
key: KeyData { key },
@@ -106,7 +106,7 @@ impl From<ControlMessage> for CtrlMsgC {
}
}
ControlMessage::Released(key) => {
- CtrlMsgC {
+ ControlMessageC {
tag: CtrlMsgCTag::Released,
data: CtrlMsgCUnion {
key: KeyData { key },
@@ -114,7 +114,7 @@ impl From<ControlMessage> for CtrlMsgC {
}
}
ControlMessage::Axis(key, ax) => {
- CtrlMsgC {
+ ControlMessageC {
tag: CtrlMsgCTag::Axis,
data: CtrlMsgCUnion {
axis: AxisData { key, ax }
@@ -122,7 +122,7 @@ impl From<ControlMessage> for CtrlMsgC {
}
}
ControlMessage::Dir(key, (x, y)) => {
- CtrlMsgC {
+ ControlMessageC {
tag: CtrlMsgCTag::Dir,
data: CtrlMsgCUnion {
dir: DirData { key, x, y }
@@ -130,7 +130,7 @@ impl From<ControlMessage> for CtrlMsgC {
}
}
ControlMessage::Exit => {
- CtrlMsgC {
+ ControlMessageC {
tag: CtrlMsgCTag::Exit,
data: CtrlMsgCUnion {
nul: null_mut(),
@@ -138,7 +138,7 @@ impl From<ControlMessage> for CtrlMsgC {
}
}
ControlMessage::Err => {
- CtrlMsgC {
+ ControlMessageC {
tag: CtrlMsgCTag::Err,
data: CtrlMsgCUnion {
nul: null_mut(),
diff --git a/core_c/src/data_c/game_message_c.rs b/core_c/src/data_c/game_message_c.rs
index 8b275ff..b6a2b89 100644
--- a/core_c/src/data_c/game_message_c.rs
+++ b/core_c/src/data_c/game_message_c.rs
@@ -5,7 +5,7 @@ use crate::data_c::common::KeyData;
#[repr(C)]
#[allow(unused_imports)]
-pub struct GameMsgC {
+pub struct GameMessageC {
tag: GameMsgCTag,
data: GameMsgCUnion
}
@@ -54,8 +54,8 @@ impl From<LeaveReason> for LeaveReasonData {
}
}
-impl From<GameMsgC> for GameMessage {
- fn from(msg: GameMsgC) -> Self {
+impl From<GameMessageC> for GameMessage {
+ fn from(msg: GameMessageC) -> Self {
match msg.tag {
GameMsgCTag::SkinEventTrigger => unsafe {
GameMessage::SkinEventTrigger(msg.data.key.key)
@@ -76,35 +76,35 @@ impl From<GameMsgC> for GameMessage {
}
}
-impl From<GameMessage> for GameMsgC {
+impl From<GameMessage> for GameMessageC {
fn from(msg: GameMessage) -> Self {
match msg {
GameMessage::SkinEventTrigger(key) => {
- GameMsgC {
+ GameMessageC {
tag: GameMsgCTag::SkinEventTrigger,
data: GameMsgCUnion { key: KeyData { key } }
}
}
GameMessage::DisableKey(key) => {
- GameMsgC {
+ GameMessageC {
tag: GameMsgCTag::DisableKey,
data: GameMsgCUnion { key: KeyData { key } }
}
}
GameMessage::EnableKey(key) => {
- GameMsgC {
+ GameMessageC {
tag: GameMsgCTag::EnableKey,
data: GameMsgCUnion { key: KeyData { key } }
}
}
GameMessage::Leave(reason) => {
- GameMsgC {
+ GameMessageC {
tag: GameMsgCTag::Leave,
data: GameMsgCUnion { reason: reason.into() }
}
}
GameMessage::Err => {
- GameMsgC {
+ GameMessageC {
tag: GameMsgCTag::Err,
data: GameMsgCUnion { nul: null_mut() }
}
diff --git a/core_c/src/data_c/game_profile_c.rs b/core_c/src/data_c/game_profile_c.rs
index 199329a..d0072c8 100644
--- a/core_c/src/data_c/game_profile_c.rs
+++ b/core_c/src/data_c/game_profile_c.rs
@@ -1,44 +1,101 @@
-use std::ffi::c_char;
-use crate::{box_into_raw, c_char_to_string_safe};
+use crate::{str_c_to_rs, str_rs_to_c};
use nogamepads_lib_rs::pad_data::game_profile::game_profile::GameProfile;
+use std::ffi::c_char;
+
+#[repr(C)]
+#[derive(Copy, Clone)]
+#[allow(unused_imports)]
+pub struct GameProfileC {
+ game_name: *const c_char,
+ game_description: *const c_char,
+ organization: *const c_char,
+ version: *const c_char,
+ website: *const c_char,
+ email: *const c_char
+}
+
+impl From<GameProfileC> for GameProfile {
+ fn from(value: GameProfileC) -> Self {
+ let unknown = "".to_string();
+ GameProfile {
+ game_name: str_c_to_rs(value.game_name).unwrap_or(unknown.clone()),
+ game_description: str_c_to_rs(value.game_description).unwrap_or(unknown.clone()),
+ organization: str_c_to_rs(value.organization).unwrap_or(unknown.clone()),
+ version: str_c_to_rs(value.version).unwrap_or(unknown.clone()),
+ website: str_c_to_rs(value.website).unwrap_or(unknown.clone()),
+ email: str_c_to_rs(value.email).unwrap_or(unknown.clone())
+ }
+ }
+}
+
+impl From<GameProfile> for GameProfileC {
+ fn from(value: GameProfile) -> Self {
+ GameProfileC {
+ game_name: str_rs_to_c(value.game_name).1,
+ game_description: str_rs_to_c(value.game_description).1,
+ organization: str_rs_to_c(value.organization).1,
+ version: str_rs_to_c(value.version).1,
+ website: str_rs_to_c(value.website).1,
+ email: str_rs_to_c(value.email).1
+ }
+ }
+}
+
+impl From<&GameProfileC> for &GameProfile {
+ fn from(value: &GameProfileC) -> Self {
+ value.into()
+ }
+}
+
+impl From<&GameProfile> for &GameProfileC {
+ fn from(value: &GameProfile) -> Self {
+ value.into()
+ }
+}
#[unsafe(no_mangle)]
-pub extern "C" fn init_game_profile() -> *mut GameProfile {
- box_into_raw!(GameProfile::default())
+pub extern "C" fn init_game_profile() -> GameProfileC {
+ GameProfile::default().into()
}
#[unsafe(no_mangle)]
-pub extern "C" fn set_game_profile_name(game_profile: &mut GameProfile, value: *const c_char) {
- let value = c_char_to_string_safe(value).unwrap_or_default();
- game_profile.game_name(value.as_str());
+pub extern "C" fn set_game_profile_name(game_profile: GameProfileC, value: *const c_char) -> GameProfileC {
+ let value = str_c_to_rs(value).unwrap_or_default();
+ let mut raw = GameProfile::from(game_profile);
+ raw.game_name(value.as_str()).to_owned().into()
}
#[unsafe(no_mangle)]
-pub extern "C" fn set_game_profile_description(game_profile: &mut GameProfile, value: *const c_char) {
- let value = c_char_to_string_safe(value).unwrap_or_default();
- game_profile.game_description(value.as_str());
+pub extern "C" fn set_game_profile_description(game_profile: GameProfileC, value: *const c_char) -> GameProfileC {
+ let value = str_c_to_rs(value).unwrap_or_default();
+ let mut raw = GameProfile::from(game_profile);
+ raw.game_description(value.as_str()).to_owned().into()
}
#[unsafe(no_mangle)]
-pub extern "C" fn set_game_profile_organization(game_profile: &mut GameProfile, value: *const c_char) {
- let value = c_char_to_string_safe(value).unwrap_or_default();
- game_profile.organization(value.as_str());
+pub extern "C" fn set_game_profile_organization(game_profile: GameProfileC, value: *const c_char) -> GameProfileC {
+ let value = str_c_to_rs(value).unwrap_or_default();
+ let mut raw = GameProfile::from(game_profile);
+ raw.organization(value.as_str()).to_owned().into()
}
#[unsafe(no_mangle)]
-pub extern "C" fn set_game_profile_version(game_profile: &mut GameProfile, value: *const c_char) {
- let value = c_char_to_string_safe(value).unwrap_or_default();
- game_profile.version(value.as_str());
+pub extern "C" fn set_game_profile_version(game_profile: GameProfileC, value: *const c_char) -> GameProfileC {
+ let value = str_c_to_rs(value).unwrap_or_default();
+ let mut raw = GameProfile::from(game_profile);
+ raw.version(value.as_str()).to_owned().into()
}
#[unsafe(no_mangle)]
-pub extern "C" fn set_game_profile_website(game_profile: &mut GameProfile, value: *const c_char) {
- let value = c_char_to_string_safe(value).unwrap_or_default();
- game_profile.website(value.as_str());
+pub extern "C" fn set_game_profile_website(game_profile: GameProfileC, value: *const c_char) -> GameProfileC {
+ let value = str_c_to_rs(value).unwrap_or_default();
+ let mut raw = GameProfile::from(game_profile);
+ raw.website(value.as_str()).to_owned().into()
}
#[unsafe(no_mangle)]
-pub extern "C" fn set_game_profile_email(game_profile: &mut GameProfile, value: *const c_char) {
- let value = c_char_to_string_safe(value).unwrap_or_default();
- game_profile.email(value.as_str());
+pub extern "C" fn set_game_profile_email(game_profile: GameProfileC, value: *const c_char) -> GameProfileC {
+ let value = str_c_to_rs(value).unwrap_or_default();
+ let mut raw = GameProfile::from(game_profile);
+ raw.email(value.as_str()).to_owned().into()
} \ No newline at end of file
diff --git a/core_c/src/data_c/player_info_c.rs b/core_c/src/data_c/player_info_c.rs
index 4252b49..f51a9f9 100644
--- a/core_c/src/data_c/player_info_c.rs
+++ b/core_c/src/data_c/player_info_c.rs
@@ -1,33 +1,95 @@
+use crate::{str_c_to_rs, str_rs_to_c};
+use nogamepads_lib_rs::pad_data::pad_player_info::nogamepads_player_info::{PlayerAccountInfo, PlayerCustomizeInfo, PlayerInfo};
use std::ffi::c_char;
-use nogamepads_lib_rs::pad_data::pad_player_info::nogamepads_player_info::PlayerInfo;
-use crate::{box_into_raw, c_char_to_string_safe};
+
+#[repr(C)]
+#[derive(Copy, Clone)]
+#[allow(unused_imports)]
+pub struct PlayerInfoC {
+ account_id: *const c_char,
+ account_hash: *const c_char,
+
+ customize_nickname: *const c_char,
+ customize_color_hue: i32,
+ customize_color_saturation: f64,
+ customize_color_value: f64,
+}
+
+impl From<PlayerInfoC> for PlayerInfo {
+ fn from(value: PlayerInfoC) -> Self {
+ let unknown = "unknown".to_string();
+ PlayerInfo {
+ account : PlayerAccountInfo {
+ id: str_c_to_rs(value.account_id).unwrap_or(unknown.clone()),
+ player_hash: str_c_to_rs(value.account_hash).unwrap_or(unknown.clone()),
+ },
+ customize: PlayerCustomizeInfo {
+ nickname: str_c_to_rs(value.customize_nickname).unwrap_or(unknown.clone()),
+ color_hue: value.customize_color_hue,
+ color_saturation: value.customize_color_saturation,
+ color_value: value.customize_color_value,
+ }
+ }
+ }
+}
+
+impl From<PlayerInfo> for PlayerInfoC {
+ fn from(value: PlayerInfo) -> Self {
+ PlayerInfoC {
+ account_id: str_rs_to_c(value.account.id).1,
+ account_hash: str_rs_to_c(value.account.player_hash).1,
+ customize_nickname: str_rs_to_c(value.customize.nickname).1,
+ customize_color_hue: value.customize.color_hue,
+ customize_color_saturation: value.customize.color_saturation,
+ customize_color_value: value.customize.color_value,
+ }
+ }
+}
+
+impl From<&PlayerInfoC> for &PlayerInfo {
+ fn from(value: &PlayerInfoC) -> Self {
+ value.into()
+ }
+}
+
+impl From<&PlayerInfo> for &PlayerInfoC {
+ fn from(value: &PlayerInfo) -> Self {
+ value.into()
+ }
+}
#[unsafe(no_mangle)]
-pub extern "C" fn init_player_info() -> *mut PlayerInfo {
- box_into_raw!(PlayerInfo::new())
+pub extern "C" fn init_player_info() -> PlayerInfoC {
+ PlayerInfo::new().into()
}
#[unsafe(no_mangle)]
pub extern "C" fn set_player_info_account(
- info: &mut PlayerInfo,
- id: *const c_char,
- password: *const c_char) {
- let id = c_char_to_string_safe(id).unwrap_or("".to_string());
- let password = c_char_to_string_safe(password).unwrap_or("".to_string());
- info.setup_account_info(id.as_str(), password.as_str());
+ info: PlayerInfoC, id: *const c_char, password: *const c_char) -> PlayerInfoC {
+
+ let id = str_c_to_rs(id).unwrap_or("".to_string());
+ let password = str_c_to_rs(password).unwrap_or("".to_string());
+
+ let mut raw_info = PlayerInfo::from(info);
+ raw_info.setup_account_info(id.as_str(), password.as_str());
+ raw_info.into()
}
#[unsafe(no_mangle)]
pub extern "C" fn set_player_info_color(
- info: &mut PlayerInfo,
- h: i32, s: f64, v: f64) {
- info.set_customize_color_hsv(h, s, v);
+ info: PlayerInfoC, h: i32, s: f64, v: f64) -> PlayerInfoC {
+
+ let mut raw_info = PlayerInfo::from(info);
+ raw_info.set_customize_color_hsv(h, s, v);
+ raw_info.into()
}
#[unsafe(no_mangle)]
pub extern "C" fn set_player_info_nickname(
- info: &mut PlayerInfo,
- nickname: *const c_char) {
- let nickname = c_char_to_string_safe(nickname).unwrap_or("".to_string());
- info.set_nickname(nickname.as_str());
+ info: PlayerInfoC, nickname: *const c_char) -> PlayerInfoC {
+ let nickname = str_c_to_rs(nickname).unwrap_or("".to_string());
+
+ let mut raw_info = PlayerInfo::from(info);
+ raw_info.set_nickname(nickname.as_str());
+ raw_info.into()
} \ No newline at end of file
diff --git a/core_c/src/data_c/player_info_list_c.rs b/core_c/src/data_c/player_info_list_c.rs
index 9ad8918..99d5c35 100644
--- a/core_c/src/data_c/player_info_list_c.rs
+++ b/core_c/src/data_c/player_info_list_c.rs
@@ -1,8 +1,8 @@
-use nogamepads_lib_rs::pad_data::pad_player_info::nogamepads_player_info::PlayerInfo;
+use crate::data_c::player_info_c::PlayerInfoC;
#[repr(C)]
pub struct PlayerList {
- pub(crate) players: *mut PlayerInfo,
+ pub(crate) players: *mut PlayerInfoC,
pub(crate) len: usize,
pub(crate) capacity: usize,
} \ No newline at end of file
diff --git a/core_c/src/lib.rs b/core_c/src/lib.rs
index bdeb7ef..6efd0e9 100644
--- a/core_c/src/lib.rs
+++ b/core_c/src/lib.rs
@@ -3,13 +3,13 @@ use std::ffi::{c_char, CStr, CString};
pub mod data_c;
pub mod service_c;
-pub fn string_to_c_char_safe(s: String) -> (CString, *const c_char) {
+pub fn str_rs_to_c(s: String) -> (CString, *const c_char) {
let c_string = CString::new(s).expect("");
let ptr = c_string.as_ptr();
(c_string, ptr)
}
-pub fn c_char_to_string_safe(ptr: *const c_char) -> Option<String> {
+pub fn str_c_to_rs(ptr: *const c_char) -> Option<String> {
if ptr.is_null() {
return None;
}
diff --git a/core_c/src/service_c/padclient.rs b/core_c/src/service_c/padclient.rs
index 77e7d87..60120ab 100644
--- a/core_c/src/service_c/padclient.rs
+++ b/core_c/src/service_c/padclient.rs
@@ -1,51 +1,104 @@
+use crate::data_c::control_message_c::ControlMessageC;
+use crate::data_c::game_message_c::GameMessageC;
+use crate::data_c::player_info_c::PlayerInfoC;
+use crate::{box_into_raw, str_c_to_rs, str_rs_to_c};
+use nogamepads_lib_rs::pad_data::pad_messages::nogamepads_messages::GameMessage;
+use nogamepads_lib_rs::pad_service::client::nogamepads_client::PadClient;
+use nogamepads_lib_rs::DEFAULT_PORT;
use std::ffi::c_char;
use std::net::{IpAddr, Ipv4Addr};
use std::str::FromStr;
-use nogamepads_lib_rs::DEFAULT_PORT;
-use nogamepads_lib_rs::pad_data::pad_messages::nogamepads_messages::GameMessage;
-use nogamepads_lib_rs::pad_data::pad_player_info::nogamepads_player_info::PlayerInfo;
-use nogamepads_lib_rs::pad_service::client::nogamepads_client::PadClient;
-use crate::{box_into_raw, c_char_to_string_safe};
-use crate::data_c::control_message_c::CtrlMsgC;
-use crate::data_c::game_message_c::GameMsgC;
+
+#[repr(C)]
+#[derive(Copy, Clone)]
+#[allow(unused_imports)]
+pub struct PadClientC {
+ target_address: *const c_char,
+ target_port: u16,
+ bind_player: PlayerInfoC,
+ enable_console: bool,
+ quiet: bool
+}
+
+impl From<PadClientC> for PadClient {
+ fn from(value: PadClientC) -> Self {
+ let address = IpAddr::from_str(str_c_to_rs(value.target_address).unwrap_or("".to_string()).as_str()).unwrap_or(
+ IpAddr::from(Ipv4Addr::new(127, 0, 0, 1))
+ );
+ let port = value.target_port;
+ let mut client = PadClient::bind_addr_with_port(address, port);
+ client.bind_player(value.bind_player.into());
+ if value.enable_console { client.enable_console(); }
+ if value.quiet { client.quiet(); }
+ client
+ }
+}
+
+impl From<PadClient> for PadClientC {
+ fn from(mut value: PadClient) -> Self {
+ let (addr, port) = value.clone_addr();
+
+ PadClientC {
+ target_address: str_rs_to_c(addr.to_string()).1,
+ target_port: port,
+ bind_player: value.unbind_player().into(),
+ enable_console: value.is_enable_console(),
+ quiet: value.is_quiet(),
+ }
+ }
+}
+impl From<&mut PadClient> for PadClientC {
+ fn from(value: &mut PadClient) -> Self {
+ value.into()
+ }
+}
// 构建
#[unsafe(no_mangle)]
-pub extern "C" fn init_client(address: *const c_char) -> *mut PadClient {
- let addr_str = c_char_to_string_safe(address).unwrap_or("127.0.0.1".to_string());
+pub extern "C" fn init_client(address: *const c_char) -> PadClientC {
+ let addr_str = str_c_to_rs(address).unwrap_or("127.0.0.1".to_string());
let addr_v4 = Ipv4Addr::from_str(addr_str.as_str()).unwrap_or(
Ipv4Addr::new(127, 0, 0, 1));
- box_into_raw!(PadClient::bind_addr_with_port(IpAddr::from(addr_v4), DEFAULT_PORT))
+ PadClient::bind_addr_with_port(IpAddr::from(addr_v4), DEFAULT_PORT).into()
}
#[unsafe(no_mangle)]
-pub unsafe extern "C" fn init_client_with_port(address: *const c_char, port: u16) -> *mut PadClient {
- let addr_str = c_char_to_string_safe(address).unwrap_or("127.0.0.1".to_string());
+pub unsafe extern "C" fn init_client_with_port(address: *const c_char, port: u16) -> PadClientC {
+ let addr_str = str_c_to_rs(address).unwrap_or("127.0.0.1".to_string());
let addr_v4 = Ipv4Addr::from_str(addr_str.as_str()).unwrap_or(
Ipv4Addr::new(127, 0, 0, 1));
- box_into_raw!(PadClient::bind_addr_with_port(IpAddr::from(addr_v4), port))
+ PadClient::bind_addr_with_port(IpAddr::from(addr_v4), port).into()
+}
+
+#[unsafe(no_mangle)]
+pub extern "C" fn set_client_quiet(client: PadClientC) -> PadClientC {
+ let mut raw: PadClient = client.into();
+ raw.quiet().into()
}
#[unsafe(no_mangle)]
-pub extern "C" fn set_client_quiet(client: &mut PadClient) {
- client.quiet();
+pub extern "C" fn enable_client_console(client: PadClientC) -> PadClientC {
+ let mut raw: PadClient = client.into();
+ raw.enable_console().into()
}
#[unsafe(no_mangle)]
-pub extern "C" fn enable_client_console(client: &mut PadClient) {
- client.enable_console();
+pub extern "C" fn bind_player_to_client(client: PadClientC, info: PlayerInfoC) -> PadClientC {
+ let mut raw: PadClient = client.into();
+ raw.bind_player(info.into()).into()
}
#[unsafe(no_mangle)]
-pub extern "C" fn bind_player_to_client(client: &mut PadClient, info: &mut PlayerInfo) {
- client.bind_player(info.clone());
+pub extern "C" fn complete(client: PadClientC) -> *mut PadClient {
+ let client: PadClient = client.into();
+ box_into_raw!(client)
}
// 状态控制
#[unsafe(no_mangle)]
-pub extern "C" fn connect_client_to_server(client: *mut PadClient) {
+pub extern "C" fn connect_client_to_server(client: &mut PadClient) {
let client = unsafe { Box::from_raw(client) };
client.connect();
}
@@ -58,16 +111,16 @@ pub extern "C" fn exit_client_from_server(client: &PadClient) {
// 消息管理
#[unsafe(no_mangle)]
-pub extern "C" fn put_a_msg_to_server(client: &PadClient, msg: CtrlMsgC) {
+pub extern "C" fn put_a_msg_to_server(client: &PadClient, msg: ControlMessageC) {
client.put_msg(msg.into())
}
#[unsafe(no_mangle)]
-pub extern "C" fn pop_a_msg_from_server(client: &PadClient) -> GameMsgC {
+pub extern "C" fn pop_a_msg_from_server(client: &PadClient) -> GameMessageC {
client.pop_a_msg().unwrap_or(GameMessage::Err).into()
}
#[unsafe(no_mangle)]
-pub extern "C" fn pop_msg_from_server_or(client: &PadClient, or: GameMsgC) -> GameMsgC {
+pub extern "C" fn pop_msg_from_server_or(client: &PadClient, or: GameMessageC) -> GameMessageC {
client.pop_msg_or(or.into()).into()
} \ No newline at end of file
diff --git a/core_c/src/service_c/padserver.rs b/core_c/src/service_c/padserver.rs
index d0e3267..ee1a6a8 100644
--- a/core_c/src/service_c/padserver.rs
+++ b/core_c/src/service_c/padserver.rs
@@ -1,23 +1,24 @@
-use std::collections::HashMap;
-use crate::{box_into_raw, c_char_to_string_safe};
-use nogamepads_lib_rs::pad_data::game_profile::game_profile::GameProfile;
+use crate::data_c::control_message_c::ControlMessageC;
+use crate::data_c::game_message_c::GameMessageC;
+use crate::data_c::game_profile_c::GameProfileC;
+use crate::data_c::player_info_c::PlayerInfoC;
+use crate::data_c::player_info_list_c::PlayerList;
+use crate::{box_into_raw, str_c_to_rs};
+use nogamepads_lib_rs::pad_data::pad_messages::nogamepads_messages::ControlMessage;
+use nogamepads_lib_rs::pad_data::pad_player_info::nogamepads_player_info::PlayerInfo;
use nogamepads_lib_rs::pad_service::server::nogamepads_server::PadServer;
use nogamepads_lib_rs::DEFAULT_PORT;
+use std::collections::HashMap;
use std::ffi::c_char;
use std::net::{IpAddr, Ipv4Addr};
use std::str::FromStr;
use std::sync::{Arc, MutexGuard, PoisonError};
-use nogamepads_lib_rs::pad_data::pad_messages::nogamepads_messages::ControlMessage;
-use nogamepads_lib_rs::pad_data::pad_player_info::nogamepads_player_info::PlayerInfo;
-use crate::data_c::control_message_c::CtrlMsgC;
-use crate::data_c::game_message_c::GameMsgC;
-use crate::data_c::player_info_list_c::PlayerList;
// 构建
#[unsafe(no_mangle)]
pub extern "C" fn init_server(address: *const c_char) -> *mut PadServer {
- let addr_str = c_char_to_string_safe(address).unwrap_or("127.0.0.1".to_string());
+ let addr_str = str_c_to_rs(address).unwrap_or("127.0.0.1".to_string());
let addr_v4 = Ipv4Addr::from_str(addr_str.as_str()).unwrap_or(
Ipv4Addr::new(127, 0, 0, 1));
let mut server = PadServer::default();
@@ -27,7 +28,7 @@ pub extern "C" fn init_server(address: *const c_char) -> *mut PadServer {
#[unsafe(no_mangle)]
pub extern "C" fn init_server_with_port(address: *const c_char, port: u16) -> *mut PadServer {
- let addr_str = c_char_to_string_safe(address).unwrap_or("127.0.0.1".to_string());
+ let addr_str = str_c_to_rs(address).unwrap_or("127.0.0.1".to_string());
let addr_v4 = Ipv4Addr::from_str(addr_str.as_str()).unwrap_or(
Ipv4Addr::new(127, 0, 0, 1));
let mut server = PadServer::default();
@@ -46,8 +47,8 @@ pub extern "C" fn enable_server_console(server: &mut PadServer) {
}
#[unsafe(no_mangle)]
-pub extern "C" fn bind_profile_to_server(server: &mut PadServer, profile: &mut GameProfile) {
- server.put_profile(profile.clone());
+pub extern "C" fn bind_profile_to_server(server: &mut PadServer, profile: &GameProfileC) {
+ server.put_profile(profile.clone().into());
}
// 状态控制
@@ -85,59 +86,59 @@ pub extern "C" fn is_server_game_locked(server: *mut PadServer) -> bool {
// 消息管理
#[unsafe(no_mangle)]
-pub extern "C" fn put_a_msg_to_player(server: *mut PadServer, msg: GameMsgC, player: &PlayerInfo) {
+pub extern "C" fn put_a_msg_to_player(server: *mut PadServer, msg: GameMessageC, player: &PlayerInfoC) {
let server = unsafe { Box::from_raw(server) };
- server.put_msg_to(msg.into(), player);
+ server.put_msg_to(msg.into(), player.into());
}
#[unsafe(no_mangle)]
-pub extern "C" fn put_msg_to_all_players(server: *mut PadServer, msg: GameMsgC) {
+pub extern "C" fn put_msg_to_all_players(server: *mut PadServer, msg: GameMessageC) {
let server = unsafe { Box::from_raw(server) };
server.put_msg_to_all(&msg.into());
}
#[unsafe(no_mangle)]
-pub extern "C" fn pop_a_msg_from_player(server: *mut PadServer, player: &PlayerInfo) -> CtrlMsgC {
+pub extern "C" fn pop_a_msg_from_player(server: *mut PadServer, player: &PlayerInfoC) -> ControlMessageC {
let server = unsafe { Box::from_raw(server) };
- server.pop_a_msg(player).unwrap_or(ControlMessage::Err).into()
+ server.pop_a_msg(player.into()).unwrap_or(ControlMessage::Err).into()
}
#[unsafe(no_mangle)]
-pub extern "C" fn pop_msg_from_player_or(server: *mut PadServer, player: &PlayerInfo, or: CtrlMsgC) -> CtrlMsgC {
+pub extern "C" fn pop_msg_from_player_or(server: *mut PadServer, player: &PlayerInfoC, or: ControlMessageC) -> ControlMessageC {
let server = unsafe { Box::from_raw(server) };
- let msg = server.pop_msg_or(player, or.into());
+ let msg = server.pop_msg_or(player.into(), or.into());
msg.into()
}
// 玩家管理
#[unsafe(no_mangle)]
-pub extern "C" fn is_player_online(server: *mut PadServer, player: &PlayerInfo) -> bool {
+pub extern "C" fn is_player_online(server: *mut PadServer, player: &PlayerInfoC) -> bool {
let server = unsafe { Box::from_raw(server) };
- server.is_player_online(player)
+ server.is_player_online(player.into())
}
#[unsafe(no_mangle)]
-pub extern "C" fn is_player_banned(server: *mut PadServer, player: &PlayerInfo) -> bool {
+pub extern "C" fn is_player_banned(server: *mut PadServer, player: &PlayerInfoC) -> bool {
let server = unsafe { Box::from_raw(server) };
- server.is_player_banned(player)
+ server.is_player_banned(player.into())
}
#[unsafe(no_mangle)]
-pub extern "C" fn kick_player(server: *mut PadServer, player: &PlayerInfo) {
+pub extern "C" fn kick_player(server: *mut PadServer, player: &PlayerInfoC) {
let server = unsafe { Box::from_raw(server) };
- server.kick_player(player);
+ server.kick_player(player.into());
}
#[unsafe(no_mangle)]
-pub extern "C" fn ban_player(server: *mut PadServer, player: &PlayerInfo) {
+pub extern "C" fn ban_player(server: *mut PadServer, player: &PlayerInfoC) {
let server = unsafe { Box::from_raw(server) };
- server.ban_player(player);
+ server.ban_player(player.into());
}
#[unsafe(no_mangle)]
-pub extern "C" fn pardon_player(server: *mut PadServer, player: &PlayerInfo) {
+pub extern "C" fn pardon_player(server: *mut PadServer, player: &PlayerInfoC) {
let server = unsafe { Box::from_raw(server) };
- server.pardon_player(player);
+ server.pardon_player(player.into());
}
#[unsafe(no_mangle)]
@@ -161,8 +162,12 @@ fn process_list_result(list: Result<Vec<PlayerInfo>, PoisonError<MutexGuard<Hash
} else {
result = vec![];
}
+ let mut result_c: Vec<PlayerInfoC> = Vec::new();
+ for item in result {
+ result_c.push(item.into());
+ }
- let mut vec = result.into_boxed_slice();
+ let mut vec = result_c.into_boxed_slice();
let ptr = vec.as_mut_ptr();
let len = vec.len();
let capacity = vec.len();
diff --git a/core_csharp/NoGamepadsSharp/NoGamepadsSharp_Core/Data/HsvColor.cs b/core_csharp/NoGamepadsSharp/NoGamepadsSharp_Core/Data/HsvColor.cs
new file mode 100644
index 0000000..a534be6
--- /dev/null
+++ b/core_csharp/NoGamepadsSharp/NoGamepadsSharp_Core/Data/HsvColor.cs
@@ -0,0 +1,158 @@
+namespace NoGamepadsSharp_Data.Data;
+
+public struct HsvColor
+{
+ private int _h;
+ private float _s;
+ private float _v;
+
+ public HsvColor(int h, float s, float v)
+ {
+ _h = h;
+ _s = s;
+ _v = v;
+ }
+
+ public HsvColor(float r, float g, float b)
+ {
+ Converter.ToHsv(r, g, b, out int h, out float s, out float v);
+ _h = h;
+ _s = s;
+ _v = v;
+ }
+
+ public int hue
+ {
+ get => _h;
+ set => _h = int.Clamp(value, 0, 360);
+ }
+
+ public float saturation
+ {
+ get => _s;
+ set => _s = float.Clamp(value, 0, 1);
+ }
+
+ public float value
+ {
+ get => _v;
+ set => _v = float.Clamp(value, 0, 1);
+ }
+
+ public float red
+ {
+ get
+ {
+ Converter.ToRgb(_h, _s, _v, out float f, out _, out _);
+ return f;
+ }
+ set
+ {
+ Converter.ToRgb(_h, _s, _v, out float r, out float g, out float b);
+ r = float.Clamp(value, 0, 1);
+ Converter.ToHsv(r, g, b, out int h, out float s, out float v);
+ _h = h;
+ _s = s;
+ _v = v;
+ }
+ }
+
+ public float green
+ {
+ get
+ {
+ Converter.ToRgb(_h, _s, _v, out _, out float f, out _);
+ return f;
+ }
+ set
+ {
+ Converter.ToRgb(_h, _s, _v, out float r, out float g, out float b);
+ g = float.Clamp(value, 0, 1);
+ Converter.ToHsv(r, g, b, out int h, out float s, out float v);
+ _h = h;
+ _s = s;
+ _v = v;
+ }
+ }
+
+ public float blue
+ {
+ get
+ {
+ Converter.ToRgb(_h, _s, _v, out _, out _, out float f);
+ return f;
+ }
+ set
+ {
+ Converter.ToRgb(_h, _s, _v, out float r, out float g, out float b);
+ b = float.Clamp(value, 0, 1);
+ Converter.ToHsv(r, g, b, out int h, out float s, out float v);
+ _h = h;
+ _s = s;
+ _v = v;
+ }
+ }
+
+ public class Converter
+ {
+ public static void ToRgb(int h, float s, float v, out float r, out float g, out float b)
+ {
+ h = (h % 360 + 360) % 360;
+
+ if (s <= 0.0f)
+ {
+ r = g = b = v;
+ return;
+ }
+
+ float hh = h / 60.0f;
+ int i = (int)hh;
+ float ff = hh - i;
+ float p = v * (1.0f - s);
+ float q = v * (1.0f - s * ff);
+ float t = v * (1.0f - s * (1.0f - ff));
+
+ switch (i)
+ {
+ case 0: r = v; g = t; b = p; break;
+ case 1: r = q; g = v; b = p; break;
+ case 2: r = p; g = v; b = t; break;
+ case 3: r = p; g = q; b = v; break;
+ case 4: r = t; g = p; b = v; break;
+ default: r = v; g = p; b = q; break;
+ }
+ }
+
+ public static void ToHsv(float r, float g, float b, out int h, out float s, out float v)
+ {
+ float min = Math.Min(Math.Min(r, g), b);
+ float max = Math.Max(Math.Max(r, g), b);
+ float delta = max - min;
+
+ v = max;
+
+ if (delta <= 1e-6f)
+ {
+ h = 0;
+ s = 0.0f;
+ return;
+ }
+
+ s = delta / max;
+ float hh;
+
+ if (Math.Abs(r - max) < 0.001f)
+ hh = (g - b) / delta;
+ else if (Math.Abs(g - max) < 0.001f)
+ hh = (b - r) / delta + 2.0f;
+ else
+ hh = (r - g) / delta + 4.0f;
+
+ hh *= 60.0f;
+ if (hh < 0.0f) hh += 360.0f;
+
+ h = (int)Math.Round(hh);
+ h = (h % 360 + 360) % 360;
+ }
+ }
+} \ No newline at end of file
diff --git a/core_csharp/NoGamepadsSharp/NoGamepadsSharp_Core/Data/PlayerInfo.cs b/core_csharp/NoGamepadsSharp/NoGamepadsSharp_Core/Data/PlayerInfo.cs
index 4b7030c..44ab51b 100644
--- a/core_csharp/NoGamepadsSharp/NoGamepadsSharp_Core/Data/PlayerInfo.cs
+++ b/core_csharp/NoGamepadsSharp/NoGamepadsSharp_Core/Data/PlayerInfo.cs
@@ -1,6 +1,19 @@
namespace NoGamepadsSharp_Data.Data;
-public class PlayerInfo
+public struct PlayerInfo
{
+ public PlayerAccount Account;
+ public PlayerCustomize Customize;
+ public struct PlayerCustomize
+ {
+ public String Nickname;
+ public HsvColor Color;
+ }
+
+ public struct PlayerAccount
+ {
+ public String Id;
+ public String Hash;
+ }
} \ No newline at end of file
diff --git a/core_csharp/NoGamepadsSharp/NoGamepadsSharp_Core/obj/Debug/net8.0/NoGamepadsSharp_Core.AssemblyInfo.cs b/core_csharp/NoGamepadsSharp/NoGamepadsSharp_Core/obj/Debug/net8.0/NoGamepadsSharp_Core.AssemblyInfo.cs
index e280404..9a403d4 100644
--- a/core_csharp/NoGamepadsSharp/NoGamepadsSharp_Core/obj/Debug/net8.0/NoGamepadsSharp_Core.AssemblyInfo.cs
+++ b/core_csharp/NoGamepadsSharp/NoGamepadsSharp_Core/obj/Debug/net8.0/NoGamepadsSharp_Core.AssemblyInfo.cs
@@ -13,7 +13,7 @@ using System.Reflection;
[assembly: System.Reflection.AssemblyCompanyAttribute("NoGamepadsSharp_Core")]
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
-[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+5a244311d5c9c42b33a49f3cafa7f20017d10305")]
+[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+7bf8e1f24f95d87e1a30765b1904473cf75b435b")]
[assembly: System.Reflection.AssemblyProductAttribute("NoGamepadsSharp_Core")]
[assembly: System.Reflection.AssemblyTitleAttribute("NoGamepadsSharp_Core")]
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
diff --git a/core_csharp/NoGamepadsSharp/NoGamepadsSharp_Core/obj/Debug/net8.0/NoGamepadsSharp_Core.AssemblyInfoInputs.cache b/core_csharp/NoGamepadsSharp/NoGamepadsSharp_Core/obj/Debug/net8.0/NoGamepadsSharp_Core.AssemblyInfoInputs.cache
index fcd212a..b65f543 100644
--- a/core_csharp/NoGamepadsSharp/NoGamepadsSharp_Core/obj/Debug/net8.0/NoGamepadsSharp_Core.AssemblyInfoInputs.cache
+++ b/core_csharp/NoGamepadsSharp/NoGamepadsSharp_Core/obj/Debug/net8.0/NoGamepadsSharp_Core.AssemblyInfoInputs.cache
@@ -1 +1 @@
-bc71f64338ad3af16c57c59d81f837b950bdf63c0e441a498b072048977de1c7
+a6b869bd9da6a1765cbae4ac831af005406c2755ca688e375f929ab2317f8c28
diff --git a/core_csharp/NoGamepadsSharp/NoGamepadsSharp_Execute/Program.cs b/core_csharp/NoGamepadsSharp/NoGamepadsSharp_Execute/Program.cs
index e5dff12..4f9a31c 100644
--- a/core_csharp/NoGamepadsSharp/NoGamepadsSharp_Execute/Program.cs
+++ b/core_csharp/NoGamepadsSharp/NoGamepadsSharp_Execute/Program.cs
@@ -1,3 +1,12 @@
-// See https://aka.ms/new-console-template for more information
+using System.Runtime.InteropServices;
-Console.WriteLine("Hello, World!"); \ No newline at end of file
+namespace NoGamepadsSharp_Execute
+{
+ public class Program
+ {
+ public static void Main(string[] args)
+ {
+
+ }
+ }
+} \ No newline at end of file
diff --git a/core_csharp/NoGamepadsSharp/NoGamepadsSharp_Execute/bin/Debug/net8.0/NoGamepadsSharp_Execute.deps.json b/core_csharp/NoGamepadsSharp/NoGamepadsSharp_Execute/bin/Debug/net8.0/NoGamepadsSharp_Execute.deps.json
new file mode 100644
index 0000000..7ec60d1
--- /dev/null
+++ b/core_csharp/NoGamepadsSharp/NoGamepadsSharp_Execute/bin/Debug/net8.0/NoGamepadsSharp_Execute.deps.json
@@ -0,0 +1,23 @@
+{
+ "runtimeTarget": {
+ "name": ".NETCoreApp,Version=v8.0",
+ "signature": ""
+ },
+ "compilationOptions": {},
+ "targets": {
+ ".NETCoreApp,Version=v8.0": {
+ "NoGamepadsSharp_Execute/1.0.0": {
+ "runtime": {
+ "NoGamepadsSharp_Execute.dll": {}
+ }
+ }
+ }
+ },
+ "libraries": {
+ "NoGamepadsSharp_Execute/1.0.0": {
+ "type": "project",
+ "serviceable": false,
+ "sha512": ""
+ }
+ }
+} \ No newline at end of file
diff --git a/core_csharp/NoGamepadsSharp/NoGamepadsSharp_Execute/bin/Debug/net8.0/NoGamepadsSharp_Execute.dll b/core_csharp/NoGamepadsSharp/NoGamepadsSharp_Execute/bin/Debug/net8.0/NoGamepadsSharp_Execute.dll
new file mode 100644
index 0000000..7304713
--- /dev/null
+++ b/core_csharp/NoGamepadsSharp/NoGamepadsSharp_Execute/bin/Debug/net8.0/NoGamepadsSharp_Execute.dll
Binary files differ
diff --git a/core_csharp/NoGamepadsSharp/NoGamepadsSharp_Execute/bin/Debug/net8.0/NoGamepadsSharp_Execute.exe b/core_csharp/NoGamepadsSharp/NoGamepadsSharp_Execute/bin/Debug/net8.0/NoGamepadsSharp_Execute.exe
new file mode 100644
index 0000000..1aed8a6
--- /dev/null
+++ b/core_csharp/NoGamepadsSharp/NoGamepadsSharp_Execute/bin/Debug/net8.0/NoGamepadsSharp_Execute.exe
Binary files differ
diff --git a/core_csharp/NoGamepadsSharp/NoGamepadsSharp_Execute/bin/Debug/net8.0/NoGamepadsSharp_Execute.pdb b/core_csharp/NoGamepadsSharp/NoGamepadsSharp_Execute/bin/Debug/net8.0/NoGamepadsSharp_Execute.pdb
new file mode 100644
index 0000000..f0bffa1
--- /dev/null
+++ b/core_csharp/NoGamepadsSharp/NoGamepadsSharp_Execute/bin/Debug/net8.0/NoGamepadsSharp_Execute.pdb
Binary files differ
diff --git a/core_csharp/NoGamepadsSharp/NoGamepadsSharp_Execute/bin/Debug/net8.0/NoGamepadsSharp_Execute.runtimeconfig.json b/core_csharp/NoGamepadsSharp/NoGamepadsSharp_Execute/bin/Debug/net8.0/NoGamepadsSharp_Execute.runtimeconfig.json
new file mode 100644
index 0000000..becfaea
--- /dev/null
+++ b/core_csharp/NoGamepadsSharp/NoGamepadsSharp_Execute/bin/Debug/net8.0/NoGamepadsSharp_Execute.runtimeconfig.json
@@ -0,0 +1,12 @@
+{
+ "runtimeOptions": {
+ "tfm": "net8.0",
+ "framework": {
+ "name": "Microsoft.NETCore.App",
+ "version": "8.0.0"
+ },
+ "configProperties": {
+ "System.Runtime.Serialization.EnableUnsafeBinaryFormatterSerialization": false
+ }
+ }
+} \ No newline at end of file
diff --git a/core_csharp/NoGamepadsSharp/NoGamepadsSharp_Execute/bin/Debug/net8.0/nogamepads_lib_c.dll b/core_csharp/NoGamepadsSharp/NoGamepadsSharp_Execute/bin/Debug/net8.0/nogamepads_lib_c.dll
new file mode 100644
index 0000000..1dcd807
--- /dev/null
+++ b/core_csharp/NoGamepadsSharp/NoGamepadsSharp_Execute/bin/Debug/net8.0/nogamepads_lib_c.dll
Binary files differ
diff --git a/core_csharp/NoGamepadsSharp/NoGamepadsSharp_Execute/obj/Debug/net8.0/NoGamepadsSharp_Execute.AssemblyInfo.cs b/core_csharp/NoGamepadsSharp/NoGamepadsSharp_Execute/obj/Debug/net8.0/NoGamepadsSharp_Execute.AssemblyInfo.cs
index 7d24d7e..1cd6707 100644
--- a/core_csharp/NoGamepadsSharp/NoGamepadsSharp_Execute/obj/Debug/net8.0/NoGamepadsSharp_Execute.AssemblyInfo.cs
+++ b/core_csharp/NoGamepadsSharp/NoGamepadsSharp_Execute/obj/Debug/net8.0/NoGamepadsSharp_Execute.AssemblyInfo.cs
@@ -13,7 +13,7 @@ using System.Reflection;
[assembly: System.Reflection.AssemblyCompanyAttribute("NoGamepadsSharp_Execute")]
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
-[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+5a244311d5c9c42b33a49f3cafa7f20017d10305")]
+[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+7bf8e1f24f95d87e1a30765b1904473cf75b435b")]
[assembly: System.Reflection.AssemblyProductAttribute("NoGamepadsSharp_Execute")]
[assembly: System.Reflection.AssemblyTitleAttribute("NoGamepadsSharp_Execute")]
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
diff --git a/core_csharp/NoGamepadsSharp/NoGamepadsSharp_Execute/obj/Debug/net8.0/NoGamepadsSharp_Execute.AssemblyInfoInputs.cache b/core_csharp/NoGamepadsSharp/NoGamepadsSharp_Execute/obj/Debug/net8.0/NoGamepadsSharp_Execute.AssemblyInfoInputs.cache
index 41b15d2..9d55bff 100644
--- a/core_csharp/NoGamepadsSharp/NoGamepadsSharp_Execute/obj/Debug/net8.0/NoGamepadsSharp_Execute.AssemblyInfoInputs.cache
+++ b/core_csharp/NoGamepadsSharp/NoGamepadsSharp_Execute/obj/Debug/net8.0/NoGamepadsSharp_Execute.AssemblyInfoInputs.cache
@@ -1 +1 @@
-8708e46ad6cb9888fb34fdbff384cd1402172cc10485179fa8fd4fcc3810f7ef
+04ec6d515d7009e3fadb88848dbf20ac4996198345493ab6f51b427aa75bafe7
diff --git a/core_csharp/NoGamepadsSharp/NoGamepadsSharp_Execute/obj/Debug/net8.0/NoGamepadsSharp_Execute.csproj.CoreCompileInputs.cache b/core_csharp/NoGamepadsSharp/NoGamepadsSharp_Execute/obj/Debug/net8.0/NoGamepadsSharp_Execute.csproj.CoreCompileInputs.cache
new file mode 100644
index 0000000..b8d2bb6
--- /dev/null
+++ b/core_csharp/NoGamepadsSharp/NoGamepadsSharp_Execute/obj/Debug/net8.0/NoGamepadsSharp_Execute.csproj.CoreCompileInputs.cache
@@ -0,0 +1 @@
+08b6a6e0c0f5c70b73eb166c3425ecd1b8254db5cb3da53ddf331a4e9ececa64
diff --git a/core_csharp/NoGamepadsSharp/NoGamepadsSharp_Execute/obj/Debug/net8.0/NoGamepadsSharp_Execute.csproj.FileListAbsolute.txt b/core_csharp/NoGamepadsSharp/NoGamepadsSharp_Execute/obj/Debug/net8.0/NoGamepadsSharp_Execute.csproj.FileListAbsolute.txt
new file mode 100644
index 0000000..60ba01a
--- /dev/null
+++ b/core_csharp/NoGamepadsSharp/NoGamepadsSharp_Execute/obj/Debug/net8.0/NoGamepadsSharp_Execute.csproj.FileListAbsolute.txt
@@ -0,0 +1,15 @@
+D:\TINP\NoGamepads\core_csharp\NoGamepadsSharp\NoGamepadsSharp_Execute\bin\Debug\net8.0\NoGamepadsSharp_Execute.exe
+D:\TINP\NoGamepads\core_csharp\NoGamepadsSharp\NoGamepadsSharp_Execute\bin\Debug\net8.0\NoGamepadsSharp_Execute.deps.json
+D:\TINP\NoGamepads\core_csharp\NoGamepadsSharp\NoGamepadsSharp_Execute\bin\Debug\net8.0\NoGamepadsSharp_Execute.runtimeconfig.json
+D:\TINP\NoGamepads\core_csharp\NoGamepadsSharp\NoGamepadsSharp_Execute\bin\Debug\net8.0\NoGamepadsSharp_Execute.dll
+D:\TINP\NoGamepads\core_csharp\NoGamepadsSharp\NoGamepadsSharp_Execute\bin\Debug\net8.0\NoGamepadsSharp_Execute.pdb
+D:\TINP\NoGamepads\core_csharp\NoGamepadsSharp\NoGamepadsSharp_Execute\obj\Debug\net8.0\NoGamepadsSharp_Execute.GeneratedMSBuildEditorConfig.editorconfig
+D:\TINP\NoGamepads\core_csharp\NoGamepadsSharp\NoGamepadsSharp_Execute\obj\Debug\net8.0\NoGamepadsSharp_Execute.AssemblyInfoInputs.cache
+D:\TINP\NoGamepads\core_csharp\NoGamepadsSharp\NoGamepadsSharp_Execute\obj\Debug\net8.0\NoGamepadsSharp_Execute.AssemblyInfo.cs
+D:\TINP\NoGamepads\core_csharp\NoGamepadsSharp\NoGamepadsSharp_Execute\obj\Debug\net8.0\NoGamepadsSharp_Execute.csproj.CoreCompileInputs.cache
+D:\TINP\NoGamepads\core_csharp\NoGamepadsSharp\NoGamepadsSharp_Execute\obj\Debug\net8.0\NoGamepadsSharp_Execute.sourcelink.json
+D:\TINP\NoGamepads\core_csharp\NoGamepadsSharp\NoGamepadsSharp_Execute\obj\Debug\net8.0\NoGamepadsSharp_Execute.dll
+D:\TINP\NoGamepads\core_csharp\NoGamepadsSharp\NoGamepadsSharp_Execute\obj\Debug\net8.0\refint\NoGamepadsSharp_Execute.dll
+D:\TINP\NoGamepads\core_csharp\NoGamepadsSharp\NoGamepadsSharp_Execute\obj\Debug\net8.0\NoGamepadsSharp_Execute.pdb
+D:\TINP\NoGamepads\core_csharp\NoGamepadsSharp\NoGamepadsSharp_Execute\obj\Debug\net8.0\NoGamepadsSharp_Execute.genruntimeconfig.cache
+D:\TINP\NoGamepads\core_csharp\NoGamepadsSharp\NoGamepadsSharp_Execute\obj\Debug\net8.0\ref\NoGamepadsSharp_Execute.dll
diff --git a/core_csharp/NoGamepadsSharp/NoGamepadsSharp_Execute/obj/Debug/net8.0/NoGamepadsSharp_Execute.dll b/core_csharp/NoGamepadsSharp/NoGamepadsSharp_Execute/obj/Debug/net8.0/NoGamepadsSharp_Execute.dll
new file mode 100644
index 0000000..7304713
--- /dev/null
+++ b/core_csharp/NoGamepadsSharp/NoGamepadsSharp_Execute/obj/Debug/net8.0/NoGamepadsSharp_Execute.dll
Binary files differ
diff --git a/core_csharp/NoGamepadsSharp/NoGamepadsSharp_Execute/obj/Debug/net8.0/NoGamepadsSharp_Execute.genruntimeconfig.cache b/core_csharp/NoGamepadsSharp/NoGamepadsSharp_Execute/obj/Debug/net8.0/NoGamepadsSharp_Execute.genruntimeconfig.cache
new file mode 100644
index 0000000..d1d6363
--- /dev/null
+++ b/core_csharp/NoGamepadsSharp/NoGamepadsSharp_Execute/obj/Debug/net8.0/NoGamepadsSharp_Execute.genruntimeconfig.cache
@@ -0,0 +1 @@
+747af723e27e441c874613b2ee11f095ebffaa1343df438ff5c28c1abeefb1b1
diff --git a/core_csharp/NoGamepadsSharp/NoGamepadsSharp_Execute/obj/Debug/net8.0/NoGamepadsSharp_Execute.pdb b/core_csharp/NoGamepadsSharp/NoGamepadsSharp_Execute/obj/Debug/net8.0/NoGamepadsSharp_Execute.pdb
new file mode 100644
index 0000000..f0bffa1
--- /dev/null
+++ b/core_csharp/NoGamepadsSharp/NoGamepadsSharp_Execute/obj/Debug/net8.0/NoGamepadsSharp_Execute.pdb
Binary files differ
diff --git a/core_csharp/NoGamepadsSharp/NoGamepadsSharp_Execute/obj/Debug/net8.0/NoGamepadsSharp_Execute.sourcelink.json b/core_csharp/NoGamepadsSharp/NoGamepadsSharp_Execute/obj/Debug/net8.0/NoGamepadsSharp_Execute.sourcelink.json
new file mode 100644
index 0000000..9ab27c4
--- /dev/null
+++ b/core_csharp/NoGamepadsSharp/NoGamepadsSharp_Execute/obj/Debug/net8.0/NoGamepadsSharp_Execute.sourcelink.json
@@ -0,0 +1 @@
+{"documents":{"D:\\TINP\\NoGamepads\\*":"https://raw.githubusercontent.com/CatilGrass/NoGamepads/7bf8e1f24f95d87e1a30765b1904473cf75b435b/*"}} \ No newline at end of file
diff --git a/core_csharp/NoGamepadsSharp/NoGamepadsSharp_Execute/obj/Debug/net8.0/apphost.exe b/core_csharp/NoGamepadsSharp/NoGamepadsSharp_Execute/obj/Debug/net8.0/apphost.exe
new file mode 100644
index 0000000..1aed8a6
--- /dev/null
+++ b/core_csharp/NoGamepadsSharp/NoGamepadsSharp_Execute/obj/Debug/net8.0/apphost.exe
Binary files differ
diff --git a/core_csharp/NoGamepadsSharp/NoGamepadsSharp_Execute/obj/Debug/net8.0/ref/NoGamepadsSharp_Execute.dll b/core_csharp/NoGamepadsSharp/NoGamepadsSharp_Execute/obj/Debug/net8.0/ref/NoGamepadsSharp_Execute.dll
new file mode 100644
index 0000000..1a99951
--- /dev/null
+++ b/core_csharp/NoGamepadsSharp/NoGamepadsSharp_Execute/obj/Debug/net8.0/ref/NoGamepadsSharp_Execute.dll
Binary files differ
diff --git a/core_csharp/NoGamepadsSharp/NoGamepadsSharp_Execute/obj/Debug/net8.0/refint/NoGamepadsSharp_Execute.dll b/core_csharp/NoGamepadsSharp/NoGamepadsSharp_Execute/obj/Debug/net8.0/refint/NoGamepadsSharp_Execute.dll
new file mode 100644
index 0000000..1a99951
--- /dev/null
+++ b/core_csharp/NoGamepadsSharp/NoGamepadsSharp_Execute/obj/Debug/net8.0/refint/NoGamepadsSharp_Execute.dll
Binary files differ
diff --git a/core_csharp/NoGamepadsSharp/NoGamepadsSharp_Execute/obj/rider.project.model.nuget.info b/core_csharp/NoGamepadsSharp/NoGamepadsSharp_Execute/obj/rider.project.model.nuget.info
new file mode 100644
index 0000000..91b84e6
--- /dev/null
+++ b/core_csharp/NoGamepadsSharp/NoGamepadsSharp_Execute/obj/rider.project.model.nuget.info
@@ -0,0 +1 @@
+17483964212879694 \ No newline at end of file
diff --git a/release/0.1.0/bin/nogpadc.exe b/release/0.1.0/bin/nogpadc.exe
index 5cf21ea..5fea05c 100644
--- a/release/0.1.0/bin/nogpadc.exe
+++ b/release/0.1.0/bin/nogpadc.exe
Binary files differ
diff --git a/release/0.1.0/bin/nogpads.exe b/release/0.1.0/bin/nogpads.exe
index 03fe069..9774267 100644
--- a/release/0.1.0/bin/nogpads.exe
+++ b/release/0.1.0/bin/nogpads.exe
Binary files differ
diff --git a/release/0.1.0/bridge/nogamepads.h b/release/0.1.0/bridge/nogamepads.h
index 959475d..997b73d 100644
--- a/release/0.1.0/bridge/nogamepads.h
+++ b/release/0.1.0/bridge/nogamepads.h
@@ -30,6 +30,32 @@ typedef enum LeaveReasonData {
YouAreBanned,
} LeaveReasonData;
+typedef struct GameProfileC {
+ const char *game_name;
+ const char *game_description;
+ const char *organization;
+ const char *version;
+ const char *website;
+ const char *email;
+} GameProfileC;
+
+typedef struct PlayerInfoC {
+ const char *account_id;
+ const char *account_hash;
+ const char *customize_nickname;
+ int32_t customize_color_hue;
+ double customize_color_saturation;
+ double customize_color_value;
+} PlayerInfoC;
+
+typedef struct PadClientC {
+ const char *target_address;
+ uint16_t target_port;
+ struct PlayerInfoC bind_player;
+ bool enable_console;
+ bool quiet;
+} PadClientC;
+
typedef struct KeyData {
uint8_t key;
} KeyData;
@@ -57,10 +83,10 @@ typedef union CtrlMsgCUnion {
struct StrData str;
} CtrlMsgCUnion;
-typedef struct CtrlMsgC {
+typedef struct ControlMessageC {
enum CtrlMsgCTag tag;
union CtrlMsgCUnion data;
-} CtrlMsgC;
+} ControlMessageC;
typedef union GameMsgCUnion {
void *nul;
@@ -68,60 +94,66 @@ typedef union GameMsgCUnion {
enum LeaveReasonData reason;
} GameMsgCUnion;
-typedef struct GameMsgC {
+typedef struct GameMessageC {
enum GameMsgCTag tag;
union GameMsgCUnion data;
-} GameMsgC;
+} GameMessageC;
typedef struct PlayerList {
- PlayerInfo *players;
+ struct PlayerInfoC *players;
uintptr_t len;
uintptr_t capacity;
} PlayerList;
-GameProfile *init_game_profile(void);
+struct GameProfileC init_game_profile(void);
-void set_game_profile_name(GameProfile *game_profile, const char *value);
+struct GameProfileC set_game_profile_name(struct GameProfileC game_profile, const char *value);
-void set_game_profile_description(GameProfile *game_profile, const char *value);
+struct GameProfileC set_game_profile_description(struct GameProfileC game_profile,
+ const char *value);
-void set_game_profile_organization(GameProfile *game_profile, const char *value);
+struct GameProfileC set_game_profile_organization(struct GameProfileC game_profile,
+ const char *value);
-void set_game_profile_version(GameProfile *game_profile, const char *value);
+struct GameProfileC set_game_profile_version(struct GameProfileC game_profile, const char *value);
-void set_game_profile_website(GameProfile *game_profile, const char *value);
+struct GameProfileC set_game_profile_website(struct GameProfileC game_profile, const char *value);
-void set_game_profile_email(GameProfile *game_profile, const char *value);
+struct GameProfileC set_game_profile_email(struct GameProfileC game_profile, const char *value);
-PlayerInfo *init_player_info(void);
+struct PlayerInfoC init_player_info(void);
-void set_player_info_account(PlayerInfo *info, const char *id, const char *password);
+struct PlayerInfoC set_player_info_account(struct PlayerInfoC info,
+ const char *id,
+ const char *password);
-void set_player_info_color(PlayerInfo *info, int32_t h, double s, double v);
+struct PlayerInfoC set_player_info_color(struct PlayerInfoC info, int32_t h, double s, double v);
-void set_player_info_nickname(PlayerInfo *info, const char *nickname);
+struct PlayerInfoC set_player_info_nickname(struct PlayerInfoC info, const char *nickname);
uint16_t get_default_port(void);
-PadClient *init_client(const char *address);
+struct PadClientC init_client(const char *address);
+
+struct PadClientC init_client_with_port(const char *address, uint16_t port);
-PadClient *init_client_with_port(const char *address, uint16_t port);
+struct PadClientC set_client_quiet(struct PadClientC client);
-void set_client_quiet(PadClient *client);
+struct PadClientC enable_client_console(struct PadClientC client);
-void enable_client_console(PadClient *client);
+struct PadClientC bind_player_to_client(struct PadClientC client, struct PlayerInfoC info);
-void bind_player_to_client(PadClient *client, PlayerInfo *info);
+PadClient *complete(struct PadClientC client);
void connect_client_to_server(PadClient *client);
void exit_client_from_server(const PadClient *client);
-void put_a_msg_to_server(const PadClient *client, struct CtrlMsgC msg);
+void put_a_msg_to_server(const PadClient *client, struct ControlMessageC msg);
-struct GameMsgC pop_a_msg_from_server(const PadClient *client);
+struct GameMessageC pop_a_msg_from_server(const PadClient *client);
-struct GameMsgC pop_msg_from_server_or(const PadClient *client, struct GameMsgC or);
+struct GameMessageC pop_msg_from_server_or(const PadClient *client, struct GameMessageC or);
PadServer *init_server(const char *address);
@@ -131,7 +163,7 @@ void set_server_quiet(PadServer *server);
void enable_server_console(PadServer *server);
-void bind_profile_to_server(PadServer *server, GameProfile *profile);
+void bind_profile_to_server(PadServer *server, const struct GameProfileC *profile);
void start_server(PadServer *server);
@@ -143,25 +175,27 @@ void unlock_game_on_server(PadServer *server);
bool is_server_game_locked(PadServer *server);
-void put_a_msg_to_player(PadServer *server, struct GameMsgC msg, const PlayerInfo *player);
+void put_a_msg_to_player(PadServer *server,
+ struct GameMessageC msg,
+ const struct PlayerInfoC *player);
-void put_msg_to_all_players(PadServer *server, struct GameMsgC msg);
+void put_msg_to_all_players(PadServer *server, struct GameMessageC msg);
-struct CtrlMsgC pop_a_msg_from_player(PadServer *server, const PlayerInfo *player);
+struct ControlMessageC pop_a_msg_from_player(PadServer *server, const struct PlayerInfoC *player);
-struct CtrlMsgC pop_msg_from_player_or(PadServer *server,
- const PlayerInfo *player,
- struct CtrlMsgC or);
+struct ControlMessageC pop_msg_from_player_or(PadServer *server,
+ const struct PlayerInfoC *player,
+ struct ControlMessageC or);
-bool is_player_online(PadServer *server, const PlayerInfo *player);
+bool is_player_online(PadServer *server, const struct PlayerInfoC *player);
-bool is_player_banned(PadServer *server, const PlayerInfo *player);
+bool is_player_banned(PadServer *server, const struct PlayerInfoC *player);
-void kick_player(PadServer *server, const PlayerInfo *player);
+void kick_player(PadServer *server, const struct PlayerInfoC *player);
-void ban_player(PadServer *server, const PlayerInfo *player);
+void ban_player(PadServer *server, const struct PlayerInfoC *player);
-void pardon_player(PadServer *server, const PlayerInfo *player);
+void pardon_player(PadServer *server, const struct PlayerInfoC *player);
struct PlayerList list_online_players(PadServer *server);
diff --git a/release/0.1.0/bridge/nogamepads_cpp.h b/release/0.1.0/bridge/nogamepads_cpp.h
index ab27981..77469fb 100644
--- a/release/0.1.0/bridge/nogamepads_cpp.h
+++ b/release/0.1.0/bridge/nogamepads_cpp.h
@@ -35,6 +35,32 @@ enum class LeaveReasonData {
YouAreBanned,
};
+struct GameProfileC {
+ const char *game_name;
+ const char *game_description;
+ const char *organization;
+ const char *version;
+ const char *website;
+ const char *email;
+};
+
+struct PlayerInfoC {
+ const char *account_id;
+ const char *account_hash;
+ const char *customize_nickname;
+ int32_t customize_color_hue;
+ double customize_color_saturation;
+ double customize_color_value;
+};
+
+struct PadClientC {
+ const char *target_address;
+ uint16_t target_port;
+ PlayerInfoC bind_player;
+ bool enable_console;
+ bool quiet;
+};
+
struct KeyData {
uint8_t key;
};
@@ -62,7 +88,7 @@ union CtrlMsgCUnion {
StrData str;
};
-struct CtrlMsgC {
+struct ControlMessageC {
CtrlMsgCTag tag;
CtrlMsgCUnion data;
};
@@ -73,62 +99,64 @@ union GameMsgCUnion {
LeaveReasonData reason;
};
-struct GameMsgC {
+struct GameMessageC {
GameMsgCTag tag;
GameMsgCUnion data;
};
struct PlayerList {
- PlayerInfo *players;
+ PlayerInfoC *players;
uintptr_t len;
uintptr_t capacity;
};
extern "C" {
-GameProfile *init_game_profile();
+GameProfileC init_game_profile();
-void set_game_profile_name(GameProfile *game_profile, const char *value);
+GameProfileC set_game_profile_name(GameProfileC game_profile, const char *value);
-void set_game_profile_description(GameProfile *game_profile, const char *value);
+GameProfileC set_game_profile_description(GameProfileC game_profile, const char *value);
-void set_game_profile_organization(GameProfile *game_profile, const char *value);
+GameProfileC set_game_profile_organization(GameProfileC game_profile, const char *value);
-void set_game_profile_version(GameProfile *game_profile, const char *value);
+GameProfileC set_game_profile_version(GameProfileC game_profile, const char *value);
-void set_game_profile_website(GameProfile *game_profile, const char *value);
+GameProfileC set_game_profile_website(GameProfileC game_profile, const char *value);
-void set_game_profile_email(GameProfile *game_profile, const char *value);
+GameProfileC set_game_profile_email(GameProfileC game_profile, const char *value);
-PlayerInfo *init_player_info();
+PlayerInfoC init_player_info();
-void set_player_info_account(PlayerInfo *info, const char *id, const char *password);
+PlayerInfoC set_player_info_account(PlayerInfoC info, const char *id, const char *password);
-void set_player_info_color(PlayerInfo *info, int32_t h, double s, double v);
+PlayerInfoC set_player_info_color(PlayerInfoC info, int32_t h, double s, double v);
-void set_player_info_nickname(PlayerInfo *info, const char *nickname);
+PlayerInfoC set_player_info_nickname(PlayerInfoC info, const char *nickname);
uint16_t get_default_port();
-PadClient *init_client(const char *address);
+PadClientC init_client(const char *address);
+
+PadClientC init_client_with_port(const char *address, uint16_t port);
-PadClient *init_client_with_port(const char *address, uint16_t port);
+PadClientC set_client_quiet(PadClientC client);
-void set_client_quiet(PadClient *client);
+PadClientC enable_client_console(PadClientC client);
-void enable_client_console(PadClient *client);
+PadClientC bind_player_to_client(PadClientC client, PlayerInfoC info);
-void bind_player_to_client(PadClient *client, PlayerInfo *info);
+PadClient *complete(PadClientC client);
void connect_client_to_server(PadClient *client);
void exit_client_from_server(const PadClient *client);
-void put_a_msg_to_server(const PadClient *client, CtrlMsgC msg);
+void put_a_msg_to_server(const PadClient *client, ControlMessageC msg);
-GameMsgC pop_a_msg_from_server(const PadClient *client);
+GameMessageC pop_a_msg_from_server(const PadClient *client);
-GameMsgC pop_msg_from_server_or(const PadClient *client, GameMsgC or);
+GameMessageC pop_msg_from_server_or(const PadClient *client, GameMessageC or);
PadServer *init_server(const char *address);
@@ -138,7 +166,7 @@ void set_server_quiet(PadServer *server);
void enable_server_console(PadServer *server);
-void bind_profile_to_server(PadServer *server, GameProfile *profile);
+void bind_profile_to_server(PadServer *server, const GameProfileC *profile);
void start_server(PadServer *server);
@@ -150,23 +178,25 @@ void unlock_game_on_server(PadServer *server);
bool is_server_game_locked(PadServer *server);
-void put_a_msg_to_player(PadServer *server, GameMsgC msg, const PlayerInfo *player);
+void put_a_msg_to_player(PadServer *server, GameMessageC msg, const PlayerInfoC *player);
-void put_msg_to_all_players(PadServer *server, GameMsgC msg);
+void put_msg_to_all_players(PadServer *server, GameMessageC msg);
-CtrlMsgC pop_a_msg_from_player(PadServer *server, const PlayerInfo *player);
+ControlMessageC pop_a_msg_from_player(PadServer *server, const PlayerInfoC *player);
-CtrlMsgC pop_msg_from_player_or(PadServer *server, const PlayerInfo *player, CtrlMsgC or);
+ControlMessageC pop_msg_from_player_or(PadServer *server,
+ const PlayerInfoC *player,
+ ControlMessageC or);
-bool is_player_online(PadServer *server, const PlayerInfo *player);
+bool is_player_online(PadServer *server, const PlayerInfoC *player);
-bool is_player_banned(PadServer *server, const PlayerInfo *player);
+bool is_player_banned(PadServer *server, const PlayerInfoC *player);
-void kick_player(PadServer *server, const PlayerInfo *player);
+void kick_player(PadServer *server, const PlayerInfoC *player);
-void ban_player(PadServer *server, const PlayerInfo *player);
+void ban_player(PadServer *server, const PlayerInfoC *player);
-void pardon_player(PadServer *server, const PlayerInfo *player);
+void pardon_player(PadServer *server, const PlayerInfoC *player);
PlayerList list_online_players(PadServer *server);
diff --git a/release/0.1.0/bridge/nogamepads_lib_c.dll b/release/0.1.0/bridge/nogamepads_lib_c.dll
index f9fa81d..1dcd807 100644
--- a/release/0.1.0/bridge/nogamepads_lib_c.dll
+++ b/release/0.1.0/bridge/nogamepads_lib_c.dll
Binary files differ