annotate src/protocols/gg/gg-utils.c @ 13967:99b9b58b19dd

[gaim-migrate @ 16523] Fix a crazy MSN crash. Basically it's possible to have more than one slplink associated with a given switchboard, but our code did not allow for that. I think it happens when you're in a multi-user chat and you do stuff with multiple users that involves slplinks. Like maybe file transfer and buddy icon related stuff. Tracking this down took an ungodly amount of time, but thanks to Meebo for letting me do it :-) committer: Tailor Script <tailor@pidgin.im>
author Mark Doliner <mark@kingant.net>
date Thu, 20 Jul 2006 07:31:15 +0000
parents fa7313d125ac
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
13626
fa7313d125ac [gaim-migrate @ 16013]
Evan Schoenberg <evan.s@dreskin.net>
parents:
diff changeset
1 /**
fa7313d125ac [gaim-migrate @ 16013]
Evan Schoenberg <evan.s@dreskin.net>
parents:
diff changeset
2 * @file gg-utils.c
fa7313d125ac [gaim-migrate @ 16013]
Evan Schoenberg <evan.s@dreskin.net>
parents:
diff changeset
3 *
fa7313d125ac [gaim-migrate @ 16013]
Evan Schoenberg <evan.s@dreskin.net>
parents:
diff changeset
4 * gaim
fa7313d125ac [gaim-migrate @ 16013]
Evan Schoenberg <evan.s@dreskin.net>
parents:
diff changeset
5 *
fa7313d125ac [gaim-migrate @ 16013]
Evan Schoenberg <evan.s@dreskin.net>
parents:
diff changeset
6 * Copyright (C) 2005 Bartosz Oler <bartosz@bzimage.us>
fa7313d125ac [gaim-migrate @ 16013]
Evan Schoenberg <evan.s@dreskin.net>
parents:
diff changeset
7 *
fa7313d125ac [gaim-migrate @ 16013]
Evan Schoenberg <evan.s@dreskin.net>
parents:
diff changeset
8 * This program is free software; you can redistribute it and/or modify
fa7313d125ac [gaim-migrate @ 16013]
Evan Schoenberg <evan.s@dreskin.net>
parents:
diff changeset
9 * it under the terms of the GNU General Public License as published by
fa7313d125ac [gaim-migrate @ 16013]
Evan Schoenberg <evan.s@dreskin.net>
parents:
diff changeset
10 * the Free Software Foundation; either version 2 of the License, or
fa7313d125ac [gaim-migrate @ 16013]
Evan Schoenberg <evan.s@dreskin.net>
parents:
diff changeset
11 * (at your option) any later version.
fa7313d125ac [gaim-migrate @ 16013]
Evan Schoenberg <evan.s@dreskin.net>
parents:
diff changeset
12 *
fa7313d125ac [gaim-migrate @ 16013]
Evan Schoenberg <evan.s@dreskin.net>
parents:
diff changeset
13 * This program is distributed in the hope that it will be useful,
fa7313d125ac [gaim-migrate @ 16013]
Evan Schoenberg <evan.s@dreskin.net>
parents:
diff changeset
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
fa7313d125ac [gaim-migrate @ 16013]
Evan Schoenberg <evan.s@dreskin.net>
parents:
diff changeset
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
fa7313d125ac [gaim-migrate @ 16013]
Evan Schoenberg <evan.s@dreskin.net>
parents:
diff changeset
16 * GNU General Public License for more details.
fa7313d125ac [gaim-migrate @ 16013]
Evan Schoenberg <evan.s@dreskin.net>
parents:
diff changeset
17 *
fa7313d125ac [gaim-migrate @ 16013]
Evan Schoenberg <evan.s@dreskin.net>
parents:
diff changeset
18 * You should have received a copy of the GNU General Public License
fa7313d125ac [gaim-migrate @ 16013]
Evan Schoenberg <evan.s@dreskin.net>
parents:
diff changeset
19 * along with this program; if not, write to the Free Software
fa7313d125ac [gaim-migrate @ 16013]
Evan Schoenberg <evan.s@dreskin.net>
parents:
diff changeset
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
fa7313d125ac [gaim-migrate @ 16013]
Evan Schoenberg <evan.s@dreskin.net>
parents:
diff changeset
21 */
fa7313d125ac [gaim-migrate @ 16013]
Evan Schoenberg <evan.s@dreskin.net>
parents:
diff changeset
22
fa7313d125ac [gaim-migrate @ 16013]
Evan Schoenberg <evan.s@dreskin.net>
parents:
diff changeset
23
fa7313d125ac [gaim-migrate @ 16013]
Evan Schoenberg <evan.s@dreskin.net>
parents:
diff changeset
24 #include "gg-utils.h"
fa7313d125ac [gaim-migrate @ 16013]
Evan Schoenberg <evan.s@dreskin.net>
parents:
diff changeset
25
fa7313d125ac [gaim-migrate @ 16013]
Evan Schoenberg <evan.s@dreskin.net>
parents:
diff changeset
26
fa7313d125ac [gaim-migrate @ 16013]
Evan Schoenberg <evan.s@dreskin.net>
parents:
diff changeset
27 /* uin_t ggp_str_to_uin(const char *str) {{{ */
fa7313d125ac [gaim-migrate @ 16013]
Evan Schoenberg <evan.s@dreskin.net>
parents:
diff changeset
28 uin_t ggp_str_to_uin(const char *str)
fa7313d125ac [gaim-migrate @ 16013]
Evan Schoenberg <evan.s@dreskin.net>
parents:
diff changeset
29 {
fa7313d125ac [gaim-migrate @ 16013]
Evan Schoenberg <evan.s@dreskin.net>
parents:
diff changeset
30 char *tmp;
fa7313d125ac [gaim-migrate @ 16013]
Evan Schoenberg <evan.s@dreskin.net>
parents:
diff changeset
31 long num;
fa7313d125ac [gaim-migrate @ 16013]
Evan Schoenberg <evan.s@dreskin.net>
parents:
diff changeset
32
fa7313d125ac [gaim-migrate @ 16013]
Evan Schoenberg <evan.s@dreskin.net>
parents:
diff changeset
33 if (!str)
fa7313d125ac [gaim-migrate @ 16013]
Evan Schoenberg <evan.s@dreskin.net>
parents:
diff changeset
34 return 0;
fa7313d125ac [gaim-migrate @ 16013]
Evan Schoenberg <evan.s@dreskin.net>
parents:
diff changeset
35
fa7313d125ac [gaim-migrate @ 16013]
Evan Schoenberg <evan.s@dreskin.net>
parents:
diff changeset
36 errno = 0;
fa7313d125ac [gaim-migrate @ 16013]
Evan Schoenberg <evan.s@dreskin.net>
parents:
diff changeset
37 num = strtol(str, &tmp, 10);
fa7313d125ac [gaim-migrate @ 16013]
Evan Schoenberg <evan.s@dreskin.net>
parents:
diff changeset
38
fa7313d125ac [gaim-migrate @ 16013]
Evan Schoenberg <evan.s@dreskin.net>
parents:
diff changeset
39 if (*str == '\0' || *tmp != '\0')
fa7313d125ac [gaim-migrate @ 16013]
Evan Schoenberg <evan.s@dreskin.net>
parents:
diff changeset
40 return 0;
fa7313d125ac [gaim-migrate @ 16013]
Evan Schoenberg <evan.s@dreskin.net>
parents:
diff changeset
41
fa7313d125ac [gaim-migrate @ 16013]
Evan Schoenberg <evan.s@dreskin.net>
parents:
diff changeset
42 if ((errno == ERANGE || (num == LONG_MAX || num == LONG_MIN))
fa7313d125ac [gaim-migrate @ 16013]
Evan Schoenberg <evan.s@dreskin.net>
parents:
diff changeset
43 #if (LONG_MAX > UINT_MAX)
fa7313d125ac [gaim-migrate @ 16013]
Evan Schoenberg <evan.s@dreskin.net>
parents:
diff changeset
44 || num > (long)UINT_MAX
fa7313d125ac [gaim-migrate @ 16013]
Evan Schoenberg <evan.s@dreskin.net>
parents:
diff changeset
45 #endif
fa7313d125ac [gaim-migrate @ 16013]
Evan Schoenberg <evan.s@dreskin.net>
parents:
diff changeset
46 || num < 0)
fa7313d125ac [gaim-migrate @ 16013]
Evan Schoenberg <evan.s@dreskin.net>
parents:
diff changeset
47 return 0;
fa7313d125ac [gaim-migrate @ 16013]
Evan Schoenberg <evan.s@dreskin.net>
parents:
diff changeset
48
fa7313d125ac [gaim-migrate @ 16013]
Evan Schoenberg <evan.s@dreskin.net>
parents:
diff changeset
49 return (uin_t) num;
fa7313d125ac [gaim-migrate @ 16013]
Evan Schoenberg <evan.s@dreskin.net>
parents:
diff changeset
50 }
fa7313d125ac [gaim-migrate @ 16013]
Evan Schoenberg <evan.s@dreskin.net>
parents:
diff changeset
51 /* }}} */
fa7313d125ac [gaim-migrate @ 16013]
Evan Schoenberg <evan.s@dreskin.net>
parents:
diff changeset
52
fa7313d125ac [gaim-migrate @ 16013]
Evan Schoenberg <evan.s@dreskin.net>
parents:
diff changeset
53 /* char *charset_convert(const gchar *locstr, const char *encsrc, const char *encdst) {{{ */
fa7313d125ac [gaim-migrate @ 16013]
Evan Schoenberg <evan.s@dreskin.net>
parents:
diff changeset
54 char *charset_convert(const gchar *locstr, const char *encsrc, const char *encdst)
fa7313d125ac [gaim-migrate @ 16013]
Evan Schoenberg <evan.s@dreskin.net>
parents:
diff changeset
55 {
fa7313d125ac [gaim-migrate @ 16013]
Evan Schoenberg <evan.s@dreskin.net>
parents:
diff changeset
56 gchar *msg;
fa7313d125ac [gaim-migrate @ 16013]
Evan Schoenberg <evan.s@dreskin.net>
parents:
diff changeset
57 GError *err = NULL;
fa7313d125ac [gaim-migrate @ 16013]
Evan Schoenberg <evan.s@dreskin.net>
parents:
diff changeset
58
fa7313d125ac [gaim-migrate @ 16013]
Evan Schoenberg <evan.s@dreskin.net>
parents:
diff changeset
59 if (locstr == NULL)
fa7313d125ac [gaim-migrate @ 16013]
Evan Schoenberg <evan.s@dreskin.net>
parents:
diff changeset
60 return NULL;
fa7313d125ac [gaim-migrate @ 16013]
Evan Schoenberg <evan.s@dreskin.net>
parents:
diff changeset
61
fa7313d125ac [gaim-migrate @ 16013]
Evan Schoenberg <evan.s@dreskin.net>
parents:
diff changeset
62 msg = g_convert_with_fallback(locstr, strlen(locstr), encdst, encsrc,
fa7313d125ac [gaim-migrate @ 16013]
Evan Schoenberg <evan.s@dreskin.net>
parents:
diff changeset
63 "?", NULL, NULL, &err);
fa7313d125ac [gaim-migrate @ 16013]
Evan Schoenberg <evan.s@dreskin.net>
parents:
diff changeset
64 if (err != NULL) {
fa7313d125ac [gaim-migrate @ 16013]
Evan Schoenberg <evan.s@dreskin.net>
parents:
diff changeset
65 gaim_debug_error("gg", "Error converting from %s to %s: %s\n",
fa7313d125ac [gaim-migrate @ 16013]
Evan Schoenberg <evan.s@dreskin.net>
parents:
diff changeset
66 encsrc, encdst, err->message);
fa7313d125ac [gaim-migrate @ 16013]
Evan Schoenberg <evan.s@dreskin.net>
parents:
diff changeset
67 g_error_free(err);
fa7313d125ac [gaim-migrate @ 16013]
Evan Schoenberg <evan.s@dreskin.net>
parents:
diff changeset
68 }
fa7313d125ac [gaim-migrate @ 16013]
Evan Schoenberg <evan.s@dreskin.net>
parents:
diff changeset
69
fa7313d125ac [gaim-migrate @ 16013]
Evan Schoenberg <evan.s@dreskin.net>
parents:
diff changeset
70 /* Just in case? */
fa7313d125ac [gaim-migrate @ 16013]
Evan Schoenberg <evan.s@dreskin.net>
parents:
diff changeset
71 if (msg == NULL)
fa7313d125ac [gaim-migrate @ 16013]
Evan Schoenberg <evan.s@dreskin.net>
parents:
diff changeset
72 msg = g_strdup(locstr);
fa7313d125ac [gaim-migrate @ 16013]
Evan Schoenberg <evan.s@dreskin.net>
parents:
diff changeset
73
fa7313d125ac [gaim-migrate @ 16013]
Evan Schoenberg <evan.s@dreskin.net>
parents:
diff changeset
74 return msg;
fa7313d125ac [gaim-migrate @ 16013]
Evan Schoenberg <evan.s@dreskin.net>
parents:
diff changeset
75 }
fa7313d125ac [gaim-migrate @ 16013]
Evan Schoenberg <evan.s@dreskin.net>
parents:
diff changeset
76 /* }}} */
fa7313d125ac [gaim-migrate @ 16013]
Evan Schoenberg <evan.s@dreskin.net>
parents:
diff changeset
77
fa7313d125ac [gaim-migrate @ 16013]
Evan Schoenberg <evan.s@dreskin.net>
parents:
diff changeset
78 /* ggp_get_uin(GaimAccount *account) {{{ */
fa7313d125ac [gaim-migrate @ 16013]
Evan Schoenberg <evan.s@dreskin.net>
parents:
diff changeset
79 uin_t ggp_get_uin(GaimAccount *account)
fa7313d125ac [gaim-migrate @ 16013]
Evan Schoenberg <evan.s@dreskin.net>
parents:
diff changeset
80 {
fa7313d125ac [gaim-migrate @ 16013]
Evan Schoenberg <evan.s@dreskin.net>
parents:
diff changeset
81 return ggp_str_to_uin(gaim_account_get_username(account));
fa7313d125ac [gaim-migrate @ 16013]
Evan Schoenberg <evan.s@dreskin.net>
parents:
diff changeset
82 }
fa7313d125ac [gaim-migrate @ 16013]
Evan Schoenberg <evan.s@dreskin.net>
parents:
diff changeset
83 /* }}} */
fa7313d125ac [gaim-migrate @ 16013]
Evan Schoenberg <evan.s@dreskin.net>
parents:
diff changeset
84
fa7313d125ac [gaim-migrate @ 16013]
Evan Schoenberg <evan.s@dreskin.net>
parents:
diff changeset
85 /* char *ggp_buddy_get_name(GaimConnection *gc, const uin_t uin) {{{ */
fa7313d125ac [gaim-migrate @ 16013]
Evan Schoenberg <evan.s@dreskin.net>
parents:
diff changeset
86 char *ggp_buddy_get_name(GaimConnection *gc, const uin_t uin)
fa7313d125ac [gaim-migrate @ 16013]
Evan Schoenberg <evan.s@dreskin.net>
parents:
diff changeset
87 {
fa7313d125ac [gaim-migrate @ 16013]
Evan Schoenberg <evan.s@dreskin.net>
parents:
diff changeset
88 GaimBuddy *buddy;
fa7313d125ac [gaim-migrate @ 16013]
Evan Schoenberg <evan.s@dreskin.net>
parents:
diff changeset
89 gchar *str_uin;
fa7313d125ac [gaim-migrate @ 16013]
Evan Schoenberg <evan.s@dreskin.net>
parents:
diff changeset
90
fa7313d125ac [gaim-migrate @ 16013]
Evan Schoenberg <evan.s@dreskin.net>
parents:
diff changeset
91 str_uin = g_strdup_printf("%lu", (unsigned long int)uin);
fa7313d125ac [gaim-migrate @ 16013]
Evan Schoenberg <evan.s@dreskin.net>
parents:
diff changeset
92
fa7313d125ac [gaim-migrate @ 16013]
Evan Schoenberg <evan.s@dreskin.net>
parents:
diff changeset
93 buddy = gaim_find_buddy(gaim_connection_get_account(gc), str_uin);
fa7313d125ac [gaim-migrate @ 16013]
Evan Schoenberg <evan.s@dreskin.net>
parents:
diff changeset
94 if (buddy != NULL) {
fa7313d125ac [gaim-migrate @ 16013]
Evan Schoenberg <evan.s@dreskin.net>
parents:
diff changeset
95 g_free(str_uin);
fa7313d125ac [gaim-migrate @ 16013]
Evan Schoenberg <evan.s@dreskin.net>
parents:
diff changeset
96 return g_strdup(gaim_buddy_get_alias(buddy));
fa7313d125ac [gaim-migrate @ 16013]
Evan Schoenberg <evan.s@dreskin.net>
parents:
diff changeset
97 } else {
fa7313d125ac [gaim-migrate @ 16013]
Evan Schoenberg <evan.s@dreskin.net>
parents:
diff changeset
98 return str_uin;
fa7313d125ac [gaim-migrate @ 16013]
Evan Schoenberg <evan.s@dreskin.net>
parents:
diff changeset
99 }
fa7313d125ac [gaim-migrate @ 16013]
Evan Schoenberg <evan.s@dreskin.net>
parents:
diff changeset
100 }
fa7313d125ac [gaim-migrate @ 16013]
Evan Schoenberg <evan.s@dreskin.net>
parents:
diff changeset
101 /* }}} */
fa7313d125ac [gaim-migrate @ 16013]
Evan Schoenberg <evan.s@dreskin.net>
parents:
diff changeset
102
fa7313d125ac [gaim-migrate @ 16013]
Evan Schoenberg <evan.s@dreskin.net>
parents:
diff changeset
103
fa7313d125ac [gaim-migrate @ 16013]
Evan Schoenberg <evan.s@dreskin.net>
parents:
diff changeset
104 /* vim: set ts=8 sts=0 sw=8 noet: */