[Loader]: Establish a priority list for some modules (#706)

This commit is contained in:
Edo 2023-01-06 22:06:10 +00:00 committed by GitHub
parent b295747d34
commit d127bbe89d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 38 additions and 43 deletions

View File

@ -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());

View File

@ -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);
} }
} }
} }

View File

@ -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:

View File

@ -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();
} }
} }

View File

@ -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;

View File

@ -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);
} }
} }
} }