[Loader]: Establish a priority list for some modules (#706)
This commit is contained in:
parent
b295747d34
commit
d127bbe89d
@ -82,14 +82,16 @@ namespace Components
|
|||||||
Uninitializing = false;
|
Uninitializing = false;
|
||||||
Utils::Memory::GetAllocator()->clear();
|
Utils::Memory::GetAllocator()->clear();
|
||||||
|
|
||||||
|
// High priority
|
||||||
|
Register(new Singleton());
|
||||||
|
|
||||||
Register(new Auth());
|
Register(new Auth());
|
||||||
Register(new Command());
|
Register(new Command());
|
||||||
Register(new Dvar());
|
Register(new Dvar());
|
||||||
Register(new Exception()); // Install our exception handler as early as posssible to get better debug dumps from startup crashes
|
Register(new Exception()); // Install our exception handler as early as possible to get better debug dumps from startup crashes
|
||||||
Register(new Flags());
|
Register(new IPCPipe());
|
||||||
Register(new Network());
|
Register(new Network());
|
||||||
Register(new Logger());
|
Register(new Logger());
|
||||||
Register(new Singleton());
|
|
||||||
Register(new UIScript());
|
Register(new UIScript());
|
||||||
Register(new ZoneBuilder());
|
Register(new ZoneBuilder());
|
||||||
|
|
||||||
@ -118,7 +120,6 @@ namespace Components
|
|||||||
Register(new FileSystem());
|
Register(new FileSystem());
|
||||||
Register(new Friends());
|
Register(new Friends());
|
||||||
Register(new Gamepad());
|
Register(new Gamepad());
|
||||||
Register(new IPCPipe());
|
|
||||||
Register(new Lean());
|
Register(new Lean());
|
||||||
Register(new Localization());
|
Register(new Localization());
|
||||||
Register(new MapDump());
|
Register(new MapDump());
|
||||||
|
@ -200,7 +200,8 @@ namespace Components
|
|||||||
{
|
{
|
||||||
if (Used())
|
if (Used())
|
||||||
{
|
{
|
||||||
Command::Execute(std::format("connect {}", ConnectString), false);
|
const auto* cmd = Utils::String::Format("connect {}", ConnectString);
|
||||||
|
Command::Execute(cmd, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -211,7 +212,8 @@ namespace Components
|
|||||||
// IPC handler
|
// IPC handler
|
||||||
IPCPipe::On("connect", [](const std::string& data)
|
IPCPipe::On("connect", [](const std::string& data)
|
||||||
{
|
{
|
||||||
Command::Execute(std::format("connect {}", data), false);
|
const auto* cmd = Utils::String::Format("connect {}", data);
|
||||||
|
Command::Execute(cmd, false);
|
||||||
});
|
});
|
||||||
|
|
||||||
// Invocation handler
|
// Invocation handler
|
||||||
@ -227,7 +229,7 @@ namespace Components
|
|||||||
if (!Singleton::IsFirstInstance())
|
if (!Singleton::IsFirstInstance())
|
||||||
{
|
{
|
||||||
IPCPipe::Write("connect", ConnectString);
|
IPCPipe::Write("connect", ConnectString);
|
||||||
ExitProcess(0);
|
ExitProcess(EXIT_SUCCESS);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -237,7 +239,7 @@ namespace Components
|
|||||||
Scheduler::Once([]
|
Scheduler::Once([]
|
||||||
{
|
{
|
||||||
Command::Execute("openmenu popup_reconnectingtoparty", false);
|
Command::Execute("openmenu popup_reconnectingtoparty", false);
|
||||||
}, Scheduler::Pipeline::CLIENT, 8s);
|
}, Scheduler::Pipeline::MAIN, 8s);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -5,8 +5,6 @@ namespace Components
|
|||||||
class Flags : public Component
|
class Flags : public Component
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
Flags() = default;
|
|
||||||
|
|
||||||
static bool HasFlag(const std::string& flag);
|
static bool HasFlag(const std::string& flag);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -8,7 +8,7 @@ namespace Components
|
|||||||
|
|
||||||
#pragma region Pipe
|
#pragma region Pipe
|
||||||
|
|
||||||
Pipe::Pipe() : connectCallback(0), pipe(INVALID_HANDLE_VALUE), threadAttached(false), type(IPCTYPE_NONE), reconnectAttempt(0)
|
Pipe::Pipe() : connectCallback(nullptr), pipe(INVALID_HANDLE_VALUE), threadAttached(false), type(IPCTYPE_NONE), reconnectAttempt(0)
|
||||||
{
|
{
|
||||||
this->destroy();
|
this->destroy();
|
||||||
}
|
}
|
||||||
@ -67,7 +67,7 @@ namespace Components
|
|||||||
if (!Loader::IsPerformingUnitTests())
|
if (!Loader::IsPerformingUnitTests())
|
||||||
{
|
{
|
||||||
this->threadAttached = true;
|
this->threadAttached = true;
|
||||||
this->thread = std::thread(Pipe::ReceiveThread, this);
|
this->thread = std::thread(ReceiveThread, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
Logger::Print("Pipe successfully created\n");
|
Logger::Print("Pipe successfully created\n");
|
||||||
@ -93,7 +93,7 @@ namespace Components
|
|||||||
{
|
{
|
||||||
if (this->type != IPCTYPE_CLIENT || this->pipe == INVALID_HANDLE_VALUE) return false;
|
if (this->type != IPCTYPE_CLIENT || this->pipe == INVALID_HANDLE_VALUE) return false;
|
||||||
|
|
||||||
Pipe::Packet _packet;
|
Packet _packet;
|
||||||
strcpy_s(_packet.command, command.data());
|
strcpy_s(_packet.command, command.data());
|
||||||
strcpy_s(_packet.buffer, data.data());
|
strcpy_s(_packet.buffer, data.data());
|
||||||
|
|
||||||
@ -103,15 +103,9 @@ namespace Components
|
|||||||
|
|
||||||
void Pipe::destroy()
|
void Pipe::destroy()
|
||||||
{
|
{
|
||||||
//this->Type = IPCTYPE_NONE;
|
|
||||||
|
|
||||||
//*this->PipeFile = 0;
|
|
||||||
//*this->PipeName = 0;
|
|
||||||
|
|
||||||
if (this->pipe && INVALID_HANDLE_VALUE != this->pipe)
|
if (this->pipe && INVALID_HANDLE_VALUE != this->pipe)
|
||||||
{
|
{
|
||||||
CancelIoEx(this->pipe, nullptr);
|
CancelIoEx(this->pipe, nullptr);
|
||||||
//DeleteFileA(this->pipeFile);
|
|
||||||
|
|
||||||
if (this->type == IPCTYPE_SERVER) DisconnectNamedPipe(this->pipe);
|
if (this->type == IPCTYPE_SERVER) DisconnectNamedPipe(this->pipe);
|
||||||
|
|
||||||
@ -134,11 +128,11 @@ namespace Components
|
|||||||
|
|
||||||
void Pipe::setName(const std::string& name)
|
void Pipe::setName(const std::string& name)
|
||||||
{
|
{
|
||||||
memset(this->pipeName, 0, sizeof(this->pipeName));
|
ZeroMemory(this->pipeName, sizeof(this->pipeName));
|
||||||
memset(this->pipeFile, 0, sizeof(this->pipeFile));
|
ZeroMemory(this->pipeFile, sizeof(this->pipeFile));
|
||||||
|
|
||||||
strncpy_s(this->pipeName, name.data(), sizeof(this->pipeName));
|
strncpy_s(this->pipeName, name.data(), sizeof(this->pipeName));
|
||||||
sprintf_s(this->pipeFile, sizeof(this->pipeFile), "\\\\.\\Pipe\\%s", this->pipeName);
|
sprintf_s(this->pipeFile, "\\\\.\\Pipe\\%s", this->pipeName);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Pipe::ReceiveThread(Pipe* pipe)
|
void Pipe::ReceiveThread(Pipe* pipe)
|
||||||
@ -158,7 +152,7 @@ namespace Components
|
|||||||
|
|
||||||
while (pipe->threadAttached && pipe->pipe && pipe->pipe != INVALID_HANDLE_VALUE)
|
while (pipe->threadAttached && pipe->pipe && pipe->pipe != INVALID_HANDLE_VALUE)
|
||||||
{
|
{
|
||||||
BOOL bResult = ReadFile(pipe->pipe, &pipe->packet, sizeof(pipe->packet), &cbBytes, nullptr);
|
auto bResult = ReadFile(pipe->pipe, &pipe->packet, sizeof(pipe->packet), &cbBytes, nullptr);
|
||||||
|
|
||||||
if (bResult && cbBytes)
|
if (bResult && cbBytes)
|
||||||
{
|
{
|
||||||
@ -169,7 +163,7 @@ namespace Components
|
|||||||
}
|
}
|
||||||
else if (pipe->threadAttached && pipe->pipe != INVALID_HANDLE_VALUE)
|
else if (pipe->threadAttached && pipe->pipe != INVALID_HANDLE_VALUE)
|
||||||
{
|
{
|
||||||
Logger::Print("Failed to read from client through pipe\n");
|
Logger::PrintError(Game::CON_CHANNEL_ERROR, "Failed to read from client through pipe\n");
|
||||||
|
|
||||||
DisconnectNamedPipe(pipe->pipe);
|
DisconnectNamedPipe(pipe->pipe);
|
||||||
ConnectNamedPipe(pipe->pipe, nullptr);
|
ConnectNamedPipe(pipe->pipe, nullptr);
|
||||||
@ -187,20 +181,20 @@ namespace Components
|
|||||||
{
|
{
|
||||||
if (Singleton::IsFirstInstance())
|
if (Singleton::IsFirstInstance())
|
||||||
{
|
{
|
||||||
IPCPipe::ClientPipe.connect(IPC_PIPE_NAME_CLIENT);
|
ClientPipe.connect(IPC_PIPE_NAME_CLIENT);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Writes to the process on the other end of the pipe
|
// Writes to the process on the other end of the pipe
|
||||||
bool IPCPipe::Write(const std::string& command, const std::string& data)
|
bool IPCPipe::Write(const std::string& command, const std::string& data)
|
||||||
{
|
{
|
||||||
return IPCPipe::ClientPipe.write(command, data);
|
return ClientPipe.write(command, data);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Installs a callback for receiving commands from the process on the other end of the pipe
|
// Installs a callback for receiving commands from the process on the other end of the pipe
|
||||||
void IPCPipe::On(const std::string& command, Utils::Slot<Pipe::PacketCallback> callback)
|
void IPCPipe::On(const std::string& command, const Utils::Slot<Pipe::PacketCallback>& callback)
|
||||||
{
|
{
|
||||||
IPCPipe::ServerPipe.setCallback(command, callback);
|
ServerPipe.setCallback(command, callback);
|
||||||
}
|
}
|
||||||
|
|
||||||
IPCPipe::IPCPipe()
|
IPCPipe::IPCPipe()
|
||||||
@ -208,37 +202,37 @@ namespace Components
|
|||||||
if (Dedicated::IsEnabled() || Loader::IsPerformingUnitTests() || ZoneBuilder::IsEnabled()) return;
|
if (Dedicated::IsEnabled() || Loader::IsPerformingUnitTests() || ZoneBuilder::IsEnabled()) return;
|
||||||
|
|
||||||
// Server pipe
|
// Server pipe
|
||||||
IPCPipe::ServerPipe.onConnect(IPCPipe::ConnectClient);
|
ServerPipe.onConnect(ConnectClient);
|
||||||
IPCPipe::ServerPipe.create((Singleton::IsFirstInstance() ? IPC_PIPE_NAME_SERVER : IPC_PIPE_NAME_CLIENT));
|
ServerPipe.create((Singleton::IsFirstInstance() ? IPC_PIPE_NAME_SERVER : IPC_PIPE_NAME_CLIENT));
|
||||||
|
|
||||||
// Connect second instance's client pipe to first instance's server pipe
|
// Connect second instance's client pipe to first instance's server pipe
|
||||||
if (!Singleton::IsFirstInstance())
|
if (!Singleton::IsFirstInstance())
|
||||||
{
|
{
|
||||||
IPCPipe::ClientPipe.connect(IPC_PIPE_NAME_SERVER);
|
ClientPipe.connect(IPC_PIPE_NAME_SERVER);
|
||||||
}
|
}
|
||||||
|
|
||||||
IPCPipe::On("ping", [](const std::string& data)
|
On("ping", [](const std::string& data)
|
||||||
{
|
{
|
||||||
Logger::Print("Received ping form pipe, sending pong!\n");
|
Logger::Print("Received ping form pipe, sending pong!\n");
|
||||||
IPCPipe::Write("pong", data);
|
Write("pong", data);
|
||||||
});
|
});
|
||||||
|
|
||||||
IPCPipe::On("pong", [](const std::string& /*data*/)
|
On("pong", []([[maybe_unused]] const std::string& data)
|
||||||
{
|
{
|
||||||
Logger::Print("Received pong form pipe!\n");
|
Logger::Print("Received pong form pipe!\n");
|
||||||
});
|
});
|
||||||
|
|
||||||
// Test pipe functionality by sending pings
|
// Test pipe functionality by sending pings
|
||||||
Command::Add("ipcping", [](Command::Params*)
|
Command::Add("ipcping", []([[maybe_unused]] Command::Params* params)
|
||||||
{
|
{
|
||||||
Logger::Print("Sending ping to pipe!\n");
|
Logger::Print("Sending ping to pipe!\n");
|
||||||
IPCPipe::Write("ping", "");
|
Write("ping", "");
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
void IPCPipe::preDestroy()
|
void IPCPipe::preDestroy()
|
||||||
{
|
{
|
||||||
IPCPipe::ServerPipe.destroy();
|
ServerPipe.destroy();
|
||||||
IPCPipe::ClientPipe.destroy();
|
ClientPipe.destroy();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -51,8 +51,8 @@ namespace Components
|
|||||||
Type type;
|
Type type;
|
||||||
Packet packet;
|
Packet packet;
|
||||||
|
|
||||||
char pipeName[MAX_PATH];
|
char pipeName[MAX_PATH]{};
|
||||||
char pipeFile[MAX_PATH];
|
char pipeFile[MAX_PATH]{};
|
||||||
unsigned int reconnectAttempt;
|
unsigned int reconnectAttempt;
|
||||||
|
|
||||||
void setName(const std::string& name);
|
void setName(const std::string& name);
|
||||||
@ -68,7 +68,7 @@ namespace Components
|
|||||||
void preDestroy() override;
|
void preDestroy() override;
|
||||||
|
|
||||||
static bool Write(const std::string& command, const std::string& data);
|
static bool Write(const std::string& command, const std::string& data);
|
||||||
static void On(const std::string& command, Utils::Slot<Pipe::PacketCallback> callback);
|
static void On(const std::string& command, const Utils::Slot<Pipe::PacketCallback>& callback);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static Pipe ServerPipe;
|
static Pipe ServerPipe;
|
||||||
|
@ -19,7 +19,7 @@ namespace Components
|
|||||||
{
|
{
|
||||||
printf("%s", "IW4x " VERSION " (built " __DATE__ " " __TIME__ ")\n");
|
printf("%s", "IW4x " VERSION " (built " __DATE__ " " __TIME__ ")\n");
|
||||||
printf("%d\n", REVISION);
|
printf("%d\n", REVISION);
|
||||||
std::exit(0);
|
ExitProcess(EXIT_SUCCESS);
|
||||||
}
|
}
|
||||||
|
|
||||||
Console::FreeNativeConsole();
|
Console::FreeNativeConsole();
|
||||||
@ -30,7 +30,7 @@ namespace Components
|
|||||||
|
|
||||||
if (!FirstInstance && !ConnectProtocol::Used() && MessageBoxA(nullptr, "Do you want to start another instance?\nNot all features will be available!", "Game already running", MB_ICONEXCLAMATION | MB_YESNO) == IDNO)
|
if (!FirstInstance && !ConnectProtocol::Used() && MessageBoxA(nullptr, "Do you want to start another instance?\nNot all features will be available!", "Game already running", MB_ICONEXCLAMATION | MB_YESNO) == IDNO)
|
||||||
{
|
{
|
||||||
std::exit(0);
|
ExitProcess(EXIT_SUCCESS);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user