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)