From fa8d7b14ecb5d2e31bb9d3af70798cae9bea2004 Mon Sep 17 00:00:00 2001 From: lotodore Date: Mon, 27 Aug 2007 09:57:51 +0000 Subject: [PATCH] Information about the game is now shown in lobby, when selecting a game. Some GUI modifications, GUI update is working properly now if the dialog is shown the second time (after clearing items). List of players for the game is still missing. With the new on-demand model for player id/player name, this is kind of hard to implement. --- src/gamedata.h | 11 ++++ .../gamelobbydialog/gamelobbydialogimpl.cpp | 27 ++++++++- .../qt/gamelobbydialog/gamelobbydialogimpl.h | 2 + src/gui/qt/guiwrapper.cpp | 3 +- .../startnetworkgamedialogimpl.cpp | 12 +++- .../startnetworkgamedialogimpl.h | 3 +- src/net/clientthread.h | 12 ++-- src/net/common/clientstate.cpp | 4 +- src/net/common/clientthread.cpp | 57 +++++++++++++------ src/net/common/netpacket.cpp | 38 ++++++------- src/net/common/serverlobbythread.cpp | 7 ++- src/net/netpacket.h | 4 +- src/session.cpp | 7 +++ src/session.h | 2 + 14 files changed, 133 insertions(+), 56 deletions(-) diff --git a/src/gamedata.h b/src/gamedata.h index 016ea112..9092d072 100644 --- a/src/gamedata.h +++ b/src/gamedata.h @@ -21,6 +21,8 @@ #ifndef _GAMEDATA_H_ #define _GAMEDATA_H_ +#include + enum GameMode { GAME_MODE_CREATED = 1, @@ -41,6 +43,15 @@ struct GameData int playerActionTimeoutSec; }; +struct GameInfo +{ + GameInfo() : mode(GAME_MODE_CREATED), isPasswordProtected(false) {} + std::string name; + GameData data; + GameMode mode; + bool isPasswordProtected; +}; + struct StartData { StartData() : startDealerPlayerId(0), numberOfPlayers(0) {} diff --git a/src/gui/qt/gamelobbydialog/gamelobbydialogimpl.cpp b/src/gui/qt/gamelobbydialog/gamelobbydialogimpl.cpp index 5d170b11..32705d60 100644 --- a/src/gui/qt/gamelobbydialog/gamelobbydialogimpl.cpp +++ b/src/gui/qt/gamelobbydialog/gamelobbydialogimpl.cpp @@ -22,6 +22,7 @@ gameLobbyDialogImpl::gameLobbyDialogImpl(QWidget *parent, ConfigFile *c) connect( pushButton_CreateGame, SIGNAL( clicked() ), this, SLOT( createGame() ) ); connect( pushButton_JoinGame, SIGNAL( clicked() ), this, SLOT( joinGame() ) ); connect( treeWidget_GameList, SIGNAL( itemClicked ( QTreeWidgetItem*, int) ), this, SLOT( gameSelected(QTreeWidgetItem*, int) ) ); + connect( treeWidget_GameList, SIGNAL( clear () ), this, SLOT( clearGames() ) ); pushButton_JoinGame->setEnabled(false); @@ -98,8 +99,16 @@ void gameLobbyDialogImpl::gameSelected(QTreeWidgetItem* item, int) currentGameName = item->text(0); - groupBox_GameInfo->setEnabled(TRUE); - groupBox_GameInfo->setTitle("Game Info - " + item->text(0)); + groupBox_GameInfo->setEnabled(true); + groupBox_GameInfo->setTitle(tr("Game Info") + " - " + currentGameName); + + assert(mySession); + GameInfo info = mySession->getClientGameInfo(currentGameName.toUtf8().constData()); + label_SmallBlind->setText(QString::number(info.data.smallBlind)); + label_StartCash->setText(QString::number(info.data.startMoney)); + label_MaximumNumberOfPlayers->setText(QString::number(info.data.maxNumberOfPlayers)); + label_HandsToRaiseSmallBlind->setText(QString::number(info.data.handsBeforeRaise)); + label_TimeoutForPlayerAction->setText(QString::number(info.data.playerActionTimeoutSec)); } void gameLobbyDialogImpl::addGame(QString gameName) @@ -116,3 +125,17 @@ void gameLobbyDialogImpl::removeGame(QString gameName) } } +void gameLobbyDialogImpl::clearGames() +{ + pushButton_JoinGame->setEnabled(false); + groupBox_GameInfo->setTitle(tr("Game Info")); + groupBox_GameInfo->setEnabled(false); + currentGameName = ""; + + label_SmallBlind->setText(""); + label_StartCash->setText(""); + label_MaximumNumberOfPlayers->setText(""); + label_HandsToRaiseSmallBlind->setText(""); + label_TimeoutForPlayerAction->setText(""); +} + diff --git a/src/gui/qt/gamelobbydialog/gamelobbydialogimpl.h b/src/gui/qt/gamelobbydialog/gamelobbydialogimpl.h index 4e7840a8..1d2a95f9 100644 --- a/src/gui/qt/gamelobbydialog/gamelobbydialogimpl.h +++ b/src/gui/qt/gamelobbydialog/gamelobbydialogimpl.h @@ -49,6 +49,8 @@ public slots: void setCurrentGameName ( const QString& theValue ) { currentGameName = theValue; } QString getCurrentGameName() const { return currentGameName; } + void clearGames(); + private: ConfigFile *myConfig; diff --git a/src/gui/qt/guiwrapper.cpp b/src/gui/qt/guiwrapper.cpp index 41188ec8..13b0a04b 100644 --- a/src/gui/qt/guiwrapper.cpp +++ b/src/gui/qt/guiwrapper.cpp @@ -121,7 +121,8 @@ void GuiWrapper::SignalNetClientPlayerLeft(const string &playerName) { QString tmpName(QString::fromUtf8(playerName.c_str())); myW->signalNetClientPlayerLeft(tmpName); - myLog->signalLogPlayerLeftMsg(tmpName); + if (!playerName.empty() && playerName[0] != '#') + myLog->signalLogPlayerLeftMsg(tmpName); } void GuiWrapper::SignalNetClientGameListNew(const string &gameName) { myW->signalNetClientGameListNew(QString::fromUtf8(gameName.c_str())); } diff --git a/src/gui/qt/startnetworkgamedialog/startnetworkgamedialogimpl.cpp b/src/gui/qt/startnetworkgamedialog/startnetworkgamedialogimpl.cpp index ba07aad4..e4d6912a 100644 --- a/src/gui/qt/startnetworkgamedialog/startnetworkgamedialogimpl.cpp +++ b/src/gui/qt/startnetworkgamedialog/startnetworkgamedialogimpl.cpp @@ -31,6 +31,7 @@ startNetworkGameDialogImpl::startNetworkGameDialogImpl(QWidget *parent, ConfigFi connect( pushButton_startGame, SIGNAL( clicked() ), this, SLOT( startGame() ) ); connect( pushButton_Kick, SIGNAL( clicked() ), this, SLOT( kickPlayer() ) ); connect( treeWidget, SIGNAL( itemClicked ( QTreeWidgetItem*, int) ), this, SLOT( playerSelected(QTreeWidgetItem*, int) ) ); + connect( treeWidget, SIGNAL( clear () ), this, SLOT( clearPlayers() ) ); pushButton_Kick->setEnabled(false); pushButton_startGame->setEnabled(false); @@ -114,20 +115,25 @@ void startNetworkGameDialogImpl::kickPlayer() { mySession->kickPlayer(playerName.toUtf8().constData()); } } - pushButton_Kick->setEnabled(FALSE); + pushButton_Kick->setEnabled(false); } void startNetworkGameDialogImpl::checkPlayerQuantity() { if (treeWidget->topLevelItemCount() >= 2 && isAdmin) { - pushButton_startGame->setEnabled(TRUE); + pushButton_startGame->setEnabled(true); } else { - pushButton_startGame->setEnabled(FALSE); + pushButton_startGame->setEnabled(false); } } +void startNetworkGameDialogImpl::clearPlayers() +{ + pushButton_Kick->setEnabled(false); +} + void startNetworkGameDialogImpl::setSession(Session *session) { mySession = session; diff --git a/src/gui/qt/startnetworkgamedialog/startnetworkgamedialogimpl.h b/src/gui/qt/startnetworkgamedialog/startnetworkgamedialogimpl.h index 47c9acf3..e077773f 100644 --- a/src/gui/qt/startnetworkgamedialog/startnetworkgamedialogimpl.h +++ b/src/gui/qt/startnetworkgamedialog/startnetworkgamedialogimpl.h @@ -52,12 +52,13 @@ public slots: void playerSelected(QTreeWidgetItem*, int); void kickPlayer(); void checkPlayerQuantity(); + void clearPlayers(); void keyPressEvent ( QKeyEvent*); void setMaxPlayerNumber ( int theValue ) { maxPlayerNumber = theValue; label_maxPlayerNumber->setText(QString::number(theValue,10)); } int getMaxPlayerNumber() const { return maxPlayerNumber; } - + private: diff --git a/src/net/clientthread.h b/src/net/clientthread.h index e4b88d4f..e21e8a61 100644 --- a/src/net/clientthread.h +++ b/src/net/clientthread.h @@ -62,11 +62,13 @@ public: void SendJoinGame(const std::string &name, const std::string &password); void SendCreateGame(const GameData &gameData, const std::string &name, const std::string &password); + GameInfo GetGameInfo(const std::string &game) const; + ClientCallback &GetCallback(); GuiInterface &GetGui(); protected: - typedef std::map GameMap; + typedef std::map GameInfoMap; typedef std::list > NetPacketList; typedef std::map PlayerInfoMap; @@ -110,8 +112,8 @@ protected: void RemoveDisconnectedPlayers(); unsigned GetGameIdByName(const std::string &name) const; - void AddGameInformation(unsigned id, const std::string &name); - void RemoveGameInformation(unsigned id); + void AddGameInfo(unsigned id, const GameInfo &info); + void RemoveGameInfo(unsigned id); bool IsSessionEstablished() const; void SetSessionEstablished(bool flag); @@ -133,8 +135,8 @@ private: StartData m_startData; PlayerDataList m_playerDataList; - GameMap m_gameMap; - mutable boost::mutex m_gameMapMutex; + GameInfoMap m_gameInfoMap; + mutable boost::mutex m_gameInfoMapMutex; boost::shared_ptr m_game; PlayerInfoMap m_playerInfoMap; diff --git a/src/net/common/clientstate.cpp b/src/net/common/clientstate.cpp index b4201269..eef74d03 100644 --- a/src/net/common/clientstate.cpp +++ b/src/net/common/clientstate.cpp @@ -485,7 +485,7 @@ ClientStateWaitJoin::InternalProcess(ClientThread &client, boost::shared_ptrToNetPacketGameListNew()->GetData(gameListNewData); - client.AddGameInformation(gameListNewData.gameId, gameListNewData.gameName); + client.AddGameInfo(gameListNewData.gameId, gameListNewData.gameInfo); } else if (packet->ToNetPacketGameListUpdate()) { @@ -493,7 +493,7 @@ ClientStateWaitJoin::InternalProcess(ClientThread &client, boost::shared_ptrToNetPacketGameListUpdate()->GetData(gameListUpdateData); if (gameListUpdateData.gameMode == GAME_MODE_CLOSED) - client.RemoveGameInformation(gameListUpdateData.gameId); + client.RemoveGameInfo(gameListUpdateData.gameId); } else if (packet->ToNetPacketJoinGameAck()) { diff --git a/src/net/common/clientthread.cpp b/src/net/common/clientthread.cpp index 98b3bf32..4efdd7e2 100644 --- a/src/net/common/clientthread.cpp +++ b/src/net/common/clientthread.cpp @@ -216,6 +216,26 @@ ClientThread::SendCreateGame(const GameData &gameData, const std::string &name, } } +GameInfo +ClientThread::GetGameInfo(const string &game) const +{ + GameInfo tmpInfo; + try + { + unsigned id = GetGameIdByName(game); + + boost::mutex::scoped_lock lock(m_gameInfoMapMutex); + GameInfoMap::const_iterator pos = m_gameInfoMap.find(id); + if (pos != m_gameInfoMap.end()) + { + tmpInfo = pos->second; + } + } catch (const NetException &) + { + } + return tmpInfo; +} + ClientCallback & ClientThread::GetCallback() { @@ -469,7 +489,13 @@ ClientThread::RemovePlayerData(unsigned playerId) } if (!playerName.empty()) + { + // Remove name and id string. GetCallback().SignalNetClientPlayerLeft(playerName); + ostringstream name; + name << "#" << playerId; + GetCallback().SignalNetClientPlayerLeft(name.str()); + } } void @@ -581,12 +607,12 @@ unsigned ClientThread::GetGameIdByName(const std::string &name) const { // Find the game. - boost::mutex::scoped_lock lock(m_gameMapMutex); - GameMap::const_iterator i = m_gameMap.begin(); - GameMap::const_iterator end = m_gameMap.end(); + boost::mutex::scoped_lock lock(m_gameInfoMapMutex); + GameInfoMap::const_iterator i = m_gameInfoMap.begin(); + GameInfoMap::const_iterator end = m_gameInfoMap.end(); while (i != end) { - if (i->second == name) + if (i->second.name == name) break; ++i; } @@ -597,29 +623,26 @@ ClientThread::GetGameIdByName(const std::string &name) const } void -ClientThread::AddGameInformation(unsigned id, const std::string &name) +ClientThread::AddGameInfo(unsigned id, const GameInfo &info) { - if (!name.empty()) { - { - boost::mutex::scoped_lock lock(m_gameMapMutex); - m_gameMap.insert(GameMap::value_type(id, name)); - } - GetCallback().SignalNetClientGameListNew(name); + boost::mutex::scoped_lock lock(m_gameInfoMapMutex); + m_gameInfoMap.insert(GameInfoMap::value_type(id, info)); } + GetCallback().SignalNetClientGameListNew(info.name); } void -ClientThread::RemoveGameInformation(unsigned id) +ClientThread::RemoveGameInfo(unsigned id) { string name; { - boost::mutex::scoped_lock lock(m_gameMapMutex); - GameMap::iterator pos = m_gameMap.find(id); - if (pos != m_gameMap.end()) + boost::mutex::scoped_lock lock(m_gameInfoMapMutex); + GameInfoMap::iterator pos = m_gameInfoMap.find(id); + if (pos != m_gameInfoMap.end()) { - name = pos->second; - m_gameMap.erase(pos); + name = pos->second.name; + m_gameInfoMap.erase(pos); } } if (!name.empty()) diff --git a/src/net/common/netpacket.cpp b/src/net/common/netpacket.cpp index 28722021..4d53fa14 100644 --- a/src/net/common/netpacket.cpp +++ b/src/net/common/netpacket.cpp @@ -1010,7 +1010,7 @@ NetPacketGameListNew::Clone() const void NetPacketGameListNew::SetData(const NetPacketGameListNew::Data &inData) { - u_int16_t gameNameLen = (u_int16_t)inData.gameName.length(); + u_int16_t gameNameLen = (u_int16_t)inData.gameInfo.name.length(); // Some basic checks, so we don't use up too much memory. // The constructed packet will also be checked. @@ -1025,17 +1025,17 @@ NetPacketGameListNew::SetData(const NetPacketGameListNew::Data &inData) // Set the data. tmpData->gameId = htonl(inData.gameId); - tmpData->gameMode = htons(inData.gameMode); + tmpData->gameMode = htons(inData.gameInfo.mode); tmpData->gameNameLength = htons(gameNameLen); - tmpData->maxNumberOfPlayers = htons(inData.gameData.maxNumberOfPlayers); - tmpData->smallBlind = htons(inData.gameData.smallBlind); - tmpData->handsBeforeRaise = htons(inData.gameData.handsBeforeRaise); - tmpData->proposedGuiSpeed = htons(inData.gameData.guiSpeed); - tmpData->playerActionTimeout = htons(inData.gameData.playerActionTimeoutSec); - tmpData->startMoney = htonl(inData.gameData.startMoney); + tmpData->maxNumberOfPlayers = htons(inData.gameInfo.data.maxNumberOfPlayers); + tmpData->smallBlind = htons(inData.gameInfo.data.smallBlind); + tmpData->handsBeforeRaise = htons(inData.gameInfo.data.handsBeforeRaise); + tmpData->proposedGuiSpeed = htons(inData.gameInfo.data.guiSpeed); + tmpData->playerActionTimeout = htons(inData.gameInfo.data.playerActionTimeoutSec); + tmpData->startMoney = htonl(inData.gameInfo.data.startMoney); char *gameNamePtr = (char *)tmpData + sizeof(NetPacketGameListNewData); - memcpy(gameNamePtr, inData.gameName.c_str(), gameNameLen); + memcpy(gameNamePtr, inData.gameInfo.name.c_str(), gameNameLen); // Check the packet - just in case. Check(GetRawData()); @@ -1047,18 +1047,18 @@ NetPacketGameListNew::GetData(NetPacketGameListNew::Data &outData) const // We assume that the data is valid. Validity has already been checked. NetPacketGameListNewData *tmpData = (NetPacketGameListNewData *)GetRawData(); - outData.gameId = ntohl(tmpData->gameId); - outData.gameMode = static_cast(ntohs(tmpData->gameMode)); - u_int16_t gameNameLen = ntohs(tmpData->gameNameLength); - outData.gameData.maxNumberOfPlayers = ntohs(tmpData->maxNumberOfPlayers); - outData.gameData.smallBlind = ntohs(tmpData->smallBlind); - outData.gameData.handsBeforeRaise = ntohs(tmpData->handsBeforeRaise); - outData.gameData.guiSpeed = ntohs(tmpData->proposedGuiSpeed); - outData.gameData.playerActionTimeoutSec = ntohs(tmpData->playerActionTimeout); - outData.gameData.startMoney = ntohl(tmpData->startMoney); + outData.gameId = ntohl(tmpData->gameId); + outData.gameInfo.mode = static_cast(ntohs(tmpData->gameMode)); + u_int16_t gameNameLen = ntohs(tmpData->gameNameLength); + outData.gameInfo.data.maxNumberOfPlayers = ntohs(tmpData->maxNumberOfPlayers); + outData.gameInfo.data.smallBlind = ntohs(tmpData->smallBlind); + outData.gameInfo.data.handsBeforeRaise = ntohs(tmpData->handsBeforeRaise); + outData.gameInfo.data.guiSpeed = ntohs(tmpData->proposedGuiSpeed); + outData.gameInfo.data.playerActionTimeoutSec= ntohs(tmpData->playerActionTimeout); + outData.gameInfo.data.startMoney = ntohl(tmpData->startMoney); char *gameNamePtr = (char *)tmpData + sizeof(NetPacketGameListNewData); - outData.gameName = string(gameNamePtr, gameNameLen); + outData.gameInfo.name = string(gameNamePtr, gameNameLen); } const NetPacketGameListNew * diff --git a/src/net/common/serverlobbythread.cpp b/src/net/common/serverlobbythread.cpp index ddbd5a5f..761b98a6 100644 --- a/src/net/common/serverlobbythread.cpp +++ b/src/net/common/serverlobbythread.cpp @@ -225,6 +225,7 @@ ServerLobbyThread::HandleNetPacketInit(SessionWrapper session, const NetPacketIn // Partly, this is also done in netpacket. // However, some disallowed names are checked only here. if (initData.playerName.empty() || initData.playerName.size() > MAX_NAME_SIZE + || initData.playerName[0] == '#' || initData.playerName.substr(0, sizeof(SERVER_COMPUTER_PLAYER_NAME) - 1) == SERVER_COMPUTER_PLAYER_NAME) { SessionError(session, ERR_NET_INVALID_PLAYER_NAME); @@ -552,9 +553,9 @@ ServerLobbyThread::CreateNetPacketGameListNew(const ServerGameThread &game) boost::shared_ptr packet(new NetPacketGameListNew); NetPacketGameListNew::Data packetData; packetData.gameId = game.GetId(); - packetData.gameMode = GAME_MODE_CREATED; - packetData.gameName = game.GetName(); - packetData.gameData = game.GetGameData(); + packetData.gameInfo.mode = GAME_MODE_CREATED; + packetData.gameInfo.name = game.GetName(); + packetData.gameInfo.data = game.GetGameData(); static_cast(packet.get())->SetData(packetData); return packet; } diff --git a/src/net/netpacket.h b/src/net/netpacket.h index 4658f084..3d01c2ce 100644 --- a/src/net/netpacket.h +++ b/src/net/netpacket.h @@ -191,9 +191,7 @@ public: struct Data { u_int32_t gameId; - GameMode gameMode; - std::string gameName; - GameData gameData; + GameInfo gameInfo; }; NetPacketGameListNew(); diff --git a/src/session.cpp b/src/session.cpp index f7219ce6..28602d28 100755 --- a/src/session.cpp +++ b/src/session.cpp @@ -275,3 +275,10 @@ bool Session::isNetworkServerRunning() const // TODO return myNetServer != NULL; } + +GameInfo Session::getClientGameInfo(const string &game) +{ + assert(myNetClient); + return myNetClient->GetGameInfo(game); +} + diff --git a/src/session.h b/src/session.h index bfc79667..836cbc53 100755 --- a/src/session.h +++ b/src/session.h @@ -68,6 +68,8 @@ public: bool isNetworkClientRunning() const; // TODO hack bool isNetworkServerRunning() const; // TODO hack + GameInfo getClientGameInfo(const std::string &game); + private: int currentGameID;