aboutsummaryrefslogtreecommitdiffstats
path: root/protocols/skype/skype.c
diff options
context:
space:
mode:
Diffstat (limited to 'protocols/skype/skype.c')
-rw-r--r--protocols/skype/skype.c49
1 files changed, 26 insertions, 23 deletions
diff --git a/protocols/skype/skype.c b/protocols/skype/skype.c
index b3d29dab..4ae34668 100644
--- a/protocols/skype/skype.c
+++ b/protocols/skype/skype.c
@@ -28,7 +28,7 @@
#define SKYPE_DEFAULT_SERVER "localhost"
#define SKYPE_DEFAULT_PORT "2727"
-#define IRC_LINE_SIZE 1024
+#define IRC_LINE_SIZE 16384
#define ARRAY_SIZE(x) (sizeof(x)/sizeof(x[0]))
/*
@@ -193,7 +193,7 @@ int skype_printf(struct im_connection *ic, char *fmt, ...)
static void skype_buddy_ask_yes(void *data)
{
struct skype_buddy_ask_data *bla = data;
- skype_printf(bla->ic, "SET USER %s ISAUTHORIZED TRUE",
+ skype_printf(bla->ic, "SET USER %s ISAUTHORIZED TRUE\n",
bla->handle);
g_free(bla->handle);
g_free(bla);
@@ -202,7 +202,7 @@ static void skype_buddy_ask_yes(void *data)
static void skype_buddy_ask_no(void *data)
{
struct skype_buddy_ask_data *bla = data;
- skype_printf(bla->ic, "SET USER %s ISAUTHORIZED FALSE",
+ skype_printf(bla->ic, "SET USER %s ISAUTHORIZED FALSE\n",
bla->handle);
g_free(bla->handle);
g_free(bla);
@@ -225,7 +225,7 @@ void skype_buddy_ask(struct im_connection *ic, char *handle, char *message)
static void skype_call_ask_yes(void *data)
{
struct skype_buddy_ask_data *bla = data;
- skype_printf(bla->ic, "SET CALL %s STATUS INPROGRESS",
+ skype_printf(bla->ic, "SET CALL %s STATUS INPROGRESS\n",
bla->handle);
g_free(bla->handle);
g_free(bla);
@@ -234,7 +234,7 @@ static void skype_call_ask_yes(void *data)
static void skype_call_ask_no(void *data)
{
struct skype_buddy_ask_data *bla = data;
- skype_printf(bla->ic, "SET CALL %s STATUS FINISHED",
+ skype_printf(bla->ic, "SET CALL %s STATUS FINISHED\n",
bla->handle);
g_free(bla->handle);
g_free(bla);
@@ -917,7 +917,7 @@ static void skype_parse_group(struct im_connection *ic, char *line)
if (!sd->pending_user) {
/* Number of users changed in this group, query its type to see
* if it's a custom one we should care about. */
- skype_printf(ic, "GET GROUP %s TYPE", id);
+ skype_printf(ic, "GET GROUP %s TYPE\n", id);
return;
}
@@ -926,7 +926,7 @@ static void skype_parse_group(struct im_connection *ic, char *line)
struct skype_group *sg = skype_group_by_id(ic, atoi(id));
if (sg) {
- skype_printf(ic, "ALTER GROUP %d ADDUSER %s", sg->id, sd->pending_user);
+ skype_printf(ic, "ALTER GROUP %d ADDUSER %s\n", sg->id, sd->pending_user);
g_free(sd->pending_user);
sd->pending_user = NULL;
} else
@@ -934,7 +934,7 @@ static void skype_parse_group(struct im_connection *ic, char *line)
"No skype group with id %s. That's probably a bug.", id);
} else if (!strcmp(info, "TYPE CUSTOM_GROUP"))
/* This one is interesting, query its users. */
- skype_printf(ic, "GET GROUP %s USERS", id);
+ skype_printf(ic, "GET GROUP %s USERS\n", id);
}
static void skype_parse_chat(struct im_connection *ic, char *line)
@@ -1146,6 +1146,13 @@ static gboolean skype_read_callback(gpointer data, gint fd,
return FALSE;
/* Read the whole data. */
st = ssl_read(sd->ssl, buf, sizeof(buf));
+ if (st >= IRC_LINE_SIZE-1) {
+ /* As we don't buffer incoming data, if IRC_LINE_SIZE amount of bytes
+ * were received, there's a good chance last message was truncated
+ * and the next recv() will yield garbage. */
+ imcb_error(ic, "Unable to handle incoming data from skyped");
+ st = 0;
+ }
if (st > 0) {
buf[st] = '\0';
/* Then split it up to lines. */
@@ -1337,7 +1344,7 @@ static char *skype_set_display_name(set_t *set, char *value)
account_t *acc = set->data;
struct im_connection *ic = acc->ic;
- skype_printf(ic, "SET PROFILE FULLNAME %s", value);
+ skype_printf(ic, "SET PROFILE FULLNAME %s\n", value);
return value;
}
@@ -1346,7 +1353,7 @@ static char *skype_set_mood_text(set_t *set, char *value)
account_t *acc = set->data;
struct im_connection *ic = acc->ic;
- skype_printf(ic, "SET PROFILE MOOD_TEXT %s", value);
+ skype_printf(ic, "SET PROFILE MOOD_TEXT %s\n", value);
return value;
}
@@ -1355,7 +1362,7 @@ static char *skype_set_balance(set_t *set, char *value)
account_t *acc = set->data;
struct im_connection *ic = acc->ic;
- skype_printf(ic, "GET PROFILE PSTN_BALANCE");
+ skype_printf(ic, "GET PROFILE PSTN_BALANCE\n");
return value;
}
@@ -1366,7 +1373,7 @@ static void skype_call(struct im_connection *ic, char *value)
if (ptr)
*ptr = '\0';
- skype_printf(ic, "CALL %s", nick);
+ skype_printf(ic, "CALL %s\n", nick);
g_free(nick);
}
@@ -1375,7 +1382,7 @@ static void skype_hangup(struct im_connection *ic)
struct skype_data *sd = ic->proto_data;
if (sd->call_id) {
- skype_printf(ic, "SET CALL %s STATUS FINISHED",
+ skype_printf(ic, "SET CALL %s STATUS FINISHED\n",
sd->call_id);
g_free(sd->call_id);
sd->call_id = 0;
@@ -1415,10 +1422,10 @@ static void skype_add_buddy(struct im_connection *ic, char *who, char *group)
if (!sg) {
/* No such group, we need to create it, then have to
* add the user once it's created. */
- skype_printf(ic, "CREATE GROUP %s", group);
+ skype_printf(ic, "CREATE GROUP %s\n", group);
sd->pending_user = g_strdup(nick);
} else {
- skype_printf(ic, "ALTER GROUP %d ADDUSER %s", sg->id, nick);
+ skype_printf(ic, "ALTER GROUP %d ADDUSER %s\n", sg->id, nick);
}
}
}
@@ -1522,11 +1529,6 @@ static void skype_get_info(struct im_connection *ic, char *who)
skype_printf(ic, "GET USER %s BIRTHDAY\n", nick);
}
-static void skype_set_my_name(struct im_connection *ic, char *info)
-{
- skype_set_display_name(set_find(&ic->acc->set, "display_name"), info);
-}
-
static void skype_init(account_t *acc)
{
set_t *s;
@@ -1583,12 +1585,14 @@ GList *skype_buddy_action_list(bee_user_t *bu)
bu = bu;
if (ret == NULL) {
- static const struct buddy_action ba[3] = {
+ static const struct buddy_action ba[2] = {
{"CALL", "Initiate a call" },
{"HANGUP", "Hang up a call" },
};
+ int i;
- ret = g_list_prepend(ret, (void *) ba + 0);
+ for (i = 0; i < ARRAY_SIZE(ba); i++)
+ ret = g_list_prepend(ret, (void *)(ba + i));
}
return ret;
@@ -1619,7 +1623,6 @@ void init_plugin(void)
ret->logout = skype_logout;
ret->buddy_msg = skype_buddy_msg;
ret->get_info = skype_get_info;
- ret->set_my_name = skype_set_my_name;
ret->away_states = skype_away_states;
ret->set_away = skype_set_away;
ret->add_buddy = skype_add_buddy;