[rhythmbox] audioscrobbler: avoid duplicate code by creating function to cancel session



commit 3abfeb9b0b64ba80cfc0b546fd8191caad91d17c
Author: Jamie Nicol <jamie thenicols net>
Date:   Sat Jun 5 00:21:30 2010 +0100

    audioscrobbler: avoid duplicate code by creating function to cancel session
    
    rb_audioscrobbler_account_cancel_session deletes an accounts username
    and session key, aswell as deleting the auth token and removing the
    session key timeout request, if they exist. This avoids duplicate code
    when logging out, logging in or on error.

 plugins/audioscrobbler/rb-audioscrobbler-account.c |   57 ++++++++++----------
 1 files changed, 29 insertions(+), 28 deletions(-)
---
diff --git a/plugins/audioscrobbler/rb-audioscrobbler-account.c b/plugins/audioscrobbler/rb-audioscrobbler-account.c
index 98fc046..9892d32 100644
--- a/plugins/audioscrobbler/rb-audioscrobbler-account.c
+++ b/plugins/audioscrobbler/rb-audioscrobbler-account.c
@@ -86,6 +86,7 @@ static void          rb_audioscrobbler_account_finalize (GObject *object);
 static void          rb_audioscrobbler_account_load_session_settings (RBAudioscrobblerAccount *account);
 static void          rb_audioscrobbler_account_save_session_settings (RBAudioscrobblerAccount *account);
 
+static void          rb_audioscrobbler_account_cancel_session (RBAudioscrobblerAccount *account);
 static void          rb_audioscrobbler_account_request_token (RBAudioscrobblerAccount *account);
 static void          rb_audioscrobbler_account_got_token_cb (SoupSession *session,
                                                              SoupMessage *msg,
@@ -405,20 +406,7 @@ rb_audioscrobbler_account_authenticate (RBAudioscrobblerAccount *account)
 void
 rb_audioscrobbler_account_logout (RBAudioscrobblerAccount *account)
 {
-	g_free (account->priv->username);
-	account->priv->username = NULL;
-
-	g_free (account->priv->auth_token);
-	account->priv->auth_token = NULL;
-
-	g_free (account->priv->session_key);
-	account->priv->session_key = NULL;
-
-	if (account->priv->session_key_timeout_id != 0) {
-		g_source_remove (account->priv->session_key_timeout_id);
-		account->priv->session_key_timeout_id = 0;
-	}
-
+	rb_audioscrobbler_account_cancel_session (account);
 	rb_audioscrobbler_account_save_session_settings (account);
 
 	account->priv->login_status = RB_AUDIOSCROBBLER_ACCOUNT_LOGIN_STATUS_LOGGED_OUT;
@@ -434,12 +422,7 @@ rb_audioscrobbler_account_notify_of_auth_error (RBAudioscrobblerAccount *account
 	 * radio, etc) to notify us when there is an authentication error
 	 */
 
-	g_free (account->priv->username);
-	account->priv->username = NULL;
-
-	g_free (account->priv->session_key);
-	account->priv->session_key = NULL;
-
+	rb_audioscrobbler_account_cancel_session (account);
 	rb_audioscrobbler_account_save_session_settings (account);
 
 	account->priv->login_status = RB_AUDIOSCROBBLER_ACCOUNT_LOGIN_STATUS_AUTH_ERROR;
@@ -449,6 +432,29 @@ rb_audioscrobbler_account_notify_of_auth_error (RBAudioscrobblerAccount *account
 
 /* private authentication functions */
 static void
+rb_audioscrobbler_account_cancel_session (RBAudioscrobblerAccount *account)
+{
+	/* cancels the current session, freeing the username,
+	 * session key, auth token. removing timeout callbacks etc.
+	 * Basically log out without setting state to logged out:
+	 * eg error states will also want to cancel the session
+	 */
+	g_free (account->priv->username);
+	account->priv->username = NULL;
+
+	g_free (account->priv->auth_token);
+	account->priv->auth_token = NULL;
+
+	g_free (account->priv->session_key);
+	account->priv->session_key = NULL;
+
+	if (account->priv->session_key_timeout_id != 0) {
+		g_source_remove (account->priv->session_key_timeout_id);
+		account->priv->session_key_timeout_id = 0;
+	}
+}
+
+static void
 rb_audioscrobbler_account_request_token (RBAudioscrobblerAccount *account)
 {
 	/* requests an authentication token
@@ -602,6 +608,9 @@ rb_audioscrobbler_account_got_session_key_cb (SoupSession *session,
 		char **pre_split;
 		char **post_split;
 
+		/* cancel the old session (and remove timeout) */
+		rb_audioscrobbler_account_cancel_session (account);
+
 		/* parse the username */
 		pre_split = g_strsplit (msg->response_body->data, "<name>", -1);
 		post_split = g_strsplit (pre_split[1], "</name>", -1);
@@ -622,14 +631,6 @@ rb_audioscrobbler_account_got_session_key_cb (SoupSession *session,
 		          account->priv->username);
 		rb_audioscrobbler_account_save_session_settings (account);
 
-		/* remove timeout callback */
-		g_source_remove (account->priv->session_key_timeout_id);
-		account->priv->session_key_timeout_id = 0;
-
-		/* delete authorisation token */
-		g_free (account->priv->auth_token);
-		account->priv->auth_token = NULL;
-
 		/* update status */
 		account->priv->login_status = RB_AUDIOSCROBBLER_ACCOUNT_LOGIN_STATUS_LOGGED_IN;
 		g_signal_emit (account, rb_audioscrobbler_account_signals[LOGIN_STATUS_CHANGED],



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]