Create socket classes for socket helper methods for better organization.

This commit is contained in:
Greg
2022-12-27 18:24:09 -07:00
parent d13180cb0e
commit 28e686c507
19 changed files with 274 additions and 249 deletions
+19 -19
View File
@@ -89,13 +89,13 @@ void Apps::GetAppsList(OrbisNetId Sock)
std::vector<AppDatabase::AppInfo> AppList;
if (!AppDatabase::GetApps(AppList))
{
SockSendInt(Sock, 0);
Sockets::SendInt(Sock, 0);
return;
}
SockSendInt(Sock, AppList.size());
Sockets::SendInt(Sock, AppList.size());
SendLargeData(Sock, (unsigned char*)AppList.data(), AppList.size() * sizeof(AppInfoPacket));
Sockets::SendLargeData(Sock, (unsigned char*)AppList.data(), AppList.size() * sizeof(AppInfoPacket));
}
void Apps::GetAppInfoString(OrbisNetId Sock, const char* TitleId)
@@ -147,7 +147,7 @@ void Apps::SendAppStatus(OrbisNetId Sock, const char* TitleId)
// If we have no appId that means the process is not running.
if (appId <= 0)
{
SockSendInt(Sock, STATE_NOT_RUNNING);
Sockets::SendInt(Sock, STATE_NOT_RUNNING);
}
else
{
@@ -155,11 +155,11 @@ void Apps::SendAppStatus(OrbisNetId Sock, const char* TitleId)
auto res = sceSystemServiceIsAppSuspended(appId, &state);
if (res == 0 && state)
{
SockSendInt(Sock, STATE_SUSPENDED);
Sockets::SendInt(Sock, STATE_SUSPENDED);
}
else
{
SockSendInt(Sock, STATE_RUNNING);
Sockets::SendInt(Sock, STATE_RUNNING);
}
}
}
@@ -173,7 +173,7 @@ void Apps::StartApp(OrbisNetId Sock, const char* TitleId)
{
klog("sceUserServiceGetForegroundUser(): Failed with error %llX\n", res);
SockSendInt(Sock, 0);
Sockets::SendInt(Sock, 0);
return;
}
@@ -182,11 +182,11 @@ void Apps::StartApp(OrbisNetId Sock, const char* TitleId)
{
klog("sceLncUtilLaunchApp() : Failed with error % llX\n", res);
SockSendInt(Sock, 0);
Sockets::SendInt(Sock, 0);
return;
}
SockSendInt(Sock, res);
Sockets::SendInt(Sock, res);
}
void Apps::KillApp(OrbisNetId Sock, const char* TitleId)
@@ -195,11 +195,11 @@ void Apps::KillApp(OrbisNetId Sock, const char* TitleId)
if (appId > 0 && sceSystemServiceKillApp(appId, -1, 0, 0) == 0)
{
SockSendInt(Sock, 1);
Sockets::SendInt(Sock, 1);
}
else
{
SockSendInt(Sock, 0);
Sockets::SendInt(Sock, 0);
}
}
@@ -209,11 +209,11 @@ void Apps::SuspendApp(OrbisNetId Sock, const char* TitleId)
if (appId > 0 && LncUtil::sceLncUtilSuspendApp(appId, 0) == 0)
{
SockSendInt(Sock, 1);
Sockets::SendInt(Sock, 1);
}
else
{
SockSendInt(Sock, 0);
Sockets::SendInt(Sock, 0);
}
}
@@ -223,11 +223,11 @@ void Apps::ResumeApp(OrbisNetId Sock, const char* TitleId)
if (appId > 0 && LncUtil::sceLncUtilResumeApp(appId, 0) == 0 && sceApplicationSetApplicationFocus(appId) == 0)
{
SockSendInt(Sock, 1);
Sockets::SendInt(Sock, 1);
}
else
{
SockSendInt(Sock, 0);
Sockets::SendInt(Sock, 0);
}
}
@@ -235,7 +235,7 @@ void Apps::DeleteApp(OrbisNetId Sock, const char* TitleId)
{
auto result = sceAppInstUtilAppUnInstall(TitleId);
SockSendInt(Sock, (result == 0) ? 1 : 0);
Sockets::SendInt(Sock, (result == 0) ? 1 : 0);
}
void Apps::SetVisibility(OrbisNetId Sock, const char* TitleId)
@@ -248,16 +248,16 @@ void Apps::SetVisibility(OrbisNetId Sock, const char* TitleId)
ShellUIIPC::RefreshContentArea();
SockSendInt(Sock, result ? 1 : 0);
Sockets::SendInt(Sock, result ? 1 : 0);
}
SockSendInt(Sock, 0);
Sockets::SendInt(Sock, 0);
}
void Apps::GetVisibility(OrbisNetId Sock, const char* TitleId)
{
auto visibility = AppDatabase::GetVisibility(TitleId);
SockSendInt(Sock, visibility);
Sockets::SendInt(Sock, visibility);
}
Apps::Apps()
+2 -1
View File
@@ -28,10 +28,11 @@
#include "Utilities.h"
#include "GoldHEN.h"
#include "../../Misc/libjbc.h"
#include "Sockets.h"
#include "System.h"
#include "Flash.h"
#include "APIPackets.h"
#include "LncUtil.h"
#include "ShellCoreUtil.h"
#include "SystemMonitor.h"
#include "SystemMonitor.h"
+2 -2
View File
@@ -26,14 +26,14 @@ OrbisNetId GeneralIPC::Connect(const char* ProcessName)
bool GeneralIPC::SendCommand(OrbisNetId Sock, int Command)
{
if (!SockSendInt(Sock, Command))
if (!Sockets::SendInt(Sock, Command))
{
klog("[GeneralIPC] Failed to send Command\n");
return false;
}
int Status;
if (!SockRecvInt(Sock, &Status))
if (!Sockets::RecvInt(Sock, &Status))
{
klog("[GeneralIPC] Failed to recv status\n");
return false;
@@ -76,6 +76,7 @@ del /s /q /f $(IntDir)\*.oelf</NMakeCleanCommandLine>
<ClCompile Include="ShellCoreUtil.cpp" />
<ClCompile Include="ShellUIIPC.cpp" />
<ClCompile Include="SocketListener.cpp" />
<ClCompile Include="Sockets.cpp" />
<ClCompile Include="System.cpp" />
<ClCompile Include="SystemMonitor.cpp" />
<ClCompile Include="Target.cpp" />
@@ -99,6 +100,7 @@ del /s /q /f $(IntDir)\*.oelf</NMakeCleanCommandLine>
<ClInclude Include="ShellCoreUtil.h" />
<ClInclude Include="ShellUIIPC.h" />
<ClInclude Include="SocketListener.h" />
<ClInclude Include="Sockets.h" />
<ClInclude Include="System.h" />
<ClInclude Include="SystemMonitor.h" />
<ClInclude Include="Target.h" />
@@ -106,6 +106,9 @@
<ClCompile Include="ShellUIIPC.cpp">
<Filter>Source Files\Utilities</Filter>
</ClCompile>
<ClCompile Include="Sockets.cpp">
<Filter>Source Files\Utilities</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="Common.h">
@@ -174,5 +177,8 @@
<ClInclude Include="ShellUIIPC.h">
<Filter>Header Files\Utilities</Filter>
</ClInclude>
<ClInclude Include="Sockets.h">
<Filter>Header Files\Utilities</Filter>
</ClInclude>
</ItemGroup>
</Project>
+1 -1
View File
@@ -44,7 +44,7 @@ void Proc::SendProcessList(OrbisNetId Sock)
std::vector<kinfo_proc> processList;
GetProcessList(processList);
SockSendInt(Sock, processList.size());
Sockets::SendInt(Sock, processList.size());
for (const auto& i : processList)
{
+2 -2
View File
@@ -23,14 +23,14 @@ OrbisNetId ShellUIIPC::Connect()
bool ShellUIIPC::SendCommand(OrbisNetId Sock, int Command)
{
if (!SockSendInt(Sock, Command))
if (!Sockets::SendInt(Sock, Command))
{
klog("[GeneralIPC] Failed to send Command\n");
return false;
}
int Status;
if (!SockRecvInt(Sock, &Status))
if (!Sockets::RecvInt(Sock, &Status))
{
klog("[GeneralIPC] Failed to recv status\n");
return false;
+36
View File
@@ -0,0 +1,36 @@
#include "Common.h"
#include "Sockets.h"
bool Sockets::SendInt(OrbisNetId Sock, int val)
{
return !(sceNetSend(Sock, &val, sizeof(int), 0) < 0);
}
bool Sockets::RecvInt(OrbisNetId Sock, int* val)
{
return !(sceNetRecv(Sock, val, sizeof(int), 0) < 0);
}
bool Sockets::SendLargeData(OrbisNetId Sock, unsigned char* data, size_t dataLen)
{
unsigned char* CurrentPosition = data;
size_t DataLeft = dataLen;
int res = 0;
while (DataLeft > 0)
{
size_t DataChunkSize = std::min((size_t)8192, DataLeft);
res = sceNetSend(Sock, CurrentPosition, DataChunkSize, 0);
if (res < 0)
{
return false;
}
DataLeft -= res;
CurrentPosition += res;
}
return true;
}
+12
View File
@@ -0,0 +1,12 @@
#pragma once
class Sockets
{
public:
static bool SendInt(OrbisNetId Sock, int val);
static bool RecvInt(OrbisNetId Sock, int* val);
static bool SendLargeData(OrbisNetId Sock, unsigned char* data, size_t dataLen);
private:
};
-40
View File
@@ -190,46 +190,6 @@ int getMacAddress(OrbisNetIfName ifName_Num, char* strOut, size_t len)
#pragma endregion
#pragma region Networking
bool SockSendInt(OrbisNetId Sock, int val)
{
return !(sceNetSend(Sock, &val, sizeof(int), 0) < 0);
}
bool SockRecvInt(OrbisNetId Sock, int* val)
{
return !(sceNetRecv(Sock, val, sizeof(int), 0) < 0);
}
#define MIN(a,b) ((a) < (b) ? (a) : (b))
bool SendLargeData(OrbisNetId Sock, unsigned char* data, size_t dataLen)
{
unsigned char* CurrentPosition = data;
size_t DataLeft = dataLen;
int res = 0;
while (DataLeft > 0)
{
size_t DataChunkSize = MIN(8192, DataLeft);
res = sceNetSend(Sock, CurrentPosition, DataChunkSize, 0);
if (res < 0)
{
return false;
}
DataLeft -= res;
CurrentPosition += res;
}
return true;
}
#pragma endregion
void hexdump(void* ptr, int buflen) {
unsigned char* buf = (unsigned char*)ptr;
int i, j;
-6
View File
@@ -15,12 +15,6 @@ bool Jailbreak();
bool CopySflash();
int getMacAddress(OrbisNetIfName ifName_Num, char* strOut, size_t strlen);
//TODO: Make socket class.
// Networking
bool SockSendInt(OrbisNetId Sock, int val);
bool SockRecvInt(OrbisNetId Sock, int* val);
bool SendLargeData(OrbisNetId Sock, unsigned char* data, size_t dataLen);
struct kinfo_proc {
int structSize; //0x00
int layout; //0x04
+11 -11
View File
@@ -1,11 +1,11 @@
#pragma once
#define ORBISLIB_MAJOR 3
#define ORBISLIB_MINOR 0
#define ORBISLIB_BUILDVERSION 708
#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 715
#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
+1 -1
View File
@@ -84,7 +84,7 @@ int main()
// Init App install utils.
sceAppInstUtilInitialize();
//#define LOADTOOLBOX
#define LOADTOOLBOX
#ifdef LOADTOOLBOX
auto handle = sys_sdk_proc_prx_load("SceShellUI", "/user/data/Orbis Toolbox/OrbisToolbox-2.0.sprx");
if (handle > 0) {
+11 -11
View File
@@ -1,11 +1,11 @@
#pragma once
#define ORBIS_TOOLBOX_MAJOR 2
#define ORBIS_TOOLBOX_MINOR 0
#define ORBIS_TOOLBOX_BUILDVERSION 290
#define stringify(a) stringify_(a)
#define stringify_(a) #a
#if defined(ORBIS_TOOLBOX_DEBUG)
#define ORBIS_TOOLBOX_BUILDSTRING ("[Orbis Toolbox " stringify(ORBIS_TOOLBOX_MAJOR) "." stringify(ORBIS_TOOLBOX_MINOR) "] Dev Build " stringify(ORBIS_TOOLBOX_BUILDVERSION) " " __DATE__ " " __TIME__)
#else
#define ORBIS_TOOLBOX_BUILDSTRING ("[Orbis Toolbox " stringify(ORBIS_TOOLBOX_MAJOR) "." stringify(ORBIS_TOOLBOX_MINOR) "] Build " stringify(ORBIS_TOOLBOX_BUILDVERSION) " " __DATE__ " " __TIME__)
#endif
#pragma once
#define ORBIS_TOOLBOX_MAJOR 2
#define ORBIS_TOOLBOX_MINOR 0
#define ORBIS_TOOLBOX_BUILDVERSION 291
#define stringify(a) stringify_(a)
#define stringify_(a) #a
#if defined(ORBIS_TOOLBOX_DEBUG)
#define ORBIS_TOOLBOX_BUILDSTRING ("[Orbis Toolbox " stringify(ORBIS_TOOLBOX_MAJOR) "." stringify(ORBIS_TOOLBOX_MINOR) "] Dev Build " stringify(ORBIS_TOOLBOX_BUILDVERSION) " " __DATE__ " " __TIME__)
#else
#define ORBIS_TOOLBOX_BUILDSTRING ("[Orbis Toolbox " stringify(ORBIS_TOOLBOX_MAJOR) "." stringify(ORBIS_TOOLBOX_MINOR) "] Build " stringify(ORBIS_TOOLBOX_BUILDVERSION) " " __DATE__ " " __TIME__)
#endif
@@ -41,156 +41,6 @@ namespace OrbisLib2.Common.Helpers
}
}
/// <summary>
/// Sends an object and its size to the socket.
/// </summary>
/// <param name="s"></param>
/// <param name="obj">The object we would like to send. (Must be serializable.)</param>
public static void SendObject(this Socket s, object obj)
{
var Data = ObjectToByteArray(obj);
s.Send(BitConverter.GetBytes(Data.Length), sizeof(int), SocketFlags.None);
s.Send(Data);
}
/// <summary>
/// Recieve an object from a socket.
/// </summary>
/// <param name="s"></param>
/// <returns>Returns the object we would like to receive.</returns>
public static object RecvObject(this Socket s)
{
var ObjectSize = s.RecvInt32();
var ObjectData = new byte[ObjectSize];
s.Receive(ObjectData);
return ByteArrayToObject(ObjectData);
}
/// <summary>
/// Sends an int32 over socket.
/// </summary>
/// <param name="s"></param>
/// <param name="Data"></param>
public static void SendInt32(this Socket s, int Data)
{
s.Send(BitConverter.GetBytes(Data));
}
/// <summary>
/// Receives an int32 over sockets.
/// </summary>
/// <param name="s"></param>
/// <returns></returns>
public static int RecvInt32(this Socket s)
{
var Data = new byte[sizeof(int)];
s.Receive(Data);
return BitConverter.ToInt32(Data, 0);
}
public static void RecvLarge(this Socket s, byte[] data)
{
int Left = data.Length;
int Received = 0;
while(Left > 0)
{
var chunkSize = Math.Min(s.ReceiveBufferSize, Left);
var res = s.Receive(data, Received, chunkSize, 0);
Received += res;
Left -= res;
}
}
/// <summary>
/// Easily connect to a socket and handle the time out.
/// </summary>
/// <param name="s"></param>
/// <param name="IPAddress">The address we would like to connect to.</param>
/// <param name="Port">The port of the socket we would like to connect to.</param>
/// <param name="TimeOut">The time we would like to wait for connection.</param>
/// <returns></returns>
public static bool EasyConnect(this Socket s, string IPAddress, int Port, int TimeOut)
{
s.ReceiveTimeout = s.SendTimeout = TimeOut * 1000;
var result = s.BeginConnect(IPAddress, Port, null, null);
result.AsyncWaitHandle.WaitOne(3000, true);
if (!s.Connected)
{
Console.WriteLine("Failed to connect to socket.");
s.Close();
return false;
}
// we have connected
s.EndConnect(result);
return true;
}
/// <summary>
/// Tests the availability of a tcp host.
/// </summary>
/// <param name="Host">Host Address.</param>
/// <param name="Port">Host Port.</param>
/// <returns></returns>
public static bool TestTcpConnection(string Host, int Port)
{
try
{
var client = new TcpClient();
var result = client.BeginConnect(Host, Port, null, null);
var success = result.AsyncWaitHandle.WaitOne(TimeSpan.FromSeconds(1));
if (!success)
{
return false;
}
client.EndConnect(result);
return true;
}
catch
{
}
return false;
}
/// <summary>
/// Attempts to ping a host.
/// </summary>
/// <param name="Host">Host Address</param>
/// <returns></returns>
public static bool PingHost(string Host)
{
try
{
var pingSender = new Ping();
var options = new PingOptions();
options.DontFragment = true;
var reply = pingSender.Send(Host, 120, Encoding.ASCII.GetBytes("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"), options);
return (reply.Status == IPStatus.Success);
}
catch
{
}
return false;
}
/// <summary>
///
/// </summary>
@@ -0,0 +1,164 @@
using System.Net.NetworkInformation;
using System.Net.Sockets;
using System.Text;
namespace OrbisLib2.Common.Helpers
{
public static class Sockets
{
/// <summary>
/// Recieve large amounts of data from a socket that is larger than the recieve buffer size.
/// </summary>
/// <param name="s">The current socket.</param>
/// <param name="data">The data to be recieved.</param>
public static void RecvLarge(this Socket s, byte[] data)
{
int Left = data.Length;
int Received = 0;
while (Left > 0)
{
var chunkSize = Math.Min(s.ReceiveBufferSize, Left);
var res = s.Receive(data, Received, chunkSize, 0);
Received += res;
Left -= res;
}
}
/// <summary>
/// Sends an object and its size to the socket.
/// </summary>
/// <param name="s"></param>
/// <param name="obj">The object we would like to send. (Must be serializable.)</param>
public static void SendObject(this Socket s, object obj)
{
var Data = Helper.ObjectToByteArray(obj);
s.Send(BitConverter.GetBytes(Data.Length), sizeof(int), SocketFlags.None);
s.Send(Data);
}
/// <summary>
/// Recieve an object from a socket.
/// </summary>
/// <param name="s"></param>
/// <returns>Returns the object we would like to receive.</returns>
public static object RecvObject(this Socket s)
{
var ObjectSize = s.RecvInt32();
var ObjectData = new byte[ObjectSize];
s.Receive(ObjectData);
return Helper.ByteArrayToObject(ObjectData);
}
/// <summary>
/// Sends an int32 over socket.
/// </summary>
/// <param name="s"></param>
/// <param name="Data"></param>
public static void SendInt32(this Socket s, int Data)
{
s.Send(BitConverter.GetBytes(Data));
}
/// <summary>
/// Receives an int32 over sockets.
/// </summary>
/// <param name="s"></param>
/// <returns></returns>
public static int RecvInt32(this Socket s)
{
var Data = new byte[sizeof(int)];
s.Receive(Data);
return BitConverter.ToInt32(Data, 0);
}
/// <summary>
/// Attempts to ping a host.
/// </summary>
/// <param name="Host">Host Address</param>
/// <returns></returns>
public static bool PingHost(string Host)
{
try
{
var pingSender = new Ping();
var options = new PingOptions();
options.DontFragment = true;
var reply = pingSender.Send(Host, 120, Encoding.ASCII.GetBytes("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"), options);
return (reply.Status == IPStatus.Success);
}
catch
{
}
return false;
}
/// <summary>
/// Tests the availability of a tcp host.
/// </summary>
/// <param name="Host">Host Address.</param>
/// <param name="Port">Host Port.</param>
/// <returns></returns>
public static bool TestTcpConnection(string Host, int Port)
{
try
{
var client = new TcpClient();
var result = client.BeginConnect(Host, Port, null, null);
var success = result.AsyncWaitHandle.WaitOne(TimeSpan.FromSeconds(1));
if (!success)
{
return false;
}
client.EndConnect(result);
return true;
}
catch
{
}
return false;
}
/// <summary>
/// Easily connect to a socket and handle the time out.
/// </summary>
/// <param name="s"></param>
/// <param name="IPAddress">The address we would like to connect to.</param>
/// <param name="Port">The port of the socket we would like to connect to.</param>
/// <param name="TimeOut">The time we would like to wait for connection.</param>
/// <returns></returns>
public static bool EasyConnect(this Socket s, string IPAddress, int Port, int TimeOut)
{
s.ReceiveTimeout = s.SendTimeout = TimeOut * 1000;
var result = s.BeginConnect(IPAddress, Port, null, null);
result.AsyncWaitHandle.WaitOne(3000, true);
if (!s.Connected)
{
Console.WriteLine("Failed to connect to socket.");
s.Close();
return false;
}
// we have connected
s.EndConnect(result);
return true;
}
}
}
@@ -1 +1 @@
2161
2163
@@ -1 +1 @@
Version 3.0.2161 Debug Build Saturday December 24 2022 11:40 AM
Version 3.0.2163 Debug Build Tuesday December 27 2022 5:28 PM
@@ -30,14 +30,14 @@ namespace OrbisSuiteService.Service
var oldAvailable = Target.Info.IsAvailable;
var OldAPIAvailable = Target.Info.IsAPIAvailable;
if(Helper.PingHost(Target.IPAddress))
if(Sockets.PingHost(Target.IPAddress))
{
var detail = Target.Info;
detail.IsAvailable = true;
}
Target.Info.IsAvailable = Helper.PingHost(Target.IPAddress);
Target.Info.IsAPIAvailable = Helper.TestTcpConnection(Target.IPAddress, Settings.CreateInstance().APIPort);
Target.Info.IsAvailable = Sockets.PingHost(Target.IPAddress);
Target.Info.IsAPIAvailable = Sockets.TestTcpConnection(Target.IPAddress, Settings.CreateInstance().APIPort);
Target.Info.Save();
if (Target.Info.IsAPIAvailable)