diff options
Diffstat (limited to 'skype/skype.c')
-rw-r--r-- | skype/skype.c | 257 |
1 files changed, 82 insertions, 175 deletions
diff --git a/skype/skype.c b/skype/skype.c index d2f41b11..747ccaf4 100644 --- a/skype/skype.c +++ b/skype/skype.c @@ -20,6 +20,7 @@ */ #define _XOPEN_SOURCE +#define _BSD_SOURCE #include <poll.h> #include <bitlbee.h> #include <bitlbee/ssl_client.h> @@ -157,13 +158,23 @@ int skype_write(struct im_connection *ic, char *buf) return TRUE; } +int skype_printf(struct im_connection *ic, char *fmt, ...) +{ + va_list args; + char str[IRC_LINE_SIZE]; + + va_start(args, fmt); + vsnprintf(str, IRC_LINE_SIZE, fmt, args); + va_end(args); + + return skype_write(ic, str); +} + static void skype_buddy_ask_yes(void *data) { struct skype_buddy_ask_data *bla = data; - char *buf = g_strdup_printf("SET USER %s ISAUTHORIZED TRUE", + skype_printf(bla->ic, "SET USER %s ISAUTHORIZED TRUE", bla->handle); - skype_write(bla->ic, buf); - g_free(buf); g_free(bla->handle); g_free(bla); } @@ -171,10 +182,8 @@ static void skype_buddy_ask_yes(void *data) static void skype_buddy_ask_no(void *data) { struct skype_buddy_ask_data *bla = data; - char *buf = g_strdup_printf("SET USER %s ISAUTHORIZED FALSE", + skype_printf(bla->ic, "SET USER %s ISAUTHORIZED FALSE", bla->handle); - skype_write(bla->ic, buf); - g_free(buf); g_free(bla->handle); g_free(bla); } @@ -197,10 +206,8 @@ 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; - char *buf = g_strdup_printf("SET CALL %s STATUS INPROGRESS", + skype_printf(bla->ic, "SET CALL %s STATUS INPROGRESS", bla->handle); - skype_write(bla->ic, buf); - g_free(buf); g_free(bla->handle); g_free(bla); } @@ -208,10 +215,8 @@ static void skype_call_ask_yes(void *data) static void skype_call_ask_no(void *data) { struct skype_buddy_ask_data *bla = data; - char *buf = g_strdup_printf("SET CALL %s STATUS FINISHED", + skype_printf(bla->ic, "SET CALL %s STATUS FINISHED", bla->handle); - skype_write(bla->ic, buf); - g_free(buf); g_free(bla->handle); g_free(bla); } @@ -271,14 +276,11 @@ static char *skype_call_strerror(int err) static void skype_parse_users(struct im_connection *ic, char *line) { - char **i, **nicks, *ptr; + char **i, **nicks; nicks = g_strsplit(line + 6, ", ", 0); - for (i = nicks; *i; i++) { - ptr = g_strdup_printf("GET USER %s ONLINESTATUS\n", *i); - skype_write(ic, ptr); - g_free(ptr); - } + for (i = nicks; *i; i++) + skype_printf(ic, "GET USER %s ONLINESTATUS\n", *i); g_strfreev(nicks); } @@ -509,14 +511,10 @@ static void skype_parse_chatmessage(struct im_connection *ic, char *line) * (3) Request its type * (4) Query chatname */ - g_snprintf(buf, IRC_LINE_SIZE, "GET CHATMESSAGE %s FROM_HANDLE\n", id); - skype_write(ic, buf); - g_snprintf(buf, IRC_LINE_SIZE, "GET CHATMESSAGE %s BODY\n", id); - skype_write(ic, buf); - g_snprintf(buf, IRC_LINE_SIZE, "GET CHATMESSAGE %s TYPE\n", id); - skype_write(ic, buf); - g_snprintf(buf, IRC_LINE_SIZE, "GET CHATMESSAGE %s CHATNAME\n", id); - skype_write(ic, buf); + skype_printf(ic, "GET CHATMESSAGE %s FROM_HANDLE\n", id); + skype_printf(ic, "GET CHATMESSAGE %s BODY\n", id); + skype_printf(ic, "GET CHATMESSAGE %s TYPE\n", id); + skype_printf(ic, "GET CHATMESSAGE %s CHATNAME\n", id); } else if (!strncmp(info, "FROM_HANDLE ", 12)) { info += 12; /* New from field value. Store @@ -597,24 +595,19 @@ static void skype_parse_call(struct im_connection *ic, char *line) if (sd->call_id) g_free(sd->call_id); sd->call_id = g_strdup(id); - g_snprintf(buf, IRC_LINE_SIZE, "GET CALL %s PARTNER_HANDLE\n", id); - skype_write(ic, buf); + skype_printf(ic, "GET CALL %s PARTNER_HANDLE\n", id); sd->call_status = SKYPE_CALL_RINGING; } else if (!strcmp(info, "STATUS MISSED")) { - g_snprintf(buf, IRC_LINE_SIZE, "GET CALL %s PARTNER_HANDLE\n", id); - skype_write(ic, buf); + skype_printf(ic, "GET CALL %s PARTNER_HANDLE\n", id); sd->call_status = SKYPE_CALL_MISSED; } else if (!strcmp(info, "STATUS CANCELLED")) { - g_snprintf(buf, IRC_LINE_SIZE, "GET CALL %s PARTNER_HANDLE\n", id); - skype_write(ic, buf); + skype_printf(ic, "GET CALL %s PARTNER_HANDLE\n", id); sd->call_status = SKYPE_CALL_CANCELLED; } else if (!strcmp(info, "STATUS FINISHED")) { - g_snprintf(buf, IRC_LINE_SIZE, "GET CALL %s PARTNER_HANDLE\n", id); - skype_write(ic, buf); + skype_printf(ic, "GET CALL %s PARTNER_HANDLE\n", id); sd->call_status = SKYPE_CALL_FINISHED; } else if (!strcmp(info, "STATUS REFUSED")) { - g_snprintf(buf, IRC_LINE_SIZE, "GET CALL %s PARTNER_HANDLE\n", id); - skype_write(ic, buf); + skype_printf(ic, "GET CALL %s PARTNER_HANDLE\n", id); sd->call_status = SKYPE_CALL_REFUSED; } else if (!strcmp(info, "STATUS UNPLACED")) { if (sd->call_id) @@ -689,7 +682,6 @@ static void skype_parse_call(struct im_connection *ic, char *line) static void skype_parse_filetransfer(struct im_connection *ic, char *line) { struct skype_data *sd = ic->proto_data; - char buf[IRC_LINE_SIZE]; char *id = strchr(line, ' '); if (!++id) @@ -701,14 +693,12 @@ static void skype_parse_filetransfer(struct im_connection *ic, char *line) *info = '\0'; info++; if (!strcmp(info, "STATUS NEW")) { - g_snprintf(buf, IRC_LINE_SIZE, "GET FILETRANSFER %s PARTNER_HANDLE\n", + skype_printf(ic, "GET FILETRANSFER %s PARTNER_HANDLE\n", id); - skype_write(ic, buf); sd->filetransfer_status = SKYPE_FILETRANSFER_NEW; } else if (!strcmp(info, "STATUS FAILED")) { - g_snprintf(buf, IRC_LINE_SIZE, "GET FILETRANSFER %s PARTNER_HANDLE\n", + skype_printf(ic, "GET FILETRANSFER %s PARTNER_HANDLE\n", id); - skype_write(ic, buf); sd->filetransfer_status = SKYPE_FILETRANSFER_FAILED; } else if (!strncmp(info, "PARTNER_HANDLE ", 15)) { info += 15; @@ -749,10 +739,8 @@ static void skype_parse_chat(struct im_connection *ic, char *line) imcb_chat_free(gc); if (!strcmp(info, "STATUS MULTI_SUBSCRIBED")) { imcb_chat_new(ic, id); - g_snprintf(buf, IRC_LINE_SIZE, "GET CHAT %s ADDER\n", id); - skype_write(ic, buf); - g_snprintf(buf, IRC_LINE_SIZE, "GET CHAT %s TOPIC\n", id); - skype_write(ic, buf); + skype_printf(ic, "GET CHAT %s ADDER\n", id); + skype_printf(ic, "GET CHAT %s TOPIC\n", id); } else if (!strcmp(info, "STATUS DIALOG") && sd->groupchat_with) { gc = imcb_chat_new(ic, id); /* According to the docs this @@ -761,17 +749,14 @@ static void skype_parse_chat(struct im_connection *ic, char *line) * and it would open an extra * window on our client, so * just leave it out. */ - /*g_snprintf(buf, IRC_LINE_SIZE, "OPEN CHAT %s\n", id); - skype_write(ic, buf);*/ + /*skype_printf(ic, "OPEN CHAT %s\n", id);*/ g_snprintf(buf, IRC_LINE_SIZE, "%s@skype.com", sd->groupchat_with); imcb_chat_add_buddy(gc, buf); imcb_chat_add_buddy(gc, sd->username); g_free(sd->groupchat_with); sd->groupchat_with = NULL; - g_snprintf(buf, IRC_LINE_SIZE, "GET CHAT %s ADDER\n", id); - skype_write(ic, buf); - g_snprintf(buf, IRC_LINE_SIZE, "GET CHAT %s TOPIC\n", id); - skype_write(ic, buf); + skype_printf(ic, "GET CHAT %s ADDER\n", id); + skype_printf(ic, "GET CHAT %s TOPIC\n", id); } else if (!strcmp(info, "STATUS UNSUBSCRIBED")) { gc = skype_chat_by_name(ic, id); if (gc) @@ -833,21 +818,18 @@ static void skype_parse_profile(struct im_connection *ic, char *line) static void skype_parse_ping(struct im_connection *ic, char *line) { - skype_write(ic, "PONG\n"); + skype_printf(ic, "PONG\n"); } static void skype_parse_chats(struct im_connection *ic, char *line) { - char buf[IRC_LINE_SIZE]; char **i; char **chats = g_strsplit(line + 6, ", ", 0); i = chats; while (*i) { - g_snprintf(buf, IRC_LINE_SIZE, "GET CHAT %s STATUS\n", *i); - skype_write(ic, buf); - g_snprintf(buf, IRC_LINE_SIZE, "GET CHAT %s ACTIVEMEMBERS\n", *i); - skype_write(ic, buf); + skype_printf(ic, "GET CHAT %s STATUS\n", *i); + skype_printf(ic, "GET CHAT %s ACTIVEMEMBERS\n", *i); i++; } g_strfreev(chats); @@ -916,7 +898,6 @@ static gboolean skype_read_callback(gpointer data, gint fd, gboolean skype_start_stream(struct im_connection *ic) { struct skype_data *sd = ic->proto_data; - char *buf; int st; if (!sd) @@ -927,27 +908,16 @@ gboolean skype_start_stream(struct im_connection *ic) skype_read_callback, ic); /* Log in */ - buf = g_strdup_printf("USERNAME %s\n", ic->acc->user); - st = skype_write(ic, buf); - g_free(buf); - buf = g_strdup_printf("PASSWORD %s\n", ic->acc->pass); - st = skype_write(ic, buf); - g_free(buf); + skype_printf(ic, "USERNAME %s\n", ic->acc->user); + skype_printf(ic, "PASSWORD %s\n", ic->acc->pass); /* This will download all buddies. */ - buf = g_strdup_printf("SEARCH FRIENDS\n"); - st = skype_write(ic, buf); - g_free(buf); - buf = g_strdup_printf("SET USERSTATUS ONLINE\n"); - skype_write(ic, buf); - g_free(buf); + st = skype_printf(ic, "SEARCH FRIENDS\n"); + skype_printf(ic, "SET USERSTATUS ONLINE\n"); /* Auto join to bookmarked chats if requested.*/ - if (set_getbool(&ic->acc->set, "auto_join")) { - buf = g_strdup_printf("SEARCH BOOKMARKEDCHATS\n"); - skype_write(ic, buf); - g_free(buf); - } + if (set_getbool(&ic->acc->set, "auto_join")) + skype_printf(ic, "SEARCH BOOKMARKEDCHATS\n"); return st; } @@ -987,11 +957,8 @@ static void skype_login(account_t *acc) static void skype_logout(struct im_connection *ic) { struct skype_data *sd = ic->proto_data; - char *buf; - buf = g_strdup_printf("SET USERSTATUS OFFLINE\n"); - skype_write(ic, buf); - g_free(buf); + skype_printf(ic, "SET USERSTATUS OFFLINE\n"); g_free(sd->username); g_free(sd->handle); @@ -1002,7 +969,7 @@ static void skype_logout(struct im_connection *ic) static int skype_buddy_msg(struct im_connection *ic, char *who, char *message, int flags) { - char *buf, *ptr, *nick; + char *ptr, *nick; int st; nick = g_strdup(who); @@ -1011,12 +978,10 @@ static int skype_buddy_msg(struct im_connection *ic, char *who, char *message, *ptr = '\0'; if (!strncmp(who, "skypeconsole", 12)) - buf = g_strdup_printf("%s\n", message); + st = skype_printf(ic, "%s\n", message); else - buf = g_strdup_printf("MESSAGE %s %s\n", nick, message); + st = skype_printf(ic, "MESSAGE %s %s\n", nick, message); g_free(nick); - st = skype_write(ic, buf); - g_free(buf); return st; } @@ -1036,15 +1001,12 @@ static void skype_set_away(struct im_connection *ic, char *state_txt, char *message) { const struct skype_away_state *state; - char *buf; if (strcmp(state_txt, GAIM_AWAY_CUSTOM) == 0) state = skype_away_state_by_name("Away"); else state = skype_away_state_by_name(state_txt); - buf = g_strdup_printf("SET USERSTATUS %s\n", state->code); - skype_write(ic, buf); - g_free(buf); + skype_printf(ic, "SET USERSTATUS %s\n", state->code); } static GList *skype_away_states(struct im_connection *ic) @@ -1064,11 +1026,8 @@ static char *skype_set_display_name(set_t *set, char *value) { account_t *acc = set->data; struct im_connection *ic = acc->ic; - char *buf; - buf = g_strdup_printf("SET PROFILE FULLNAME %s", value); - skype_write(ic, buf); - g_free(buf); + skype_printf(ic, "SET PROFILE FULLNAME %s", value); return value; } @@ -1076,11 +1035,8 @@ static char *skype_set_balance(set_t *set, char *value) { account_t *acc = set->data; struct im_connection *ic = acc->ic; - char *buf; - buf = g_strdup_printf("GET PROFILE PSTN_BALANCE"); - skype_write(ic, buf); - g_free(buf); + skype_printf(ic, "GET PROFILE PSTN_BALANCE"); return value; } @@ -1089,7 +1045,7 @@ static char *skype_set_call(set_t *set, char *value) account_t *acc = set->data; struct im_connection *ic = acc->ic; struct skype_data *sd = ic->proto_data; - char *nick, *ptr, *buf; + char *nick, *ptr; if (value) { user_t *u = user_find(acc->irc, value); @@ -1102,17 +1058,13 @@ static char *skype_set_call(set_t *set, char *value) if (ptr) *ptr = '\0'; - buf = g_strdup_printf("CALL %s", nick); - skype_write(ic, buf); - g_free(buf); + skype_printf(ic, "CALL %s", nick); g_free(nick); } else { /* We are ending a call */ if (sd->call_id) { - buf = g_strdup_printf("SET CALL %s STATUS FINISHED", + skype_printf(ic, "SET CALL %s STATUS FINISHED", sd->call_id); - skype_write(ic, buf); - g_free(buf); g_free(sd->call_id); sd->call_id = NULL; } else @@ -1123,61 +1075,51 @@ static char *skype_set_call(set_t *set, char *value) static void skype_add_buddy(struct im_connection *ic, char *who, char *group) { - char *buf, *nick, *ptr; + char *nick, *ptr; nick = g_strdup(who); ptr = strchr(nick, '@'); if (ptr) *ptr = '\0'; - buf = g_strdup_printf("SET USER %s BUDDYSTATUS 2 Please authorize me\n", + skype_printf(ic, "SET USER %s BUDDYSTATUS 2 Please authorize me\n", nick); - skype_write(ic, buf); g_free(nick); } static void skype_remove_buddy(struct im_connection *ic, char *who, char *group) { - char *buf, *nick, *ptr; + char *nick, *ptr; nick = g_strdup(who); ptr = strchr(nick, '@'); if (ptr) *ptr = '\0'; - buf = g_strdup_printf("SET USER %s BUDDYSTATUS 1\n", nick); - skype_write(ic, buf); + skype_printf(ic, "SET USER %s BUDDYSTATUS 1\n", nick); g_free(nick); } void skype_chat_msg(struct groupchat *gc, char *message, int flags) { struct im_connection *ic = gc->ic; - char *buf; - buf = g_strdup_printf("CHATMESSAGE %s %s\n", gc->title, message); - skype_write(ic, buf); - g_free(buf); + skype_printf(ic, "CHATMESSAGE %s %s\n", gc->title, message); } void skype_chat_leave(struct groupchat *gc) { struct im_connection *ic = gc->ic; - char *buf; - buf = g_strdup_printf("ALTER CHAT %s LEAVE\n", gc->title); - skype_write(ic, buf); - g_free(buf); + skype_printf(ic, "ALTER CHAT %s LEAVE\n", gc->title); gc->data = (void *)TRUE; } void skype_chat_invite(struct groupchat *gc, char *who, char *message) { struct im_connection *ic = gc->ic; - char *buf, *ptr, *nick; + char *ptr, *nick; nick = g_strdup(message); ptr = strchr(nick, '@'); if (ptr) *ptr = '\0'; - buf = g_strdup_printf("ALTER CHAT %s ADDMEMBERS %s\n", gc->title, nick); - skype_write(ic, buf); - g_free(buf); + skype_printf(ic, "ALTER CHAT %s ADDMEMBERS %s\n", gc->title, nick); g_free(nick); } @@ -1185,25 +1127,20 @@ void skype_chat_topic(struct groupchat *gc, char *message) { struct im_connection *ic = gc->ic; struct skype_data *sd = ic->proto_data; - char *buf; - buf = g_strdup_printf("ALTER CHAT %s SETTOPIC %s\n", + skype_printf(ic, "ALTER CHAT %s SETTOPIC %s\n", gc->title, message); - skype_write(ic, buf); - g_free(buf); sd->topic_wait = 1; } struct groupchat *skype_chat_with(struct im_connection *ic, char *who) { struct skype_data *sd = ic->proto_data; - char *ptr, *nick, *buf; + char *ptr, *nick; nick = g_strdup(who); ptr = strchr(nick, '@'); if (ptr) *ptr = '\0'; - buf = g_strdup_printf("CHAT CREATE %s\n", nick); - skype_write(ic, buf); - g_free(buf); + skype_printf(ic, "CHAT CREATE %s\n", nick); sd->groupchat_with = g_strdup(nick); g_free(nick); /* We create a fake chat for now. We will replace it with a real one in @@ -1213,56 +1150,26 @@ struct groupchat *skype_chat_with(struct im_connection *ic, char *who) static void skype_get_info(struct im_connection *ic, char *who) { - char *ptr, *nick, *buf; + char *ptr, *nick; nick = g_strdup(who); ptr = strchr(nick, '@'); if (ptr) *ptr = '\0'; - buf = g_strdup_printf("GET USER %s FULLNAME\n", nick); - skype_write(ic, buf); - g_free(buf); - buf = g_strdup_printf("GET USER %s PHONE_HOME\n", nick); - skype_write(ic, buf); - g_free(buf); - buf = g_strdup_printf("GET USER %s PHONE_OFFICE\n", nick); - skype_write(ic, buf); - g_free(buf); - buf = g_strdup_printf("GET USER %s PHONE_MOBILE\n", nick); - skype_write(ic, buf); - g_free(buf); - buf = g_strdup_printf("GET USER %s NROF_AUTHED_BUDDIES\n", nick); - skype_write(ic, buf); - g_free(buf); - buf = g_strdup_printf("GET USER %s TIMEZONE\n", nick); - skype_write(ic, buf); - g_free(buf); - buf = g_strdup_printf("GET USER %s LASTONLINETIMESTAMP\n", nick); - skype_write(ic, buf); - g_free(buf); - buf = g_strdup_printf("GET USER %s BIRTHDAY\n", nick); - skype_write(ic, buf); - g_free(buf); - buf = g_strdup_printf("GET USER %s SEX\n", nick); - skype_write(ic, buf); - g_free(buf); - buf = g_strdup_printf("GET USER %s LANGUAGE\n", nick); - skype_write(ic, buf); - g_free(buf); - buf = g_strdup_printf("GET USER %s COUNTRY\n", nick); - skype_write(ic, buf); - g_free(buf); - buf = g_strdup_printf("GET USER %s PROVINCE\n", nick); - skype_write(ic, buf); - g_free(buf); - buf = g_strdup_printf("GET USER %s CITY\n", nick); - skype_write(ic, buf); - g_free(buf); - buf = g_strdup_printf("GET USER %s HOMEPAGE\n", nick); - skype_write(ic, buf); - g_free(buf); - buf = g_strdup_printf("GET USER %s ABOUT\n", nick); - skype_write(ic, buf); - g_free(buf); + skype_printf(ic, "GET USER %s FULLNAME\n", nick); + skype_printf(ic, "GET USER %s PHONE_HOME\n", nick); + skype_printf(ic, "GET USER %s PHONE_OFFICE\n", nick); + skype_printf(ic, "GET USER %s PHONE_MOBILE\n", nick); + skype_printf(ic, "GET USER %s NROF_AUTHED_BUDDIES\n", nick); + skype_printf(ic, "GET USER %s TIMEZONE\n", nick); + skype_printf(ic, "GET USER %s LASTONLINETIMESTAMP\n", nick); + skype_printf(ic, "GET USER %s BIRTHDAY\n", nick); + skype_printf(ic, "GET USER %s SEX\n", nick); + skype_printf(ic, "GET USER %s LANGUAGE\n", nick); + skype_printf(ic, "GET USER %s COUNTRY\n", nick); + skype_printf(ic, "GET USER %s PROVINCE\n", nick); + skype_printf(ic, "GET USER %s CITY\n", nick); + skype_printf(ic, "GET USER %s HOMEPAGE\n", nick); + skype_printf(ic, "GET USER %s ABOUT\n", nick); } static void skype_set_my_name(struct im_connection *ic, char *info) |