From ae19d3dc4b07f445cc03c2a649a835ab88a7aa50 Mon Sep 17 00:00:00 2001 From: Max-Wilhelm Bruker Date: Fri, 6 Apr 2012 17:52:23 +0200 Subject: [PATCH] fixed game list update bug, minor optimizations, restrict client protocol output to QT_DEBUG mode --- cockatrice/src/abstractcarditem.cpp | 1 - cockatrice/src/dlg_creategame.cpp | 3 ++- cockatrice/src/dlg_filter_games.cpp | 17 ++++++++++------ cockatrice/src/gamesmodel.cpp | 16 ++++----------- cockatrice/src/gamesmodel.h | 3 +-- cockatrice/src/remoteclient.cpp | 8 ++++++-- cockatrice/src/tab_room.h | 1 + common/pb/serverinfo_game.proto | 1 + common/server_game.cpp | 31 ++++++++++++++++++++++------- common/server_protocolhandler.cpp | 6 +++--- common/server_room.cpp | 27 +++++++++++++++---------- common/server_room.h | 9 ++++----- servatrice/src/isl_interface.cpp | 2 +- 13 files changed, 75 insertions(+), 50 deletions(-) diff --git a/cockatrice/src/abstractcarditem.cpp b/cockatrice/src/abstractcarditem.cpp index 204b1d86..724a21fe 100644 --- a/cockatrice/src/abstractcarditem.cpp +++ b/cockatrice/src/abstractcarditem.cpp @@ -25,7 +25,6 @@ AbstractCardItem::AbstractCardItem(const QString &_name, Player *_owner, int _id AbstractCardItem::~AbstractCardItem() { - qDebug() << "AbstractCardItem destructor:" << name; emit deleteCardInfoPopup(name); } diff --git a/cockatrice/src/dlg_creategame.cpp b/cockatrice/src/dlg_creategame.cpp index cf98f5f6..6dd88901 100644 --- a/cockatrice/src/dlg_creategame.cpp +++ b/cockatrice/src/dlg_creategame.cpp @@ -55,7 +55,8 @@ void DlgCreateGame::sharedCtor() onlyBuddiesCheckBox = new QCheckBox(tr("Only &buddies can join")); onlyRegisteredCheckBox = new QCheckBox(tr("Only ®istered users can join")); - onlyRegisteredCheckBox->setChecked(true); + if (room && room->getUserInfo()->user_level() & ServerInfo_User::IsRegistered) + onlyRegisteredCheckBox->setChecked(true); QGridLayout *joinRestrictionsLayout = new QGridLayout; joinRestrictionsLayout->addWidget(passwordLabel, 0, 0); diff --git a/cockatrice/src/dlg_filter_games.cpp b/cockatrice/src/dlg_filter_games.cpp index ae6fdc9d..45895678 100644 --- a/cockatrice/src/dlg_filter_games.cpp +++ b/cockatrice/src/dlg_filter_games.cpp @@ -61,12 +61,17 @@ DlgFilterGames::DlgFilterGames(const QMap &allGameTypes, QWidget * QGroupBox *maxPlayersGroupBox = new QGroupBox(tr("Maximum player count")); maxPlayersGroupBox->setLayout(maxPlayersFilterLayout); - QGridLayout *leftColumn = new QGridLayout; - leftColumn->addWidget(gameNameFilterLabel, 0, 0); - leftColumn->addWidget(gameNameFilterEdit, 0, 1); - leftColumn->addWidget(creatorNameFilterLabel, 1, 0); - leftColumn->addWidget(creatorNameFilterEdit, 1, 1); - leftColumn->addWidget(maxPlayersGroupBox, 2, 0, 1, 2); + QGridLayout *leftGrid = new QGridLayout; + leftGrid->addWidget(gameNameFilterLabel, 0, 0); + leftGrid->addWidget(gameNameFilterEdit, 0, 1); + leftGrid->addWidget(creatorNameFilterLabel, 1, 0); + leftGrid->addWidget(creatorNameFilterEdit, 1, 1); + leftGrid->addWidget(maxPlayersGroupBox, 2, 0, 1, 2); + leftGrid->addWidget(unavailableGamesVisibleCheckBox, 3, 0, 1, 2); + + QVBoxLayout *leftColumn = new QVBoxLayout; + leftColumn->addLayout(leftGrid); + leftColumn->addStretch(); QVBoxLayout *rightColumn = new QVBoxLayout; rightColumn->addWidget(gameTypeFilterGroupBox); diff --git a/cockatrice/src/gamesmodel.cpp b/cockatrice/src/gamesmodel.cpp index 67f1c35d..91976b16 100644 --- a/cockatrice/src/gamesmodel.cpp +++ b/cockatrice/src/gamesmodel.cpp @@ -7,15 +7,6 @@ GamesModel::GamesModel(const QMap &_rooms, const QMap void GamesProxyModel::setUnavailableGamesVisible(bool _unavailableGamesVisible) { + qDebug() << "setting to" << _unavailableGamesVisible; unavailableGamesVisible = _unavailableGamesVisible; invalidateFilter(); } diff --git a/cockatrice/src/gamesmodel.h b/cockatrice/src/gamesmodel.h index 7787a0ed..977bf75d 100644 --- a/cockatrice/src/gamesmodel.h +++ b/cockatrice/src/gamesmodel.h @@ -6,8 +6,8 @@ #include #include #include "gametypemap.h" +#include "pb/serverinfo_game.pb.h" -class ServerInfo_Game; class ServerInfo_User; class GamesModel : public QAbstractTableModel { @@ -18,7 +18,6 @@ private: QMap gameTypes; public: GamesModel(const QMap &_rooms, const QMap &_gameTypes, QObject *parent = 0); - ~GamesModel(); int rowCount(const QModelIndex &parent = QModelIndex()) const { return parent.isValid() ? 0 : gameList.size(); } int columnCount(const QModelIndex &/*parent*/ = QModelIndex()) const { return 8; } QVariant data(const QModelIndex &index, int role) const; diff --git a/cockatrice/src/remoteclient.cpp b/cockatrice/src/remoteclient.cpp index acf63082..91b9d17a 100644 --- a/cockatrice/src/remoteclient.cpp +++ b/cockatrice/src/remoteclient.cpp @@ -118,7 +118,9 @@ void RemoteClient::readData() ServerMessage newServerMessage; newServerMessage.ParseFromArray(inputBuffer.data(), messageLength); - qDebug(("IN " + QString::number(messageLength) + ": " + QString::fromStdString(newServerMessage.DebugString())).toUtf8()); +#ifdef QT_DEBUG + qDebug(("IN " + QString::number(messageLength) + ": " + QString::fromStdString(newServerMessage.ShortDebugString())).toUtf8()); +#endif inputBuffer.remove(0, messageLength); messageInProgress = false; @@ -133,7 +135,9 @@ void RemoteClient::sendCommandContainer(const CommandContainer &cont) { QByteArray buf; unsigned int size = cont.ByteSize(); - qDebug(("OUT " + QString::number(size) + ": " + QString::fromStdString(cont.DebugString())).toUtf8()); +#ifdef QT_DEBUG + qDebug(("OUT " + QString::number(size) + ": " + QString::fromStdString(cont.ShortDebugString())).toUtf8()); +#endif buf.resize(size + 4); cont.SerializeToArray(buf.data() + 4, size); buf.data()[3] = (unsigned char) size; diff --git a/cockatrice/src/tab_room.h b/cockatrice/src/tab_room.h index b54afc95..9c1179b8 100644 --- a/cockatrice/src/tab_room.h +++ b/cockatrice/src/tab_room.h @@ -68,6 +68,7 @@ public: const QMap &getGameTypes() const { return gameTypes; } QString getChannelName() const { return roomName; } QString getTabText() const { return roomName; } + const ServerInfo_User *getUserInfo() const { return ownUser; } PendingCommand *prepareRoomCommand(const ::google::protobuf::Message &cmd); void sendRoomCommand(PendingCommand *pend); diff --git a/common/pb/serverinfo_game.proto b/common/pb/serverinfo_game.proto index 7544abe8..3a0e10d4 100644 --- a/common/pb/serverinfo_game.proto +++ b/common/pb/serverinfo_game.proto @@ -19,4 +19,5 @@ message ServerInfo_Game { optional uint32 spectators_count = 31; optional bool started = 50; optional uint32 start_time = 51; + optional bool closed = 52; } diff --git a/common/server_game.cpp b/common/server_game.cpp index 7ece50b5..23d48e51 100644 --- a/common/server_game.cpp +++ b/common/server_game.cpp @@ -294,7 +294,9 @@ void Server_Game::doStartGameIfReady() locker.unlock(); ServerInfo_Game gameInfo; - getInfo(gameInfo); + gameInfo.set_room_id(room->getId()); + gameInfo.set_game_id(gameId); + gameInfo.set_started(true); emit gameInfoChanged(gameInfo); } @@ -327,6 +329,14 @@ void Server_Game::stopGameIfFinished() } sendGameStateToPlayers(); + + locker.unlock(); + + ServerInfo_Game gameInfo; + gameInfo.set_room_id(room->getId()); + gameInfo.set_game_id(gameId); + gameInfo.set_started(false); + emit gameInfoChanged(gameInfo); } Response::ResponseCode Server_Game::checkJoin(ServerInfo_User *user, const QString &_password, bool spectator, bool overrideRestrictions) @@ -393,7 +403,9 @@ void Server_Game::addPlayer(Server_AbstractUserInterface *userInterface, Respons if (broadcastUpdate) { ServerInfo_Game gameInfo; - getInfo(gameInfo); + gameInfo.set_room_id(room->getId()); + gameInfo.set_game_id(gameId); + gameInfo.set_player_count(getPlayerCount()); emit gameInfoChanged(gameInfo); } @@ -421,9 +433,10 @@ void Server_Game::removePlayer(Server_Player *player) bool spectator = player->getSpectator(); player->prepareDestroy(); - if (!getPlayerCount()) + if (!getPlayerCount()) { deleteLater(); - else if (!spectator) { + return; + } else if (!spectator) { if (playerHost) { int newHostId = -1; QMapIterator playerIterator(players); @@ -445,7 +458,9 @@ void Server_Game::removePlayer(Server_Player *player) } ServerInfo_Game gameInfo; - getInfo(gameInfo); + gameInfo.set_room_id(room->getId()); + gameInfo.set_game_id(gameId); + gameInfo.set_player_count(getPlayerCount()); emit gameInfoChanged(gameInfo); } @@ -645,8 +660,10 @@ void Server_Game::getInfo(ServerInfo_Game &result) const QMutexLocker locker(&gameMutex); result.set_room_id(room->getId()); - result.set_game_id(getGameId()); - if (!players.isEmpty()) { + result.set_game_id(gameId); + if (players.isEmpty()) + result.set_closed(true); + else { for (int i = 0; i < gameTypes.size(); ++i) result.add_game_types(gameTypes[i]); diff --git a/common/server_protocolhandler.cpp b/common/server_protocolhandler.cpp index 8e74a9ee..06df1df6 100644 --- a/common/server_protocolhandler.cpp +++ b/common/server_protocolhandler.cpp @@ -422,7 +422,7 @@ Response::ResponseCode Server_ProtocolHandler::cmdGetGamesOfUser(const Command_G while (roomIterator.hasNext()) { Server_Room *room = roomIterator.next().value(); room->gamesMutex.lock(); - re->add_room_list()->CopyFrom(room->getInfo(false, true)); + room->getInfo(*re->add_room_list(), false, true); QListIterator gameIterator(room->getGamesOfUser(QString::fromStdString(cmd.user_name()))); while (gameIterator.hasNext()) re->add_game_list()->CopyFrom(gameIterator.next()); @@ -470,7 +470,7 @@ Response::ResponseCode Server_ProtocolHandler::cmdListRooms(const Command_ListRo Event_ListRooms event; QMapIterator roomIterator(server->getRooms()); while (roomIterator.hasNext()) - event.add_room_list()->CopyFrom(roomIterator.next().value()->getInfo(false)); + roomIterator.next().value()->getInfo(*event.add_room_list(), false); rc.enqueuePreResponseItem(ServerMessage::SESSION_EVENT, prepareSessionEvent(event)); acceptsRoomListChanges = true; @@ -498,7 +498,7 @@ Response::ResponseCode Server_ProtocolHandler::cmdJoinRoom(const Command_JoinRoo rc.enqueuePostResponseItem(ServerMessage::ROOM_EVENT, r->prepareRoomEvent(joinMessageEvent)); Response_JoinRoom *re = new Response_JoinRoom; - re->mutable_room_info()->CopyFrom(r->getInfo(true)); + r->getInfo(*re->mutable_room_info(), true); rc.setResponseExtension(re); return Response::RespOk; diff --git a/common/server_room.cpp b/common/server_room.cpp index 5a112b4b..85f0a9c7 100644 --- a/common/server_room.cpp +++ b/common/server_room.cpp @@ -9,6 +9,7 @@ #include "pb/event_leave_room.pb.h" #include "pb/event_list_games.pb.h" #include "pb/event_room_say.pb.h" +#include "pb/serverinfo_room.pb.h" #include Server_Room::Server_Room(int _id, const QString &_name, const QString &_description, bool _autoJoin, const QString &_joinMessage, const QStringList &_gameTypes, Server *parent) @@ -38,9 +39,8 @@ Server *Server_Room::getServer() const return static_cast(parent()); } -ServerInfo_Room Server_Room::getInfo(bool complete, bool showGameTypes, bool updating, bool includeExternalData) const +const ServerInfo_Room &Server_Room::getInfo(ServerInfo_Room &result, bool complete, bool showGameTypes, bool updating, bool includeExternalData) const { - ServerInfo_Room result; result.set_room_id(id); if (!updating) { @@ -104,7 +104,8 @@ void Server_Room::addClient(Server_ProtocolHandler *client) userList.append(client); usersLock.unlock(); - emit roomInfoChanged(getInfo(false, false, true)); + ServerInfo_Room roomInfo; + emit roomInfoChanged(getInfo(roomInfo, false, false, true)); } void Server_Room::removeClient(Server_ProtocolHandler *client) @@ -117,7 +118,8 @@ void Server_Room::removeClient(Server_ProtocolHandler *client) event.set_name(client->getUserInfo()->name()); sendRoomEvent(prepareRoomEvent(event)); - emit roomInfoChanged(getInfo(false, false, true)); + ServerInfo_Room roomInfo; + emit roomInfoChanged(getInfo(roomInfo, false, false, true)); } void Server_Room::addExternalUser(const ServerInfo_User &userInfo) @@ -132,7 +134,8 @@ void Server_Room::addExternalUser(const ServerInfo_User &userInfo) externalUsers.insert(QString::fromStdString(userInfo.name()), userInfoContainer); usersLock.unlock(); - emit roomInfoChanged(getInfo(false, false, true)); + ServerInfo_Room roomInfo; + emit roomInfoChanged(getInfo(roomInfo, false, false, true)); } void Server_Room::removeExternalUser(const QString &name) @@ -147,7 +150,8 @@ void Server_Room::removeExternalUser(const QString &name) event.set_name(name.toStdString()); sendRoomEvent(prepareRoomEvent(event), false); - emit roomInfoChanged(getInfo(false, false, true)); + ServerInfo_Room roomInfo; + emit roomInfoChanged(getInfo(roomInfo, false, false, true)); } void Server_Room::updateExternalGameList(const ServerInfo_Game &gameInfo) @@ -161,7 +165,8 @@ void Server_Room::updateExternalGameList(const ServerInfo_Game &gameInfo) gamesMutex.unlock(); broadcastGameListUpdate(gameInfo, false); - emit roomInfoChanged(getInfo(false, false, true)); + ServerInfo_Room roomInfo; + emit roomInfoChanged(getInfo(roomInfo, false, false, true)); } Response::ResponseCode Server_Room::processJoinGameCommand(const Command_JoinGame &cmd, ResponseContainer &rc, Server_AbstractUserInterface *userInterface) @@ -215,7 +220,7 @@ void Server_Room::sendRoomEvent(RoomEvent *event, bool sendToIsl) delete event; } -void Server_Room::broadcastGameListUpdate(ServerInfo_Game gameInfo, bool sendToIsl) +void Server_Room::broadcastGameListUpdate(const ServerInfo_Game &gameInfo, bool sendToIsl) { Event_ListGames event; event.add_game_list()->CopyFrom(gameInfo); @@ -236,7 +241,8 @@ void Server_Room::addGame(Server_Game *game) game->gameMutex.unlock(); emit gameListChanged(gameInfo); - emit roomInfoChanged(getInfo(false, false, true)); + ServerInfo_Room roomInfo; + emit roomInfoChanged(getInfo(roomInfo, false, false, true)); } void Server_Room::removeGame(Server_Game *game) @@ -252,7 +258,8 @@ void Server_Room::removeGame(Server_Game *game) games.remove(game->getGameId()); - emit roomInfoChanged(getInfo(false, false, true)); + ServerInfo_Room roomInfo; + emit roomInfoChanged(getInfo(roomInfo, false, false, true)); } int Server_Room::getGamesCreatedByUser(const QString &userName) const diff --git a/common/server_room.h b/common/server_room.h index 0f887710..1a2801e0 100644 --- a/common/server_room.h +++ b/common/server_room.h @@ -8,7 +8,6 @@ #include #include #include "serverinfo_user_container.h" -#include "pb/serverinfo_room.pb.h" #include "pb/response.pb.h" class Server_ProtocolHandler; @@ -26,8 +25,8 @@ class Server_AbstractUserInterface; class Server_Room : public QObject { Q_OBJECT signals: - void roomInfoChanged(ServerInfo_Room roomInfo); - void gameListChanged(ServerInfo_Game gameInfo); + void roomInfoChanged(const ServerInfo_Room &roomInfo); + void gameListChanged(const ServerInfo_Game &gameInfo); private: int id; QString name; @@ -40,7 +39,7 @@ private: QList userList; QMap externalUsers; private slots: - void broadcastGameListUpdate(ServerInfo_Game gameInfo, bool sendToIsl = true); + void broadcastGameListUpdate(const ServerInfo_Game &gameInfo, bool sendToIsl = true); public: mutable QReadWriteLock usersLock; mutable QMutex gamesMutex; @@ -55,7 +54,7 @@ public: const QMap &getGames() const { return games; } const QMap &getExternalGames() const { return externalGames; } Server *getServer() const; - ServerInfo_Room getInfo(bool complete, bool showGameTypes = false, bool updating = false, bool includeExternalData = true) const; + const ServerInfo_Room &getInfo(ServerInfo_Room &result, bool complete, bool showGameTypes = false, bool updating = false, bool includeExternalData = true) const; int getGamesCreatedByUser(const QString &name) const; QList getGamesOfUser(const QString &name) const; diff --git a/servatrice/src/isl_interface.cpp b/servatrice/src/isl_interface.cpp index 96e55800..52968422 100644 --- a/servatrice/src/isl_interface.cpp +++ b/servatrice/src/isl_interface.cpp @@ -129,7 +129,7 @@ void IslInterface::initServer() Server_Room *room = roomIterator.next().value(); room->usersLock.lockForRead(); room->gamesMutex.lock(); - event.add_room_list()->CopyFrom(room->getInfo(true, true, false, false)); + room->getInfo(*event.add_room_list(), true, true, false, false); } IslMessage message;