Fri, 05 Jun 2009 05:42:05 +0000
Allow Gadu-Gadu accounts to specify Connect Server. Refs #6691.
Modified patch from kreez. Awaiting name for COPYRIGHT/ChangeLog.
| 11414 | 1 | /** |
| 2 | * @file buddylist.c | |
| 3 | * | |
| 15884 | 4 | * purple |
| 11414 | 5 | * |
| 6 | * Copyright (C) 2005 Bartosz Oler <bartosz@bzimage.us> | |
| 7 | * | |
| 8 | * This program is free software; you can redistribute it and/or modify | |
| 9 | * it under the terms of the GNU General Public License as published by | |
| 10 | * the Free Software Foundation; either version 2 of the License, or | |
| 11 | * (at your option) any later version. | |
| 12 | * | |
| 13 | * This program is distributed in the hope that it will be useful, | |
| 14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| 16 | * GNU General Public License for more details. | |
| 17 | * | |
| 18 | * You should have received a copy of the GNU General Public License | |
| 19 | * along with this program; if not, write to the Free Software | |
|
19859
71d37b57eff2
The FSF changed its address a while ago; our files were out of date.
John Bailey <rekkanoryo@rekkanoryo.org>
parents:
15884
diff
changeset
|
20 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA |
| 11414 | 21 | */ |
| 22 | ||
| 23 | ||
| 13318 | 24 | #include <libgadu.h> |
| 11414 | 25 | |
| 26 | #include "gg.h" | |
|
13627
44233a1064f9
[gaim-migrate @ 16013]
Evan Schoenberg <evands@pidgin.im>
parents:
13318
diff
changeset
|
27 | #include "gg-utils.h" |
| 11414 | 28 | #include "buddylist.h" |
| 29 | ||
|
20199
f417c49285e9
applied changes from 45b8a011cd84e0e69d7ac5a6fb84f55cdb0809cb
Luke Schierer <lschiere@pidgin.im>
parents:
19859
diff
changeset
|
30 | #define F_FIRSTNAME 0 |
|
f417c49285e9
applied changes from 45b8a011cd84e0e69d7ac5a6fb84f55cdb0809cb
Luke Schierer <lschiere@pidgin.im>
parents:
19859
diff
changeset
|
31 | #define F_LASTNAME 1 |
|
f417c49285e9
applied changes from 45b8a011cd84e0e69d7ac5a6fb84f55cdb0809cb
Luke Schierer <lschiere@pidgin.im>
parents:
19859
diff
changeset
|
32 | /* #define F_ 2 */ |
|
f417c49285e9
applied changes from 45b8a011cd84e0e69d7ac5a6fb84f55cdb0809cb
Luke Schierer <lschiere@pidgin.im>
parents:
19859
diff
changeset
|
33 | #define F_NICKNAME 3 |
|
f417c49285e9
applied changes from 45b8a011cd84e0e69d7ac5a6fb84f55cdb0809cb
Luke Schierer <lschiere@pidgin.im>
parents:
19859
diff
changeset
|
34 | #define F_PHONE 4 |
|
f417c49285e9
applied changes from 45b8a011cd84e0e69d7ac5a6fb84f55cdb0809cb
Luke Schierer <lschiere@pidgin.im>
parents:
19859
diff
changeset
|
35 | #define F_GROUP 5 |
|
f417c49285e9
applied changes from 45b8a011cd84e0e69d7ac5a6fb84f55cdb0809cb
Luke Schierer <lschiere@pidgin.im>
parents:
19859
diff
changeset
|
36 | #define F_UIN 6 |
| 11414 | 37 | |
| 15884 | 38 | /* void ggp_buddylist_send(PurpleConnection *gc) {{{ */ |
| 39 | void ggp_buddylist_send(PurpleConnection *gc) | |
| 11414 | 40 | { |
| 41 | GGPInfo *info = gc->proto_data; | |
| 15884 | 42 | PurpleAccount *account = purple_connection_get_account(gc); |
|
27199
ab2af9d15cba
Use purple_find_buddies() instead of iterating the buddy list.
Paul Aurich <darkrain42@pidgin.im>
parents:
27197
diff
changeset
|
43 | GSList *buddies; |
|
ab2af9d15cba
Use purple_find_buddies() instead of iterating the buddy list.
Paul Aurich <darkrain42@pidgin.im>
parents:
27197
diff
changeset
|
44 | uin_t *userlist; |
|
ab2af9d15cba
Use purple_find_buddies() instead of iterating the buddy list.
Paul Aurich <darkrain42@pidgin.im>
parents:
27197
diff
changeset
|
45 | gchar *types; |
|
ab2af9d15cba
Use purple_find_buddies() instead of iterating the buddy list.
Paul Aurich <darkrain42@pidgin.im>
parents:
27197
diff
changeset
|
46 | int i = 0, ret = 0; |
|
ab2af9d15cba
Use purple_find_buddies() instead of iterating the buddy list.
Paul Aurich <darkrain42@pidgin.im>
parents:
27197
diff
changeset
|
47 | int size; |
| 12007 | 48 | |
|
27199
ab2af9d15cba
Use purple_find_buddies() instead of iterating the buddy list.
Paul Aurich <darkrain42@pidgin.im>
parents:
27197
diff
changeset
|
49 | buddies = purple_find_buddies(account, NULL); |
| 12007 | 50 | |
|
27199
ab2af9d15cba
Use purple_find_buddies() instead of iterating the buddy list.
Paul Aurich <darkrain42@pidgin.im>
parents:
27197
diff
changeset
|
51 | size = g_slist_length(buddies); |
|
ab2af9d15cba
Use purple_find_buddies() instead of iterating the buddy list.
Paul Aurich <darkrain42@pidgin.im>
parents:
27197
diff
changeset
|
52 | userlist = g_new(uin_t, size); |
|
ab2af9d15cba
Use purple_find_buddies() instead of iterating the buddy list.
Paul Aurich <darkrain42@pidgin.im>
parents:
27197
diff
changeset
|
53 | types = g_new(gchar, size); |
| 12007 | 54 | |
|
27199
ab2af9d15cba
Use purple_find_buddies() instead of iterating the buddy list.
Paul Aurich <darkrain42@pidgin.im>
parents:
27197
diff
changeset
|
55 | for (buddies = purple_find_buddies(account, NULL); buddies; |
|
ab2af9d15cba
Use purple_find_buddies() instead of iterating the buddy list.
Paul Aurich <darkrain42@pidgin.im>
parents:
27197
diff
changeset
|
56 | buddies = g_slist_delete_link(buddies, buddies), ++i) |
|
ab2af9d15cba
Use purple_find_buddies() instead of iterating the buddy list.
Paul Aurich <darkrain42@pidgin.im>
parents:
27197
diff
changeset
|
57 | { |
|
ab2af9d15cba
Use purple_find_buddies() instead of iterating the buddy list.
Paul Aurich <darkrain42@pidgin.im>
parents:
27197
diff
changeset
|
58 | PurpleBuddy *buddy = buddies->data; |
|
ab2af9d15cba
Use purple_find_buddies() instead of iterating the buddy list.
Paul Aurich <darkrain42@pidgin.im>
parents:
27197
diff
changeset
|
59 | const gchar *name = purple_buddy_get_name(buddy); |
|
24939
d25fdf62ae92
moved gg to use the api rather than structs directly
Gary Kramlich <grim@reaperworld.com>
parents:
20199
diff
changeset
|
60 | |
|
27199
ab2af9d15cba
Use purple_find_buddies() instead of iterating the buddy list.
Paul Aurich <darkrain42@pidgin.im>
parents:
27197
diff
changeset
|
61 | userlist[i] = ggp_str_to_uin(name); |
|
ab2af9d15cba
Use purple_find_buddies() instead of iterating the buddy list.
Paul Aurich <darkrain42@pidgin.im>
parents:
27197
diff
changeset
|
62 | types[i] = GG_USER_NORMAL; |
|
ab2af9d15cba
Use purple_find_buddies() instead of iterating the buddy list.
Paul Aurich <darkrain42@pidgin.im>
parents:
27197
diff
changeset
|
63 | purple_debug_info("gg", "ggp_buddylist_send: adding %d\n", |
|
ab2af9d15cba
Use purple_find_buddies() instead of iterating the buddy list.
Paul Aurich <darkrain42@pidgin.im>
parents:
27197
diff
changeset
|
64 | userlist[i]); |
| 11414 | 65 | } |
| 66 | ||
|
25287
fab49163239d
Fix a connection timeout that occurs with empty Gadu-Gadu buddy lists.
Martin Rosinski <martin@zone-mr.net>
parents:
24826
diff
changeset
|
67 | ret = gg_notify_ex(info->session, userlist, types, size); |
|
fab49163239d
Fix a connection timeout that occurs with empty Gadu-Gadu buddy lists.
Martin Rosinski <martin@zone-mr.net>
parents:
24826
diff
changeset
|
68 | purple_debug_info("gg", "send: ret=%d; size=%d\n", ret, size); |
|
27199
ab2af9d15cba
Use purple_find_buddies() instead of iterating the buddy list.
Paul Aurich <darkrain42@pidgin.im>
parents:
27197
diff
changeset
|
69 | |
| 11414 | 70 | if (userlist) { |
| 71 | g_free(userlist); | |
| 72 | g_free(types); | |
| 73 | } | |
| 74 | } | |
| 75 | /* }}} */ | |
| 76 | ||
| 15884 | 77 | /* void ggp_buddylist_load(PurpleConnection *gc, char *buddylist) {{{ */ |
| 78 | void ggp_buddylist_load(PurpleConnection *gc, char *buddylist) | |
| 11414 | 79 | { |
| 15884 | 80 | PurpleBuddy *buddy; |
| 81 | PurpleGroup *group; | |
| 11414 | 82 | gchar **users_tbl; |
| 83 | int i; | |
|
24826
1ce0a7a3ab84
Validate Gadu-Gadu UID's and perform proper CP1250 to UTF-8 conversions when
Adam Strzelecki <ono@java.pl>
parents:
20199
diff
changeset
|
84 | char *utf8buddylist = charset_convert(buddylist, "CP1250", "UTF-8"); |
| 11414 | 85 | |
|
20199
f417c49285e9
applied changes from 45b8a011cd84e0e69d7ac5a6fb84f55cdb0809cb
Luke Schierer <lschiere@pidgin.im>
parents:
19859
diff
changeset
|
86 | /* Don't limit the number of records in a buddylist. */ |
|
24826
1ce0a7a3ab84
Validate Gadu-Gadu UID's and perform proper CP1250 to UTF-8 conversions when
Adam Strzelecki <ono@java.pl>
parents:
20199
diff
changeset
|
87 | users_tbl = g_strsplit(utf8buddylist, "\r\n", -1); |
| 11414 | 88 | |
| 89 | for (i = 0; users_tbl[i] != NULL; i++) { | |
| 90 | gchar **data_tbl; | |
| 91 | gchar *name, *show, *g; | |
| 92 | ||
| 93 | if (strlen(users_tbl[i]) == 0) | |
| 94 | continue; | |
| 95 | ||
| 96 | data_tbl = g_strsplit(users_tbl[i], ";", 8); | |
| 15288 | 97 | if (ggp_array_size(data_tbl) < 8) { |
| 15884 | 98 | purple_debug_warning("gg", |
| 15288 | 99 | "Something is wrong on line %d of the buddylist. Skipping.\n", |
| 100 | i + 1); | |
| 101 | continue; | |
| 102 | } | |
| 11414 | 103 | |
|
24826
1ce0a7a3ab84
Validate Gadu-Gadu UID's and perform proper CP1250 to UTF-8 conversions when
Adam Strzelecki <ono@java.pl>
parents:
20199
diff
changeset
|
104 | show = data_tbl[F_NICKNAME]; |
|
20199
f417c49285e9
applied changes from 45b8a011cd84e0e69d7ac5a6fb84f55cdb0809cb
Luke Schierer <lschiere@pidgin.im>
parents:
19859
diff
changeset
|
105 | name = data_tbl[F_UIN]; |
|
24826
1ce0a7a3ab84
Validate Gadu-Gadu UID's and perform proper CP1250 to UTF-8 conversions when
Adam Strzelecki <ono@java.pl>
parents:
20199
diff
changeset
|
106 | if ('\0' == *name || !atol(name)) { |
| 15884 | 107 | purple_debug_warning("gg", |
|
24826
1ce0a7a3ab84
Validate Gadu-Gadu UID's and perform proper CP1250 to UTF-8 conversions when
Adam Strzelecki <ono@java.pl>
parents:
20199
diff
changeset
|
108 | "Identifier on line %d of the buddylist is not a number. Skipping.\n", |
| 14925 | 109 | i + 1); |
| 110 | continue; | |
| 111 | } | |
| 112 | ||
| 15288 | 113 | if ('\0' == *show) { |
|
24826
1ce0a7a3ab84
Validate Gadu-Gadu UID's and perform proper CP1250 to UTF-8 conversions when
Adam Strzelecki <ono@java.pl>
parents:
20199
diff
changeset
|
114 | show = name; |
| 14925 | 115 | } |
| 11414 | 116 | |
|
20199
f417c49285e9
applied changes from 45b8a011cd84e0e69d7ac5a6fb84f55cdb0809cb
Luke Schierer <lschiere@pidgin.im>
parents:
19859
diff
changeset
|
117 | purple_debug_info("gg", "got buddy: name=%s; show=%s\n", name, show); |
| 11414 | 118 | |
| 15884 | 119 | if (purple_find_buddy(purple_connection_get_account(gc), name)) { |
| 11414 | 120 | g_strfreev(data_tbl); |
| 121 | continue; | |
| 122 | } | |
| 123 | ||
| 124 | g = g_strdup("Gadu-Gadu"); | |
| 125 | ||
|
20199
f417c49285e9
applied changes from 45b8a011cd84e0e69d7ac5a6fb84f55cdb0809cb
Luke Schierer <lschiere@pidgin.im>
parents:
19859
diff
changeset
|
126 | if ('\0' != data_tbl[F_GROUP]) { |
| 15288 | 127 | /* XXX: Probably buddy should be added to all the groups. */ |
| 11414 | 128 | /* Hard limit to at most 50 groups */ |
|
20199
f417c49285e9
applied changes from 45b8a011cd84e0e69d7ac5a6fb84f55cdb0809cb
Luke Schierer <lschiere@pidgin.im>
parents:
19859
diff
changeset
|
129 | gchar **group_tbl = g_strsplit(data_tbl[F_GROUP], ",", 50); |
| 15288 | 130 | if (ggp_array_size(group_tbl) > 0) { |
| 11414 | 131 | g_free(g); |
|
24826
1ce0a7a3ab84
Validate Gadu-Gadu UID's and perform proper CP1250 to UTF-8 conversions when
Adam Strzelecki <ono@java.pl>
parents:
20199
diff
changeset
|
132 | g = g_strdup(group_tbl[0]); |
| 11414 | 133 | } |
| 134 | g_strfreev(group_tbl); | |
| 135 | } | |
| 136 | ||
| 15884 | 137 | buddy = purple_buddy_new(purple_connection_get_account(gc), name, |
|
20199
f417c49285e9
applied changes from 45b8a011cd84e0e69d7ac5a6fb84f55cdb0809cb
Luke Schierer <lschiere@pidgin.im>
parents:
19859
diff
changeset
|
138 | strlen(show) ? show : NULL); |
| 12007 | 139 | |
| 15884 | 140 | if (!(group = purple_find_group(g))) { |
| 141 | group = purple_group_new(g); | |
| 142 | purple_blist_add_group(group, NULL); | |
| 11414 | 143 | } |
| 144 | ||
| 15884 | 145 | purple_blist_add_buddy(buddy, NULL, group, NULL); |
| 11414 | 146 | g_free(g); |
| 147 | ||
| 148 | g_strfreev(data_tbl); | |
| 149 | } | |
| 150 | g_strfreev(users_tbl); | |
|
24826
1ce0a7a3ab84
Validate Gadu-Gadu UID's and perform proper CP1250 to UTF-8 conversions when
Adam Strzelecki <ono@java.pl>
parents:
20199
diff
changeset
|
151 | g_free(utf8buddylist); |
| 11414 | 152 | |
| 153 | ggp_buddylist_send(gc); | |
| 154 | } | |
| 155 | /* }}} */ | |
| 156 | ||
| 15884 | 157 | /* char *ggp_buddylist_dump(PurpleAccount *account) {{{ */ |
| 158 | char *ggp_buddylist_dump(PurpleAccount *account) | |
| 11414 | 159 | { |
|
27199
ab2af9d15cba
Use purple_find_buddies() instead of iterating the buddy list.
Paul Aurich <darkrain42@pidgin.im>
parents:
27197
diff
changeset
|
160 | GSList *buddies; |
|
25854
56a02cb817d9
explicit merge of 'a4359f8d6420120f500339b6fe48677e700f088f'
Richard Laager <rlaager@pidgin.im>
diff
changeset
|
161 | GString *buddylist = g_string_sized_new(1024); |
| 11414 | 162 | char *ptr; |
| 163 | ||
|
27199
ab2af9d15cba
Use purple_find_buddies() instead of iterating the buddy list.
Paul Aurich <darkrain42@pidgin.im>
parents:
27197
diff
changeset
|
164 | for (buddies = purple_find_buddies(account, NULL); buddies; |
|
ab2af9d15cba
Use purple_find_buddies() instead of iterating the buddy list.
Paul Aurich <darkrain42@pidgin.im>
parents:
27197
diff
changeset
|
165 | buddies = g_slist_delete_link(buddies, buddies)) { |
|
ab2af9d15cba
Use purple_find_buddies() instead of iterating the buddy list.
Paul Aurich <darkrain42@pidgin.im>
parents:
27197
diff
changeset
|
166 | PurpleBuddy *buddy = buddies->data; |
|
ab2af9d15cba
Use purple_find_buddies() instead of iterating the buddy list.
Paul Aurich <darkrain42@pidgin.im>
parents:
27197
diff
changeset
|
167 | PurpleGroup *group = purple_buddy_get_group(buddy); |
|
ab2af9d15cba
Use purple_find_buddies() instead of iterating the buddy list.
Paul Aurich <darkrain42@pidgin.im>
parents:
27197
diff
changeset
|
168 | const char *bname = purple_buddy_get_name(buddy); |
|
ab2af9d15cba
Use purple_find_buddies() instead of iterating the buddy list.
Paul Aurich <darkrain42@pidgin.im>
parents:
27197
diff
changeset
|
169 | const char *gname = purple_group_get_name(group); |
|
ab2af9d15cba
Use purple_find_buddies() instead of iterating the buddy list.
Paul Aurich <darkrain42@pidgin.im>
parents:
27197
diff
changeset
|
170 | const char *alias = purple_buddy_get_alias(buddy); |
| 11414 | 171 | |
|
27199
ab2af9d15cba
Use purple_find_buddies() instead of iterating the buddy list.
Paul Aurich <darkrain42@pidgin.im>
parents:
27197
diff
changeset
|
172 | if (alias == NULL) |
|
ab2af9d15cba
Use purple_find_buddies() instead of iterating the buddy list.
Paul Aurich <darkrain42@pidgin.im>
parents:
27197
diff
changeset
|
173 | alias = bname; |
| 11414 | 174 | |
|
27199
ab2af9d15cba
Use purple_find_buddies() instead of iterating the buddy list.
Paul Aurich <darkrain42@pidgin.im>
parents:
27197
diff
changeset
|
175 | g_string_append_printf(buddylist, |
|
ab2af9d15cba
Use purple_find_buddies() instead of iterating the buddy list.
Paul Aurich <darkrain42@pidgin.im>
parents:
27197
diff
changeset
|
176 | "%s;%s;%s;%s;%s;%s;%s;%s%s\r\n", |
|
ab2af9d15cba
Use purple_find_buddies() instead of iterating the buddy list.
Paul Aurich <darkrain42@pidgin.im>
parents:
27197
diff
changeset
|
177 | alias, alias, alias, alias, |
|
ab2af9d15cba
Use purple_find_buddies() instead of iterating the buddy list.
Paul Aurich <darkrain42@pidgin.im>
parents:
27197
diff
changeset
|
178 | "", gname, bname, "", ""); |
| 11414 | 179 | } |
| 180 | ||
|
25295
2fa5deedaefd
Fix a leak "KuSh" discovered using "cppcheck". Fixes #7858. Also, make the relevant code less of a horrible abomination.
Daniel Atallah <datallah@pidgin.im>
parents:
25287
diff
changeset
|
181 | ptr = charset_convert(buddylist->str, "UTF-8", "CP1250"); |
|
2fa5deedaefd
Fix a leak "KuSh" discovered using "cppcheck". Fixes #7858. Also, make the relevant code less of a horrible abomination.
Daniel Atallah <datallah@pidgin.im>
parents:
25287
diff
changeset
|
182 | g_string_free(buddylist, TRUE); |
|
24826
1ce0a7a3ab84
Validate Gadu-Gadu UID's and perform proper CP1250 to UTF-8 conversions when
Adam Strzelecki <ono@java.pl>
parents:
20199
diff
changeset
|
183 | return ptr; |
| 11414 | 184 | } |
| 185 | /* }}} */ | |
| 186 | ||
| 187 | ||
| 12007 | 188 | /* vim: set ts=8 sts=0 sw=8 noet: */ |