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;