From 1a601d9509f191bda6d60371990c65f619bb273c Mon Sep 17 00:00:00 2001 From: pliu037 Date: Tue, 8 Jul 2014 16:24:51 -0400 Subject: [PATCH 01/19] Added better support for custom card images by prioritizing a check for card images in / before all other checks. --- cockatrice/src/carddatabase.cpp | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/cockatrice/src/carddatabase.cpp b/cockatrice/src/carddatabase.cpp index eff101f9..98e506b5 100644 --- a/cockatrice/src/carddatabase.cpp +++ b/cockatrice/src/carddatabase.cpp @@ -129,21 +129,22 @@ void PictureLoader::processLoadQueue() QString setName = ptl.getSetName(); QImage image; - if (!image.load(QString("%1/%2/%3.full.jpg").arg(picsPath).arg(setName).arg(correctedName))) - if (!image.load(QString("%1/%2/%3%4.full.jpg").arg(picsPath).arg(setName).arg(correctedName).arg(1))) - if (!image.load(QString("%1/%2/%3/%4.full.jpg").arg(picsPath).arg("downloadedPics").arg(setName).arg(correctedName))) { - if (picDownload) { - cardsToDownload.append(ptl); - if (!downloadRunning) - startNextPicDownload(); - } else { - if (ptl.nextSet()) - loadQueue.prepend(ptl); - else - emit imageLoaded(ptl.getCard(), QImage()); + if (!image.load(QString("%1/%2/%3.full.jpg").arg(picsPath).arg("CUSTOM").arg(correctedName))) + if (!image.load(QString("%1/%2/%3.full.jpg").arg(picsPath).arg(setName).arg(correctedName))) + //if (!image.load(QString("%1/%2/%3%4.full.jpg").arg(picsPath).arg(setName).arg(correctedName).arg(1))) + if (!image.load(QString("%1/%2/%3/%4.full.jpg").arg(picsPath).arg("downloadedPics").arg(setName).arg(correctedName))) { + if (picDownload) { + cardsToDownload.append(ptl); + if (!downloadRunning) + startNextPicDownload(); + } else { + if (ptl.nextSet()) + loadQueue.prepend(ptl); + else + emit imageLoaded(ptl.getCard(), QImage()); + } + continue; } - continue; - } emit imageLoaded(ptl.getCard(), image); } From f32a999b4eba5692c2ff6b6f280f10d7d84a94f8 Mon Sep 17 00:00:00 2001 From: Fabio Bas Date: Thu, 24 Jul 2014 15:38:36 +0200 Subject: [PATCH 02/19] Remove unused variable --- cockatrice/src/main.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/cockatrice/src/main.cpp b/cockatrice/src/main.cpp index b7e2c0ea..df38bbf6 100644 --- a/cockatrice/src/main.cpp +++ b/cockatrice/src/main.cpp @@ -136,7 +136,6 @@ int main(int argc, char *argv[]) qsrand(QDateTime::currentDateTime().toTime_t()); - bool startMainProgram = true; #if QT_VERSION < 0x050000 const QString dataDir = QDesktopServices::storageLocation(QDesktopServices::DataLocation); #else From 036980eb44ce0351a31cb2bbe91f42632dc265ec Mon Sep 17 00:00:00 2001 From: Fabio Bas Date: Thu, 24 Jul 2014 17:37:54 +0200 Subject: [PATCH 03/19] ISO C++ forbids variable length array --- servatrice/src/passwordhasher.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/servatrice/src/passwordhasher.cpp b/servatrice/src/passwordhasher.cpp index 785034b4..0d8cda36 100644 --- a/servatrice/src/passwordhasher.cpp +++ b/servatrice/src/passwordhasher.cpp @@ -18,12 +18,15 @@ QString PasswordHasher::computeHash(const QString &password, const QString &salt QByteArray passwordBuffer = (salt + password).toUtf8(); int hashLen = gcry_md_get_algo_dlen(algo); - char hash[hashLen], tmp[hashLen]; + char *hash = new char[hashLen], *tmp = new char[hashLen]; gcry_md_hash_buffer(algo, hash, passwordBuffer.data(), passwordBuffer.size()); for (int i = 1; i < rounds; ++i) { memcpy(tmp, hash, hashLen); gcry_md_hash_buffer(algo, hash, tmp, hashLen); } - return salt + QString(QByteArray(hash, hashLen).toBase64()); + QString hashedPass = salt + QString(QByteArray(hash, hashLen).toBase64()); + delete[] tmp; + delete[] hash; + return hashedPass; } From 6c7ba0950a340dd801533d0a557b63da0683fdf7 Mon Sep 17 00:00:00 2001 From: Fabio Bas Date: Thu, 24 Jul 2014 18:00:20 +0200 Subject: [PATCH 04/19] Fix warning for DeskList copy constructors Using pointers for classes derived from QObject would be the best idea. --- common/decklist.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/common/decklist.cpp b/common/decklist.cpp index af2f6270..0b2558b5 100644 --- a/common/decklist.cpp +++ b/common/decklist.cpp @@ -355,7 +355,8 @@ DeckList::DeckList() // TODO: http://qt-project.org/doc/qt-4.8/qobject.html#no-copy-constructor-or-assignment-operator DeckList::DeckList(const DeckList &other) - : name(other.name), + : QObject(), + name(other.name), comments(other.comments), deckHash(other.deckHash) { From 3102dd60f92d4665ef004b0f1ab2d482d6d6a65b Mon Sep 17 00:00:00 2001 From: Fabio Bas Date: Thu, 24 Jul 2014 18:09:28 +0200 Subject: [PATCH 05/19] Hide unused parameters in common/ to avoid warnings --- common/server.h | 2 +- common/server_database_interface.h | 20 ++++++++++---------- common/server_player.cpp | 2 +- common/server_protocolhandler.h | 8 ++++---- 4 files changed, 16 insertions(+), 16 deletions(-) diff --git a/common/server.h b/common/server.h index 6742f6e2..275891cc 100644 --- a/common/server.h +++ b/common/server.h @@ -97,7 +97,7 @@ protected slots: void externalGameEventContainerReceived(const GameEventContainer &cont, qint64 sessionId); void externalResponseReceived(const Response &resp, qint64 sessionId); - virtual void doSendIslMessage(const IslMessage &msg, int serverId) { } + virtual void doSendIslMessage(const IslMessage & /* msg */, int /* serverId */) { } protected: void prepareDestroy(); void setDatabaseInterface(Server_DatabaseInterface *_databaseInterface); diff --git a/common/server_database_interface.h b/common/server_database_interface.h index df75cd63..798ae9d9 100644 --- a/common/server_database_interface.h +++ b/common/server_database_interface.h @@ -12,18 +12,18 @@ public: : QObject(parent) { } virtual AuthenticationResult checkUserPassword(Server_ProtocolHandler *handler, const QString &user, const QString &password, QString &reasonStr, int &secondsLeft) = 0; - virtual bool userExists(const QString &user) { return false; } - virtual QMap getBuddyList(const QString &name) { return QMap(); } - virtual QMap getIgnoreList(const QString &name) { return QMap(); } - virtual bool isInBuddyList(const QString &whoseList, const QString &who) { return false; } - virtual bool isInIgnoreList(const QString &whoseList, const QString &who) { return false; } + virtual bool userExists(const QString & /* user */) { return false; } + virtual QMap getBuddyList(const QString & /* name */) { return QMap(); } + virtual QMap getIgnoreList(const QString & /* name */) { return QMap(); } + virtual bool isInBuddyList(const QString & /* whoseList */, const QString & /* who */) { return false; } + virtual bool isInIgnoreList(const QString & /* whoseList */, const QString & /* who */) { return false; } virtual ServerInfo_User getUserData(const QString &name, bool withId = false) = 0; - virtual void storeGameInformation(const QString &roomName, const QStringList &roomGameTypes, const ServerInfo_Game &gameInfo, const QSet &allPlayersEver, const QSet &allSpectatorsEver, const QList &replayList) { } - virtual DeckList *getDeckFromDatabase(int deckId, int userId) { return 0; } + virtual void storeGameInformation(const QString & /* roomName */, const QStringList & /* roomGameTypes */, const ServerInfo_Game & /* gameInfo */, const QSet & /* allPlayersEver */, const QSet & /* allSpectatorsEver */, const QList & /* replayList */) { } + virtual DeckList *getDeckFromDatabase(int /* deckId */, int /* userId */) { return 0; } - virtual qint64 startSession(const QString &userName, const QString &address) { return 0; } + virtual qint64 startSession(const QString & /* userName */, const QString & /* address */) { return 0; } public slots: - virtual void endSession(qint64 sessionId) { } + virtual void endSession(qint64 /* sessionId */ ) { } public: virtual int getNextGameId() = 0; virtual int getNextReplayId() = 0; @@ -31,7 +31,7 @@ public: virtual void clearSessionTables() { } virtual void lockSessionTables() { } virtual void unlockSessionTables() { } - virtual bool userSessionExists(const QString &userName) { return false; } + virtual bool userSessionExists(const QString & /* userName */) { return false; } }; #endif diff --git a/common/server_player.cpp b/common/server_player.cpp index c25151e8..b9277a2d 100644 --- a/common/server_player.cpp +++ b/common/server_player.cpp @@ -1594,7 +1594,7 @@ Response::ResponseCode Server_Player::cmdRevealCards(const Command_RevealCards & return Response::RespOk; } -Response::ResponseCode Server_Player::cmdChangeZoneProperties(const Command_ChangeZoneProperties &cmd, ResponseContainer &rc, GameEventStorage &ges) +Response::ResponseCode Server_Player::cmdChangeZoneProperties(const Command_ChangeZoneProperties &cmd, ResponseContainer & /* rc */, GameEventStorage &ges) { Server_CardZone *zone = zones.value(QString::fromStdString(cmd.zone_name())); if (!zone) diff --git a/common/server_protocolhandler.h b/common/server_protocolhandler.h index 0cea37ae..98e0f6cc 100644 --- a/common/server_protocolhandler.h +++ b/common/server_protocolhandler.h @@ -49,7 +49,7 @@ protected: AuthenticationResult authState; bool acceptsUserListChanges; bool acceptsRoomListChanges; - virtual void logDebugMessage(const QString &message) { } + virtual void logDebugMessage(const QString & /* message */) { } private: QList messageSizeOverTime, messageCountOverTime; int timeRunning, lastDataReceived; @@ -71,13 +71,13 @@ private: Response::ResponseCode cmdJoinGame(const Command_JoinGame &cmd, Server_Room *room, ResponseContainer &rc); Response::ResponseCode processSessionCommandContainer(const CommandContainer &cont, ResponseContainer &rc); - virtual Response::ResponseCode processExtendedSessionCommand(int cmdType, const SessionCommand &cmd, ResponseContainer &rc) { return Response::RespFunctionNotAllowed; } + virtual Response::ResponseCode processExtendedSessionCommand(int /* cmdType */, const SessionCommand & /* cmd */, ResponseContainer & /* rc */) { return Response::RespFunctionNotAllowed; } Response::ResponseCode processRoomCommandContainer(const CommandContainer &cont, ResponseContainer &rc); Response::ResponseCode processGameCommandContainer(const CommandContainer &cont, ResponseContainer &rc); Response::ResponseCode processModeratorCommandContainer(const CommandContainer &cont, ResponseContainer &rc); - virtual Response::ResponseCode processExtendedModeratorCommand(int cmdType, const ModeratorCommand &cmd, ResponseContainer &rc) { return Response::RespFunctionNotAllowed; } + virtual Response::ResponseCode processExtendedModeratorCommand(int /* cmdType */, const ModeratorCommand & /* cmd */, ResponseContainer & /* rc */) { return Response::RespFunctionNotAllowed; } Response::ResponseCode processAdminCommandContainer(const CommandContainer &cont, ResponseContainer &rc); - virtual Response::ResponseCode processExtendedAdminCommand(int cmdType, const AdminCommand &cmd, ResponseContainer &rc) { return Response::RespFunctionNotAllowed; } + virtual Response::ResponseCode processExtendedAdminCommand(int /* cmdType */, const AdminCommand & /* cmd */, ResponseContainer & /* rc */) { return Response::RespFunctionNotAllowed; } private slots: void pingClockTimeout(); public slots: From 13bd35e020ef2508ab442a3fb5f02e875b76cdac Mon Sep 17 00:00:00 2001 From: Fabio Bas Date: Thu, 24 Jul 2014 18:16:08 +0200 Subject: [PATCH 06/19] Servatrice: add prototypes for local functions --- servatrice/src/main.cpp | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/servatrice/src/main.cpp b/servatrice/src/main.cpp index 37b750f4..c5bf9cde 100644 --- a/servatrice/src/main.cpp +++ b/servatrice/src/main.cpp @@ -37,6 +37,23 @@ RNG_Abstract *rng; ServerLogger *logger; QThread *loggerThread; +/* Prototypes */ + +void testRNG(); +void testHash(); +#if QT_VERSION < 0x050000 +void myMessageOutput(QtMsgType type, const char *msg); +void myMessageOutput2(QtMsgType type, const char *msg); +#else +void myMessageOutput(QtMsgType type, const QMessageLogContext &, const QString &msg); +void myMessageOutput2(QtMsgType type, const QMessageLogContext &, const QString &msg); +#endif +#ifdef Q_OS_UNIX +void sigSegvHandler(int sig); +#endif + +/* Implementations */ + void testRNG() { const int n = 500000; From d9577f0d6c0ce8ae2d737a44acf2f316c986130f Mon Sep 17 00:00:00 2001 From: Fabio Bas Date: Thu, 24 Jul 2014 18:27:02 +0200 Subject: [PATCH 07/19] Hide unused parameters in cockatrice/ to avoid warnings --- cockatrice/src/dlg_edit_tokens.cpp | 2 +- cockatrice/src/filtertree.h | 6 +++--- cockatrice/src/localserver.cpp | 2 +- cockatrice/src/replay_timeline_widget.cpp | 2 +- cockatrice/src/tab_replays.cpp | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/cockatrice/src/dlg_edit_tokens.cpp b/cockatrice/src/dlg_edit_tokens.cpp index 28fefa7d..e2de2cd4 100644 --- a/cockatrice/src/dlg_edit_tokens.cpp +++ b/cockatrice/src/dlg_edit_tokens.cpp @@ -113,7 +113,7 @@ DlgEditTokens::DlgEditTokens(CardDatabaseModel *_cardDatabaseModel, QWidget *par setWindowTitle(tr("Edit tokens")); } -void DlgEditTokens::tokenSelectionChanged(const QModelIndex ¤t, const QModelIndex &previous) +void DlgEditTokens::tokenSelectionChanged(const QModelIndex ¤t, const QModelIndex & /* previous */) { const QModelIndex realIndex = cardDatabaseDisplayModel->mapToSource(current); CardInfo *cardInfo = current.row() >= 0 ? cardDatabaseModel->getCard(realIndex.row()) : cardDatabaseModel->getDatabase()->getCard(); diff --git a/cockatrice/src/filtertree.h b/cockatrice/src/filtertree.h index a6c4536d..3229d93b 100644 --- a/cockatrice/src/filtertree.h +++ b/cockatrice/src/filtertree.h @@ -18,10 +18,10 @@ public: virtual void enable() { enabled = true; nodeChanged(); } virtual void disable() { enabled = false; nodeChanged(); } virtual FilterTreeNode *parent() const { return NULL; } - virtual FilterTreeNode *nodeAt(int i) const { return NULL; } - virtual void deleteAt(int i) {} + virtual FilterTreeNode *nodeAt(int /* i */) const { return NULL; } + virtual void deleteAt(int /* i */) {} virtual int childCount() const { return 0; } - virtual int childIndex(const FilterTreeNode *node) const { return -1; } + virtual int childIndex(const FilterTreeNode * /* node */) const { return -1; } virtual int index() const { return (parent() != NULL)? parent()->childIndex(this) : -1; } virtual QString text() const { return QString(textCStr()); } virtual bool isLeaf() const { return false; } diff --git a/cockatrice/src/localserver.cpp b/cockatrice/src/localserver.cpp index dc49078a..a7eda3d1 100644 --- a/cockatrice/src/localserver.cpp +++ b/cockatrice/src/localserver.cpp @@ -33,7 +33,7 @@ ServerInfo_User LocalServer_DatabaseInterface::getUserData(const QString &name, return result; } -AuthenticationResult LocalServer_DatabaseInterface::checkUserPassword(Server_ProtocolHandler *handler, const QString &user, const QString &password, QString &reasonStr, int &secondsLeft) +AuthenticationResult LocalServer_DatabaseInterface::checkUserPassword(Server_ProtocolHandler * /* handler */, const QString & /* user */, const QString & /* password */, QString & /* reasonStr */, int & /* secondsLeft */) { return UnknownUser; } diff --git a/cockatrice/src/replay_timeline_widget.cpp b/cockatrice/src/replay_timeline_widget.cpp index 6127489f..fb3efc1d 100644 --- a/cockatrice/src/replay_timeline_widget.cpp +++ b/cockatrice/src/replay_timeline_widget.cpp @@ -43,7 +43,7 @@ void ReplayTimelineWidget::setTimeline(const QList &_replayTimeline) update(); } -void ReplayTimelineWidget::paintEvent(QPaintEvent *event) +void ReplayTimelineWidget::paintEvent(QPaintEvent * /* event */) { QPainter painter(this); painter.drawRect(0, 0, width() - 1, height() - 1); diff --git a/cockatrice/src/tab_replays.cpp b/cockatrice/src/tab_replays.cpp index 6b3a6210..00a7f9c0 100644 --- a/cockatrice/src/tab_replays.cpp +++ b/cockatrice/src/tab_replays.cpp @@ -202,7 +202,7 @@ void TabReplays::actDownload() client->sendCommand(pend); } -void TabReplays::downloadFinished(const Response &r, const CommandContainer &commandContainer, const QVariant &extraData) +void TabReplays::downloadFinished(const Response &r, const CommandContainer & /* commandContainer */, const QVariant &extraData) { if (r.response_code() != Response::RespOk) return; From bd97d7b9336d59a02fcb979145433457421004af Mon Sep 17 00:00:00 2001 From: Fabio Bas Date: Thu, 24 Jul 2014 18:40:25 +0200 Subject: [PATCH 08/19] Fix signed/unsigned comparision --- cockatrice/src/tab_game.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cockatrice/src/tab_game.cpp b/cockatrice/src/tab_game.cpp index b99fff02..715c75f7 100644 --- a/cockatrice/src/tab_game.cpp +++ b/cockatrice/src/tab_game.cpp @@ -254,7 +254,7 @@ TabGame::TabGame(TabSupervisor *_tabSupervisor, GameReplay *_replay) // Create list: event number -> time [ms] // Distribute simultaneous events evenly across 1 second. - int lastEventTimestamp = -1; + unsigned int lastEventTimestamp = 0; const int eventCount = replay->event_list_size(); for (int i = 0; i < eventCount; ++i) { int j = i + 1; From b10331fe66fc82a75eb39a60df298242949336dd Mon Sep 17 00:00:00 2001 From: Fabio Bas Date: Thu, 24 Jul 2014 18:40:56 +0200 Subject: [PATCH 09/19] Hide unused parameters in oracle/ to avoid warnings --- oracle/src/oraclewizard.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/oracle/src/oraclewizard.cpp b/oracle/src/oraclewizard.cpp index 96b78145..2a597d45 100644 --- a/oracle/src/oraclewizard.cpp +++ b/oracle/src/oraclewizard.cpp @@ -383,7 +383,7 @@ void SaveSetsPage::initializePage() QMessageBox::critical(this, tr("Error"), tr("No set has been imported.")); } -void SaveSetsPage::updateTotalProgress(int cardsImported, int setIndex, const QString &setName) +void SaveSetsPage::updateTotalProgress(int cardsImported, int /* setIndex */, const QString &setName) { if (setName.isEmpty()) { messageLog->append("" + tr("Import finished: %1 cards.").arg(wizard()->importer->getCardList().size()) + ""); From 0f501762e04c9698845a9831620de955d592f626 Mon Sep 17 00:00:00 2001 From: Fabio Bas Date: Thu, 24 Jul 2014 18:44:19 +0200 Subject: [PATCH 10/19] Reorder items initialization to match the order in class declaration --- cockatrice/src/tab_supervisor.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cockatrice/src/tab_supervisor.cpp b/cockatrice/src/tab_supervisor.cpp index dda918a0..166a766a 100644 --- a/cockatrice/src/tab_supervisor.cpp +++ b/cockatrice/src/tab_supervisor.cpp @@ -76,7 +76,7 @@ void CloseButton::paintEvent(QPaintEvent * /*event*/) } TabSupervisor::TabSupervisor(AbstractClient *_client, QWidget *parent) - : QTabWidget(parent), userInfo(0), client(_client), tabUserLists(0), tabServer(0), tabDeckStorage(0), tabAdmin(0), tabReplays(0) + : QTabWidget(parent), userInfo(0), client(_client), tabServer(0), tabUserLists(0), tabDeckStorage(0), tabReplays(0), tabAdmin(0) { tabChangedIcon = new QIcon(":/resources/icon_tab_changed.svg"); setElideMode(Qt::ElideRight); From 3fda31073f66c79b3a3111b3a067c5e2a5c238aa Mon Sep 17 00:00:00 2001 From: Fabio Bas Date: Thu, 24 Jul 2014 18:54:45 +0200 Subject: [PATCH 11/19] Declare useless virtual dtor for polymorphic classes --- cockatrice/src/filtertree.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cockatrice/src/filtertree.h b/cockatrice/src/filtertree.h index 3229d93b..d945e567 100644 --- a/cockatrice/src/filtertree.h +++ b/cockatrice/src/filtertree.h @@ -48,7 +48,7 @@ class FilterTreeBranch : public FilterTreeNode { protected: QList childNodes; public: - ~FilterTreeBranch(); + virtual ~FilterTreeBranch(); FilterTreeNode *nodeAt(int i) const; void deleteAt(int i); int childCount() const { return childNodes.size(); } @@ -102,6 +102,7 @@ public: FilterItem(QString trm, FilterItemList *parent) : p(parent), term(trm) {} + virtual ~FilterItem() {}; CardFilter::Attr attr() const { return p->attr(); } CardFilter::Type type() const { return p->type; } From 1f0ba0ea084c575d5e8c261b3928f7beb08d6f0d Mon Sep 17 00:00:00 2001 From: Fabio Bas Date: Fri, 25 Jul 2014 17:32:12 +0200 Subject: [PATCH 12/19] Debug compilation: check flags actually supported by the compiler --- CMakeLists.txt | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 825ed5cb..d0d40591 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -76,8 +76,19 @@ IF(MSVC) #set(CMAKE_CXX_FLAGS_DEBUG "/Zi") ELSEIF (CMAKE_COMPILER_IS_GNUCXX) # linux/gcc, bsd/gcc, windows/mingw + include(CheckCXXCompilerFlag) + set(CMAKE_CXX_FLAGS_RELEASE "-s -O2") - set(CMAKE_CXX_FLAGS_DEBUG "-ggdb -O0 -Wall -Wextra -pedantic -Werror -Wcast-align -Wmissing-declarations -Winline -Wno-long-long -Wno-error=extra -Wno-error=unused-parameter -Wno-inline -Wno-error=delete-non-virtual-dtor -Wno-error=sign-compare -Wno-error=reorder -Wno-error=missing-declarations") + set(CMAKE_CXX_FLAGS_DEBUG "-ggdb -O0 -Wall -Wextra -pedantic -Werror") + + set(ADDITIONAL_DEBUG_FLAGS -Wcast-align -Wmissing-declarations -Winline -Wno-long-long -Wno-error=extra -Wno-error=unused-parameter -Wno-inline -Wno-error=delete-non-virtual-dtor -Wno-error=sign-compare -Wno-error=reorder -Wno-error=missing-declarations) + + FOREACH(FLAG ${ADDITIONAL_DEBUG_FLAGS}) + CHECK_CXX_COMPILER_FLAG("${FLAG}" CXX_HAS_WARNING_${FLAG}) + IF(CXX_HAS_WARNING_${FLAG}) + SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} ${FLAG}") + ENDIF() + ENDFOREACH() ELSE() # other: osx/llvm, bsd/llvm set(CMAKE_CXX_FLAGS_RELEASE "-O2") From aa225f8df7bf4d3cbc776cca19c8b2a7b54fb273 Mon Sep 17 00:00:00 2001 From: Fabio Bas Date: Sat, 26 Jul 2014 23:36:51 +0200 Subject: [PATCH 13/19] Add back support for custom picture urls in cards.xml --- cockatrice/src/carddatabase.cpp | 34 ++++++++++++++++++++++++++++++--- cockatrice/src/carddatabase.h | 7 +++++++ 2 files changed, 38 insertions(+), 3 deletions(-) diff --git a/cockatrice/src/carddatabase.cpp b/cockatrice/src/carddatabase.cpp index 51120ee0..e216c10f 100644 --- a/cockatrice/src/carddatabase.cpp +++ b/cockatrice/src/carddatabase.cpp @@ -153,9 +153,18 @@ QString PictureLoader::getPicUrl(CardInfo *card) { if (!picDownload) return 0; - QString picUrl = picDownloadHq ? settingsCache->getPicUrlHq() : settingsCache->getPicUrl(); - picUrl.replace("!name!", QUrl::toPercentEncoding(card->getCorrectedName())); + // first check if a custom card url exists in cards.xml CardSet *set = card->getPreferredSet(); + QString picUrl = picDownloadHq ? + card->getCustomPicURLHq(set->getShortName()) : + card->getCustomPicURL(set->getShortName()); + + if (!picUrl.isEmpty()) + return picUrl; + + // otherwise, fallback to the default url + picUrl = picDownloadHq ? settingsCache->getPicUrlHq() : settingsCache->getPicUrl(); + picUrl.replace("!name!", QUrl::toPercentEncoding(card->getCorrectedName())); picUrl.replace("!setcode!", QUrl::toPercentEncoding(set->getShortName())); picUrl.replace("!setname!", QUrl::toPercentEncoding(set->getLongName())); picUrl.replace("!cardid!", QUrl::toPercentEncoding(QString::number(card->getPreferredMuId()))); @@ -275,6 +284,8 @@ CardInfo::CardInfo(CardDatabase *_db, bool _cipt, int _tableRow, const SetList &_sets, + const QStringMap &_customPicURLs, + const QStringMap &_customPicURLsHq, MuidMap _muIds) : db(_db), name(_name), @@ -286,6 +297,8 @@ CardInfo::CardInfo(CardDatabase *_db, text(_text), colors(_colors), loyalty(_loyalty), + customPicURLs(_customPicURLs), + customPicURLsHq(_customPicURLsHq), muIds(_muIds), cipt(_cipt), tableRow(_tableRow), @@ -464,6 +477,14 @@ static QXmlStreamWriter &operator<<(QXmlStreamWriter &xml, const CardInfo *info) tmpSet=sets[i]->getShortName(); xml.writeAttribute("muId", QString::number(info->getMuId(tmpSet))); + tmpString = info->getCustomPicURL(tmpSet); + if(!tmpString.isEmpty()) + xml.writeAttribute("picURL", tmpString); + + tmpString = info->getCustomPicURLHq(tmpSet); + if(!tmpString.isEmpty()) + xml.writeAttribute("picURLHq", tmpString); + xml.writeCharacters(tmpSet); xml.writeEndElement(); } @@ -628,6 +649,7 @@ void CardDatabase::loadCardsFromXml(QXmlStreamReader &xml) if (xml.name() == "card") { QString name, manacost, type, pt, text; QStringList colors; + QStringMap customPicURLs, customPicURLsHq; MuidMap muids; SetList sets; int tableRow = 0; @@ -654,6 +676,12 @@ void CardDatabase::loadCardsFromXml(QXmlStreamReader &xml) if (attrs.hasAttribute("muId")) { muids[setName] = attrs.value("muId").toString().toInt(); } + if (attrs.hasAttribute("picURL")) { + customPicURLs[setName] = attrs.value("picURL").toString(); + } + if (attrs.hasAttribute("picURLHq")) { + customPicURLsHq[setName] = attrs.value("picURLHq").toString(); + } } else if (xml.name() == "color") colors << xml.readElementText(); else if (xml.name() == "tablerow") @@ -665,7 +693,7 @@ void CardDatabase::loadCardsFromXml(QXmlStreamReader &xml) else if (xml.name() == "token") isToken = xml.readElementText().toInt(); } - addCard(new CardInfo(this, name, isToken, manacost, type, pt, text, colors, loyalty, cipt, tableRow, sets, muids)); + addCard(new CardInfo(this, name, isToken, manacost, type, pt, text, colors, loyalty, cipt, tableRow, sets, customPicURLs, customPicURLsHq, muids)); } } } diff --git a/cockatrice/src/carddatabase.h b/cockatrice/src/carddatabase.h index 3d1da9a2..bb151e7d 100644 --- a/cockatrice/src/carddatabase.h +++ b/cockatrice/src/carddatabase.h @@ -110,6 +110,7 @@ private: QString text; QStringList colors; int loyalty; + QStringMap customPicURLs, customPicURLsHq; MuidMap muIds; bool cipt; int tableRow; @@ -128,6 +129,8 @@ public: bool _cipt = false, int _tableRow = 0, const SetList &_sets = SetList(), + const QStringMap &_customPicURLs = QStringMap(), + const QStringMap &_customPicURLsHq = QStringMap(), MuidMap muids = MuidMap()); ~CardInfo(); const QString &getName() const { return name; } @@ -145,12 +148,16 @@ public: void setText(const QString &_text) { text = _text; emit cardInfoChanged(this); } void setColors(const QStringList &_colors) { colors = _colors; emit cardInfoChanged(this); } const QStringList &getColors() const { return colors; } + QString getCustomPicURL(const QString &set) const { return customPicURLs.value(set); } + QString getCustomPicURLHq(const QString &set) const { return customPicURLsHq.value(set); } int getMuId(const QString &set) const { return muIds.value(set); } QString getMainCardType() const; QString getCorrectedName() const; int getTableRow() const { return tableRow; } void setTableRow(int _tableRow) { tableRow = _tableRow; } void setLoyalty(int _loyalty) { loyalty = _loyalty; emit cardInfoChanged(this); } + void setCustomPicURL(const QString &_set, const QString &_customPicURL) { customPicURLs.insert(_set, _customPicURL); } + void setCustomPicURLHq(const QString &_set, const QString &_customPicURL) { customPicURLsHq.insert(_set, _customPicURL); } void setMuId(const QString &_set, const int &_muId) { muIds.insert(_set, _muId); } void addToSet(CardSet *set); QPixmap *loadPixmap(); From fe12f71b93fe377cea5a7055395fe637ae316326 Mon Sep 17 00:00:00 2001 From: Fabio Bas Date: Sun, 27 Jul 2014 00:26:12 +0200 Subject: [PATCH 14/19] Disable some usercontextmenu actions if the user is offline; fix #234 --- cockatrice/src/playerlistwidget.cpp | 2 +- cockatrice/src/user_context_menu.cpp | 7 ++++--- cockatrice/src/user_context_menu.h | 2 +- cockatrice/src/userlist.cpp | 5 +++-- 4 files changed, 9 insertions(+), 7 deletions(-) diff --git a/cockatrice/src/playerlistwidget.cpp b/cockatrice/src/playerlistwidget.cpp index ee088203..b535c2c1 100644 --- a/cockatrice/src/playerlistwidget.cpp +++ b/cockatrice/src/playerlistwidget.cpp @@ -178,5 +178,5 @@ void PlayerListWidget::showContextMenu(const QPoint &pos, const QModelIndex &ind int playerId = index.sibling(index.row(), 4).data(Qt::UserRole + 1).toInt(); UserLevelFlags userLevel(index.sibling(index.row(), 3).data(Qt::UserRole).toInt()); - userContextMenu->showContextMenu(pos, userName, userLevel, playerId); + userContextMenu->showContextMenu(pos, userName, userLevel, true, playerId); } diff --git a/cockatrice/src/user_context_menu.cpp b/cockatrice/src/user_context_menu.cpp index eab48f47..03ccdd37 100644 --- a/cockatrice/src/user_context_menu.cpp +++ b/cockatrice/src/user_context_menu.cpp @@ -102,7 +102,7 @@ void UserContextMenu::banUser_dialogFinished() client->sendCommand(client->prepareModeratorCommand(cmd)); } -void UserContextMenu::showContextMenu(const QPoint &pos, const QString &userName, UserLevelFlags userLevel, int playerId) +void UserContextMenu::showContextMenu(const QPoint &pos, const QString &userName, UserLevelFlags userLevel, bool online, int playerId) { aUserName->setText(userName); @@ -132,8 +132,9 @@ void UserContextMenu::showContextMenu(const QPoint &pos, const QString &userName menu->addAction(aBan); } bool anotherUser = userName != QString::fromStdString(tabSupervisor->getUserInfo()->name()); - aChat->setEnabled(anotherUser); - aShowGames->setEnabled(anotherUser); + aDetails->setEnabled(online); + aChat->setEnabled(anotherUser && online); + aShowGames->setEnabled(anotherUser && online); aAddToBuddyList->setEnabled(anotherUser); aRemoveFromBuddyList->setEnabled(anotherUser); aAddToIgnoreList->setEnabled(anotherUser); diff --git a/cockatrice/src/user_context_menu.h b/cockatrice/src/user_context_menu.h index 8e6708b0..9aeadfd4 100644 --- a/cockatrice/src/user_context_menu.h +++ b/cockatrice/src/user_context_menu.h @@ -36,7 +36,7 @@ private slots: public: UserContextMenu(const TabSupervisor *_tabSupervisor, QWidget *_parent, TabGame *_game = 0); void retranslateUi(); - void showContextMenu(const QPoint &pos, const QString &userName, UserLevelFlags userLevel, int playerId = -1); + void showContextMenu(const QPoint &pos, const QString &userName, UserLevelFlags userLevel, bool online = true, int playerId = -1); }; #endif diff --git a/cockatrice/src/userlist.cpp b/cockatrice/src/userlist.cpp index 29d13781..c6174a6e 100644 --- a/cockatrice/src/userlist.cpp +++ b/cockatrice/src/userlist.cpp @@ -311,8 +311,9 @@ void UserList::userClicked(QTreeWidgetItem *item, int /*column*/) void UserList::showContextMenu(const QPoint &pos, const QModelIndex &index) { const ServerInfo_User &userInfo = static_cast(userTree->topLevelItem(index.row()))->getUserInfo(); - - userContextMenu->showContextMenu(pos, QString::fromStdString(userInfo.name()), UserLevelFlags(userInfo.user_level())); + bool online = index.sibling(index.row(), 0).data(Qt::UserRole + 1).toBool(); + + userContextMenu->showContextMenu(pos, QString::fromStdString(userInfo.name()), UserLevelFlags(userInfo.user_level()), online); } void UserList::sortItems() From 689acc1e32ad4dd61729e1b2e677b06bd5bfb751 Mon Sep 17 00:00:00 2001 From: Waleed Khan Date: Sat, 26 Jul 2014 21:13:30 -0400 Subject: [PATCH 15/19] Fix #110: Price column is removed when the setting is disabled. --- cockatrice/src/tab_deck_editor.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/cockatrice/src/tab_deck_editor.cpp b/cockatrice/src/tab_deck_editor.cpp index e402ea11..c0138931 100644 --- a/cockatrice/src/tab_deck_editor.cpp +++ b/cockatrice/src/tab_deck_editor.cpp @@ -646,6 +646,7 @@ void TabDeckEditor::actDecrement() void TabDeckEditor::setPriceTagFeatureEnabled(int enabled) { aUpdatePrices->setVisible(enabled); + deckModel->pricesUpdated(); } void TabDeckEditor::actUpdatePrices() From c3a68fcbd36c3dca4927664f60d914fd107667c1 Mon Sep 17 00:00:00 2001 From: pliu037 Date: Sun, 27 Jul 2014 12:47:05 -0400 Subject: [PATCH 16/19] Cleaned up some lines of code --- cockatrice/src/carddatabase.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cockatrice/src/carddatabase.cpp b/cockatrice/src/carddatabase.cpp index 98e506b5..f3a0c72f 100644 --- a/cockatrice/src/carddatabase.cpp +++ b/cockatrice/src/carddatabase.cpp @@ -129,7 +129,7 @@ void PictureLoader::processLoadQueue() QString setName = ptl.getSetName(); QImage image; - if (!image.load(QString("%1/%2/%3.full.jpg").arg(picsPath).arg("CUSTOM").arg(correctedName))) + if (!image.load(QString("%1/%2/%3.full.jpg").arg(picsPath).arg("CUSTOM").arg(correctedName))) { if (!image.load(QString("%1/%2/%3.full.jpg").arg(picsPath).arg(setName).arg(correctedName))) //if (!image.load(QString("%1/%2/%3%4.full.jpg").arg(picsPath).arg(setName).arg(correctedName).arg(1))) if (!image.load(QString("%1/%2/%3/%4.full.jpg").arg(picsPath).arg("downloadedPics").arg(setName).arg(correctedName))) { @@ -143,8 +143,8 @@ void PictureLoader::processLoadQueue() else emit imageLoaded(ptl.getCard(), QImage()); } - continue; } + } emit imageLoaded(ptl.getCard(), image); } From 6b9daf3d15bea2fe8e18ff1c5a98b7ecc7ebb325 Mon Sep 17 00:00:00 2001 From: Fabio Bas Date: Sun, 27 Jul 2014 21:29:27 +0200 Subject: [PATCH 17/19] Enable Show this user's games" for offline users --- cockatrice/src/user_context_menu.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cockatrice/src/user_context_menu.cpp b/cockatrice/src/user_context_menu.cpp index 03ccdd37..df324653 100644 --- a/cockatrice/src/user_context_menu.cpp +++ b/cockatrice/src/user_context_menu.cpp @@ -134,7 +134,7 @@ void UserContextMenu::showContextMenu(const QPoint &pos, const QString &userName bool anotherUser = userName != QString::fromStdString(tabSupervisor->getUserInfo()->name()); aDetails->setEnabled(online); aChat->setEnabled(anotherUser && online); - aShowGames->setEnabled(anotherUser && online); + aShowGames->setEnabled(anotherUser); aAddToBuddyList->setEnabled(anotherUser); aRemoveFromBuddyList->setEnabled(anotherUser); aAddToIgnoreList->setEnabled(anotherUser); From 9e12c5b2d44caf3f02beee8bb81bfea07331e92d Mon Sep 17 00:00:00 2001 From: Fabio Bas Date: Sun, 27 Jul 2014 22:06:35 +0200 Subject: [PATCH 18/19] Use custom picUrl if picUrlHq is not defined --- cockatrice/src/carddatabase.cpp | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/cockatrice/src/carddatabase.cpp b/cockatrice/src/carddatabase.cpp index e216c10f..f77b98d5 100644 --- a/cockatrice/src/carddatabase.cpp +++ b/cockatrice/src/carddatabase.cpp @@ -153,12 +153,18 @@ QString PictureLoader::getPicUrl(CardInfo *card) { if (!picDownload) return 0; - // first check if a custom card url exists in cards.xml CardSet *set = card->getPreferredSet(); - QString picUrl = picDownloadHq ? - card->getCustomPicURLHq(set->getShortName()) : - card->getCustomPicURL(set->getShortName()); + QString picUrl = QString(""); + // first check if Hq is enabled and a custom Hq card url exists in cards.xml + if(picDownloadHq) + { + picUrl = card->getCustomPicURLHq(set->getShortName()); + if (!picUrl.isEmpty()) + return picUrl; + } + // then, test for a custom, non-Hq card url in cards.xml + picUrl = card->getCustomPicURL(set->getShortName()); if (!picUrl.isEmpty()) return picUrl; From 951e43b166c1876c2b40eaf3b0084995f4dfdae9 Mon Sep 17 00:00:00 2001 From: Gavin Bisesi Date: Wed, 30 Jul 2014 15:47:57 -0400 Subject: [PATCH 19/19] Update cmake build flags in README --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 61b44ed4..b2896773 100644 --- a/README.md +++ b/README.md @@ -34,8 +34,10 @@ To compile: The following flags can be passed to `cmake`: - `-DWITH_SERVER=1` Build the server -- `-DWITHOUT_CLIENT=1` Do not build the client +- `-DWITH_CLIENT=0` Do not build the client +- `-DWITH_ORACLE=0` Do not build Oracle - `-DWITH_QT4=1` Force compilation to use Qt4 instead of Qt5. +- `-DCMAKE_BUILD_TYPE=Debug` Compile in debug mode. Enables extra logging output, debug symbols, and much more verbose compiler warnings. # Running