support for setting predefined server in the server list by the command line arguments, bug fix with connection dialog if no country is given but a city, started work for unregistering server

This commit is contained in:
Volker Fischer 2011-05-03 20:37:06 +00:00
parent d3b9f90f45
commit e71166d96c
9 changed files with 170 additions and 38 deletions

View File

@ -245,7 +245,8 @@ void CConnectDlg::SetServerList ( const CHostAddress& InetAddr,
// server location (city and country)
QString strLocation = vecServerInfo[iIdx].strCity;
if ( !strLocation.isEmpty() )
if ( ( !strLocation.isEmpty() ) &&
( vecServerInfo[iIdx].eCountry != QLocale::AnyCountry ) )
{
strLocation += ", ";
}

View File

@ -54,7 +54,7 @@
<item>
<widget class="QCheckBox" name="cbRegisterServer" >
<property name="text" >
<string>Register Server</string>
<string>Register My Server at Central Server</string>
</property>
</widget>
</item>
@ -82,7 +82,7 @@
<item>
<widget class="QGroupBox" name="GroupBoxServerInfo" >
<property name="title" >
<string>Server Info</string>
<string>My Server Info</string>
</property>
<layout class="QHBoxLayout" >
<item>

View File

@ -437,9 +437,12 @@ QString UsageArguments ( char **argv )
" -y, --history enable connection history and set file\n"
" name (server only)\n"
" -e, --centralserver address of the central server (server only)\n"
" -o, --serverinfo infos of the server in the format:"
" [name];[city];[country as QLocale ID] (server "
" only)\n"
" -o, --serverinfo infos of the server(s) in the format:\n"
" [name];[city];[country as QLocale ID]; ...\n"
" [server1 address];[server1 name]; ...\n"
" [server1 city]; ...\n"
" [server1 country as QLocale ID]; ...\n"
" [server2 address]; ... (server only)\n"
" -c, --connect connect to last server on startup (client\n"
" only)\n"
" -d, --disableleds disable LEDs in main window (client only)\n"

View File

@ -199,6 +199,12 @@ CONNECTION LESS MESSAGES
the QLocale class
- PROTMESSID_CLM_UNREGISTER_SERVER: Unregister a server
note: does not have any data -> n = 0
- PROTMESSID_CLM_SERVER_LIST: Server list message
for each registered server append following data:
@ -597,6 +603,10 @@ bool CProtocol::ParseConnectionLessMessage ( const CVector<uint8_t>& vecbyData,
case PROTMESSID_CLM_REGISTER_SERVER:
bRet = EvaluateCLRegisterServerMes ( InetAddr, vecData );
break;
case PROTMESSID_CLM_UNREGISTER_SERVER:
bRet = EvaluateCLUnregisterServerMes ( InetAddr );
break;
}
}
else
@ -1314,6 +1324,20 @@ bool CProtocol::EvaluateCLRegisterServerMes ( const CHostAddress& InetAddr,
return false; // no error
}
void CProtocol::CreateCLUnregisterServerMes ( const CHostAddress& InetAddr )
{
CreateAndImmSendConLessMessage ( PROTMESSID_CLM_UNREGISTER_SERVER,
CVector<uint8_t> ( 0 ),
InetAddr );
}
bool CProtocol::EvaluateCLUnregisterServerMes ( const CHostAddress& InetAddr )
{
// invoke message action
emit CLUnregisterServerReceived ( InetAddr );
return false; // no error
}
void CProtocol::CreateCLServerListMes ( const CHostAddress& InetAddr,
const CVector<CServerInfo> vecServerInfo )

View File

@ -59,7 +59,7 @@
#define PROTMESSID_CLM_PING_MS_WITHNUMCLIENTS 1002 // for ping time and num. of clients info
#define PROTMESSID_CLM_SERVER_FULL 1003 // server full message
#define PROTMESSID_CLM_REGISTER_SERVER 1004 // register server
#define PROTMESSID_CLM_UNREGISTER_SERVER 1005 // unregister server -> TODO
#define PROTMESSID_CLM_UNREGISTER_SERVER 1005 // unregister server
#define PROTMESSID_CLM_SERVER_LIST 1006 // server list
#define PROTMESSID_CLM_REQ_SERVER_LIST 1007 // request server list
#define PROTMESSID_CLM_SEND_EMPTY_MESSAGE 1008 // an empty message shall be send
@ -103,6 +103,7 @@ public:
void CreateCLServerFullMes ( const CHostAddress& InetAddr );
void CreateCLRegisterServerMes ( const CHostAddress& InetAddr,
const CServerCoreInfo& ServerInfo );
void CreateCLUnregisterServerMes ( const CHostAddress& InetAddr );
void CreateCLServerListMes ( const CHostAddress& InetAddr,
const CVector<CServerInfo> vecServerInfo );
void CreateCLReqServerListMes ( const CHostAddress& InetAddr );
@ -206,17 +207,18 @@ protected:
bool EvaluateReqNetwTranspPropsMes();
bool EvaluateDisconnectionMes();
bool EvaluateCLPingMes ( const CHostAddress& InetAddr,
const CVector<uint8_t>& vecData );
bool EvaluateCLPingMes ( const CHostAddress& InetAddr,
const CVector<uint8_t>& vecData );
bool EvaluateCLPingWithNumClientsMes ( const CHostAddress& InetAddr,
const CVector<uint8_t>& vecData );
bool EvaluateCLServerFullMes();
bool EvaluateCLRegisterServerMes ( const CHostAddress& InetAddr,
const CVector<uint8_t>& vecData );
bool EvaluateCLServerListMes ( const CHostAddress& InetAddr,
const CVector<uint8_t>& vecData );
bool EvaluateCLReqServerListMes ( const CHostAddress& InetAddr );
bool EvaluateCLSendEmptyMesMes ( const CVector<uint8_t>& vecData );
bool EvaluateCLRegisterServerMes ( const CHostAddress& InetAddr,
const CVector<uint8_t>& vecData );
bool EvaluateCLUnregisterServerMes ( const CHostAddress& InetAddr );
bool EvaluateCLServerListMes ( const CHostAddress& InetAddr,
const CVector<uint8_t>& vecData );
bool EvaluateCLReqServerListMes ( const CHostAddress& InetAddr );
bool EvaluateCLSendEmptyMesMes ( const CVector<uint8_t>& vecData );
int iOldRecID;
int iOldRecCnt;
@ -259,6 +261,7 @@ signals:
int iNumClients );
void CLRegisterServerReceived ( CHostAddress InetAddr,
CServerCoreInfo ServerInfo );
void CLUnregisterServerReceived ( CHostAddress InetAddr );
void CLServerListReceived ( CHostAddress InetAddr,
CVector<CServerInfo> vecServerInfo );
void CLReqServerList ( CHostAddress InetAddr );

View File

@ -289,6 +289,10 @@ CServer::CServer ( const QString& strLoggingFileName,
SIGNAL ( CLRegisterServerReceived ( CHostAddress, CServerCoreInfo ) ),
this, SLOT ( OnCLRegisterServerReceived ( CHostAddress, CServerCoreInfo ) ) );
QObject::connect ( &ConnLessProtocol,
SIGNAL ( CLUnregisterServerReceived ( CHostAddress ) ),
this, SLOT ( OnCLUnregisterServerReceived ( CHostAddress ) ) );
QObject::connect ( &ConnLessProtocol,
SIGNAL ( CLReqServerList ( CHostAddress ) ),
this, SLOT ( OnCLReqServerList ( CHostAddress ) ) );

View File

@ -254,6 +254,11 @@ public slots:
ServerListManager.RegisterServer ( InetAddr, ServerInfo );
}
void OnCLUnregisterServerReceived ( CHostAddress InetAddr )
{
ServerListManager.UnregisterServer ( InetAddr );
}
// CODE TAG: MAX_NUM_CHANNELS_TAG
// make sure we have MAX_NUM_CHANNELS connections!!!

View File

@ -29,12 +29,26 @@
CServerListManager::CServerListManager ( const QString& sNCentServAddr,
const QString& strServerInfo,
CProtocol* pNConLProt )
: bUseDefaultCentralServerAddress ( false ),
: iNumPredefinedServers ( 0 ),
bUseDefaultCentralServerAddress ( false ),
pConnLessProtocol ( pNConLProt )
{
// set the central server address
SetCentralServerAddress ( sNCentServAddr );
// prepare the server info information
QStringList slServInfoSeparateParams;
int iServInfoNumSplitItems = 0;
if ( !strServerInfo.isEmpty() )
{
// split the different parameter strings
slServInfoSeparateParams = strServerInfo.split ( ";" );
// get the number of items in the split list
iServInfoNumSplitItems = slServInfoSeparateParams.count();
}
// per definition, the very first entry is this server and this entry will
// never be deleted
ServerList.clear();
@ -49,37 +63,87 @@ CServerListManager::CServerListManager ( const QString& sNCentServAddr,
QLocale::system().country(),
"",
USED_NUM_CHANNELS,
false );
true );
// parse the server info string according to definition:
// [name];[city];[country as QLocale ID]
if ( !strServerInfo.isEmpty() )
// [this server name];[this server city]; ...
// [this server country as QLocale ID]; ...
// per definition, we expect at least three parameters
if ( iServInfoNumSplitItems >= 3 )
{
// split the different parameter strings
QStringList slSeparateParameters = strServerInfo.split ( ";" );
// [this server name]
ThisServerListEntry.strName = slServInfoSeparateParams[0];
// per definition, we expect three parameters
if ( slSeparateParameters.count() == 3 )
// [this server city]
ThisServerListEntry.strCity = slServInfoSeparateParams[1];
// [this server country as QLocale ID]
const int iCountry = slServInfoSeparateParams[2].toInt();
if ( ( iCountry >= 0 ) && ( iCountry <= QLocale::LastCountry ) )
{
// [name]
ThisServerListEntry.strName = slSeparateParameters[0];
// [city]
ThisServerListEntry.strCity = slSeparateParameters[1];
// [country as QLocale ID]
const int iCountry = slSeparateParameters[2].toInt();
if ( ( iCountry >= 0 ) && ( iCountry <= QLocale::LastCountry ) )
{
ThisServerListEntry.eCountry = static_cast<QLocale::Country> (
iCountry );
}
ThisServerListEntry.eCountry = static_cast<QLocale::Country> (
iCountry );
}
}
// per definition, the first entry in the server list it the own server
ServerList.append ( ThisServerListEntry );
// parse the predefined server infos (if any) according to definition:
// [server1 address];[server1 name];[server1 city]; ...
// [server1 country as QLocale ID]; ...
// [server2 address];[server2 name];[server2 city]; ...
// [server2 country as QLocale ID]; ...
// ...
int iCurUsedServInfoSplitItems = 3; // three items are used for this server
// we always expect four items per new server, also check for maximum
// allowed number of servers in the server list
while ( ( iServInfoNumSplitItems - iCurUsedServInfoSplitItems >= 4 ) &&
( iNumPredefinedServers <= MAX_NUM_SERVERS_IN_SERVER_LIST ) )
{
// create a new server list entry
CServerListEntry NewServerListEntry (
CHostAddress(),
"",
"",
QLocale::AnyCountry,
"",
USED_NUM_CHANNELS,
true );
// [server n address]
LlconNetwUtil().ParseNetworkAddress (
slServInfoSeparateParams[iCurUsedServInfoSplitItems],
NewServerListEntry.HostAddr );
// [server n name]
NewServerListEntry.strName =
slServInfoSeparateParams[iCurUsedServInfoSplitItems + 1];
// [server n city]
NewServerListEntry.strCity =
slServInfoSeparateParams[iCurUsedServInfoSplitItems + 2];
// [server n country as QLocale ID]
const int iCountry =
slServInfoSeparateParams[iCurUsedServInfoSplitItems + 3].toInt();
if ( ( iCountry >= 0 ) && ( iCountry <= QLocale::LastCountry ) )
{
NewServerListEntry.eCountry = static_cast<QLocale::Country> (
iCountry );
}
// add the new server to the server list
ServerList.append ( NewServerListEntry );
// we have used four items and have created one predefined server
// (adjust counters)
iCurUsedServInfoSplitItems += 4;
iNumPredefinedServers++;
}
// Connections -------------------------------------------------------------
QObject::connect ( &TimerPollList, SIGNAL ( timeout() ),
@ -166,8 +230,8 @@ void CServerListManager::OnTimerPollList()
QMutexLocker locker ( &Mutex );
// check all list entries except of the very first one (which is the central
// server entry) if they are still valid
for ( int iIdx = 1; iIdx < ServerList.size(); iIdx++ )
// server entry) and the predefined servers if they are still valid
for ( int iIdx = 1 + iNumPredefinedServers; iIdx < ServerList.size(); iIdx++ )
{
// 1 minute = 60 * 1000 ms
if ( ServerList[iIdx].RegisterTime.elapsed() >
@ -232,6 +296,31 @@ void CServerListManager::RegisterServer ( const CHostAddress& InetAddr,
}
}
void CServerListManager::UnregisterServer ( const CHostAddress& InetAddr )
{
QMutexLocker locker ( &Mutex );
if ( bIsCentralServer && bEnabled )
{
const int iCurServerListSize = ServerList.size();
// Find the server to unregister in the list. The very first list entry
// must not be checked since this is per definition the central server
// (i.e., this server), also the predefined servers must not be checked
for ( int iIdx = 1 + iNumPredefinedServers; iIdx < iCurServerListSize; iIdx++ )
{
if ( ServerList[iIdx].HostAddr == InetAddr )
{
// remove this list entry
ServerList.removeAt ( iIdx );
// entry found, leave for-loop
continue;
}
}
}
}
void CServerListManager::QueryServerList ( const CHostAddress& InetAddr )
{
QMutexLocker locker ( &Mutex );

View File

@ -146,6 +146,8 @@ public:
void RegisterServer ( const CHostAddress& InetAddr,
const CServerCoreInfo& ServerInfo );
void UnregisterServer ( const CHostAddress& InetAddr );
void QueryServerList ( const CHostAddress& InetAddr );
@ -173,6 +175,7 @@ protected:
QMutex Mutex;
QList<CServerListEntry> ServerList;
QString strCentralServerAddress;
int iNumPredefinedServers;
bool bEnabled;
bool bIsCentralServer;
bool bUseDefaultCentralServerAddress;