0
#include "twitter-user.h"
0
#include "twitter-user-list.h"
0
+#ifndef G_WARN_NOT_IMPLEMENTED
0
+#define G_WARN_NOT_IMPLEMENTED (g_warning (G_STRLOC ": This function has not been implemented yet"))
0
#define TWITTER_CLIENT_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), TWITTER_TYPE_CLIENT, TwitterClientPrivate))
0
struct _TwitterClientPrivate
0
@@ -248,53 +252,77 @@ typedef enum {
0
static const gchar *action_names[N_CLIENT_ACTIONS] = {
0
+ "statuses/public_timeline",
0
+ "statuses/friends_timeline",
0
+ "statuses/user_timeline",
0
+ "account/verify_credentials",
0
+ "account/end_session",
0
+ "notifications/follow",
0
+ guint requires_auth : 1;
0
+ ClientClosure closure;
0
TwitterTimeline *timeline;
0
+#define closure_set_action(c,v) (((ClientClosure *) (c))->action) = (v)
0
+#define closure_get_action(c) (((ClientClosure *) (c))->action)
0
+#define closure_set_client(c,v) (((ClientClosure *) (c))->client) = (v)
0
+#define closure_get_client(c) (((ClientClosure *) (c))->client)
0
+#define closure_set_requires_auth(c,v) (((ClientClosure *) (c))->requires_auth) = (v)
0
+#define closure_get_requires_auth(c) (((ClientClosure *) (c))->requires_auth)
0
- TwitterClient *client;
0
+ ClientClosure closure;
0
- TwitterClient *client;
0
+ ClientClosure closure;
0
TwitterUserList *user_list;
0
- TwitterClient *client;
0
+ ClientClosure closure;
0
@@ -314,9 +342,13 @@ twitter_client_auth (SoupSession *session,
0
g_signal_emit (client, client_signals[AUTHENTICATE], 0,
0
TWITTER_AUTH_NEGOTIATING, &retval);
0
- soup_auth_authenticate (auth, priv->email, priv->password);
0
+ if (!priv->email || !priv->password)
0
+ priv->auth_complete = FALSE;
0
- priv->auth_complete = TRUE;
0
+ soup_auth_authenticate (auth, priv->email, priv->password);
0
@@ -324,10 +356,7 @@ twitter_client_auth (SoupSession *session,
0
TWITTER_AUTH_RETRY, &retval);
0
- soup_auth_authenticate (auth, priv->email, priv->password);
0
- priv->auth_complete = TRUE;
0
+ soup_auth_authenticate (auth, priv->email, priv->password);
0
g_signal_emit (client, client_signals[AUTHENTICATE], 0,
0
@@ -412,7 +441,7 @@ twitter_client_get_user (TwitterClient *client,
0
+ TwitterUserList *user_list;
0
@@ -420,45 +449,102 @@ typedef struct {
0
do_emit_user_received (gpointer data)
0
+ EmitUserClosure *closure = data;
0
+ user = twitter_user_list_get_pos (closure->user_list,
0
+ closure->current_user);
0
+ g_signal_emit (closure->client, client_signals[USER_RECEIVED], 0,
0
+ closure->current_user += 1;
0
+ if (closure->current_user == closure->n_users)
0
cleanup_emit_user_received (gpointer data)
0
+ EmitUserClosure *closure = data;
0
+ g_object_unref (closure->client);
0
+ g_object_unref (closure->user_list);
0
-emit_user_received (TwitterClient *client,
0
- TwitterUserList *list)
0
+emit_user_received (TwitterClient *client,
0
+ TwitterUserList *user_list)
0
+ EmitUserClosure *closure;
0
+ count = twitter_user_list_get_count (user_list);
0
+ closure = g_new (EmitUserClosure, 1);
0
+ closure->client = g_object_ref (client);
0
+ closure->user_list = g_object_ref (user_list);
0
+ closure->n_users = count;
0
+ closure->current_user = 0;
0
+ g_idle_add_full (G_PRIORITY_DEFAULT_IDLE,
0
+ do_emit_user_received,
0
+ cleanup_emit_user_received);
0
-get_user_cb (SoupSession *session,
0
+get_status_cb (SoupSession *session,
0
GetStatusClosure *closure = user_data;
0
- TwitterClient *client = closure->client;
0
+ gboolean requires_auth = closure_get_requires_auth (closure);
0
+ TwitterClient *client = closure_get_client (closure);
0
+ TwitterClientPrivate *priv = client->priv;
0
if (!SOUP_STATUS_IS_SUCCESSFUL (msg->status_code))
0
+ if (msg->status_code == SOUP_STATUS_UNAUTHORIZED)
0
+ gboolean retval = FALSE;
0
+ g_signal_emit (client, client_signals[AUTHENTICATE], 0,
0
+ TWITTER_AUTH_FAILED, &retval);
0
+ priv->auth_complete = FALSE;
0
g_set_error (&error, TWITTER_ERROR,
0
twitter_error_from_status (msg->status_code),
0
g_signal_emit (client, client_signals[STATUS_RECEIVED], 0,
0
closure->status, error);
0
+ gboolean retval = FALSE;
0
+ if (requires_auth && !priv->auth_complete)
0
+ g_signal_emit (client, client_signals[AUTHENTICATE], 0,
0
+ TWITTER_AUTH_SUCCESS, &retval);
0
+ priv->auth_complete = TRUE;
0
buffer = g_strndup (msg->response_body->data,
0
msg->response_body->length);
0
if (G_UNLIKELY (!buffer))
0
@@ -472,8 +558,8 @@ get_user_cb (SoupSession *session,
0
- g_object_unref (closure->client);
0
g_object_unref (closure->status);
0
+ g_object_unref (client);
0
@@ -590,25 +676,45 @@ get_timeline_cb (SoupSession *session,
0
GetTimelineClosure *closure = user_data;
0
- TwitterClient *client = closure->client;
0
+ gboolean requires_auth = closure_get_requires_auth (closure);
0
+ TwitterClient *client = closure_get_client (closure);
0
+ TwitterClientPrivate *priv = client->priv;
0
- status = msg->status_code;
0
- if (!SOUP_STATUS_IS_SUCCESSFUL (status))
0
+ if (!SOUP_STATUS_IS_SUCCESSFUL (msg->status_code))
0
+ if (msg->status_code == SOUP_STATUS_UNAUTHORIZED)
0
+ gboolean retval = FALSE;
0
+ g_signal_emit (client, client_signals[AUTHENTICATE], 0,
0
+ TWITTER_AUTH_FAILED, &retval);
0
+ priv->auth_complete = FALSE;
0
g_set_error (&error, TWITTER_ERROR,
0
- twitter_error_from_status (status),
0
+ twitter_error_from_status (msg->status_code),
0
g_signal_emit (client, client_signals[STATUS_RECEIVED], 0,
0
+ gboolean retval = FALSE;
0
+ if (requires_auth && !priv->auth_complete)
0
+ g_signal_emit (client, client_signals[AUTHENTICATE], 0,
0
+ TWITTER_AUTH_SUCCESS, &retval);
0
+ priv->auth_complete = TRUE;
0
buffer = g_strndup (msg->response_body->data,
0
msg->response_body->length);
0
@@ -617,13 +723,13 @@ get_timeline_cb (SoupSession *session,
0
twitter_timeline_load_from_data (closure->timeline, buffer);
0
- emit_status_received (closure->client, closure->timeline);
0
+ emit_status_received (client, closure->timeline);
0
g_object_unref (closure->timeline);
0
- g_object_unref (closure->client);
0
+ g_object_unref (client);
0
@@ -640,8 +746,9 @@ twitter_client_get_public_timeline (TwitterClient *client,
0
msg = twitter_api_public_timeline (since_id);
0
clos = g_new0 (GetTimelineClosure, 1);
0
- clos->action = PUBLIC_TIMELINE;
0
- clos->client = g_object_ref (client);
0
+ closure_set_action (clos, PUBLIC_TIMELINE);
0
+ closure_set_client (clos, g_object_ref (client));
0
+ closure_set_requires_auth (clos, FALSE);
0
clos->timeline = twitter_timeline_new ();
0
twitter_client_queue_message (client, msg, FALSE,
0
@@ -662,8 +769,9 @@ twitter_client_get_friends_timeline (TwitterClient *client,
0
msg = twitter_api_friends_timeline (friend_, since_date);
0
clos = g_new0 (GetTimelineClosure, 1);
0
- clos->action = FRIENDS_TIMELINE;
0
- clos->client = g_object_ref (client);
0
+ closure_set_action (clos, FRIENDS_TIMELINE);
0
+ closure_set_client (clos, g_object_ref (client));
0
+ closure_set_requires_auth (clos, TRUE);
0
clos->timeline = twitter_timeline_new ();
0
twitter_client_queue_message (client, msg, TRUE,
0
@@ -685,8 +793,9 @@ twitter_client_get_user_timeline (TwitterClient *client,
0
msg = twitter_api_user_timeline (user, count, since_date);
0
clos = g_new0 (GetTimelineClosure, 1);
0
- clos->action = USER_TIMELINE;
0
- clos->client = g_object_ref (client);
0
+ closure_set_action (clos, USER_TIMELINE);
0
+ closure_set_client (clos, g_object_ref (client));
0
+ closure_set_requires_auth (clos, TRUE);
0
clos->timeline = twitter_timeline_new ();
0
twitter_client_queue_message (client, msg, TRUE,
0
@@ -705,8 +814,9 @@ twitter_client_get_replies (TwitterClient *client)
0
msg = twitter_api_replies ();
0
clos = g_new0 (GetTimelineClosure, 1);
0
- clos->action = REPLIES;
0
- clos->client = g_object_ref (client);
0
+ closure_set_action (clos, STATUS_REPLIES);
0
+ closure_set_client (clos, g_object_ref (client));
0
+ closure_set_requires_auth (close, TRUE);
0
clos->timeline = twitter_timeline_new ();
0
twitter_client_queue_message (client, msg, TRUE,
0
@@ -716,7 +826,8 @@ twitter_client_get_replies (TwitterClient *client)
0
twitter_client_get_favorites (TwitterClient *client,
0
GetTimelineClosure *clos;
0
@@ -724,58 +835,82 @@ twitter_client_get_favorites (TwitterClient *client,
0
g_return_if_fail (TWITTER_IS_CLIENT (client));
0
- msg = twitter_api_favorites (user, -1);
0
+ msg = twitter_api_favorites (user, page);
0
clos = g_new0 (GetTimelineClosure, 1);
0
- clos->action = FAVORITES;
0
- clos->client = g_object_ref (client);
0
+ closure_set_action (clos, FAVORITES);
0
+ closure_set_client (clos, g_object_ref (client));
0
+ closure_set_requires_auth (clos, TRUE);
0
clos->timeline = twitter_timeline_new ();
0
twitter_client_queue_message (client, msg, TRUE,
0
+ G_WARN_NOT_IMPLEMENTED;
0
-get_status_cb (SoupSession *session,
0
+get_user_cb (SoupSession *session,
0
- GetStatusClosure *closure = user_data;
0
- TwitterClient *client = closure->client;
0
+ GetUserClosure *closure = user_data;
0
+ gboolean requires_auth = closure_get_requires_auth (closure);
0
+ TwitterClient *client = closure_get_client (closure);
0
+ TwitterClientPrivate *priv = client->priv;
0
if (!SOUP_STATUS_IS_SUCCESSFUL (msg->status_code))
0
+ if (msg->status_code == SOUP_STATUS_UNAUTHORIZED)
0
+ gboolean retval = FALSE;
0
+ g_signal_emit (client, client_signals[AUTHENTICATE], 0,
0
+ TWITTER_AUTH_FAILED, &retval);
0
+ priv->auth_complete = FALSE;
0
g_set_error (&error, TWITTER_ERROR,
0
twitter_error_from_status (msg->status_code),
0
- g_signal_emit (client, client_signals[STATUS_RECEIVED], 0,
0
+ g_signal_emit (client, client_signals[USER_RECEIVED], 0,
0
+ gboolean retval = FALSE;
0
+ if (requires_auth && !priv->auth_complete)
0
+ g_signal_emit (client, client_signals[AUTHENTICATE], 0,
0
+ TWITTER_AUTH_SUCCESS, &retval);
0
+ priv->auth_complete = TRUE;
0
buffer = g_strndup (msg->response_body->data,
0
msg->response_body->length);
0
if (G_UNLIKELY (!buffer))
0
g_warning ("No data received");
0
- twitter_status_load_from_data (closure->status, buffer);
0
+ twitter_user_load_from_data (closure->user, buffer);
0
- g_signal_emit (client, client_signals[STATUS_RECEIVED], 0,
0
- closure->status, NULL);
0
+ g_signal_emit (client, client_signals[USER_RECEIVED], 0,
0
- g_object_unref (closure->client);
0
- g_object_unref (closure->status);
0
+ g_object_unref (closure->user);
0
+ g_object_unref (client);
0
@@ -793,8 +928,9 @@ twitter_client_get_status (TwitterClient *client,
0
msg = twitter_api_status_show (status_id);
0
clos = g_new0 (GetStatusClosure, 1);
0
- clos->action = STATUS_SHOW;
0
- clos->client = g_object_ref (client);
0
+ closure_set_action (clos, STATUS_SHOW);
0
+ closure_set_client (clos, g_object_ref (client));
0
+ closure_set_requires_auth (clos, FALSE);
0
clos->status = twitter_status_new ();
0
twitter_client_queue_message (client, msg, FALSE,
0
@@ -815,8 +951,9 @@ twitter_client_add_status (TwitterClient *client,
0
msg = twitter_api_update (text);
0
clos = g_new0 (GetStatusClosure, 1);
0
- clos->action = UPDATE;
0
- clos->client = g_object_ref (client);
0
+ closure_set_action (clos, STATUS_UPDATE);
0
+ closure_set_client (clos, g_object_ref (client));
0
+ closure_set_requires_auth (clos, TRUE);
0
clos->status = twitter_status_new ();
0
twitter_client_queue_message (client, msg, TRUE,
0
@@ -837,8 +974,9 @@ twitter_client_remove_status (TwitterClient *client,
0
msg = twitter_api_destroy (status_id);
0
clos = g_new0 (GetStatusClosure, 1);
0
- clos->action = DESTROY;
0
- clos->client = g_object_ref (client);
0
+ closure_set_action (clos, STATUS_DESTROY);
0
+ closure_set_client (clos, g_object_ref (client));
0
+ closure_set_requires_auth (clos, TRUE);
0
clos->status = twitter_status_new ();
0
twitter_client_queue_message (client, msg, TRUE,
0
@@ -846,44 +984,222 @@ twitter_client_remove_status (TwitterClient *client,
0
+get_user_list_cb (SoupSession *session,
0
+ GetUserListClosure *closure = user_data;
0
+ gboolean requires_auth = closure_get_requires_auth (closure);
0
+ TwitterClient *client = closure_get_client (closure);
0
+ TwitterClientPrivate *priv = client->priv;
0
+ if (!SOUP_STATUS_IS_SUCCESSFUL (msg->status_code))
0
+ if (msg->status_code == SOUP_STATUS_UNAUTHORIZED)
0
+ gboolean retval = FALSE;
0
+ g_signal_emit (client, client_signals[AUTHENTICATE], 0,
0
+ TWITTER_AUTH_FAILED, &retval);
0
+ priv->auth_complete = FALSE;
0
+ g_set_error (&error, TWITTER_ERROR,
0
+ twitter_error_from_status (msg->status_code),
0
+ g_signal_emit (client, client_signals[USER_RECEIVED], 0,
0
+ gboolean retval = FALSE;
0
+ if (requires_auth && !priv->auth_complete)
0
+ g_signal_emit (client, client_signals[AUTHENTICATE], 0,
0
+ TWITTER_AUTH_SUCCESS, &retval);
0
+ priv->auth_complete = TRUE;
0
+ buffer = g_strndup (msg->response_body->data,
0
+ msg->response_body->length);
0
+ if (G_UNLIKELY (!buffer))
0
+ g_warning ("No data received");
0
+ twitter_user_list_load_from_data (closure->user_list, buffer);
0
+ emit_user_received (client, closure->user_list);
0
+ g_object_unref (closure->user_list);
0
+ g_object_unref (client);
0
twitter_client_add_friend (TwitterClient *client,
0
+ g_return_if_fail (TWITTER_IS_CLIENT (client));
0
+ g_return_if_fail (user != NULL);
0
+ msg = twitter_api_create_friend (user);
0
+ clos = g_new0 (GetUserClosure, 1);
0
+ closure_set_action (clos, FRIEND_CREATE);
0
+ closure_set_client (clos, g_object_ref (client));
0
+ closure_set_requires_auth (clos, TRUE);
0
+ clos->user = twitter_user_new ();
0
+ twitter_client_queue_message (client, msg, TRUE,
0
+ G_WARN_NOT_IMPLEMENTED;
0
twitter_client_remove_friend (TwitterClient *client,
0
+ g_return_if_fail (TWITTER_IS_CLIENT (client));
0
+ g_return_if_fail (user != NULL);
0
+ msg = twitter_api_destroy_friend (user);
0
+ clos = g_new0 (GetUserClosure, 1);
0
+ closure_set_action (clos, FRIEND_DESTROY);
0
+ closure_set_client (clos, g_object_ref (client));
0
+ closure_set_requires_auth (clos, TRUE);
0
+ clos->user = twitter_user_new ();
0
+ twitter_client_queue_message (client, msg, TRUE,