diff --git a/NetworkServer.cpp b/NetworkServer.cpp index 44bae69b..40d0eec6 100644 --- a/NetworkServer.cpp +++ b/NetworkServer.cpp @@ -72,6 +72,12 @@ const char * NetworkServer::GetClientIP(unsigned int client_num) } } +void NetworkServer::RegisterClientInfoChangeCallback(NetServerCallback new_callback, void * new_callback_arg) +{ + ClientInfoChangeCallbacks.push_back(new_callback); + ClientInfoChangeCallbackArgs.push_back(new_callback_arg); +} + void NetworkServer::SetPort(unsigned short new_port) { if(server_online == false) @@ -160,6 +166,14 @@ void NetworkServer::StopServer() } ServerClients.clear(); + + /*-------------------------------------------------*\ + | Client info has changed, call the callbacks | + \*-------------------------------------------------*/ + for(unsigned int callback_idx = 0; callback_idx < ClientInfoChangeCallbacks.size(); callback_idx++) + { + ClientInfoChangeCallbacks[callback_idx](ClientInfoChangeCallbackArgs[callback_idx]); + } } void NetworkServer::ConnectionThreadFunction() @@ -218,6 +232,14 @@ void NetworkServer::ConnectionThreadFunction() client_info->client_listen_thread = new std::thread(&NetworkServer::ListenThreadFunction, this, client_info); ServerClients.push_back(client_info); + + /*-------------------------------------------------*\ + | Client info has changed, call the callbacks | + \*-------------------------------------------------*/ + for(unsigned int callback_idx = 0; callback_idx < ClientInfoChangeCallbacks.size(); callback_idx++) + { + ClientInfoChangeCallbacks[callback_idx](ClientInfoChangeCallbackArgs[callback_idx]); + } } printf("Connection thread closed\r\n"); @@ -301,7 +323,7 @@ void NetworkServer::ListenThreadFunction(NetworkClientInfo * client_info) if(bytes_read == 0) { - break; + goto listen_done; } //Test first character of magic - 'O' @@ -315,7 +337,7 @@ void NetworkServer::ListenThreadFunction(NetworkClientInfo * client_info) if(bytes_read == 0) { - break; + goto listen_done; } //Test second character of magic - 'R' @@ -329,7 +351,7 @@ void NetworkServer::ListenThreadFunction(NetworkClientInfo * client_info) if(bytes_read == 0) { - break; + goto listen_done; } //Test third character of magic - 'G' @@ -343,7 +365,7 @@ void NetworkServer::ListenThreadFunction(NetworkClientInfo * client_info) if(bytes_read == 0) { - break; + goto listen_done; } //Test fourth character of magic - 'B' @@ -364,8 +386,7 @@ void NetworkServer::ListenThreadFunction(NetworkClientInfo * client_info) if(tmp_bytes_read == 0) { - printf("Server connection closed\r\n"); - break; + goto listen_done; } } while(bytes_read != sizeof(header) - sizeof(header.pkt_magic)); @@ -387,8 +408,7 @@ void NetworkServer::ListenThreadFunction(NetworkClientInfo * client_info) if(tmp_bytes_read == 0) { - printf("Server connection closed\r\n"); - return; + goto listen_done; } bytes_read += tmp_bytes_read; @@ -487,7 +507,27 @@ void NetworkServer::ListenThreadFunction(NetworkClientInfo * client_info) delete[] data; } +listen_done: printf("Server connection closed\r\n"); + shutdown(client_info->client_sock, SD_RECEIVE); + closesocket(client_info->client_sock); + + for(unsigned int this_idx = 0; this_idx < ServerClients.size(); this_idx++) + { + if(ServerClients[this_idx] == client_info) + { + ServerClients.erase(ServerClients.begin() + this_idx); + break; + } + } + + /*-------------------------------------------------*\ + | Client info has changed, call the callbacks | + \*-------------------------------------------------*/ + for(unsigned int callback_idx = 0; callback_idx < ClientInfoChangeCallbacks.size(); callback_idx++) + { + ClientInfoChangeCallbacks[callback_idx](ClientInfoChangeCallbackArgs[callback_idx]); + } } void NetworkServer::SendReply_ControllerCount(SOCKET client_sock) diff --git a/NetworkServer.h b/NetworkServer.h index f930d339..b56f4cc5 100644 --- a/NetworkServer.h +++ b/NetworkServer.h @@ -6,6 +6,8 @@ #pragma once +typedef void (*NetServerCallback)(void *); + struct NetworkClientInfo { SOCKET client_sock; @@ -25,6 +27,8 @@ public: const char * GetClientString(unsigned int client_num); const char * GetClientIP(unsigned int client_num); + void RegisterClientInfoChangeCallback(NetServerCallback, void * new_callback_arg); + void SetPort(unsigned short new_port); void StartServer(); @@ -45,6 +49,9 @@ protected: std::vector ServerClients; std::thread * ConnectionThread; + std::vector ClientInfoChangeCallbacks; + std::vector ClientInfoChangeCallbackArgs; + private: #ifdef WIN32 WSADATA wsa; diff --git a/qt/OpenRGBServerInfoPage.cpp b/qt/OpenRGBServerInfoPage.cpp index daf9b642..331512ca 100644 --- a/qt/OpenRGBServerInfoPage.cpp +++ b/qt/OpenRGBServerInfoPage.cpp @@ -2,6 +2,13 @@ using namespace Ui; +static void UpdateInfoCallback(void * this_ptr) +{ + OpenRGBServerInfoPage * this_obj = (OpenRGBServerInfoPage *)this_ptr; + + this_obj->UpdateInfo(); +} + OpenRGBServerInfoPage::OpenRGBServerInfoPage(NetworkServer * server, QWidget *parent) : QFrame(parent), ui(new Ui::OpenRGBServerInfoPageUi) @@ -11,6 +18,8 @@ OpenRGBServerInfoPage::OpenRGBServerInfoPage(NetworkServer * server, QWidget *pa ui->setupUi(this); UpdateInfo(); + + network_server->RegisterClientInfoChangeCallback(UpdateInfoCallback, this); } OpenRGBServerInfoPage::~OpenRGBServerInfoPage()