Sat, 08 May 2004 23:34:30 +0000
[gaim-migrate @ 9677]
" Fixes a few warnings on 64bit machines. Also fixes
yahoo auth on 64bit machines which would have taken me
awhile if marv didn't point me in the right direction.
I've applied to my local 32bit copy and everything
seems to be working fine." --Gary Kramlich
committer: Luke Schierer <lschiere@pidgin.im>
| 5228 | 1 | /* |
| 2 | * gaim | |
| 3 | * | |
| 8046 | 4 | * Gaim is the legal property of its developers, whose names are too numerous |
| 5 | * to list here. Please refer to the COPYRIGHT file distributed with this | |
| 6 | * source distribution. | |
| 5228 | 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 | |
| 20 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
| 21 | * | |
| 22 | */ | |
|
5872
754c63f29b77
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5855
diff
changeset
|
23 | #include "internal.h" |
| 5228 | 24 | #include "blist.h" |
|
5872
754c63f29b77
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5855
diff
changeset
|
25 | #include "conversation.h" |
|
754c63f29b77
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5855
diff
changeset
|
26 | #include "debug.h" |
| 6034 | 27 | #include "multi.h" |
|
5436
a0e0bacaa196
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
28 | #include "notify.h" |
|
5545
a8b1a1262402
[gaim-migrate @ 5946]
Christian Hammond <chipx86@chipx86.com>
parents:
5541
diff
changeset
|
29 | #include "prefs.h" |
|
5872
754c63f29b77
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5855
diff
changeset
|
30 | #include "privacy.h" |
|
754c63f29b77
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5855
diff
changeset
|
31 | #include "prpl.h" |
|
754c63f29b77
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5855
diff
changeset
|
32 | #include "server.h" |
|
6485
3c7ba18e32f1
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
33 | #include "signals.h" |
|
5872
754c63f29b77
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5855
diff
changeset
|
34 | #include "util.h" |
| 7132 | 35 | #include "xmlnode.h" |
| 5228 | 36 | |
| 37 | #define PATHSIZE 1024 | |
| 38 | ||
|
7098
22eabd4f5ed4
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
39 | GaimBuddyList *gaimbuddylist = NULL; |
|
22eabd4f5ed4
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
40 | static GaimBlistUiOps *blist_ui_ops = NULL; |
| 5228 | 41 | |
| 7693 | 42 | struct gaim_blist_node_setting { |
| 43 | enum { | |
| 44 | GAIM_BLIST_NODE_SETTING_BOOL, | |
| 45 | GAIM_BLIST_NODE_SETTING_INT, | |
| 46 | GAIM_BLIST_NODE_SETTING_STRING | |
| 47 | } type; | |
| 48 | union { | |
| 49 | gboolean boolean; | |
| 50 | int integer; | |
| 51 | char *string; | |
| 52 | } value; | |
| 53 | }; | |
| 54 | ||
| 55 | ||
|
6846
f814f02dca87
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
56 | |
| 5228 | 57 | /***************************************************************************** |
| 58 | * Private Utility functions * | |
| 59 | *****************************************************************************/ | |
| 60 | static GaimBlistNode *gaim_blist_get_last_sibling(GaimBlistNode *node) | |
| 61 | { | |
| 62 | GaimBlistNode *n = node; | |
| 63 | if (!n) | |
| 64 | return NULL; | |
| 65 | while (n->next) | |
| 66 | n = n->next; | |
| 67 | return n; | |
| 68 | } | |
| 6695 | 69 | |
| 5228 | 70 | static GaimBlistNode *gaim_blist_get_last_child(GaimBlistNode *node) |
| 71 | { | |
| 72 | if (!node) | |
| 73 | return NULL; | |
| 74 | return gaim_blist_get_last_sibling(node->child); | |
| 75 | } | |
| 76 | ||
| 5247 | 77 | struct _gaim_hbuddy { |
| 78 | char *name; | |
|
5563
d5a7852aa0cb
[gaim-migrate @ 5965]
Christian Hammond <chipx86@chipx86.com>
parents:
5545
diff
changeset
|
79 | GaimAccount *account; |
| 5758 | 80 | GaimBlistNode *group; |
| 5247 | 81 | }; |
| 82 | ||
| 83 | static guint _gaim_blist_hbuddy_hash (struct _gaim_hbuddy *hb) | |
| 84 | { | |
| 85 | return g_str_hash(hb->name); | |
| 86 | } | |
| 87 | ||
| 88 | static guint _gaim_blist_hbuddy_equal (struct _gaim_hbuddy *hb1, struct _gaim_hbuddy *hb2) | |
| 89 | { | |
| 5758 | 90 | return ((!strcmp(hb1->name, hb2->name)) && hb1->account == hb2->account && hb1->group == hb2->group); |
| 5247 | 91 | } |
| 92 | ||
| 6742 | 93 | static void _gaim_blist_hbuddy_free_key(struct _gaim_hbuddy *hb) |
| 94 | { | |
| 95 | g_free(hb->name); | |
| 96 | g_free(hb); | |
| 97 | } | |
| 98 | ||
|
6006
d862aa2f47ca
[gaim-migrate @ 6454]
Mark Doliner <markdoliner@pidgin.im>
parents:
5985
diff
changeset
|
99 | static void blist_pref_cb(const char *name, GaimPrefType typ, gpointer value, gpointer data) |
|
d862aa2f47ca
[gaim-migrate @ 6454]
Mark Doliner <markdoliner@pidgin.im>
parents:
5985
diff
changeset
|
100 | { |
|
7098
22eabd4f5ed4
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
101 | GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
| 6695 | 102 | GaimBlistNode *gnode, *cnode, *bnode; |
| 6012 | 103 | |
| 104 | if (!ops) | |
| 105 | return; | |
| 106 | ||
| 6695 | 107 | for(gnode = gaimbuddylist->root; gnode; gnode = gnode->next) { |
| 108 | if(!GAIM_BLIST_NODE_IS_GROUP(gnode)) | |
| 6012 | 109 | continue; |
| 6695 | 110 | for(cnode = gnode->child; cnode; cnode = cnode->next) { |
| 111 | if(GAIM_BLIST_NODE_IS_CONTACT(cnode)) { | |
| 112 | for(bnode = cnode->child; bnode; bnode = bnode->next) { | |
| 113 | if(!GAIM_BLIST_NODE_IS_BUDDY(bnode)) | |
| 114 | continue; | |
| 115 | ops->update(gaimbuddylist, bnode); | |
| 116 | } | |
| 117 | } else if(GAIM_BLIST_NODE_IS_CHAT(cnode)) { | |
| 118 | ops->update(gaimbuddylist, cnode); | |
| 119 | } | |
| 6012 | 120 | } |
| 121 | } | |
|
6006
d862aa2f47ca
[gaim-migrate @ 6454]
Mark Doliner <markdoliner@pidgin.im>
parents:
5985
diff
changeset
|
122 | } |
|
d862aa2f47ca
[gaim-migrate @ 6454]
Mark Doliner <markdoliner@pidgin.im>
parents:
5985
diff
changeset
|
123 | |
| 7312 | 124 | GaimContact *gaim_buddy_get_contact(GaimBuddy *buddy) |
| 6843 | 125 | { |
| 126 | return (GaimContact*)((GaimBlistNode*)buddy)->parent; | |
| 127 | } | |
| 128 | ||
| 129 | static void gaim_contact_compute_priority_buddy(GaimContact *contact) { | |
| 130 | GaimBlistNode *bnode; | |
| 7826 | 131 | int contact_score = INT_MAX; |
| 6870 | 132 | contact->priority = NULL; |
| 6843 | 133 | |
| 134 | for(bnode = ((GaimBlistNode*)contact)->child; bnode; bnode = bnode->next) { | |
| 135 | GaimBuddy *buddy; | |
| 7420 | 136 | int score = 0; |
| 137 | ||
| 6843 | 138 | if(!GAIM_BLIST_NODE_IS_BUDDY(bnode)) |
| 139 | continue; | |
| 140 | buddy = (GaimBuddy*)bnode; | |
| 141 | if(!gaim_account_is_connected(buddy->account)) | |
| 142 | continue; | |
| 143 | ||
| 7420 | 144 | if (!GAIM_BUDDY_IS_ONLINE(buddy)) |
| 145 | score += gaim_prefs_get_int("/core/contact/offline_score"); | |
| 146 | if (buddy->uc & UC_UNAVAILABLE) | |
| 147 | score += gaim_prefs_get_int("/core/contact/away_score"); | |
| 148 | if (buddy->idle) | |
| 149 | score += gaim_prefs_get_int("/core/contact/idle_score"); | |
| 150 | ||
| 151 | score += gaim_account_get_int(buddy->account, "score", 0); | |
| 152 | ||
| 7826 | 153 | if (score < contact_score) { |
| 6843 | 154 | contact->priority = buddy; |
| 7826 | 155 | contact_score = score; |
| 7420 | 156 | } |
| 157 | if (gaim_prefs_get_bool("/core/contact/last_match")) | |
| 7826 | 158 | if (score == contact_score) |
| 6843 | 159 | contact->priority = buddy; |
| 160 | } | |
| 161 | } | |
| 162 | ||
| 163 | ||
| 5228 | 164 | /***************************************************************************** |
| 165 | * Public API functions * | |
| 166 | *****************************************************************************/ | |
| 167 | ||
|
7098
22eabd4f5ed4
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
168 | GaimBuddyList *gaim_blist_new() |
| 5228 | 169 | { |
|
7098
22eabd4f5ed4
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
170 | GaimBuddyList *gbl = g_new0(GaimBuddyList, 1); |
| 5228 | 171 | |
|
7035
76bca80cd91d
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
7003
diff
changeset
|
172 | gbl->ui_ops = gaim_blist_get_ui_ops(); |
| 5228 | 173 | |
| 6742 | 174 | gbl->buddies = g_hash_table_new_full((GHashFunc)_gaim_blist_hbuddy_hash, |
| 175 | (GEqualFunc)_gaim_blist_hbuddy_equal, | |
| 176 | (GDestroyNotify)_gaim_blist_hbuddy_free_key, NULL); | |
| 5247 | 177 | |
| 5228 | 178 | if (gbl->ui_ops != NULL && gbl->ui_ops->new_list != NULL) |
| 179 | gbl->ui_ops->new_list(gbl); | |
| 180 | ||
|
6485
3c7ba18e32f1
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
181 | gaim_prefs_connect_callback("/core/buddies/use_server_alias", |
|
3c7ba18e32f1
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
182 | blist_pref_cb, NULL); |
|
3c7ba18e32f1
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
183 | |
|
6006
d862aa2f47ca
[gaim-migrate @ 6454]
Mark Doliner <markdoliner@pidgin.im>
parents:
5985
diff
changeset
|
184 | |
| 5228 | 185 | return gbl; |
| 186 | } | |
| 187 | ||
| 188 | void | |
|
7098
22eabd4f5ed4
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
189 | gaim_set_blist(GaimBuddyList *list) |
| 5228 | 190 | { |
| 191 | gaimbuddylist = list; | |
| 192 | } | |
| 193 | ||
|
7098
22eabd4f5ed4
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
194 | GaimBuddyList * |
| 5228 | 195 | gaim_get_blist(void) |
| 196 | { | |
| 197 | return gaimbuddylist; | |
| 198 | } | |
| 199 | ||
| 6695 | 200 | void gaim_blist_show () |
| 5228 | 201 | { |
|
7098
22eabd4f5ed4
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
202 | GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
| 5228 | 203 | if (ops) |
| 204 | ops->show(gaimbuddylist); | |
| 205 | } | |
| 206 | ||
| 207 | void gaim_blist_destroy() | |
| 208 | { | |
|
7098
22eabd4f5ed4
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
209 | GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
|
8259
7ed91862683d
[gaim-migrate @ 8982]
Christian Hammond <chipx86@chipx86.com>
parents:
8200
diff
changeset
|
210 | gaim_debug(GAIM_DEBUG_INFO, "blist", "Destroying\n"); |
| 5228 | 211 | if (ops) |
| 212 | ops->destroy(gaimbuddylist); | |
| 213 | } | |
| 214 | ||
| 215 | void gaim_blist_set_visible (gboolean show) | |
| 216 | { | |
|
7098
22eabd4f5ed4
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
217 | GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
| 5228 | 218 | if (ops) |
| 219 | ops->set_visible(gaimbuddylist, show); | |
| 220 | } | |
| 221 | ||
| 6695 | 222 | void gaim_blist_update_buddy_status (GaimBuddy *buddy, int status) |
| 5228 | 223 | { |
|
7098
22eabd4f5ed4
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
224 | GaimBlistUiOps *ops; |
|
8129
93475b6a1fed
[gaim-migrate @ 8834]
Christian Hammond <chipx86@chipx86.com>
parents:
8071
diff
changeset
|
225 | int old_status = buddy->uc; |
|
5266
cb6fe050ff33
[gaim-migrate @ 5638]
Christian Hammond <chipx86@chipx86.com>
parents:
5259
diff
changeset
|
226 | |
|
cb6fe050ff33
[gaim-migrate @ 5638]
Christian Hammond <chipx86@chipx86.com>
parents:
5259
diff
changeset
|
227 | |
|
cb6fe050ff33
[gaim-migrate @ 5638]
Christian Hammond <chipx86@chipx86.com>
parents:
5259
diff
changeset
|
228 | ops = gaimbuddylist->ui_ops; |
| 5228 | 229 | |
|
8129
93475b6a1fed
[gaim-migrate @ 8834]
Christian Hammond <chipx86@chipx86.com>
parents:
8071
diff
changeset
|
230 | if (old_status != status) { |
|
93475b6a1fed
[gaim-migrate @ 8834]
Christian Hammond <chipx86@chipx86.com>
parents:
8071
diff
changeset
|
231 | buddy->uc = status; |
|
93475b6a1fed
[gaim-migrate @ 8834]
Christian Hammond <chipx86@chipx86.com>
parents:
8071
diff
changeset
|
232 | gaim_contact_compute_priority_buddy(gaim_buddy_get_contact(buddy)); |
|
93475b6a1fed
[gaim-migrate @ 8834]
Christian Hammond <chipx86@chipx86.com>
parents:
8071
diff
changeset
|
233 | |
|
93475b6a1fed
[gaim-migrate @ 8834]
Christian Hammond <chipx86@chipx86.com>
parents:
8071
diff
changeset
|
234 | if ((status & UC_UNAVAILABLE) != (old_status & UC_UNAVAILABLE)) { |
| 7549 | 235 | if (status & UC_UNAVAILABLE) |
| 236 | gaim_signal_emit(gaim_blist_get_handle(), "buddy-away", buddy); | |
| 237 | else | |
| 238 | gaim_signal_emit(gaim_blist_get_handle(), "buddy-back", buddy); | |
| 239 | } | |
|
5305
5a6fc3d321d9
[gaim-migrate @ 5677]
David J. Brigada <brigada@prism.net>
parents:
5292
diff
changeset
|
240 | } |
|
8129
93475b6a1fed
[gaim-migrate @ 8834]
Christian Hammond <chipx86@chipx86.com>
parents:
8071
diff
changeset
|
241 | |
| 5228 | 242 | if (ops) |
| 243 | ops->update(gaimbuddylist, (GaimBlistNode*)buddy); | |
| 244 | } | |
| 245 | ||
| 6695 | 246 | static gboolean presence_update_timeout_cb(GaimBuddy *buddy) { |
|
7098
22eabd4f5ed4
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
247 | GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
|
6640
007eb21016b4
[gaim-migrate @ 7165]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
248 | GaimConversation *conv; |
|
007eb21016b4
[gaim-migrate @ 7165]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
249 | |
|
007eb21016b4
[gaim-migrate @ 7165]
Christian Hammond <chipx86@chipx86.com>
parents:
6564
diff
changeset
|
250 | conv = gaim_find_conversation_with_account(buddy->name, buddy->account); |
| 5228 | 251 | |
| 252 | if(buddy->present == GAIM_BUDDY_SIGNING_ON) { | |
| 253 | buddy->present = GAIM_BUDDY_ONLINE; | |
| 254 | } else if(buddy->present == GAIM_BUDDY_SIGNING_OFF) { | |
| 255 | buddy->present = GAIM_BUDDY_OFFLINE; | |
| 6860 | 256 | ((GaimContact*)((GaimBlistNode*)buddy)->parent)->online--; |
| 257 | if(((GaimContact*)((GaimBlistNode*)buddy)->parent)->online == 0) | |
| 258 | ((GaimGroup *)((GaimBlistNode *)buddy)->parent->parent)->online--; | |
| 5228 | 259 | } |
| 260 | ||
| 261 | buddy->timer = 0; | |
| 262 | ||
| 263 | if (ops) | |
| 264 | ops->update(gaimbuddylist, (GaimBlistNode*)buddy); | |
| 265 | ||
|
6392
3db2b3c7b5aa
[gaim-migrate @ 6897]
Christian Hammond <chipx86@chipx86.com>
parents:
6378
diff
changeset
|
266 | if (conv) { |
|
3db2b3c7b5aa
[gaim-migrate @ 6897]
Christian Hammond <chipx86@chipx86.com>
parents:
6378
diff
changeset
|
267 | if (buddy->present == GAIM_BUDDY_ONLINE) |
|
3db2b3c7b5aa
[gaim-migrate @ 6897]
Christian Hammond <chipx86@chipx86.com>
parents:
6378
diff
changeset
|
268 | gaim_conversation_update(conv, GAIM_CONV_ACCOUNT_ONLINE); |
|
3db2b3c7b5aa
[gaim-migrate @ 6897]
Christian Hammond <chipx86@chipx86.com>
parents:
6378
diff
changeset
|
269 | else if (buddy->present == GAIM_BUDDY_OFFLINE) |
|
3db2b3c7b5aa
[gaim-migrate @ 6897]
Christian Hammond <chipx86@chipx86.com>
parents:
6378
diff
changeset
|
270 | gaim_conversation_update(conv, GAIM_CONV_ACCOUNT_OFFLINE); |
|
3db2b3c7b5aa
[gaim-migrate @ 6897]
Christian Hammond <chipx86@chipx86.com>
parents:
6378
diff
changeset
|
271 | } |
|
3db2b3c7b5aa
[gaim-migrate @ 6897]
Christian Hammond <chipx86@chipx86.com>
parents:
6378
diff
changeset
|
272 | |
| 5228 | 273 | return FALSE; |
| 274 | } | |
| 275 | ||
| 6695 | 276 | void gaim_blist_update_buddy_presence(GaimBuddy *buddy, int presence) { |
|
7098
22eabd4f5ed4
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
277 | GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
| 6961 | 278 | gboolean do_something = FALSE; |
| 5228 | 279 | |
| 280 | if (!GAIM_BUDDY_IS_ONLINE(buddy) && presence) { | |
| 6901 | 281 | int old_present = buddy->present; |
| 5228 | 282 | buddy->present = GAIM_BUDDY_SIGNING_ON; |
|
6485
3c7ba18e32f1
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
283 | gaim_signal_emit(gaim_blist_get_handle(), "buddy-signed-on", buddy); |
| 6961 | 284 | do_something = TRUE; |
| 6901 | 285 | |
| 286 | if(old_present != GAIM_BUDDY_SIGNING_OFF) { | |
| 287 | ((GaimContact*)((GaimBlistNode*)buddy)->parent)->online++; | |
| 288 | if(((GaimContact*)((GaimBlistNode*)buddy)->parent)->online == 1) | |
| 289 | ((GaimGroup *)((GaimBlistNode *)buddy)->parent->parent)->online++; | |
| 290 | } | |
| 5228 | 291 | } else if(GAIM_BUDDY_IS_ONLINE(buddy) && !presence) { |
| 292 | buddy->present = GAIM_BUDDY_SIGNING_OFF; | |
|
6485
3c7ba18e32f1
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
293 | gaim_signal_emit(gaim_blist_get_handle(), "buddy-signed-off", buddy); |
| 6961 | 294 | do_something = TRUE; |
| 5228 | 295 | } |
| 296 | ||
| 6961 | 297 | if(do_something) { |
| 5228 | 298 | if(buddy->timer > 0) |
| 8287 | 299 | gaim_timeout_remove(buddy->timer); |
| 8273 | 300 | buddy->timer = gaim_timeout_add(10000, (GSourceFunc)presence_update_timeout_cb, buddy); |
| 6961 | 301 | |
| 302 | gaim_contact_compute_priority_buddy(gaim_buddy_get_contact(buddy)); | |
| 303 | if (ops) | |
| 304 | ops->update(gaimbuddylist, (GaimBlistNode*)buddy); | |
| 5228 | 305 | } |
| 306 | } | |
| 307 | ||
| 7950 | 308 | void gaim_blist_update_buddy_signon (GaimBuddy *buddy, time_t signon) |
| 309 | { | |
| 310 | GaimBlistUiOps *ops = gaimbuddylist->ui_ops; | |
| 311 | if(buddy->signon == signon) | |
| 312 | return; | |
| 313 | ||
| 314 | buddy->signon = signon; | |
| 315 | if (ops) | |
| 316 | ops->update(gaimbuddylist,(GaimBlistNode*)buddy); | |
| 317 | } | |
| 5228 | 318 | |
| 6695 | 319 | void gaim_blist_update_buddy_idle (GaimBuddy *buddy, int idle) |
| 5228 | 320 | { |
|
7098
22eabd4f5ed4
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
321 | GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
| 6961 | 322 | if(buddy->idle == idle) |
| 323 | return; | |
| 324 | ||
| 5228 | 325 | buddy->idle = idle; |
| 6843 | 326 | gaim_contact_compute_priority_buddy(gaim_buddy_get_contact(buddy)); |
| 5228 | 327 | if (ops) |
| 328 | ops->update(gaimbuddylist, (GaimBlistNode*)buddy); | |
| 329 | } | |
| 6695 | 330 | |
| 331 | void gaim_blist_update_buddy_evil (GaimBuddy *buddy, int warning) | |
| 5228 | 332 | { |
|
7098
22eabd4f5ed4
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
333 | GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
| 6961 | 334 | if(buddy->evil == warning) |
| 335 | return; | |
| 336 | ||
| 5228 | 337 | buddy->evil = warning; |
| 338 | if (ops) | |
| 339 | ops->update(gaimbuddylist,(GaimBlistNode*)buddy); | |
| 340 | } | |
| 6695 | 341 | |
| 342 | void gaim_blist_update_buddy_icon(GaimBuddy *buddy) { | |
|
7098
22eabd4f5ed4
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
343 | GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
| 5228 | 344 | if(ops) |
| 345 | ops->update(gaimbuddylist, (GaimBlistNode*)buddy); | |
| 346 | } | |
| 6695 | 347 | |
| 348 | void gaim_blist_rename_buddy (GaimBuddy *buddy, const char *name) | |
| 5228 | 349 | { |
|
7098
22eabd4f5ed4
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
350 | GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
| 8675 | 351 | struct _gaim_hbuddy *hb = g_new(struct _gaim_hbuddy, 1); |
| 352 | ||
| 353 | hb->name = g_strdup(gaim_normalize(buddy->account, buddy->name)); | |
| 354 | hb->account = buddy->account; | |
| 355 | hb->group = ((GaimBlistNode *)buddy)->parent->parent; | |
| 356 | g_hash_table_remove(gaimbuddylist->buddies, hb); | |
| 357 | ||
| 358 | g_free(hb->name); | |
| 359 | hb->name = g_strdup(gaim_normalize(buddy->account, name)); | |
| 360 | g_hash_table_replace(gaimbuddylist->buddies, hb, buddy); | |
| 361 | ||
| 5634 | 362 | g_free(buddy->name); |
| 5228 | 363 | buddy->name = g_strdup(name); |
| 364 | if (ops) | |
| 365 | ops->update(gaimbuddylist, (GaimBlistNode*)buddy); | |
| 366 | } | |
| 5234 | 367 | |
|
7118
280b3b85a28a
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7117
diff
changeset
|
368 | void gaim_blist_alias_chat(GaimChat *chat, const char *alias) |
| 5234 | 369 | { |
|
7098
22eabd4f5ed4
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
370 | GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
| 5234 | 371 | |
| 5237 | 372 | g_free(chat->alias); |
| 5234 | 373 | |
| 5237 | 374 | if(alias && strlen(alias)) |
| 375 | chat->alias = g_strdup(alias); | |
| 376 | else | |
| 377 | chat->alias = NULL; | |
| 378 | ||
| 5234 | 379 | if(ops) |
| 380 | ops->update(gaimbuddylist, (GaimBlistNode*)chat); | |
| 381 | } | |
| 382 | ||
| 6695 | 383 | void gaim_blist_alias_buddy (GaimBuddy *buddy, const char *alias) |
| 5228 | 384 | { |
|
7098
22eabd4f5ed4
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
385 | GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
|
5676
d3c2fdaf4821
[gaim-migrate @ 6094]
Christian Hammond <chipx86@chipx86.com>
parents:
5634
diff
changeset
|
386 | GaimConversation *conv; |
| 5228 | 387 | |
| 388 | g_free(buddy->alias); | |
| 389 | ||
| 390 | if(alias && strlen(alias)) | |
| 391 | buddy->alias = g_strdup(alias); | |
| 392 | else | |
| 393 | buddy->alias = NULL; | |
| 394 | ||
| 395 | if (ops) | |
| 396 | ops->update(gaimbuddylist, (GaimBlistNode*)buddy); | |
| 397 | ||
| 398 | conv = gaim_find_conversation_with_account(buddy->name, buddy->account); | |
| 399 | ||
| 400 | if (conv) | |
| 401 | gaim_conversation_autoset_title(conv); | |
| 402 | } | |
| 403 | ||
| 6695 | 404 | void gaim_blist_server_alias_buddy (GaimBuddy *buddy, const char *alias) |
|
6058
0d5c66a5da5d
[gaim-migrate @ 6508]
Mark Doliner <markdoliner@pidgin.im>
parents:
6036
diff
changeset
|
405 | { |
|
7098
22eabd4f5ed4
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
406 | GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
|
6058
0d5c66a5da5d
[gaim-migrate @ 6508]
Mark Doliner <markdoliner@pidgin.im>
parents:
6036
diff
changeset
|
407 | GaimConversation *conv; |
|
0d5c66a5da5d
[gaim-migrate @ 6508]
Mark Doliner <markdoliner@pidgin.im>
parents:
6036
diff
changeset
|
408 | |
|
0d5c66a5da5d
[gaim-migrate @ 6508]
Mark Doliner <markdoliner@pidgin.im>
parents:
6036
diff
changeset
|
409 | g_free(buddy->server_alias); |
|
0d5c66a5da5d
[gaim-migrate @ 6508]
Mark Doliner <markdoliner@pidgin.im>
parents:
6036
diff
changeset
|
410 | |
|
0d5c66a5da5d
[gaim-migrate @ 6508]
Mark Doliner <markdoliner@pidgin.im>
parents:
6036
diff
changeset
|
411 | if(alias && strlen(alias) && g_utf8_validate(alias, -1, NULL)) |
|
0d5c66a5da5d
[gaim-migrate @ 6508]
Mark Doliner <markdoliner@pidgin.im>
parents:
6036
diff
changeset
|
412 | buddy->server_alias = g_strdup(alias); |
|
0d5c66a5da5d
[gaim-migrate @ 6508]
Mark Doliner <markdoliner@pidgin.im>
parents:
6036
diff
changeset
|
413 | else |
|
0d5c66a5da5d
[gaim-migrate @ 6508]
Mark Doliner <markdoliner@pidgin.im>
parents:
6036
diff
changeset
|
414 | buddy->server_alias = NULL; |
|
0d5c66a5da5d
[gaim-migrate @ 6508]
Mark Doliner <markdoliner@pidgin.im>
parents:
6036
diff
changeset
|
415 | |
|
0d5c66a5da5d
[gaim-migrate @ 6508]
Mark Doliner <markdoliner@pidgin.im>
parents:
6036
diff
changeset
|
416 | if (ops) |
|
0d5c66a5da5d
[gaim-migrate @ 6508]
Mark Doliner <markdoliner@pidgin.im>
parents:
6036
diff
changeset
|
417 | ops->update(gaimbuddylist, (GaimBlistNode*)buddy); |
|
0d5c66a5da5d
[gaim-migrate @ 6508]
Mark Doliner <markdoliner@pidgin.im>
parents:
6036
diff
changeset
|
418 | |
|
0d5c66a5da5d
[gaim-migrate @ 6508]
Mark Doliner <markdoliner@pidgin.im>
parents:
6036
diff
changeset
|
419 | conv = gaim_find_conversation_with_account(buddy->name, buddy->account); |
|
0d5c66a5da5d
[gaim-migrate @ 6508]
Mark Doliner <markdoliner@pidgin.im>
parents:
6036
diff
changeset
|
420 | |
|
0d5c66a5da5d
[gaim-migrate @ 6508]
Mark Doliner <markdoliner@pidgin.im>
parents:
6036
diff
changeset
|
421 | if (conv) |
|
0d5c66a5da5d
[gaim-migrate @ 6508]
Mark Doliner <markdoliner@pidgin.im>
parents:
6036
diff
changeset
|
422 | gaim_conversation_autoset_title(conv); |
|
0d5c66a5da5d
[gaim-migrate @ 6508]
Mark Doliner <markdoliner@pidgin.im>
parents:
6036
diff
changeset
|
423 | } |
|
0d5c66a5da5d
[gaim-migrate @ 6508]
Mark Doliner <markdoliner@pidgin.im>
parents:
6036
diff
changeset
|
424 | |
| 6695 | 425 | void gaim_blist_rename_group(GaimGroup *group, const char *name) |
| 5228 | 426 | { |
|
7098
22eabd4f5ed4
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
427 | GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
| 6695 | 428 | GaimGroup *dest_group; |
| 5346 | 429 | GaimBlistNode *prev, *child, *next; |
| 430 | GSList *accts; | |
| 431 | ||
| 432 | if(!name || !strlen(name) || !strcmp(name, group->name)) { | |
| 433 | /* nothing to do here */ | |
| 434 | return; | |
| 435 | } else if((dest_group = gaim_find_group(name))) { | |
| 436 | /* here we're merging two groups */ | |
| 437 | prev = gaim_blist_get_last_child((GaimBlistNode*)dest_group); | |
| 438 | child = ((GaimBlistNode*)group)->child; | |
| 439 | ||
| 440 | while(child) | |
| 441 | { | |
| 442 | next = child->next; | |
| 6695 | 443 | if(GAIM_BLIST_NODE_IS_CONTACT(child)) { |
| 444 | GaimBlistNode *bnode; | |
| 445 | gaim_blist_add_contact((GaimContact *)child, dest_group, prev); | |
| 446 | for(bnode = child->child; bnode; bnode = bnode->next) | |
| 447 | gaim_blist_add_buddy((GaimBuddy*)bnode, (GaimContact*)child, | |
| 448 | NULL, bnode->prev); | |
| 5346 | 449 | prev = child; |
| 450 | } else if(GAIM_BLIST_NODE_IS_CHAT(child)) { | |
|
7118
280b3b85a28a
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7117
diff
changeset
|
451 | gaim_blist_add_chat((GaimChat *)child, dest_group, prev); |
| 5346 | 452 | prev = child; |
| 453 | } else { | |
| 454 | gaim_debug(GAIM_DEBUG_ERROR, "blist", | |
| 455 | "Unknown child type in group %s\n", group->name); | |
| 456 | } | |
| 457 | child = next; | |
| 458 | } | |
| 459 | for (accts = gaim_group_get_accounts(group); accts; accts = g_slist_remove(accts, accts->data)) { | |
|
5563
d5a7852aa0cb
[gaim-migrate @ 5965]
Christian Hammond <chipx86@chipx86.com>
parents:
5545
diff
changeset
|
460 | GaimAccount *account = accts->data; |
| 5346 | 461 | serv_rename_group(account->gc, group, name); |
| 462 | } | |
| 463 | gaim_blist_remove_group(group); | |
| 464 | } else { | |
| 465 | /* a simple rename */ | |
| 466 | for (accts = gaim_group_get_accounts(group); accts; accts = g_slist_remove(accts, accts->data)) { | |
|
5563
d5a7852aa0cb
[gaim-migrate @ 5965]
Christian Hammond <chipx86@chipx86.com>
parents:
5545
diff
changeset
|
467 | GaimAccount *account = accts->data; |
| 5346 | 468 | serv_rename_group(account->gc, group, name); |
| 469 | } | |
| 470 | g_free(group->name); | |
| 471 | group->name = g_strdup(name); | |
| 472 | if (ops) | |
| 473 | ops->update(gaimbuddylist, (GaimBlistNode*)group); | |
| 474 | } | |
| 5228 | 475 | } |
| 5234 | 476 | |
| 7693 | 477 | static void gaim_blist_node_initialize_settings(GaimBlistNode* node); |
| 478 | ||
| 7125 | 479 | GaimChat *gaim_chat_new(GaimAccount *account, const char *alias, GHashTable *components) |
| 5234 | 480 | { |
|
7118
280b3b85a28a
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7117
diff
changeset
|
481 | GaimChat *chat; |
|
7098
22eabd4f5ed4
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
482 | GaimBlistUiOps *ops; |
| 5234 | 483 | |
| 5237 | 484 | if(!components) |
| 5234 | 485 | return NULL; |
| 486 | ||
|
7118
280b3b85a28a
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7117
diff
changeset
|
487 | chat = g_new0(GaimChat, 1); |
| 5234 | 488 | chat->account = account; |
| 5237 | 489 | if(alias && strlen(alias)) |
| 490 | chat->alias = g_strdup(alias); | |
| 5234 | 491 | chat->components = components; |
| 7693 | 492 | gaim_blist_node_initialize_settings((GaimBlistNode*)chat); |
| 5234 | 493 | |
| 494 | ((GaimBlistNode*)chat)->type = GAIM_BLIST_CHAT_NODE; | |
| 495 | ||
|
7035
76bca80cd91d
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
7003
diff
changeset
|
496 | ops = gaim_blist_get_ui_ops(); |
| 5234 | 497 | |
| 498 | if (ops != NULL && ops->new_node != NULL) | |
| 499 | ops->new_node((GaimBlistNode *)chat); | |
| 500 | ||
| 501 | return chat; | |
| 502 | } | |
| 503 | ||
| 7125 | 504 | char *gaim_chat_get_display_name(GaimChat *chat) |
| 6034 | 505 | { |
| 506 | char *name; | |
| 507 | ||
| 508 | if(chat->alias){ | |
| 509 | name = g_strdup(chat->alias); | |
| 510 | } | |
| 511 | else{ | |
| 512 | GList *parts; | |
| 513 | GaimPlugin *prpl; | |
| 514 | GaimPluginProtocolInfo *prpl_info; | |
| 515 | struct proto_chat_entry *pce; | |
| 516 | ||
| 7956 | 517 | prpl = gaim_find_prpl(gaim_account_get_protocol_id(chat->account)); |
| 6034 | 518 | prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(prpl); |
| 519 | ||
| 520 | parts = prpl_info->chat_info(chat->account->gc); | |
| 521 | ||
| 522 | pce = parts->data; | |
| 523 | name = g_markup_escape_text(g_hash_table_lookup(chat->components, | |
| 524 | pce->identifier), -1); | |
| 525 | g_list_free(parts); | |
| 526 | } | |
| 527 | ||
| 528 | return name; | |
| 529 | } | |
| 530 | ||
| 6695 | 531 | GaimBuddy *gaim_buddy_new(GaimAccount *account, const char *screenname, const char *alias) |
| 5228 | 532 | { |
| 6695 | 533 | GaimBuddy *b; |
|
7098
22eabd4f5ed4
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
534 | GaimBlistUiOps *ops; |
| 5228 | 535 | |
| 6695 | 536 | b = g_new0(GaimBuddy, 1); |
| 5228 | 537 | b->account = account; |
| 538 | b->name = g_strdup(screenname); | |
| 539 | b->alias = g_strdup(alias); | |
| 7693 | 540 | gaim_blist_node_initialize_settings((GaimBlistNode*)b); |
| 5228 | 541 | ((GaimBlistNode*)b)->type = GAIM_BLIST_BUDDY_NODE; |
| 542 | ||
|
7035
76bca80cd91d
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
7003
diff
changeset
|
543 | ops = gaim_blist_get_ui_ops(); |
| 5228 | 544 | |
| 545 | if (ops != NULL && ops->new_node != NULL) | |
| 546 | ops->new_node((GaimBlistNode *)b); | |
| 547 | ||
| 548 | return b; | |
| 549 | } | |
| 5634 | 550 | |
|
6846
f814f02dca87
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
551 | void |
|
f814f02dca87
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
552 | gaim_buddy_set_icon(GaimBuddy *buddy, GaimBuddyIcon *icon) |
|
f814f02dca87
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
553 | { |
|
f814f02dca87
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
554 | g_return_if_fail(buddy != NULL); |
|
f814f02dca87
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
555 | |
|
f814f02dca87
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
556 | if (buddy->icon == icon) |
|
f814f02dca87
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
557 | return; |
|
f814f02dca87
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
558 | |
|
f814f02dca87
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
559 | if (buddy->icon != NULL) |
|
f814f02dca87
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
560 | gaim_buddy_icon_unref(buddy->icon); |
|
f814f02dca87
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
561 | |
|
f814f02dca87
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
562 | buddy->icon = (icon == NULL ? NULL : gaim_buddy_icon_ref(icon)); |
|
f814f02dca87
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
563 | |
|
6886
97734a57c0f5
[gaim-migrate @ 7432]
Christian Hammond <chipx86@chipx86.com>
parents:
6885
diff
changeset
|
564 | gaim_buddy_icon_cache(icon, buddy); |
|
6846
f814f02dca87
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
565 | |
|
f814f02dca87
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
566 | gaim_blist_update_buddy_icon(buddy); |
|
f814f02dca87
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
567 | } |
|
f814f02dca87
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
568 | |
|
f814f02dca87
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
569 | GaimBuddyIcon * |
|
f814f02dca87
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
570 | gaim_buddy_get_icon(const GaimBuddy *buddy) |
|
f814f02dca87
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
571 | { |
|
f814f02dca87
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
572 | g_return_val_if_fail(buddy != NULL, NULL); |
|
f814f02dca87
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
573 | |
|
f814f02dca87
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
574 | return buddy->icon; |
|
f814f02dca87
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
575 | } |
|
f814f02dca87
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
576 | |
|
7118
280b3b85a28a
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7117
diff
changeset
|
577 | void gaim_blist_add_chat(GaimChat *chat, GaimGroup *group, GaimBlistNode *node) |
| 5234 | 578 | { |
| 579 | GaimBlistNode *n = node, *cnode = (GaimBlistNode*)chat; | |
| 6695 | 580 | GaimGroup *g = group; |
|
7098
22eabd4f5ed4
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
581 | GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
| 5234 | 582 | gboolean save = FALSE; |
| 583 | ||
| 6774 | 584 | |
| 585 | g_return_if_fail(chat != NULL); | |
| 586 | g_return_if_fail(GAIM_BLIST_NODE_IS_CHAT((GaimBlistNode*)chat)); | |
| 587 | ||
| 5234 | 588 | if (!n) { |
| 589 | if (!g) { | |
| 590 | g = gaim_group_new(_("Chats")); | |
| 5634 | 591 | gaim_blist_add_group(g, |
| 592 | gaim_blist_get_last_sibling(gaimbuddylist->root)); | |
| 5234 | 593 | } |
| 594 | } else { | |
| 6695 | 595 | g = (GaimGroup*)n->parent; |
| 5234 | 596 | } |
| 597 | ||
| 598 | /* if we're moving to overtop of ourselves, do nothing */ | |
| 599 | if(cnode == n) | |
| 600 | return; | |
| 601 | ||
| 602 | if (cnode->parent) { | |
| 603 | /* This chat was already in the list and is | |
| 604 | * being moved. | |
| 605 | */ | |
| 6695 | 606 | ((GaimGroup *)cnode->parent)->totalsize--; |
| 5855 | 607 | if (gaim_account_is_connected(chat->account)) { |
| 6695 | 608 | ((GaimGroup *)cnode->parent)->online--; |
| 609 | ((GaimGroup *)cnode->parent)->currentsize--; | |
| 5287 | 610 | } |
| 5234 | 611 | if(cnode->next) |
| 612 | cnode->next->prev = cnode->prev; | |
| 613 | if(cnode->prev) | |
| 614 | cnode->prev->next = cnode->next; | |
| 615 | if(cnode->parent->child == cnode) | |
| 616 | cnode->parent->child = cnode->next; | |
| 617 | ||
| 618 | ops->remove(gaimbuddylist, cnode); | |
| 619 | ||
| 620 | save = TRUE; | |
| 621 | } | |
| 622 | ||
| 623 | if (n) { | |
| 624 | if(n->next) | |
| 625 | n->next->prev = cnode; | |
| 626 | cnode->next = n->next; | |
| 627 | cnode->prev = n; | |
| 628 | cnode->parent = n->parent; | |
| 629 | n->next = cnode; | |
| 6695 | 630 | ((GaimGroup *)n->parent)->totalsize++; |
| 5855 | 631 | if (gaim_account_is_connected(chat->account)) { |
| 6695 | 632 | ((GaimGroup *)n->parent)->online++; |
| 633 | ((GaimGroup *)n->parent)->currentsize++; | |
| 5287 | 634 | } |
| 5234 | 635 | } else { |
| 5634 | 636 | if(((GaimBlistNode*)g)->child) |
| 637 | ((GaimBlistNode*)g)->child->prev = cnode; | |
| 638 | cnode->next = ((GaimBlistNode*)g)->child; | |
| 639 | cnode->prev = NULL; | |
| 5234 | 640 | ((GaimBlistNode*)g)->child = cnode; |
| 641 | cnode->parent = (GaimBlistNode*)g; | |
| 5277 | 642 | g->totalsize++; |
| 5855 | 643 | if (gaim_account_is_connected(chat->account)) { |
| 5287 | 644 | g->online++; |
| 5277 | 645 | g->currentsize++; |
| 5287 | 646 | } |
| 5234 | 647 | } |
| 648 | ||
| 649 | if (ops) | |
| 650 | ops->update(gaimbuddylist, (GaimBlistNode*)cnode); | |
| 651 | if (save) | |
| 652 | gaim_blist_save(); | |
| 653 | } | |
| 654 | ||
|
7879
8e5689b82138
[gaim-migrate @ 8533]
Mark Doliner <markdoliner@pidgin.im>
parents:
7859
diff
changeset
|
655 | void gaim_blist_add_buddy(GaimBuddy *buddy, GaimContact *contact, GaimGroup *group, GaimBlistNode *node) |
| 5228 | 656 | { |
| 6695 | 657 | GaimBlistNode *cnode, *bnode; |
| 658 | GaimGroup *g; | |
| 659 | GaimContact *c; | |
|
7098
22eabd4f5ed4
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
660 | GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
| 6695 | 661 | gboolean save = FALSE; |
| 5247 | 662 | struct _gaim_hbuddy *hb; |
| 6695 | 663 | |
| 664 | g_return_if_fail(buddy != NULL); | |
| 6774 | 665 | g_return_if_fail(GAIM_BLIST_NODE_IS_BUDDY((GaimBlistNode*)buddy)); |
| 6695 | 666 | |
| 667 | bnode = (GaimBlistNode *)buddy; | |
| 5228 | 668 | |
| 6695 | 669 | /* if we're moving to overtop of ourselves, do nothing */ |
| 670 | if(bnode == node || (!node && bnode->parent && | |
| 671 | contact && bnode->parent == (GaimBlistNode*)contact | |
| 672 | && bnode == bnode->parent->child)) | |
| 673 | return; | |
| 674 | ||
| 675 | if(node && GAIM_BLIST_NODE_IS_BUDDY(node)) { | |
| 676 | c = (GaimContact*)node->parent; | |
| 677 | g = (GaimGroup*)node->parent->parent; | |
| 678 | } else if(contact) { | |
| 679 | c = contact; | |
| 680 | g = (GaimGroup*)((GaimBlistNode*)c)->parent; | |
| 681 | } else { | |
| 682 | if(group) { | |
| 683 | g = group; | |
| 684 | } else { | |
| 5228 | 685 | g = gaim_group_new(_("Buddies")); |
| 5634 | 686 | gaim_blist_add_group(g, |
| 687 | gaim_blist_get_last_sibling(gaimbuddylist->root)); | |
| 5228 | 688 | } |
| 6695 | 689 | c = gaim_contact_new(); |
| 690 | gaim_blist_add_contact(c, g, | |
| 691 | gaim_blist_get_last_child((GaimBlistNode*)g)); | |
| 5228 | 692 | } |
| 693 | ||
| 6695 | 694 | cnode = (GaimBlistNode *)c; |
| 5228 | 695 | |
| 6695 | 696 | if(bnode->parent) { |
| 697 | if(GAIM_BUDDY_IS_ONLINE(buddy)) { | |
| 698 | ((GaimContact*)bnode->parent)->online--; | |
| 699 | if(((GaimContact*)bnode->parent)->online == 0) | |
| 700 | ((GaimGroup*)bnode->parent->parent)->online--; | |
| 701 | } | |
| 702 | if(gaim_account_is_connected(buddy->account)) { | |
| 703 | ((GaimContact*)bnode->parent)->currentsize--; | |
| 704 | if(((GaimContact*)bnode->parent)->currentsize == 0) | |
| 705 | ((GaimGroup*)bnode->parent->parent)->currentsize--; | |
| 706 | } | |
| 707 | ((GaimContact*)bnode->parent)->totalsize--; | |
| 708 | /* the group totalsize will be taken care of by remove_contact below */ | |
| 709 | ||
| 710 | if(bnode->parent->parent != (GaimBlistNode*)g) | |
| 711 | serv_move_buddy(buddy, (GaimGroup *)bnode->parent->parent, g); | |
| 5277 | 712 | |
| 5228 | 713 | if(bnode->next) |
| 714 | bnode->next->prev = bnode->prev; | |
| 715 | if(bnode->prev) | |
| 716 | bnode->prev->next = bnode->next; | |
| 6794 | 717 | if(bnode->parent->child == bnode) |
| 5228 | 718 | bnode->parent->child = bnode->next; |
| 719 | ||
| 720 | ops->remove(gaimbuddylist, bnode); | |
| 721 | ||
| 722 | save = TRUE; | |
| 6742 | 723 | |
| 724 | if(bnode->parent->parent != (GaimBlistNode*)g) { | |
| 725 | hb = g_new(struct _gaim_hbuddy, 1); | |
| 7261 | 726 | hb->name = g_strdup(gaim_normalize(buddy->account, buddy->name)); |
| 6742 | 727 | hb->account = buddy->account; |
| 728 | hb->group = bnode->parent->parent; | |
| 6775 | 729 | g_hash_table_remove(gaimbuddylist->buddies, hb); |
| 7162 | 730 | g_free(hb->name); |
| 6742 | 731 | g_free(hb); |
| 732 | } | |
| 6794 | 733 | |
| 7003 | 734 | if(!bnode->parent->child) { |
| 6794 | 735 | gaim_blist_remove_contact((GaimContact*)bnode->parent); |
| 7003 | 736 | } else { |
| 737 | gaim_contact_compute_priority_buddy((GaimContact*)bnode->parent); | |
| 738 | ops->update(gaimbuddylist, bnode->parent); | |
| 739 | } | |
| 5228 | 740 | } |
| 741 | ||
| 6695 | 742 | if(node && GAIM_BLIST_NODE_IS_BUDDY(node)) { |
| 743 | if(node->next) | |
| 744 | node->next->prev = bnode; | |
| 745 | bnode->next = node->next; | |
| 746 | bnode->prev = node; | |
| 747 | bnode->parent = node->parent; | |
| 748 | node->next = bnode; | |
| 5228 | 749 | } else { |
| 6695 | 750 | if(cnode->child) |
| 751 | cnode->child->prev = bnode; | |
| 752 | bnode->prev = NULL; | |
| 753 | bnode->next = cnode->child; | |
| 754 | cnode->child = bnode; | |
| 755 | bnode->parent = cnode; | |
| 5228 | 756 | } |
| 757 | ||
| 6695 | 758 | if(GAIM_BUDDY_IS_ONLINE(buddy)) { |
| 759 | ((GaimContact*)bnode->parent)->online++; | |
| 760 | if(((GaimContact*)bnode->parent)->online == 1) | |
| 761 | ((GaimGroup*)bnode->parent->parent)->online++; | |
| 762 | } | |
| 763 | if(gaim_account_is_connected(buddy->account)) { | |
| 764 | ((GaimContact*)bnode->parent)->currentsize++; | |
| 765 | if(((GaimContact*)bnode->parent)->currentsize == 1) | |
| 766 | ((GaimGroup*)bnode->parent->parent)->currentsize++; | |
| 767 | } | |
| 768 | ((GaimContact*)bnode->parent)->totalsize++; | |
| 769 | ||
| 770 | ||
| 6742 | 771 | hb = g_new(struct _gaim_hbuddy, 1); |
| 7261 | 772 | hb->name = g_strdup(gaim_normalize(buddy->account, buddy->name)); |
| 5247 | 773 | hb->account = buddy->account; |
| 6695 | 774 | hb->group = ((GaimBlistNode*)buddy)->parent->parent; |
| 5247 | 775 | |
| 6742 | 776 | g_hash_table_replace(gaimbuddylist->buddies, hb, buddy); |
| 5247 | 777 | |
| 6843 | 778 | gaim_contact_compute_priority_buddy(gaim_buddy_get_contact(buddy)); |
| 5228 | 779 | if (ops) |
| 780 | ops->update(gaimbuddylist, (GaimBlistNode*)buddy); | |
| 781 | if (save) | |
| 782 | gaim_blist_save(); | |
| 783 | } | |
| 784 | ||
| 6695 | 785 | GaimContact *gaim_contact_new() |
| 5228 | 786 | { |
|
7098
22eabd4f5ed4
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
787 | GaimBlistUiOps *ops; |
| 6695 | 788 | GaimContact *c = g_new0(GaimContact, 1); |
| 789 | ((GaimBlistNode*)c)->type = GAIM_BLIST_CONTACT_NODE; | |
| 790 | ||
| 791 | c->totalsize = c->currentsize = c->online = 0; | |
| 7693 | 792 | gaim_blist_node_initialize_settings((GaimBlistNode*)c); |
| 6695 | 793 | |
|
7035
76bca80cd91d
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
7003
diff
changeset
|
794 | ops = gaim_blist_get_ui_ops(); |
| 6695 | 795 | if (ops != NULL && ops->new_node != NULL) |
| 796 | ops->new_node((GaimBlistNode *)c); | |
| 797 | ||
| 798 | return c; | |
| 799 | } | |
| 800 | ||
| 6755 | 801 | void gaim_contact_set_alias(GaimContact* contact, const char *alias) |
| 802 | { | |
| 7245 | 803 | GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
| 804 | ||
| 6755 | 805 | g_return_if_fail(contact != NULL); |
| 806 | ||
| 807 | if(contact->alias) | |
| 808 | g_free(contact->alias); | |
| 809 | ||
| 7245 | 810 | if(alias && *alias) |
| 811 | contact->alias = g_strdup(alias); | |
| 812 | else | |
| 813 | contact->alias = NULL; | |
| 814 | ||
| 815 | if (ops) | |
| 816 | ops->update(gaimbuddylist, (GaimBlistNode*)contact); | |
| 6755 | 817 | } |
| 818 | ||
| 819 | const char *gaim_contact_get_alias(GaimContact* contact) | |
| 820 | { | |
| 7312 | 821 | if(!contact) |
| 822 | return NULL; | |
| 823 | ||
| 824 | if(contact->alias) | |
| 825 | return contact->alias; | |
| 826 | ||
| 827 | return gaim_get_buddy_alias(contact->priority); | |
| 6755 | 828 | } |
| 829 | ||
| 6695 | 830 | GaimGroup *gaim_group_new(const char *name) |
| 831 | { | |
| 832 | GaimGroup *g = gaim_find_group(name); | |
| 5228 | 833 | |
| 834 | if (!g) { | |
|
7098
22eabd4f5ed4
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
835 | GaimBlistUiOps *ops; |
| 6695 | 836 | g= g_new0(GaimGroup, 1); |
| 5228 | 837 | g->name = g_strdup(name); |
| 5277 | 838 | g->totalsize = 0; |
| 839 | g->currentsize = 0; | |
| 840 | g->online = 0; | |
| 7693 | 841 | gaim_blist_node_initialize_settings((GaimBlistNode*)g); |
| 5228 | 842 | ((GaimBlistNode*)g)->type = GAIM_BLIST_GROUP_NODE; |
| 843 | ||
|
7035
76bca80cd91d
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
7003
diff
changeset
|
844 | ops = gaim_blist_get_ui_ops(); |
| 5228 | 845 | |
| 846 | if (ops != NULL && ops->new_node != NULL) | |
| 847 | ops->new_node((GaimBlistNode *)g); | |
| 848 | ||
| 849 | } | |
| 850 | return g; | |
| 851 | } | |
| 852 | ||
| 6695 | 853 | void gaim_blist_add_contact(GaimContact *contact, GaimGroup *group, GaimBlistNode *node) |
| 854 | { | |
|
7098
22eabd4f5ed4
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
855 | GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
| 6695 | 856 | GaimGroup *g; |
| 6742 | 857 | GaimBlistNode *gnode, *cnode, *bnode; |
| 8328 | 858 | gboolean save = FALSE, empty_contact = FALSE; |
| 6695 | 859 | |
| 6774 | 860 | g_return_if_fail(contact != NULL); |
| 861 | g_return_if_fail(GAIM_BLIST_NODE_IS_CONTACT((GaimBlistNode*)contact)); | |
| 6695 | 862 | |
| 6975 | 863 | if((GaimBlistNode*)contact == node) |
| 864 | return; | |
| 865 | ||
| 6695 | 866 | if(node && (GAIM_BLIST_NODE_IS_CONTACT(node) || |
| 867 | GAIM_BLIST_NODE_IS_CHAT(node))) | |
| 868 | g = (GaimGroup*)node->parent; | |
| 869 | else if(group) | |
| 870 | g = group; | |
| 871 | else { | |
| 872 | g = gaim_group_new(_("Buddies")); | |
| 873 | gaim_blist_add_group(g, | |
| 874 | gaim_blist_get_last_sibling(gaimbuddylist->root)); | |
| 875 | } | |
| 876 | ||
| 877 | gnode = (GaimBlistNode*)g; | |
| 878 | cnode = (GaimBlistNode*)contact; | |
| 879 | ||
| 880 | if(cnode->parent) { | |
| 6731 | 881 | if(cnode->parent->child == cnode) |
| 882 | cnode->parent->child = cnode->next; | |
| 6695 | 883 | if(cnode->prev) |
| 884 | cnode->prev->next = cnode->next; | |
| 885 | if(cnode->next) | |
| 886 | cnode->next->prev = cnode->prev; | |
| 887 | ||
| 888 | ||
| 889 | if(contact->online > 0) | |
| 890 | ((GaimGroup*)cnode->parent)->online--; | |
| 891 | if(contact->currentsize > 0) | |
| 892 | ((GaimGroup*)cnode->parent)->currentsize--; | |
| 893 | ((GaimGroup*)cnode->parent)->totalsize--; | |
| 894 | ||
| 6731 | 895 | ops->remove(gaimbuddylist, cnode); |
| 896 | ||
| 6695 | 897 | save = TRUE; |
| 6742 | 898 | |
| 899 | if(cnode->parent != gnode) { | |
| 900 | for(bnode = cnode->child; bnode; bnode = bnode->next) { | |
| 901 | GaimBuddy *b = (GaimBuddy*)bnode; | |
| 902 | ||
| 903 | struct _gaim_hbuddy *hb = g_new(struct _gaim_hbuddy, 1); | |
| 7261 | 904 | hb->name = g_strdup(gaim_normalize(b->account, b->name)); |
| 6742 | 905 | hb->account = b->account; |
| 906 | hb->group = cnode->parent; | |
| 907 | ||
| 6776 | 908 | g_hash_table_remove(gaimbuddylist->buddies, hb); |
| 6742 | 909 | |
|
8341
dc43b1acfc1a
[gaim-migrate @ 9065]
Mark Doliner <markdoliner@pidgin.im>
parents:
8328
diff
changeset
|
910 | if(!gaim_find_buddy_in_group(b->account, b->name, g)) { |
| 8328 | 911 | hb->group = gnode; |
| 912 | g_hash_table_replace(gaimbuddylist->buddies, hb, b); | |
| 913 | ||
| 914 | if(b->account->gc) | |
| 915 | serv_move_buddy(b, (GaimGroup*)cnode->parent, g); | |
| 916 | } else { | |
| 917 | /* this buddy already exists in the group, so we're | |
| 918 | * gonna delete it instead */ | |
| 919 | g_free(hb->name); | |
| 920 | g_free(hb); | |
| 921 | if(b->account->gc) | |
| 922 | serv_remove_buddy(b->account->gc, b->name, ((GaimGroup*)cnode->parent)->name); | |
| 923 | ||
| 924 | if(!cnode->child->next) | |
| 925 | empty_contact = TRUE; | |
| 926 | gaim_blist_remove_buddy(b); | |
| 927 | } | |
| 6742 | 928 | } |
| 929 | } | |
| 6695 | 930 | } |
| 931 | ||
| 8328 | 932 | if(empty_contact) |
| 933 | return; | |
| 934 | ||
| 6775 | 935 | |
| 6695 | 936 | if(node && (GAIM_BLIST_NODE_IS_CONTACT(node) || |
| 937 | GAIM_BLIST_NODE_IS_CHAT(node))) { | |
| 938 | if(node->next) | |
| 939 | node->next->prev = cnode; | |
| 940 | cnode->next = node->next; | |
| 941 | cnode->prev = node; | |
| 942 | cnode->parent = node->parent; | |
| 943 | node->next = cnode; | |
| 944 | } else { | |
| 945 | if(gnode->child) | |
| 946 | gnode->child->prev = cnode; | |
| 947 | cnode->prev = NULL; | |
| 948 | cnode->next = gnode->child; | |
| 949 | gnode->child = cnode; | |
| 950 | cnode->parent = gnode; | |
| 951 | } | |
| 952 | ||
| 953 | if(contact->online > 0) | |
| 954 | g->online++; | |
| 955 | if(contact->currentsize > 0) | |
| 956 | g->currentsize++; | |
| 957 | g->totalsize++; | |
| 958 | ||
| 959 | if(ops && cnode->child) | |
| 960 | ops->update(gaimbuddylist, cnode); | |
| 6775 | 961 | |
| 962 | for(bnode = cnode->child; bnode; bnode = bnode->next) | |
| 963 | ops->update(gaimbuddylist, bnode); | |
| 964 | ||
| 6695 | 965 | if (save) |
| 966 | gaim_blist_save(); | |
| 967 | } | |
| 968 | ||
| 7246 | 969 | void gaim_blist_merge_contact(GaimContact *source, GaimBlistNode *node) |
| 6965 | 970 | { |
| 971 | GaimBlistNode *sourcenode = (GaimBlistNode*)source; | |
| 7246 | 972 | GaimBlistNode *targetnode; |
| 973 | GaimBlistNode *prev, *cur, *next; | |
| 974 | GaimContact *target; | |
| 975 | ||
| 976 | if(GAIM_BLIST_NODE_IS_CONTACT(node)) { | |
| 977 | target = (GaimContact*)node; | |
| 978 | prev = gaim_blist_get_last_child(node); | |
| 979 | } else if(GAIM_BLIST_NODE_IS_BUDDY(node)) { | |
| 980 | target = (GaimContact*)node->parent; | |
| 981 | prev = node; | |
| 982 | } else { | |
| 6965 | 983 | return; |
| 7246 | 984 | } |
| 985 | ||
| 986 | if(source == target || !target) | |
| 987 | return; | |
| 988 | ||
| 989 | targetnode = (GaimBlistNode*)target; | |
| 990 | next = sourcenode->child; | |
| 991 | ||
| 992 | while(next) { | |
| 993 | cur = next; | |
| 994 | next = cur->next; | |
| 995 | if(GAIM_BLIST_NODE_IS_BUDDY(cur)) { | |
| 996 | gaim_blist_add_buddy((GaimBuddy*)cur, target, NULL, prev); | |
| 997 | prev = cur; | |
| 998 | } | |
| 6965 | 999 | } |
| 1000 | } | |
| 1001 | ||
| 6695 | 1002 | void gaim_blist_add_group (GaimGroup *group, GaimBlistNode *node) |
| 5228 | 1003 | { |
|
7098
22eabd4f5ed4
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
1004 | GaimBlistUiOps *ops; |
| 5228 | 1005 | GaimBlistNode *gnode = (GaimBlistNode*)group; |
| 1006 | gboolean save = FALSE; | |
| 1007 | ||
| 6774 | 1008 | g_return_if_fail(group != NULL); |
| 1009 | g_return_if_fail(GAIM_BLIST_NODE_IS_GROUP((GaimBlistNode*)group)); | |
| 1010 | ||
| 5228 | 1011 | if (!gaimbuddylist) |
| 1012 | gaimbuddylist = gaim_blist_new(); | |
| 1013 | ops = gaimbuddylist->ui_ops; | |
| 1014 | ||
| 1015 | if (!gaimbuddylist->root) { | |
| 1016 | gaimbuddylist->root = gnode; | |
| 1017 | return; | |
| 1018 | } | |
| 1019 | ||
| 1020 | /* if we're moving to overtop of ourselves, do nothing */ | |
| 1021 | if(gnode == node) | |
| 1022 | return; | |
| 1023 | ||
| 1024 | if (gaim_find_group(group->name)) { | |
| 1025 | /* This is just being moved */ | |
| 1026 | ||
| 1027 | ops->remove(gaimbuddylist, (GaimBlistNode*)group); | |
| 1028 | ||
| 1029 | if(gnode == gaimbuddylist->root) | |
| 1030 | gaimbuddylist->root = gnode->next; | |
| 1031 | if(gnode->prev) | |
| 1032 | gnode->prev->next = gnode->next; | |
| 1033 | if(gnode->next) | |
| 1034 | gnode->next->prev = gnode->prev; | |
| 1035 | ||
| 1036 | save = TRUE; | |
| 1037 | } | |
| 1038 | ||
| 6695 | 1039 | if (node && GAIM_BLIST_NODE_IS_GROUP(node)) { |
| 5634 | 1040 | gnode->next = node->next; |
| 1041 | gnode->prev = node; | |
| 1042 | if(node->next) | |
| 1043 | node->next->prev = gnode; | |
| 1044 | node->next = gnode; | |
| 1045 | } else { | |
| 6807 | 1046 | if(gaimbuddylist->root) |
| 1047 | gaimbuddylist->root->prev = gnode; | |
| 5634 | 1048 | gnode->next = gaimbuddylist->root; |
| 1049 | gnode->prev = NULL; | |
| 1050 | gaimbuddylist->root = gnode; | |
| 1051 | } | |
| 1052 | ||
| 5228 | 1053 | |
| 1054 | if (ops) { | |
| 1055 | ops->update(gaimbuddylist, gnode); | |
| 1056 | for(node = gnode->child; node; node = node->next) | |
| 1057 | ops->update(gaimbuddylist, node); | |
| 1058 | } | |
| 1059 | if (save) | |
| 1060 | gaim_blist_save(); | |
| 1061 | } | |
| 1062 | ||
| 6695 | 1063 | void gaim_blist_remove_contact(GaimContact* contact) |
| 5228 | 1064 | { |
|
7098
22eabd4f5ed4
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
1065 | GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
| 5228 | 1066 | |
| 6695 | 1067 | GaimBlistNode *gnode, *cnode = (GaimBlistNode*)contact; |
| 1068 | ||
| 1069 | gnode = cnode->parent; | |
| 1070 | ||
| 1071 | if(cnode->child) { | |
| 1072 | while(cnode->child) { | |
| 1073 | gaim_blist_remove_buddy((GaimBuddy*)cnode->child); | |
| 1074 | } | |
| 1075 | } else { | |
| 1076 | if(ops) | |
| 1077 | ops->remove(gaimbuddylist, cnode); | |
| 1078 | ||
| 1079 | if(gnode->child == cnode) | |
| 1080 | gnode->child = cnode->next; | |
| 1081 | if(cnode->prev) | |
| 1082 | cnode->prev->next = cnode->next; | |
| 1083 | if(cnode->next) | |
| 1084 | cnode->next->prev = cnode->prev; | |
| 1085 | ||
| 1086 | g_free(contact); | |
| 1087 | } | |
| 1088 | } | |
| 1089 | ||
| 6742 | 1090 | void gaim_blist_remove_buddy (GaimBuddy *buddy) |
| 6695 | 1091 | { |
|
7098
22eabd4f5ed4
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
1092 | GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
| 6695 | 1093 | |
| 1094 | GaimBlistNode *cnode, *node = (GaimBlistNode*)buddy; | |
| 1095 | GaimGroup *group; | |
| 6742 | 1096 | struct _gaim_hbuddy hb; |
| 5228 | 1097 | |
| 6695 | 1098 | cnode = node->parent; |
| 1099 | group = (GaimGroup *)cnode->parent; | |
| 5228 | 1100 | |
| 6695 | 1101 | if(GAIM_BUDDY_IS_ONLINE(buddy)) { |
| 1102 | ((GaimContact*)cnode)->online--; | |
| 1103 | if(((GaimContact*)cnode)->online == 0) | |
| 1104 | group->online--; | |
| 1105 | } | |
| 1106 | if(gaim_account_is_connected(buddy->account)) { | |
| 1107 | ((GaimContact*)cnode)->currentsize--; | |
| 1108 | if(((GaimContact*)cnode)->currentsize == 0) | |
| 1109 | group->currentsize--; | |
| 1110 | } | |
| 1111 | ((GaimContact*)cnode)->totalsize--; | |
| 1112 | ||
| 5228 | 1113 | if (node->prev) |
| 1114 | node->prev->next = node->next; | |
| 1115 | if (node->next) | |
| 1116 | node->next->prev = node->prev; | |
| 6695 | 1117 | if(cnode->child == node) { |
| 1118 | cnode->child = node->next; | |
| 1119 | } | |
| 5228 | 1120 | |
| 8194 | 1121 | if(((GaimContact*)cnode)->priority == buddy) { |
| 1122 | gaim_contact_compute_priority_buddy((GaimContact*)cnode); | |
| 1123 | ops->update(gaimbuddylist, cnode); | |
| 1124 | } | |
| 6755 | 1125 | |
| 7261 | 1126 | hb.name = g_strdup(gaim_normalize(buddy->account, buddy->name)); |
| 5247 | 1127 | hb.account = buddy->account; |
| 6695 | 1128 | hb.group = ((GaimBlistNode*)buddy)->parent->parent; |
| 6742 | 1129 | g_hash_table_remove(gaimbuddylist->buddies, &hb); |
| 7162 | 1130 | g_free(hb.name); |
| 5247 | 1131 | |
| 5292 | 1132 | if(buddy->timer > 0) |
| 8287 | 1133 | gaim_timeout_remove(buddy->timer); |
| 5292 | 1134 | |
|
6846
f814f02dca87
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
1135 | if (buddy->icon != NULL) |
|
f814f02dca87
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
1136 | gaim_buddy_icon_unref(buddy->icon); |
|
f814f02dca87
[gaim-migrate @ 7391]
Christian Hammond <chipx86@chipx86.com>
parents:
6843
diff
changeset
|
1137 | |
| 5228 | 1138 | ops->remove(gaimbuddylist, node); |
| 7693 | 1139 | g_hash_table_destroy(buddy->node.settings); |
| 5228 | 1140 | g_free(buddy->name); |
| 1141 | g_free(buddy->alias); | |
| 1142 | g_free(buddy); | |
| 6755 | 1143 | |
| 1144 | if(!cnode->child) | |
| 1145 | gaim_blist_remove_contact((GaimContact*)cnode); | |
| 5228 | 1146 | } |
| 1147 | ||
|
7118
280b3b85a28a
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7117
diff
changeset
|
1148 | void gaim_blist_remove_chat (GaimChat *chat) |
| 5234 | 1149 | { |
|
7098
22eabd4f5ed4
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
1150 | GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
| 5234 | 1151 | |
| 1152 | GaimBlistNode *gnode, *node = (GaimBlistNode*)chat; | |
| 6695 | 1153 | GaimGroup *group; |
| 5234 | 1154 | |
| 1155 | gnode = node->parent; | |
| 6695 | 1156 | group = (GaimGroup *)gnode; |
| 5234 | 1157 | |
| 1158 | if(gnode->child == node) | |
| 1159 | gnode->child = node->next; | |
| 1160 | if (node->prev) | |
| 1161 | node->prev->next = node->next; | |
| 1162 | if (node->next) | |
| 1163 | node->next->prev = node->prev; | |
| 5277 | 1164 | group->totalsize--; |
| 5855 | 1165 | if (gaim_account_is_connected(chat->account)) { |
| 5277 | 1166 | group->currentsize--; |
| 5394 | 1167 | group->online--; |
| 1168 | } | |
| 5234 | 1169 | |
| 1170 | ops->remove(gaimbuddylist, node); | |
| 1171 | g_hash_table_destroy(chat->components); | |
| 1172 | g_free(chat->alias); | |
| 1173 | g_free(chat); | |
| 1174 | } | |
| 1175 | ||
| 6695 | 1176 | void gaim_blist_remove_group (GaimGroup *group) |
| 5228 | 1177 | { |
|
7098
22eabd4f5ed4
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
1178 | GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
| 5228 | 1179 | GaimBlistNode *node = (GaimBlistNode*)group; |
|
6885
65132ebfc662
[gaim-migrate @ 7431]
Christian Hammond <chipx86@chipx86.com>
parents:
6872
diff
changeset
|
1180 | GList *l; |
| 5228 | 1181 | |
| 1182 | if(node->child) { | |
| 1183 | char *buf; | |
| 1184 | int count = 0; | |
| 1185 | GaimBlistNode *child = node->child; | |
| 1186 | ||
| 1187 | while(child) { | |
| 1188 | count++; | |
| 1189 | child = child->next; | |
| 1190 | } | |
| 1191 | ||
|
6308
12d48b4e80db
[gaim-migrate @ 6807]
Mark Doliner <markdoliner@pidgin.im>
parents:
6307
diff
changeset
|
1192 | buf = g_strdup_printf(ngettext("%d buddy from group %s was not removed " |
|
12d48b4e80db
[gaim-migrate @ 6807]
Mark Doliner <markdoliner@pidgin.im>
parents:
6307
diff
changeset
|
1193 | "because its account was not logged in." |
|
12d48b4e80db
[gaim-migrate @ 6807]
Mark Doliner <markdoliner@pidgin.im>
parents:
6307
diff
changeset
|
1194 | " This buddy and the group were not " |
|
12d48b4e80db
[gaim-migrate @ 6807]
Mark Doliner <markdoliner@pidgin.im>
parents:
6307
diff
changeset
|
1195 | "removed.\n", |
|
12d48b4e80db
[gaim-migrate @ 6807]
Mark Doliner <markdoliner@pidgin.im>
parents:
6307
diff
changeset
|
1196 | "%d buddies from group %s were not " |
|
12d48b4e80db
[gaim-migrate @ 6807]
Mark Doliner <markdoliner@pidgin.im>
parents:
6307
diff
changeset
|
1197 | "removed because their accounts were " |
|
6336
7c62a14b3486
[gaim-migrate @ 6835]
Mark Doliner <markdoliner@pidgin.im>
parents:
6322
diff
changeset
|
1198 | "not logged in. These buddies and " |
|
7c62a14b3486
[gaim-migrate @ 6835]
Mark Doliner <markdoliner@pidgin.im>
parents:
6322
diff
changeset
|
1199 | "the group were not removed.\n", count), |
|
6308
12d48b4e80db
[gaim-migrate @ 6807]
Mark Doliner <markdoliner@pidgin.im>
parents:
6307
diff
changeset
|
1200 | count, group->name); |
|
5541
d4840f195f45
[gaim-migrate @ 5941]
Christian Hammond <chipx86@chipx86.com>
parents:
5436
diff
changeset
|
1201 | gaim_notify_error(NULL, NULL, _("Group not removed"), buf); |
| 5228 | 1202 | g_free(buf); |
| 1203 | return; | |
| 1204 | } | |
| 1205 | ||
| 1206 | if(gaimbuddylist->root == node) | |
| 1207 | gaimbuddylist->root = node->next; | |
| 1208 | if (node->prev) | |
| 1209 | node->prev->next = node->next; | |
| 1210 | if (node->next) | |
| 1211 | node->next->prev = node->prev; | |
| 1212 | ||
|
6885
65132ebfc662
[gaim-migrate @ 7431]
Christian Hammond <chipx86@chipx86.com>
parents:
6872
diff
changeset
|
1213 | for (l = gaim_connections_get_all(); l != NULL; l = l->next) |
|
65132ebfc662
[gaim-migrate @ 7431]
Christian Hammond <chipx86@chipx86.com>
parents:
6872
diff
changeset
|
1214 | { |
|
65132ebfc662
[gaim-migrate @ 7431]
Christian Hammond <chipx86@chipx86.com>
parents:
6872
diff
changeset
|
1215 | GaimConnection *gc = (GaimConnection *)l->data; |
|
65132ebfc662
[gaim-migrate @ 7431]
Christian Hammond <chipx86@chipx86.com>
parents:
6872
diff
changeset
|
1216 | |
|
65132ebfc662
[gaim-migrate @ 7431]
Christian Hammond <chipx86@chipx86.com>
parents:
6872
diff
changeset
|
1217 | if (gaim_connection_get_state(gc) == GAIM_CONNECTED) |
|
65132ebfc662
[gaim-migrate @ 7431]
Christian Hammond <chipx86@chipx86.com>
parents:
6872
diff
changeset
|
1218 | serv_remove_group(gc, group->name); |
|
65132ebfc662
[gaim-migrate @ 7431]
Christian Hammond <chipx86@chipx86.com>
parents:
6872
diff
changeset
|
1219 | } |
|
65132ebfc662
[gaim-migrate @ 7431]
Christian Hammond <chipx86@chipx86.com>
parents:
6872
diff
changeset
|
1220 | |
| 5228 | 1221 | ops->remove(gaimbuddylist, node); |
| 1222 | g_free(group->name); | |
| 1223 | g_free(group); | |
| 1224 | } | |
| 1225 | ||
| 6695 | 1226 | GaimBuddy *gaim_contact_get_priority_buddy(GaimContact *contact) { |
| 6843 | 1227 | return contact->priority; |
| 6695 | 1228 | } |
| 1229 | ||
| 1230 | const char *gaim_get_buddy_alias_only(GaimBuddy *b) { | |
|
5545
a8b1a1262402
[gaim-migrate @ 5946]
Christian Hammond <chipx86@chipx86.com>
parents:
5541
diff
changeset
|
1231 | if(!b) |
|
a8b1a1262402
[gaim-migrate @ 5946]
Christian Hammond <chipx86@chipx86.com>
parents:
5541
diff
changeset
|
1232 | return NULL; |
|
a8b1a1262402
[gaim-migrate @ 5946]
Christian Hammond <chipx86@chipx86.com>
parents:
5541
diff
changeset
|
1233 | |
|
a8b1a1262402
[gaim-migrate @ 5946]
Christian Hammond <chipx86@chipx86.com>
parents:
5541
diff
changeset
|
1234 | if(b->alias && b->alias[0]) { |
|
a8b1a1262402
[gaim-migrate @ 5946]
Christian Hammond <chipx86@chipx86.com>
parents:
5541
diff
changeset
|
1235 | return b->alias; |
|
a8b1a1262402
[gaim-migrate @ 5946]
Christian Hammond <chipx86@chipx86.com>
parents:
5541
diff
changeset
|
1236 | } |
|
a8b1a1262402
[gaim-migrate @ 5946]
Christian Hammond <chipx86@chipx86.com>
parents:
5541
diff
changeset
|
1237 | else if (b->server_alias != NULL && |
|
a8b1a1262402
[gaim-migrate @ 5946]
Christian Hammond <chipx86@chipx86.com>
parents:
5541
diff
changeset
|
1238 | gaim_prefs_get_bool("/core/buddies/use_server_alias")) { |
|
a8b1a1262402
[gaim-migrate @ 5946]
Christian Hammond <chipx86@chipx86.com>
parents:
5541
diff
changeset
|
1239 | |
|
a8b1a1262402
[gaim-migrate @ 5946]
Christian Hammond <chipx86@chipx86.com>
parents:
5541
diff
changeset
|
1240 | return b->server_alias; |
|
a8b1a1262402
[gaim-migrate @ 5946]
Christian Hammond <chipx86@chipx86.com>
parents:
5541
diff
changeset
|
1241 | } |
|
a8b1a1262402
[gaim-migrate @ 5946]
Christian Hammond <chipx86@chipx86.com>
parents:
5541
diff
changeset
|
1242 | |
|
a8b1a1262402
[gaim-migrate @ 5946]
Christian Hammond <chipx86@chipx86.com>
parents:
5541
diff
changeset
|
1243 | return NULL; |
| 5228 | 1244 | } |
| 1245 | ||
| 6695 | 1246 | const char * gaim_get_buddy_alias (GaimBuddy *buddy) |
| 5228 | 1247 | { |
| 6755 | 1248 | const char *ret; |
| 1249 | ||
| 1250 | if(!buddy) | |
| 1251 | return _("Unknown"); | |
| 5228 | 1252 | |
| 6755 | 1253 | ret= gaim_get_buddy_alias_only(buddy); |
| 1254 | ||
| 1255 | return ret ? ret : buddy->name; | |
| 5228 | 1256 | } |
| 1257 | ||
| 7125 | 1258 | const char *gaim_chat_get_name(GaimChat *chat) |
| 6744 | 1259 | { |
| 1260 | if(chat->alias && *chat->alias) { | |
| 1261 | return chat->alias; | |
| 1262 | } else { | |
| 1263 | struct proto_chat_entry *pce; | |
| 1264 | GList *parts, *tmp; | |
| 1265 | char *ret; | |
| 1266 | ||
| 1267 | parts = GAIM_PLUGIN_PROTOCOL_INFO(chat->account->gc->prpl)->chat_info(chat->account->gc); | |
| 1268 | pce = parts->data; | |
| 1269 | ret = g_hash_table_lookup(chat->components, pce->identifier); | |
| 1270 | for(tmp = parts; tmp; tmp = tmp->next) | |
| 1271 | g_free(tmp->data); | |
| 1272 | g_list_free(parts); | |
| 1273 | ||
| 1274 | return ret; | |
| 1275 | } | |
| 1276 | } | |
| 1277 | ||
| 6695 | 1278 | GaimBuddy *gaim_find_buddy(GaimAccount *account, const char *name) |
| 5228 | 1279 | { |
| 6695 | 1280 | GaimBuddy *buddy; |
| 5247 | 1281 | struct _gaim_hbuddy hb; |
| 5758 | 1282 | GaimBlistNode *group; |
| 5228 | 1283 | |
| 1284 | if (!gaimbuddylist) | |
| 1285 | return NULL; | |
| 6245 | 1286 | |
| 1287 | if (!name) | |
|
5985
69ab892a8fab
[gaim-migrate @ 6433]
Christian Hammond <chipx86@chipx86.com>
parents:
5947
diff
changeset
|
1288 | return NULL; |
| 5228 | 1289 | |
| 7429 | 1290 | hb.account = account; |
| 7261 | 1291 | hb.name = g_strdup(gaim_normalize(account, name)); |
| 7429 | 1292 | |
| 6245 | 1293 | for(group = gaimbuddylist->root; group; group = group->next) { |
| 5758 | 1294 | hb.group = group; |
| 7162 | 1295 | if ((buddy = g_hash_table_lookup(gaimbuddylist->buddies, &hb))) { |
| 1296 | g_free(hb.name); | |
| 5758 | 1297 | return buddy; |
| 7162 | 1298 | } |
| 5758 | 1299 | } |
| 6245 | 1300 | |
| 7162 | 1301 | g_free(hb.name); |
| 5758 | 1302 | return NULL; |
| 5228 | 1303 | } |
| 1304 | ||
| 6872 | 1305 | GaimBuddy *gaim_find_buddy_in_group(GaimAccount *account, const char *name, |
| 1306 | GaimGroup *group) | |
| 1307 | { | |
| 1308 | struct _gaim_hbuddy hb; | |
| 7162 | 1309 | GaimBuddy *ret; |
| 6872 | 1310 | |
| 1311 | if (!gaimbuddylist) | |
| 1312 | return NULL; | |
| 1313 | ||
| 1314 | if (!name) | |
| 1315 | return NULL; | |
| 1316 | ||
| 7261 | 1317 | hb.name = g_strdup(gaim_normalize(account, name)); |
| 6872 | 1318 | hb.account = account; |
| 1319 | hb.group = (GaimBlistNode*)group; | |
| 1320 | ||
| 7162 | 1321 | ret = g_hash_table_lookup(gaimbuddylist->buddies, &hb); |
| 1322 | g_free(hb.name); | |
| 1323 | return ret; | |
| 6872 | 1324 | } |
| 1325 | ||
| 6245 | 1326 | GSList *gaim_find_buddies(GaimAccount *account, const char *name) |
| 1327 | { | |
| 1328 | struct buddy *buddy; | |
| 1329 | struct _gaim_hbuddy hb; | |
| 1330 | GaimBlistNode *group; | |
| 1331 | GSList *ret = NULL; | |
| 1332 | ||
| 1333 | if (!gaimbuddylist) | |
| 1334 | return NULL; | |
| 1335 | ||
| 1336 | if (!name) | |
| 1337 | return NULL; | |
| 1338 | ||
| 7261 | 1339 | hb.name = g_strdup(gaim_normalize(account, name)); |
| 6245 | 1340 | hb.account = account; |
| 1341 | ||
| 1342 | for(group = gaimbuddylist->root; group; group = group->next) { | |
| 1343 | hb.group = group; | |
| 1344 | if ((buddy = g_hash_table_lookup(gaimbuddylist->buddies, &hb)) != NULL) | |
| 1345 | ret = g_slist_append(ret, buddy); | |
| 1346 | } | |
| 1347 | ||
| 7162 | 1348 | g_free(hb.name); |
| 6245 | 1349 | return ret; |
| 1350 | } | |
| 1351 | ||
| 6695 | 1352 | GaimGroup *gaim_find_group(const char *name) |
| 5228 | 1353 | { |
| 1354 | GaimBlistNode *node; | |
| 1355 | if (!gaimbuddylist) | |
| 1356 | return NULL; | |
| 1357 | node = gaimbuddylist->root; | |
| 1358 | while(node) { | |
| 6695 | 1359 | if (!strcmp(((GaimGroup *)node)->name, name)) |
| 1360 | return (GaimGroup *)node; | |
| 5228 | 1361 | node = node->next; |
| 1362 | } | |
| 1363 | return NULL; | |
| 1364 | } | |
|
6456
e4e7dee16c1a
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1365 | |
|
7118
280b3b85a28a
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7117
diff
changeset
|
1366 | GaimChat * |
|
6456
e4e7dee16c1a
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1367 | gaim_blist_find_chat(GaimAccount *account, const char *name) |
|
e4e7dee16c1a
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1368 | { |
|
e4e7dee16c1a
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1369 | char *chat_name; |
|
7118
280b3b85a28a
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7117
diff
changeset
|
1370 | GaimChat *chat; |
|
6456
e4e7dee16c1a
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1371 | GaimPlugin *prpl; |
|
e4e7dee16c1a
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1372 | GaimPluginProtocolInfo *prpl_info = NULL; |
|
e4e7dee16c1a
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1373 | struct proto_chat_entry *pce; |
|
e4e7dee16c1a
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1374 | GaimBlistNode *node, *group; |
|
e4e7dee16c1a
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1375 | GList *parts; |
|
e4e7dee16c1a
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1376 | |
|
e4e7dee16c1a
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1377 | g_return_val_if_fail(gaim_get_blist() != NULL, NULL); |
|
e4e7dee16c1a
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1378 | g_return_val_if_fail(name != NULL, NULL); |
|
e4e7dee16c1a
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1379 | |
| 7970 | 1380 | if(!gaim_account_is_connected(account)) |
| 1381 | return NULL; | |
| 1382 | ||
| 7999 | 1383 | prpl = gaim_find_prpl(gaim_account_get_protocol_id(account)); |
| 1384 | prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(prpl); | |
| 1385 | ||
| 1386 | if(prpl_info->find_blist_chat != NULL) | |
| 1387 | return prpl_info->find_blist_chat(account, name); | |
| 1388 | ||
|
6456
e4e7dee16c1a
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1389 | for (group = gaimbuddylist->root; group != NULL; group = group->next) { |
|
e4e7dee16c1a
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1390 | for (node = group->child; node != NULL; node = node->next) { |
|
e4e7dee16c1a
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1391 | if (GAIM_BLIST_NODE_IS_CHAT(node)) { |
|
e4e7dee16c1a
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1392 | |
|
7118
280b3b85a28a
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7117
diff
changeset
|
1393 | chat = (GaimChat*)node; |
|
6456
e4e7dee16c1a
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1394 | |
| 7999 | 1395 | if(account != chat->account) |
| 7970 | 1396 | continue; |
| 1397 | ||
|
6456
e4e7dee16c1a
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1398 | parts = prpl_info->chat_info( |
|
e4e7dee16c1a
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1399 | gaim_account_get_connection(chat->account)); |
|
e4e7dee16c1a
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1400 | |
|
e4e7dee16c1a
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1401 | pce = parts->data; |
|
e4e7dee16c1a
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1402 | chat_name = g_hash_table_lookup(chat->components, |
|
e4e7dee16c1a
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1403 | pce->identifier); |
|
e4e7dee16c1a
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1404 | |
|
e4e7dee16c1a
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1405 | if (chat->account == account && |
|
e4e7dee16c1a
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1406 | name != NULL && !strcmp(chat_name, name)) { |
|
e4e7dee16c1a
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1407 | |
|
e4e7dee16c1a
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1408 | return chat; |
|
e4e7dee16c1a
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1409 | } |
|
e4e7dee16c1a
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1410 | } |
|
e4e7dee16c1a
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1411 | } |
|
e4e7dee16c1a
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1412 | } |
|
e4e7dee16c1a
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1413 | |
|
e4e7dee16c1a
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1414 | return NULL; |
|
e4e7dee16c1a
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1415 | } |
|
e4e7dee16c1a
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1416 | |
| 6695 | 1417 | GaimGroup * |
| 7125 | 1418 | gaim_chat_get_group(GaimChat *chat) |
|
6456
e4e7dee16c1a
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1419 | { |
|
e4e7dee16c1a
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1420 | g_return_val_if_fail(chat != NULL, NULL); |
|
e4e7dee16c1a
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1421 | |
| 6695 | 1422 | return (GaimGroup *)(((GaimBlistNode *)chat)->parent); |
|
6456
e4e7dee16c1a
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1423 | } |
|
e4e7dee16c1a
[gaim-migrate @ 6965]
Christian Hammond <chipx86@chipx86.com>
parents:
6450
diff
changeset
|
1424 | |
| 6695 | 1425 | GaimGroup *gaim_find_buddys_group(GaimBuddy *buddy) |
| 5228 | 1426 | { |
| 1427 | if (!buddy) | |
| 1428 | return NULL; | |
|
6706
fdd12f90fcf6
[gaim-migrate @ 7232]
Christian Hammond <chipx86@chipx86.com>
parents:
6695
diff
changeset
|
1429 | |
|
fdd12f90fcf6
[gaim-migrate @ 7232]
Christian Hammond <chipx86@chipx86.com>
parents:
6695
diff
changeset
|
1430 | if (((GaimBlistNode *)buddy)->parent == NULL) |
|
fdd12f90fcf6
[gaim-migrate @ 7232]
Christian Hammond <chipx86@chipx86.com>
parents:
6695
diff
changeset
|
1431 | return NULL; |
|
fdd12f90fcf6
[gaim-migrate @ 7232]
Christian Hammond <chipx86@chipx86.com>
parents:
6695
diff
changeset
|
1432 | |
| 6695 | 1433 | return (GaimGroup *)(((GaimBlistNode*)buddy)->parent->parent); |
| 5228 | 1434 | } |
| 1435 | ||
| 6695 | 1436 | GSList *gaim_group_get_accounts(GaimGroup *g) |
| 5228 | 1437 | { |
| 1438 | GSList *l = NULL; | |
| 6695 | 1439 | GaimBlistNode *gnode, *cnode, *bnode; |
| 1440 | ||
| 1441 | gnode = (GaimBlistNode *)g; | |
| 5228 | 1442 | |
| 6695 | 1443 | for(cnode = gnode->child; cnode; cnode = cnode->next) { |
| 1444 | if (GAIM_BLIST_NODE_IS_CHAT(cnode)) { | |
|
7118
280b3b85a28a
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7117
diff
changeset
|
1445 | if(!g_slist_find(l, ((GaimChat *)cnode)->account)) |
|
280b3b85a28a
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7117
diff
changeset
|
1446 | l = g_slist_append(l, ((GaimChat *)cnode)->account); |
| 6695 | 1447 | } else if(GAIM_BLIST_NODE_IS_CONTACT(cnode)) { |
| 1448 | for(bnode = cnode->child; bnode; bnode = bnode->next) { | |
| 1449 | if(GAIM_BLIST_NODE_IS_BUDDY(bnode)) { | |
| 1450 | if(!g_slist_find(l, ((GaimBuddy *)bnode)->account)) | |
| 1451 | l = g_slist_append(l, ((GaimBuddy *)bnode)->account); | |
| 1452 | } | |
| 1453 | } | |
| 1454 | } | |
| 5228 | 1455 | } |
| 6695 | 1456 | |
| 5228 | 1457 | return l; |
| 1458 | } | |
| 1459 | ||
|
5563
d5a7852aa0cb
[gaim-migrate @ 5965]
Christian Hammond <chipx86@chipx86.com>
parents:
5545
diff
changeset
|
1460 | void gaim_blist_add_account(GaimAccount *account) |
| 5234 | 1461 | { |
|
7098
22eabd4f5ed4
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
1462 | GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
| 6695 | 1463 | GaimBlistNode *gnode, *cnode, *bnode; |
| 5234 | 1464 | |
| 1465 | if(!gaimbuddylist) | |
| 1466 | return; | |
| 1467 | ||
| 6695 | 1468 | if(!ops) |
| 1469 | return; | |
| 1470 | ||
| 1471 | for(gnode = gaimbuddylist->root; gnode; gnode = gnode->next) { | |
| 1472 | if(!GAIM_BLIST_NODE_IS_GROUP(gnode)) | |
| 5234 | 1473 | continue; |
| 6695 | 1474 | for(cnode = gnode->child; cnode; cnode = cnode->next) { |
| 1475 | if(GAIM_BLIST_NODE_IS_CONTACT(cnode)) { | |
| 6956 | 1476 | gboolean recompute = FALSE; |
| 6695 | 1477 | for(bnode = cnode->child; bnode; bnode = bnode->next) { |
| 1478 | if(GAIM_BLIST_NODE_IS_BUDDY(bnode) && | |
| 1479 | ((GaimBuddy*)bnode)->account == account) { | |
| 6956 | 1480 | recompute = TRUE; |
| 6695 | 1481 | ((GaimContact*)cnode)->currentsize++; |
| 1482 | if(((GaimContact*)cnode)->currentsize == 1) | |
| 1483 | ((GaimGroup*)gnode)->currentsize++; | |
| 1484 | ops->update(gaimbuddylist, bnode); | |
| 1485 | } | |
| 1486 | } | |
| 6956 | 1487 | if(recompute) { |
| 1488 | gaim_contact_compute_priority_buddy((GaimContact*)cnode); | |
| 1489 | ops->update(gaimbuddylist, cnode); | |
| 1490 | } | |
| 6695 | 1491 | } else if(GAIM_BLIST_NODE_IS_CHAT(cnode) && |
|
7118
280b3b85a28a
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7117
diff
changeset
|
1492 | ((GaimChat*)cnode)->account == account) { |
| 6901 | 1493 | ((GaimGroup *)gnode)->online++; |
| 1494 | ((GaimGroup *)gnode)->currentsize++; | |
| 1495 | ops->update(gaimbuddylist, cnode); | |
| 5234 | 1496 | } |
| 1497 | } | |
| 6695 | 1498 | ops->update(gaimbuddylist, gnode); |
| 5234 | 1499 | } |
| 1500 | } | |
| 1501 | ||
|
5563
d5a7852aa0cb
[gaim-migrate @ 5965]
Christian Hammond <chipx86@chipx86.com>
parents:
5545
diff
changeset
|
1502 | void gaim_blist_remove_account(GaimAccount *account) |
| 5228 | 1503 | { |
|
7098
22eabd4f5ed4
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
1504 | GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
| 6695 | 1505 | GaimBlistNode *gnode, *cnode, *bnode; |
| 5234 | 1506 | |
| 5228 | 1507 | if (!gaimbuddylist) |
| 1508 | return; | |
| 5234 | 1509 | |
| 6695 | 1510 | for(gnode = gaimbuddylist->root; gnode; gnode = gnode->next) { |
| 1511 | if(!GAIM_BLIST_NODE_IS_GROUP(gnode)) | |
| 5234 | 1512 | continue; |
| 6695 | 1513 | for(cnode = gnode->child; cnode; cnode = cnode->next) { |
| 1514 | if(GAIM_BLIST_NODE_IS_CONTACT(cnode)) { | |
| 6957 | 1515 | gboolean recompute = FALSE; |
| 6695 | 1516 | for(bnode = cnode->child; bnode; bnode = bnode->next) { |
| 1517 | if(!GAIM_BLIST_NODE_IS_BUDDY(bnode)) | |
| 1518 | continue; | |
| 1519 | if(account == ((GaimBuddy *)bnode)->account) { | |
| 6957 | 1520 | recompute = TRUE; |
| 6695 | 1521 | if(((GaimBuddy*)bnode)->present == GAIM_BUDDY_ONLINE || |
| 1522 | ((GaimBuddy*)bnode)->present == GAIM_BUDDY_SIGNING_ON) { | |
| 1523 | ((GaimContact*)cnode)->online--; | |
| 1524 | if(((GaimContact*)cnode)->online == 0) | |
| 1525 | ((GaimGroup*)gnode)->online--; | |
| 1526 | } | |
| 1527 | ((GaimContact*)cnode)->currentsize--; | |
| 1528 | if(((GaimContact*)cnode)->currentsize == 0) | |
| 1529 | ((GaimGroup*)gnode)->currentsize--; | |
| 1530 | ||
| 1531 | ((GaimBuddy*)bnode)->present = GAIM_BUDDY_OFFLINE; | |
| 1532 | ||
| 6803 | 1533 | ((GaimBuddy*)bnode)->uc = 0; |
| 1534 | ((GaimBuddy*)bnode)->idle = 0; | |
| 1535 | ((GaimBuddy*)bnode)->evil = 0; | |
| 1536 | ||
| 6945 | 1537 | |
| 6695 | 1538 | if(ops) |
| 1539 | ops->remove(gaimbuddylist, bnode); | |
| 1540 | } | |
| 5234 | 1541 | } |
| 6983 | 1542 | if(recompute) { |
| 6959 | 1543 | gaim_contact_compute_priority_buddy((GaimContact*)cnode); |
| 6983 | 1544 | if(ops) |
| 1545 | ops->update(gaimbuddylist, cnode); | |
| 1546 | } | |
| 6695 | 1547 | } else if(GAIM_BLIST_NODE_IS_CHAT(cnode) && |
|
7118
280b3b85a28a
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7117
diff
changeset
|
1548 | ((GaimChat*)cnode)->account == account) { |
| 6695 | 1549 | ((GaimGroup*)gnode)->currentsize--; |
| 1550 | ((GaimGroup*)gnode)->online--; | |
| 1551 | if(ops) | |
| 1552 | ops->remove(gaimbuddylist, cnode); | |
| 5228 | 1553 | } |
| 1554 | } | |
| 1555 | } | |
| 1556 | } | |
| 1557 | ||
|
7117
4d6a9973c7a9
[gaim-migrate @ 7684]
Christian Hammond <chipx86@chipx86.com>
parents:
7115
diff
changeset
|
1558 | void gaim_blist_parse_toc_buddy_list(GaimAccount *account, char *config) |
| 5228 | 1559 | { |
| 1560 | char *c; | |
| 1561 | char current[256]; | |
| 1562 | GList *bud = NULL; | |
| 1563 | ||
| 1564 | ||
| 1565 | if (config != NULL) { | |
| 1566 | ||
| 1567 | /* skip "CONFIG:" (if it exists) */ | |
| 1568 | c = strncmp(config + 6 /* sizeof(struct sflap_hdr) */ , "CONFIG:", strlen("CONFIG:")) ? | |
| 1569 | strtok(config, "\n") : | |
| 1570 | strtok(config + 6 /* sizeof(struct sflap_hdr) */ + strlen("CONFIG:"), "\n"); | |
| 1571 | do { | |
| 1572 | if (c == NULL) | |
| 1573 | break; | |
| 1574 | if (*c == 'g') { | |
| 1575 | char *utf8 = NULL; | |
|
7108
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
1576 | utf8 = gaim_utf8_try_convert(c + 2); |
| 5228 | 1577 | if (utf8 == NULL) { |
| 1578 | g_strlcpy(current, _("Invalid Groupname"), sizeof(current)); | |
| 1579 | } else { | |
| 1580 | g_strlcpy(current, utf8, sizeof(current)); | |
| 1581 | g_free(utf8); | |
| 1582 | } | |
| 1583 | if (!gaim_find_group(current)) { | |
| 6695 | 1584 | GaimGroup *g = gaim_group_new(current); |
| 5634 | 1585 | gaim_blist_add_group(g, |
| 1586 | gaim_blist_get_last_sibling(gaimbuddylist->root)); | |
| 5228 | 1587 | } |
| 1588 | } else if (*c == 'b') { /*&& !gaim_find_buddy(user, c + 2)) {*/ | |
| 1589 | char nm[80], sw[388], *a, *utf8 = NULL; | |
| 1590 | ||
| 1591 | if ((a = strchr(c + 2, ':')) != NULL) { | |
| 1592 | *a++ = '\0'; /* nul the : */ | |
| 1593 | } | |
| 1594 | ||
| 1595 | g_strlcpy(nm, c + 2, sizeof(nm)); | |
| 1596 | if (a) { | |
|
7108
82655fa54acb
[gaim-migrate @ 7673]
Christian Hammond <chipx86@chipx86.com>
parents:
7107
diff
changeset
|
1597 | utf8 = gaim_utf8_try_convert(a); |
| 5228 | 1598 | if (utf8 == NULL) { |
| 1599 | gaim_debug(GAIM_DEBUG_ERROR, "toc blist", | |
| 1600 | "Failed to convert alias for " | |
| 1601 | "'%s' to UTF-8\n", nm); | |
| 1602 | } | |
| 1603 | } | |
| 1604 | if (utf8 == NULL) { | |
| 1605 | sw[0] = '\0'; | |
| 1606 | } else { | |
| 1607 | /* This can leave a partial sequence at the end, | |
| 1608 | * but who cares? */ | |
| 1609 | g_strlcpy(sw, utf8, sizeof(sw)); | |
| 1610 | g_free(utf8); | |
| 1611 | } | |
| 1612 | ||
| 1613 | if (!gaim_find_buddy(account, nm)) { | |
| 6695 | 1614 | GaimBuddy *b = gaim_buddy_new(account, nm, sw); |
| 1615 | GaimGroup *g = gaim_find_group(current); | |
| 1616 | gaim_blist_add_buddy(b, NULL, g, | |
| 5634 | 1617 | gaim_blist_get_last_child((GaimBlistNode*)g)); |
| 5228 | 1618 | bud = g_list_append(bud, g_strdup(nm)); |
| 1619 | } | |
| 1620 | } else if (*c == 'p') { | |
|
6378
233d1294508f
[gaim-migrate @ 6883]
Christian Hammond <chipx86@chipx86.com>
parents:
6371
diff
changeset
|
1621 | gaim_privacy_permit_add(account, c + 2, TRUE); |
| 5228 | 1622 | } else if (*c == 'd') { |
|
6378
233d1294508f
[gaim-migrate @ 6883]
Christian Hammond <chipx86@chipx86.com>
parents:
6371
diff
changeset
|
1623 | gaim_privacy_deny_add(account, c + 2, TRUE); |
| 5228 | 1624 | } else if (!strncmp("toc", c, 3)) { |
|
5563
d5a7852aa0cb
[gaim-migrate @ 5965]
Christian Hammond <chipx86@chipx86.com>
parents:
5545
diff
changeset
|
1625 | sscanf(c + strlen(c) - 1, "%d", &account->perm_deny); |
| 5228 | 1626 | gaim_debug(GAIM_DEBUG_MISC, "toc blist", |
|
5563
d5a7852aa0cb
[gaim-migrate @ 5965]
Christian Hammond <chipx86@chipx86.com>
parents:
5545
diff
changeset
|
1627 | "permdeny: %d\n", account->perm_deny); |
|
d5a7852aa0cb
[gaim-migrate @ 5965]
Christian Hammond <chipx86@chipx86.com>
parents:
5545
diff
changeset
|
1628 | if (account->perm_deny == 0) |
|
8175
4e79974d452c
[gaim-migrate @ 8889]
Mark Doliner <markdoliner@pidgin.im>
parents:
8135
diff
changeset
|
1629 | account->perm_deny = GAIM_PRIVACY_ALLOW_ALL; |
| 5228 | 1630 | } else if (*c == 'm') { |
|
5563
d5a7852aa0cb
[gaim-migrate @ 5965]
Christian Hammond <chipx86@chipx86.com>
parents:
5545
diff
changeset
|
1631 | sscanf(c + 2, "%d", &account->perm_deny); |
| 5228 | 1632 | gaim_debug(GAIM_DEBUG_MISC, "toc blist", |
|
5563
d5a7852aa0cb
[gaim-migrate @ 5965]
Christian Hammond <chipx86@chipx86.com>
parents:
5545
diff
changeset
|
1633 | "permdeny: %d\n", account->perm_deny); |
|
d5a7852aa0cb
[gaim-migrate @ 5965]
Christian Hammond <chipx86@chipx86.com>
parents:
5545
diff
changeset
|
1634 | if (account->perm_deny == 0) |
|
8175
4e79974d452c
[gaim-migrate @ 8889]
Mark Doliner <markdoliner@pidgin.im>
parents:
8135
diff
changeset
|
1635 | account->perm_deny = GAIM_PRIVACY_ALLOW_ALL; |
| 5228 | 1636 | } |
| 1637 | } while ((c = strtok(NULL, "\n"))); | |
| 1638 | ||
| 1639 | if(account->gc) { | |
| 1640 | if(bud) { | |
| 1641 | GList *node = bud; | |
| 1642 | serv_add_buddies(account->gc, bud); | |
| 1643 | while(node) { | |
| 1644 | g_free(node->data); | |
| 1645 | node = node->next; | |
| 1646 | } | |
| 1647 | } | |
| 1648 | serv_set_permit_deny(account->gc); | |
| 1649 | } | |
| 1650 | g_list_free(bud); | |
| 1651 | } | |
| 1652 | } | |
| 1653 | ||
| 1654 | #if 0 | |
| 1655 | /* translate an AIM 3 buddylist (*.lst) to a Gaim buddylist */ | |
| 1656 | static GString *translate_lst(FILE *src_fp) | |
| 1657 | { | |
| 1658 | char line[BUF_LEN], *line2; | |
| 1659 | char *name; | |
| 1660 | int i; | |
| 1661 | ||
| 1662 | GString *dest = g_string_new("m 1\n"); | |
| 1663 | ||
| 1664 | while (fgets(line, BUF_LEN, src_fp)) { | |
| 1665 | line2 = g_strchug(line); | |
| 1666 | if (strstr(line2, "group") == line2) { | |
| 1667 | name = strpbrk(line2, " \t\n\r\f") + 1; | |
| 1668 | dest = g_string_append(dest, "g "); | |
| 1669 | for (i = 0; i < strcspn(name, "\n\r"); i++) | |
| 1670 | if (name[i] != '\"') | |
| 1671 | dest = g_string_append_c(dest, name[i]); | |
| 1672 | dest = g_string_append_c(dest, '\n'); | |
| 1673 | } | |
| 1674 | if (strstr(line2, "buddy") == line2) { | |
| 1675 | name = strpbrk(line2, " \t\n\r\f") + 1; | |
| 1676 | dest = g_string_append(dest, "b "); | |
| 1677 | for (i = 0; i < strcspn(name, "\n\r"); i++) | |
| 1678 | if (name[i] != '\"') | |
| 1679 | dest = g_string_append_c(dest, name[i]); | |
| 1680 | dest = g_string_append_c(dest, '\n'); | |
| 1681 | } | |
| 1682 | } | |
| 1683 | ||
| 1684 | return dest; | |
| 1685 | } | |
| 1686 | ||
| 1687 | ||
| 1688 | /* translate an AIM 4 buddylist (*.blt) to Gaim format */ | |
| 1689 | static GString *translate_blt(FILE *src_fp) | |
| 1690 | { | |
| 1691 | int i; | |
| 1692 | char line[BUF_LEN]; | |
| 1693 | char *buddy; | |
| 1694 | ||
| 1695 | GString *dest = g_string_new("m 1\n"); | |
| 1696 | ||
| 1697 | while (strstr(fgets(line, BUF_LEN, src_fp), "Buddy") == NULL); | |
| 1698 | while (strstr(fgets(line, BUF_LEN, src_fp), "list") == NULL); | |
| 1699 | ||
| 1700 | while (1) { | |
| 1701 | fgets(line, BUF_LEN, src_fp); g_strchomp(line); | |
| 1702 | if (strchr(line, '}') != NULL) | |
| 1703 | break; | |
| 1704 | ||
| 1705 | if (strchr(line, '{') != NULL) { | |
| 1706 | /* Syntax starting with "<group> {" */ | |
| 1707 | ||
| 1708 | dest = g_string_append(dest, "g "); | |
| 1709 | buddy = g_strchug(strtok(line, "{")); | |
| 1710 | for (i = 0; i < strlen(buddy); i++) | |
| 1711 | if (buddy[i] != '\"') | |
| 1712 | dest = g_string_append_c(dest, buddy[i]); | |
| 1713 | dest = g_string_append_c(dest, '\n'); | |
| 1714 | while (strchr(fgets(line, BUF_LEN, src_fp), '}') == NULL) { | |
| 1715 | gboolean pounce = FALSE; | |
| 1716 | char *e; | |
| 1717 | g_strchomp(line); | |
| 1718 | buddy = g_strchug(line); | |
| 1719 | gaim_debug(GAIM_DEBUG_MISC, "AIM 4 blt import", | |
| 1720 | "buddy: \"%s\"\n", buddy); | |
| 1721 | dest = g_string_append(dest, "b "); | |
| 1722 | if (strchr(buddy, '{') != NULL) { | |
| 1723 | /* buddy pounce, etc */ | |
| 1724 | char *pos = strchr(buddy, '{') - 1; | |
| 1725 | *pos = 0; | |
| 1726 | pounce = TRUE; | |
| 1727 | } | |
| 1728 | if ((e = strchr(buddy, '\"')) != NULL) { | |
| 1729 | *e = '\0'; | |
| 1730 | buddy++; | |
| 1731 | } | |
| 1732 | dest = g_string_append(dest, buddy); | |
| 1733 | dest = g_string_append_c(dest, '\n'); | |
| 1734 | if (pounce) | |
| 1735 | do | |
| 1736 | fgets(line, BUF_LEN, src_fp); | |
| 1737 | while (!strchr(line, '}')); | |
| 1738 | } | |
| 1739 | } else { | |
| 1740 | ||
| 1741 | /* Syntax "group buddy buddy ..." */ | |
| 1742 | buddy = g_strchug(strtok(line, " \n")); | |
| 1743 | dest = g_string_append(dest, "g "); | |
| 1744 | if (strchr(buddy, '\"') != NULL) { | |
| 1745 | dest = g_string_append(dest, &buddy[1]); | |
| 1746 | dest = g_string_append_c(dest, ' '); | |
| 1747 | buddy = g_strchug(strtok(NULL, " \n")); | |
| 1748 | while (strchr(buddy, '\"') == NULL) { | |
| 1749 | dest = g_string_append(dest, buddy); | |
| 1750 | dest = g_string_append_c(dest, ' '); | |
| 1751 | buddy = g_strchug(strtok(NULL, " \n")); | |
| 1752 | } | |
| 1753 | buddy[strlen(buddy) - 1] = '\0'; | |
| 1754 | dest = g_string_append(dest, buddy); | |
| 1755 | } else { | |
| 1756 | dest = g_string_append(dest, buddy); | |
| 1757 | } | |
| 1758 | dest = g_string_append_c(dest, '\n'); | |
| 1759 | while ((buddy = g_strchug(strtok(NULL, " \n"))) != NULL) { | |
| 1760 | dest = g_string_append(dest, "b "); | |
| 1761 | if (strchr(buddy, '\"') != NULL) { | |
| 1762 | dest = g_string_append(dest, &buddy[1]); | |
| 1763 | dest = g_string_append_c(dest, ' '); | |
| 1764 | buddy = g_strchug(strtok(NULL, " \n")); | |
| 1765 | while (strchr(buddy, '\"') == NULL) { | |
| 1766 | dest = g_string_append(dest, buddy); | |
| 1767 | dest = g_string_append_c(dest, ' '); | |
| 1768 | buddy = g_strchug(strtok(NULL, " \n")); | |
| 1769 | } | |
| 1770 | buddy[strlen(buddy) - 1] = '\0'; | |
| 1771 | dest = g_string_append(dest, buddy); | |
| 1772 | } else { | |
| 1773 | dest = g_string_append(dest, buddy); | |
| 1774 | } | |
| 1775 | dest = g_string_append_c(dest, '\n'); | |
| 1776 | } | |
| 1777 | } | |
| 1778 | } | |
| 1779 | ||
| 1780 | return dest; | |
| 1781 | } | |
| 1782 | ||
| 1783 | static GString *translate_gnomeicu(FILE *src_fp) | |
| 1784 | { | |
| 1785 | char line[BUF_LEN]; | |
| 1786 | GString *dest = g_string_new("m 1\ng Buddies\n"); | |
| 1787 | ||
| 1788 | while (strstr(fgets(line, BUF_LEN, src_fp), "NewContacts") == NULL); | |
| 1789 | ||
| 1790 | while (fgets(line, BUF_LEN, src_fp)) { | |
| 1791 | char *eq; | |
| 1792 | g_strchomp(line); | |
| 1793 | if (line[0] == '\n' || line[0] == '[') | |
| 1794 | break; | |
| 1795 | eq = strchr(line, '='); | |
| 1796 | if (!eq) | |
| 1797 | break; | |
| 1798 | *eq = ':'; | |
| 1799 | eq = strchr(eq, ','); | |
| 1800 | if (eq) | |
| 1801 | *eq = '\0'; | |
| 1802 | dest = g_string_append(dest, "b "); | |
| 1803 | dest = g_string_append(dest, line); | |
| 1804 | dest = g_string_append_c(dest, '\n'); | |
| 1805 | } | |
| 1806 | ||
| 1807 | return dest; | |
| 1808 | } | |
| 1809 | #endif | |
| 1810 | ||
| 1811 | static gchar *get_screenname_filename(const char *name) | |
| 1812 | { | |
| 1813 | gchar **split; | |
| 1814 | gchar *good; | |
| 1815 | gchar *ret; | |
| 1816 | ||
| 1817 | split = g_strsplit(name, G_DIR_SEPARATOR_S, -1); | |
| 1818 | good = g_strjoinv(NULL, split); | |
| 1819 | g_strfreev(split); | |
| 1820 | ||
| 1821 | ret = g_utf8_strup(good, -1); | |
| 1822 | ||
| 1823 | g_free(good); | |
| 1824 | ||
| 1825 | return ret; | |
| 1826 | } | |
| 1827 | ||
| 1828 | static gboolean gaim_blist_read(const char *filename); | |
| 1829 | ||
| 1830 | ||
|
5563
d5a7852aa0cb
[gaim-migrate @ 5965]
Christian Hammond <chipx86@chipx86.com>
parents:
5545
diff
changeset
|
1831 | static void do_import(GaimAccount *account, const char *filename) |
| 5228 | 1832 | { |
| 1833 | GString *buf = NULL; | |
| 1834 | char first[64]; | |
| 1835 | char path[PATHSIZE]; | |
| 1836 | int len; | |
| 1837 | FILE *f; | |
| 1838 | struct stat st; | |
| 1839 | ||
| 1840 | if (filename) { | |
| 1841 | g_snprintf(path, sizeof(path), "%s", filename); | |
| 1842 | } else { | |
| 1843 | char *g_screenname = get_screenname_filename(account->username); | |
|
5943
8a052155157a
[gaim-migrate @ 6384]
Christian Hammond <chipx86@chipx86.com>
parents:
5906
diff
changeset
|
1844 | const char *username; |
| 5228 | 1845 | char *file = gaim_user_dir(); |
|
5943
8a052155157a
[gaim-migrate @ 6384]
Christian Hammond <chipx86@chipx86.com>
parents:
5906
diff
changeset
|
1846 | GaimProtocol prpl_num; |
|
8a052155157a
[gaim-migrate @ 6384]
Christian Hammond <chipx86@chipx86.com>
parents:
5906
diff
changeset
|
1847 | int protocol; |
| 6695 | 1848 | |
|
5943
8a052155157a
[gaim-migrate @ 6384]
Christian Hammond <chipx86@chipx86.com>
parents:
5906
diff
changeset
|
1849 | prpl_num = gaim_account_get_protocol(account); |
|
8a052155157a
[gaim-migrate @ 6384]
Christian Hammond <chipx86@chipx86.com>
parents:
5906
diff
changeset
|
1850 | |
|
8a052155157a
[gaim-migrate @ 6384]
Christian Hammond <chipx86@chipx86.com>
parents:
5906
diff
changeset
|
1851 | protocol = prpl_num; |
|
8a052155157a
[gaim-migrate @ 6384]
Christian Hammond <chipx86@chipx86.com>
parents:
5906
diff
changeset
|
1852 | |
|
6450
4c2364a4b6a4
[gaim-migrate @ 6959]
Christian Hammond <chipx86@chipx86.com>
parents:
6392
diff
changeset
|
1853 | /* TODO Somehow move this checking into prpls */ |
|
5943
8a052155157a
[gaim-migrate @ 6384]
Christian Hammond <chipx86@chipx86.com>
parents:
5906
diff
changeset
|
1854 | if (prpl_num == GAIM_PROTO_OSCAR) { |
|
8a052155157a
[gaim-migrate @ 6384]
Christian Hammond <chipx86@chipx86.com>
parents:
5906
diff
changeset
|
1855 | if ((username = gaim_account_get_username(account)) != NULL) { |
|
8a052155157a
[gaim-migrate @ 6384]
Christian Hammond <chipx86@chipx86.com>
parents:
5906
diff
changeset
|
1856 | protocol = (isalpha(*username) |
|
8a052155157a
[gaim-migrate @ 6384]
Christian Hammond <chipx86@chipx86.com>
parents:
5906
diff
changeset
|
1857 | ? GAIM_PROTO_TOC : GAIM_PROTO_ICQ); |
|
8a052155157a
[gaim-migrate @ 6384]
Christian Hammond <chipx86@chipx86.com>
parents:
5906
diff
changeset
|
1858 | } |
|
8a052155157a
[gaim-migrate @ 6384]
Christian Hammond <chipx86@chipx86.com>
parents:
5906
diff
changeset
|
1859 | } |
| 5228 | 1860 | |
| 1861 | if (file != (char *)NULL) { | |
|
5435
990c340ecb6d
[gaim-migrate @ 5817]
Mark Doliner <markdoliner@pidgin.im>
parents:
5394
diff
changeset
|
1862 | snprintf(path, PATHSIZE, "%s" G_DIR_SEPARATOR_S "%s.%d.blist", file, g_screenname, protocol); |
| 5228 | 1863 | g_free(g_screenname); |
| 1864 | } else { | |
| 1865 | g_free(g_screenname); | |
| 1866 | return; | |
| 1867 | } | |
| 1868 | } | |
| 1869 | ||
| 1870 | if (stat(path, &st)) { | |
| 1871 | gaim_debug(GAIM_DEBUG_ERROR, "blist import", "Unable to stat %s.\n", | |
| 1872 | path); | |
| 1873 | return; | |
| 1874 | } | |
| 1875 | ||
| 1876 | if (!(f = fopen(path, "r"))) { | |
| 1877 | gaim_debug(GAIM_DEBUG_ERROR, "blist import", "Unable to open %s.\n", | |
| 1878 | path); | |
| 1879 | return; | |
| 1880 | } | |
| 1881 | ||
| 1882 | fgets(first, 64, f); | |
| 1883 | ||
| 1884 | if ((first[0] == '\n') || (first[0] == '\r' && first[1] == '\n')) | |
| 1885 | fgets(first, 64, f); | |
| 1886 | ||
| 1887 | #if 0 | |
|
8430
13694e7d1aaa
[gaim-migrate @ 9160]
Mark Doliner <markdoliner@pidgin.im>
parents:
8341
diff
changeset
|
1888 | if (!g_ascii_strncasecmp(first, "<xml", strlen("<xml"))) { |
| 5228 | 1889 | /* new gaim XML buddy list */ |
| 1890 | gaim_blist_read(path); | |
| 1891 | ||
| 1892 | /* We really don't need to bother doing stuf like translating AIM 3 buddy lists anymore */ | |
| 1893 | ||
|
8430
13694e7d1aaa
[gaim-migrate @ 9160]
Mark Doliner <markdoliner@pidgin.im>
parents:
8341
diff
changeset
|
1894 | } else if (!g_ascii_strncasecmp(first, "Config {", strlen("Config {"))) { |
| 5228 | 1895 | /* AIM 4 buddy list */ |
| 1896 | gaim_debug(GAIM_DEBUG_MISC, "blist import", "aim 4\n"); | |
| 1897 | rewind(f); | |
| 1898 | buf = translate_blt(f); | |
| 1899 | } else if (strstr(first, "group") != NULL) { | |
| 1900 | /* AIM 3 buddy list */ | |
| 1901 | gaim_debug(GAIM_DEBUG_MISC, "blist import", "aim 3\n"); | |
| 1902 | rewind(f); | |
| 1903 | buf = translate_lst(f); | |
|
8430
13694e7d1aaa
[gaim-migrate @ 9160]
Mark Doliner <markdoliner@pidgin.im>
parents:
8341
diff
changeset
|
1904 | } else if (!g_ascii_strncasecmp(first, "[User]", strlen("[User]"))) { |
| 5228 | 1905 | /* GnomeICU (hopefully) */ |
| 1906 | gaim_debug(GAIM_DEBUG_MISC, "blist import", "gnomeicu\n"); | |
| 1907 | rewind(f); | |
| 1908 | buf = translate_gnomeicu(f); | |
| 1909 | ||
| 1910 | } else | |
| 1911 | #endif | |
| 1912 | if (first[0] == 'm') { | |
| 1913 | /* Gaim buddy list - no translation */ | |
| 1914 | char buf2[BUF_LONG * 2]; | |
| 1915 | buf = g_string_new(""); | |
| 1916 | rewind(f); | |
| 1917 | while (1) { | |
| 1918 | len = fread(buf2, 1, BUF_LONG * 2 - 1, f); | |
| 1919 | if (len <= 0) | |
| 1920 | break; | |
| 1921 | buf2[len] = '\0'; | |
| 1922 | buf = g_string_append(buf, buf2); | |
| 1923 | if (len != BUF_LONG * 2 - 1) | |
| 1924 | break; | |
| 1925 | } | |
| 1926 | } | |
| 1927 | ||
| 1928 | fclose(f); | |
| 1929 | ||
| 1930 | if (buf) { | |
| 1931 | buf = g_string_prepend(buf, "toc_set_config {"); | |
| 1932 | buf = g_string_append(buf, "}\n"); | |
|
7117
4d6a9973c7a9
[gaim-migrate @ 7684]
Christian Hammond <chipx86@chipx86.com>
parents:
7115
diff
changeset
|
1933 | gaim_blist_parse_toc_buddy_list(account, buf->str); |
| 5228 | 1934 | g_string_free(buf, TRUE); |
| 1935 | } | |
| 1936 | } | |
| 1937 | ||
| 6695 | 1938 | gboolean gaim_group_on_account(GaimGroup *g, GaimAccount *account) { |
| 1939 | GaimBlistNode *cnode, *bnode; | |
| 1940 | for(cnode = ((GaimBlistNode *)g)->child; cnode; cnode = cnode->next) { | |
| 1941 | if(GAIM_BLIST_NODE_IS_CONTACT(cnode)) { | |
| 1942 | for(bnode = cnode->child; bnode; bnode = bnode->next) { | |
| 1943 | if(GAIM_BLIST_NODE_IS_BUDDY(bnode)) { | |
| 1944 | GaimBuddy *buddy = (GaimBuddy *)bnode; | |
| 1945 | if((!account && gaim_account_is_connected(buddy->account)) | |
| 1946 | || buddy->account == account) | |
| 1947 | return TRUE; | |
| 1948 | } | |
| 1949 | } | |
| 1950 | } else if(GAIM_BLIST_NODE_IS_CHAT(cnode)) { | |
|
7118
280b3b85a28a
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7117
diff
changeset
|
1951 | GaimChat *chat = (GaimChat *)cnode; |
| 6695 | 1952 | if((!account && gaim_account_is_connected(chat->account)) |
| 1953 | || chat->account == account) | |
| 1954 | return TRUE; | |
| 1955 | } | |
| 5228 | 1956 | } |
| 1957 | return FALSE; | |
| 1958 | } | |
| 1959 | ||
| 1960 | static gboolean blist_safe_to_write = FALSE; | |
| 1961 | ||
| 7132 | 1962 | static void parse_setting(GaimBlistNode *node, xmlnode *setting) |
| 1963 | { | |
| 1964 | const char *name = xmlnode_get_attrib(setting, "name"); | |
| 7693 | 1965 | const char *type = xmlnode_get_attrib(setting, "type"); |
| 7132 | 1966 | char *value = xmlnode_get_data(setting); |
| 1967 | ||
| 7693 | 1968 | if(!value) |
| 1969 | return; | |
| 1970 | ||
| 1971 | if(!type || !strcmp(type, "string")) | |
| 1972 | gaim_blist_node_set_string(node, name, value); | |
| 1973 | else if(!strcmp(type, "bool")) | |
| 1974 | gaim_blist_node_set_bool(node, name, atoi(value)); | |
| 1975 | else if(!strcmp(type, "int")) | |
| 1976 | gaim_blist_node_set_int(node, name, atoi(value)); | |
| 7132 | 1977 | |
| 1978 | g_free(value); | |
| 1979 | } | |
| 1980 | ||
| 1981 | static void parse_buddy(GaimGroup *group, GaimContact *contact, xmlnode *bnode) | |
| 1982 | { | |
| 1983 | GaimAccount *account; | |
| 1984 | GaimBuddy *buddy; | |
| 7727 | 1985 | char *name = NULL, *alias = NULL; |
| 7153 | 1986 | const char *acct_name, *proto, *protocol; |
| 7132 | 1987 | xmlnode *x; |
| 1988 | ||
| 1989 | acct_name = xmlnode_get_attrib(bnode, "account"); | |
| 7153 | 1990 | protocol = xmlnode_get_attrib(bnode, "protocol"); |
| 1991 | proto = xmlnode_get_attrib(bnode, "proto"); | |
| 1992 | ||
| 1993 | if(!acct_name || (!proto && !protocol)) | |
| 7132 | 1994 | return; |
| 1995 | ||
| 7153 | 1996 | account = gaim_accounts_find(acct_name, proto ? proto : protocol); |
| 7132 | 1997 | |
| 1998 | if(!account) | |
| 1999 | return; | |
| 2000 | ||
| 2001 | if((x = xmlnode_get_child(bnode, "name"))) | |
| 2002 | name = xmlnode_get_data(x); | |
| 2003 | ||
| 2004 | if(!name) | |
| 2005 | return; | |
| 2006 | ||
| 2007 | if((x = xmlnode_get_child(bnode, "alias"))) | |
| 2008 | alias = xmlnode_get_data(x); | |
| 2009 | ||
| 2010 | buddy = gaim_buddy_new(account, name, alias); | |
| 2011 | gaim_blist_add_buddy(buddy, contact, group, | |
| 2012 | gaim_blist_get_last_child((GaimBlistNode*)contact)); | |
| 2013 | ||
| 8135 | 2014 | for(x = xmlnode_get_child(bnode, "setting"); x; x = xmlnode_get_next_twin(x)) { |
| 7132 | 2015 | parse_setting((GaimBlistNode*)buddy, x); |
| 2016 | } | |
| 2017 | ||
| 2018 | g_free(name); | |
| 2019 | if(alias) | |
| 2020 | g_free(alias); | |
| 2021 | } | |
| 2022 | ||
| 2023 | static void parse_contact(GaimGroup *group, xmlnode *cnode) | |
| 2024 | { | |
| 2025 | GaimContact *contact = gaim_contact_new(); | |
| 2026 | xmlnode *x; | |
| 7245 | 2027 | const char *alias; |
| 7132 | 2028 | |
| 2029 | gaim_blist_add_contact(contact, group, | |
| 2030 | gaim_blist_get_last_child((GaimBlistNode*)group)); | |
| 2031 | ||
| 7245 | 2032 | if((alias = xmlnode_get_attrib(cnode, "alias"))) { |
| 7132 | 2033 | gaim_contact_set_alias(contact, alias); |
| 2034 | } | |
| 2035 | ||
| 2036 | for(x = cnode->child; x; x = x->next) { | |
| 8135 | 2037 | if(x->type != XMLNODE_TYPE_TAG) |
| 7132 | 2038 | continue; |
| 2039 | if(!strcmp(x->name, "buddy")) | |
| 2040 | parse_buddy(group, contact, x); | |
| 2041 | else if(strcmp(x->name, "setting")) | |
| 2042 | parse_setting((GaimBlistNode*)contact, x); | |
| 5228 | 2043 | } |
| 7825 | 2044 | |
| 2045 | /* if the contact is empty, don't keep it around. it causes problems */ | |
| 2046 | if(!((GaimBlistNode*)contact)->child) | |
| 2047 | gaim_blist_remove_contact(contact); | |
| 5228 | 2048 | } |
| 2049 | ||
| 7132 | 2050 | static void parse_chat(GaimGroup *group, xmlnode *cnode) |
| 2051 | { | |
| 2052 | GaimChat *chat; | |
| 2053 | GaimAccount *account; | |
| 7153 | 2054 | const char *acct_name, *proto, *protocol; |
| 7132 | 2055 | xmlnode *x; |
| 2056 | char *alias = NULL; | |
| 2057 | GHashTable *components; | |
| 2058 | ||
| 2059 | acct_name = xmlnode_get_attrib(cnode, "account"); | |
| 7153 | 2060 | protocol = xmlnode_get_attrib(cnode, "protocol"); |
| 2061 | proto = xmlnode_get_attrib(cnode, "proto"); | |
| 2062 | ||
| 2063 | if(!acct_name || (!proto && !protocol)) | |
| 7132 | 2064 | return; |
| 2065 | ||
| 7153 | 2066 | account = gaim_accounts_find(acct_name, proto ? proto : protocol); |
| 7132 | 2067 | |
| 2068 | if(!account) | |
| 2069 | return; | |
| 2070 | ||
| 2071 | if((x = xmlnode_get_child(cnode, "alias"))) | |
| 2072 | alias = xmlnode_get_data(x); | |
| 2073 | ||
| 2074 | components = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free); | |
| 2075 | ||
| 8135 | 2076 | for(x = xmlnode_get_child(cnode, "component"); x; x = xmlnode_get_next_twin(x)) { |
| 7132 | 2077 | const char *name; |
| 2078 | char *value; | |
| 2079 | ||
| 2080 | name = xmlnode_get_attrib(x, "name"); | |
| 2081 | value = xmlnode_get_data(x); | |
| 2082 | g_hash_table_replace(components, g_strdup(name), value); | |
| 2083 | } | |
| 2084 | ||
| 2085 | chat = gaim_chat_new(account, alias, components); | |
| 7151 | 2086 | gaim_blist_add_chat(chat, group, |
| 2087 | gaim_blist_get_last_child((GaimBlistNode*)group)); | |
| 7132 | 2088 | |
| 8135 | 2089 | for(x = xmlnode_get_child(cnode, "setting"); x; x = xmlnode_get_next_twin(x)) { |
| 7132 | 2090 | parse_setting((GaimBlistNode*)chat, x); |
| 2091 | } | |
| 2092 | ||
| 2093 | if(alias) | |
| 2094 | g_free(alias); | |
| 2095 | } | |
| 2096 | ||
| 2097 | ||
| 2098 | static void parse_group(xmlnode *groupnode) | |
| 2099 | { | |
| 2100 | const char *name = xmlnode_get_attrib(groupnode, "name"); | |
| 2101 | GaimGroup *group; | |
| 2102 | xmlnode *cnode; | |
| 2103 | ||
| 2104 | if(!name) | |
| 2105 | name = _("Buddies"); | |
| 2106 | ||
| 2107 | group = gaim_group_new(name); | |
| 2108 | gaim_blist_add_group(group, | |
| 2109 | gaim_blist_get_last_sibling(gaimbuddylist->root)); | |
| 2110 | ||
| 2111 | for(cnode = groupnode->child; cnode; cnode = cnode->next) { | |
| 8135 | 2112 | if(cnode->type != XMLNODE_TYPE_TAG) |
| 7132 | 2113 | continue; |
| 2114 | if(!strcmp(cnode->name, "setting")) | |
| 2115 | parse_setting((GaimBlistNode*)group, cnode); | |
| 2116 | else if(!strcmp(cnode->name, "contact") || | |
| 2117 | !strcmp(cnode->name, "person")) | |
| 2118 | parse_contact(group, cnode); | |
| 2119 | else if(!strcmp(cnode->name, "chat")) | |
| 2120 | parse_chat(group, cnode); | |
| 5228 | 2121 | } |
| 2122 | } | |
| 2123 | ||
| 2124 | static gboolean gaim_blist_read(const char *filename) { | |
| 7132 | 2125 | GError *error; |
| 5228 | 2126 | gchar *contents = NULL; |
| 2127 | gsize length; | |
| 7132 | 2128 | xmlnode *gaim, *blist, *privacy; |
| 5228 | 2129 | |
| 2130 | gaim_debug(GAIM_DEBUG_INFO, "blist import", | |
| 2131 | "Reading %s\n", filename); | |
| 2132 | if(!g_file_get_contents(filename, &contents, &length, &error)) { | |
| 2133 | gaim_debug(GAIM_DEBUG_ERROR, "blist import", | |
| 2134 | "Error reading blist: %s\n", error->message); | |
| 2135 | g_error_free(error); | |
| 2136 | return FALSE; | |
| 2137 | } | |
| 2138 | ||
| 7132 | 2139 | gaim = xmlnode_from_str(contents, length); |
| 8826 | 2140 | |
| 7132 | 2141 | if(!gaim) { |
| 8826 | 2142 | FILE *backup; |
| 2143 | char *name; | |
| 7132 | 2144 | gaim_debug(GAIM_DEBUG_ERROR, "blist import", "Error parsing %s\n", |
| 2145 | filename); | |
| 8826 | 2146 | name = g_build_filename(gaim_user_dir(), "blist.xml~", NULL); |
| 2147 | ||
| 2148 | if((backup = fopen(name, "w"))) { | |
| 2149 | fwrite(contents, length, 1, backup); | |
| 2150 | fclose(backup); | |
| 2151 | chmod(name, S_IRUSR | S_IWUSR); | |
| 2152 | } else { | |
| 2153 | gaim_debug(GAIM_DEBUG_ERROR, "blist load", "Unable to write backup %s\n", | |
| 2154 | name); | |
| 2155 | } | |
| 2156 | g_free(name); | |
| 2157 | g_free(contents); | |
| 5228 | 2158 | return FALSE; |
| 2159 | } | |
| 8826 | 2160 | |
| 2161 | g_free(contents); | |
| 2162 | ||
| 7132 | 2163 | blist = xmlnode_get_child(gaim, "blist"); |
| 2164 | if(blist) { | |
| 2165 | xmlnode *groupnode; | |
| 8135 | 2166 | for(groupnode = xmlnode_get_child(blist, "group"); groupnode; |
| 2167 | groupnode = xmlnode_get_next_twin(groupnode)) { | |
| 7132 | 2168 | parse_group(groupnode); |
| 2169 | } | |
| 5228 | 2170 | } |
| 2171 | ||
| 7132 | 2172 | privacy = xmlnode_get_child(gaim, "privacy"); |
| 2173 | if(privacy) { | |
| 2174 | xmlnode *anode; | |
| 2175 | for(anode = privacy->child; anode; anode = anode->next) { | |
| 2176 | xmlnode *x; | |
| 2177 | GaimAccount *account; | |
| 7153 | 2178 | const char *acct_name, *proto, *mode, *protocol; |
| 7132 | 2179 | |
| 2180 | acct_name = xmlnode_get_attrib(anode, "name"); | |
| 7153 | 2181 | protocol = xmlnode_get_attrib(anode, "protocol"); |
| 2182 | proto = xmlnode_get_attrib(anode, "proto"); | |
| 7132 | 2183 | mode = xmlnode_get_attrib(anode, "mode"); |
| 2184 | ||
| 7153 | 2185 | if(!acct_name || (!proto && !protocol) || !mode) |
| 7132 | 2186 | continue; |
| 2187 | ||
| 7153 | 2188 | account = gaim_accounts_find(acct_name, proto ? proto : protocol); |
| 7132 | 2189 | |
| 2190 | if(!account) | |
| 2191 | continue; | |
| 2192 | ||
| 2193 | account->perm_deny = atoi(mode); | |
| 2194 | ||
| 2195 | for(x = anode->child; x; x = x->next) { | |
| 2196 | char *name; | |
| 8135 | 2197 | if(x->type != XMLNODE_TYPE_TAG) |
| 7132 | 2198 | continue; |
| 2199 | ||
| 2200 | if(!strcmp(x->name, "permit")) { | |
| 2201 | name = xmlnode_get_data(x); | |
| 2202 | gaim_privacy_permit_add(account, name, TRUE); | |
| 2203 | g_free(name); | |
| 2204 | } else if(!strcmp(x->name, "block")) { | |
| 2205 | name = xmlnode_get_data(x); | |
| 2206 | gaim_privacy_deny_add(account, name, TRUE); | |
| 2207 | g_free(name); | |
| 2208 | } | |
| 2209 | } | |
| 2210 | } | |
| 2211 | } | |
| 5228 | 2212 | |
| 2213 | gaim_debug(GAIM_DEBUG_INFO, "blist import", "Finished reading %s\n", | |
| 2214 | filename); | |
| 2215 | ||
| 8200 | 2216 | xmlnode_free(gaim); |
| 5228 | 2217 | return TRUE; |
| 2218 | } | |
| 2219 | ||
| 2220 | void gaim_blist_load() { | |
|
5580
a5a3e6dfb409
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5563
diff
changeset
|
2221 | GList *accts; |
| 5228 | 2222 | char *user_dir = gaim_user_dir(); |
| 2223 | char *filename; | |
| 2224 | char *msg; | |
| 2225 | ||
| 2226 | blist_safe_to_write = TRUE; | |
| 2227 | ||
| 2228 | if(!user_dir) | |
| 2229 | return; | |
| 2230 | ||
| 2231 | filename = g_build_filename(user_dir, "blist.xml", NULL); | |
| 2232 | ||
| 2233 | if(g_file_test(filename, G_FILE_TEST_EXISTS)) { | |
| 2234 | if(!gaim_blist_read(filename)) { | |
| 2235 | msg = g_strdup_printf(_("An error was encountered parsing your " | |
| 8826 | 2236 | "buddy list. It has not been loaded, " |
| 2237 | "and the old file has moved to blist.xml~.")); | |
|
5436
a0e0bacaa196
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
2238 | gaim_notify_error(NULL, NULL, _("Buddy List Error"), msg); |
| 5228 | 2239 | g_free(msg); |
| 2240 | } | |
|
5580
a5a3e6dfb409
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5563
diff
changeset
|
2241 | } else if(g_list_length(gaim_accounts_get_all())) { |
| 5228 | 2242 | /* read in the old lists, then save to the new format */ |
|
5580
a5a3e6dfb409
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5563
diff
changeset
|
2243 | for(accts = gaim_accounts_get_all(); accts; accts = accts->next) { |
| 5228 | 2244 | do_import(accts->data, NULL); |
| 2245 | } | |
| 2246 | gaim_blist_save(); | |
| 2247 | } | |
| 2248 | ||
| 2249 | g_free(filename); | |
| 2250 | } | |
| 2251 | ||
|
7060
717cbeb22b6d
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2252 | void |
|
717cbeb22b6d
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2253 | gaim_blist_request_add_buddy(GaimAccount *account, const char *username, |
|
717cbeb22b6d
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2254 | const char *group, const char *alias) |
|
717cbeb22b6d
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2255 | { |
|
7098
22eabd4f5ed4
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
2256 | GaimBlistUiOps *ui_ops; |
|
7060
717cbeb22b6d
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2257 | |
|
717cbeb22b6d
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2258 | ui_ops = gaim_blist_get_ui_ops(); |
|
717cbeb22b6d
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2259 | |
|
717cbeb22b6d
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2260 | if (ui_ops != NULL && ui_ops->request_add_buddy != NULL) |
|
717cbeb22b6d
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2261 | ui_ops->request_add_buddy(account, username, group, alias); |
|
717cbeb22b6d
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2262 | } |
|
717cbeb22b6d
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2263 | |
|
717cbeb22b6d
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2264 | void |
|
7859
b0f646df7125
[gaim-migrate @ 8513]
Mark Doliner <markdoliner@pidgin.im>
parents:
7849
diff
changeset
|
2265 | gaim_blist_request_add_chat(GaimAccount *account, GaimGroup *group, const char *alias) |
|
7060
717cbeb22b6d
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2266 | { |
|
7098
22eabd4f5ed4
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
2267 | GaimBlistUiOps *ui_ops; |
|
7060
717cbeb22b6d
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2268 | |
|
717cbeb22b6d
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2269 | ui_ops = gaim_blist_get_ui_ops(); |
|
717cbeb22b6d
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2270 | |
|
717cbeb22b6d
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2271 | if (ui_ops != NULL && ui_ops->request_add_chat != NULL) |
|
7859
b0f646df7125
[gaim-migrate @ 8513]
Mark Doliner <markdoliner@pidgin.im>
parents:
7849
diff
changeset
|
2272 | ui_ops->request_add_chat(account, group, alias); |
|
7060
717cbeb22b6d
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2273 | } |
|
717cbeb22b6d
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2274 | |
|
717cbeb22b6d
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2275 | void |
|
717cbeb22b6d
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2276 | gaim_blist_request_add_group(void) |
|
717cbeb22b6d
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2277 | { |
|
7098
22eabd4f5ed4
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
2278 | GaimBlistUiOps *ui_ops; |
|
7060
717cbeb22b6d
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2279 | |
|
717cbeb22b6d
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2280 | ui_ops = gaim_blist_get_ui_ops(); |
|
717cbeb22b6d
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2281 | |
|
717cbeb22b6d
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2282 | if (ui_ops != NULL && ui_ops->request_add_group != NULL) |
|
717cbeb22b6d
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2283 | ui_ops->request_add_group(); |
|
717cbeb22b6d
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2284 | } |
|
717cbeb22b6d
[gaim-migrate @ 7623]
Christian Hammond <chipx86@chipx86.com>
parents:
7035
diff
changeset
|
2285 | |
| 7693 | 2286 | static void blist_print_setting(const char *key, |
| 2287 | struct gaim_blist_node_setting *setting, FILE *file, int indent) | |
| 2288 | { | |
| 2289 | char *key_val, *data_val = NULL; | |
| 2290 | const char *type = NULL; | |
| 2291 | int i; | |
| 2292 | ||
| 2293 | if(!key) | |
| 2294 | return; | |
| 2295 | ||
| 2296 | switch(setting->type) { | |
| 2297 | case GAIM_BLIST_NODE_SETTING_BOOL: | |
| 2298 | type = "bool"; | |
| 2299 | data_val = g_strdup_printf("%d", setting->value.boolean); | |
| 2300 | break; | |
| 2301 | case GAIM_BLIST_NODE_SETTING_INT: | |
| 2302 | type = "int"; | |
| 2303 | data_val = g_strdup_printf("%d", setting->value.integer); | |
| 2304 | break; | |
| 2305 | case GAIM_BLIST_NODE_SETTING_STRING: | |
| 2306 | if(!setting->value.string) | |
| 2307 | return; | |
| 2308 | ||
| 2309 | type = "string"; | |
| 2310 | data_val = g_markup_escape_text(setting->value.string, -1); | |
| 2311 | break; | |
| 2312 | } | |
| 2313 | ||
| 2314 | /* this can't happen */ | |
| 2315 | if(!type || !data_val) | |
| 2316 | return; | |
| 2317 | ||
| 2318 | for(i=0; i<indent; i++) fprintf(file, "\t"); | |
| 2319 | ||
| 2320 | key_val = g_markup_escape_text(key, -1); | |
| 2321 | fprintf(file, "<setting name=\"%s\" type=\"%s\">%s</setting>\n", key_val, type, | |
| 2322 | data_val); | |
| 2323 | ||
| 2324 | g_free(key_val); | |
| 2325 | g_free(data_val); | |
| 2326 | } | |
| 2327 | ||
| 5228 | 2328 | static void blist_print_group_settings(gpointer key, gpointer data, |
| 2329 | gpointer user_data) { | |
| 7693 | 2330 | blist_print_setting(key, data, user_data, 3); |
| 5228 | 2331 | } |
| 2332 | ||
| 2333 | static void blist_print_buddy_settings(gpointer key, gpointer data, | |
| 2334 | gpointer user_data) { | |
| 7693 | 2335 | blist_print_setting(key, data, user_data, 5); |
| 5228 | 2336 | } |
| 2337 | ||
| 6695 | 2338 | static void blist_print_cnode_settings(gpointer key, gpointer data, |
| 2339 | gpointer user_data) { | |
| 7693 | 2340 | blist_print_setting(key, data, user_data, 4); |
| 6695 | 2341 | } |
| 2342 | ||
| 5234 | 2343 | static void blist_print_chat_components(gpointer key, gpointer data, |
| 2344 | gpointer user_data) { | |
| 2345 | char *key_val; | |
| 2346 | char *data_val; | |
| 2347 | FILE *file = user_data; | |
| 2348 | ||
| 2349 | if(!key || !data) | |
| 2350 | return; | |
| 2351 | ||
| 2352 | key_val = g_markup_escape_text(key, -1); | |
| 2353 | data_val = g_markup_escape_text(data, -1); | |
| 2354 | ||
| 2355 | fprintf(file, "\t\t\t\t<component name=\"%s\">%s</component>\n", key_val, | |
| 2356 | data_val); | |
| 2357 | g_free(key_val); | |
| 2358 | g_free(data_val); | |
| 2359 | } | |
| 2360 | ||
| 6695 | 2361 | static void print_buddy(FILE *file, GaimBuddy *buddy) { |
| 2362 | char *bud_name = g_markup_escape_text(buddy->name, -1); | |
| 2363 | char *bud_alias = NULL; | |
| 2364 | char *acct_name = g_markup_escape_text(buddy->account->username, -1); | |
| 7153 | 2365 | int proto_num = gaim_account_get_protocol(buddy->account); |
| 6695 | 2366 | if(buddy->alias) |
| 2367 | bud_alias= g_markup_escape_text(buddy->alias, -1); | |
| 7153 | 2368 | fprintf(file, "\t\t\t\t<buddy account=\"%s\" proto=\"%s\"", acct_name, |
| 2369 | gaim_account_get_protocol_id(buddy->account)); | |
| 2370 | if(proto_num != -1) | |
| 2371 | fprintf(file, " protocol=\"%d\"", proto_num); | |
| 2372 | fprintf(file, ">\n"); | |
| 2373 | ||
| 6695 | 2374 | fprintf(file, "\t\t\t\t\t<name>%s</name>\n", bud_name); |
| 2375 | if(bud_alias) { | |
| 2376 | fprintf(file, "\t\t\t\t\t<alias>%s</alias>\n", bud_alias); | |
| 2377 | } | |
| 7726 | 2378 | g_hash_table_foreach(buddy->node.settings, blist_print_buddy_settings, file); |
| 6695 | 2379 | fprintf(file, "\t\t\t\t</buddy>\n"); |
| 2380 | g_free(bud_name); | |
| 2381 | g_free(bud_alias); | |
| 2382 | g_free(acct_name); | |
| 2383 | } | |
| 2384 | ||
|
5563
d5a7852aa0cb
[gaim-migrate @ 5965]
Christian Hammond <chipx86@chipx86.com>
parents:
5545
diff
changeset
|
2385 | static void gaim_blist_write(FILE *file, GaimAccount *exp_acct) { |
|
5580
a5a3e6dfb409
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5563
diff
changeset
|
2386 | GList *accounts; |
|
a5a3e6dfb409
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5563
diff
changeset
|
2387 | GSList *buds; |
| 6695 | 2388 | GaimBlistNode *gnode, *cnode, *bnode; |
| 5228 | 2389 | fprintf(file, "<?xml version='1.0' encoding='UTF-8' ?>\n"); |
| 2390 | fprintf(file, "<gaim version=\"1\">\n"); | |
| 2391 | fprintf(file, "\t<blist>\n"); | |
| 2392 | ||
| 2393 | for(gnode = gaimbuddylist->root; gnode; gnode = gnode->next) { | |
| 6695 | 2394 | GaimGroup *group; |
| 2395 | ||
| 5228 | 2396 | if(!GAIM_BLIST_NODE_IS_GROUP(gnode)) |
| 2397 | continue; | |
| 6695 | 2398 | |
| 2399 | group = (GaimGroup *)gnode; | |
| 5228 | 2400 | if(!exp_acct || gaim_group_on_account(group, exp_acct)) { |
| 2401 | char *group_name = g_markup_escape_text(group->name, -1); | |
| 2402 | fprintf(file, "\t\t<group name=\"%s\">\n", group_name); | |
| 7693 | 2403 | g_hash_table_foreach(group->node.settings, |
| 2404 | blist_print_group_settings, file); | |
| 6695 | 2405 | for(cnode = gnode->child; cnode; cnode = cnode->next) { |
| 2406 | if(GAIM_BLIST_NODE_IS_CONTACT(cnode)) { | |
| 6755 | 2407 | GaimContact *contact = (GaimContact*)cnode; |
| 2408 | fprintf(file, "\t\t\t<contact"); | |
| 2409 | if(contact->alias) { | |
| 2410 | char *alias = g_markup_escape_text(contact->alias, -1); | |
| 2411 | fprintf(file, " alias=\"%s\"", alias); | |
| 2412 | g_free(alias); | |
| 2413 | } | |
| 2414 | fprintf(file, ">\n"); | |
| 6695 | 2415 | |
| 2416 | for(bnode = cnode->child; bnode; bnode = bnode->next) { | |
| 2417 | if(GAIM_BLIST_NODE_IS_BUDDY(bnode)) { | |
| 2418 | GaimBuddy *buddy = (GaimBuddy *)bnode; | |
| 2419 | if(!exp_acct || buddy->account == exp_acct) { | |
| 2420 | print_buddy(file, buddy); | |
| 2421 | } | |
| 5234 | 2422 | } |
| 5228 | 2423 | } |
| 6695 | 2424 | |
| 2425 | fprintf(file, "\t\t\t</contact>\n"); | |
| 2426 | } else if(GAIM_BLIST_NODE_IS_CHAT(cnode)) { | |
|
7118
280b3b85a28a
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
7117
diff
changeset
|
2427 | GaimChat *chat = (GaimChat *)cnode; |
| 5234 | 2428 | if(!exp_acct || chat->account == exp_acct) { |
| 2429 | char *acct_name = g_markup_escape_text(chat->account->username, -1); | |
| 7153 | 2430 | int proto_num = gaim_account_get_protocol(chat->account); |
| 2431 | fprintf(file, "\t\t\t<chat proto=\"%s\" account=\"%s\"", | |
| 7133 | 2432 | gaim_account_get_protocol_id(chat->account), |
|
5943
8a052155157a
[gaim-migrate @ 6384]
Christian Hammond <chipx86@chipx86.com>
parents:
5906
diff
changeset
|
2433 | acct_name); |
| 7153 | 2434 | if(proto_num != -1) |
| 2435 | fprintf(file, " protocol=\"%d\"", proto_num); | |
| 2436 | fprintf(file, ">\n"); | |
| 2437 | ||
| 5237 | 2438 | if(chat->alias) { |
| 2439 | char *chat_alias = g_markup_escape_text(chat->alias, -1); | |
| 2440 | fprintf(file, "\t\t\t\t<alias>%s</alias>\n", chat_alias); | |
| 2441 | g_free(chat_alias); | |
| 2442 | } | |
| 5234 | 2443 | g_hash_table_foreach(chat->components, |
| 2444 | blist_print_chat_components, file); | |
| 7693 | 2445 | g_hash_table_foreach(chat->node.settings, |
| 6695 | 2446 | blist_print_cnode_settings, file); |
| 5234 | 2447 | fprintf(file, "\t\t\t</chat>\n"); |
| 5237 | 2448 | g_free(acct_name); |
| 5234 | 2449 | } |
| 5228 | 2450 | } |
| 2451 | } | |
| 2452 | fprintf(file, "\t\t</group>\n"); | |
| 2453 | g_free(group_name); | |
| 2454 | } | |
| 2455 | } | |
| 2456 | ||
| 2457 | fprintf(file, "\t</blist>\n"); | |
| 2458 | fprintf(file, "\t<privacy>\n"); | |
| 2459 | ||
|
5580
a5a3e6dfb409
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5563
diff
changeset
|
2460 | for(accounts = gaim_accounts_get_all(); |
|
a5a3e6dfb409
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5563
diff
changeset
|
2461 | accounts != NULL; |
|
a5a3e6dfb409
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5563
diff
changeset
|
2462 | accounts = accounts->next) { |
|
a5a3e6dfb409
[gaim-migrate @ 5984]
Christian Hammond <chipx86@chipx86.com>
parents:
5563
diff
changeset
|
2463 | |
|
5563
d5a7852aa0cb
[gaim-migrate @ 5965]
Christian Hammond <chipx86@chipx86.com>
parents:
5545
diff
changeset
|
2464 | GaimAccount *account = accounts->data; |
| 5228 | 2465 | char *acct_name = g_markup_escape_text(account->username, -1); |
| 7153 | 2466 | int proto_num = gaim_account_get_protocol(account); |
| 5228 | 2467 | if(!exp_acct || account == exp_acct) { |
| 7153 | 2468 | fprintf(file, "\t\t<account proto=\"%s\" name=\"%s\" " |
| 2469 | "mode=\"%d\"", gaim_account_get_protocol_id(account), | |
|
5943
8a052155157a
[gaim-migrate @ 6384]
Christian Hammond <chipx86@chipx86.com>
parents:
5906
diff
changeset
|
2470 | acct_name, account->perm_deny); |
| 7153 | 2471 | if(proto_num != -1) |
| 2472 | fprintf(file, " protocol=\"%d\"", proto_num); | |
| 2473 | fprintf(file, ">\n"); | |
| 2474 | ||
| 5228 | 2475 | for(buds = account->permit; buds; buds = buds->next) { |
| 2476 | char *bud_name = g_markup_escape_text(buds->data, -1); | |
| 2477 | fprintf(file, "\t\t\t<permit>%s</permit>\n", bud_name); | |
| 2478 | g_free(bud_name); | |
| 2479 | } | |
| 2480 | for(buds = account->deny; buds; buds = buds->next) { | |
| 2481 | char *bud_name = g_markup_escape_text(buds->data, -1); | |
| 2482 | fprintf(file, "\t\t\t<block>%s</block>\n", bud_name); | |
| 2483 | g_free(bud_name); | |
| 2484 | } | |
| 2485 | fprintf(file, "\t\t</account>\n"); | |
| 2486 | } | |
| 2487 | g_free(acct_name); | |
| 2488 | } | |
| 2489 | ||
| 2490 | fprintf(file, "\t</privacy>\n"); | |
| 2491 | fprintf(file, "</gaim>\n"); | |
| 2492 | } | |
| 2493 | ||
| 2494 | void gaim_blist_save() { | |
| 2495 | FILE *file; | |
| 2496 | char *user_dir = gaim_user_dir(); | |
| 2497 | char *filename; | |
| 2498 | char *filename_real; | |
| 2499 | ||
| 2500 | if(!user_dir) | |
| 2501 | return; | |
| 2502 | if(!blist_safe_to_write) { | |
| 2503 | gaim_debug(GAIM_DEBUG_WARNING, "blist save", | |
| 2504 | "AHH!! Tried to write the blist before we read it!\n"); | |
| 2505 | return; | |
| 2506 | } | |
| 2507 | ||
| 2508 | file = fopen(user_dir, "r"); | |
| 2509 | if(!file) | |
| 2510 | mkdir(user_dir, S_IRUSR | S_IWUSR | S_IXUSR); | |
| 2511 | else | |
| 2512 | fclose(file); | |
| 2513 | ||
| 2514 | filename = g_build_filename(user_dir, "blist.xml.save", NULL); | |
| 2515 | ||
| 2516 | if((file = fopen(filename, "w"))) { | |
| 2517 | gaim_blist_write(file, NULL); | |
| 2518 | fclose(file); | |
| 2519 | chmod(filename, S_IRUSR | S_IWUSR); | |
| 2520 | } else { | |
| 2521 | gaim_debug(GAIM_DEBUG_ERROR, "blist save", "Unable to write %s\n", | |
| 2522 | filename); | |
| 8549 | 2523 | g_free(filename); |
| 2524 | return; | |
| 5228 | 2525 | } |
| 2526 | ||
| 2527 | filename_real = g_build_filename(user_dir, "blist.xml", NULL); | |
| 2528 | ||
| 2529 | if(rename(filename, filename_real) < 0) | |
| 2530 | gaim_debug(GAIM_DEBUG_ERROR, "blist save", | |
| 2531 | "Error renaming %s to %s\n", filename, filename_real); | |
| 2532 | ||
| 2533 | ||
| 2534 | g_free(filename); | |
| 2535 | g_free(filename_real); | |
| 2536 | } | |
| 2537 | ||
| 7693 | 2538 | |
| 2539 | static void gaim_blist_node_setting_free(struct gaim_blist_node_setting *setting) | |
| 2540 | { | |
| 2541 | switch(setting->type) { | |
| 2542 | case GAIM_BLIST_NODE_SETTING_BOOL: | |
| 2543 | case GAIM_BLIST_NODE_SETTING_INT: | |
| 2544 | break; | |
| 2545 | case GAIM_BLIST_NODE_SETTING_STRING: | |
| 2546 | g_free(setting->value.string); | |
| 2547 | break; | |
| 2548 | } | |
| 8020 | 2549 | g_free(setting); |
| 7693 | 2550 | } |
| 2551 | ||
| 2552 | static void gaim_blist_node_initialize_settings(GaimBlistNode* node) | |
| 2553 | { | |
| 2554 | if(node->settings) | |
| 5228 | 2555 | return; |
| 7693 | 2556 | |
| 2557 | node->settings = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, | |
| 2558 | (GDestroyNotify)gaim_blist_node_setting_free); | |
| 2559 | } | |
| 2560 | ||
| 2561 | void gaim_blist_node_remove_setting(GaimBlistNode *node, const char *key) | |
| 2562 | { | |
| 2563 | g_return_if_fail(node != NULL); | |
| 2564 | g_return_if_fail(node->settings != NULL); | |
| 2565 | g_return_if_fail(key != NULL); | |
| 2566 | ||
| 2567 | g_hash_table_remove(node->settings, key); | |
| 5228 | 2568 | } |
| 2569 | ||
| 7693 | 2570 | |
| 2571 | void gaim_blist_node_set_bool(GaimBlistNode* node, const char *key, gboolean value) | |
| 2572 | { | |
| 2573 | struct gaim_blist_node_setting *setting; | |
| 2574 | ||
| 2575 | g_return_if_fail(node != NULL); | |
| 2576 | g_return_if_fail(node->settings != NULL); | |
| 2577 | g_return_if_fail(key != NULL); | |
| 2578 | ||
| 2579 | setting = g_new0(struct gaim_blist_node_setting, 1); | |
| 2580 | setting->type = GAIM_BLIST_NODE_SETTING_BOOL; | |
| 2581 | setting->value.boolean = value; | |
| 2582 | ||
| 2583 | g_hash_table_replace(node->settings, g_strdup(key), setting); | |
| 2584 | } | |
| 2585 | ||
| 2586 | gboolean gaim_blist_node_get_bool(GaimBlistNode* node, const char *key) | |
| 2587 | { | |
| 2588 | struct gaim_blist_node_setting *setting; | |
| 2589 | ||
| 2590 | g_return_val_if_fail(node != NULL, FALSE); | |
| 2591 | g_return_val_if_fail(node->settings != NULL, FALSE); | |
| 2592 | g_return_val_if_fail(key != NULL, FALSE); | |
| 2593 | ||
| 2594 | setting = g_hash_table_lookup(node->settings, key); | |
| 2595 | ||
| 7849 | 2596 | if(!setting) |
| 2597 | return FALSE; | |
| 2598 | ||
| 7848 | 2599 | g_return_val_if_fail(setting->type == GAIM_BLIST_NODE_SETTING_BOOL, FALSE); |
| 2600 | ||
| 2601 | return setting->value.boolean; | |
| 5228 | 2602 | } |
| 2603 | ||
| 7693 | 2604 | void gaim_blist_node_set_int(GaimBlistNode* node, const char *key, int value) |
| 2605 | { | |
| 2606 | struct gaim_blist_node_setting *setting; | |
| 2607 | ||
| 2608 | g_return_if_fail(node != NULL); | |
| 2609 | g_return_if_fail(node->settings != NULL); | |
| 2610 | g_return_if_fail(key != NULL); | |
| 2611 | ||
| 2612 | setting = g_new0(struct gaim_blist_node_setting, 1); | |
| 8071 | 2613 | setting->type = GAIM_BLIST_NODE_SETTING_INT; |
| 7693 | 2614 | setting->value.integer = value; |
| 2615 | ||
| 2616 | g_hash_table_replace(node->settings, g_strdup(key), setting); | |
| 2617 | } | |
| 2618 | ||
| 2619 | int gaim_blist_node_get_int(GaimBlistNode* node, const char *key) | |
| 2620 | { | |
| 2621 | struct gaim_blist_node_setting *setting; | |
| 2622 | ||
| 2623 | g_return_val_if_fail(node != NULL, 0); | |
| 2624 | g_return_val_if_fail(node->settings != NULL, 0); | |
| 2625 | g_return_val_if_fail(key != NULL, 0); | |
| 2626 | ||
| 2627 | setting = g_hash_table_lookup(node->settings, key); | |
| 2628 | ||
| 7849 | 2629 | if(!setting) |
| 2630 | return 0; | |
| 2631 | ||
| 7848 | 2632 | g_return_val_if_fail(setting->type == GAIM_BLIST_NODE_SETTING_INT, 0); |
| 2633 | ||
| 2634 | return setting->value.integer; | |
| 7693 | 2635 | } |
| 2636 | ||
| 2637 | void gaim_blist_node_set_string(GaimBlistNode* node, const char *key, | |
| 5906 | 2638 | const char *value) |
| 2639 | { | |
| 7693 | 2640 | struct gaim_blist_node_setting *setting; |
| 2641 | ||
| 2642 | g_return_if_fail(node != NULL); | |
| 2643 | g_return_if_fail(node->settings != NULL); | |
| 2644 | g_return_if_fail(key != NULL); | |
| 2645 | ||
| 2646 | setting = g_new0(struct gaim_blist_node_setting, 1); | |
| 2647 | setting->type = GAIM_BLIST_NODE_SETTING_STRING; | |
| 2648 | setting->value.string = g_strdup(value); | |
| 2649 | ||
| 2650 | g_hash_table_replace(node->settings, g_strdup(key), setting); | |
| 2651 | } | |
| 2652 | ||
| 2653 | const char *gaim_blist_node_get_string(GaimBlistNode* node, const char *key) | |
| 2654 | { | |
| 2655 | struct gaim_blist_node_setting *setting; | |
| 2656 | ||
| 2657 | g_return_val_if_fail(node != NULL, NULL); | |
| 2658 | g_return_val_if_fail(node->settings != NULL, NULL); | |
| 2659 | g_return_val_if_fail(key != NULL, NULL); | |
| 2660 | ||
| 2661 | setting = g_hash_table_lookup(node->settings, key); | |
| 2662 | ||
| 7849 | 2663 | if(!setting) |
| 2664 | return NULL; | |
| 2665 | ||
| 7848 | 2666 | g_return_val_if_fail(setting->type == GAIM_BLIST_NODE_SETTING_STRING, NULL); |
| 2667 | ||
| 2668 | return setting->value.string; | |
| 7693 | 2669 | } |
| 2670 | ||
| 2671 | ||
|
8735
01248ea222d3
[gaim-migrate @ 9490]
Jonathan Champ <royanee@users.sourceforge.net>
parents:
8710
diff
changeset
|
2672 | /* XXX: this is compatibility stuff. Remove after.... oh, I dunno... 0.77 or so */ |
| 7693 | 2673 | |
| 2674 | void gaim_group_set_setting(GaimGroup *g, const char *key, const char *value) | |
| 2675 | { | |
| 2676 | gaim_debug_warning("blist", "gaim_group_set_setting() is deprecated\n"); | |
| 2677 | ||
| 2678 | gaim_blist_node_set_string((GaimBlistNode*)g, key, value); | |
| 2679 | } | |
| 2680 | ||
| 2681 | const char *gaim_group_get_setting(GaimGroup *g, const char *key) | |
| 2682 | { | |
| 2683 | gaim_debug_warning("blist", "gaim_group_get_setting() is deprecated\n"); | |
| 2684 | ||
| 2685 | return gaim_blist_node_get_string((GaimBlistNode*)g, key); | |
| 2686 | } | |
| 2687 | ||
| 2688 | void gaim_chat_set_setting(GaimChat *c, const char *key, const char *value) | |
| 2689 | { | |
| 2690 | gaim_debug_warning("blist", "gaim_chat_set_setting() is deprecated\n"); | |
| 2691 | ||
| 2692 | gaim_blist_node_set_string((GaimBlistNode*)c, key, value); | |
| 5906 | 2693 | } |
| 2694 | ||
| 7125 | 2695 | const char *gaim_chat_get_setting(GaimChat *c, const char *key) |
| 5906 | 2696 | { |
| 7693 | 2697 | gaim_debug_warning("blist", "gaim_chat_get_setting() is deprecated\n"); |
| 2698 | ||
| 2699 | return gaim_blist_node_get_string((GaimBlistNode*)c, key); | |
| 5906 | 2700 | } |
| 2701 | ||
| 7693 | 2702 | void gaim_buddy_set_setting(GaimBuddy *b, const char *key, const char *value) |
| 2703 | { | |
| 2704 | gaim_debug_warning("blist", "gaim_buddy_set_setting() is deprecated\n"); | |
| 2705 | ||
| 2706 | gaim_blist_node_set_string((GaimBlistNode*)b, key, value); | |
| 5228 | 2707 | } |
| 2708 | ||
| 7693 | 2709 | const char *gaim_buddy_get_setting(GaimBuddy *b, const char *key) |
| 2710 | { | |
| 2711 | gaim_debug_warning("blist", "gaim_buddy_get_setting() is deprecated\n"); | |
| 2712 | ||
| 2713 | return gaim_blist_node_get_string((GaimBlistNode*)b, key); | |
| 5228 | 2714 | } |
| 2715 | ||
| 7693 | 2716 | /* XXX: end compat crap */ |
| 2717 | ||
|
8710
360b660e428d
[gaim-migrate @ 9464]
Christian Hammond <chipx86@chipx86.com>
parents:
8675
diff
changeset
|
2718 | |
|
360b660e428d
[gaim-migrate @ 9464]
Christian Hammond <chipx86@chipx86.com>
parents:
8675
diff
changeset
|
2719 | GList *gaim_buddy_get_extended_menu(GaimBuddy *b) { |
|
360b660e428d
[gaim-migrate @ 9464]
Christian Hammond <chipx86@chipx86.com>
parents:
8675
diff
changeset
|
2720 | GList *menu = NULL; |
|
360b660e428d
[gaim-migrate @ 9464]
Christian Hammond <chipx86@chipx86.com>
parents:
8675
diff
changeset
|
2721 | gaim_signal_emit(gaim_blist_get_handle(), "buddy-extended-menu", |
|
360b660e428d
[gaim-migrate @ 9464]
Christian Hammond <chipx86@chipx86.com>
parents:
8675
diff
changeset
|
2722 | b, &menu); |
|
360b660e428d
[gaim-migrate @ 9464]
Christian Hammond <chipx86@chipx86.com>
parents:
8675
diff
changeset
|
2723 | return menu; |
|
360b660e428d
[gaim-migrate @ 9464]
Christian Hammond <chipx86@chipx86.com>
parents:
8675
diff
changeset
|
2724 | } |
|
360b660e428d
[gaim-migrate @ 9464]
Christian Hammond <chipx86@chipx86.com>
parents:
8675
diff
changeset
|
2725 | |
|
360b660e428d
[gaim-migrate @ 9464]
Christian Hammond <chipx86@chipx86.com>
parents:
8675
diff
changeset
|
2726 | |
| 6695 | 2727 | int gaim_blist_get_group_size(GaimGroup *group, gboolean offline) { |
| 5228 | 2728 | if(!group) |
| 2729 | return 0; | |
| 2730 | ||
| 5277 | 2731 | return offline ? group->totalsize : group->currentsize; |
| 5228 | 2732 | } |
| 2733 | ||
| 6695 | 2734 | int gaim_blist_get_group_online_count(GaimGroup *group) { |
| 5228 | 2735 | if(!group) |
| 2736 | return 0; | |
| 2737 | ||
| 5277 | 2738 | return group->online; |
| 5228 | 2739 | } |
| 2740 | ||
|
7035
76bca80cd91d
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
7003
diff
changeset
|
2741 | void |
|
7098
22eabd4f5ed4
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
2742 | gaim_blist_set_ui_ops(GaimBlistUiOps *ops) |
|
7035
76bca80cd91d
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
7003
diff
changeset
|
2743 | { |
|
76bca80cd91d
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
7003
diff
changeset
|
2744 | blist_ui_ops = ops; |
|
76bca80cd91d
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
7003
diff
changeset
|
2745 | } |
|
76bca80cd91d
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
7003
diff
changeset
|
2746 | |
|
7098
22eabd4f5ed4
[gaim-migrate @ 7663]
Christian Hammond <chipx86@chipx86.com>
parents:
7060
diff
changeset
|
2747 | GaimBlistUiOps * |
|
7035
76bca80cd91d
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
7003
diff
changeset
|
2748 | gaim_blist_get_ui_ops(void) |
|
76bca80cd91d
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
7003
diff
changeset
|
2749 | { |
|
76bca80cd91d
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
7003
diff
changeset
|
2750 | return blist_ui_ops; |
|
76bca80cd91d
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
7003
diff
changeset
|
2751 | } |
|
76bca80cd91d
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
7003
diff
changeset
|
2752 | |
|
76bca80cd91d
[gaim-migrate @ 7598]
Christian Hammond <chipx86@chipx86.com>
parents:
7003
diff
changeset
|
2753 | |
|
6485
3c7ba18e32f1
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2754 | void * |
|
3c7ba18e32f1
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2755 | gaim_blist_get_handle(void) |
|
3c7ba18e32f1
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2756 | { |
|
3c7ba18e32f1
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2757 | static int handle; |
| 5228 | 2758 | |
|
6485
3c7ba18e32f1
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2759 | return &handle; |
|
3c7ba18e32f1
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2760 | } |
|
3c7ba18e32f1
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2761 | |
|
3c7ba18e32f1
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2762 | void |
|
3c7ba18e32f1
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2763 | gaim_blist_init(void) |
|
3c7ba18e32f1
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2764 | { |
|
3c7ba18e32f1
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2765 | void *handle = gaim_blist_get_handle(); |
|
3c7ba18e32f1
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2766 | |
|
6564
a7a2c1927544
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2767 | gaim_signal_register(handle, "buddy-away", |
|
a7a2c1927544
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2768 | gaim_marshal_VOID__POINTER, NULL, 1, |
|
a7a2c1927544
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2769 | gaim_value_new(GAIM_TYPE_SUBTYPE, |
|
a7a2c1927544
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2770 | GAIM_SUBTYPE_BLIST_BUDDY)); |
|
a7a2c1927544
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2771 | |
|
a7a2c1927544
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2772 | gaim_signal_register(handle, "buddy-back", |
|
a7a2c1927544
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2773 | gaim_marshal_VOID__POINTER, NULL, 1, |
|
a7a2c1927544
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2774 | gaim_value_new(GAIM_TYPE_SUBTYPE, |
|
a7a2c1927544
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2775 | GAIM_SUBTYPE_BLIST_BUDDY)); |
|
6485
3c7ba18e32f1
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2776 | |
|
3c7ba18e32f1
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2777 | gaim_signal_register(handle, "buddy-idle", |
|
6564
a7a2c1927544
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2778 | gaim_marshal_VOID__POINTER, NULL, 1, |
|
a7a2c1927544
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2779 | gaim_value_new(GAIM_TYPE_SUBTYPE, |
|
a7a2c1927544
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2780 | GAIM_SUBTYPE_BLIST_BUDDY)); |
|
6485
3c7ba18e32f1
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2781 | gaim_signal_register(handle, "buddy-unidle", |
|
6564
a7a2c1927544
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2782 | gaim_marshal_VOID__POINTER, NULL, 1, |
|
a7a2c1927544
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2783 | gaim_value_new(GAIM_TYPE_SUBTYPE, |
|
a7a2c1927544
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2784 | GAIM_SUBTYPE_BLIST_BUDDY)); |
|
6485
3c7ba18e32f1
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2785 | |
|
3c7ba18e32f1
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2786 | gaim_signal_register(handle, "buddy-signed-on", |
|
6564
a7a2c1927544
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2787 | gaim_marshal_VOID__POINTER, NULL, 1, |
|
a7a2c1927544
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2788 | gaim_value_new(GAIM_TYPE_SUBTYPE, |
|
a7a2c1927544
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2789 | GAIM_SUBTYPE_BLIST_BUDDY)); |
|
a7a2c1927544
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2790 | |
|
6485
3c7ba18e32f1
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2791 | gaim_signal_register(handle, "buddy-signed-off", |
|
6564
a7a2c1927544
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2792 | gaim_marshal_VOID__POINTER, NULL, 1, |
|
a7a2c1927544
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2793 | gaim_value_new(GAIM_TYPE_SUBTYPE, |
|
a7a2c1927544
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2794 | GAIM_SUBTYPE_BLIST_BUDDY)); |
|
6485
3c7ba18e32f1
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2795 | |
|
6564
a7a2c1927544
[gaim-migrate @ 7086]
Christian Hammond <chipx86@chipx86.com>
parents:
6506
diff
changeset
|
2796 | gaim_signal_register(handle, "update-idle", gaim_marshal_VOID, NULL, 0); |
|
8710
360b660e428d
[gaim-migrate @ 9464]
Christian Hammond <chipx86@chipx86.com>
parents:
8675
diff
changeset
|
2797 | gaim_signal_register(handle, "buddy-extended-menu", |
|
360b660e428d
[gaim-migrate @ 9464]
Christian Hammond <chipx86@chipx86.com>
parents:
8675
diff
changeset
|
2798 | gaim_marshal_VOID__POINTER_POINTER, NULL, 2, |
|
360b660e428d
[gaim-migrate @ 9464]
Christian Hammond <chipx86@chipx86.com>
parents:
8675
diff
changeset
|
2799 | gaim_value_new(GAIM_TYPE_SUBTYPE, |
|
360b660e428d
[gaim-migrate @ 9464]
Christian Hammond <chipx86@chipx86.com>
parents:
8675
diff
changeset
|
2800 | GAIM_SUBTYPE_BLIST_BUDDY), |
|
360b660e428d
[gaim-migrate @ 9464]
Christian Hammond <chipx86@chipx86.com>
parents:
8675
diff
changeset
|
2801 | gaim_value_new(GAIM_TYPE_BOXED, "GList **")); |
|
6485
3c7ba18e32f1
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2802 | } |
|
3c7ba18e32f1
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2803 | |
|
3c7ba18e32f1
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2804 | void |
|
3c7ba18e32f1
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2805 | gaim_blist_uninit(void) |
|
3c7ba18e32f1
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2806 | { |
|
3c7ba18e32f1
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2807 | gaim_signals_unregister_by_instance(gaim_blist_get_handle()); |
|
3c7ba18e32f1
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6473
diff
changeset
|
2808 | } |