Skip to content

Commit 91ebfa7

Browse files
committed
feat: refactor calldata getters to use out parameters and return success status
1 parent 6b257d0 commit 91ebfa7

3 files changed

Lines changed: 96 additions & 37 deletions

File tree

src/ObsKit.NET/Native/Interop/ObsSignal.cs

Lines changed: 72 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -59,52 +59,97 @@ internal static partial void signal_handler_disconnect(
5959
#region Calldata
6060

6161
/// <summary>
62-
/// Gets an integer from calldata.
62+
/// Gets raw data from calldata. This is the core function that other helpers use.
6363
/// </summary>
64-
[LibraryImport(Lib, EntryPoint = "calldata_get_int")]
64+
[LibraryImport(Lib, EntryPoint = "calldata_get_data")]
6565
[UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
66-
internal static partial long calldata_get_int(
66+
private static partial byte calldata_get_data_native(
6767
nint calldata,
68-
[MarshalUsing(typeof(Utf8StringMarshaler))] string name);
68+
[MarshalUsing(typeof(Utf8StringMarshaler))] string name,
69+
nint outPtr,
70+
nuint size);
71+
72+
/// <summary>
73+
/// Gets an integer from calldata.
74+
/// </summary>
75+
internal static bool calldata_get_int(nint calldata, string name, out long value)
76+
{
77+
value = 0;
78+
unsafe
79+
{
80+
fixed (long* ptr = &value)
81+
{
82+
return calldata_get_data_native(calldata, name, (nint)ptr, (nuint)sizeof(long)) != 0;
83+
}
84+
}
85+
}
6986

7087
/// <summary>
7188
/// Gets a float from calldata.
7289
/// </summary>
73-
[LibraryImport(Lib, EntryPoint = "calldata_get_float")]
74-
[UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
75-
internal static partial double calldata_get_float(
76-
nint calldata,
77-
[MarshalUsing(typeof(Utf8StringMarshaler))] string name);
90+
internal static bool calldata_get_float(nint calldata, string name, out double value)
91+
{
92+
value = 0;
93+
unsafe
94+
{
95+
fixed (double* ptr = &value)
96+
{
97+
return calldata_get_data_native(calldata, name, (nint)ptr, (nuint)sizeof(double)) != 0;
98+
}
99+
}
100+
}
78101

79102
/// <summary>
80103
/// Gets a bool from calldata.
81104
/// </summary>
82-
public static bool calldata_get_bool(nint calldata, string name)
83-
=> calldata_get_bool_native(calldata, name) != 0;
84-
85-
[LibraryImport(Lib, EntryPoint = "calldata_get_bool")]
86-
[UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
87-
private static partial byte calldata_get_bool_native(
88-
nint calldata,
89-
[MarshalUsing(typeof(Utf8StringMarshaler))] string name);
105+
internal static bool calldata_get_bool(nint calldata, string name, out bool value)
106+
{
107+
value = false;
108+
unsafe
109+
{
110+
byte byteVal = 0;
111+
var result = calldata_get_data_native(calldata, name, (nint)(&byteVal), (nuint)sizeof(byte)) != 0;
112+
value = byteVal != 0;
113+
return result;
114+
}
115+
}
90116

91117
/// <summary>
92-
/// Gets a string from calldata.
118+
/// Gets a pointer from calldata.
93119
/// </summary>
94-
[LibraryImport(Lib, EntryPoint = "calldata_get_string")]
95-
[UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
96-
internal static partial nint calldata_get_string(
97-
nint calldata,
98-
[MarshalUsing(typeof(Utf8StringMarshaler))] string name);
120+
internal static bool calldata_get_ptr(nint calldata, string name, out nint value)
121+
{
122+
value = nint.Zero;
123+
unsafe
124+
{
125+
fixed (nint* ptr = &value)
126+
{
127+
return calldata_get_data_native(calldata, name, (nint)ptr, (nuint)sizeof(nint)) != 0;
128+
}
129+
}
130+
}
99131

100132
/// <summary>
101-
/// Gets a pointer from calldata.
133+
/// Gets a string from calldata.
102134
/// </summary>
103-
[LibraryImport(Lib, EntryPoint = "calldata_get_ptr")]
135+
internal static bool calldata_get_string(nint calldata, string name, out nint strPtr)
136+
{
137+
strPtr = nint.Zero;
138+
unsafe
139+
{
140+
fixed (nint* ptr = &strPtr)
141+
{
142+
return calldata_get_string_native(calldata, name, (nint)ptr) != 0;
143+
}
144+
}
145+
}
146+
147+
[LibraryImport(Lib, EntryPoint = "calldata_get_string")]
104148
[UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
105-
internal static partial nint calldata_get_ptr(
149+
private static partial byte calldata_get_string_native(
106150
nint calldata,
107-
[MarshalUsing(typeof(Utf8StringMarshaler))] string name);
151+
[MarshalUsing(typeof(Utf8StringMarshaler))] string name,
152+
nint strPtrPtr);
108153

109154
#endregion
110155

src/ObsKit.NET/ObsKit.NET.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
<AssemblyName>ObsKit.NET</AssemblyName>
66
<GenerateDocumentationFile>true</GenerateDocumentationFile>
77
<NoWarn>$(NoWarn);CS1591</NoWarn>
8+
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
89
<PackageId>ObsKit.NET</PackageId>
910
<PackageReadmeFile>README.md</PackageReadmeFile>
1011
<PackageProjectUrl>https://github.com/Segra/ObsKit.NET</PackageProjectUrl>

src/ObsKit.NET/Signals/SignalHandler.cs

Lines changed: 23 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -23,45 +23,58 @@ public static class Calldata
2323
/// <returns>The string value, or null if not found.</returns>
2424
public static string? GetString(nint calldata, string name)
2525
{
26-
var ptr = ObsSignal.calldata_get_string(calldata, name);
27-
return ptr == nint.Zero ? null : Marshal.PtrToStringUTF8(ptr);
26+
if (ObsSignal.calldata_get_string(calldata, name, out var ptr) && ptr != nint.Zero)
27+
return Marshal.PtrToStringUTF8(ptr);
28+
return null;
2829
}
2930

3031
/// <summary>
3132
/// Gets an integer value from calldata.
3233
/// </summary>
3334
/// <param name="calldata">The calldata pointer.</param>
3435
/// <param name="name">The parameter name.</param>
35-
/// <returns>The integer value.</returns>
36+
/// <returns>The integer value, or 0 if not found.</returns>
3637
public static long GetInt(nint calldata, string name)
37-
=> ObsSignal.calldata_get_int(calldata, name);
38+
{
39+
ObsSignal.calldata_get_int(calldata, name, out var value);
40+
return value;
41+
}
3842

3943
/// <summary>
4044
/// Gets a float value from calldata.
4145
/// </summary>
4246
/// <param name="calldata">The calldata pointer.</param>
4347
/// <param name="name">The parameter name.</param>
44-
/// <returns>The float value.</returns>
48+
/// <returns>The float value, or 0.0 if not found.</returns>
4549
public static double GetFloat(nint calldata, string name)
46-
=> ObsSignal.calldata_get_float(calldata, name);
50+
{
51+
ObsSignal.calldata_get_float(calldata, name, out var value);
52+
return value;
53+
}
4754

4855
/// <summary>
4956
/// Gets a boolean value from calldata.
5057
/// </summary>
5158
/// <param name="calldata">The calldata pointer.</param>
5259
/// <param name="name">The parameter name.</param>
53-
/// <returns>The boolean value.</returns>
60+
/// <returns>The boolean value, or false if not found.</returns>
5461
public static bool GetBool(nint calldata, string name)
55-
=> ObsSignal.calldata_get_bool(calldata, name);
62+
{
63+
ObsSignal.calldata_get_bool(calldata, name, out var value);
64+
return value;
65+
}
5666

5767
/// <summary>
5868
/// Gets a pointer value from calldata.
5969
/// </summary>
6070
/// <param name="calldata">The calldata pointer.</param>
6171
/// <param name="name">The parameter name.</param>
62-
/// <returns>The pointer value.</returns>
72+
/// <returns>The pointer value, or IntPtr.Zero if not found.</returns>
6373
public static nint GetPointer(nint calldata, string name)
64-
=> ObsSignal.calldata_get_ptr(calldata, name);
74+
{
75+
ObsSignal.calldata_get_ptr(calldata, name, out var value);
76+
return value;
77+
}
6578
}
6679

6780
/// <summary>

0 commit comments

Comments
 (0)