diff options
| author | Ziek <TheMostSupremeZiek@gmail.com> | 2015-02-14 19:51:08 -0800 |
|---|---|---|
| committer | Ziek <TheMostSupremeZiek@gmail.com> | 2015-02-25 18:28:26 -0800 |
| commit | a629555e6bb227c2616fdc3312ffbcb80715af99 (patch) | |
| tree | afe754b53813ac39ac70d9f8047b7df5972ef191 /Source/Core | |
| parent | 1dea3780a7269cd7ec298578a335b065676b4ac9 (diff) | |
Added Gui elements in Netplay Setup Diag so a person can choose a traversal server
Fixed bug with UPnP so that it will grab the proper address and protocal
Fixed bug that caused dolphin to freeze when host codes were to large
Diffstat (limited to 'Source/Core')
| -rw-r--r-- | Source/Core/Common/TraversalClient.cpp | 13 | ||||
| -rw-r--r-- | Source/Core/Common/TraversalClient.h | 3 | ||||
| -rw-r--r-- | Source/Core/Common/TraversalProto.h | 4 | ||||
| -rw-r--r-- | Source/Core/Core/NetPlayClient.cpp | 20 | ||||
| -rw-r--r-- | Source/Core/Core/NetPlayClient.h | 2 | ||||
| -rw-r--r-- | Source/Core/Core/NetPlayServer.cpp | 15 | ||||
| -rw-r--r-- | Source/Core/Core/NetPlayServer.h | 2 | ||||
| -rw-r--r-- | Source/Core/DolphinWX/NetWindow.cpp | 104 | ||||
| -rw-r--r-- | Source/Core/DolphinWX/NetWindow.h | 4 |
9 files changed, 116 insertions, 51 deletions
diff --git a/Source/Core/Common/TraversalClient.cpp b/Source/Core/Common/TraversalClient.cpp index 736263090d..e9e6c5939b 100644 --- a/Source/Core/Common/TraversalClient.cpp +++ b/Source/Core/Common/TraversalClient.cpp @@ -12,13 +12,14 @@ static void GetRandomishBytes(u8* buf, size_t size) buf[i] = rand() & 0xff; } -TraversalClient::TraversalClient(ENetHost* netHost, const std::string& server) +TraversalClient::TraversalClient(ENetHost* netHost, const std::string& server, const u16 port) : m_NetHost(netHost) , m_Client(nullptr) , m_FailureReason(0) , m_ConnectRequestId(0) , m_PendingConnect(false) , m_Server(server) + , m_port(port) , m_PingTime(0) { netHost->intercept = TraversalClient::InterceptCallback; @@ -34,13 +35,12 @@ TraversalClient::~TraversalClient() void TraversalClient::ReconnectToServer() { - m_Server = "vps.qoid.us"; // XXX if (enet_address_set_host(&m_ServerAddress, m_Server.c_str())) { OnFailure(BadHost); return; } - m_ServerAddress.port = 6262; + m_ServerAddress.port = m_port; m_State = Connecting; @@ -326,12 +326,13 @@ static u16 g_OldPort; bool EnsureTraversalClient(const std::string& server, u16 port) { + if (!g_MainNetHost || !g_TraversalClient || server != g_OldServer || port != g_OldPort) { g_OldServer = server; - g_OldPort = port; + g_OldPort = port ; - ENetAddress addr = { ENET_HOST_ANY, port }; + ENetAddress addr = { ENET_HOST_ANY, 0 }; ENetHost* host = enet_host_create( &addr, // address 50, // peerCount @@ -344,7 +345,7 @@ bool EnsureTraversalClient(const std::string& server, u16 port) return false; } g_MainNetHost.reset(host); - g_TraversalClient.reset(new TraversalClient(g_MainNetHost.get(), server)); + g_TraversalClient.reset(new TraversalClient(g_MainNetHost.get(), server, port)); } return true; } diff --git a/Source/Core/Common/TraversalClient.h b/Source/Core/Common/TraversalClient.h index c248e919e6..ff76d7fc71 100644 --- a/Source/Core/Common/TraversalClient.h +++ b/Source/Core/Common/TraversalClient.h @@ -36,7 +36,7 @@ public: ResendTimeout, ConnectFailedError = 0x400, }; - TraversalClient(ENetHost* netHost, const std::string& server); + TraversalClient(ENetHost* netHost, const std::string& server, const u16 port); ~TraversalClient(); void Reset(); void ConnectToClient(const std::string& host); @@ -70,6 +70,7 @@ private: std::list<OutgoingTraversalPacketInfo> m_OutgoingTraversalPackets; ENetAddress m_ServerAddress; std::string m_Server; + u16 m_port; enet_uint32 m_PingTime; }; extern std::unique_ptr<TraversalClient> g_TraversalClient; diff --git a/Source/Core/Common/TraversalProto.h b/Source/Core/Common/TraversalProto.h index 32891beac6..5036c3dbcc 100644 --- a/Source/Core/Common/TraversalProto.h +++ b/Source/Core/Common/TraversalProto.h @@ -4,8 +4,8 @@ #include <array> #include "Common/CommonTypes.h" - -typedef std::array<char, 8> TraversalHostId; +#define NETPLAY_CODE_SIZE 8 +typedef std::array<char, NETPLAY_CODE_SIZE> TraversalHostId; typedef u64 TraversalRequestId; enum TraversalPacketType diff --git a/Source/Core/Core/NetPlayClient.cpp b/Source/Core/Core/NetPlayClient.cpp index 47ae698b86..3c38fac05c 100644 --- a/Source/Core/Core/NetPlayClient.cpp +++ b/Source/Core/Core/NetPlayClient.cpp @@ -55,7 +55,7 @@ NetPlayClient::~NetPlayClient() } // called from ---GUI--- thread -NetPlayClient::NetPlayClient(const std::string& address, const u16 port, NetPlayUI* dialog, const std::string& name, bool traversal) +NetPlayClient::NetPlayClient(const std::string& address, const u16 port, NetPlayUI* dialog, const std::string& name, bool traversal, std::string centralServer, u16 centralPort) : m_state(Failure) , m_dialog(dialog) , m_client(nullptr) @@ -113,8 +113,13 @@ NetPlayClient::NetPlayClient(const std::string& address, const u16 port, NetPlay } else { - //Traversal Server - if (!EnsureTraversalClient("dolphin-emu.org", 0)) + if (address.size() > NETPLAY_CODE_SIZE) + { + PanicAlertT("Host code size is to large.\nPlease recheck that you have the correct code"); + return; + } + + if (!EnsureTraversalClient(centralServer, centralPort)) return; m_client = g_MainNetHost.get(); @@ -446,8 +451,13 @@ void NetPlayClient::Send(sf::Packet& packet) void NetPlayClient::Disconnect() { ENetEvent netEvent; + m_connecting = false; m_state = Failure; - enet_peer_disconnect(m_server, 0); + if (m_server) + enet_peer_disconnect(m_server, 0); + else + return; + while (enet_host_service(m_client, &netEvent, 3000) > 0) { switch (netEvent.type) @@ -539,7 +549,7 @@ void NetPlayClient::GetPlayerList(std::string& list, std::vector<int>& pid_list) else ss << '-'; } - ss << " | " << player->ping << "ms\n"; + ss << " |\nPing: " << player->ping << "ms\n\n"; pid_list.push_back(player->pid); } diff --git a/Source/Core/Core/NetPlayClient.h b/Source/Core/Core/NetPlayClient.h index c6e39eb099..ab5763d313 100644 --- a/Source/Core/Core/NetPlayClient.h +++ b/Source/Core/Core/NetPlayClient.h @@ -48,7 +48,7 @@ class NetPlayClient : public TraversalClientClient public: void ThreadFunc(); - NetPlayClient(const std::string& address, const u16 port, NetPlayUI* dialog, const std::string& name, bool traversal); + NetPlayClient(const std::string& address, const u16 port, NetPlayUI* dialog, const std::string& name, bool traversal, std::string centralServer, u16 centralPort); ~NetPlayClient(); void GetPlayerList(std::string& list, std::vector<int>& pid_list); diff --git a/Source/Core/Core/NetPlayServer.cpp b/Source/Core/Core/NetPlayServer.cpp index 03ef95523c..79acbb6918 100644 --- a/Source/Core/Core/NetPlayServer.cpp +++ b/Source/Core/Core/NetPlayServer.cpp @@ -4,6 +4,7 @@ #include <string> #include <vector> +#include "Common/IniFile.h" #include "Common/StdMakeUnique.h" #include "Common/StringUtil.h" #include "Core/NetPlayClient.h" //for NetPlayUI @@ -50,7 +51,7 @@ NetPlayServer::~NetPlayServer() } // called from ---GUI--- thread -NetPlayServer::NetPlayServer(const u16 port, bool traversal) +NetPlayServer::NetPlayServer(const u16 port, bool traversal, std::string centralServer, u16 centralPort) : is_connected(false) , m_is_running(false) , m_do_loop(false) @@ -73,7 +74,7 @@ NetPlayServer::NetPlayServer(const u16 port, bool traversal) memset(m_wiimote_map, -1, sizeof(m_wiimote_map)); if (traversal) { - if (!EnsureTraversalClient("dolphin-emu.org", 0)) + if (!EnsureTraversalClient(centralServer, centralPort)) return; g_TraversalClient->m_Client = this; @@ -797,10 +798,10 @@ void NetPlayServer::TryPortmapping(u16 port) // UPnP thread: try to map a port void NetPlayServer::mapPortThread(const u16 port) { - ENetAddress adr; + ENetAddress adr = { ENET_HOST_ANY, port }; char cIP[20]; - enet_address_get_host_ip(&adr, cIP, 20); + enet_address_get_host(&adr, cIP, 20); std::string ourIP(cIP); if (!m_upnp_inited) @@ -895,8 +896,8 @@ bool NetPlayServer::UPnPMapPort(const std::string& addr, const u16 port) std::string port_str = StringFromFormat("%d", port); int result = UPNP_AddPortMapping(m_upnp_urls.controlURL, m_upnp_data.first.servicetype, port_str.c_str(), port_str.c_str(), addr.c_str(), - (std::string("dolphin-emu TCP on ") + addr).c_str(), - "TCP", nullptr, nullptr); + (std::string("dolphin-emu UDP on ") + addr).c_str(), + "UDP", nullptr, nullptr); if (result != 0) return false; @@ -918,7 +919,7 @@ bool NetPlayServer::UPnPUnmapPort(const u16 port) { std::string port_str = StringFromFormat("%d", port); UPNP_DeletePortMapping(m_upnp_urls.controlURL, m_upnp_data.first.servicetype, - port_str.c_str(), "TCP", nullptr); + port_str.c_str(), "UDP", nullptr); return true; } diff --git a/Source/Core/Core/NetPlayServer.h b/Source/Core/Core/NetPlayServer.h index 93e28afb57..5e8ac76411 100644 --- a/Source/Core/Core/NetPlayServer.h +++ b/Source/Core/Core/NetPlayServer.h @@ -21,7 +21,7 @@ class NetPlayServer : public TraversalClientClient public: void ThreadFunc(); - NetPlayServer(const u16 port, bool traversal); + NetPlayServer(const u16 port, bool traversal, std::string centralServer, u16 centralPort); ~NetPlayServer(); bool ChangeGame(const std::string& game); diff --git a/Source/Core/DolphinWX/NetWindow.cpp b/Source/Core/DolphinWX/NetWindow.cpp index c06348be5f..0768b615ed 100644 --- a/Source/Core/DolphinWX/NetWindow.cpp +++ b/Source/Core/DolphinWX/NetWindow.cpp @@ -105,16 +105,49 @@ NetPlaySetupDiag::NetPlaySetupDiag(wxWindow* const parent, const CGameListCtrl* wxPanel* const panel = new wxPanel(this); // top row - wxStaticText* const nick_lbl = new wxStaticText(panel, wxID_ANY, _("Nickname :")); + wxBoxSizer* const trav_szr = new wxBoxSizer(wxHORIZONTAL); + + m_direct_traversal = new wxChoice(panel, wxID_ANY, wxDefaultPosition, wxSize(75, -1)); + m_direct_traversal->Bind(wxEVT_COMMAND_CHOICE_SELECTED, &NetPlaySetupDiag::OnChoice, this); + m_direct_traversal->Append(_("Direct")); + m_direct_traversal->Append(_("Traversal")); + std::string travChoice; + netplay_section.Get("TraversalChoice", &travChoice, "direct"); + + if (travChoice == "traversal") + { + m_direct_traversal->Select(1); + } + else + { + m_direct_traversal->Select(0); + } + + trav_szr->Add(m_direct_traversal, 0, wxRIGHT); + + wxBoxSizer* const nick_szr = new wxBoxSizer(wxHORIZONTAL); + wxStaticText* const nick_lbl = new wxStaticText(panel, wxID_ANY, _("Nickname :")); std::string nickname; netplay_section.Get("Nickname", &nickname, "Player"); m_nickname_text = new wxTextCtrl(panel, wxID_ANY, StrToWxStr(nickname)); - - wxBoxSizer* const nick_szr = new wxBoxSizer(wxHORIZONTAL); nick_szr->Add(nick_lbl, 0, wxCENTER); nick_szr->Add(m_nickname_text, 0, wxALL, 5); + std::string centralServer; + netplay_section.Get("TraversalServer", ¢ralServer, "vps.qoid.us"); + m_traversal_server_lbl = new wxStaticText(panel, wxID_ANY, _("Traversal:")); + m_traversal_server = new wxTextCtrl(panel, wxID_ANY, StrToWxStr(centralServer)); + nick_szr->Add(m_traversal_server_lbl, 0, wxCENTER); + nick_szr->Add(m_traversal_server, 0, wxALL, 5); + + std::string centralPort; + netplay_section.Get("TraversalPort", ¢ralPort, "6262"); + m_traversal_port_lbl = new wxStaticText(panel, wxID_ANY, _("Port:")); + m_traversal_port = new wxTextCtrl(panel, wxID_ANY, StrToWxStr(centralPort)); + nick_szr->Add(m_traversal_port_lbl, 0, wxCENTER); + nick_szr->Add(m_traversal_port, 0, wxALL, 5); + // tabs wxNotebook* const notebook = new wxNotebook(panel, wxID_ANY); wxPanel* const connect_tab = new wxPanel(notebook, wxID_ANY); @@ -122,12 +155,6 @@ NetPlaySetupDiag::NetPlaySetupDiag(wxWindow* const parent, const CGameListCtrl* wxPanel* const host_tab = new wxPanel(notebook, wxID_ANY); notebook->AddPage(host_tab, _("Host")); - m_direct_traversal = new wxChoice(panel, wxID_ANY, wxDefaultPosition, wxSize(75, -1)); - m_direct_traversal->Bind(wxEVT_COMMAND_CHOICE_SELECTED, &NetPlaySetupDiag::OnChoice, this); - m_direct_traversal->Append(_("Traversal")); - m_direct_traversal->Append(_("Direct")); - m_direct_traversal->Select(0); - // connect tab { m_ip_lbl = new wxStaticText(connect_tab, wxID_ANY, _("Host Code :")); @@ -215,7 +242,8 @@ NetPlaySetupDiag::NetPlaySetupDiag(wxWindow* const parent, const CGameListCtrl* // main sizer wxBoxSizer* const main_szr = new wxBoxSizer(wxVERTICAL); - main_szr->Add(nick_szr, 0, wxALL | wxALIGN_RIGHT, 5); + main_szr->Add(trav_szr, 0, wxALL | wxALIGN_LEFT); + main_szr->Add(nick_szr, 0, wxALL | wxALIGN_LEFT, 5); main_szr->Add(notebook, 1, wxLEFT | wxRIGHT | wxEXPAND, 5); main_szr->Add(quit_btn, 0, wxALL | wxALIGN_RIGHT, 5); @@ -231,18 +259,8 @@ NetPlaySetupDiag::NetPlaySetupDiag(wxWindow* const parent, const CGameListCtrl* Show(); // Needs to be done last or it set up the spacing on the page correctly - //client tab - { - m_client_port_lbl->Show(false); - m_connect_port_text->Show(false); - } - - //server tab - { - m_host_port_lbl->Show(false); - m_host_port_text->Show(false); - m_upnp_chk->Show(false); - } + wxCommandEvent ev; + OnChoice(ev); } @@ -253,8 +271,22 @@ NetPlaySetupDiag::~NetPlaySetupDiag() inifile.Load(dolphin_ini); IniFile::Section& netplay_section = *inifile.GetOrCreateSection("NetPlay"); + std::string travChoice = "traversal"; + if (m_direct_traversal->GetSelection() == 1) + { + netplay_section.Set("TraversalChoice", travChoice); + } + else + { + travChoice = "direct"; + netplay_section.Set("TraversalChoice", travChoice); + } + netplay_section.Set("Nickname", WxStrToStr(m_nickname_text->GetValue())); - if (m_direct_traversal->GetCurrentSelection() == 1) + netplay_section.Set("TraversalServer", WxStrToStr(m_traversal_server->GetValue())); + netplay_section.Set("TraversalPort", WxStrToStr(m_traversal_port->GetValue())); + + if (m_direct_traversal->GetCurrentSelection() == 0) { netplay_section.Set("Address", WxStrToStr(m_connect_ip_text->GetValue())); } @@ -280,12 +312,14 @@ void NetPlaySetupDiag::MakeNetPlayDiag(int port, const std::string &game, bool i ip = WxStrToStr(m_connect_ip_text->GetValue()); bool trav; - if (!is_hosting && m_direct_traversal->GetCurrentSelection() == 0) + if (!is_hosting && m_direct_traversal->GetCurrentSelection() == 1) trav = true; else trav = false; - netplay_client = new NetPlayClient(ip, (u16)port, npd, WxStrToStr(m_nickname_text->GetValue()), trav); + unsigned long centralPort = 0; + m_traversal_port->GetValue().ToULong(¢ralPort); + netplay_client = new NetPlayClient(ip, (u16)port, npd, WxStrToStr(m_nickname_text->GetValue()), trav, WxStrToStr(m_traversal_server->GetValue()), (u16)centralPort); if (netplay_client->is_connected) { npd->Show(); @@ -315,14 +349,17 @@ void NetPlaySetupDiag::OnHost(wxCommandEvent&) std::string game(WxStrToStr(m_game_lbox->GetStringSelection())); bool trav; - if (m_direct_traversal->GetCurrentSelection() == 0) + if (m_direct_traversal->GetCurrentSelection() == 1) trav = true; else trav = false; unsigned long port = 0; m_host_port_text->GetValue().ToULong(&port); - netplay_server = new NetPlayServer(u16(port), trav); + + unsigned long centralPort = 0; + m_traversal_port->GetValue().ToULong(¢ralPort); + netplay_server = new NetPlayServer(u16(port), trav, WxStrToStr(m_traversal_server->GetValue()), u16(centralPort)); netplay_server->ChangeGame(game); netplay_server->AdjustPadBufferSize(INITIAL_PAD_BUFFER_SIZE); if (netplay_server->is_connected) @@ -361,8 +398,14 @@ void NetPlaySetupDiag::OnChoice(wxCommandEvent& event) inifile.Load(File::GetUserPath(D_CONFIG_IDX) + "Dolphin.ini"); IniFile::Section& netplay_section = *inifile.GetOrCreateSection("NetPlay"); - if (sel == 0) + if (sel == 1) { + m_traversal_server_lbl->Show(true); + m_traversal_server->Show(true); + + m_traversal_port_lbl->Show(true); + m_traversal_port->Show(true); + //Traversal //client tab { @@ -385,6 +428,11 @@ void NetPlaySetupDiag::OnChoice(wxCommandEvent& event) } else { + m_traversal_server_lbl->Show(false); + m_traversal_server->Show(false); + + m_traversal_port_lbl->Show(false); + m_traversal_port->Show(false); //Direct //client tab { diff --git a/Source/Core/DolphinWX/NetWindow.h b/Source/Core/DolphinWX/NetWindow.h index 03dc0b5def..d5b2ef12b6 100644 --- a/Source/Core/DolphinWX/NetWindow.h +++ b/Source/Core/DolphinWX/NetWindow.h @@ -52,6 +52,10 @@ private: wxTextCtrl* m_connect_port_text; wxTextCtrl* m_connect_ip_text; wxChoice* m_direct_traversal; + wxStaticText* m_traversal_server_lbl; + wxTextCtrl* m_traversal_server; + wxStaticText* m_traversal_port_lbl; + wxTextCtrl* m_traversal_port; wxListBox* m_game_lbox; #ifdef USE_UPNP |
