annotate src/protocols/qq/utils.c @ 14122:dabbcb9b013d

[gaim-migrate @ 16759] This initializes threads for glib and dbus, because under some circumstances multithreaded libraries are causing dbus badness (namely, gnome-vfs). This fix doesn't really belong in Gaim, but in the interest of expedience (we don't want to wait for upstream libraries to get their initializations all worked around to make things safe) the fix goes here. Note that all Gaim frontends will have to initialize glib threads if other threaded libraries which interact with glib or dbus or what-have-you come into play. committer: Tailor Script <tailor@pidgin.im>
author Ethan Blanton <elb@pidgin.im>
date Mon, 14 Aug 2006 21:46:17 +0000
parents 44e1bf83dadf
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
13870
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
1 /**
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
2 * The QQ2003C protocol plugin
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
3 *
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
4 * for gaim
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
5 *
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
6 * Copyright (C) 2004 Puzzlebird
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
7 *
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
8 * This program is free software; you can redistribute it and/or modify
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
9 * it under the terms of the GNU General Public License as published by
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
10 * the Free Software Foundation; either version 2 of the License, or
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
11 * (at your option) any later version.
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
12 *
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
13 * This program is distributed in the hope that it will be useful,
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
16 * GNU General Public License for more details.
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
17 *
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
18 * You should have received a copy of the GNU General Public License
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
19 * along with this program; if not, write to the Free Software
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
21 */
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
22
14021
ef8490f9e823 [gaim-migrate @ 16618]
Mark Huetsch <markhuetsch>
parents: 14017
diff changeset
23 #include "stdlib.h"
13870
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
24 #include "limits.h"
14021
ef8490f9e823 [gaim-migrate @ 16618]
Mark Huetsch <markhuetsch>
parents: 14017
diff changeset
25 #include "string.h"
13870
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
26
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
27 #ifdef _WIN32
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
28 #include "win32dep.h"
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
29 #endif
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
30
14021
ef8490f9e823 [gaim-migrate @ 16618]
Mark Huetsch <markhuetsch>
parents: 14017
diff changeset
31 #include "char_conv.h"
ef8490f9e823 [gaim-migrate @ 16618]
Mark Huetsch <markhuetsch>
parents: 14017
diff changeset
32 #include "debug.h"
ef8490f9e823 [gaim-migrate @ 16618]
Mark Huetsch <markhuetsch>
parents: 14017
diff changeset
33 #include "prefs.h"
14055
44e1bf83dadf [gaim-migrate @ 16668]
Richard Laager <rlaager@wiktel.com>
parents: 14054
diff changeset
34 #include "util.h"
13870
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
35 #include "utils.h"
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
36
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
37 #define QQ_NAME_FORMAT "qq-%d"
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
38
14021
ef8490f9e823 [gaim-migrate @ 16618]
Mark Huetsch <markhuetsch>
parents: 14017
diff changeset
39 gchar *get_name_by_index_str(gchar **array, const gchar *index_str, gint amount)
ef8490f9e823 [gaim-migrate @ 16618]
Mark Huetsch <markhuetsch>
parents: 14017
diff changeset
40 {
13870
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
41 gint index;
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
42
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
43 index = atoi(index_str);
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
44 if (index < 0 || index >= amount)
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
45 index = 0;
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
46
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
47 return array[index];
14021
ef8490f9e823 [gaim-migrate @ 16618]
Mark Huetsch <markhuetsch>
parents: 14017
diff changeset
48 }
13870
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
49
14021
ef8490f9e823 [gaim-migrate @ 16618]
Mark Huetsch <markhuetsch>
parents: 14017
diff changeset
50 gchar *get_index_str_by_name(gchar **array, const gchar *name, gint amount)
ef8490f9e823 [gaim-migrate @ 16618]
Mark Huetsch <markhuetsch>
parents: 14017
diff changeset
51 {
13870
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
52 gint index;
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
53
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
54 for (index = 0; index <= amount; index++)
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
55 if (g_ascii_strcasecmp(array[index], name) == 0)
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
56 break;
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
57
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
58 if (index >= amount)
14021
ef8490f9e823 [gaim-migrate @ 16618]
Mark Huetsch <markhuetsch>
parents: 14017
diff changeset
59 index = 0; /* meaning no match */
13870
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
60 return g_strdup_printf("%d", index);
14021
ef8490f9e823 [gaim-migrate @ 16618]
Mark Huetsch <markhuetsch>
parents: 14017
diff changeset
61 }
13870
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
62
14015
9516a796ed5f [gaim-migrate @ 16607]
Mark Huetsch <markhuetsch>
parents: 13989
diff changeset
63 gint qq_string_to_dec_value(const gchar *str)
13870
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
64 {
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
65 g_return_val_if_fail(str != NULL, 0);
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
66 return strtol(str, NULL, 10);
14021
ef8490f9e823 [gaim-migrate @ 16618]
Mark Huetsch <markhuetsch>
parents: 14017
diff changeset
67 }
13870
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
68
14021
ef8490f9e823 [gaim-migrate @ 16618]
Mark Huetsch <markhuetsch>
parents: 14017
diff changeset
69 /* split the given data(len) with delimit,
ef8490f9e823 [gaim-migrate @ 16618]
Mark Huetsch <markhuetsch>
parents: 14017
diff changeset
70 * check the number of field matches the expected_fields (<=0 means all)
ef8490f9e823 [gaim-migrate @ 16618]
Mark Huetsch <markhuetsch>
parents: 14017
diff changeset
71 * return gchar* array (needs to be freed by g_strfreev later), or NULL */
ef8490f9e823 [gaim-migrate @ 16618]
Mark Huetsch <markhuetsch>
parents: 14017
diff changeset
72 gchar **split_data(guint8 *data, gint len, const gchar *delimit, gint expected_fields)
ef8490f9e823 [gaim-migrate @ 16618]
Mark Huetsch <markhuetsch>
parents: 14017
diff changeset
73 {
13870
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
74 guint8 *input;
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
75 gchar **segments;
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
76 gint i, j;
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
77
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
78 g_return_val_if_fail(data != NULL && len != 0 && delimit != 0, NULL);
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
79
14021
ef8490f9e823 [gaim-migrate @ 16618]
Mark Huetsch <markhuetsch>
parents: 14017
diff changeset
80 /* as the last field would be string, but data is not ended with 0x00
ef8490f9e823 [gaim-migrate @ 16618]
Mark Huetsch <markhuetsch>
parents: 14017
diff changeset
81 * we have to duplicate the data and append a 0x00 at the end */
13870
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
82 input = g_newa(guint8, len + 1);
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
83 g_memmove(input, data, len);
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
84 input[len] = 0x00;
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
85
14017
39d6d4128599 [gaim-migrate @ 16610]
Mark Huetsch <markhuetsch>
parents: 14015
diff changeset
86 segments = g_strsplit((gchar *) input, delimit, 0);
13870
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
87 if (expected_fields <= 0)
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
88 return segments;
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
89
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
90 for (i = 0; segments[i] != NULL; i++) {;
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
91 }
14021
ef8490f9e823 [gaim-migrate @ 16618]
Mark Huetsch <markhuetsch>
parents: 14017
diff changeset
92 if (i < expected_fields) { /* not enough fields */
13870
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
93 gaim_debug(GAIM_DEBUG_ERROR, "QQ",
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
94 "Invalid data, expect %d fields, found only %d, discard\n", expected_fields, i);
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
95 g_strfreev(segments);
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
96 return NULL;
14021
ef8490f9e823 [gaim-migrate @ 16618]
Mark Huetsch <markhuetsch>
parents: 14017
diff changeset
97 } else if (i > expected_fields) { /* more fields, OK */
13870
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
98 gaim_debug(GAIM_DEBUG_WARNING, "QQ",
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
99 "Dangerous data, expect %d fields, found %d, return all\n", expected_fields, i);
14021
ef8490f9e823 [gaim-migrate @ 16618]
Mark Huetsch <markhuetsch>
parents: 14017
diff changeset
100 /* free up those not used */
13870
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
101 for (j = expected_fields; j < i; j++) {
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
102 gaim_debug(GAIM_DEBUG_WARNING, "QQ", "field[%d] is %s\n", j, segments[j]);
14015
9516a796ed5f [gaim-migrate @ 16607]
Mark Huetsch <markhuetsch>
parents: 13989
diff changeset
103 g_free(segments[j]);
13870
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
104 }
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
105
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
106 segments[expected_fields] = NULL;
14015
9516a796ed5f [gaim-migrate @ 16607]
Mark Huetsch <markhuetsch>
parents: 13989
diff changeset
107 }
13870
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
108
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
109 return segments;
14015
9516a796ed5f [gaim-migrate @ 16607]
Mark Huetsch <markhuetsch>
parents: 13989
diff changeset
110 }
13870
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
111
14021
ef8490f9e823 [gaim-migrate @ 16618]
Mark Huetsch <markhuetsch>
parents: 14017
diff changeset
112 /* given a four-byte ip data, convert it into a human readable ip string
ef8490f9e823 [gaim-migrate @ 16618]
Mark Huetsch <markhuetsch>
parents: 14017
diff changeset
113 * the return needs to be freed */
14015
9516a796ed5f [gaim-migrate @ 16607]
Mark Huetsch <markhuetsch>
parents: 13989
diff changeset
114 gchar *gen_ip_str(guint8 *ip)
13870
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
115 {
14017
39d6d4128599 [gaim-migrate @ 16610]
Mark Huetsch <markhuetsch>
parents: 14015
diff changeset
116 gchar *ret;
39d6d4128599 [gaim-migrate @ 16610]
Mark Huetsch <markhuetsch>
parents: 14015
diff changeset
117 if (ip == NULL || ip[0] == 0) {
39d6d4128599 [gaim-migrate @ 16610]
Mark Huetsch <markhuetsch>
parents: 14015
diff changeset
118 ret = g_new(gchar, 1);
39d6d4128599 [gaim-migrate @ 16610]
Mark Huetsch <markhuetsch>
parents: 14015
diff changeset
119 *ret = '\0';
39d6d4128599 [gaim-migrate @ 16610]
Mark Huetsch <markhuetsch>
parents: 14015
diff changeset
120 return ret;
14021
ef8490f9e823 [gaim-migrate @ 16618]
Mark Huetsch <markhuetsch>
parents: 14017
diff changeset
121 } else {
13989
16102b9c5c4a [gaim-migrate @ 16562]
Mark Huetsch <markhuetsch>
parents: 13870
diff changeset
122 return g_strdup_printf("%d.%d.%d.%d", ip[0], ip[1], ip[2], ip[3]);
14021
ef8490f9e823 [gaim-migrate @ 16618]
Mark Huetsch <markhuetsch>
parents: 14017
diff changeset
123 }
13989
16102b9c5c4a [gaim-migrate @ 16562]
Mark Huetsch <markhuetsch>
parents: 13870
diff changeset
124 }
13870
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
125
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
126 guint8 *str_ip_gen(gchar *str) {
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
127 guint8 *ip = g_new(guint8, 4);
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
128 int a, b, c, d;
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
129 sscanf(str, "%d.%d.%d.%d", &a, &b, &c, &d);
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
130 ip[0] = a;
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
131 ip[1] = b;
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
132 ip[2] = c;
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
133 ip[3] = d;
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
134 return ip;
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
135 }
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
136
14021
ef8490f9e823 [gaim-migrate @ 16618]
Mark Huetsch <markhuetsch>
parents: 14017
diff changeset
137 /* return the QQ icon file name
ef8490f9e823 [gaim-migrate @ 16618]
Mark Huetsch <markhuetsch>
parents: 14017
diff changeset
138 * the return needs to be freed */
13870
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
139 gchar *get_icon_name(gint set, gint suffix)
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
140 {
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
141 return g_strdup_printf("qq_%d-%d", set, suffix);
14021
ef8490f9e823 [gaim-migrate @ 16618]
Mark Huetsch <markhuetsch>
parents: 14017
diff changeset
142 }
13870
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
143
14021
ef8490f9e823 [gaim-migrate @ 16618]
Mark Huetsch <markhuetsch>
parents: 14017
diff changeset
144 /* convert a QQ UID to a unique name of GAIM
ef8490f9e823 [gaim-migrate @ 16618]
Mark Huetsch <markhuetsch>
parents: 14017
diff changeset
145 * the return needs to be freed */
13870
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
146 gchar *uid_to_gaim_name(guint32 uid)
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
147 {
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
148 return g_strdup_printf(QQ_NAME_FORMAT, uid);
14021
ef8490f9e823 [gaim-migrate @ 16618]
Mark Huetsch <markhuetsch>
parents: 14017
diff changeset
149 }
13870
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
150
14021
ef8490f9e823 [gaim-migrate @ 16618]
Mark Huetsch <markhuetsch>
parents: 14017
diff changeset
151 /* convert GAIM name to original QQ UID */
14015
9516a796ed5f [gaim-migrate @ 16607]
Mark Huetsch <markhuetsch>
parents: 13989
diff changeset
152 guint32 gaim_name_to_uid(const gchar *name)
13870
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
153 {
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
154 gchar *p;
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
155
14055
44e1bf83dadf [gaim-migrate @ 16668]
Richard Laager <rlaager@wiktel.com>
parents: 14054
diff changeset
156 g_return_val_if_fail(gaim_str_has_prefix(name, QQ_NAME_PREFIX), 0);
13870
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
157
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
158 p = g_strrstr(name, QQ_NAME_PREFIX);
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
159 return (p == NULL) ? 0 : strtol(p + strlen(QQ_NAME_PREFIX), NULL, 10);
13989
16102b9c5c4a [gaim-migrate @ 16562]
Mark Huetsch <markhuetsch>
parents: 13870
diff changeset
160 }
13870
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
161
14021
ef8490f9e823 [gaim-migrate @ 16618]
Mark Huetsch <markhuetsch>
parents: 14017
diff changeset
162 /* try to dump the data as GBK */
14015
9516a796ed5f [gaim-migrate @ 16607]
Mark Huetsch <markhuetsch>
parents: 13989
diff changeset
163 void try_dump_as_gbk(guint8 *data, gint len)
13870
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
164 {
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
165 gint i;
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
166 guint8 *incoming;
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
167 gchar *msg_utf8;
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
168
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
169 incoming = g_newa(guint8, len + 1);
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
170 g_memmove(incoming, data, len);
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
171 incoming[len] = 0x00;
14021
ef8490f9e823 [gaim-migrate @ 16618]
Mark Huetsch <markhuetsch>
parents: 14017
diff changeset
172 /* GBK code:
ef8490f9e823 [gaim-migrate @ 16618]
Mark Huetsch <markhuetsch>
parents: 14017
diff changeset
173 * Single-byte ASCII: 0x21-0x7E
ef8490f9e823 [gaim-migrate @ 16618]
Mark Huetsch <markhuetsch>
parents: 14017
diff changeset
174 * GBK first byte range: 0x81-0xFE
ef8490f9e823 [gaim-migrate @ 16618]
Mark Huetsch <markhuetsch>
parents: 14017
diff changeset
175 * GBK second byte range: 0x40-0x7E and 0x80-0xFE */
13870
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
176 for (i = 0; i < len; i++)
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
177 if (incoming[i] >= 0x81)
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
178 break;
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
179
14017
39d6d4128599 [gaim-migrate @ 16610]
Mark Huetsch <markhuetsch>
parents: 14015
diff changeset
180 msg_utf8 = i < len ? qq_to_utf8((gchar *) &incoming[i], QQ_CHARSET_DEFAULT) : NULL;
13870
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
181
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
182 if (msg_utf8 != NULL) {
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
183 gaim_debug(GAIM_DEBUG_WARNING, "QQ", "Try extract GB msg: %s\n", msg_utf8);
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
184 g_free(msg_utf8);
14021
ef8490f9e823 [gaim-migrate @ 16618]
Mark Huetsch <markhuetsch>
parents: 14017
diff changeset
185 }
ef8490f9e823 [gaim-migrate @ 16618]
Mark Huetsch <markhuetsch>
parents: 14017
diff changeset
186 }
13870
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
187
14021
ef8490f9e823 [gaim-migrate @ 16618]
Mark Huetsch <markhuetsch>
parents: 14017
diff changeset
188 /* strips whitespace */
14015
9516a796ed5f [gaim-migrate @ 16607]
Mark Huetsch <markhuetsch>
parents: 13989
diff changeset
189 static gchar *strstrip(const gchar *buffer)
9516a796ed5f [gaim-migrate @ 16607]
Mark Huetsch <markhuetsch>
parents: 13989
diff changeset
190 {
9516a796ed5f [gaim-migrate @ 16607]
Mark Huetsch <markhuetsch>
parents: 13989
diff changeset
191 GString *stripped;
9516a796ed5f [gaim-migrate @ 16607]
Mark Huetsch <markhuetsch>
parents: 13989
diff changeset
192 gchar *ret;
9516a796ed5f [gaim-migrate @ 16607]
Mark Huetsch <markhuetsch>
parents: 13989
diff changeset
193 int i;
13989
16102b9c5c4a [gaim-migrate @ 16562]
Mark Huetsch <markhuetsch>
parents: 13870
diff changeset
194
14049
8294485b79db [gaim-migrate @ 16662]
Mark Huetsch <markhuetsch>
parents: 14021
diff changeset
195 g_return_val_if_fail(buffer != NULL, NULL);
8294485b79db [gaim-migrate @ 16662]
Mark Huetsch <markhuetsch>
parents: 14021
diff changeset
196
14015
9516a796ed5f [gaim-migrate @ 16607]
Mark Huetsch <markhuetsch>
parents: 13989
diff changeset
197 stripped = g_string_new("");
9516a796ed5f [gaim-migrate @ 16607]
Mark Huetsch <markhuetsch>
parents: 13989
diff changeset
198 for (i=0; i<strlen(buffer); i++) {
9516a796ed5f [gaim-migrate @ 16607]
Mark Huetsch <markhuetsch>
parents: 13989
diff changeset
199 if ((int) buffer[i] != 32) {
9516a796ed5f [gaim-migrate @ 16607]
Mark Huetsch <markhuetsch>
parents: 13989
diff changeset
200 g_string_append_c(stripped, buffer[i]);
9516a796ed5f [gaim-migrate @ 16607]
Mark Huetsch <markhuetsch>
parents: 13989
diff changeset
201 }
9516a796ed5f [gaim-migrate @ 16607]
Mark Huetsch <markhuetsch>
parents: 13989
diff changeset
202 }
9516a796ed5f [gaim-migrate @ 16607]
Mark Huetsch <markhuetsch>
parents: 13989
diff changeset
203 ret = stripped->str;
9516a796ed5f [gaim-migrate @ 16607]
Mark Huetsch <markhuetsch>
parents: 13989
diff changeset
204 g_string_free(stripped, FALSE);
9516a796ed5f [gaim-migrate @ 16607]
Mark Huetsch <markhuetsch>
parents: 13989
diff changeset
205
9516a796ed5f [gaim-migrate @ 16607]
Mark Huetsch <markhuetsch>
parents: 13989
diff changeset
206 return ret;
9516a796ed5f [gaim-migrate @ 16607]
Mark Huetsch <markhuetsch>
parents: 13989
diff changeset
207 }
9516a796ed5f [gaim-migrate @ 16607]
Mark Huetsch <markhuetsch>
parents: 13989
diff changeset
208
14021
ef8490f9e823 [gaim-migrate @ 16618]
Mark Huetsch <markhuetsch>
parents: 14017
diff changeset
209 /* Dumps an ASCII hex string to a string of bytes. The return should be freed later.
ef8490f9e823 [gaim-migrate @ 16618]
Mark Huetsch <markhuetsch>
parents: 14017
diff changeset
210 * Returns NULL if a string with an odd number of nibbles is passed in or if buffer
ef8490f9e823 [gaim-migrate @ 16618]
Mark Huetsch <markhuetsch>
parents: 14017
diff changeset
211 * isn't a valid hex string */
14049
8294485b79db [gaim-migrate @ 16662]
Mark Huetsch <markhuetsch>
parents: 14021
diff changeset
212 guint8 *hex_str_to_bytes(const gchar *buffer, gint *out_len)
14015
9516a796ed5f [gaim-migrate @ 16607]
Mark Huetsch <markhuetsch>
parents: 13989
diff changeset
213 {
9516a796ed5f [gaim-migrate @ 16607]
Mark Huetsch <markhuetsch>
parents: 13989
diff changeset
214 gchar *hex_str, *hex_buffer, *cursor, tmp;
9516a796ed5f [gaim-migrate @ 16607]
Mark Huetsch <markhuetsch>
parents: 13989
diff changeset
215 guint8 *bytes, nibble1, nibble2;
14049
8294485b79db [gaim-migrate @ 16662]
Mark Huetsch <markhuetsch>
parents: 14021
diff changeset
216 gint index;
14015
9516a796ed5f [gaim-migrate @ 16607]
Mark Huetsch <markhuetsch>
parents: 13989
diff changeset
217
14049
8294485b79db [gaim-migrate @ 16662]
Mark Huetsch <markhuetsch>
parents: 14021
diff changeset
218 g_return_val_if_fail(buffer != NULL, NULL);
8294485b79db [gaim-migrate @ 16662]
Mark Huetsch <markhuetsch>
parents: 14021
diff changeset
219
14015
9516a796ed5f [gaim-migrate @ 16607]
Mark Huetsch <markhuetsch>
parents: 13989
diff changeset
220 hex_buffer = strstrip(buffer);
9516a796ed5f [gaim-migrate @ 16607]
Mark Huetsch <markhuetsch>
parents: 13989
diff changeset
221
9516a796ed5f [gaim-migrate @ 16607]
Mark Huetsch <markhuetsch>
parents: 13989
diff changeset
222 if (strlen(hex_buffer) % 2 != 0) {
9516a796ed5f [gaim-migrate @ 16607]
Mark Huetsch <markhuetsch>
parents: 13989
diff changeset
223 gaim_debug(GAIM_DEBUG_WARNING, "QQ",
9516a796ed5f [gaim-migrate @ 16607]
Mark Huetsch <markhuetsch>
parents: 13989
diff changeset
224 "Unable to convert an odd number of nibbles to a string of bytes!\n");
9516a796ed5f [gaim-migrate @ 16607]
Mark Huetsch <markhuetsch>
parents: 13989
diff changeset
225 g_free(hex_buffer);
9516a796ed5f [gaim-migrate @ 16607]
Mark Huetsch <markhuetsch>
parents: 13989
diff changeset
226 return NULL;
9516a796ed5f [gaim-migrate @ 16607]
Mark Huetsch <markhuetsch>
parents: 13989
diff changeset
227 }
9516a796ed5f [gaim-migrate @ 16607]
Mark Huetsch <markhuetsch>
parents: 13989
diff changeset
228 bytes = g_newa(guint8, strlen(hex_buffer) / 2);
9516a796ed5f [gaim-migrate @ 16607]
Mark Huetsch <markhuetsch>
parents: 13989
diff changeset
229 hex_str = g_ascii_strdown(hex_buffer, -1);
9516a796ed5f [gaim-migrate @ 16607]
Mark Huetsch <markhuetsch>
parents: 13989
diff changeset
230 g_free(hex_buffer);
9516a796ed5f [gaim-migrate @ 16607]
Mark Huetsch <markhuetsch>
parents: 13989
diff changeset
231 index = 0;
9516a796ed5f [gaim-migrate @ 16607]
Mark Huetsch <markhuetsch>
parents: 13989
diff changeset
232 for (cursor = hex_str; cursor < hex_str + sizeof(gchar) * (strlen(hex_str)) - 1; cursor++) {
14049
8294485b79db [gaim-migrate @ 16662]
Mark Huetsch <markhuetsch>
parents: 14021
diff changeset
233 if (g_ascii_isdigit(*cursor)) {
8294485b79db [gaim-migrate @ 16662]
Mark Huetsch <markhuetsch>
parents: 14021
diff changeset
234 tmp = *cursor; nibble1 = atoi(&tmp);
8294485b79db [gaim-migrate @ 16662]
Mark Huetsch <markhuetsch>
parents: 14021
diff changeset
235 } else if (g_ascii_isalpha(*cursor) && (gint) *cursor - 87 < 16) {
14015
9516a796ed5f [gaim-migrate @ 16607]
Mark Huetsch <markhuetsch>
parents: 13989
diff changeset
236 nibble1 = (gint) *cursor - 87;
14049
8294485b79db [gaim-migrate @ 16662]
Mark Huetsch <markhuetsch>
parents: 14021
diff changeset
237 } else {
14015
9516a796ed5f [gaim-migrate @ 16607]
Mark Huetsch <markhuetsch>
parents: 13989
diff changeset
238 gaim_debug(GAIM_DEBUG_WARNING, "QQ",
9516a796ed5f [gaim-migrate @ 16607]
Mark Huetsch <markhuetsch>
parents: 13989
diff changeset
239 "Invalid char found in hex string!\n");
9516a796ed5f [gaim-migrate @ 16607]
Mark Huetsch <markhuetsch>
parents: 13989
diff changeset
240 g_free(hex_str);
9516a796ed5f [gaim-migrate @ 16607]
Mark Huetsch <markhuetsch>
parents: 13989
diff changeset
241 return NULL;
9516a796ed5f [gaim-migrate @ 16607]
Mark Huetsch <markhuetsch>
parents: 13989
diff changeset
242 }
9516a796ed5f [gaim-migrate @ 16607]
Mark Huetsch <markhuetsch>
parents: 13989
diff changeset
243 nibble1 = nibble1 << 4;
9516a796ed5f [gaim-migrate @ 16607]
Mark Huetsch <markhuetsch>
parents: 13989
diff changeset
244 cursor++;
14049
8294485b79db [gaim-migrate @ 16662]
Mark Huetsch <markhuetsch>
parents: 14021
diff changeset
245 if (g_ascii_isdigit(*cursor)) {
8294485b79db [gaim-migrate @ 16662]
Mark Huetsch <markhuetsch>
parents: 14021
diff changeset
246 tmp = *cursor; nibble2 = atoi(&tmp);
8294485b79db [gaim-migrate @ 16662]
Mark Huetsch <markhuetsch>
parents: 14021
diff changeset
247 } else if (g_ascii_isalpha(*cursor) && (gint) (*cursor - 87) < 16) {
14015
9516a796ed5f [gaim-migrate @ 16607]
Mark Huetsch <markhuetsch>
parents: 13989
diff changeset
248 nibble2 = (gint) *cursor - 87;
14049
8294485b79db [gaim-migrate @ 16662]
Mark Huetsch <markhuetsch>
parents: 14021
diff changeset
249 } else {
8294485b79db [gaim-migrate @ 16662]
Mark Huetsch <markhuetsch>
parents: 14021
diff changeset
250 gaim_debug(GAIM_DEBUG_WARNING, "QQ",
8294485b79db [gaim-migrate @ 16662]
Mark Huetsch <markhuetsch>
parents: 14021
diff changeset
251 "Invalid char found in hex string!\n");
14015
9516a796ed5f [gaim-migrate @ 16607]
Mark Huetsch <markhuetsch>
parents: 13989
diff changeset
252 g_free(hex_str);
9516a796ed5f [gaim-migrate @ 16607]
Mark Huetsch <markhuetsch>
parents: 13989
diff changeset
253 return NULL;
9516a796ed5f [gaim-migrate @ 16607]
Mark Huetsch <markhuetsch>
parents: 13989
diff changeset
254 }
9516a796ed5f [gaim-migrate @ 16607]
Mark Huetsch <markhuetsch>
parents: 13989
diff changeset
255 bytes[index++] = nibble1 + nibble2;
9516a796ed5f [gaim-migrate @ 16607]
Mark Huetsch <markhuetsch>
parents: 13989
diff changeset
256 }
14049
8294485b79db [gaim-migrate @ 16662]
Mark Huetsch <markhuetsch>
parents: 14021
diff changeset
257 *out_len = strlen(hex_str) / 2;
14015
9516a796ed5f [gaim-migrate @ 16607]
Mark Huetsch <markhuetsch>
parents: 13989
diff changeset
258 g_free(hex_str);
14049
8294485b79db [gaim-migrate @ 16662]
Mark Huetsch <markhuetsch>
parents: 14021
diff changeset
259 return g_memdup(bytes, *out_len);
14015
9516a796ed5f [gaim-migrate @ 16607]
Mark Huetsch <markhuetsch>
parents: 13989
diff changeset
260 }
9516a796ed5f [gaim-migrate @ 16607]
Mark Huetsch <markhuetsch>
parents: 13989
diff changeset
261
14021
ef8490f9e823 [gaim-migrate @ 16618]
Mark Huetsch <markhuetsch>
parents: 14017
diff changeset
262 /* Dumps a chunk of raw data into an ASCII hex string. The return should be freed later. */
14015
9516a796ed5f [gaim-migrate @ 16607]
Mark Huetsch <markhuetsch>
parents: 13989
diff changeset
263 gchar *hex_dump_to_str(const guint8 *buffer, gint bytes)
13870
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
264 {
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
265 GString *str;
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
266 gchar *ret;
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
267 gint i, j, ch;
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
268
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
269 str = g_string_new("");
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
270 for (i = 0; i < bytes; i += 16) {
14021
ef8490f9e823 [gaim-migrate @ 16618]
Mark Huetsch <markhuetsch>
parents: 14017
diff changeset
271 /* length label */
13870
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
272 g_string_append_printf(str, "%04d: ", i);
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
273
14021
ef8490f9e823 [gaim-migrate @ 16618]
Mark Huetsch <markhuetsch>
parents: 14017
diff changeset
274 /* dump hex value */
13870
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
275 for (j = 0; j < 16; j++)
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
276 if ((i + j) < bytes)
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
277 g_string_append_printf(str, " %02X", buffer[i + j]);
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
278 else
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
279 g_string_append(str, " ");
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
280 g_string_append(str, " ");
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
281
14021
ef8490f9e823 [gaim-migrate @ 16618]
Mark Huetsch <markhuetsch>
parents: 14017
diff changeset
282 /* dump ascii value */
13870
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
283 for (j = 0; j < 16 && (i + j) < bytes; j++) {
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
284 ch = buffer[i + j] & 127;
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
285 if (ch < ' ' || ch == 127)
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
286 g_string_append_c(str, '.');
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
287 else
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
288 g_string_append_c(str, ch);
13989
16102b9c5c4a [gaim-migrate @ 16562]
Mark Huetsch <markhuetsch>
parents: 13870
diff changeset
289 }
13870
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
290 g_string_append_c(str, '\n');
13989
16102b9c5c4a [gaim-migrate @ 16562]
Mark Huetsch <markhuetsch>
parents: 13870
diff changeset
291 }
13870
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
292
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
293 ret = str->str;
14021
ef8490f9e823 [gaim-migrate @ 16618]
Mark Huetsch <markhuetsch>
parents: 14017
diff changeset
294 /* GString can be freed without freeing it character data */
13870
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
295 g_string_free(str, FALSE);
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
296
983fd420e86b [gaim-migrate @ 16340]
Mark Huetsch <markhuetsch>
parents:
diff changeset
297 return ret;
13989
16102b9c5c4a [gaim-migrate @ 16562]
Mark Huetsch <markhuetsch>
parents: 13870
diff changeset
298 }