Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
using System;

namespace CoreBluetooth.Foundation
{
public class NSNumber : IDisposable
{
internal SafeNSNumberHandle Handle { get; private set; }

internal NSNumber(bool value)
{
Handle = NativeMethods.ns_number_new_bool(value);
}

internal NSNumber(int value)
{
Handle = NativeMethods.ns_number_new_int(value);
}

internal NSNumber(SafeNSNumberHandle handle)
{
Handle = handle;
}

internal NSNumber(IntPtr handle)
{
Handle = new SafeNSNumberHandle(handle);
}

public bool BoolValue()
{
ExceptionUtils.ThrowObjectDisposedExceptionIf(Handle.IsInvalid, this);
return NativeMethods.ns_number_bool_value(Handle);
}

public int IntValue()
{
ExceptionUtils.ThrowObjectDisposedExceptionIf(Handle.IsInvalid, this);
return NativeMethods.ns_number_int_value(Handle);
}

public void Dispose()
{
if (Handle != null && !Handle.IsInvalid)
Handle.Dispose();
}
}
}

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
using System;
using System.Runtime.InteropServices;

namespace CoreBluetooth.Foundation
{
internal static class NativeMethods
{
#if UNITY_IOS && !UNITY_EDITOR
const string DLL_NAME = "__Internal";
#else
const string DLL_NAME = "libCoreBluetoothForUnity";
#endif

[DllImport(DLL_NAME, CallingConvention = CallingConvention.Cdecl)]
internal static extern void ns_object_release(IntPtr handle);

[DllImport(DLL_NAME, CallingConvention = CallingConvention.Cdecl)]
internal static extern SafeNSNumberHandle ns_number_new_bool([MarshalAs(UnmanagedType.I1)] bool value);

[DllImport(DLL_NAME, CallingConvention = CallingConvention.Cdecl)]
internal static extern SafeNSNumberHandle ns_number_new_int(int value);

[DllImport(DLL_NAME, CallingConvention = CallingConvention.Cdecl)]
internal static extern bool ns_number_bool_value(SafeNSNumberHandle handle);

[DllImport(DLL_NAME, CallingConvention = CallingConvention.Cdecl)]
internal static extern int ns_number_int_value(SafeNSNumberHandle handle);
}
}

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
using System;

namespace CoreBluetooth.Foundation
{
internal class SafeNSNumberHandle : SafeNSObjectHandle
{
public SafeNSNumberHandle() : base() { }
public SafeNSNumberHandle(IntPtr handle) : base(handle) { }
}
}

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
using System;
using Microsoft.Win32.SafeHandles;

namespace CoreBluetooth.Foundation
{
public abstract class SafeNSObjectHandle : SafeHandleZeroOrMinusOneIsInvalid
{
protected SafeNSObjectHandle() : base(true) { }
protected SafeNSObjectHandle(IntPtr handle) : base(true)
{
SetHandle(handle);
}

protected override bool ReleaseHandle()
{
NativeMethods.ns_object_release(handle);
return true;
}
}
}

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
using CoreBluetooth.Foundation;
using NUnit.Framework;

namespace CoreBluetoothTests.Foundation
{
public class NSNumberTests
{
[Test]
public void IntValue()
{
using var nsNumber = new NSNumber(2);
Assert.That(nsNumber.Handle, Is.Not.Null);
Assert.That(nsNumber.Handle.IsInvalid, Is.False);
Assert.That(nsNumber.IntValue, Is.EqualTo(2));
}

[Test]
public void BoolValue()
{
using var trueNumber = new NSNumber(true);
Assert.That(trueNumber.Handle, Is.Not.Null);
Assert.That(trueNumber.Handle.IsInvalid, Is.False);
Assert.That(trueNumber.BoolValue, Is.True);

using var falseNumber = new NSNumber(false);
Assert.That(falseNumber.Handle, Is.Not.Null);
Assert.That(falseNumber.Handle.IsInvalid, Is.False);
Assert.That(falseNumber.BoolValue, Is.False);
}
}
}

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
import Foundation

@_cdecl("ns_object_release")
public func ns_object_release(_ handle: UnsafeRawPointer) {
Unmanaged<NSObject>.fromOpaque(handle).release()
}

@_cdecl("ns_number_new_bool")
public func ns_number_new_bool(_ value: Bool) -> UnsafeMutableRawPointer {
let instance = NSNumber(value: value)
return Unmanaged.passRetained(instance).toOpaque()
}

@_cdecl("ns_number_new_int")
public func ns_number_new_int(_ value: Int32) -> UnsafeMutableRawPointer {
let instance = NSNumber(value: value)
return Unmanaged.passRetained(instance).toOpaque()
}

@_cdecl("ns_number_bool_value")
public func ns_number_bool_value(_ handle: UnsafeRawPointer) -> Bool {
let instance = Unmanaged<NSNumber>.fromOpaque(handle).takeUnretainedValue()
return instance.boolValue
}

@_cdecl("ns_number_int_value")
public func ns_number_int_value(_ handle: UnsafeRawPointer) -> Int32 {
let instance = Unmanaged<NSNumber>.fromOpaque(handle).takeUnretainedValue()
return instance.int32Value
}