diff options
Diffstat (limited to 'protocols/skype/skype.c')
-rw-r--r-- | protocols/skype/skype.c | 49 |
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; |