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:
hilnius
2013-07-09 17:37:45 +00:00
parent 7cf9cfa8d9
commit ae2e656059
4 changed files with 147 additions and 28 deletions

View File

@@ -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));
}

View File

@@ -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,

View 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);
}
}

View 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