Signing out is now also asynchronous. Made the extending of the requests easier.
git-svn-id: svn+ssh://svn.code.sf.net/p/supertuxkart/code/main/branches/uni@13293 178a84e3-b1eb-0310-8ba1-8eac791a3b58
This commit is contained in:
@@ -112,14 +112,12 @@ namespace Online{
|
||||
CurrentUser::SignInRequest * request = NULL;
|
||||
if(m_state != SIGNED_IN && UserConfigParams::m_saved_session)
|
||||
{
|
||||
request = new CurrentUser::SignInRequest((std::string)UserConfigParams::m_server_multiplayer + "client-user.php");
|
||||
request = new CurrentUser::SignInRequest();
|
||||
request->setURL((std::string)UserConfigParams::m_server_multiplayer + "client-user.php");
|
||||
request->setParameter("action",std::string("saved-session"));
|
||||
request->setParameter("userid", UserConfigParams::m_saved_user);
|
||||
request->setParameter("token", UserConfigParams::m_saved_token.c_str());
|
||||
if(!HTTPManager::get()->addRequest(request))
|
||||
{
|
||||
assert(false);
|
||||
}
|
||||
HTTPManager::get()->addRequest(request);
|
||||
m_state = SIGNING_IN;
|
||||
}
|
||||
return request;
|
||||
@@ -134,14 +132,12 @@ namespace Online{
|
||||
{
|
||||
assert(m_state == SIGNED_OUT);
|
||||
m_save_session = save_session;
|
||||
CurrentUser::SignInRequest * request = new CurrentUser::SignInRequest((std::string)UserConfigParams::m_server_multiplayer + "client-user.php");
|
||||
CurrentUser::SignInRequest * request = new CurrentUser::SignInRequest();
|
||||
request->setURL((std::string)UserConfigParams::m_server_multiplayer + "client-user.php");
|
||||
request->setParameter("action",std::string("connect"));
|
||||
request->setParameter("username",username);
|
||||
request->setParameter("password",password);
|
||||
if(!HTTPManager::get()->addRequest(request))
|
||||
{
|
||||
assert(false);
|
||||
}
|
||||
HTTPManager::get()->addRequest(request);
|
||||
m_state = SIGNING_IN;
|
||||
return request;
|
||||
}
|
||||
@@ -192,14 +188,14 @@ namespace Online{
|
||||
XMLRequest * CurrentUser::createServerRequest ( const irr::core::stringw &name, int max_players)
|
||||
{
|
||||
assert(m_state == SIGNED_IN);
|
||||
XMLRequest * request = new XMLRequest((std::string)UserConfigParams::m_server_multiplayer + "client-user.php");
|
||||
XMLRequest * request = NULL;//new XMLRequest();
|
||||
request->setURL((std::string)UserConfigParams::m_server_multiplayer + "client-user.php");
|
||||
request->setParameter("action", std::string("create_server"));
|
||||
request->setParameter("token", m_token);
|
||||
request->setParameter("userid", m_id);
|
||||
request->setParameter("name", name);
|
||||
request->setParameter("max_players", max_players);
|
||||
if(!HTTPManager::get()->addRequest(request))
|
||||
assert(false);
|
||||
HTTPManager::get()->addRequest(request);
|
||||
return request;
|
||||
}
|
||||
|
||||
@@ -226,36 +222,46 @@ namespace Online{
|
||||
|
||||
|
||||
// ============================================================================
|
||||
bool CurrentUser::signOut(irr::core::stringw &info){
|
||||
CurrentUser::SignOutRequest * CurrentUser::requestSignOut(){
|
||||
assert(m_state == SIGNED_IN || m_state == GUEST);
|
||||
HTTPConnector * connector = new HTTPConnector((std::string)UserConfigParams::m_server_multiplayer + "client-user.php");
|
||||
connector->setParameter("action",std::string("disconnect"));
|
||||
connector->setParameter("token",m_token);
|
||||
connector->setParameter("userid",m_id);
|
||||
CurrentUser::SignOutRequest * request = new CurrentUser::SignOutRequest();
|
||||
request->setURL((std::string)UserConfigParams::m_server_multiplayer + "client-user.php");
|
||||
request->setParameter("action",std::string("disconnect"));
|
||||
request->setParameter("token",m_token);
|
||||
request->setParameter("userid",m_id);
|
||||
HTTPManager::get()->addRequest(request);
|
||||
m_state = SIGNING_OUT;
|
||||
return request;
|
||||
}
|
||||
|
||||
bool success = false;
|
||||
const XMLNode * result = connector->getXMLFromPage();
|
||||
std::string rec_success = "";
|
||||
if(result->get("success", &rec_success))
|
||||
void CurrentUser::signOut(SignOutRequest * input)
|
||||
{
|
||||
const XMLNode * xml = input->getResult();
|
||||
irr::core::stringw info;
|
||||
std::string rec_success;
|
||||
if(xml->get("success", &rec_success) && (rec_success =="yes"))
|
||||
{
|
||||
if (rec_success =="yes")
|
||||
{
|
||||
m_token = "";
|
||||
m_name = "";
|
||||
m_id = 0;
|
||||
m_state = SIGNED_OUT;
|
||||
UserConfigParams::m_saved_user = 0;
|
||||
UserConfigParams::m_saved_token = "";
|
||||
UserConfigParams::m_saved_session = false;
|
||||
success = true;
|
||||
}
|
||||
result->get("info", &info);
|
||||
xml->get("info", &info);
|
||||
}
|
||||
else
|
||||
{
|
||||
info = _("Unable to connect to the server. Check your internet connection or try again later.");
|
||||
Log::warn("CurrentUser::signOut", "%s", _("There were some connection issues while signing out. Report a bug if this caused issues."));
|
||||
}
|
||||
return success;
|
||||
m_token = "";
|
||||
m_name = "";
|
||||
m_id = 0;
|
||||
m_state = SIGNED_OUT;
|
||||
UserConfigParams::m_saved_user = 0;
|
||||
UserConfigParams::m_saved_token = "";
|
||||
UserConfigParams::m_saved_session = false;
|
||||
input->setInfo(info);
|
||||
input->setSuccess(true);
|
||||
}
|
||||
|
||||
void CurrentUser::SignOutRequest::callback()
|
||||
{
|
||||
CurrentUser::acquire()->signOut(this);
|
||||
CurrentUser::release();
|
||||
}
|
||||
|
||||
// ============================================================================
|
||||
|
||||
@@ -49,10 +49,12 @@ namespace Online{
|
||||
|
||||
class SignInRequest : public XMLRequest
|
||||
{
|
||||
protected :
|
||||
virtual void callback ();
|
||||
public :
|
||||
SignInRequest(const std::string &url) : XMLRequest(url) {}
|
||||
};
|
||||
|
||||
class SignOutRequest : public XMLRequest
|
||||
{
|
||||
virtual void callback ();
|
||||
};
|
||||
|
||||
private:
|
||||
@@ -62,6 +64,7 @@ namespace Online{
|
||||
CurrentUser();
|
||||
|
||||
void signIn(SignInRequest * input);
|
||||
void signOut(SignOutRequest * input);
|
||||
|
||||
|
||||
public:
|
||||
@@ -78,6 +81,10 @@ namespace Online{
|
||||
const irr::core::stringw &password,
|
||||
bool save_session);
|
||||
|
||||
// Logout - Best to be followed by CurrentUser::deallocate
|
||||
SignOutRequest * requestSignOut();
|
||||
|
||||
|
||||
// Register
|
||||
bool signUp( const irr::core::stringw &username,
|
||||
const irr::core::stringw &password,
|
||||
@@ -85,8 +92,7 @@ namespace Online{
|
||||
const irr::core::stringw &email,
|
||||
bool terms,
|
||||
irr::core::stringw &info);
|
||||
// Logout - Best to be followed by CurrentOnlineUser::deallocate
|
||||
bool signOut( irr::core::stringw &info);
|
||||
|
||||
|
||||
XMLRequest * createServerRequest( const irr::core::stringw &name,
|
||||
int max_players);
|
||||
|
||||
@@ -63,6 +63,7 @@ namespace Online{
|
||||
HTTPManager::HTTPManager(){
|
||||
curl_global_init(CURL_GLOBAL_DEFAULT);
|
||||
pthread_cond_init(&m_cond_request, NULL);
|
||||
m_abort.setAtomic(false);
|
||||
}
|
||||
|
||||
// ============================================================================
|
||||
@@ -140,24 +141,14 @@ namespace Online{
|
||||
* sorted by priority.
|
||||
* \param request The pointer to the new request to insert.
|
||||
*/
|
||||
bool HTTPManager::addRequest(Online::Request *request)
|
||||
void HTTPManager::addRequest(Online::Request *request)
|
||||
{
|
||||
if (request->isAllowedToAdd())
|
||||
{
|
||||
m_request_queue.lock();
|
||||
|
||||
m_request_queue.getData().push(request);
|
||||
// Wake up the network http thread
|
||||
pthread_cond_signal(&m_cond_request);
|
||||
|
||||
m_request_queue.unlock();
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
Log::info("HTTPManager::addrequest", "Did not add request.");
|
||||
return false;
|
||||
}
|
||||
assert(request->isAllowedToAdd());
|
||||
m_request_queue.lock();
|
||||
m_request_queue.getData().push(request);
|
||||
// Wake up the network http thread
|
||||
pthread_cond_signal(&m_cond_request);
|
||||
m_request_queue.unlock();
|
||||
} // insertRequest
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
@@ -82,7 +82,7 @@ namespace Online{
|
||||
std::string getPage(Online::Request * request);
|
||||
XMLNode * getXMLFromPage(Online::Request * request);
|
||||
|
||||
bool addRequest(Online::Request *request);
|
||||
void addRequest(Online::Request *request);
|
||||
void cancelAllDownloads();
|
||||
|
||||
bool getAbort(){ return m_abort.getAtomic(); };
|
||||
|
||||
@@ -61,7 +61,7 @@ namespace Online{
|
||||
|
||||
// =========================================================================================
|
||||
|
||||
HTTPRequest::HTTPRequest(const std::string &url)
|
||||
HTTPRequest::HTTPRequest(const std::string & url)
|
||||
: Request(1,false)
|
||||
{
|
||||
m_url = url;
|
||||
@@ -80,10 +80,7 @@ namespace Online{
|
||||
bool HTTPRequest::isAllowedToAdd()
|
||||
{
|
||||
if (m_url.size() > 5 && ( m_url.substr(0, 5) != "http:"))
|
||||
{
|
||||
Log::info("HTTPRequest::isAllowedToAdd", "Invalid URL.");
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -203,10 +200,6 @@ namespace Online{
|
||||
|
||||
|
||||
// =========================================================================================
|
||||
XMLRequest::XMLRequest(const std::string &url)
|
||||
: HTTPRequest(url)
|
||||
{
|
||||
}
|
||||
|
||||
void XMLRequest::operation()
|
||||
{
|
||||
|
||||
@@ -144,7 +144,7 @@ namespace Online{
|
||||
|
||||
public :
|
||||
|
||||
HTTPRequest(const std::string &url);
|
||||
HTTPRequest(const std::string & url = "");
|
||||
virtual ~HTTPRequest();
|
||||
|
||||
void setParameter(const std::string & name, const std::string &value){
|
||||
@@ -173,6 +173,7 @@ namespace Online{
|
||||
bool isSuccess(){ return m_success; }
|
||||
|
||||
const std::string &getURL() const {return m_url;}
|
||||
void setURL(const std::string & url) { m_url = url;}
|
||||
|
||||
virtual bool isAllowedToAdd() OVERRIDE;
|
||||
|
||||
@@ -185,7 +186,7 @@ namespace Online{
|
||||
virtual void operation() OVERRIDE;
|
||||
|
||||
public :
|
||||
XMLRequest(const std::string &url);
|
||||
XMLRequest(const std::string & url = "") : HTTPRequest(url) {};
|
||||
virtual XMLNode * getResult() OVERRIDE { return m_result; }
|
||||
};
|
||||
} //namespace Online
|
||||
|
||||
@@ -52,7 +52,9 @@ DEFINE_SCREEN_SINGLETON( OnlineScreen );
|
||||
OnlineScreen::OnlineScreen() : Screen("online/main.stkgui")
|
||||
{
|
||||
m_recorded_state = CurrentUser::SIGNED_OUT;
|
||||
m_sign_in_request = CurrentUser::acquire()->requestSavedSession();
|
||||
CurrentUser::SignInRequest * request = CurrentUser::acquire()->requestSavedSession();
|
||||
if(request != NULL)
|
||||
m_requests.push_back(request);
|
||||
CurrentUser::release();
|
||||
} // OnlineScreen
|
||||
|
||||
@@ -60,7 +62,7 @@ OnlineScreen::OnlineScreen() : Screen("online/main.stkgui")
|
||||
|
||||
OnlineScreen::~OnlineScreen()
|
||||
{
|
||||
delete m_sign_in_request;
|
||||
m_requests.clearAndDeleteAll();
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
@@ -159,23 +161,44 @@ void OnlineScreen::onUpdate(float delta, irr::video::IVideoDriver* driver)
|
||||
m_load_timer += delta;
|
||||
m_online_status_widget->setText(Messages::signingIn(m_load_timer), false);
|
||||
}
|
||||
if(m_sign_in_request != NULL)
|
||||
else if (m_recorded_state == CurrentUser::SIGNING_OUT)
|
||||
{
|
||||
if(m_sign_in_request->isDone())
|
||||
m_load_timer += delta;
|
||||
m_online_status_widget->setText(Messages::signingOut(m_load_timer), false);
|
||||
}
|
||||
|
||||
for(int i = m_requests.size()-1; i>=0; --i)
|
||||
{
|
||||
if(m_requests[i].isDone())
|
||||
{
|
||||
if(m_sign_in_request->isSuccess())
|
||||
if( dynamic_cast<CurrentUser::SignInRequest*>(m_requests.get(i)))
|
||||
{
|
||||
new MessageDialog(_("Automatically signed in."));
|
||||
}
|
||||
else
|
||||
if(m_requests[i].isSuccess())
|
||||
{
|
||||
new MessageDialog(_("Automatically signed in."));
|
||||
}
|
||||
else
|
||||
{
|
||||
sfx_manager->quickSound( "anvil" );
|
||||
new MessageDialog(m_requests[i].getInfo());
|
||||
}
|
||||
}else if( dynamic_cast<CurrentUser::SignOutRequest*>(m_requests.get(i)))
|
||||
{
|
||||
sfx_manager->quickSound( "anvil" );
|
||||
new MessageDialog(m_sign_in_request->getInfo());
|
||||
if(m_requests[i].isSuccess())
|
||||
{
|
||||
new MessageDialog(_("Signed out successfully."));
|
||||
}
|
||||
else
|
||||
{
|
||||
sfx_manager->quickSound( "anvil" );
|
||||
new MessageDialog(m_requests[i].getInfo());
|
||||
}
|
||||
}
|
||||
delete m_sign_in_request;
|
||||
m_sign_in_request = NULL;
|
||||
|
||||
m_requests.erase(i);
|
||||
}
|
||||
}
|
||||
|
||||
} // onUpdate
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
@@ -198,14 +221,8 @@ void OnlineScreen::eventCallback(Widget* widget, const std::string& name, const
|
||||
}
|
||||
else if (selection == "sign_out")
|
||||
{
|
||||
irr::core::stringw info;
|
||||
if (Online::CurrentUser::get()->signOut(info))
|
||||
{
|
||||
new MessageDialog(_("Signed out successfully."));
|
||||
//GUIEngine::reshowCurrentScreen();
|
||||
}
|
||||
else
|
||||
new MessageDialog(info);
|
||||
m_requests.push_back(CurrentUser::acquire()->requestSignOut());
|
||||
CurrentUser::release();
|
||||
}
|
||||
else if (selection == "register")
|
||||
{
|
||||
@@ -238,10 +255,9 @@ void OnlineScreen::eventCallback(Widget* widget, const std::string& name, const
|
||||
} // eventCallback
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
void OnlineScreen::tearDown()
|
||||
{
|
||||
} // tearDown
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
void OnlineScreen::onDisabledItemClicked(const std::string& item)
|
||||
@@ -278,3 +294,4 @@ void OnlineScreen::onDialogClose()
|
||||
else
|
||||
setInitialFocus();
|
||||
} // onDialogClose()
|
||||
|
||||
|
||||
@@ -54,7 +54,8 @@ private:
|
||||
Online::CurrentUser::UserState m_recorded_state;
|
||||
|
||||
float m_load_timer;
|
||||
Online::CurrentUser::SignInRequest * m_sign_in_request;
|
||||
|
||||
PtrVector<Online::XMLRequest> m_requests;
|
||||
|
||||
/** \brief Checks if the recorded state differs from the actual state and sets it. */
|
||||
bool hasStateChanged();
|
||||
|
||||
Reference in New Issue
Block a user