Add callback to NetworkServer to handle UI updates when client information changes
This commit is contained in:
parent
3ad0986ae7
commit
9ff4314840
3 changed files with 64 additions and 8 deletions
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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<NetworkClientInfo *> ServerClients;
|
||||
std::thread * ConnectionThread;
|
||||
|
||||
std::vector<NetServerCallback> ClientInfoChangeCallbacks;
|
||||
std::vector<void *> ClientInfoChangeCallbackArgs;
|
||||
|
||||
private:
|
||||
#ifdef WIN32
|
||||
WSADATA wsa;
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue