From ce82089c6175b5b8a3ed3fddcb860d5b1edec8d0 Mon Sep 17 00:00:00 2001 From: Rob-NY Date: Mon, 17 Oct 2022 10:37:42 -0400 Subject: [PATCH] JSON-RPC: Extend jamulusserver/getClients RPC method --- docs/JSON-RPC.md | 5 +++++ src/server.cpp | 11 +++++++---- src/server.h | 9 +++++---- src/serverdlg.cpp | 11 ++++++----- src/serverrpc.cpp | 30 +++++++++++++++++++++++------- 5 files changed, 46 insertions(+), 20 deletions(-) diff --git a/docs/JSON-RPC.md b/docs/JSON-RPC.md index 0fdc314507..3f82ced8b2 100644 --- a/docs/JSON-RPC.md +++ b/docs/JSON-RPC.md @@ -234,12 +234,17 @@ Results: | Name | Type | Description | | --- | --- | --- | +| result.connections | number | The number of active connections. | | result.clients | array | The list of connected clients. | | result.clients[*].id | number | The client’s channel id. | | result.clients[*].address | string | The client’s address (ip:port). | | result.clients[*].name | string | The client’s name. | | result.clients[*].jitterBufferSize | number | The client’s jitter buffer size. | | result.clients[*].channels | number | The number of audio channels of the client. | +| result.clients[*].instrumentCode | number | The id of the instrument for this channel. | +| result.clients[*].city | string | The city name provided by the user for this channel. | +| result.clients[*].countryName | number | The text name of the country specified by the user for this channel (see QLocale::Country). | +| result.clients[*].skillLevelCode | number | The skill level id provided by the user for this channel. | ### jamulusserver/getRecorderStatus diff --git a/src/server.cpp b/src/server.cpp index 10d1012591..3a3e9817dc 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -1469,16 +1469,18 @@ bool CServer::PutAudioData ( const CVector& vecbyRecBuf, const int iNum return bNewConnection; } -void CServer::GetConCliParam ( CVector& vecHostAddresses, - CVector& vecsName, - CVector& veciJitBufNumFrames, - CVector& veciNetwFrameSizeFact ) +void CServer::GetConCliParam ( CVector& vecHostAddresses, + CVector& vecsName, + CVector& veciJitBufNumFrames, + CVector& veciNetwFrameSizeFact, + CVector& vecChanInfo ) { // init return values vecHostAddresses.Init ( iMaxNumChannels ); vecsName.Init ( iMaxNumChannels ); veciJitBufNumFrames.Init ( iMaxNumChannels ); veciNetwFrameSizeFact.Init ( iMaxNumChannels ); + vecChanInfo.Init ( iMaxNumChannels ); // check all possible channels for ( int i = 0; i < iMaxNumChannels; i++ ) @@ -1490,6 +1492,7 @@ void CServer::GetConCliParam ( CVector& vecHostAddresses, vecsName[i] = vecChannels[i].GetName(); veciJitBufNumFrames[i] = vecChannels[i].GetSockBufNumFrames(); veciNetwFrameSizeFact[i] = vecChannels[i].GetNetwFrameSizeFact(); + vecChanInfo[i] = vecChannels[i].GetChanInfo(); } } } diff --git a/src/server.h b/src/server.h index df5ffb2d09..830adac955 100644 --- a/src/server.h +++ b/src/server.h @@ -116,10 +116,11 @@ class CServer : public QObject, public CServerSlots int GetNumberOfConnectedClients(); - void GetConCliParam ( CVector& vecHostAddresses, - CVector& vecsName, - CVector& veciJitBufNumFrames, - CVector& veciNetwFrameSizeFact ); + void GetConCliParam ( CVector& vecHostAddresses, + CVector& vecsName, + CVector& veciJitBufNumFrames, + CVector& veciNetwFrameSizeFact, + CVector& vecChanInfo ); void CreateCLServerListReqVerAndOSMes ( const CHostAddress& InetAddr ) { ConnLessProtocol.CreateCLReqVersionAndOSMes ( InetAddr ); } diff --git a/src/serverdlg.cpp b/src/serverdlg.cpp index 7615e6e2f0..e9e06c0620 100644 --- a/src/serverdlg.cpp +++ b/src/serverdlg.cpp @@ -679,14 +679,15 @@ void CServerDlg::OnCLVersionAndOSReceived ( CHostAddress, COSUtil::EOpSystemType void CServerDlg::OnTimer() { - CVector vecHostAddresses; - CVector vecsName; - CVector veciJitBufNumFrames; - CVector veciNetwFrameSizeFact; + CVector vecHostAddresses; + CVector vecsName; + CVector veciJitBufNumFrames; + CVector veciNetwFrameSizeFact; + CVector vecChanInfo; ListViewMutex.lock(); { - pServer->GetConCliParam ( vecHostAddresses, vecsName, veciJitBufNumFrames, veciNetwFrameSizeFact ); + pServer->GetConCliParam ( vecHostAddresses, vecsName, veciJitBufNumFrames, veciNetwFrameSizeFact, vecChanInfo ); // we assume that all vectors have the same length const int iNumChannels = vecHostAddresses.Size(); diff --git a/src/serverrpc.cpp b/src/serverrpc.cpp index 4e56ab9dd1..a71528c08d 100644 --- a/src/serverrpc.cpp +++ b/src/serverrpc.cpp @@ -56,20 +56,28 @@ CServerRpc::CServerRpc ( CServer* pServer, CRpcServer* pRpcServer, QObject* pare /// @rpc_method jamulusserver/getClients /// @brief Returns the list of connected clients along with details about them. /// @param {object} params - No parameters (empty object). - /// @result {array} result.clients - The list of connected clients. + /// @result {number} result.connections - The number of active connections. + /// @result {array} result.clients - The list of connected clients. /// @result {number} result.clients[*].id - The client’s channel id. /// @result {string} result.clients[*].address - The client’s address (ip:port). /// @result {string} result.clients[*].name - The client’s name. /// @result {number} result.clients[*].jitterBufferSize - The client’s jitter buffer size. /// @result {number} result.clients[*].channels - The number of audio channels of the client. + /// @result {number} result.clients[*].instrumentCode - The id of the instrument for this channel. + /// @result {string} result.clients[*].city - The city name provided by the user for this channel. + /// @result {number} result.clients[*].countryName - The text name of the country specified by the user for this channel (see QLocale::Country). + /// @result {number} result.clients[*].skillLevelCode - The skill level id provided by the user for this channel. pRpcServer->HandleMethod ( "jamulusserver/getClients", [=] ( const QJsonObject& params, QJsonObject& response ) { - QJsonArray clients; - CVector vecHostAddresses; - CVector vecsName; - CVector veciJitBufNumFrames; - CVector veciNetwFrameSizeFact; + QJsonArray clients; + CVector vecHostAddresses; + CVector vecsName; + CVector veciJitBufNumFrames; + CVector veciNetwFrameSizeFact; + CVector vecChanInfo; - pServer->GetConCliParam ( vecHostAddresses, vecsName, veciJitBufNumFrames, veciNetwFrameSizeFact ); + int connections = 0; + + pServer->GetConCliParam ( vecHostAddresses, vecsName, veciJitBufNumFrames, veciNetwFrameSizeFact, vecChanInfo ); // we assume that all vectors have the same length const int iNumChannels = vecHostAddresses.Size(); @@ -81,18 +89,26 @@ CServerRpc::CServerRpc ( CServer* pServer, CRpcServer* pRpcServer, QObject* pare { continue; } + QJsonObject client{ { "id", i }, { "address", vecHostAddresses[i].toString ( CHostAddress::SM_IP_PORT ) }, { "name", vecsName[i] }, { "jitterBufferSize", veciJitBufNumFrames[i] }, { "channels", pServer->GetClientNumAudioChannels ( i ) }, + { "instrumentCode", vecChanInfo[i].iInstrument }, + { "city", vecChanInfo[i].strCity }, + { "countryName", QLocale::countryToString ( vecChanInfo[i].eCountry ) }, + { "skillLevelCode", vecChanInfo[i].eSkillLevel }, }; clients.append ( client ); + + ++connections; } // create result object QJsonObject result{ + { "connections", connections }, { "clients", clients }, }; response["result"] = result;