aboutsummaryrefslogtreecommitdiffstats
path: root/skype/skype.c
diff options
context:
space:
mode:
Diffstat (limited to 'skype/skype.c')
-rw-r--r--skype/skype.c103
1 files changed, 66 insertions, 37 deletions
diff --git a/skype/skype.c b/skype/skype.c
index ab4e05eb..eb718c3d 100644
--- a/skype/skype.c
+++ b/skype/skype.c
@@ -1,16 +1,38 @@
-/*
- * This is the most simple possible BitlBee plugin. To use, compile it as
- * a shared library and place it in the plugin directory:
+/*
+ * skype.c - Skype plugin for BitlBee
+ *
+ * Copyright (c) 2007 by Miklos Vajna <vmiklos@frugalware.org>
*
- * gcc -o example.so -shared example.c `pkg-config --cflags bitlbee`
- * cp example.so /usr/local/lib/bitlbee
+ * Several ideas are used from the BitlBee Jabber plugin, which is
+ *
+ * Copyright (c) 2006 by Wilmer van der Gaast <wilmer@gaast.net>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+ * USA.
*/
+
#include <stdio.h>
#include <poll.h>
#include <bitlbee.h>
#define SKYPE_PORT_DEFAULT "2727"
+/*
+ * Structures
+ */
+
struct skype_data
{
struct im_connection *ic;
@@ -19,9 +41,9 @@ struct skype_data
char *txq;
int tx_len;
int r_inpa, w_inpa;
- // when we receive a new message id, we query the handle, then the body
- // store the handle here
- // TODO: it would be nicer to use a hashmap for this or something
+ /* When we receive a new message id, we query the handle, then the
+ * body. Store the handle here so that we imcb_buddy_msg() when we got
+ * the body. */
char *handle;
};
@@ -31,6 +53,16 @@ struct skype_away_state
char *full_name;
};
+struct skype_buddy_ask_data
+{
+ struct im_connection *ic;
+ char *handle;
+};
+
+/*
+ * Tables
+ */
+
const struct skype_away_state skype_away_state_list[] =
{
{ "ONLINE", "Online" },
@@ -43,11 +75,9 @@ const struct skype_away_state skype_away_state_list[] =
{ NULL, NULL}
};
-struct skype_buddy_ask_data
-{
- struct im_connection *ic;
- char *handle;
-};
+/*
+ * Functions
+ */
static void skype_init( account_t *acc )
{
@@ -68,6 +98,8 @@ int skype_write( struct im_connection *ic, char *buf, int len )
pfd[0].fd = sd->fd;
pfd[0].events = POLLOUT;
+ /* This poll is necessary or we'll get a SIGPIPE when we write() to
+ * sd->fd. */
poll(pfd, 1, 1000);
if(pfd[0].revents & POLLHUP)
{
@@ -75,7 +107,6 @@ int skype_write( struct im_connection *ic, char *buf, int len )
imc_logout( ic, TRUE );
return FALSE;
}
- printf("write(): %s", buf);
write( sd->fd, buf, len );
return TRUE;
@@ -122,18 +153,18 @@ static gboolean skype_read_callback( gpointer data, gint fd, b_input_condition c
if( !sd || sd->fd == -1 )
return FALSE;
+ /* Read the whole data. */
st = read( sd->fd, buf, sizeof( buf ) );
if( st > 0 )
{
buf[st] = '\0';
- printf("read(): '%s'\n", buf);
+ /* Then split it up to lines. */
lines = g_strsplit(buf, "\n", 0);
lineptr = lines;
while((line = *lineptr))
{
if(!strlen(line))
break;
- printf("skype_read_callback() new line: '%s'\n", line);
if(!strncmp(line, "USERS ", 6))
{
char **i;
@@ -158,7 +189,9 @@ static gboolean skype_read_callback( gpointer data, gint fd, b_input_condition c
ptr = strchr(++user, ' ');
*ptr = '\0';
ptr++;
- if(!strncmp(ptr, "ONLINESTATUS ", 13) && strcmp(user, sd->username) != 0 && strcmp(user, "echo123") != 0)
+ if(!strncmp(ptr, "ONLINESTATUS ", 13) &&
+ strcmp(user, sd->username) != 0
+ && strcmp(user, "echo123") != 0)
{
ptr = g_strdup_printf("%s@skype.com", user);
imcb_add_buddy(ic, ptr, NULL);
@@ -196,8 +229,11 @@ static gboolean skype_read_callback( gpointer data, gint fd, b_input_condition c
info++;
if(!strcmp(info, "STATUS RECEIVED"))
{
- // new message, request its body
- printf("new received message #%s\n", id);
+ /* New message ID:
+ * (1) Request its from field
+ * (2) Request its body
+ * (3) Mark it as seen
+ */
g_snprintf(buf, 1024, "GET CHATMESSAGE %s FROM_HANDLE\n", id);
skype_write( ic, buf, strlen( buf ) );
g_snprintf(buf, 1024, "GET CHATMESSAGE %s BODY\n", id);
@@ -208,19 +244,22 @@ static gboolean skype_read_callback( gpointer data, gint fd, b_input_condition c
else if(!strncmp(info, "FROM_HANDLE ", 12))
{
info += 12;
- // new handle
+ /* New from field value. Store
+ * it, then we can later use it
+ * when we got the message's
+ * body. */
sd->handle = g_strdup_printf("%s@skype.com", info);
- printf("new handle: '%s'\n", info);
}
else if(!strncmp(info, "BODY ", 5))
{
info += 5;
- // new body
- printf("<%s> %s\n", sd->handle, info);
if(sd->handle)
+ {
+ /* New body, we have everything to use imcb_buddy_msg() now! */
imcb_buddy_msg(ic, sd->handle, info, 0, 0);
- g_free(sd->handle);
- sd->handle = NULL;
+ g_free(sd->handle);
+ sd->handle = NULL;
+ }
}
}
}
@@ -237,8 +276,6 @@ static gboolean skype_read_callback( gpointer data, gint fd, b_input_condition c
imc_logout( ic, TRUE );
return FALSE;
}
-
- /* EAGAIN/etc or a successful read. */
return TRUE;
}
@@ -254,7 +291,7 @@ gboolean skype_start_stream( struct im_connection *ic )
if( sd->r_inpa <= 0 )
sd->r_inpa = b_input_add( sd->fd, GAIM_INPUT_READ, skype_read_callback, ic );
- // download buddies
+ /* This will download all buddies. */
buf = g_strdup_printf("SEARCH FRIENDS\n");
st = skype_write( ic, buf, strlen( buf ) );
g_free(buf);
@@ -279,12 +316,7 @@ static void skype_login( account_t *acc )
ic->proto_data = sd;
imcb_log( ic, "Connecting" );
- printf("%s:%d\n", acc->server, set_getint( &acc->set, "port"));
sd->fd = proxy_connect(acc->server, set_getint( &acc->set, "port" ), skype_connected, ic );
- printf("sd->fd: %d\n", sd->fd);
- /*imcb_add_buddy(ic, "test@skype.com", NULL);
- imcb_buddy_status(ic, "test@skype.com", OPT_LOGGED_IN, NULL, NULL);
- imcb_buddy_msg(ic, "test@skype.com", "test from skype plugin", 0, 0);*/
sd->username = g_strdup( acc->user );
sd->ic = ic;
@@ -342,7 +374,6 @@ static void skype_set_away( struct im_connection *ic, char *state_txt, char *mes
state = skype_away_state_by_name( "Away" );
else
state = skype_away_state_by_name( state_txt );
- printf("would set to: '%s'\n", state->code);
buf = g_strdup_printf("SET USERSTATUS %s\n", state->code);
skype_write( ic, buf, strlen( buf ) );
g_free(buf);
@@ -369,7 +400,6 @@ static void skype_add_buddy( struct im_connection *ic, char *who, char *group )
*ptr = '\0';
buf = g_strdup_printf("SET USER %s BUDDYSTATUS 2 Please authorize me\n", nick);
skype_write( ic, buf, strlen( buf ) );
- printf("add '%s'\n", nick);
g_free(nick);
}
@@ -383,7 +413,6 @@ static void skype_remove_buddy( struct im_connection *ic, char *who, char *group
*ptr = '\0';
buf = g_strdup_printf("SET USER %s BUDDYSTATUS 1\n", nick);
skype_write( ic, buf, strlen( buf ) );
- printf("remove '%s'\n", nick);
g_free(nick);
}
@@ -396,8 +425,8 @@ void init_plugin(void)
ret->init = skype_init;
ret->logout = skype_logout;
ret->buddy_msg = skype_buddy_msg;
- ret->set_away = skype_set_away;
ret->away_states = skype_away_states;
+ ret->set_away = skype_set_away;
ret->add_buddy = skype_add_buddy;
ret->remove_buddy = skype_remove_buddy;
ret->handle_cmp = g_strcasecmp;