diff --git a/Orbis Suite 3.0.sln b/Orbis Suite 3.0.sln index 76229b0..16d46e5 100644 --- a/Orbis Suite 3.0.sln +++ b/Orbis Suite 3.0.sln @@ -18,18 +18,12 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Misc", "Misc", "{DBCE3AAD-3 EndProjectSection EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "OrbisNeighborHood", "Windows\OrbisNeighborHood\OrbisNeighborHood.csproj", "{81B068F7-776C-429F-BB7B-5563F75F1A39}" - ProjectSection(ProjectDependencies) = postProject - {6AE42BFE-1833-4804-96EB-38D323B6C28E} = {6AE42BFE-1833-4804-96EB-38D323B6C28E} - EndProjectSection EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Installer", "Installer", "{6046C772-BE17-4BC8-A362-AD8C77F9178E}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "OrbisLib", "Windows\Libraries\OrbisLib\OrbisLib.csproj", "{6AE42BFE-1833-4804-96EB-38D323B6C28E}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "OrbisSuiteService", "Windows\OrbisSuiteService\OrbisSuiteService.csproj", "{D7CFB2D5-FAC2-42D5-ABA7-81CE762575EF}" - ProjectSection(ProjectDependencies) = postProject - {6AE42BFE-1833-4804-96EB-38D323B6C28E} = {6AE42BFE-1833-4804-96EB-38D323B6C28E} - EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "OrbisSuite", "Playstation\OrbisSuite\OrbisSuite.vcxproj", "{228AA300-11F5-49B1-A6B5-4986635C6D0B}" EndProject @@ -37,15 +31,15 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "OrbisToolbox-2.0", "Playsta EndProject Project("{930C7802-8A8C-48F9-8165-68863BCCD9DD}") = "BootstrapperSetup", "Windows\Installer\BootstrapperSetup\BootstrapperSetup.wixproj", "{0978D0B2-FFA5-42B2-81AC-0CFD85DE9184}" ProjectSection(ProjectDependencies) = postProject - {A37095E9-80BD-4A6B-AF8B-33D278CF92F3} = {A37095E9-80BD-4A6B-AF8B-33D278CF92F3} {33C378F9-36C5-4C2C-8350-FD1C8DD5AB66} = {33C378F9-36C5-4C2C-8350-FD1C8DD5AB66} + {A37095E9-80BD-4A6B-AF8B-33D278CF92F3} = {A37095E9-80BD-4A6B-AF8B-33D278CF92F3} EndProjectSection EndProject Project("{930C7802-8A8C-48F9-8165-68863BCCD9DD}") = "DummyInstaller", "Windows\Installer\DummyInstaller\DummyInstaller.wixproj", "{A37095E9-80BD-4A6B-AF8B-33D278CF92F3}" ProjectSection(ProjectDependencies) = postProject - {D7CFB2D5-FAC2-42D5-ABA7-81CE762575EF} = {D7CFB2D5-FAC2-42D5-ABA7-81CE762575EF} - {81B068F7-776C-429F-BB7B-5563F75F1A39} = {81B068F7-776C-429F-BB7B-5563F75F1A39} {6AE42BFE-1833-4804-96EB-38D323B6C28E} = {6AE42BFE-1833-4804-96EB-38D323B6C28E} + {81B068F7-776C-429F-BB7B-5563F75F1A39} = {81B068F7-776C-429F-BB7B-5563F75F1A39} + {D7CFB2D5-FAC2-42D5-ABA7-81CE762575EF} = {D7CFB2D5-FAC2-42D5-ABA7-81CE762575EF} EndProjectSection EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SetupBA", "Windows\Installer\SetupBA\SetupBA.csproj", "{33C378F9-36C5-4C2C-8350-FD1C8DD5AB66}" diff --git a/Playstation/OrbisLibAPI/SocketListener.cpp b/Playstation/OrbisLibAPI/SocketListener.cpp index cfe621a..e057f1b 100644 --- a/Playstation/OrbisLibAPI/SocketListener.cpp +++ b/Playstation/OrbisLibAPI/SocketListener.cpp @@ -96,7 +96,7 @@ void* SocketListener::DoWork() int optval = 1; sceNetSetsockopt(ClientSocket, ORBIS_NET_SOL_SOCKET, ORBIS_NET_SO_NOSIGPIPE, &optval, sizeof(optval)); - int sock_timeout = 2000000; + int sock_timeout = 3000000; sceNetSetsockopt(ClientSocket, ORBIS_NET_SOL_SOCKET, ORBIS_NET_SO_SNDTIMEO, &sock_timeout, sizeof(sock_timeout)); sceNetSetsockopt(ClientSocket, ORBIS_NET_SOL_SOCKET, ORBIS_NET_SO_RCVTIMEO, &sock_timeout, sizeof(sock_timeout)); diff --git a/Playstation/OrbisLibAPI/Target.cpp b/Playstation/OrbisLibAPI/Target.cpp index 0b2f48d..dc4ddb8 100644 --- a/Playstation/OrbisLibAPI/Target.cpp +++ b/Playstation/OrbisLibAPI/Target.cpp @@ -22,23 +22,17 @@ void Target::HandleAPI(OrbisNetId Sock, APIPacket* Packet) ChangeSystemState(SystemState::Suspend); - SendStatus(Sock, APIResults::API_OK); - break; case APICommands::API_TARGET_SHUTDOWN: ChangeSystemState(SystemState::Shutdown); - SendStatus(Sock, APIResults::API_OK); - break; case APICommands::API_TARGET_REBOOT: - ChangeSystemState(SystemState::Reboot); - - SendStatus(Sock, APIResults::API_OK); + ChangeSystemState(SystemState::Reboot);; break; @@ -52,16 +46,12 @@ void Target::HandleAPI(OrbisNetId Sock, APIPacket* Packet) RingBuzzer((BuzzerType)RecieveInt(Sock)); - SendStatus(Sock, APIResults::API_OK); - break; case APICommands::API_TARGET_SET_LED: SetConsoleLED((ConsoleLEDColours)RecieveInt(Sock)); - SendStatus(Sock, APIResults::API_OK); - break; case APICommands::API_TARGET_DUMP_PROC: @@ -142,8 +132,8 @@ void Target::DoNotify(OrbisNetId Sock) { auto Packet = new TargetNotifyPacket(); - sceNetRecv(Sock, Packet, sizeof(TargetNotifyPacket), 0); - + auto res = sceNetRecv(Sock, Packet, sizeof(TargetNotifyPacket), 0); + klog("%llX\n", res); if (!strcmp(Packet->IconURI, "")) Notify(Packet->Message); else diff --git a/Playstation/OrbisLibAPI/Version.h b/Playstation/OrbisLibAPI/Version.h index 8b13be9..59894a0 100644 --- a/Playstation/OrbisLibAPI/Version.h +++ b/Playstation/OrbisLibAPI/Version.h @@ -1,11 +1,11 @@ -#pragma once -#define ORBISLIB_MAJOR 3 -#define ORBISLIB_MINOR 0 -#define ORBISLIB_BUILDVERSION 664 -#define stringify(a) stringify_(a) -#define stringify_(a) #a -#if defined(_DEBUG) -#define ORBISLIB_BUILDSTRING ("[OrbisLib Daemon " stringify(ORBISLIB_MAJOR) "." stringify(ORBISLIB_MINOR) "] Dev Build " stringify(ORBISLIB_BUILDVERSION) " " __DATE__ " " __TIME__) -#else -#define ORBISLIB_BUILDSTRING ("[OrbisLib Daemon " stringify(ORBISLIB_MAJOR) "." stringify(ORBISLIB_MINOR) "] Build " stringify(ORBISLIB_BUILDVERSION) " " __DATE__ " " __TIME__) -#endif +#pragma once +#define ORBISLIB_MAJOR 3 +#define ORBISLIB_MINOR 0 +#define ORBISLIB_BUILDVERSION 668 +#define stringify(a) stringify_(a) +#define stringify_(a) #a +#if defined(_DEBUG) +#define ORBISLIB_BUILDSTRING ("[OrbisLib Daemon " stringify(ORBISLIB_MAJOR) "." stringify(ORBISLIB_MINOR) "] Dev Build " stringify(ORBISLIB_BUILDVERSION) " " __DATE__ " " __TIME__) +#else +#define ORBISLIB_BUILDSTRING ("[OrbisLib Daemon " stringify(ORBISLIB_MAJOR) "." stringify(ORBISLIB_MINOR) "] Build " stringify(ORBISLIB_BUILDVERSION) " " __DATE__ " " __TIME__) +#endif diff --git a/Windows/Libraries/OrbisLib/Classes/DispatcherClient.cs b/Windows/Libraries/OrbisLib/Classes/DispatcherClient.cs index cb64631..a877c07 100644 --- a/Windows/Libraries/OrbisLib/Classes/DispatcherClient.cs +++ b/Windows/Libraries/OrbisLib/Classes/DispatcherClient.cs @@ -2,230 +2,102 @@ using OrbisSuite.Common.Dispatcher; using System.Net.Sockets; using System.Text; +using TinyIpc.Messaging; namespace OrbisSuite { public class DispatcherClient { private OrbisLib PS4; - private Listener? _EventListener; - private int _Port = -1; - private Task _HeartbeatTask; - private CancellationToken _HeartbeatCancellationToken; + private TinyMessageBus _ServiceMessageBus; public DispatcherClient(OrbisLib PS4) { this.PS4 = PS4; - _HeartbeatTask = Task.Run(() => DoHeartbeat()); + _ServiceMessageBus = new TinyMessageBus("OrbisSuite"); + _ServiceMessageBus.MessageReceived += _ServiceMessageBus_MessageReceived; ; } - private void _EventListener_SocketAccepted(Socket e) + private void _ServiceMessageBus_MessageReceived(object? sender, TinyMessageReceivedEventArgs e) { - try + var Packet = (ForwardPacket)Helpers.ByteArrayToObject(e.Message.ToArray()); + + switch (Packet.Type) { - var Packet = (ForwardPacket)e.RecvObject(); - - switch (Packet.Type) - { - default: - Console.WriteLine("Invalid Packet..."); - break; - - // Debugging - case ForwardPacket.PacketType.Print: - PS4.DefaultTarget.Events.RaiseProcPrintEvent(Packet.SenderIPAddress, Packet.Print.Sender, Packet.Print.Data); - PS4.SelectedTarget.Events.RaiseProcPrintEvent(Packet.SenderIPAddress, Packet.Print.Sender, Packet.Print.Data); - break; - - case ForwardPacket.PacketType.SerialCom: - Console.Write(Encoding.UTF8.GetString(Packet.SerialCom.Data)); - break; - - case ForwardPacket.PacketType.Intercept: - PS4.DefaultTarget.Events.RaiseProcInterceptEvent(Packet.SenderIPAddress); - PS4.SelectedTarget.Events.RaiseProcInterceptEvent(Packet.SenderIPAddress); - break; - - case ForwardPacket.PacketType.Continue: - PS4.DefaultTarget.Events.RaiseProcContinueEvent(Packet.SenderIPAddress); - PS4.SelectedTarget.Events.RaiseProcContinueEvent(Packet.SenderIPAddress); - break; - - // Process States - case ForwardPacket.PacketType.ProcessDie: - PS4.DefaultTarget.Events.RaiseProcDieEvent(Packet.SenderIPAddress); - PS4.SelectedTarget.Events.RaiseProcDieEvent(Packet.SenderIPAddress); - break; - - case ForwardPacket.PacketType.ProcessAttach: - PS4.DefaultTarget.Events.RaiseProcAttachEvent(Packet.SenderIPAddress, Packet.ProcessName); - PS4.SelectedTarget.Events.RaiseProcAttachEvent(Packet.SenderIPAddress, Packet.ProcessName); - break; - - case ForwardPacket.PacketType.ProcessDetach: - PS4.DefaultTarget.Events.RaiseProcDetachEvent(Packet.SenderIPAddress); - PS4.SelectedTarget.Events.RaiseProcDetachEvent(Packet.SenderIPAddress); - break; - - // Target State - case ForwardPacket.PacketType.TargetSuspend: - PS4.DefaultTarget.Events.RaiseTargetSuspendEvent(Packet.SenderIPAddress); - PS4.SelectedTarget.Events.RaiseTargetSuspendEvent(Packet.SenderIPAddress); - break; - - case ForwardPacket.PacketType.TargetResume: - PS4.DefaultTarget.Events.RaiseTargetResumeEvent(Packet.SenderIPAddress); - PS4.SelectedTarget.Events.RaiseTargetResumeEvent(Packet.SenderIPAddress); - break; - - case ForwardPacket.PacketType.TargetShutdown: - PS4.DefaultTarget.Events.RaiseTargetShutdownEvent(Packet.SenderIPAddress); - PS4.SelectedTarget.Events.RaiseTargetShutdownEvent(Packet.SenderIPAddress); - break; - - case ForwardPacket.PacketType.TargetNewTitle: - PS4.DefaultTarget.Events.RaiseTargetNewTitleEvent(Packet.SenderIPAddress, Packet.TitleChange.TitleID); - PS4.SelectedTarget.Events.RaiseTargetNewTitleEvent(Packet.SenderIPAddress, Packet.TitleChange.TitleID); - break; - - case ForwardPacket.PacketType.TargetAvailability: - PS4.Events.FireTargetAvailability(Packet.TargetAvailability.Available, Packet.TargetAvailability.Name); - break; - - case ForwardPacket.PacketType.TargetAPIAvailability: - PS4.Events.FireTargetAPIAvailability(Packet.TargetAvailability.Available, Packet.TargetAvailability.Name); - break; - - // Misc - case ForwardPacket.PacketType.DBTouched: - PS4.Events.FireDBTouched(); - break; - } - } - catch (Exception ex) - { - Console.WriteLine($"[{System.Reflection.MethodBase.GetCurrentMethod()?.Name}] Error: {ex.Message}"); - } - } - - /// - /// Attempts to connect to the Dispatcher. - /// - /// Returns true if the connection was successful. - private bool Connect() - { - try - { - if (_Port != -1) - { - Console.WriteLine("[Connect] Already Connected!"); - - return true; - } - - var Sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); - if (Sock.EasyConnect("127.0.0.1", Config.DispatcherPort, 1000)) - { - Sock.SendObject(new DispatcherClientPacket(DispatcherClientPacket.PacketType.NewClient, System.Diagnostics.Process.GetCurrentProcess().ProcessName, -1)); - - _Port = Sock.RecvInt32(); - Sock.Close(); - - if (_Port != -1) - { - Console.WriteLine($"Starting up _EventListener on port { _Port }"); - _EventListener = new Listener(_Port); - _EventListener.Start(); - _EventListener.SocketAccepted += _EventListener_SocketAccepted; - - return true; - } - else - return false; - } - } - catch (Exception ex) - { - Console.WriteLine($"[{System.Reflection.MethodBase.GetCurrentMethod()?.Name}] Error: {ex.Message}"); - } - - return false; - } - - /// - /// Sends a Heart beat Packet. - /// - /// Returns true if the packet was sent successfully. - private bool DoHeartBeat() - { - try - { - if (_Port == -1) - { - Console.WriteLine("[DoHeartBeat] Not Connected!"); - - return false; - } - - var Sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); - if (Sock.EasyConnect("127.0.0.1", Config.DispatcherPort, 1000)) - { - Sock.SendObject(new DispatcherClientPacket(DispatcherClientPacket.PacketType.HeartBeat, System.Diagnostics.Process.GetCurrentProcess().ProcessName, _Port)); - - var Result = Sock.RecvInt32(); - Sock.Close(); - - return (Result == 1); - } - } - catch (Exception ex) - { - Console.WriteLine($"[{System.Reflection.MethodBase.GetCurrentMethod()?.Name}] Error: {ex.Message}"); - } - - return false; - } - - /// - /// Task will Send heartbeat packets to the Service. This will also ensure that we are always connected to the service. - /// - /// - private async Task DoHeartbeat() - { - while (!Connect()) - { - await Task.Delay(500, _HeartbeatCancellationToken); - - if (_HeartbeatCancellationToken.IsCancellationRequested) - break; - } - - if (_Port != -1) - Console.WriteLine("[DispatcherClient] Connection Sucessful!"); - - while (true) - { - await Task.Delay(5000, _HeartbeatCancellationToken); - - if (_HeartbeatCancellationToken.IsCancellationRequested) + default: + Console.WriteLine("Invalid Packet..."); break; - if (!DoHeartBeat()) - { - _Port = -1; + // Debugging + case ForwardPacket.PacketType.Print: + PS4.DefaultTarget.Events.RaiseProcPrintEvent(Packet.SenderIPAddress, Packet.Print.Sender, Packet.Print.Data); + PS4.SelectedTarget.Events.RaiseProcPrintEvent(Packet.SenderIPAddress, Packet.Print.Sender, Packet.Print.Data); + break; - while (!Connect()) - { - await Task.Delay(500, _HeartbeatCancellationToken); + case ForwardPacket.PacketType.SerialCom: + Console.Write(Encoding.UTF8.GetString(Packet.SerialCom.Data)); + break; - if (_HeartbeatCancellationToken.IsCancellationRequested) - break; - } + case ForwardPacket.PacketType.Intercept: + PS4.DefaultTarget.Events.RaiseProcInterceptEvent(Packet.SenderIPAddress); + PS4.SelectedTarget.Events.RaiseProcInterceptEvent(Packet.SenderIPAddress); + break; - if (_Port != -1) - Console.WriteLine("[DispatcherClient] Reconnection Sucessful!"); - } + case ForwardPacket.PacketType.Continue: + PS4.DefaultTarget.Events.RaiseProcContinueEvent(Packet.SenderIPAddress); + PS4.SelectedTarget.Events.RaiseProcContinueEvent(Packet.SenderIPAddress); + break; + + // Process States + case ForwardPacket.PacketType.ProcessDie: + PS4.DefaultTarget.Events.RaiseProcDieEvent(Packet.SenderIPAddress); + PS4.SelectedTarget.Events.RaiseProcDieEvent(Packet.SenderIPAddress); + break; + + case ForwardPacket.PacketType.ProcessAttach: + PS4.DefaultTarget.Events.RaiseProcAttachEvent(Packet.SenderIPAddress, Packet.ProcessName); + PS4.SelectedTarget.Events.RaiseProcAttachEvent(Packet.SenderIPAddress, Packet.ProcessName); + break; + + case ForwardPacket.PacketType.ProcessDetach: + PS4.DefaultTarget.Events.RaiseProcDetachEvent(Packet.SenderIPAddress); + PS4.SelectedTarget.Events.RaiseProcDetachEvent(Packet.SenderIPAddress); + break; + + // Target State + case ForwardPacket.PacketType.TargetSuspend: + PS4.DefaultTarget.Events.RaiseTargetSuspendEvent(Packet.SenderIPAddress); + PS4.SelectedTarget.Events.RaiseTargetSuspendEvent(Packet.SenderIPAddress); + break; + + case ForwardPacket.PacketType.TargetResume: + PS4.DefaultTarget.Events.RaiseTargetResumeEvent(Packet.SenderIPAddress); + PS4.SelectedTarget.Events.RaiseTargetResumeEvent(Packet.SenderIPAddress); + break; + + case ForwardPacket.PacketType.TargetShutdown: + PS4.DefaultTarget.Events.RaiseTargetShutdownEvent(Packet.SenderIPAddress); + PS4.SelectedTarget.Events.RaiseTargetShutdownEvent(Packet.SenderIPAddress); + break; + + case ForwardPacket.PacketType.TargetNewTitle: + PS4.DefaultTarget.Events.RaiseTargetNewTitleEvent(Packet.SenderIPAddress, Packet.TitleChange.TitleID); + PS4.SelectedTarget.Events.RaiseTargetNewTitleEvent(Packet.SenderIPAddress, Packet.TitleChange.TitleID); + break; + + case ForwardPacket.PacketType.TargetAvailability: + PS4.Events.FireTargetAvailability(Packet.TargetAvailability.Available, Packet.TargetAvailability.Name); + break; + + case ForwardPacket.PacketType.TargetAPIAvailability: + PS4.Events.FireTargetAPIAvailability(Packet.TargetAvailability.Available, Packet.TargetAvailability.Name); + break; + + // Misc + case ForwardPacket.PacketType.DBTouched: + PS4.Events.FireDBTouched(); + break; } } } diff --git a/Windows/Libraries/OrbisLib/OrbisLib.csproj b/Windows/Libraries/OrbisLib/OrbisLib.csproj index a6b544a..ff7020d 100644 --- a/Windows/Libraries/OrbisLib/OrbisLib.csproj +++ b/Windows/Libraries/OrbisLib/OrbisLib.csproj @@ -3,7 +3,7 @@ net6.0-windows enable - enable + annotations OrbisSuite {60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} true @@ -18,6 +18,7 @@ + diff --git a/Windows/Libraries/OrbisLib2/Common/API/API.cs b/Windows/Libraries/OrbisLib2/Common/API/API.cs index 4b82076..875dd0e 100644 --- a/Windows/Libraries/OrbisLib2/Common/API/API.cs +++ b/Windows/Libraries/OrbisLib2/Common/API/API.cs @@ -12,7 +12,7 @@ namespace OrbisLib2.Common.API /// /// IP Address of the remote target. /// The port of the remote target. - /// The time we should wait before timing out. + /// The time we should wait before timing out represented as seconds. /// The socket created when connecting. /// Returns true if successful. private static bool Connect(string IPAddress, int Port, int TimeOut, out Socket Sock) @@ -26,7 +26,7 @@ namespace OrbisLib2.Common.API /// Makes an API call to the remote target. /// /// The desired target to recieve the command. - /// The time the socket should wait before timing out. + /// The time the socket should wait before timing out represented as seconds. /// The command to be run. /// Optional lambda to send/recv additional data. /// Returns result of the communications with the API. @@ -40,10 +40,7 @@ namespace OrbisLib2.Common.API if (Connect(DesiredTarget.IPAddress, Settings.CreateInstance().APIPort, TimeOut, out Socket Sock)) { // Send Inital Packet. - Sock.Send(Helper.StructToBytes(new APIPacket() { PacketVersion = Config.PacketVersion, Command = Command })); - - // Get API Response. - var result = (APIResults)Sock.RecvInt32(); + var result = SendNextPacket(Sock, new APIPacket() { PacketVersion = Config.PacketVersion, Command = Command }); // Call lambda for additional calls. if (result == APIResults.API_OK && AdditionalCommunications != null) diff --git a/Windows/Libraries/OrbisLib2/Common/API/APIPackets.cs b/Windows/Libraries/OrbisLib2/Common/API/APIPackets.cs index b6f4791..8ecab29 100644 --- a/Windows/Libraries/OrbisLib2/Common/API/APIPackets.cs +++ b/Windows/Libraries/OrbisLib2/Common/API/APIPackets.cs @@ -125,7 +125,7 @@ namespace OrbisLib2.Common.API API_ERROR_DEBUG_TO_ATTACHED, } - [StructLayout(LayoutKind.Sequential, Pack = 4, CharSet = CharSet.Ansi, Size = 40), Serializable] + [StructLayout(LayoutKind.Sequential, Pack = 4, CharSet = CharSet.Ansi, Size = 8), Serializable] public struct APIPacket { public int PacketVersion; @@ -310,7 +310,7 @@ namespace OrbisLib2.Common.API public MemoryInfo VRam; } - [StructLayout(LayoutKind.Sequential, Pack = 4, CharSet = CharSet.Ansi)] + [StructLayout(LayoutKind.Sequential, Pack = 4, Size = 2048, CharSet = CharSet.Ansi)] public struct TargetNotifyPacket { [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 1024)] diff --git a/Windows/Libraries/OrbisLib2/Common/Database/SavedTarget.cs b/Windows/Libraries/OrbisLib2/Common/Database/SavedTarget.cs index ba2f6ff..267ff3d 100644 --- a/Windows/Libraries/OrbisLib2/Common/Database/SavedTarget.cs +++ b/Windows/Libraries/OrbisLib2/Common/Database/SavedTarget.cs @@ -105,6 +105,10 @@ namespace OrbisLib2.Common.Database return (result > 0); } + /// + /// Duplicates this class to a new instance. + /// + /// Returns the new instance. public SavedTarget Clone() { return (SavedTarget)this.MemberwiseClone(); diff --git a/Windows/Libraries/OrbisLib2/Common/Dispatcher/DispatcherClient.cs b/Windows/Libraries/OrbisLib2/Common/Dispatcher/DispatcherClient.cs index 11dfa0a..7b290bc 100644 --- a/Windows/Libraries/OrbisLib2/Common/Dispatcher/DispatcherClient.cs +++ b/Windows/Libraries/OrbisLib2/Common/Dispatcher/DispatcherClient.cs @@ -7,217 +7,92 @@ using System.Linq; using System.Net.Sockets; using System.Text; using System.Threading.Tasks; +using TinyIpc.Messaging; namespace OrbisLib2.Common.Dispatcher { public class DispatcherClient { - private Listener? _EventListener; - private int _Port = -1; - private Task _HeartbeatTask; - private CancellationToken _HeartbeatCancellationToken; - - public DispatcherClient() - { - _HeartbeatTask = Task.Run(() => DoHeartbeat()); - } - - private void _EventListener_SocketAccepted(Socket e) - { - try - { - var Packet = (ForwardPacket)e.RecvObject(); - - switch (Packet.Type) - { - default: - Console.WriteLine("Invalid Packet..."); - break; - - // Debugging - case ForwardPacket.PacketType.Print: - TargetManager.SelectedTarget.Events.RaiseProcPrintEvent(Packet.SenderIPAddress, Packet.Print.Sender, Packet.Print.Data); - break; - - case ForwardPacket.PacketType.SerialCom: - // TODO: - break; - - case ForwardPacket.PacketType.Intercept: - TargetManager.SelectedTarget.Events.RaiseProcInterceptEvent(Packet.SenderIPAddress); - break; - - case ForwardPacket.PacketType.Continue: - TargetManager.SelectedTarget.Events.RaiseProcContinueEvent(Packet.SenderIPAddress); - break; - - // Process States - case ForwardPacket.PacketType.ProcessDie: - TargetManager.SelectedTarget.Events.RaiseProcDieEvent(Packet.SenderIPAddress); - break; - - case ForwardPacket.PacketType.ProcessAttach: - TargetManager.SelectedTarget.Events.RaiseProcAttachEvent(Packet.SenderIPAddress, Packet.ProcessName); - break; - - case ForwardPacket.PacketType.ProcessDetach: - TargetManager.SelectedTarget.Events.RaiseProcDetachEvent(Packet.SenderIPAddress); - break; - - // Target State - case ForwardPacket.PacketType.TargetSuspend: - TargetManager.SelectedTarget.Events.RaiseTargetSuspendEvent(Packet.SenderIPAddress); - break; - - case ForwardPacket.PacketType.TargetResume: - TargetManager.SelectedTarget.Events.RaiseTargetResumeEvent(Packet.SenderIPAddress); - break; - - case ForwardPacket.PacketType.TargetShutdown: - TargetManager.SelectedTarget.Events.RaiseTargetShutdownEvent(Packet.SenderIPAddress); - break; - - case ForwardPacket.PacketType.TargetNewTitle: - TargetManager.SelectedTarget.Events.RaiseTargetNewTitleEvent(Packet.SenderIPAddress, Packet.TitleChange.TitleID); - break; - - case ForwardPacket.PacketType.TargetAvailability: - Events.FireTargetAvailability(Packet.TargetAvailability.Available, Packet.TargetAvailability.Name); - break; - - case ForwardPacket.PacketType.TargetAPIAvailability: - Events.FireTargetAPIAvailability(Packet.TargetAvailability.Available, Packet.TargetAvailability.Name); - break; - - // Misc - case ForwardPacket.PacketType.DBTouched: - Events.FireDBTouched(); - break; - } - } - catch (Exception ex) - { - Console.WriteLine($"[{System.Reflection.MethodBase.GetCurrentMethod()?.Name}] Error: {ex.Message}"); - } - } + private static TinyMessageBus _ServiceMessageBus; /// - /// Attempts to connect to the Dispatcher. + /// Call this to subscribe for events from the windows service. /// - /// Returns true if the connection was successful. - private bool Connect() + public static void Subscribe() { - try - { - if (_Port != -1) - { - Console.WriteLine("[Connect] Already Connected!"); - - return true; - } - - var Sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); - if (Sock.EasyConnect("127.0.0.1", Config.DispatcherPort, 1000)) - { - Sock.SendObject(new DispatcherClientPacket(DispatcherClientPacket.PacketType.NewClient, System.Diagnostics.Process.GetCurrentProcess().ProcessName, -1)); - - _Port = Sock.RecvInt32(); - Sock.Close(); - - if (_Port != -1) - { - Console.WriteLine($"Starting up _EventListener on port {_Port}"); - _EventListener = new Listener(_Port); - _EventListener.Start(); - _EventListener.SocketAccepted += _EventListener_SocketAccepted; - - return true; - } - else - return false; - } - } - catch (Exception ex) - { - Console.WriteLine($"[{System.Reflection.MethodBase.GetCurrentMethod()?.Name}] Error: {ex.Message}"); - } - - return false; + _ServiceMessageBus = new TinyMessageBus("OrbisSuite"); + _ServiceMessageBus.MessageReceived += _ServiceMessageBus_MessageReceived; } - /// - /// Sends a Heart beat Packet. - /// - /// Returns true if the packet was sent successfully. - private bool DoHeartBeat() + private static void _ServiceMessageBus_MessageReceived(object? sender, TinyMessageReceivedEventArgs e) { - try + var Packet = (ForwardPacket)Helper.ByteArrayToObject(e.Message.ToArray()); + + switch (Packet.Type) { - if (_Port == -1) - { - Console.WriteLine("[DoHeartBeat] Not Connected!"); - - return false; - } - - var Sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); - if (Sock.EasyConnect("127.0.0.1", Config.DispatcherPort, 1000)) - { - Sock.SendObject(new DispatcherClientPacket(DispatcherClientPacket.PacketType.HeartBeat, System.Diagnostics.Process.GetCurrentProcess().ProcessName, _Port)); - - var Result = Sock.RecvInt32(); - Sock.Close(); - - return (Result == 1); - } - } - catch (Exception ex) - { - Console.WriteLine($"[{System.Reflection.MethodBase.GetCurrentMethod()?.Name}] Error: {ex.Message}"); - } - - return false; - } - - /// - /// Task will Send heartbeat packets to the Service. This will also ensure that we are always connected to the service. - /// - /// - private async Task DoHeartbeat() - { - while (!Connect()) - { - await Task.Delay(500, _HeartbeatCancellationToken); - - if (_HeartbeatCancellationToken.IsCancellationRequested) - break; - } - - if (_Port != -1) - Console.WriteLine("[DispatcherClient] Connection Sucessful!"); - - while (true) - { - await Task.Delay(5000, _HeartbeatCancellationToken); - - if (_HeartbeatCancellationToken.IsCancellationRequested) + default: + Console.WriteLine("Invalid Packet..."); break; - if (!DoHeartBeat()) - { - _Port = -1; + // Debugging + case ForwardPacket.PacketType.Print: + TargetManager.SelectedTarget.Events.RaiseProcPrintEvent(Packet.SenderIPAddress, Packet.Print.Sender, Packet.Print.Data); + break; - while (!Connect()) - { - await Task.Delay(500, _HeartbeatCancellationToken); + case ForwardPacket.PacketType.SerialCom: + // TODO: + break; - if (_HeartbeatCancellationToken.IsCancellationRequested) - break; - } + case ForwardPacket.PacketType.Intercept: + TargetManager.SelectedTarget.Events.RaiseProcInterceptEvent(Packet.SenderIPAddress); + break; - if (_Port != -1) - Console.WriteLine("[DispatcherClient] Reconnection Sucessful!"); - } + case ForwardPacket.PacketType.Continue: + TargetManager.SelectedTarget.Events.RaiseProcContinueEvent(Packet.SenderIPAddress); + break; + + // Process States + case ForwardPacket.PacketType.ProcessDie: + TargetManager.SelectedTarget.Events.RaiseProcDieEvent(Packet.SenderIPAddress); + break; + + case ForwardPacket.PacketType.ProcessAttach: + TargetManager.SelectedTarget.Events.RaiseProcAttachEvent(Packet.SenderIPAddress, Packet.ProcessName); + break; + + case ForwardPacket.PacketType.ProcessDetach: + TargetManager.SelectedTarget.Events.RaiseProcDetachEvent(Packet.SenderIPAddress); + break; + + // Target State + case ForwardPacket.PacketType.TargetSuspend: + TargetManager.SelectedTarget.Events.RaiseTargetSuspendEvent(Packet.SenderIPAddress); + break; + + case ForwardPacket.PacketType.TargetResume: + TargetManager.SelectedTarget.Events.RaiseTargetResumeEvent(Packet.SenderIPAddress); + break; + + case ForwardPacket.PacketType.TargetShutdown: + TargetManager.SelectedTarget.Events.RaiseTargetShutdownEvent(Packet.SenderIPAddress); + break; + + case ForwardPacket.PacketType.TargetNewTitle: + TargetManager.SelectedTarget.Events.RaiseTargetNewTitleEvent(Packet.SenderIPAddress, Packet.TitleChange.TitleID); + break; + + case ForwardPacket.PacketType.TargetAvailability: + Events.FireTargetAvailability(Packet.TargetAvailability.Available, Packet.TargetAvailability.Name); + break; + + case ForwardPacket.PacketType.TargetAPIAvailability: + Events.FireTargetAPIAvailability(Packet.TargetAvailability.Available, Packet.TargetAvailability.Name); + break; + + // Misc + case ForwardPacket.PacketType.DBTouched: + Events.FireDBTouched(); + break; } } } diff --git a/Windows/Libraries/OrbisLib2/Common/Helpers/Helper.cs b/Windows/Libraries/OrbisLib2/Common/Helpers/Helper.cs index faa8324..5f40366 100644 --- a/Windows/Libraries/OrbisLib2/Common/Helpers/Helper.cs +++ b/Windows/Libraries/OrbisLib2/Common/Helpers/Helper.cs @@ -99,7 +99,7 @@ namespace OrbisLib2.Common.Helpers /// public static bool EasyConnect(this Socket s, string IPAddress, int Port, int TimeOut) { - s.ReceiveTimeout = s.SendTimeout = TimeOut; + s.ReceiveTimeout = s.SendTimeout = TimeOut * 1000; var result = s.BeginConnect(IPAddress, Port, null, null); result.AsyncWaitHandle.WaitOne(3000, true); diff --git a/Windows/Libraries/OrbisLib2/GlobalSuppressions.cs b/Windows/Libraries/OrbisLib2/GlobalSuppressions.cs new file mode 100644 index 0000000..f744dd9 --- /dev/null +++ b/Windows/Libraries/OrbisLib2/GlobalSuppressions.cs @@ -0,0 +1,8 @@ +// This file is used by Code Analysis to maintain SuppressMessage +// attributes that are applied to this project. +// Project-level suppressions either have no target or are given +// a specific target and scoped to a namespace, type, member, etc. + +using System.Diagnostics.CodeAnalysis; + +[assembly: SuppressMessage("Interoperability", "CA1416:Validate platform compatibility", Justification = "", Scope = "member", Target = "~M:OrbisLib2.Common.Dispatcher.DispatcherClient.Subscribe")] diff --git a/Windows/Libraries/OrbisLib2/OrbisLib2.csproj b/Windows/Libraries/OrbisLib2/OrbisLib2.csproj index dc4fee4..605013e 100644 --- a/Windows/Libraries/OrbisLib2/OrbisLib2.csproj +++ b/Windows/Libraries/OrbisLib2/OrbisLib2.csproj @@ -12,6 +12,7 @@ + diff --git a/Windows/Libraries/OrbisLib2/Targets/Application.cs b/Windows/Libraries/OrbisLib2/Targets/Application.cs index ab6188a..1b87403 100644 --- a/Windows/Libraries/OrbisLib2/Targets/Application.cs +++ b/Windows/Libraries/OrbisLib2/Targets/Application.cs @@ -23,7 +23,7 @@ namespace OrbisLib2.Targets { var AppList = new List(); - var result = API.SendCommand(Target, 5000, APICommands.API_APPS_GET_LIST, (Socket Sock, APIResults Result) => + var result = API.SendCommand(Target, 5, APICommands.API_APPS_GET_LIST, (Socket Sock, APIResults Result) => { // Get the number of apps installed. int Count = Sock.RecvInt32(); @@ -71,7 +71,7 @@ namespace OrbisLib2.Targets } var resultBuffer = new byte[200]; - var result = API.SendCommand(Target, 5000, APICommands.API_APPS_GET_INFO_STR, (Socket Sock, APIResults Result) => + var result = API.SendCommand(Target, 5, APICommands.API_APPS_GET_INFO_STR, (Socket Sock, APIResults Result) => { // Send the titleId of the app. Sock.Send(Encoding.ASCII.GetBytes(TitleId.PadRight(10, '\0')).Take(10).ToArray()); @@ -94,7 +94,7 @@ namespace OrbisLib2.Targets } AppState result = AppState.STATE_ERROR; - API.SendCommand(Target, 5000, APICommands.API_APPS_STATUS, (Socket Sock, APIResults Result) => + API.SendCommand(Target, 5, APICommands.API_APPS_STATUS, (Socket Sock, APIResults Result) => { // Send the titleId of the app. var bytes = Encoding.ASCII.GetBytes(TitleId.PadRight(10, '\0')).Take(10).ToArray(); @@ -116,7 +116,7 @@ namespace OrbisLib2.Targets } int result = 0; - API.SendCommand(Target, 5000, APICommands.APP_START, (Socket Sock, APIResults Result) => + API.SendCommand(Target, 5, APICommands.API_APPS_START, (Socket Sock, APIResults Result) => { // Send the titleId of the app. var bytes = Encoding.ASCII.GetBytes(TitleId.PadRight(10, '\0')).Take(10).ToArray(); @@ -138,7 +138,7 @@ namespace OrbisLib2.Targets } int result = 0; - API.SendCommand(Target, 5000, APICommands.API_APPS_STOP, (Socket Sock, APIResults Result) => + API.SendCommand(Target, 5, APICommands.API_APPS_STOP, (Socket Sock, APIResults Result) => { // Send the titleId of the app. var bytes = Encoding.ASCII.GetBytes(TitleId.PadRight(10, '\0')).Take(10).ToArray(); @@ -160,7 +160,7 @@ namespace OrbisLib2.Targets } int result = 0; - API.SendCommand(Target, 5000, APICommands.API_APPS_SUSPEND, (Socket Sock, APIResults Result) => + API.SendCommand(Target, 5, APICommands.API_APPS_SUSPEND, (Socket Sock, APIResults Result) => { // Send the titleId of the app. var bytes = Encoding.ASCII.GetBytes(TitleId.PadRight(10, '\0')).Take(10).ToArray(); @@ -182,7 +182,7 @@ namespace OrbisLib2.Targets } int result = 0; - API.SendCommand(Target, 5000, APICommands.API_APPS_RESUME, (Socket Sock, APIResults Result) => + API.SendCommand(Target, 5, APICommands.API_APPS_RESUME, (Socket Sock, APIResults Result) => { // Send the titleId of the app. var bytes = Encoding.ASCII.GetBytes(TitleId.PadRight(10, '\0')).Take(10).ToArray(); diff --git a/Windows/Libraries/OrbisLib2/Targets/Target.cs b/Windows/Libraries/OrbisLib2/Targets/Target.cs index a67236f..de7d1af 100644 --- a/Windows/Libraries/OrbisLib2/Targets/Target.cs +++ b/Windows/Libraries/OrbisLib2/Targets/Target.cs @@ -12,7 +12,20 @@ namespace OrbisLib2.Targets { public class Target { - private SavedTarget _SavedTarget; + private int _SavedTargetId = 0; + + public SavedTarget SavedTarget + { + get + { + var savedTarget = SavedTarget.FindTarget(x => x.Id == _SavedTargetId); + + if (savedTarget == null) + savedTarget = new SavedTarget(); + + return savedTarget; + } + } /// /// Weather or not this is our default target to be selected on start up. @@ -21,12 +34,7 @@ namespace OrbisLib2.Targets { get { - return _SavedTarget.IsDefault; - } - set - { - _SavedTarget.IsDefault = value; - _SavedTarget.Save(); + return SavedTarget.IsDefault; } } @@ -37,12 +45,7 @@ namespace OrbisLib2.Targets { get { - return _SavedTarget.Name; - } - set - { - _SavedTarget.Name = value; - _SavedTarget.Save(); + return SavedTarget.Name; } } @@ -53,12 +56,7 @@ namespace OrbisLib2.Targets { get { - return _SavedTarget.IPAddress; - } - set - { - _SavedTarget.IPAddress = value; - _SavedTarget.Save(); + return SavedTarget.IPAddress; } } @@ -69,20 +67,16 @@ namespace OrbisLib2.Targets { get { - return _SavedTarget.PayloadPort; - } - set - { - _SavedTarget.PayloadPort = value; - _SavedTarget.Save(); + return SavedTarget.PayloadPort; } } + public TargetInfo Info { get { - return _SavedTarget.Info; + return SavedTarget.Info; } } @@ -95,7 +89,7 @@ namespace OrbisLib2.Targets public Target(SavedTarget SavedTarget) { - _SavedTarget = SavedTarget; + _SavedTargetId = SavedTarget.Id; Events = new TargetEvents(this); // Debug = new Debug(this); @@ -105,25 +99,31 @@ namespace OrbisLib2.Targets Application = new Application(this); } + public Target Clone() + { + return new Target(SavedTarget.Clone()); + } + public bool Shutdown() { - return API.SendCommand(this, 3000, APICommands.API_TARGET_SHUTDOWN) == APIResults.API_OK; + return API.SendCommand(this, 5, APICommands.API_TARGET_SHUTDOWN) == APIResults.API_OK; } public bool Reboot() { - return API.SendCommand(this, 3000, APICommands.API_TARGET_REBOOT) == APIResults.API_OK; + return API.SendCommand(this, 5, APICommands.API_TARGET_REBOOT) == APIResults.API_OK; } public bool Suspend() { - return API.SendCommand(this, 3000, APICommands.API_TARGET_RESTMODE) == APIResults.API_OK; + return API.SendCommand(this, 5, APICommands.API_TARGET_RESTMODE) == APIResults.API_OK; } public bool Notify(string Message) { - var result = API.SendCommand(this, 3000, APICommands.API_TARGET_NOTIFY, (Socket Sock, APIResults Result) => + var result = API.SendCommand(this, 5, APICommands.API_TARGET_NOTIFY, (Socket Sock, APIResults Result) => { + Console.WriteLine($"Message: {Message}"); Result = API.SendNextPacket(Sock, new TargetNotifyPacket() { Message = Message }); }); @@ -132,7 +132,7 @@ namespace OrbisLib2.Targets public bool Notify(string IconURI, string Message) { - var result = API.SendCommand(this, 3000, APICommands.API_TARGET_NOTIFY, (Socket Sock, APIResults Result) => + var result = API.SendCommand(this, 5, APICommands.API_TARGET_NOTIFY, (Socket Sock, APIResults Result) => { Result = API.SendNextPacket(Sock, new TargetNotifyPacket() { IconURI = IconURI, Message = Message }); }); @@ -142,7 +142,7 @@ namespace OrbisLib2.Targets public bool Buzzer(BuzzerType Type) { - var result = API.SendCommand(this, 3000, APICommands.API_TARGET_BUZZER, (Socket Sock, APIResults Result) => + var result = API.SendCommand(this, 5, APICommands.API_TARGET_BUZZER, (Socket Sock, APIResults Result) => { Result = API.SendInt32(Sock, (int)Type); }); @@ -152,7 +152,7 @@ namespace OrbisLib2.Targets public bool SetLED(ConsoleLEDColours Colour) { - var result = API.SendCommand(this, 3000, APICommands.API_TARGET_SET_LED, (Socket Sock, APIResults Result) => + var result = API.SendCommand(this, 5, APICommands.API_TARGET_SET_LED, (Socket Sock, APIResults Result) => { Result = API.SendInt32(Sock, (int)Colour); }); @@ -162,7 +162,7 @@ namespace OrbisLib2.Targets public bool SetSettings(bool ShowDebugTitleIdLabel, bool ShowDevkitPanel, bool ShowDebugSettings, bool ShowAppHome) { - var result = API.SendCommand(this, 3000, APICommands.API_TARGET_SET_SETTINGS, (Socket Sock, APIResults Result) => + var result = API.SendCommand(this, 5, APICommands.API_TARGET_SET_SETTINGS, (Socket Sock, APIResults Result) => { Result = API.SendNextPacket(Sock, new TargetSettingsPacket() { diff --git a/Windows/Libraries/OrbisLib2/Targets/TargetManager.cs b/Windows/Libraries/OrbisLib2/Targets/TargetManager.cs index c4df7b1..5023315 100644 --- a/Windows/Libraries/OrbisLib2/Targets/TargetManager.cs +++ b/Windows/Libraries/OrbisLib2/Targets/TargetManager.cs @@ -43,7 +43,7 @@ namespace OrbisLib2.Targets get { // Set initially as the default target. - if (SelectedTarget == null) + if (_SelectedTarget == null) { var defaultTarget = SavedTarget.FindDefaultTarget(); @@ -103,19 +103,19 @@ namespace OrbisLib2.Targets /// /// Updates extended information about the Target. *Requires the Target to be on and the API running. /// - /// The name of the target to update. + /// The identifier of the target to update. /// Returns weather or not the action was successful or not. - public static bool UpdateTargetInfo(string TargetName) + public static bool UpdateTargetInfo(SavedTarget savedTarget) { - Target? Target = GetTarget(TargetName); + var Target = GetTarget(savedTarget.Name); if (Target == null) { - Console.WriteLine($"Couldn't Find Target \"{TargetName}\"."); + Console.WriteLine($"Couldn't Find Target \"{savedTarget.Name}\"."); return false; } bool labdaReult = false; - var result = API.SendCommand(Target, 3000, APICommands.API_TARGET_INFO, (Sock, Result) => + var result = API.SendCommand(Target, 5, APICommands.API_TARGET_INFO, (Sock, Result) => { var Packet = new TargetInfoPacket(); var RawPacket = new byte[Marshal.SizeOf(Packet)]; @@ -131,45 +131,45 @@ namespace OrbisLib2.Targets if (Packet.ConsoleName == null || Packet.ConsoleName == string.Empty) return; - Target.Info.SDKVersion = $"{(Packet.SDKVersion >> 24 & 0xFF).ToString("X1")}.{(Packet.SDKVersion >> 12 & 0xFFF).ToString("X3")}.{(Packet.SDKVersion & 0xFFF).ToString("X3")}"; - Target.Info.SoftwareVersion = $"{(Packet.SoftwareVersion >> 24 & 0xFF).ToString("X1")}.{(Packet.SoftwareVersion >> 16 & 0xFF).ToString("X2")}"; - Target.Info.FactorySoftwareVersion = $"{(Packet.FactorySoftwareVersion >> 24 & 0xFF).ToString("X1")}.{(Packet.FactorySoftwareVersion >> 12 & 0xFFF).ToString("X3")}.{(Packet.FactorySoftwareVersion & 0xFFF).ToString("X3")}"; - Target.Info.CurrentTitleID = Packet.CurrentTitleID; - Target.Info.ConsoleName = Packet.ConsoleName; - Target.Info.MotherboardSerial = Packet.MotherboardSerial; - Target.Info.Serial = Packet.Serial; - Target.Info.Model = Packet.Model; - Target.Info.MACAddressLAN = Packet.MACAddressLAN.ToUpper(); - Target.Info.MACAddressWIFI = Packet.MACAddressWIFI.ToUpper(); - Target.Info.UART = Packet.UART > 0; - Target.Info.IDUMode = Packet.IDUMode > 0; - Target.Info.IDPS = BitConverter.ToString(Packet.IDPS).Replace("-", string.Empty); - Target.Info.PSID = BitConverter.ToString(Packet.PSID).Replace("-", string.Empty); - Target.Info.ConsoleType = (ConsoleType)Packet.ConsoleType; + savedTarget.Info.SDKVersion = $"{(Packet.SDKVersion >> 24 & 0xFF).ToString("X1")}.{(Packet.SDKVersion >> 12 & 0xFFF).ToString("X3")}.{(Packet.SDKVersion & 0xFFF).ToString("X3")}"; + savedTarget.Info.SoftwareVersion = $"{(Packet.SoftwareVersion >> 24 & 0xFF).ToString("X1")}.{(Packet.SoftwareVersion >> 16 & 0xFF).ToString("X2")}"; + savedTarget.Info.FactorySoftwareVersion = $"{(Packet.FactorySoftwareVersion >> 24 & 0xFF).ToString("X1")}.{(Packet.FactorySoftwareVersion >> 12 & 0xFFF).ToString("X3")}.{(Packet.FactorySoftwareVersion & 0xFFF).ToString("X3")}"; + savedTarget.Info.CurrentTitleID = Packet.CurrentTitleID; + savedTarget.Info.ConsoleName = Packet.ConsoleName; + savedTarget.Info.MotherboardSerial = Packet.MotherboardSerial; + savedTarget.Info.Serial = Packet.Serial; + savedTarget.Info.Model = Packet.Model; + savedTarget.Info.MACAddressLAN = Packet.MACAddressLAN.ToUpper(); + savedTarget.Info.MACAddressWIFI = Packet.MACAddressWIFI.ToUpper(); + savedTarget.Info.UART = Packet.UART > 0; + savedTarget.Info.IDUMode = Packet.IDUMode > 0; + savedTarget.Info.IDPS = BitConverter.ToString(Packet.IDPS).Replace("-", string.Empty); + savedTarget.Info.PSID = BitConverter.ToString(Packet.PSID).Replace("-", string.Empty); + savedTarget.Info.ConsoleType = (ConsoleType)Packet.ConsoleType; // Debugging. - Target.Info.IsAttached = Packet.Attached > 0; + savedTarget.Info.IsAttached = Packet.Attached > 0; // TODO: Implement this into the API. - Target.Info.CurrentProcessId = 0;// TODO: Update this to process Id Packet.CurrentProc; + savedTarget.Info.CurrentProcessId = 0;// TODO: Update this to process Id Packet.CurrentProc; // Storage. - Target.Info.HDDUsedSpace = (long)(Packet.TotalSpace - Packet.FreeSpace); - Target.Info.HDDFreeSpace = (long)Packet.FreeSpace; - Target.Info.HDDTotalSpace = (long)Packet.TotalSpace; + savedTarget.Info.HDDUsedSpace = (long)(Packet.TotalSpace - Packet.FreeSpace); + savedTarget.Info.HDDFreeSpace = (long)Packet.FreeSpace; + savedTarget.Info.HDDTotalSpace = (long)Packet.TotalSpace; // Perf Stats. - Target.Info.CPUTemp = Packet.CPUTemp; - Target.Info.SOCTemp = Packet.SOCTemp; - Target.Info.ThreadCount = Packet.ThreadCount; - Target.Info.AverageCPUUsage = Packet.AverageCPUUsage; - Target.Info.BusyCore = Packet.BusyCore; - Target.Info.RamUsage = Packet.Ram.Used; - Target.Info.VRamUsage = Packet.VRam.Used; + savedTarget.Info.CPUTemp = Packet.CPUTemp; + savedTarget.Info.SOCTemp = Packet.SOCTemp; + savedTarget.Info.ThreadCount = Packet.ThreadCount; + savedTarget.Info.AverageCPUUsage = Packet.AverageCPUUsage; + savedTarget.Info.BusyCore = Packet.BusyCore; + savedTarget.Info.RamUsage = Packet.Ram.Used; + savedTarget.Info.VRamUsage = Packet.VRam.Used; labdaReult = true; }); - return result == APIResults.API_OK && labdaReult && Target.Info.Save(); + return result == APIResults.API_OK && labdaReult && savedTarget.Info.Save(); } } } diff --git a/Windows/OrbisNeighborHood/Controls/AppPanel.xaml.cs b/Windows/OrbisNeighborHood/Controls/AppPanel.xaml.cs index 7d26ac3..4a6161b 100644 --- a/Windows/OrbisNeighborHood/Controls/AppPanel.xaml.cs +++ b/Windows/OrbisNeighborHood/Controls/AppPanel.xaml.cs @@ -1,5 +1,6 @@ -using OrbisSuite; -using OrbisSuite.Common; +using OrbisLib2.Common.API; +using OrbisLib2.General; +using OrbisLib2.Targets; using System; using System.IO; using System.Threading; @@ -72,7 +73,7 @@ namespace OrbisNeighborHood.Controls { while (true) { - var currentTarget = OrbisLib.Instance.SelectedTarget; + var currentTarget = TargetManager.SelectedTarget; // Get Current App status. var newAppState = currentTarget.Application.GetAppState(App.TitleId); @@ -133,7 +134,7 @@ namespace OrbisNeighborHood.Controls { Task.Run(() => { - var currentTarget = OrbisLib.Instance.SelectedTarget; + var currentTarget = TargetManager.SelectedTarget; if (AppState == AppState.STATE_RUNNING || AppState == AppState.STATE_SUSPENDED) { currentTarget.Application.Stop(App.TitleId); @@ -149,7 +150,7 @@ namespace OrbisNeighborHood.Controls { Task.Run(() => { - var currentTarget = OrbisLib.Instance.SelectedTarget; + var currentTarget = TargetManager.SelectedTarget; if (AppState == AppState.STATE_SUSPENDED) { currentTarget.Application.Resume(App.TitleId); diff --git a/Windows/OrbisNeighborHood/Controls/CurrentTargetDisplay.xaml.cs b/Windows/OrbisNeighborHood/Controls/CurrentTargetDisplay.xaml.cs index 7e890bb..cc9bc90 100644 --- a/Windows/OrbisNeighborHood/Controls/CurrentTargetDisplay.xaml.cs +++ b/Windows/OrbisNeighborHood/Controls/CurrentTargetDisplay.xaml.cs @@ -1,21 +1,14 @@ -using OrbisSuite; -using OrbisSuite.Common.Database; +using OrbisLib2.Common.Database.Types; +using OrbisLib2.General; +using OrbisLib2.Targets; using System; -using System.Collections.Generic; using System.Diagnostics; using System.Linq; -using System.Text; using System.Text.RegularExpressions; -using System.Threading.Tasks; -using System.Windows; using System.Windows.Controls; -using System.Windows.Data; -using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; -using System.Windows.Navigation; -using System.Windows.Shapes; namespace OrbisNeighborHood.Controls { @@ -28,8 +21,8 @@ namespace OrbisNeighborHood.Controls { InitializeComponent(); - OrbisLib.Instance.Events.DBTouched += Events_DBTouched; - OrbisLib.Instance.Events.TargetStateChanged += Events_TargetStateChanged; + Events.DBTouched += Events_DBTouched; + Events.TargetStateChanged += Events_TargetStateChanged; RefreshTarget(); } @@ -45,11 +38,11 @@ namespace OrbisNeighborHood.Controls private void RefreshTarget() { - var CurrentTarget = OrbisLib.Instance.SelectedTarget.Info; + var CurrentTarget = TargetManager.SelectedTarget; if (CurrentTarget != null) { - switch (CurrentTarget.Details.Status) + switch (CurrentTarget.Info.Status) { case TargetStatusType.Offline: CurrentTargetState.Fill = new SolidColorBrush(Color.FromRgb(255, 0, 0)); @@ -74,7 +67,7 @@ namespace OrbisNeighborHood.Controls CurrentTargetName.Text = CurrentTarget.IsDefault ? $"★{CurrentTarget.Name}" : CurrentTarget.Name; - if (CurrentTarget.Details.CurrentTitleID == null || !Regex.IsMatch(CurrentTarget.Details.CurrentTitleID, @"CUSA\d{5}")) + if (CurrentTarget.Info.CurrentTitleID == null || !Regex.IsMatch(CurrentTarget.Info.CurrentTitleID, @"CUSA\d{5}")) { CurrentTargetTitleName.Text = "Unknown Title"; CurrentTargetTitleId.Text = "-"; @@ -82,7 +75,7 @@ namespace OrbisNeighborHood.Controls } else { - var Title = new TMDB(CurrentTarget.Details.CurrentTitleID); + var Title = new TMDB(CurrentTarget.Info.CurrentTitleID); Regex rgx = new Regex(@"[^0-9a-zA-Z +.:']"); CurrentTargetTitleName.Text = Title.Names.First(); CurrentTargetTitleId.Text = Title.NPTitleID; @@ -94,11 +87,11 @@ namespace OrbisNeighborHood.Controls private void CurrentTargetTitleImage_MouseDown(object sender, MouseButtonEventArgs e) { - var CurrentTarget = OrbisLib.Instance.SelectedTarget.Info; + var CurrentTarget = TargetManager.SelectedTarget; - if (CurrentTarget != null && CurrentTarget.Details.CurrentTitleID != null && Regex.IsMatch(CurrentTarget.Details.CurrentTitleID, @"CUSA\d{5}")) + if (CurrentTarget != null && CurrentTarget.Info.CurrentTitleID != null && Regex.IsMatch(CurrentTarget.Info.CurrentTitleID, @"CUSA\d{5}")) { - var Title = new TMDB(CurrentTarget.Details.CurrentTitleID); + var Title = new TMDB(CurrentTarget.Info.CurrentTitleID); var url = $"https://store.playstation.com/product/{Title.ContentID}/"; System.Diagnostics.Process.Start(new ProcessStartInfo diff --git a/Windows/OrbisNeighborHood/Controls/NewTargetPanel.xaml.cs b/Windows/OrbisNeighborHood/Controls/NewTargetPanel.xaml.cs index 10c2fe6..6db03e7 100644 --- a/Windows/OrbisNeighborHood/Controls/NewTargetPanel.xaml.cs +++ b/Windows/OrbisNeighborHood/Controls/NewTargetPanel.xaml.cs @@ -1,20 +1,8 @@ using OrbisNeighborHood.MVVM.ViewModel; using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; -using System.Windows.Data; -using System.Windows.Documents; using System.Windows.Input; -using System.Windows.Media; -using System.Windows.Media.Imaging; -using System.Windows.Navigation; -using System.Windows.Shapes; -using OrbisSuite; -using OrbisSuite.Dialog; namespace OrbisNeighborHood.Controls { diff --git a/Windows/OrbisNeighborHood/Controls/TargetPanel.xaml.cs b/Windows/OrbisNeighborHood/Controls/TargetPanel.xaml.cs index 7f8c2f8..577da4a 100644 --- a/Windows/OrbisNeighborHood/Controls/TargetPanel.xaml.cs +++ b/Windows/OrbisNeighborHood/Controls/TargetPanel.xaml.cs @@ -1,24 +1,18 @@ using System; using System.IO; using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Text.RegularExpressions; -using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; -using System.Windows.Data; -using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; -using System.Windows.Navigation; -using System.Windows.Shapes; using Microsoft.Win32; using OrbisNeighborHood.MVVM.ViewModel; -using OrbisSuite; -using OrbisSuite.Common.Database; using SimpleUI.Controls; +using OrbisLib2.Common.Database.Types; +using OrbisLib2.Common.API; +using OrbisLib2.Targets; +using OrbisLib2.Common.Database; namespace OrbisNeighborHood.Controls { @@ -36,24 +30,31 @@ namespace OrbisNeighborHood.Controls { InitializeComponent(); - _thisTarget = OrbisLib.Instance.Targets[TargetName]; - _thisTargetInfo = _thisTarget.Info; + _thisTarget = TargetManager.GetTarget(TargetName); + if(_thisTarget != null ) + { + _thisTargetInfo = _thisTarget.Info; - this.TargetName = _thisTarget.Info.Name; - TargetStatus = _thisTarget.Info.Details.Status; - ConsoleModel = _thisTarget.Info.Details.ModelType; - IsDefault = _thisTarget.Info.IsDefault; - FirmwareVersion = _thisTarget.Info.Details.SoftwareVersion; - SDKVersion = _thisTarget.Info.Details.SDKVersion; - IPAddress = _thisTarget.Info.IPAddress; - ConsoleName = _thisTarget.Info.Details.ConsoleName; - PayloadPort = _thisTarget.Info.PayloadPort.ToString(); + this.TargetName = _thisTarget.Name; + TargetStatus = _thisTarget.Info.Status; + ConsoleModel = _thisTarget.Info.ModelType; + IsDefault = _thisTarget.IsDefault; + FirmwareVersion = _thisTarget.Info.SoftwareVersion; + SDKVersion = _thisTarget.Info.SDKVersion; + IPAddress = _thisTarget.IPAddress; + ConsoleName = _thisTarget.Info.ConsoleName; + PayloadPort = _thisTarget.PayloadPort.ToString(); - LocateTarget.IsEnabled = _thisTarget.Info.Details.IsAPIAvailable; - SendPayload.IsEnabled = _thisTarget.Info.Details.IsAvailable; - RestartTarget.IsEnabled = _thisTarget.Info.Details.IsAPIAvailable; - ShutdownTarget.IsEnabled = _thisTarget.Info.Details.IsAPIAvailable; - SuspendTarget.IsEnabled = _thisTarget.Info.Details.IsAPIAvailable; + LocateTarget.IsEnabled = _thisTarget.Info.IsAPIAvailable; + SendPayload.IsEnabled = _thisTarget.Info.IsAvailable; + RestartTarget.IsEnabled = _thisTarget.Info.IsAPIAvailable; + ShutdownTarget.IsEnabled = _thisTarget.Info.IsAPIAvailable; + SuspendTarget.IsEnabled = _thisTarget.Info.IsAPIAvailable; + } + else + { + throw new Exception("TargetPanel(): Target not found when it should have been!"); + } } #region Properties @@ -211,7 +212,7 @@ namespace OrbisNeighborHood.Controls var result = SimpleMessageBox.ShowWarning(Window.GetWindow(this), "Are you sure you want to delete this target?", "Delete this Target?", SimpleUI.SimpleMessageBoxButton.YesNo); if(result == SimpleUI.SimpleMessageBoxResult.Yes) { - _thisTargetInfo.Remove(); + TargetManager.DeleteTarget(_thisTarget.Name); TargetChanged?.Invoke(this, e); } } @@ -222,7 +223,7 @@ namespace OrbisNeighborHood.Controls { var editTargetViewModel = MainViewModel.Instance.EditTargetVM; editTargetViewModel.TargetChanged += EditTargetVM_TargetChanged; - editTargetViewModel.CurrentTarget = _thisTargetInfo.Clone(); + editTargetViewModel.CurrentTarget = _thisTarget.SavedTarget.Clone(); editTargetViewModel.CallingVM = MainViewModel.Instance.TargetVM; MainViewModel.Instance.CurrentView = editTargetViewModel; } @@ -235,17 +236,18 @@ namespace OrbisNeighborHood.Controls private void DefaultTargetElement_MouseDown(object sender, MouseButtonEventArgs e) { - if (!_thisTargetInfo.IsDefault) + var savedTarget = _thisTarget.SavedTarget; + if (!savedTarget.IsDefault) { - _thisTargetInfo.IsDefault = true; - _thisTargetInfo.Save(); + savedTarget.IsDefault = true; + savedTarget.Save(); TargetChanged?.Invoke(this, e); } } private void LocateTarget_Click(object sender, RoutedEventArgs e) { - _thisTarget.Buzzer(OrbisSuite.Common.BuzzerType.RingThree); + _thisTarget.Buzzer(BuzzerType.RingThree); } private void SendPayload_Click(object sender, RoutedEventArgs e) diff --git a/Windows/OrbisNeighborHood/MVVM/View/AppListView.xaml.cs b/Windows/OrbisNeighborHood/MVVM/View/AppListView.xaml.cs index 7a3fac2..db5ed77 100644 --- a/Windows/OrbisNeighborHood/MVVM/View/AppListView.xaml.cs +++ b/Windows/OrbisNeighborHood/MVVM/View/AppListView.xaml.cs @@ -1,5 +1,4 @@ using OrbisNeighborHood.Controls; -using OrbisSuite; using System; using System.Text.RegularExpressions; using System.Windows; @@ -7,8 +6,9 @@ using System.Windows.Controls; using System.IO; using System.Threading.Tasks; using System.Collections.Generic; -using System.Threading; using System.Linq; +using OrbisLib2.Targets; +using OrbisLib2.General; namespace OrbisNeighborHood.MVVM.View { @@ -50,8 +50,8 @@ namespace OrbisNeighborHood.MVVM.View { InitializeComponent(); - OrbisLib.Instance.Events.DBTouched += Events_DBTouched; - OrbisLib.Instance.Events.TargetStateChanged += Events_TargetStateChanged; + Events.DBTouched += Events_DBTouched; + Events.TargetStateChanged += Events_TargetStateChanged; // Refresh the info about the current target. RefreshTargetInfo(); @@ -96,7 +96,7 @@ namespace OrbisNeighborHood.MVVM.View private void RefreshTargetInfo() { - var CurrentTarget = OrbisLib.Instance.SelectedTarget.Info; + var CurrentTarget = TargetManager.SelectedTarget; if (CurrentTarget != null) { @@ -112,7 +112,7 @@ namespace OrbisNeighborHood.MVVM.View public void AddApp(string appCachePath, AppInfo App) { - var currentTarget = OrbisLib.Instance.SelectedTarget; + var currentTarget = TargetManager.SelectedTarget; // Make sure the titleId format is correct. Helps weed out bad entries and folders. if (!Regex.IsMatch(App.TitleId, @"[a-zA-Z]{4}\d{5}")) @@ -144,7 +144,7 @@ namespace OrbisNeighborHood.MVVM.View } // Cache icon0.png for app if we have not already. - if (!File.Exists(Path.Combine(currentAppPath, "icon0.png")) && !string.IsNullOrEmpty(App.MetaDataPath) && currentTarget.Info.Details.IsAvailable) //TODO: Maybe add a isFTPAvailable. + if (!File.Exists(Path.Combine(currentAppPath, "icon0.png")) && !string.IsNullOrEmpty(App.MetaDataPath) && currentTarget.Info.IsAvailable) //TODO: Maybe add a isFTPAvailable. { currentTarget.FTP.DownloadFile($"{App.MetaDataPath}/icon0.png", Path.Combine(currentAppPath, "icon0.png")); } @@ -173,11 +173,11 @@ namespace OrbisNeighborHood.MVVM.View Dispatcher.Invoke(() => AppList.Items.Clear()); // Make sure we have a target we can pull the db from. - if (OrbisLib.Instance.TargetManagement.TargetList == null) + if (TargetManager.Targets.Count <= 0) return; // Make sure the Target is online so we can pull the db. - var currentTarget = OrbisLib.Instance.SelectedTarget; + var currentTarget = TargetManager.SelectedTarget; if (currentTarget == null) { Console.WriteLine("No current target we can use to load apps."); @@ -206,12 +206,12 @@ namespace OrbisNeighborHood.MVVM.View try { // Make sure we have a target we can pull the db from. - if (OrbisLib.Instance.TargetManagement.TargetList == null) + if (TargetManager.Targets.Count <= 0) continue; // Make sure the Target is online so we can pull the db. - var currentTarget = OrbisLib.Instance.SelectedTarget; - if (currentTarget == null || !currentTarget.Info.Details.IsAvailable) + var currentTarget = TargetManager.SelectedTarget; + if (currentTarget == null || !currentTarget.Info.IsAvailable) { continue; } diff --git a/Windows/OrbisNeighborHood/MVVM/View/DashboardView.xaml.cs b/Windows/OrbisNeighborHood/MVVM/View/DashboardView.xaml.cs index 0b17526..7798dca 100644 --- a/Windows/OrbisNeighborHood/MVVM/View/DashboardView.xaml.cs +++ b/Windows/OrbisNeighborHood/MVVM/View/DashboardView.xaml.cs @@ -1,23 +1,14 @@ -using OrbisNeighborHood.MVVM.ViewModel; -using OrbisSuite; -using OrbisSuite.Common.Database; +using OrbisLib2.Common.Database.Types; +using OrbisLib2.General; +using OrbisLib2.Targets; +using OrbisNeighborHood.MVVM.ViewModel; using System; -using System.Collections.Generic; -using System.IO; using System.Linq; -using System.Reflection; -using System.Text; using System.Text.RegularExpressions; -using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; -using System.Windows.Data; -using System.Windows.Documents; -using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; -using System.Windows.Navigation; -using System.Windows.Shapes; namespace OrbisNeighborHood.MVVM.View { @@ -32,8 +23,8 @@ namespace OrbisNeighborHood.MVVM.View { InitializeComponent(); - OrbisLib.Instance.Events.DBTouched += Events_DBTouched; - OrbisLib.Instance.Events.TargetStateChanged += Events_TargetStateChanged; + Events.DBTouched += Events_DBTouched; + Events.TargetStateChanged += Events_TargetStateChanged; RefreshTargetInfo(); } @@ -196,39 +187,39 @@ namespace OrbisNeighborHood.MVVM.View private void RefreshTargetInfo() { - var CurrentTarget = OrbisLib.Instance.SelectedTarget.Info; + var CurrentTarget = TargetManager.SelectedTarget; if (CurrentTarget != null) { TitleString = CurrentTarget.IsDefault ? $"★{CurrentTarget.Name}" : CurrentTarget.Name; TargetName = CurrentTarget.IsDefault ? $"★{CurrentTarget.Name}" : CurrentTarget.Name; - TargetStatus = CurrentTarget.Details.Status; - FirmwareVersion = CurrentTarget.Details.SoftwareVersion; - SDKVersion = CurrentTarget.Details.SDKVersion; + TargetStatus = CurrentTarget.Info.Status; + FirmwareVersion = CurrentTarget.Info.SoftwareVersion; + SDKVersion = CurrentTarget.Info.SDKVersion; IPAddress = CurrentTarget.IPAddress; - ConsoleName = CurrentTarget.Details.ConsoleName; + ConsoleName = CurrentTarget.Info.ConsoleName; PayloadPort = CurrentTarget.PayloadPort.ToString(); // Storage Stats. - HDDFreeSpace = Utilities.BytesToString(CurrentTarget.Details.HDDFreeSpace); - HDDUsedSpace = Utilities.BytesToString(CurrentTarget.Details.HDDUsedSpace); - HDDTotalSpace = Utilities.BytesToString(CurrentTarget.Details.HDDTotalSpace); + HDDFreeSpace = Utilities.BytesToString(CurrentTarget.Info.HDDFreeSpace); + HDDUsedSpace = Utilities.BytesToString(CurrentTarget.Info.HDDUsedSpace); + HDDTotalSpace = Utilities.BytesToString(CurrentTarget.Info.HDDTotalSpace); - if (CurrentTarget.Details.HDDTotalSpace != 0) - StorageUsagePercentage = (int)(((double)CurrentTarget.Details.HDDUsedSpace / (double)CurrentTarget.Details.HDDTotalSpace) * 100.0); + if (CurrentTarget.Info.HDDTotalSpace != 0) + StorageUsagePercentage = (int)(((double)CurrentTarget.Info.HDDUsedSpace / (double)CurrentTarget.Info.HDDTotalSpace) * 100.0); else StorageUsagePercentage = 0; // System Stats. - CPUTemp = $"{CurrentTarget.Details.CPUTemp} °C"; - SOCTemp = $"{CurrentTarget.Details.SOCTemp} °C"; - ThreadCount = CurrentTarget.Details.ThreadCount; - AverageCPUUsage = CurrentTarget.Details.AverageCPUUsage; - TopCore = $"Core {CurrentTarget.Details.BusyCore}"; - RamUsage = $"{CurrentTarget.Details.RamUsage} MB"; - VRamUsage = $"{CurrentTarget.Details.VRamUsage} MB"; + CPUTemp = $"{CurrentTarget.Info.CPUTemp} °C"; + SOCTemp = $"{CurrentTarget.Info.SOCTemp} °C"; + ThreadCount = CurrentTarget.Info.ThreadCount; + AverageCPUUsage = CurrentTarget.Info.AverageCPUUsage; + TopCore = $"Core {CurrentTarget.Info.BusyCore}"; + RamUsage = $"{CurrentTarget.Info.RamUsage} MB"; + VRamUsage = $"{CurrentTarget.Info.VRamUsage} MB"; - if (CurrentTarget.Details.CurrentTitleID == null || !Regex.IsMatch(CurrentTarget.Details.CurrentTitleID, @"CUSA\d{5}")) + if (CurrentTarget.Info.CurrentTitleID == null || !Regex.IsMatch(CurrentTarget.Info.CurrentTitleID, @"CUSA\d{5}")) { TitleName = "Unknown Title"; TitleId = "-"; @@ -237,7 +228,7 @@ namespace OrbisNeighborHood.MVVM.View } else { - var Title = new TMDB(CurrentTarget.Details.CurrentTitleID); + var Title = new TMDB(CurrentTarget.Info.CurrentTitleID); Regex rgx = new Regex(@"[^0-9a-zA-Z +.:']"); TitleName = Title.Names.First(); TitleId = Title.NPTitleID; @@ -254,12 +245,12 @@ namespace OrbisNeighborHood.MVVM.View private void EditButton_Click(object sender, RoutedEventArgs e) { - var CurrentTarget = OrbisLib.Instance.SelectedTarget.Info; + var CurrentTarget = TargetManager.SelectedTarget; if (MainViewModel.Instance != null) { var editTargetViewModel = MainViewModel.Instance.EditTargetVM; - editTargetViewModel.CurrentTarget = CurrentTarget.Clone(); + editTargetViewModel.CurrentTarget = CurrentTarget.SavedTarget.Clone(); editTargetViewModel.CallingVM = MainViewModel.Instance.DashboardHomeVM; MainViewModel.Instance.CurrentView = editTargetViewModel; } diff --git a/Windows/OrbisNeighborHood/MVVM/View/SettingsView.xaml.cs b/Windows/OrbisNeighborHood/MVVM/View/SettingsView.xaml.cs index c6d985d..d57b857 100644 --- a/Windows/OrbisNeighborHood/MVVM/View/SettingsView.xaml.cs +++ b/Windows/OrbisNeighborHood/MVVM/View/SettingsView.xaml.cs @@ -1,15 +1,12 @@ -using OrbisSuite.Common.Database; -using SimpleUI.Skins; +using SimpleUI.Skins; using System; -using System.Collections.Generic; using System.IO; -using System.Linq; using System.Reflection; -using System.Text; using System.Windows; using System.Windows.Controls; using System.Windows.Input; using System.Text.RegularExpressions; +using OrbisLib2.Common.Database; namespace OrbisNeighborHood.MVVM.View { diff --git a/Windows/OrbisNeighborHood/MVVM/View/SubView/AddTargetView.xaml.cs b/Windows/OrbisNeighborHood/MVVM/View/SubView/AddTargetView.xaml.cs index 1292aae..77fd8d6 100644 --- a/Windows/OrbisNeighborHood/MVVM/View/SubView/AddTargetView.xaml.cs +++ b/Windows/OrbisNeighborHood/MVVM/View/SubView/AddTargetView.xaml.cs @@ -1,23 +1,11 @@ -using OrbisNeighborHood.MVVM.ViewModel; +using OrbisLib2.Common.Database; +using OrbisNeighborHood.MVVM.ViewModel; using OrbisNeighborHood.MVVM.ViewModel.SubView; -using OrbisSuite.Common.Database; using SimpleUI.Controls; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; using System.Text.RegularExpressions; -using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; -using System.Windows.Data; -using System.Windows.Documents; using System.Windows.Input; -using System.Windows.Media; -using System.Windows.Media.Animation; -using System.Windows.Media.Imaging; -using System.Windows.Navigation; -using System.Windows.Shapes; namespace OrbisNeighborHood.MVVM.View.SubView { @@ -26,7 +14,7 @@ namespace OrbisNeighborHood.MVVM.View.SubView /// public partial class AddTargetView : UserControl { - private TargetInfo _newTarget; + private SavedTarget _newTarget; #region Constructor @@ -34,7 +22,7 @@ namespace OrbisNeighborHood.MVVM.View.SubView { InitializeComponent(); - _newTarget = new TargetInfo(); + _newTarget = new SavedTarget(); } #endregion @@ -103,50 +91,50 @@ namespace OrbisNeighborHood.MVVM.View.SubView private void ShowTitleIdLabels_Loaded(object sender, RoutedEventArgs e) { var Switch = (SimpleSwitch)sender; - Switch.IsToggled = _newTarget.Details.ShowTitleId; + Switch.IsToggled = _newTarget.Info.ShowTitleId; } private void ShowTitleIdLabels_MouseDown(object sender, MouseButtonEventArgs e) { var Switch = (SimpleSwitch)sender; - _newTarget.Details.ShowTitleId = Switch.IsToggled; + _newTarget.Info.ShowTitleId = Switch.IsToggled; } private void ShowDevkitPanel_Loaded(object sender, RoutedEventArgs e) { var Switch = (SimpleSwitch)sender; - Switch.IsToggled = _newTarget.Details.ShowDevkitPanel; + Switch.IsToggled = _newTarget.Info.ShowDevkitPanel; } private void ShowDevkitPanel_MouseDown(object sender, MouseButtonEventArgs e) { var Switch = (SimpleSwitch)sender; - _newTarget.Details.ShowDevkitPanel = Switch.IsToggled; + _newTarget.Info.ShowDevkitPanel = Switch.IsToggled; } private void ShowToolboxShortcut_Loaded(object sender, RoutedEventArgs e) { var Switch = (SimpleSwitch)sender; - Switch.IsToggled = _newTarget.Details.ShowToolboxShortcut; + Switch.IsToggled = _newTarget.Info.ShowToolboxShortcut; } private void ShowToolboxShortcut_MouseDown(object sender, MouseButtonEventArgs e) { var Switch = (SimpleSwitch)sender; - _newTarget.Details.ShowToolboxShortcut = Switch.IsToggled; + _newTarget.Info.ShowToolboxShortcut = Switch.IsToggled; } private void ShowAppHome_Loaded(object sender, RoutedEventArgs e) { var Switch = (SimpleSwitch)sender; - Switch.IsToggled = _newTarget.Details.ShowAppHome; + Switch.IsToggled = _newTarget.Info.ShowAppHome; } private void ShowAppHome_MouseDown(object sender, MouseButtonEventArgs e) { var Switch = (SimpleSwitch)sender; - _newTarget.Details.ShowAppHome = Switch.IsToggled; + _newTarget.Info.ShowAppHome = Switch.IsToggled; } #endregion diff --git a/Windows/OrbisNeighborHood/MVVM/View/SubView/EditTargetView.xaml.cs b/Windows/OrbisNeighborHood/MVVM/View/SubView/EditTargetView.xaml.cs index fb72c65..73f94e5 100644 --- a/Windows/OrbisNeighborHood/MVVM/View/SubView/EditTargetView.xaml.cs +++ b/Windows/OrbisNeighborHood/MVVM/View/SubView/EditTargetView.xaml.cs @@ -1,23 +1,12 @@ -using OrbisNeighborHood.MVVM.ViewModel; +using OrbisLib2.Common.Database; +using OrbisLib2.Targets; +using OrbisNeighborHood.MVVM.ViewModel; using OrbisNeighborHood.MVVM.ViewModel.SubView; -using OrbisSuite; -using OrbisSuite.Common.Database; using SimpleUI.Controls; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; using System.Text.RegularExpressions; -using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; -using System.Windows.Data; -using System.Windows.Documents; using System.Windows.Input; -using System.Windows.Media; -using System.Windows.Media.Imaging; -using System.Windows.Navigation; -using System.Windows.Shapes; namespace OrbisNeighborHood.MVVM.View.SubView { @@ -26,11 +15,10 @@ namespace OrbisNeighborHood.MVVM.View.SubView /// public partial class EditTargetView : UserControl { - private TargetInfo _thisTarget; + private SavedTarget _thisTarget; public EditTargetView() { InitializeComponent(); - _thisTarget = new TargetInfo(); } #region Target Info @@ -97,62 +85,74 @@ namespace OrbisNeighborHood.MVVM.View.SubView private void ShowTitleIdLabels_Loaded(object sender, RoutedEventArgs e) { var Switch = (SimpleSwitch)sender; - Switch.IsToggled = _thisTarget.Details.ShowTitleId; + Switch.IsToggled = _thisTarget.Info.ShowTitleId; } private void ShowTitleIdLabels_MouseDown(object sender, MouseButtonEventArgs e) { var Switch = (SimpleSwitch)sender; - _thisTarget.Details.ShowTitleId = Switch.IsToggled; + _thisTarget.Info.ShowTitleId = Switch.IsToggled; - var currentTarget = OrbisLib.Instance.Targets[_thisTarget.Name]; - currentTarget.SetSettings(_thisTarget.Details.ShowTitleId, _thisTarget.Details.ShowDevkitPanel, _thisTarget.Details.ShowToolboxShortcut, _thisTarget.Details.ShowAppHome); + var currentTarget = TargetManager.GetTarget(_thisTarget.Name); + if(currentTarget != null) + { + currentTarget.SetSettings(_thisTarget.Info.ShowTitleId, _thisTarget.Info.ShowDevkitPanel, _thisTarget.Info.ShowToolboxShortcut, _thisTarget.Info.ShowAppHome); + } } private void ShowDevkitPanel_Loaded(object sender, RoutedEventArgs e) { var Switch = (SimpleSwitch)sender; - Switch.IsToggled = _thisTarget.Details.ShowDevkitPanel; + Switch.IsToggled = _thisTarget.Info.ShowDevkitPanel; } private void ShowDevkitPanel_MouseDown(object sender, MouseButtonEventArgs e) { var Switch = (SimpleSwitch)sender; - _thisTarget.Details.ShowDevkitPanel = Switch.IsToggled; + _thisTarget.Info.ShowDevkitPanel = Switch.IsToggled; - var currentTarget = OrbisLib.Instance.Targets[_thisTarget.Name]; - currentTarget.SetSettings(_thisTarget.Details.ShowTitleId, _thisTarget.Details.ShowDevkitPanel, _thisTarget.Details.ShowToolboxShortcut, _thisTarget.Details.ShowAppHome); + var currentTarget = TargetManager.GetTarget(_thisTarget.Name); + if (currentTarget != null) + { + currentTarget.SetSettings(_thisTarget.Info.ShowTitleId, _thisTarget.Info.ShowDevkitPanel, _thisTarget.Info.ShowToolboxShortcut, _thisTarget.Info.ShowAppHome); + } } private void ShowToolboxShortcut_Loaded(object sender, RoutedEventArgs e) { var Switch = (SimpleSwitch)sender; - Switch.IsToggled = _thisTarget.Details.ShowToolboxShortcut; + Switch.IsToggled = _thisTarget.Info.ShowToolboxShortcut; } private void ShowToolboxShortcut_MouseDown(object sender, MouseButtonEventArgs e) { var Switch = (SimpleSwitch)sender; - _thisTarget.Details.ShowToolboxShortcut = Switch.IsToggled; + _thisTarget.Info.ShowToolboxShortcut = Switch.IsToggled; - var currentTarget = OrbisLib.Instance.Targets[_thisTarget.Name]; - currentTarget.SetSettings(_thisTarget.Details.ShowTitleId, _thisTarget.Details.ShowDevkitPanel, _thisTarget.Details.ShowToolboxShortcut, _thisTarget.Details.ShowAppHome); + var currentTarget = TargetManager.GetTarget(_thisTarget.Name); + if (currentTarget != null) + { + currentTarget.SetSettings(_thisTarget.Info.ShowTitleId, _thisTarget.Info.ShowDevkitPanel, _thisTarget.Info.ShowToolboxShortcut, _thisTarget.Info.ShowAppHome); + } } private void ShowAppHome_Loaded(object sender, RoutedEventArgs e) { var Switch = (SimpleSwitch)sender; - Switch.IsToggled = _thisTarget.Details.ShowAppHome; + Switch.IsToggled = _thisTarget.Info.ShowAppHome; } private void ShowAppHome_MouseDown(object sender, MouseButtonEventArgs e) { var Switch = (SimpleSwitch)sender; - _thisTarget.Details.ShowAppHome = Switch.IsToggled; + _thisTarget.Info.ShowAppHome = Switch.IsToggled; - var currentTarget = OrbisLib.Instance.Targets[_thisTarget.Name]; - currentTarget.SetSettings(_thisTarget.Details.ShowTitleId, _thisTarget.Details.ShowDevkitPanel, _thisTarget.Details.ShowToolboxShortcut, _thisTarget.Details.ShowAppHome); + var currentTarget = TargetManager.GetTarget(_thisTarget.Name); + if (currentTarget != null) + { + currentTarget.SetSettings(_thisTarget.Info.ShowTitleId, _thisTarget.Info.ShowDevkitPanel, _thisTarget.Info.ShowToolboxShortcut, _thisTarget.Info.ShowAppHome); + } } #endregion @@ -220,7 +220,8 @@ namespace OrbisNeighborHood.MVVM.View.SubView var dc = ((EditTargetViewModel)DataContext); if (dc == null || dc.CurrentTarget == null) { - _thisTarget = new TargetInfo(); + // Abort + MainViewModel.Instance.CurrentView = MainViewModel.Instance.DashboardHomeVM; } else { diff --git a/Windows/OrbisNeighborHood/MVVM/View/TargetView.xaml.cs b/Windows/OrbisNeighborHood/MVVM/View/TargetView.xaml.cs index 2486b75..89b5bf3 100644 --- a/Windows/OrbisNeighborHood/MVVM/View/TargetView.xaml.cs +++ b/Windows/OrbisNeighborHood/MVVM/View/TargetView.xaml.cs @@ -1,7 +1,7 @@ using OrbisNeighborHood.Controls; using System.Windows.Controls; -using OrbisSuite; -using System; +using OrbisLib2.General; +using OrbisLib2.Targets; namespace OrbisNeighborHood.MVVM.View { @@ -17,8 +17,8 @@ namespace OrbisNeighborHood.MVVM.View InitializeComponent(); RefreshTargets(); - OrbisLib.Instance.Events.DBTouched += Events_DBTouched; - OrbisLib.Instance.Events.TargetStateChanged += Events_TargetStateChanged; + Events.DBTouched += Events_DBTouched; + Events.TargetStateChanged += Events_TargetStateChanged; } #endregion @@ -46,15 +46,16 @@ namespace OrbisNeighborHood.MVVM.View { TargetList.Items.Clear(); - if (OrbisLib.Instance.TargetManagement.TargetList == null) - return; - - foreach (var Target in OrbisLib.Instance.TargetManagement.TargetList) + if (TargetManager.Targets.Count > 0) { - var targetView = new TargetPanel(Target.Name); - targetView.TargetChanged += Target_TargetChanged; - TargetList.Items.Add(targetView); + foreach (var Target in TargetManager.Targets) + { + var targetView = new TargetPanel(Target.Name); + targetView.TargetChanged += Target_TargetChanged; + TargetList.Items.Add(targetView); + } } + var newTargetView = new NewTargetPanel(); newTargetView.TargetChanged += Target_TargetChanged; TargetList.Items.Add(newTargetView); diff --git a/Windows/OrbisNeighborHood/MVVM/ViewModel/SubView/EditTargetViewModel.cs b/Windows/OrbisNeighborHood/MVVM/ViewModel/SubView/EditTargetViewModel.cs index 18df1fe..107799a 100644 --- a/Windows/OrbisNeighborHood/MVVM/ViewModel/SubView/EditTargetViewModel.cs +++ b/Windows/OrbisNeighborHood/MVVM/ViewModel/SubView/EditTargetViewModel.cs @@ -1,10 +1,6 @@ -using OrbisNeighborHood.MVVM.View.SubView; -using OrbisSuite.Common.Database; +using OrbisLib2.Common.Database; +using OrbisLib2.Targets; using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; using System.Windows; namespace OrbisNeighborHood.MVVM.ViewModel.SubView @@ -29,7 +25,7 @@ namespace OrbisNeighborHood.MVVM.ViewModel.SubView #region Dependency Properties - public TargetInfo? CurrentTarget { get; set; } + public SavedTarget CurrentTarget { get; set; } public object CallingVM { get; set; } diff --git a/Windows/OrbisNeighborHood/NeighborHood.xaml.cs b/Windows/OrbisNeighborHood/NeighborHood.xaml.cs index c4ec235..0b719af 100644 --- a/Windows/OrbisNeighborHood/NeighborHood.xaml.cs +++ b/Windows/OrbisNeighborHood/NeighborHood.xaml.cs @@ -1,22 +1,5 @@ -using OrbisSuite; +using OrbisLib2.Common.Dispatcher; using SimpleUI.Controls; -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Reflection; -using System.Text; -using System.Threading.Tasks; -using System.Windows; -using System.Windows.Controls; -using System.Windows.Data; -using System.Windows.Documents; -using System.Windows.Input; -using System.Windows.Media; -using System.Windows.Media.Imaging; -using System.Windows.Navigation; -using System.Windows.Shapes; -using OrbisSuite.Common.Database; namespace OrbisNeighborHood { @@ -28,6 +11,7 @@ namespace OrbisNeighborHood public NeighborHood() { InitializeComponent(); + DispatcherClient.Subscribe(); } } } diff --git a/Windows/OrbisNeighborHood/OrbisNeighborHood.csproj b/Windows/OrbisNeighborHood/OrbisNeighborHood.csproj index 1433a9e..31677f1 100644 --- a/Windows/OrbisNeighborHood/OrbisNeighborHood.csproj +++ b/Windows/OrbisNeighborHood/OrbisNeighborHood.csproj @@ -173,7 +173,7 @@ - + diff --git a/Windows/OrbisNeighborHood/Resources/BuildNumber.txt b/Windows/OrbisNeighborHood/Resources/BuildNumber.txt index b2a5d94..b6ac305 100644 --- a/Windows/OrbisNeighborHood/Resources/BuildNumber.txt +++ b/Windows/OrbisNeighborHood/Resources/BuildNumber.txt @@ -1 +1 @@ -1991 +2047 diff --git a/Windows/OrbisNeighborHood/Resources/BuildString.txt b/Windows/OrbisNeighborHood/Resources/BuildString.txt index 4dba243..f585909 100644 --- a/Windows/OrbisNeighborHood/Resources/BuildString.txt +++ b/Windows/OrbisNeighborHood/Resources/BuildString.txt @@ -1 +1 @@ -Version 3.0.1991 Debug Build Thursday December 22 2022 9:17 PM +Version 3.0.2047 Debug Build Friday December 23 2022 10:35 AM diff --git a/Windows/OrbisSuiteService/OrbisSuiteService.csproj b/Windows/OrbisSuiteService/OrbisSuiteService.csproj index 88fefc5..0072810 100644 --- a/Windows/OrbisSuiteService/OrbisSuiteService.csproj +++ b/Windows/OrbisSuiteService/OrbisSuiteService.csproj @@ -4,7 +4,7 @@ Exe net6.0-windows enable - enable + annotations OrbisTaskbarApp.ico @@ -14,10 +14,11 @@ + - + diff --git a/Windows/OrbisSuiteService/Service/ClientInstance.cs b/Windows/OrbisSuiteService/Service/ClientInstance.cs deleted file mode 100644 index 9896370..0000000 --- a/Windows/OrbisSuiteService/Service/ClientInstance.cs +++ /dev/null @@ -1,71 +0,0 @@ -using OrbisSuite.Common; -using System.Net.Sockets; - -namespace OrbisSuiteService.Service -{ - class ClientInstance - { - /// - /// The port used to communicate with the client. - /// - public int Port - { - get; - private set; - } - - /// - /// The last known name of the client. - /// - public string Name - { - get; - private set; - } - - /// - /// The last time the client sent a heartbeat packet. - /// - public int LastUpdate { get; set; } - - /// - /// - /// - /// Port of the client. - /// Name of the client - /// Set the last time we got a packet from the client. - public ClientInstance(int Port, string Name, int LastUpdate) - { - this.Port = Port; - this.Name = Name; - this.LastUpdate = LastUpdate; - } - - /// - /// Sends a seralizable object to the client. - /// - /// A serializable object we would like to send. - /// Returns if the data was sent or not. - public bool SendObject(object obj) - { - try - { - var Sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); - if (Sock.EasyConnect("127.0.0.1", Port, 1000)) - { - Sock.SendObject(obj); - - Sock.Close(); - - return true; - } - } - catch (Exception ex) - { - Console.WriteLine($"[{System.Reflection.MethodBase.GetCurrentMethod()?.Name}] Error: {ex.Message}"); - } - - return false; - } - } -} diff --git a/Windows/OrbisSuiteService/Service/DBWatcher.cs b/Windows/OrbisSuiteService/Service/DBWatcher.cs index 29f1d0d..3f65eb6 100644 --- a/Windows/OrbisSuiteService/Service/DBWatcher.cs +++ b/Windows/OrbisSuiteService/Service/DBWatcher.cs @@ -1,4 +1,4 @@ -using OrbisSuite.Common; +using OrbisLib2.Common; namespace OrbisSuiteService.Service { diff --git a/Windows/OrbisSuiteService/Service/Dispatcher.cs b/Windows/OrbisSuiteService/Service/Dispatcher.cs index b2d23b8..aa697c4 100644 --- a/Windows/OrbisSuiteService/Service/Dispatcher.cs +++ b/Windows/OrbisSuiteService/Service/Dispatcher.cs @@ -1,21 +1,13 @@ -using OrbisSuite.Common; -using OrbisSuite.Common.Dispatcher; -using OrbisSuite.Common.Database; -using System.Net.Sockets; +using TinyIpc.Messaging; +using OrbisLib2.Common.Database; +using OrbisLib2.Common.Dispatcher; +using OrbisLib2.Common.Helpers; namespace OrbisSuiteService.Service { public class Dispatcher { - private static readonly int _maxClients = 20; - private readonly int _clientMax = Config.DispatcherClientPort + _maxClients; - private List _clients = new List(); - - private Listener _DispatcherListener = new Listener(Config.DispatcherPort); - private Listener _EventListener = new Listener(Config.EventPort); - - private Task _HeartbeatTask; - private CancellationToken _HeartbeatCancellationToken; + private TinyMessageBus _ServiceMessageBus; private DBWatcher _DBWatcher = new DBWatcher(); private Settings _Settings = Settings.CreateInstance(); @@ -25,33 +17,18 @@ namespace OrbisSuiteService.Service public Dispatcher() { - try - { - //Sets up dispatcher listener that will handle Client => Service requests. - _DispatcherListener.SocketAccepted += _DispatcherListener_SocketAccepted; - _DispatcherListener.Start(); + _ServiceMessageBus = new TinyMessageBus("OrbisSuite"); - //Sets up Event Listener that will handle events from the Target Console => Service => All Clients. - _EventListener.SocketAccepted += _EventListener_SocketAccepted; - _EventListener.Start(); - - //Starts up heartbeat task that will check for clients that have not gracefully shutdown and time them out. - _HeartbeatTask = Task.Run(() => DoHeartbeat()); - - //Helpers - _DBWatcher.DBChanged += _DBWatcher_DBChanged; - /*_SerialMonitor.NewSerialDataRecieved += _SerialMonitor_NewSerialDataRecieved; - _SerialMonitor.Settings.PortName = ""; - _SerialMonitor.StartListening();*/ - _TargetWatcher = new TargetWatcher(this); - } - catch (Exception ex) - { - Console.WriteLine($"[{System.Reflection.MethodBase.GetCurrentMethod().Name}] Error: {ex.Message}"); - } + //Helpers + _DBWatcher.DBChanged += _DBWatcher_DBChanged; + /*_SerialMonitor.NewSerialDataRecieved += _SerialMonitor_NewSerialDataRecieved; + _SerialMonitor.Settings.PortName = ""; + _SerialMonitor.StartListening();*/ + _TargetWatcher = new TargetWatcher(this); } private byte[] _SerialDataBuffer = new byte[0]; + private void _SerialMonitor_NewSerialDataRecieved(object sender, SerialDataEventArgs e) { _SerialDataBuffer = _SerialDataBuffer.Concat(e.Data).ToArray(); @@ -61,7 +38,7 @@ namespace OrbisSuiteService.Service { var Packet = new ForwardPacket(ForwardPacket.PacketType.SerialCom, ""); Packet.SerialCom.Data = _SerialDataBuffer; - ForwardPacketAll(Packet); + PublishEvent(Packet); //Clear buffer for next print. _SerialDataBuffer = new byte[0]; @@ -70,163 +47,12 @@ namespace OrbisSuiteService.Service private void _DBWatcher_DBChanged() { - ForwardPacketAll(new ForwardPacket(ForwardPacket.PacketType.DBTouched, "")); + PublishEvent(new ForwardPacket(ForwardPacket.PacketType.DBTouched, "")); } - private void _EventListener_SocketAccepted(Socket e) + public void PublishEvent(ForwardPacket Packet) { - //This will be coming fromt the console which is c++ so we will have to marshal this when I figure out the packet structure. - throw new NotImplementedException(); - } - - private void _DispatcherListener_SocketAccepted(Socket e) - { - try - { - var Packet = (DispatcherClientPacket)e.RecvObject(); - - switch (Packet.Type) - { - default: - Console.WriteLine("Invalid Packet..."); - break; - - case DispatcherClientPacket.PacketType.NewClient: - e.SendInt32(AddClient(Packet.ClientName)); - break; - - case DispatcherClientPacket.PacketType.RemoveClient: - RemoveClient(Packet.Port); - break; - - case DispatcherClientPacket.PacketType.HeartBeat: - if (_clients.Any(p => p.Port == Packet.Port)) - { - var Client = _clients.Where(p => p.Port == Packet.Port).First(); - var CurrentTick = (Environment.TickCount & Int32.MaxValue); - - Console.WriteLine($"[HeartBeat] in {(CurrentTick - Client.LastUpdate).ToString()}ms from {Packet.ClientName}({Packet.Port.ToString()})"); - - // Update last time we got a heart beat. - Client.LastUpdate = CurrentTick; - - // Send Success. - e.SendInt32(1); - } - else // Send Failure. - e.SendInt32(0); - - - break; - } - } - catch (Exception ex) - { - Console.WriteLine($"[{System.Reflection.MethodBase.GetCurrentMethod()?.Name}] Error: {ex.Message}"); - } - } - - /// - /// Adds a client to the '_clients'. - /// - /// The text name of the client. Should be the other programs name. - /// Returns the port the Dispatcher will send the data on. - public int AddClient(string Name) - { - try - { - int Port = Config.DispatcherClientPort; - while (Port < _clientMax) - { - if (!_clients.Any(p => p.Port == Port)) - break; - - Port++; - - if (Port == _clientMax) - { - Console.WriteLine("Client List Full."); - - return -1; - } - } - - Console.WriteLine($"New Client: {Name} {Port.ToString()}."); - - _clients.Add(new ClientInstance(Port, Name, Environment.TickCount & Int32.MaxValue)); - - return Port; - } - catch (Exception ex) - { - Console.WriteLine($"[{System.Reflection.MethodBase.GetCurrentMethod()?.Name}] Error: {ex.Message}"); - } - - return -1; - } - - /// - /// Removes the client specified from the '_clients'. - /// - /// The port of the client you want to remove. - public void RemoveClient(int Port) - { - if (_clients.Any(p => p.Port == Port)) - { - var Client = _clients.Where(p => p.Port == Port); - _clients.Remove(Client.First()); - } - } - - /// - /// Forwards a packet to all the clients in the '_clients'. - /// - /// The packet data that should be sent. - public void ForwardPacketAll(ForwardPacket Packet) - { - try - { - foreach (ClientInstance Client in _clients) - Task.Factory.StartNew(() => Client.SendObject(Packet)); - } - catch (Exception ex) - { - Console.WriteLine($"[{System.Reflection.MethodBase.GetCurrentMethod()?.Name}] Error: {ex.Message}"); - } - } - - /// - /// This task will check for client time outs. This way it keeps the client list fresh and keeps from unneeded thread hold ups. - /// - /// - private async Task DoHeartbeat() - { - try - { - while (true) - { - var CurrentTick = (Environment.TickCount & Int32.MaxValue); - - foreach (var Client in _clients) - { - if (CurrentTick - Client.LastUpdate > 10000) - { - Console.WriteLine($"[Dispatcher] No response from client {Client.Name}({Client.Port.ToString()}) in more than 10000 ms. Last update was {(CurrentTick - Client.LastUpdate).ToString()} ms Timing Out!"); - - RemoveClient(Client.Port); - } - } - - await Task.Delay(2000, _HeartbeatCancellationToken); - - if (_HeartbeatCancellationToken.IsCancellationRequested) - break; - } - } - catch (Exception ex) - { - Console.WriteLine($"[{System.Reflection.MethodBase.GetCurrentMethod()?.Name}] Error: {ex.Message}"); - } + _ServiceMessageBus.PublishAsync(Helper.ObjectToByteArray(Packet)); } } } diff --git a/Windows/OrbisSuiteService/Service/TargetWatcher.cs b/Windows/OrbisSuiteService/Service/TargetWatcher.cs index 4c0ba73..cc8334c 100644 --- a/Windows/OrbisSuiteService/Service/TargetWatcher.cs +++ b/Windows/OrbisSuiteService/Service/TargetWatcher.cs @@ -1,6 +1,7 @@ -using OrbisSuite.Common; -using OrbisSuite.Common.Database; -using OrbisSuite.Common.Dispatcher; +using OrbisLib2.Common.Database; +using OrbisLib2.Common.Dispatcher; +using OrbisLib2.Common.Helpers; +using OrbisLib2.Targets; namespace OrbisSuiteService.Service { @@ -15,57 +16,61 @@ namespace OrbisSuiteService.Service _dispatcher = dispatcher; _TargetWatcherTask = Task.Run(() => DoTargetWatcher()); } - private async Task DoTargetWatcher() { while (true) { - Parallel.ForEach(SavedTargets.Targets, Target => + if(TargetManager.Targets.Count <= 0) { - var oldAvailable = Target.Details.IsAvailable; - var OldAPIAvailable = Target.Details.IsAPIAvailable; + await Task.Delay(1000, _TargetWatcherCancellationToken); + } - if(Helpers.PingHost(Target.IPAddress)) + Parallel.ForEach(SavedTarget.GetTargetList(), Target => + { + var oldAvailable = Target.Info.IsAvailable; + var OldAPIAvailable = Target.Info.IsAPIAvailable; + + if(Helper.PingHost(Target.IPAddress)) { - var detail = Target.Details; + var detail = Target.Info; detail.IsAvailable = true; } - Target.Details.IsAvailable = Helpers.PingHost(Target.IPAddress); - Target.Details.IsAPIAvailable = Helpers.TestTcpConnection(Target.IPAddress, Settings.CreateInstance().APIPort); - Target.Details.Save(); + Target.Info.IsAvailable = Helper.PingHost(Target.IPAddress); + Target.Info.IsAPIAvailable = Helper.TestTcpConnection(Target.IPAddress, Settings.CreateInstance().APIPort); + Target.Info.Save(); - if (Target.Details.IsAPIAvailable) - SavedTargets.UpdateTargetInfo(Target.Name); + if (Target.Info.IsAPIAvailable) + TargetManager.UpdateTargetInfo(Target); else { - Target.Details.CPUTemp = 0; - Target.Details.SOCTemp = 0; - Target.Details.ThreadCount = 0; - Target.Details.AverageCPUUsage = 0; - Target.Details.BusyCore = 0; - Target.Details.RamUsage = 0; - Target.Details.VRamUsage = 0; - Target.Details.CurrentTitleID = "-"; - Target.Details.Save(); + Target.Info.CPUTemp = 0; + Target.Info.SOCTemp = 0; + Target.Info.ThreadCount = 0; + Target.Info.AverageCPUUsage = 0; + Target.Info.BusyCore = 0; + Target.Info.RamUsage = 0; + Target.Info.VRamUsage = 0; + Target.Info.CurrentTitleID = "-"; + Target.Info.Save(); } // Forward Target Availability. - if (oldAvailable != Target.Details.IsAvailable) + if (oldAvailable != Target.Info.IsAvailable) { var Packet = new ForwardPacket(ForwardPacket.PacketType.TargetAvailability, Target.IPAddress); - Packet.TargetAvailability.Available = Target.Details.IsAvailable; + Packet.TargetAvailability.Available = Target.Info.IsAvailable; Packet.TargetAvailability.Name = Target.Name; - _dispatcher.ForwardPacketAll(Packet); + _dispatcher.PublishEvent(Packet); } // Forward API Availability. - if (OldAPIAvailable != Target.Details.IsAPIAvailable) + if (OldAPIAvailable != Target.Info.IsAPIAvailable) { var Packet = new ForwardPacket(ForwardPacket.PacketType.TargetAPIAvailability, Target.IPAddress); - Packet.TargetAPIAvailability.Available = Target.Details.IsAvailable; + Packet.TargetAPIAvailability.Available = Target.Info.IsAvailable; Packet.TargetAPIAvailability.Name = Target.Name; - _dispatcher.ForwardPacketAll(Packet); + _dispatcher.PublishEvent(Packet); } });