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:
unitraxx
2013-07-20 01:38:44 +00:00
parent 8c9834a236
commit ebc3696de1
8 changed files with 107 additions and 92 deletions

View File

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

View File

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

View File

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

View File

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

View File

@@ -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()
{

View File

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

View File

@@ -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()

View File

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