aboutsummaryrefslogtreecommitdiff
path: root/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/AccessPoint.cs
diff options
context:
space:
mode:
Diffstat (limited to 'src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/AccessPoint.cs')
-rw-r--r--src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/AccessPoint.cs104
1 files changed, 104 insertions, 0 deletions
diff --git a/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/AccessPoint.cs b/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/AccessPoint.cs
new file mode 100644
index 00000000..07bbbeda
--- /dev/null
+++ b/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/AccessPoint.cs
@@ -0,0 +1,104 @@
+using Ryujinx.Common.Memory;
+using Ryujinx.HLE.HOS.Services.Ldn.Types;
+using Ryujinx.HLE.HOS.Services.Ldn.UserServiceCreator.Network.Types;
+using Ryujinx.HLE.HOS.Services.Ldn.UserServiceCreator.RyuLdn.Types;
+using System;
+
+namespace Ryujinx.HLE.HOS.Services.Ldn.UserServiceCreator
+{
+ class AccessPoint : IDisposable
+ {
+ private byte[] _advertiseData;
+
+ private readonly IUserLocalCommunicationService _parent;
+
+ public NetworkInfo NetworkInfo;
+ public Array8<NodeLatestUpdate> LatestUpdates = new();
+ public bool Connected { get; private set; }
+
+ public AccessPoint(IUserLocalCommunicationService parent)
+ {
+ _parent = parent;
+
+ _parent.NetworkClient.NetworkChange += NetworkChanged;
+ }
+
+ public void Dispose()
+ {
+ _parent.NetworkClient.DisconnectNetwork();
+
+ _parent.NetworkClient.NetworkChange -= NetworkChanged;
+ }
+
+ private void NetworkChanged(object sender, RyuLdn.NetworkChangeEventArgs e)
+ {
+ LatestUpdates.CalculateLatestUpdate(NetworkInfo.Ldn.Nodes, e.Info.Ldn.Nodes);
+
+ NetworkInfo = e.Info;
+
+ if (Connected != e.Connected)
+ {
+ Connected = e.Connected;
+
+ if (Connected)
+ {
+ _parent.SetState(NetworkState.AccessPointCreated);
+ }
+ else
+ {
+ _parent.SetDisconnectReason(e.DisconnectReasonOrDefault(DisconnectReason.DestroyedBySystem));
+ }
+ }
+ else
+ {
+ _parent.SetState();
+ }
+ }
+
+ public ResultCode SetAdvertiseData(byte[] advertiseData)
+ {
+ _advertiseData = advertiseData;
+
+ _parent.NetworkClient.SetAdvertiseData(_advertiseData);
+
+ return ResultCode.Success;
+ }
+
+ public ResultCode SetStationAcceptPolicy(AcceptPolicy acceptPolicy)
+ {
+ _parent.NetworkClient.SetStationAcceptPolicy(acceptPolicy);
+
+ return ResultCode.Success;
+ }
+
+ public ResultCode CreateNetwork(SecurityConfig securityConfig, UserConfig userConfig, NetworkConfig networkConfig)
+ {
+ CreateAccessPointRequest request = new()
+ {
+ SecurityConfig = securityConfig,
+ UserConfig = userConfig,
+ NetworkConfig = networkConfig,
+ };
+
+ bool success = _parent.NetworkClient.CreateNetwork(request, _advertiseData ?? Array.Empty<byte>());
+
+ return success ? ResultCode.Success : ResultCode.InvalidState;
+ }
+
+ public ResultCode CreateNetworkPrivate(SecurityConfig securityConfig, SecurityParameter securityParameter, UserConfig userConfig, NetworkConfig networkConfig, AddressList addressList)
+ {
+ CreateAccessPointPrivateRequest request = new()
+ {
+ SecurityConfig = securityConfig,
+ SecurityParameter = securityParameter,
+ UserConfig = userConfig,
+ NetworkConfig = networkConfig,
+ AddressList = addressList,
+ };
+
+ bool success = _parent.NetworkClient.CreateNetworkPrivate(request, _advertiseData);
+
+ return success ? ResultCode.Success : ResultCode.InvalidState;
+ }
+ }
+}