updating hilnius branch
git-svn-id: svn+ssh://svn.code.sf.net/p/supertuxkart/code/main/branches/hilnius@13151 178a84e3-b1eb-0310-8ba1-8eac791a3b58
This commit is contained in:
@@ -25,6 +25,7 @@
|
||||
#include "network/protocols/hide_public_address.hpp"
|
||||
#include "network/protocols/request_connection.hpp"
|
||||
#include "network/protocols/ping_protocol.hpp"
|
||||
#include "network/protocols/quick_join_protocol.hpp"
|
||||
#include "network/protocols/lobby_room_protocol.hpp"
|
||||
#include "online/current_online_user.hpp"
|
||||
#include "utils/time.hpp"
|
||||
@@ -32,10 +33,21 @@
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
ConnectToServer::ConnectToServer() :
|
||||
Protocol(NULL, PROTOCOL_CONNECTION)
|
||||
{
|
||||
m_server_id = 0;
|
||||
m_quick_join = true;
|
||||
m_state = NONE;
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
ConnectToServer::ConnectToServer(uint32_t server_id) :
|
||||
Protocol(NULL, PROTOCOL_CONNECTION)
|
||||
{
|
||||
m_server_id = server_id;
|
||||
m_quick_join = false;
|
||||
m_state = NONE;
|
||||
}
|
||||
|
||||
@@ -78,44 +90,57 @@ void ConnectToServer::update()
|
||||
case NONE:
|
||||
{
|
||||
m_current_protocol_id = m_listener->requestStart(new GetPublicAddress(&m_public_address));
|
||||
m_state = WAITING_SELF_ADDRESS;
|
||||
m_state = GETTING_SELF_ADDRESS;
|
||||
break;
|
||||
}
|
||||
case WAITING_SELF_ADDRESS:
|
||||
case GETTING_SELF_ADDRESS:
|
||||
if (m_listener->getProtocolState(m_current_protocol_id)
|
||||
== PROTOCOL_STATE_TERMINATED) // now we know the public addr
|
||||
{
|
||||
m_state = SELF_ADDRESS_KNOWN;
|
||||
m_state = SHOWING_SELF_ADDRESS;
|
||||
NetworkManager::getInstance()->setPublicAddress(m_public_address); // set our public address
|
||||
m_current_protocol_id = m_listener->requestStart(new GetPeerAddress(m_server_id, &m_server_address));
|
||||
m_current_protocol_id = m_listener->requestStart(new ShowPublicAddress());
|
||||
/*
|
||||
if (m_quick_join)
|
||||
m_current_protocol_id = m_listener->requestStart(new QuickJoinProtocol(&m_server_address, &m_server_id));
|
||||
else
|
||||
m_current_protocol_id = m_listener->requestStart(new GetPeerAddress(m_server_id, &m_server_address));*/
|
||||
}
|
||||
break;
|
||||
case SELF_ADDRESS_KNOWN:
|
||||
case SHOWING_SELF_ADDRESS:
|
||||
if (m_listener->getProtocolState(m_current_protocol_id)
|
||||
== PROTOCOL_STATE_TERMINATED) // now we have the server's address
|
||||
== PROTOCOL_STATE_TERMINATED) // now our public address is in the database
|
||||
{
|
||||
if (m_server_address.ip == 0 || m_server_address.port == 0)
|
||||
if (m_quick_join)
|
||||
{
|
||||
m_current_protocol_id = m_listener->requestStart(new QuickJoinProtocol(&m_server_address, &m_server_id));
|
||||
m_state = REQUESTING_CONNECTION;
|
||||
}
|
||||
else
|
||||
{
|
||||
m_current_protocol_id = m_listener->requestStart(new GetPeerAddress(m_server_id, &m_server_address));
|
||||
m_state = GETTING_SERVER_ADDRESS;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case GETTING_SERVER_ADDRESS:
|
||||
if (m_listener->getProtocolState(m_current_protocol_id)
|
||||
== PROTOCOL_STATE_TERMINATED) // we know the server address
|
||||
{
|
||||
m_state = REQUESTING_CONNECTION;
|
||||
m_current_protocol_id = m_listener->requestStart(new RequestConnection(m_server_id));
|
||||
}
|
||||
break;
|
||||
case REQUESTING_CONNECTION:
|
||||
if (m_listener->getProtocolState(m_current_protocol_id)
|
||||
== PROTOCOL_STATE_TERMINATED) // server knows we wanna connect
|
||||
{
|
||||
if (m_server_address.ip == 0 || m_server_address.port == 0)
|
||||
{ // server data not correct, hide address and stop
|
||||
m_state = HIDING_ADDRESS;
|
||||
m_current_protocol_id = m_listener->requestStart(new HidePublicAddress());
|
||||
return;
|
||||
}
|
||||
m_state = PEER_ADDRESS_KNOWN;
|
||||
m_current_protocol_id = m_listener->requestStart(new ShowPublicAddress());
|
||||
}
|
||||
break;
|
||||
case PEER_ADDRESS_KNOWN:
|
||||
if (m_listener->getProtocolState(m_current_protocol_id)
|
||||
== PROTOCOL_STATE_TERMINATED) // now our public address is public
|
||||
{
|
||||
m_state = SELF_ADDRESS_SHOWN;
|
||||
m_current_protocol_id = m_listener->requestStart(new RequestConnection(m_server_id));
|
||||
}
|
||||
break;
|
||||
case SELF_ADDRESS_SHOWN:
|
||||
if (m_listener->getProtocolState(m_current_protocol_id)
|
||||
== PROTOCOL_STATE_TERMINATED) // we have put a request to access the server
|
||||
{
|
||||
m_state = CONNECTING;
|
||||
m_current_protocol_id = m_listener->requestStart(new PingProtocol(m_server_address, 2.0));
|
||||
}
|
||||
|
||||
@@ -26,7 +26,8 @@
|
||||
class ConnectToServer : public Protocol, public CallbackObject
|
||||
{
|
||||
public:
|
||||
ConnectToServer(uint32_t server_id);
|
||||
ConnectToServer(); //!< Quick join
|
||||
ConnectToServer(uint32_t server_id); //!< Specify server id
|
||||
virtual ~ConnectToServer();
|
||||
|
||||
virtual void notifyEvent(Event* event);
|
||||
@@ -38,14 +39,15 @@ class ConnectToServer : public Protocol, public CallbackObject
|
||||
TransportAddress m_public_address;
|
||||
uint32_t m_server_id;
|
||||
uint32_t m_current_protocol_id;
|
||||
bool m_quick_join;
|
||||
|
||||
enum STATE
|
||||
{
|
||||
NONE,
|
||||
WAITING_SELF_ADDRESS,
|
||||
SELF_ADDRESS_KNOWN,
|
||||
PEER_ADDRESS_KNOWN,
|
||||
SELF_ADDRESS_SHOWN,
|
||||
GETTING_SELF_ADDRESS,
|
||||
SHOWING_SELF_ADDRESS,
|
||||
GETTING_SERVER_ADDRESS,
|
||||
REQUESTING_CONNECTION,
|
||||
CONNECTING,
|
||||
CONNECTED,
|
||||
HIDING_ADDRESS,
|
||||
|
||||
65
src/network/protocols/quick_join_protocol.cpp
Normal file
65
src/network/protocols/quick_join_protocol.cpp
Normal file
@@ -0,0 +1,65 @@
|
||||
#include "quick_join_protocol.hpp"
|
||||
|
||||
#include "network/network_manager.hpp"
|
||||
#include "online/current_online_user.hpp"
|
||||
#include "online/http_connector.hpp"
|
||||
#include "config/user_config.hpp"
|
||||
#include "utils/log.hpp"
|
||||
|
||||
QuickJoinProtocol::QuickJoinProtocol(CallbackObject* callback_object, uint32_t* server_id) : Protocol(callback_object, PROTOCOL_SILENT)
|
||||
{
|
||||
m_server_id = server_id;
|
||||
}
|
||||
|
||||
QuickJoinProtocol::~QuickJoinProtocol()
|
||||
{
|
||||
}
|
||||
|
||||
void QuickJoinProtocol::notifyEvent(Event* event)
|
||||
{
|
||||
}
|
||||
|
||||
void QuickJoinProtocol::setup()
|
||||
{
|
||||
m_state = NONE;
|
||||
}
|
||||
|
||||
void QuickJoinProtocol::update()
|
||||
{
|
||||
if (m_state == NONE)
|
||||
{
|
||||
TransportAddress addr = NetworkManager::getInstance()->getPublicAddress();
|
||||
HTTPConnector * connector = new HTTPConnector((std::string)UserConfigParams::m_server_multiplayer + "address-management.php");
|
||||
connector->setParameter("id",CurrentOnlineUser::get()->getUserID());
|
||||
connector->setParameter("token",CurrentOnlineUser::get()->getToken());
|
||||
connector->setParameter("action","quick-join");
|
||||
|
||||
const XMLNode * result = connector->getXMLFromPage();
|
||||
std::string rec_success;
|
||||
TransportAddress* res = static_cast<TransportAddress*>(m_callback_object);
|
||||
|
||||
if(result->get("success", &rec_success))
|
||||
{
|
||||
if(rec_success == "yes")
|
||||
{
|
||||
result->get("ip", &res->ip);
|
||||
result->get("port", &res->port);
|
||||
result->get("hostid", m_server_id);
|
||||
Log::info("QuickJoinProtocol", "Quick joining %d:%d (server#%d).", res->ip, res->port, *m_server_id);
|
||||
}
|
||||
else
|
||||
{
|
||||
Log::error("QuickJoinProtocol", "Fail to quick join.");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Log::error("QuickJoinProtocol", "Fail to quick join.");
|
||||
}
|
||||
m_state = DONE;
|
||||
}
|
||||
else if (m_state == DONE)
|
||||
{
|
||||
m_listener->requestTerminate(this);
|
||||
}
|
||||
}
|
||||
27
src/network/protocols/quick_join_protocol.hpp
Normal file
27
src/network/protocols/quick_join_protocol.hpp
Normal file
@@ -0,0 +1,27 @@
|
||||
#ifndef QUICK_JOIN_PROTOCOL_HPP
|
||||
#define QUICK_JOIN_PROTOCOL_HPP
|
||||
|
||||
#include "network/protocol.hpp"
|
||||
|
||||
|
||||
class QuickJoinProtocol : public Protocol
|
||||
{
|
||||
public:
|
||||
QuickJoinProtocol(CallbackObject* callback_object, uint32_t* server_id);
|
||||
virtual ~QuickJoinProtocol();
|
||||
|
||||
virtual void notifyEvent(Event* event);
|
||||
virtual void setup();
|
||||
virtual void update();
|
||||
|
||||
protected:
|
||||
uint32_t* m_server_id;
|
||||
enum STATE
|
||||
{
|
||||
NONE,
|
||||
DONE
|
||||
};
|
||||
STATE m_state;
|
||||
};
|
||||
|
||||
#endif // QUICK_JOIN_PROTOCOL_HPP
|
||||
Reference in New Issue
Block a user