aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--protocols/twitter/twitter.c20
-rw-r--r--protocols/twitter/twitter.h1
-rw-r--r--protocols/twitter/twitter_http.c49
-rw-r--r--protocols/twitter/twitter_lib.c18
4 files changed, 31 insertions, 57 deletions
diff --git a/protocols/twitter/twitter.c b/protocols/twitter/twitter.c
index b6b23fa5..fb7acc12 100644
--- a/protocols/twitter/twitter.c
+++ b/protocols/twitter/twitter.c
@@ -34,7 +34,9 @@ gboolean twitter_main_loop(gpointer data, gint fd, b_input_condition cond)
{
struct im_connection *ic = data;
// Check if we are still logged in...
- if ((ic->flags & OPT_LOGGED_IN) != OPT_LOGGED_IN)
+ // We are logged in if the flag says so and the connection is still in the connections list.
+ if ((ic->flags & OPT_LOGGED_IN) != OPT_LOGGED_IN
+ && !g_slist_find( twitter_connections, ic ))
return 0;
// If the user uses multiple private message windows we need to get the
@@ -54,6 +56,7 @@ static void twitter_init( account_t *acc )
{
set_t *s;
s = set_add( &acc->set, "use_groupchat", "false", set_eval_bool, acc );
+ s->flags |= ACC_SET_OFFLINE_ONLY;
}
/**
@@ -71,17 +74,15 @@ static void twitter_login( account_t *acc )
ic->proto_data = td;
- // Set the status to logged in.
- ic->flags = OPT_LOGGED_IN;
+ imcb_log( ic, "Connecting to twitter" );
+ imcb_connected(ic);
// Run this once. After this queue the main loop function.
twitter_main_loop(ic, -1, 0);
// Queue the main_loop
- b_timeout_add(60000, twitter_main_loop, ic);
-
- imcb_log( ic, "Connecting to twitter" );
- imcb_connected(ic);
+ // Save the return value, so we can remove the timeout on logout.
+ td->main_loop_id = b_timeout_add(60000, twitter_main_loop, ic);
twitter_connections = g_slist_append( twitter_connections, ic );
}
@@ -96,6 +97,9 @@ static void twitter_logout( struct im_connection *ic )
// Set the status to logged out.
ic->flags = 0;
+ // Remove the main_loop function from the function queue.
+ b_event_remove(td->main_loop_id);
+
if( td )
{
g_free( td );
@@ -148,6 +152,8 @@ static void twitter_remove_buddy( struct im_connection *ic, char *who, char *gro
static void twitter_chat_msg( struct groupchat *c, char *message, int flags )
{
+ if( c && message )
+ twitter_post_status(c->ic, message);
}
static void twitter_chat_invite( struct groupchat *c, char *who, char *message )
diff --git a/protocols/twitter/twitter.h b/protocols/twitter/twitter.h
index 05a861bb..e13deddb 100644
--- a/protocols/twitter/twitter.h
+++ b/protocols/twitter/twitter.h
@@ -37,6 +37,7 @@ struct twitter_data
char* user;
char* pass;
guint64 home_timeline_id;
+ gint main_loop_id;
struct groupchat *home_timeline_gc;
};
diff --git a/protocols/twitter/twitter_http.c b/protocols/twitter/twitter_http.c
index 4385475c..34b9408d 100644
--- a/protocols/twitter/twitter_http.c
+++ b/protocols/twitter/twitter_http.c
@@ -38,9 +38,7 @@
#include <errno.h>
-char *twitter_urlencode(const char *instr);
char *twitter_url_append(char *url, char *key, char* value);
-static int isurlchar(unsigned char c);
/**
* Do a request.
@@ -106,9 +104,9 @@ void *twitter_http(char *url_string, http_input_function func, gpointer data, in
// Make the request.
request = g_strdup_printf( "%s %s HTTP/1.0\r\n"
- "Host: %s\r\n"
- "User-Agent: BitlBee " BITLBEE_VERSION " " ARCH "/" CPU "\r\n",
- is_post ? "POST" : "GET", url->file, url->host );
+ "Host: %s\r\n"
+ "User-Agent: BitlBee " BITLBEE_VERSION " " ARCH "/" CPU "\r\n",
+ is_post ? "POST" : "GET", url->file, url->host );
// If a pass and user are given we append them to the request.
if (userpass_base64)
@@ -145,8 +143,11 @@ void *twitter_http(char *url_string, http_input_function func, gpointer data, in
char *twitter_url_append(char *url, char *key, char* value)
{
- char *key_encoded = twitter_urlencode(key);
- char *value_encoded = twitter_urlencode(value);
+ char *key_encoded = g_strndup(key, 3 * strlen(key));
+ http_encode(key_encoded);
+ char *value_encoded = g_strndup(value, 3 * strlen(value));
+ http_encode(value_encoded);
+
char *retval;
if (strlen(url) != 0)
retval = g_strdup_printf("%s&%s=%s", url, key_encoded, value_encoded);
@@ -159,35 +160,6 @@ char *twitter_url_append(char *url, char *key, char* value)
return retval;
}
-char *twitter_urlencode(const char *instr)
-{
- int ipos=0, bpos=0;
- char *str = NULL;
- int len = strlen(instr);
-
- if(!(str = g_new(char, 3*len + 1) ))
- return "";
-
- while(instr[ipos]) {
- while(isurlchar(instr[ipos]))
- str[bpos++] = instr[ipos++];
- if(!instr[ipos])
- break;
-
- g_snprintf(&str[bpos], 4, "%%%.2x", instr[ipos]);
- bpos+=3;
- ipos++;
- }
- str[bpos]='\0';
-
- /* free extra alloc'ed mem. */
- len = strlen(str);
- str = g_renew(char, str, len+1);
-
- return (str);
-}
-
-
char *twitter_urldecode(const char *instr)
{
int ipos=0, bpos=0;
@@ -228,8 +200,3 @@ char *twitter_urldecode(const char *instr)
return (str);
}
-static int isurlchar(unsigned char c)
-{
- return (isalnum(c) || '-' == c || '_' == c);
-}
-
diff --git a/protocols/twitter/twitter_lib.c b/protocols/twitter/twitter_lib.c
index f07897ed..d4e07c42 100644
--- a/protocols/twitter/twitter_lib.c
+++ b/protocols/twitter/twitter_lib.c
@@ -64,6 +64,7 @@ static void txu_free(struct twitter_xml_user *txu)
{
g_free(txu->name);
g_free(txu->screen_name);
+ g_free(txu);
}
@@ -75,6 +76,7 @@ static void txs_free(struct twitter_xml_status *txs)
g_free(txs->created_at);
g_free(txs->text);
txu_free(txs->user);
+ g_free(txs);
}
/**
@@ -130,7 +132,7 @@ void twitter_get_friends_ids(struct im_connection *ic, int next_cursor)
static xt_status twitter_xt_next_cursor( struct xt_node *node, struct twitter_xml_list *txl )
{
// Do something with the cursor.
- txl->next_cursor = atoi(node->text);
+ txl->next_cursor = node->text != NULL ? atoi(node->text) : -1;
return XT_HANDLED;
}
@@ -152,7 +154,7 @@ static xt_status twitter_xt_get_friends_id_list( struct xt_node *node, struct tw
if ( g_strcasecmp( "id", child->name ) == 0)
{
// Add the item to the list.
- txl->list = g_slist_append (txl->list, g_memdup( node->text, node->text_len + 1 ));
+ txl->list = g_slist_append (txl->list, g_memdup( child->text, child->text_len + 1 ));
}
else if ( g_strcasecmp( "next_cursor", child->name ) == 0)
{
@@ -186,7 +188,6 @@ static void twitter_http_get_friends_ids(struct http_request *req)
}
txl = g_new0(struct twitter_xml_list, 1);
- txl->list = NULL;
// Parse the data.
parser = xt_new( NULL, txl );
@@ -450,7 +451,7 @@ static void twitter_http_get_home_timeline(struct http_request *req)
// Check if the HTTP request went well.
if (req->status_code != 200) {
// It didn't go well, output the error and return.
- imcb_error(ic, "Could not retrieve home/timeline. HTTP STATUS: %d", req->status_code);
+ imcb_error(ic, "Could not retrieve " TWITTER_HOME_TIMELINE_URL ". HTTP STATUS: %d", req->status_code);
return;
}
@@ -487,6 +488,8 @@ static void twitter_http_get_statuses_friends(struct http_request *req)
struct im_connection *ic = req->data;
struct xt_parser *parser;
struct twitter_xml_list *txl;
+ GSList *l = NULL;
+ struct twitter_xml_user *user;
// Check if the connection is still active.
if( !g_slist_find( twitter_connections, ic ) )
@@ -495,7 +498,7 @@ static void twitter_http_get_statuses_friends(struct http_request *req)
// Check if the HTTP request went well.
if (req->status_code != 200) {
// It didn't go well, output the error and return.
- imcb_error(ic, "Could not retrieve home/timeline. HTTP STATUS: %d", req->status_code);
+ imcb_error(ic, "Could not retrieve " TWITTER_SHOW_FRIENDS_URL " HTTP STATUS: %d", req->status_code);
return;
}
@@ -510,8 +513,6 @@ static void twitter_http_get_statuses_friends(struct http_request *req)
twitter_xt_get_user_list(parser->root, txl);
xt_free( parser );
- GSList *l = NULL;
- struct twitter_xml_user *user;
// Add the users as buddies.
for ( l = txl->list; l ; l = g_slist_next(l) )
{
@@ -558,8 +559,7 @@ static void twitter_http_post_status(struct http_request *req)
// Check if the HTTP request went well.
if (req->status_code != 200) {
// It didn't go well, output the error and return.
- imcb_error(ic, "Could not post tweed... HTTP STATUS: %d", req->status_code);
- imcb_error(ic, req->reply_body);
+ imcb_error(ic, "Could not post tweet... HTTP STATUS: %d", req->status_code);
return;
}
}