diff options
author | Miklos Vajna <vmiklos@frugalware.org> | 2011-01-02 03:32:38 +0100 |
---|---|---|
committer | Miklos Vajna <vmiklos@frugalware.org> | 2011-01-02 03:32:38 +0100 |
commit | 89d68459fe977cc76e22c09e8b099c7961863883 (patch) | |
tree | 847a8c3c369249211df61f0e7e22389e7db63181 | |
parent | 8b8d1bed18306366a9b4c6bf7fc5604c1ae05e1f (diff) |
Parse the user list of each group
-rw-r--r-- | skype/skype.c | 92 |
1 files changed, 91 insertions, 1 deletions
diff --git a/skype/skype.c b/skype/skype.c index 8dd07ebe..b3062712 100644 --- a/skype/skype.c +++ b/skype/skype.c @@ -1,7 +1,7 @@ /* * skype.c - Skype plugin for BitlBee * - * Copyright (c) 2007, 2008, 2009, 2010 by Miklos Vajna <vmiklos@frugalware.org> + * Copyright (c) 2007, 2008, 2009, 2010, 2011 by Miklos Vajna <vmiklos@frugalware.org> * * 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 @@ -107,6 +107,8 @@ struct skype_data { int failurereason; /* If this is just an update of an already received message. */ int is_edit; + /* List of struct skype_group* */ + GList *groups; }; struct skype_away_state { @@ -120,6 +122,12 @@ struct skype_buddy_ask_data { char *handle; }; +struct skype_group { + int id; + char *name; + GList *users; +}; + /* * Tables */ @@ -735,6 +743,82 @@ static void skype_parse_filetransfer(struct im_connection *ic, char *line) } } +static struct skype_group *skype_group_by_id(struct im_connection *ic, int id) { + struct skype_data *sd = ic->proto_data; + int i; + + for (i = 0; i < g_list_length(sd->groups); i++) { + struct skype_group *sg = (struct skype_group *)g_list_nth_data(sd->groups, i); + + if (sg->id == id) + return sg; + } + return NULL; +} + +static void skype_group_free(struct skype_group* sg, gboolean usersonly) { + int i; + + for (i = 0; i < g_list_length(sg->users); i++) { + char *user = g_list_nth_data(sg->users, i); + g_free(user); + } + sg->users = NULL; + if (usersonly) + return; + g_free(sg->name); + g_free(sg); +} + +static void skype_parse_group(struct im_connection *ic, char *line) +{ + struct skype_data *sd = ic->proto_data; + char *id = strchr(line, ' '); + + if (!++id) + return; + + char *info = strchr(id, ' '); + + if (!info) + return; + *info = '\0'; + info++; + + if (!strncmp(info, "DISPLAYNAME ", 12)) { + info += 12; + + /* Name given for a group ID: try to update it or insert a new + * one if not found */ + struct skype_group *sg = skype_group_by_id(ic, atoi(id)); + if (sg) { + g_free(sg->name); + sg->name = g_strdup(info); + } else { + sg = g_new0(struct skype_group, 1); + sg->id = atoi(id); + sg->name = g_strdup(info); + sd->groups = g_list_append(sd->groups, sg); + } + } else if (!strncmp(info, "USERS ", 6)) { + struct skype_group *sg = skype_group_by_id(ic, atoi(id)); + + if (sg) { + char **i; + char **users = g_strsplit(info + 6, ", ", 0); + + skype_group_free(sg, TRUE); + i = users; + while (*i) { + sg->users = g_list_append(sg->users, g_strdup(*i)); + i++; + } + g_strfreev(users); + } else + log_message(LOGLVL_ERROR, "No skype group with id %s. That's probably a bug.", id); + } +} + static void skype_parse_chat(struct im_connection *ic, char *line) { struct skype_data *sd = ic->proto_data; @@ -892,6 +976,7 @@ static gboolean skype_read_callback(gpointer data, gint fd, { "CALL ", skype_parse_call }, { "FILETRANSFER ", skype_parse_filetransfer }, { "CHAT ", skype_parse_chat }, + { "GROUP ", skype_parse_group }, { "PASSWORD ", skype_parse_password }, { "PROFILE PSTN_BALANCE ", skype_parse_profile }, { "PING", skype_parse_ping }, @@ -1006,9 +1091,14 @@ static void skype_login(account_t *acc) static void skype_logout(struct im_connection *ic) { struct skype_data *sd = ic->proto_data; + int i; skype_printf(ic, "SET USERSTATUS OFFLINE\n"); + for (i = 0; i < g_list_length(sd->groups); i++) { + struct skype_group *sg = (struct skype_group *)g_list_nth_data(sd->groups, i); + skype_group_free(sg, FALSE); + } g_free(sd->username); g_free(sd->handle); g_free(sd); |