2026-05-14 11:53:36 +03:00
|
|
|
#include "NetThreadManager.hpp"
|
|
|
|
|
#include <Helpers/Networking/NetLibrary.hpp>
|
|
|
|
|
#include "AndroidJNICalls.hpp"
|
|
|
|
|
#include "MainProgram.hpp"
|
|
|
|
|
|
|
|
|
|
NetThreadManager NetThreadManager::global;
|
|
|
|
|
|
|
|
|
|
NetThreadManager& NetThreadManager::get() {
|
|
|
|
|
return global;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void NetThreadManager::init(MainProgram* m) {
|
|
|
|
|
if(started)
|
|
|
|
|
return;
|
|
|
|
|
started = true;
|
|
|
|
|
main = m;
|
2026-05-14 14:39:34 +03:00
|
|
|
#ifdef __ANDROID__
|
2026-05-14 11:53:36 +03:00
|
|
|
AndroidJNICalls::startNetworkService();
|
2026-05-14 14:39:34 +03:00
|
|
|
#else
|
|
|
|
|
NetLibrary::init_websocket();
|
|
|
|
|
#endif
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void NetThreadManager::synchronous_update() {
|
|
|
|
|
#ifndef __ANDROID__
|
|
|
|
|
NetLibrary::update();
|
2026-05-14 11:53:36 +03:00
|
|
|
#endif
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void NetThreadManager::init_thread() {
|
|
|
|
|
if(t)
|
|
|
|
|
throw std::runtime_error("[NetThreadManager::init_thread] Thread can't exist when init_thread is called");
|
|
|
|
|
destroyThread = false;
|
|
|
|
|
t = std::make_unique<std::thread>([&]{ thread_update(); });
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void NetThreadManager::thread_update() {
|
|
|
|
|
NetLibrary::init_websocket();
|
|
|
|
|
for(;;) {
|
|
|
|
|
using namespace std::chrono_literals;
|
|
|
|
|
std::this_thread::sleep_for(20ms);
|
|
|
|
|
if(destroyThread) {
|
|
|
|
|
NetLibrary::destroy_websocket();
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
{
|
|
|
|
|
std::scoped_lock l{backgroundUpdateMutex};
|
|
|
|
|
if(backgroundUpdate)
|
|
|
|
|
main->background_update();
|
|
|
|
|
}
|
|
|
|
|
NetLibrary::update();
|
|
|
|
|
}
|
|
|
|
|
#ifdef __ANDROID__
|
|
|
|
|
AndroidJNICalls::stopNetworkService();
|
|
|
|
|
#endif
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void NetThreadManager::destroy_thread() {
|
|
|
|
|
if(!t)
|
|
|
|
|
throw std::runtime_error("[NetThreadManager::init_thread] Thread can't be null when destroy_thread is called");
|
|
|
|
|
destroyThread = true;
|
|
|
|
|
t->join();
|
|
|
|
|
t = nullptr;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void NetThreadManager::go_to_background() {
|
|
|
|
|
std::scoped_lock l{backgroundUpdateMutex};
|
|
|
|
|
backgroundUpdate = true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void NetThreadManager::go_to_foreground() {
|
|
|
|
|
std::scoped_lock l{backgroundUpdateMutex};
|
|
|
|
|
backgroundUpdate = false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void NetThreadManager::destroy() {
|
|
|
|
|
if(!started)
|
|
|
|
|
return;
|
|
|
|
|
started = false;
|
2026-05-14 14:39:34 +03:00
|
|
|
#ifdef __ANDROID__
|
2026-05-14 11:53:36 +03:00
|
|
|
AndroidJNICalls::stopNetworkService();
|
2026-05-14 14:39:34 +03:00
|
|
|
#else
|
|
|
|
|
NetLibrary::destroy_websocket();
|
2026-05-14 11:53:36 +03:00
|
|
|
#endif
|
|
|
|
|
}
|