From 94bfb43999a70abd04d91441150e5ad286278ad1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jaakko=20Ker=C3=A4nen?= Date: Wed, 5 Feb 2014 20:55:54 +0200 Subject: [PATCH] Client|UI|Network: Game selection menu fetches games from master server The client's ServerFinder can now fetch servers from the master server. Currently this is done when MPSelectionWidget is created, however it should also be doable manually. --- doomsday/client/include/network/serverlink.h | 5 ++ doomsday/client/src/network/masterserver.cpp | 2 +- doomsday/client/src/network/serverlink.cpp | 66 +++++++++++++++++-- .../src/ui/widgets/gameselectionwidget.cpp | 2 +- .../src/ui/widgets/mpselectionwidget.cpp | 2 + 5 files changed, 69 insertions(+), 8 deletions(-) diff --git a/doomsday/client/include/network/serverlink.h b/doomsday/client/include/network/serverlink.h index 9202d3896d..0c99046a40 100644 --- a/doomsday/client/include/network/serverlink.h +++ b/doomsday/client/include/network/serverlink.h @@ -61,6 +61,11 @@ class ServerLink : public de::shell::AbstractLink */ void discover(de::String const &domain); + /** + * Asks the master server for information about currently running servers. + */ + void discoverUsingMaster(); + bool isDiscovering() const; int foundServerCount() const; diff --git a/doomsday/client/src/network/masterserver.cpp b/doomsday/client/src/network/masterserver.cpp index 682d3510de..7bbac7f76b 100644 --- a/doomsday/client/src/network/masterserver.cpp +++ b/doomsday/client/src/network/masterserver.cpp @@ -241,7 +241,7 @@ bool MasterWorker::parseResponse(const QByteArray& response) } } - LOG_NET_MSG("Received %i servers") << serverCount(); + LOG_NET_MSG("Received %i servers from master") << serverCount(); Str_Free(&line); Str_Free(&msg); diff --git a/doomsday/client/src/network/serverlink.cpp b/doomsday/client/src/network/serverlink.cpp index 69db720e58..0b1bcb7aae 100644 --- a/doomsday/client/src/network/serverlink.cpp +++ b/doomsday/client/src/network/serverlink.cpp @@ -18,14 +18,18 @@ #include "de_platform.h" #include "network/serverlink.h" - +#include "network/masterserver.h" #include "network/net_main.h" #include "network/net_buf.h" #include "network/net_demo.h" +#include "network/net_event.h" #include "network/protocol.h" #include "client/cl_def.h" #include "dd_def.h" + +#include #include +#include #include #include #include @@ -45,19 +49,25 @@ enum LinkState }; DENG2_PIMPL(ServerLink) +, DENG2_OBSERVES(Loop, Iteration) { shell::ServerFinder finder; ///< Finding local servers. LinkState state; + bool fetching; typedef QMap Servers; Servers discovered; + Servers fromMaster; Instance(Public *i) - : Base(i), - state(None) + : Base(i) + , state(None) + , fetching(false) {} ~Instance() - {} + { + Loop::appLoop().audienceForIteration -= this; + } void notifyDiscoveryUpdate() { @@ -166,12 +176,50 @@ DENG2_PIMPL(ServerLink) return true; } + void fetchFromMaster() + { + if(fetching) return; + + fetching = true; + N_MAPost(MAC_REQUEST); + N_MAPost(MAC_WAIT); + Loop::appLoop().audienceForIteration += this; + } + + void loopIteration() + { + DENG2_ASSERT(fetching); + + if(N_MADone()) + { + fetching = false; + Loop::appLoop().audienceForIteration -= this; + + fromMaster.clear(); + int const count = N_MasterGet(0, 0); + for(int i = 0; i < count; i++) + { + serverinfo_t info; + N_MasterGet(i, &info); + fromMaster.insert(Address::parse(info.address, info.port), info); + } + + notifyDiscoveryUpdate(); + } + } + Servers allFound() const { Servers all = discovered; + // Append from master (if available). + DENG2_FOR_EACH_CONST(Servers, i, fromMaster) + { + all.insert(i.key(), i.value()); + } + // Append the ones from the server finder. - foreach(Address sv, finder.foundServers()) + foreach(Address const &sv, finder.foundServers()) { serverinfo_t info; ServerInfo_FromRecord(&info, finder.messageFromServer(sv)); @@ -271,9 +319,15 @@ void ServerLink::discover(String const &domain) d->state = Discovering; } +void ServerLink::discoverUsingMaster() +{ + d->fetchFromMaster(); +} + bool ServerLink::isDiscovering() const { - return (d->state == Discovering || d->state == WaitingForInfoResponse); + return (d->state == Discovering || d->state == WaitingForInfoResponse || + d->fetching); } int ServerLink::foundServerCount() const diff --git a/doomsday/client/src/ui/widgets/gameselectionwidget.cpp b/doomsday/client/src/ui/widgets/gameselectionwidget.cpp index 5169f19d21..d672b918a9 100644 --- a/doomsday/client/src/ui/widgets/gameselectionwidget.cpp +++ b/doomsday/client/src/ui/widgets/gameselectionwidget.cpp @@ -83,7 +83,7 @@ DENG_GUI_PIMPL(GameSelectionWidget) owner->self.add(makeTitle(headingText)); title().setFont("title"); title().setTextColor("inverted.text"); - title().setHoverTextColor("inverted.accent", ButtonWidget::ReplaceColor); + title().setHoverTextColor("inverted.text", ButtonWidget::ReplaceColor); title().setAlignment(ui::AlignLeft); title().margins().setLeft(""); diff --git a/doomsday/client/src/ui/widgets/mpselectionwidget.cpp b/doomsday/client/src/ui/widgets/mpselectionwidget.cpp index feacaf4058..8bc0c93010 100644 --- a/doomsday/client/src/ui/widgets/mpselectionwidget.cpp +++ b/doomsday/client/src/ui/widgets/mpselectionwidget.cpp @@ -228,6 +228,8 @@ MPSelectionWidget::MPSelectionWidget() : MenuWidget("mp-selection"), d(new Instance(this)) { setGridSize(3, ui::Filled, 0, ui::Expand); + + d->link().discoverUsingMaster(); } void MPSelectionWidget::setColumns(int numberOfColumns)