[Network] Cleanup the NWProtocolMetadata. (#7270)

Co-Authored-By: Rolf Bjarne Kvinge <rolf@xamarin.com>
This commit is contained in:
Manuel de la Pena 2019-10-22 23:49:51 +02:00 коммит произвёл GitHub
Родитель 09363654ad
Коммит 20df742564
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 4AEE18F83AFDEB23
8 изменённых файлов: 235 добавлений и 21 удалений

Просмотреть файл

@ -560,6 +560,15 @@ namespace Network {
return new NWProtocolMetadata (x, owns: true);
}
public T GetProtocolMetadata<T> (NWProtocolDefinition definition) where T : NWProtocolMetadata
{
if (definition == null)
throw new ArgumentNullException (nameof (definition));
var x = nw_connection_copy_protocol_metadata (GetCheckedHandle (), definition.Handle);
return Runtime.GetINativeObject<T> (x, owns: true);
}
[DllImport (Constants.NetworkLibrary)]
extern static /* uint32_t */ uint nw_connection_get_maximum_datagram_size (IntPtr handle);

Просмотреть файл

@ -0,0 +1,42 @@
//
// NWIPMetadata.cs: Bindings the Netowrk nw_protocol_metadata_t API that is an IP.
//
// Authors:
// Manuel de la Pena <mandel@microsoft.com>
//
// Copyrigh 2019 Microsoft
//
using System;
using ObjCRuntime;
using Foundation;
using CoreFoundation;
namespace Network {
[TV (12,0), Mac (10,14), iOS (12,0), Watch (6,0)]
public class NWIPMetadata : NWProtocolMetadata {
internal NWIPMetadata (IntPtr handle, bool owns) : base (handle, owns) {}
public NWIPMetadata () : this (nw_ip_create_metadata (), owns: true) {}
public NWIPEcnFlag EcnFlag {
get => nw_ip_metadata_get_ecn_flag (GetCheckedHandle ());
set => nw_ip_metadata_set_ecn_flag (GetCheckedHandle (), value);
}
// A single tick represents one hundred nanoseconds, API returns: the time at which a packet was received, in nanoseconds
// so we get nanoseconds, divide by 100 and use from ticks
public TimeSpan ReceiveTime {
get {
var time = nw_ip_metadata_get_receive_time (GetCheckedHandle ());
return TimeSpan.FromTicks ((long) time / 100);
}
}
public NWServiceClass ServiceClass {
get => nw_ip_metadata_get_service_class (GetCheckedHandle ());
set => nw_ip_metadata_set_service_class (GetCheckedHandle (), value);
}
}
}

Просмотреть файл

@ -40,53 +40,60 @@ namespace Network {
public class NWProtocolMetadata : NativeObject {
[DllImport (Constants.NetworkLibrary)]
static extern OS_nw_protocol_metadata nw_ip_create_metadata ();
internal static extern OS_nw_protocol_metadata nw_ip_create_metadata ();
#if !XAMCORE_4_0
[Obsolete ("Use the 'NWIPMetadata' class and methods instead.")]
public static NWProtocolMetadata CreateIPMetadata ()
{
return new NWProtocolMetadata (nw_ip_create_metadata (), owns: true);
}
#endif
[DllImport (Constants.NetworkLibrary)]
static extern OS_nw_protocol_metadata nw_udp_create_metadata ();
internal static extern OS_nw_protocol_metadata nw_udp_create_metadata ();
#if !XAMCORE_4_0
[Obsolete ("Use the 'NSUdpMetadata' class and methods instead.")]
public static NWProtocolMetadata CreateUdpMetadata ()
{
return new NWProtocolMetadata (nw_udp_create_metadata (), owns: true);
}
#endif
public NWProtocolMetadata (IntPtr handle, bool owns) : base (handle, owns) {}
[DllImport (Constants.NetworkLibrary)]
static extern OS_nw_protocol_definition nw_protocol_metadata_copy_definition (OS_nw_protocol_metadata metadata);
internal static extern OS_nw_protocol_definition nw_protocol_metadata_copy_definition (OS_nw_protocol_metadata metadata);
public NWProtocolDefinition ProtocolDefinition => new NWProtocolDefinition (nw_protocol_metadata_copy_definition (GetCheckedHandle ()), owns: true);
[DllImport (Constants.NetworkLibrary)]
[return: MarshalAs (UnmanagedType.I1)]
static extern bool nw_protocol_metadata_is_ip (OS_nw_protocol_metadata metadata);
internal static extern bool nw_protocol_metadata_is_ip (OS_nw_protocol_metadata metadata);
public bool IsIP => nw_protocol_metadata_is_ip (GetCheckedHandle ());
[DllImport (Constants.NetworkLibrary)]
[return: MarshalAs (UnmanagedType.I1)]
static extern bool nw_protocol_metadata_is_udp (OS_nw_protocol_metadata metadata);
internal static extern bool nw_protocol_metadata_is_udp (OS_nw_protocol_metadata metadata);
public bool IsUdp => nw_protocol_metadata_is_udp (GetCheckedHandle ());
[DllImport (Constants.NetworkLibrary)]
[return: MarshalAs (UnmanagedType.I1)]
static extern bool nw_protocol_metadata_is_tls (OS_nw_protocol_metadata metadata);
internal static extern bool nw_protocol_metadata_is_tls (OS_nw_protocol_metadata metadata);
public bool IsTls => nw_protocol_metadata_is_tls (GetCheckedHandle ());
[DllImport (Constants.NetworkLibrary)]
[return: MarshalAs (UnmanagedType.I1)]
static extern bool nw_protocol_metadata_is_tcp (OS_nw_protocol_metadata metadata);
internal static extern bool nw_protocol_metadata_is_tcp (OS_nw_protocol_metadata metadata);
public bool IsTcp => nw_protocol_metadata_is_tcp (GetCheckedHandle ());
[DllImport (Constants.NetworkLibrary)]
static extern IntPtr nw_tls_copy_sec_protocol_metadata (IntPtr handle);
internal static extern IntPtr nw_tls_copy_sec_protocol_metadata (IntPtr handle);
void CheckIsIP ()
{
@ -107,23 +114,26 @@ namespace Network {
}
#if !XAMCORE_4_0
[Obsolete ("Use 'TlsSecProtocolMetadata' instead.")]
[Obsolete ("Use the 'NWTlsMetadata' class and methods instead.")]
public SecProtocolMetadata SecProtocolMetadata => TlsSecProtocolMetadata;
#endif
[Obsolete ("Use the 'NWTlsMetadata' class and methods instead.")]
public SecProtocolMetadata TlsSecProtocolMetadata {
get {
CheckIsTls ();
return new SecProtocolMetadata (nw_tls_copy_sec_protocol_metadata (GetCheckedHandle ()), owns: true);
}
}
#endif
[DllImport (Constants.NetworkLibrary)]
static extern void nw_ip_metadata_set_ecn_flag (OS_nw_protocol_metadata metadata, NWIPEcnFlag ecn_flag);
internal static extern void nw_ip_metadata_set_ecn_flag (OS_nw_protocol_metadata metadata, NWIPEcnFlag ecn_flag);
[DllImport (Constants.NetworkLibrary)]
static extern NWIPEcnFlag nw_ip_metadata_get_ecn_flag (OS_nw_protocol_metadata metadata);
internal static extern NWIPEcnFlag nw_ip_metadata_get_ecn_flag (OS_nw_protocol_metadata metadata);
#if !XAMCORE_4_0
[Obsolete ("Use the 'NWIPMetadata' class and methods instead.")]
public NWIPEcnFlag IPMetadataEcnFlag {
get {
CheckIsIP ();
@ -134,31 +144,35 @@ namespace Network {
nw_ip_metadata_set_ecn_flag (GetCheckedHandle (), value);
}
}
#endif
[DllImport (Constants.NetworkLibrary)]
static extern /* uint64_t */ ulong nw_ip_metadata_get_receive_time (OS_nw_protocol_metadata metadata);
internal static extern /* uint64_t */ ulong nw_ip_metadata_get_receive_time (OS_nw_protocol_metadata metadata);
#if !XAMCORE_4_0
[Obsolete ("Use the 'NWIPMetadata' class and methods instead.")]
public ulong IPMetadataReceiveTime {
get {
CheckIsIP ();
return nw_ip_metadata_get_receive_time (GetCheckedHandle ());
}
}
#endif
[DllImport (Constants.NetworkLibrary)]
static extern void nw_ip_metadata_set_service_class (OS_nw_protocol_metadata metadata, NWServiceClass service_class);
internal static extern void nw_ip_metadata_set_service_class (OS_nw_protocol_metadata metadata, NWServiceClass service_class);
[DllImport (Constants.NetworkLibrary)]
static extern NWServiceClass nw_ip_metadata_get_service_class (OS_nw_protocol_metadata metadata);
internal static extern NWServiceClass nw_ip_metadata_get_service_class (OS_nw_protocol_metadata metadata);
#if !XAMCORE_4_0
[Obsolete ("Use 'IPServiceClass' instead.")]
[Obsolete ("Use the 'NWIPMetadata' class and methods instead.")]
public NWServiceClass ServiceClass {
get => IPServiceClass;
set => IPServiceClass = value;
}
#endif
[Obsolete ("Use the 'NWIPMetadata' class and methods instead.")]
public NWServiceClass IPServiceClass {
get {
CheckIsIP ();
@ -169,35 +183,42 @@ namespace Network {
nw_ip_metadata_set_service_class (GetCheckedHandle (), value);
}
}
#endif
[DllImport (Constants.NetworkLibrary)]
extern static /* uint32_t */ uint nw_tcp_get_available_receive_buffer (IntPtr handle);
internal extern static /* uint32_t */ uint nw_tcp_get_available_receive_buffer (IntPtr handle);
#if !XAMCORE_4_0
[Obsolete ("Use the 'NWTcpMetadata' class and methods instead.")]
public uint TcpGetAvailableReceiveBuffer ()
{
CheckIsTcp ();
return nw_tcp_get_available_receive_buffer (GetCheckedHandle ());
}
#endif
[DllImport (Constants.NetworkLibrary)]
extern static /* uint32_t */ uint nw_tcp_get_available_send_buffer (IntPtr handle);
internal extern static /* uint32_t */ uint nw_tcp_get_available_send_buffer (IntPtr handle);
#if !XAMCORE_4_0
[Obsolete ("Use the 'NWTcpMetadata' class and methods instead.")]
public uint TcpGetAvailableSendBuffer ()
{
CheckIsTcp ();
return nw_tcp_get_available_send_buffer (GetCheckedHandle ());
}
#endif
[TV (13,0), Mac (10,15), iOS (13,0), Watch (6,0)]
[DllImport (Constants.NetworkLibrary)]
static extern bool nw_protocol_metadata_is_framer_message (OS_nw_protocol_metadata metadata);
internal static extern bool nw_protocol_metadata_is_framer_message (OS_nw_protocol_metadata metadata);
[TV (13,0), Mac (10,15), iOS (13,0), Watch (6,0)]
public bool IsFramerMessage => nw_protocol_metadata_is_framer_message (GetCheckedHandle ());
[TV (13,0), Mac (10,15), iOS (13,0), Watch (6,0)]
[DllImport (Constants.NetworkLibrary)]
static extern bool nw_protocol_metadata_is_ws (OS_nw_protocol_metadata metadata);
internal static extern bool nw_protocol_metadata_is_ws (OS_nw_protocol_metadata metadata);
[TV (13,0), Mac (10,15), iOS (13,0), Watch (6,0)]
public bool IsWebSocket => nw_protocol_metadata_is_ws (GetCheckedHandle ());

Просмотреть файл

@ -0,0 +1,25 @@
//
// NWTcpMetadata.cs: Bindings the Netowrk nw_protocol_metadata_t API that is an Tcp.
//
// Authors:
// Manuel de la Pena <mandel@microsoft.com>
//
// Copyrigh 2019 Microsoft
//
using System;
using ObjCRuntime;
using Foundation;
using CoreFoundation;
namespace Network {
[TV (12,0), Mac (10,14), iOS (12,0), Watch (6,0)]
public class NWTcpMetadata : NWProtocolMetadata {
internal NWTcpMetadata (IntPtr handle, bool owns) : base (handle, owns) {}
public uint AvailableReceiveBuffer => nw_tcp_get_available_receive_buffer (GetCheckedHandle ());
public uint AvailableSendBuffer => nw_tcp_get_available_send_buffer (GetCheckedHandle ());
}
}

Просмотреть файл

@ -0,0 +1,26 @@
//
// NWTlsMetadata.cs: Bindings the Netowrk nw_protocol_metadata_t API that is an Tls.
//
// Authors:
// Manuel de la Pena <mandel@microsoft.com>
//
// Copyrigh 2019 Microsoft
//
using System;
using ObjCRuntime;
using Foundation;
using Security;
using CoreFoundation;
namespace Network {
[TV (12,0), Mac (10,14), iOS (12,0), Watch (6,0)]
public class NWTlsMetadata : NWProtocolMetadata {
internal NWTlsMetadata (IntPtr handle, bool owns) : base (handle, owns) {}
public SecProtocolMetadata SecProtocolMetadata
=> new SecProtocolMetadata (nw_tls_copy_sec_protocol_metadata (GetCheckedHandle ()), owns: true);
}
}

Просмотреть файл

@ -0,0 +1,25 @@
//
// NWUdpMetadata.cs: Bindings the Netowrk nw_protocol_metadata_t API that is an Udp.
//
// Authors:
// Manuel de la Pena <mandel@microsoft.com>
//
// Copyrigh 2019 Microsoft
//
using System;
using ObjCRuntime;
using Foundation;
using Security;
using CoreFoundation;
namespace Network {
[TV (12,0), Mac (10,14), iOS (12,0), Watch (6,0)]
public class NWUdpMetadata : NWProtocolMetadata {
internal NWUdpMetadata (IntPtr handle, bool owns) : base (handle, owns) {}
public NWUdpMetadata () : this (nw_udp_create_metadata (), owns: true) {}
}
}

Просмотреть файл

@ -1178,6 +1178,7 @@ NETWORK_SOURCES = \
Network/NWError.cs \
Network/NWFramer.cs \
Network/NWInterface.cs \
Network/NWIPMetadata.cs \
Network/NWListener.cs \
Network/NWProtocolIPOptions.cs \
Network/NWParameters.cs \
@ -1187,10 +1188,13 @@ NETWORK_SOURCES = \
Network/NWProtocolMetadata.cs \
Network/NWProtocolOptions.cs \
Network/NWProtocolStack.cs \
Network/NWTcpMetadata.cs \
Network/NWTlsMetadata.cs \
Network/NWTxtRecord.cs \
Network/NWProtocolTcpOptions.cs \
Network/NWProtocolTlsOptions.cs \
Network/NWProtocolUdpOptions.cs \
Network/NWUdpMetadata.cs \
Network/NWWebSocketMetadata.cs \
Network/NWWebSocketOptions.cs \
Network/NWWebSocketRequest.cs \

Просмотреть файл

@ -0,0 +1,62 @@
#if !__WATCHOS__
using System;
using Foundation;
using Network;
using ObjCRuntime;
using NUnit.Framework;
namespace MonoTouchFixtures.Network {
[TestFixture]
[Preserve (AllMembers = true)]
public class NWIPProtocolMetadataTest {
NWIPMetadata metadata;
[TestFixtureSetUp]
public void Init () => TestRuntime.AssertXcodeVersion (10, 0);
[SetUp]
public void SetUp ()
{
metadata = new NWIPMetadata ();
}
[TearDown]
public void TearDown ()
{
metadata.Dispose ();
}
[Test]
public void TestEcnFlagProperty ()
{
Assert.That (metadata.EcnFlag, Is.EqualTo (NWIPEcnFlag.NonEct), "default value");
metadata.EcnFlag = NWIPEcnFlag.Ect1;
Assert.That (metadata.EcnFlag, Is.EqualTo (NWIPEcnFlag.Ect1), "new value");
}
[Test]
public void TestServiceClassProperty ()
{
Assert.That (metadata.ServiceClass, Is.EqualTo (NWServiceClass.BestEffort), "default value");
metadata.ServiceClass = NWServiceClass.InteractiveVideo;
Assert.That (metadata.ServiceClass, Is.EqualTo (NWServiceClass.InteractiveVideo), "new value");
}
[Test]
public void TestReceiveTimeProperty ()
{
Assert.That (metadata.ReceiveTime, Is.EqualTo (TimeSpan.Zero), "default value");
}
[Test]
public void TestMetadataType ()
{
Assert.True (metadata.IsIP, "IsIP");
Assert.False (metadata.IsTcp, "IsTcp");
Assert.False (metadata.IsUdp, "IsUdp");
}
}
}
#endif