From 0c9a2b061c384f7dc151b437205fdc4d0129a4db Mon Sep 17 00:00:00 2001 From: Max-Wilhelm Bruker Date: Mon, 2 Jan 2012 15:46:14 +0100 Subject: [PATCH] deck storage is fully working again, cleaned up some unnecessarily large messages --- cockatrice/src/remoteclient.cpp | 2 +- cockatrice/src/remotedecklist_treewidget.cpp | 57 +++++++++++--------- cockatrice/src/remotedecklist_treewidget.h | 14 +++-- cockatrice/src/tab_deck_storage.cpp | 34 ++++++------ cockatrice/src/tab_server.cpp | 17 +++--- common/pb/proto/response_deck_list.proto | 9 ++++ common/pb/proto/response_deck_upload.proto | 9 ++++ common/pb/proto/serverinfo_deckstorage.proto | 14 +++++ common/server.cpp | 2 +- common/server_game.cpp | 2 +- common/server_player.cpp | 3 +- common/server_room.cpp | 11 ++-- common/server_room.h | 2 +- 13 files changed, 110 insertions(+), 66 deletions(-) create mode 100644 common/pb/proto/response_deck_list.proto create mode 100644 common/pb/proto/response_deck_upload.proto create mode 100644 common/pb/proto/serverinfo_deckstorage.proto diff --git a/cockatrice/src/remoteclient.cpp b/cockatrice/src/remoteclient.cpp index 5f8c9a2b1..2cb9d0b1d 100644 --- a/cockatrice/src/remoteclient.cpp +++ b/cockatrice/src/remoteclient.cpp @@ -108,7 +108,7 @@ void RemoteClient::readData() ServerMessage newServerMessage; newServerMessage.ParseFromArray(inputBuffer.data(), messageLength); - qDebug(QString::fromStdString(newServerMessage.ShortDebugString()).toUtf8()); + qDebug((QString::number(messageLength) + ": " + QString::fromStdString(newServerMessage.ShortDebugString())).toUtf8()); inputBuffer.remove(0, messageLength); messageInProgress = false; diff --git a/cockatrice/src/remotedecklist_treewidget.cpp b/cockatrice/src/remotedecklist_treewidget.cpp index 7c0c047de..eeb3ee31d 100644 --- a/cockatrice/src/remotedecklist_treewidget.cpp +++ b/cockatrice/src/remotedecklist_treewidget.cpp @@ -6,7 +6,8 @@ #include "pending_command.h" #include "pb/session_commands.pb.h" -//#include "pb/response_deck_list.pb.h" +#include "pb/response_deck_list.pb.h" +#include "pb/serverinfo_deckstorage.pb.h" RemoteDeckList_TreeModel::DirectoryNode::DirectoryNode(const QString &_name, RemoteDeckList_TreeModel::DirectoryNode *_parent) : RemoteDeckList_TreeModel::Node(_name, _parent) @@ -202,35 +203,38 @@ QModelIndex RemoteDeckList_TreeModel::nodeToIndex(Node *node) const return createIndex(node->getParent()->indexOf(node), 0, node); } -void RemoteDeckList_TreeModel::addFileToTree(DeckList_File *file, DirectoryNode *parent) +void RemoteDeckList_TreeModel::addFileToTree(const ServerInfo_DeckStorage_TreeItem &file, DirectoryNode *parent) { -/* beginInsertRows(nodeToIndex(parent), parent->size(), parent->size()); - parent->append(new FileNode(file->getName(), file->getId(), file->getUploadTime(), parent)); - endInsertRows(); -*/ + const ServerInfo_DeckStorage_File &fileInfo = file.file(); + QDateTime time; + time.setMSecsSinceEpoch(fileInfo.creation_time()); + beginInsertRows(nodeToIndex(parent), parent->size(), parent->size()); + parent->append(new FileNode(QString::fromStdString(file.name()), file.id(), time, parent)); + endInsertRows(); } -void RemoteDeckList_TreeModel::addFolderToTree(DeckList_Directory *folder, DirectoryNode *parent) +void RemoteDeckList_TreeModel::addFolderToTree(const ServerInfo_DeckStorage_TreeItem &folder, DirectoryNode *parent) { -// addFolderToTree(folder->getName(), folder->getTreeItems(), parent); + DirectoryNode *newItem = addNamedFolderToTree(QString::fromStdString(folder.name()), parent); + const ServerInfo_DeckStorage_Folder &folderInfo = folder.folder(); + const int folderItemsSize = folderInfo.items_size(); + for (int i = 0; i < folderItemsSize; ++i) { + const ServerInfo_DeckStorage_TreeItem &subItem = folderInfo.items(i); + if (subItem.has_folder()) + addFolderToTree(subItem, newItem); + else + addFileToTree(subItem, newItem); + } } -void RemoteDeckList_TreeModel::addFolderToTree(const QString &name, const QList &folderItems, DirectoryNode *parent) +RemoteDeckList_TreeModel::DirectoryNode *RemoteDeckList_TreeModel::addNamedFolderToTree(const QString &name, DirectoryNode *parent) { -/* DirectoryNode *newItem = new DirectoryNode(name, parent); + DirectoryNode *newItem = new DirectoryNode(name, parent); beginInsertRows(nodeToIndex(parent), parent->size(), parent->size()); parent->append(newItem); endInsertRows(); - - for (int i = 0; i < folderItems.size(); ++i) { - DeckList_Directory *subFolder = dynamic_cast(folderItems[i]); - if (subFolder) - addFolderToTree(subFolder, newItem); - else - addFileToTree(dynamic_cast(folderItems[i]), newItem); - } -*/ + return newItem; } void RemoteDeckList_TreeModel::removeNode(RemoteDeckList_TreeModel::Node *node) @@ -252,14 +256,17 @@ void RemoteDeckList_TreeModel::refreshTree() void RemoteDeckList_TreeModel::deckListFinished(const Response &r) { -/* const Response_DeckList &resp = r.GetExtension(Response_DeckList::ext); + const Response_DeckList &resp = r.GetExtension(Response_DeckList::ext); root->clearTree(); reset(); - addFolderToTree(resp->getRoot(), root); + ServerInfo_DeckStorage_TreeItem tempRoot; + tempRoot.set_id(0); + tempRoot.mutable_folder()->CopyFrom(resp.root()); + addFolderToTree(tempRoot, root); + emit treeRefreshed(); -*/ } RemoteDeckList_TreeWidget::RemoteDeckList_TreeWidget(AbstractClient *_client, QWidget *parent) @@ -300,19 +307,19 @@ RemoteDeckList_TreeModel::FileNode *RemoteDeckList_TreeWidget::getNodeById(int i return treeModel->getRoot()->getNodeById(id); } -void RemoteDeckList_TreeWidget::addFileToTree(DeckList_File *file, RemoteDeckList_TreeModel::DirectoryNode *parent) +void RemoteDeckList_TreeWidget::addFileToTree(const ServerInfo_DeckStorage_TreeItem &file, RemoteDeckList_TreeModel::DirectoryNode *parent) { treeModel->addFileToTree(file, parent); } -void RemoteDeckList_TreeWidget::addFolderToTree(DeckList_Directory *folder, RemoteDeckList_TreeModel::DirectoryNode *parent) +void RemoteDeckList_TreeWidget::addFolderToTree(const ServerInfo_DeckStorage_TreeItem &folder, RemoteDeckList_TreeModel::DirectoryNode *parent) { treeModel->addFolderToTree(folder, parent); } void RemoteDeckList_TreeWidget::addFolderToTree(const QString &name, RemoteDeckList_TreeModel::DirectoryNode *parent) { - treeModel->addFolderToTree(name, QList(), parent); + treeModel->addNamedFolderToTree(name, parent); } void RemoteDeckList_TreeWidget::removeNode(RemoteDeckList_TreeModel::Node *node) diff --git a/cockatrice/src/remotedecklist_treewidget.h b/cockatrice/src/remotedecklist_treewidget.h index 94dabc35c..717ffa0c1 100644 --- a/cockatrice/src/remotedecklist_treewidget.h +++ b/cockatrice/src/remotedecklist_treewidget.h @@ -8,9 +8,7 @@ class Response; class AbstractClient; class QSortFilterProxyModel; -class DeckList_File; -class DeckList_Directory; -class DeckList_TreeItem; +class ServerInfo_DeckStorage_TreeItem; class RemoteDeckList_TreeModel : public QAbstractItemModel { Q_OBJECT @@ -77,9 +75,9 @@ public: Qt::ItemFlags flags(const QModelIndex &index) const; DirectoryNode *getRoot() const { return root; } - void addFileToTree(DeckList_File *file, DirectoryNode *parent); - void addFolderToTree(DeckList_Directory *folder, DirectoryNode *parent); - void addFolderToTree(const QString &name, const QList &folderItems, DirectoryNode *parent); + void addFileToTree(const ServerInfo_DeckStorage_TreeItem &file, DirectoryNode *parent); + void addFolderToTree(const ServerInfo_DeckStorage_TreeItem &folder, DirectoryNode *parent); + DirectoryNode *addNamedFolderToTree(const QString &name, DirectoryNode *parent); void removeNode(Node *node); void refreshTree(); }; @@ -94,8 +92,8 @@ public: RemoteDeckList_TreeModel::Node *getCurrentItem() const; RemoteDeckList_TreeModel::DirectoryNode *getNodeByPath(const QString &path) const; RemoteDeckList_TreeModel::FileNode *getNodeById(int id) const; - void addFileToTree(DeckList_File *file, RemoteDeckList_TreeModel::DirectoryNode *parent); - void addFolderToTree(DeckList_Directory *folder, RemoteDeckList_TreeModel::DirectoryNode *parent); + void addFileToTree(const ServerInfo_DeckStorage_TreeItem &file, RemoteDeckList_TreeModel::DirectoryNode *parent); + void addFolderToTree(const ServerInfo_DeckStorage_TreeItem &folder, RemoteDeckList_TreeModel::DirectoryNode *parent); void addFolderToTree(const QString &name, RemoteDeckList_TreeModel::DirectoryNode *parent); void removeNode(RemoteDeckList_TreeModel::Node *node); void refreshTree(); diff --git a/cockatrice/src/tab_deck_storage.cpp b/cockatrice/src/tab_deck_storage.cpp index 382597145..4bae294d6 100644 --- a/cockatrice/src/tab_deck_storage.cpp +++ b/cockatrice/src/tab_deck_storage.cpp @@ -18,6 +18,8 @@ #include "pending_command.h" #include "pb/response.pb.h" +#include "pb/response_deck_download.pb.h" +#include "pb/response_deck_upload.pb.h" #include "pb/command_deck_upload.pb.h" #include "pb/command_deck_download.pb.h" #include "pb/command_deck_new_dir.pb.h" @@ -169,19 +171,17 @@ void TabDeckStorage::actUpload() cmd.set_deck_list(deck.writeToString_Native().toStdString()); PendingCommand *pend = client->prepareSessionCommand(cmd); - connect(pend, SIGNAL(finished(ProtocolResponse *)), this, SLOT(uploadFinished(ProtocolResponse *))); + connect(pend, SIGNAL(finished(const Response &)), this, SLOT(uploadFinished(const Response &))); client->sendCommand(pend); } void TabDeckStorage::uploadFinished(const Response &r) { -/* Response_DeckUpload *resp = qobject_cast(r); - if (!resp) - return; + const Response_DeckUpload &resp = r.GetExtension(Response_DeckUpload::ext); const Command_DeckUpload &cmd = static_cast(static_cast(sender())->getCommandContainer().session_command(0).GetExtension(Command_DeckUpload::ext)); - serverDirView->addFileToTree(resp->getFile(), serverDirView->getNodeByPath(QString::fromStdString(cmd.path()))); -*/} + serverDirView->addFileToTree(resp.new_file(), serverDirView->getNodeByPath(QString::fromStdString(cmd.path()))); +} void TabDeckStorage::actOpenRemoteDeck() { @@ -193,20 +193,18 @@ void TabDeckStorage::actOpenRemoteDeck() cmd.set_deck_id(curRight->getId()); PendingCommand *pend = client->prepareSessionCommand(cmd); - connect(pend, SIGNAL(finished(ProtocolResponse *)), this, SLOT(openRemoteDeckFinished(ProtocolResponse *))); + connect(pend, SIGNAL(finished(const Response &)), this, SLOT(openRemoteDeckFinished(const Response &))); client->sendCommand(pend); } void TabDeckStorage::openRemoteDeckFinished(const Response &r) { -/* Response_DeckDownload *resp = qobject_cast(r); - if (!resp) - return; + const Response_DeckDownload &resp = r.GetExtension(Response_DeckDownload::ext); WndDeckEditor *deckEditor = new WndDeckEditor; - deckEditor->setDeck(new DeckList(resp->getDeck())); + deckEditor->setDeck(new DeckList(QString::fromStdString(resp.deck()))); deckEditor->show(); -*/} +} void TabDeckStorage::actDownload() { @@ -230,20 +228,20 @@ void TabDeckStorage::actDownload() PendingCommand *pend = client->prepareSessionCommand(cmd); pend->setExtraData(filePath); - connect(pend, SIGNAL(finished(ProtocolResponse *)), this, SLOT(downloadFinished(ProtocolResponse *))); + connect(pend, SIGNAL(finished(const Response &)), this, SLOT(downloadFinished(const Response &))); client->sendCommand(pend); } void TabDeckStorage::downloadFinished(const Response &r) { -/* Response_DeckDownload *resp = qobject_cast(r); - if (!resp) - return; + const Response_DeckDownload &resp = r.GetExtension(Response_DeckDownload::ext); PendingCommand *pend = static_cast(sender()); QString filePath = pend->getExtraData().toString(); - resp->getDeck()->saveToFile(filePath, DeckList::CockatriceFormat); -*/} + + DeckList deck(QString::fromStdString(resp.deck())); + deck.saveToFile(filePath, DeckList::CockatriceFormat); +} void TabDeckStorage::actNewFolder() { diff --git a/cockatrice/src/tab_server.cpp b/cockatrice/src/tab_server.cpp index c92d6acaf..7c1228319 100644 --- a/cockatrice/src/tab_server.cpp +++ b/cockatrice/src/tab_server.cpp @@ -72,8 +72,10 @@ void RoomSelector::processListRoomsEvent(const Event_ListRooms &event) for (int j = 0; j < roomList->topLevelItemCount(); ++j) { QTreeWidgetItem *twi = roomList->topLevelItem(j); if (twi->data(0, Qt::UserRole).toInt() == room.room_id()) { - twi->setData(0, Qt::DisplayRole, QString::fromStdString(room.name())); - twi->setData(1, Qt::DisplayRole, QString::fromStdString(room.description())); + if (room.has_name()) + twi->setData(0, Qt::DisplayRole, QString::fromStdString(room.name())); + if (room.has_description()) + twi->setData(1, Qt::DisplayRole, QString::fromStdString(room.description())); twi->setData(2, Qt::DisplayRole, room.player_count()); twi->setData(3, Qt::DisplayRole, room.game_count()); return; @@ -81,15 +83,18 @@ void RoomSelector::processListRoomsEvent(const Event_ListRooms &event) } QTreeWidgetItem *twi = new QTreeWidgetItem; twi->setData(0, Qt::UserRole, room.room_id()); - twi->setData(0, Qt::DisplayRole, QString::fromStdString(room.name())); - twi->setData(1, Qt::DisplayRole, QString::fromStdString(room.description())); + if (room.has_name()) + twi->setData(0, Qt::DisplayRole, QString::fromStdString(room.name())); + if (room.has_description()) + twi->setData(1, Qt::DisplayRole, QString::fromStdString(room.description())); twi->setData(2, Qt::DisplayRole, room.player_count()); twi->setData(3, Qt::DisplayRole, room.game_count()); twi->setTextAlignment(2, Qt::AlignRight); twi->setTextAlignment(3, Qt::AlignRight); roomList->addTopLevelItem(twi); - if (room.auto_join()) - joinRoom(room.room_id(), false); + if (room.has_auto_join()) + if (room.auto_join()) + joinRoom(room.room_id(), false); } } diff --git a/common/pb/proto/response_deck_list.proto b/common/pb/proto/response_deck_list.proto new file mode 100644 index 000000000..37aa82767 --- /dev/null +++ b/common/pb/proto/response_deck_list.proto @@ -0,0 +1,9 @@ +import "response.proto"; +import "serverinfo_deckstorage.proto"; + +message Response_DeckList { + extend Response { + optional Response_DeckList ext = 1006; + } + optional ServerInfo_DeckStorage_Folder root = 1; +} diff --git a/common/pb/proto/response_deck_upload.proto b/common/pb/proto/response_deck_upload.proto new file mode 100644 index 000000000..eb978fe85 --- /dev/null +++ b/common/pb/proto/response_deck_upload.proto @@ -0,0 +1,9 @@ +import "response.proto"; +import "serverinfo_deckstorage.proto"; + +message Response_DeckUpload { + extend Response { + optional Response_DeckUpload ext = 1008; + } + optional ServerInfo_DeckStorage_TreeItem new_file = 1; +} diff --git a/common/pb/proto/serverinfo_deckstorage.proto b/common/pb/proto/serverinfo_deckstorage.proto new file mode 100644 index 000000000..a8c9f2b68 --- /dev/null +++ b/common/pb/proto/serverinfo_deckstorage.proto @@ -0,0 +1,14 @@ +message ServerInfo_DeckStorage_File { + optional uint64 creation_time = 1; +} + +message ServerInfo_DeckStorage_Folder { + repeated ServerInfo_DeckStorage_TreeItem items = 1; +} + +message ServerInfo_DeckStorage_TreeItem { + optional uint32 id = 1; + optional string name = 2; + optional ServerInfo_DeckStorage_File file = 10; + optional ServerInfo_DeckStorage_Folder folder = 11; +} diff --git a/common/server.cpp b/common/server.cpp index 5be3b6f8d..558725da9 100644 --- a/common/server.cpp +++ b/common/server.cpp @@ -135,7 +135,7 @@ void Server::broadcastRoomUpdate() ServerInfo_Room *roomInfo = event.add_room_list(); room->roomMutex.lock(); - roomInfo->CopyFrom(room->getInfo(false)); + roomInfo->CopyFrom(room->getInfo(false, false, true)); room->roomMutex.unlock(); SessionEvent *se = Server_ProtocolHandler::prepareSessionEvent(event); diff --git a/common/server_game.cpp b/common/server_game.cpp index afb3acd6a..a236df78f 100644 --- a/common/server_game.cpp +++ b/common/server_game.cpp @@ -583,11 +583,11 @@ ServerInfo_Game Server_Game::getInfo() const ServerInfo_Game result; result.set_room_id(room->getId()); result.set_game_id(getGameId()); - result.set_max_players(getMaxPlayers()); if (!players.isEmpty()) { for (int i = 0; i < gameTypes.size(); ++i) result.add_game_types(gameTypes[i]); + result.set_max_players(getMaxPlayers()); result.set_description(getDescription().toStdString()); result.set_with_password(!getPassword().isEmpty()); result.set_player_count(getPlayerCount()); diff --git a/common/server_player.cpp b/common/server_player.cpp index df7d24f58..1536b52ed 100644 --- a/common/server_player.cpp +++ b/common/server_player.cpp @@ -195,7 +195,8 @@ ServerInfo_PlayerProperties Server_Player::getProperties() result.set_spectator(spectator); result.set_conceded(conceded); result.set_ready_start(readyStart); - result.set_deck_hash(deck ? deck->getDeckHash().toStdString() : std::string()); + if (deck) + result.set_deck_hash(deck->getDeckHash().toStdString()); return result; } diff --git a/common/server_room.cpp b/common/server_room.cpp index 88e3b6267..89ba02109 100644 --- a/common/server_room.cpp +++ b/common/server_room.cpp @@ -32,17 +32,20 @@ Server *Server_Room::getServer() const return static_cast(parent()); } -ServerInfo_Room Server_Room::getInfo(bool complete, bool showGameTypes) const +ServerInfo_Room Server_Room::getInfo(bool complete, bool showGameTypes, bool updating) const { QMutexLocker locker(&roomMutex); ServerInfo_Room result; result.set_room_id(id); - result.set_name(name.toStdString()); - result.set_description(description.toStdString()); result.set_game_count(games.size()); result.set_player_count(size()); - result.set_auto_join(autoJoin); + + if (!updating) { + result.set_name(name.toStdString()); + result.set_description(description.toStdString()); + result.set_auto_join(autoJoin); + } if (complete) { QMapIterator gameIterator(games); diff --git a/common/server_room.h b/common/server_room.h index 0fb8b344e..b58473fe9 100644 --- a/common/server_room.h +++ b/common/server_room.h @@ -39,7 +39,7 @@ public: QString getJoinMessage() const { return joinMessage; } const QMap &getGames() const { return games; } Server *getServer() const; - ServerInfo_Room getInfo(bool complete, bool showGameTypes = false) const; + ServerInfo_Room getInfo(bool complete, bool showGameTypes = false, bool updating = false) const; int getGamesCreatedByUser(const QString &name) const; QList getGamesOfUser(const QString &name) const;