Wed, 12 Nov 2008 05:14:03 +0000
merge of '77693555855fe9cd3215414f79964dba346cc5fa'
and '19a87e98e5857ad0289f2c760d460f7f1dbbb42d'
|
13235
72bddc689630
[gaim-migrate @ 15600]
Mark Doliner <markdoliner@pidgin.im>
parents:
11285
diff
changeset
|
1 | /* |
|
72bddc689630
[gaim-migrate @ 15600]
Mark Doliner <markdoliner@pidgin.im>
parents:
11285
diff
changeset
|
2 | * Gaim's oscar protocol plugin |
|
72bddc689630
[gaim-migrate @ 15600]
Mark Doliner <markdoliner@pidgin.im>
parents:
11285
diff
changeset
|
3 | * This file is the legal property of its developers. |
|
72bddc689630
[gaim-migrate @ 15600]
Mark Doliner <markdoliner@pidgin.im>
parents:
11285
diff
changeset
|
4 | * Please see the AUTHORS file distributed alongside this file. |
|
72bddc689630
[gaim-migrate @ 15600]
Mark Doliner <markdoliner@pidgin.im>
parents:
11285
diff
changeset
|
5 | * |
|
72bddc689630
[gaim-migrate @ 15600]
Mark Doliner <markdoliner@pidgin.im>
parents:
11285
diff
changeset
|
6 | * This library is free software; you can redistribute it and/or |
|
72bddc689630
[gaim-migrate @ 15600]
Mark Doliner <markdoliner@pidgin.im>
parents:
11285
diff
changeset
|
7 | * modify it under the terms of the GNU Lesser General Public |
|
72bddc689630
[gaim-migrate @ 15600]
Mark Doliner <markdoliner@pidgin.im>
parents:
11285
diff
changeset
|
8 | * License as published by the Free Software Foundation; either |
|
72bddc689630
[gaim-migrate @ 15600]
Mark Doliner <markdoliner@pidgin.im>
parents:
11285
diff
changeset
|
9 | * version 2 of the License, or (at your option) any later version. |
|
72bddc689630
[gaim-migrate @ 15600]
Mark Doliner <markdoliner@pidgin.im>
parents:
11285
diff
changeset
|
10 | * |
|
72bddc689630
[gaim-migrate @ 15600]
Mark Doliner <markdoliner@pidgin.im>
parents:
11285
diff
changeset
|
11 | * This library is distributed in the hope that it will be useful, |
|
72bddc689630
[gaim-migrate @ 15600]
Mark Doliner <markdoliner@pidgin.im>
parents:
11285
diff
changeset
|
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
72bddc689630
[gaim-migrate @ 15600]
Mark Doliner <markdoliner@pidgin.im>
parents:
11285
diff
changeset
|
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|
72bddc689630
[gaim-migrate @ 15600]
Mark Doliner <markdoliner@pidgin.im>
parents:
11285
diff
changeset
|
14 | * Lesser General Public License for more details. |
|
72bddc689630
[gaim-migrate @ 15600]
Mark Doliner <markdoliner@pidgin.im>
parents:
11285
diff
changeset
|
15 | * |
|
72bddc689630
[gaim-migrate @ 15600]
Mark Doliner <markdoliner@pidgin.im>
parents:
11285
diff
changeset
|
16 | * You should have received a copy of the GNU Lesser General Public |
|
72bddc689630
[gaim-migrate @ 15600]
Mark Doliner <markdoliner@pidgin.im>
parents:
11285
diff
changeset
|
17 | * License along with this library; if not, write to the Free Software |
|
72bddc689630
[gaim-migrate @ 15600]
Mark Doliner <markdoliner@pidgin.im>
parents:
11285
diff
changeset
|
18 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
|
72bddc689630
[gaim-migrate @ 15600]
Mark Doliner <markdoliner@pidgin.im>
parents:
11285
diff
changeset
|
19 | */ |
| 2086 | 20 | |
| 21 | ||
|
13235
72bddc689630
[gaim-migrate @ 15600]
Mark Doliner <markdoliner@pidgin.im>
parents:
11285
diff
changeset
|
22 | #include "oscar.h" |
|
72bddc689630
[gaim-migrate @ 15600]
Mark Doliner <markdoliner@pidgin.im>
parents:
11285
diff
changeset
|
23 | |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13240
diff
changeset
|
24 | static aim_tlv_t * |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13240
diff
changeset
|
25 | createtlv(guint16 type, guint16 length, guint8 *value) |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
26 | { |
|
7158
2bdbaa3a8468
[gaim-migrate @ 7725]
Mark Doliner <markdoliner@pidgin.im>
parents:
7011
diff
changeset
|
27 | aim_tlv_t *ret; |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
28 | |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13240
diff
changeset
|
29 | ret = g_new(aim_tlv_t, 1); |
|
7158
2bdbaa3a8468
[gaim-migrate @ 7725]
Mark Doliner <markdoliner@pidgin.im>
parents:
7011
diff
changeset
|
30 | ret->type = type; |
|
2bdbaa3a8468
[gaim-migrate @ 7725]
Mark Doliner <markdoliner@pidgin.im>
parents:
7011
diff
changeset
|
31 | ret->length = length; |
|
2bdbaa3a8468
[gaim-migrate @ 7725]
Mark Doliner <markdoliner@pidgin.im>
parents:
7011
diff
changeset
|
32 | ret->value = value; |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
33 | |
|
7158
2bdbaa3a8468
[gaim-migrate @ 7725]
Mark Doliner <markdoliner@pidgin.im>
parents:
7011
diff
changeset
|
34 | return ret; |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
35 | } |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
36 | |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13240
diff
changeset
|
37 | static void |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13240
diff
changeset
|
38 | freetlv(aim_tlv_t **oldtlv) |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
39 | { |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
40 | |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
41 | if (!oldtlv || !*oldtlv) |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
42 | return; |
|
10986
92a91fb514f4
[gaim-migrate @ 12822]
Mark Doliner <markdoliner@pidgin.im>
parents:
9933
diff
changeset
|
43 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
44 | free((*oldtlv)->value); |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
45 | free(*oldtlv); |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
46 | *oldtlv = NULL; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
47 | |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
48 | return; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
49 | } |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
50 | |
| 2086 | 51 | /** |
|
7167
9cfb68a44e17
[gaim-migrate @ 7734]
Mark Doliner <markdoliner@pidgin.im>
parents:
7166
diff
changeset
|
52 | * Read a TLV chain from a buffer. |
| 2086 | 53 | * |
| 54 | * Reads and parses a series of TLV patterns from a data buffer; the | |
| 55 | * returned structure is manipulatable with the rest of the TLV | |
|
7167
9cfb68a44e17
[gaim-migrate @ 7734]
Mark Doliner <markdoliner@pidgin.im>
parents:
7166
diff
changeset
|
56 | * routines. When done with a TLV chain, aim_tlvlist_free() should |
| 2086 | 57 | * be called to free the dynamic substructures. |
| 58 | * | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
59 | * XXX There should be a flag setable here to have the tlvlist contain |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13240
diff
changeset
|
60 | * bstream references, so that at least the ->value portion of each |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
61 | * element doesn't need to be malloc/memcpy'd. This could prove to be |
|
8735
01248ea222d3
[gaim-migrate @ 9490]
Jonathan Champ <royanee@users.sourceforge.net>
parents:
8225
diff
changeset
|
62 | * just as efficient as the in-place TLV parsing used in a couple places |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
63 | * in libfaim. |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
64 | * |
|
7158
2bdbaa3a8468
[gaim-migrate @ 7725]
Mark Doliner <markdoliner@pidgin.im>
parents:
7011
diff
changeset
|
65 | * @param bs Input bstream |
|
8790
3d6d2e2f6296
[gaim-migrate @ 9552]
Jonathan Champ <royanee@users.sourceforge.net>
parents:
8735
diff
changeset
|
66 | * @return Return the TLV chain read |
| 2086 | 67 | */ |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13240
diff
changeset
|
68 | aim_tlvlist_t *aim_tlvlist_read(ByteStream *bs) |
| 2086 | 69 | { |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
70 | aim_tlvlist_t *list = NULL, *cur; |
|
10986
92a91fb514f4
[gaim-migrate @ 12822]
Mark Doliner <markdoliner@pidgin.im>
parents:
9933
diff
changeset
|
71 | |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13240
diff
changeset
|
72 | while (byte_stream_empty(bs) > 0) { |
|
13235
72bddc689630
[gaim-migrate @ 15600]
Mark Doliner <markdoliner@pidgin.im>
parents:
11285
diff
changeset
|
73 | guint16 type, length; |
| 2086 | 74 | |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13240
diff
changeset
|
75 | type = byte_stream_get16(bs); |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13240
diff
changeset
|
76 | length = byte_stream_get16(bs); |
| 2086 | 77 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
78 | #if 0 /* temporarily disabled until I know if they're still doing it or not */ |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
79 | /* |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
80 | * Okay, so now AOL has decided that any TLV of |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
81 | * type 0x0013 can only be two bytes, despite |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13240
diff
changeset
|
82 | * what the actual given length is. So here |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
83 | * we dump any invalid TLVs of that sort. Hopefully |
|
8735
01248ea222d3
[gaim-migrate @ 9490]
Jonathan Champ <royanee@users.sourceforge.net>
parents:
8225
diff
changeset
|
84 | * there's no special cases to this special case. |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
85 | * - mid (30jun2000) |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
86 | */ |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
87 | if ((type == 0x0013) && (length != 0x0002)) |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
88 | length = 0x0002; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
89 | #else |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
90 | if (0) |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
91 | ; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
92 | #endif |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
93 | else { |
| 2086 | 94 | |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13240
diff
changeset
|
95 | if (length > byte_stream_empty(bs)) { |
|
7167
9cfb68a44e17
[gaim-migrate @ 7734]
Mark Doliner <markdoliner@pidgin.im>
parents:
7166
diff
changeset
|
96 | aim_tlvlist_free(&list); |
| 3459 | 97 | return NULL; |
| 98 | } | |
| 99 | ||
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13240
diff
changeset
|
100 | cur = g_new0(aim_tlvlist_t, 1); |
|
7158
2bdbaa3a8468
[gaim-migrate @ 7725]
Mark Doliner <markdoliner@pidgin.im>
parents:
7011
diff
changeset
|
101 | cur->tlv = createtlv(type, length, NULL); |
|
2bdbaa3a8468
[gaim-migrate @ 7725]
Mark Doliner <markdoliner@pidgin.im>
parents:
7011
diff
changeset
|
102 | if (cur->tlv->length > 0) { |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13240
diff
changeset
|
103 | cur->tlv->value = byte_stream_getraw(bs, length); |
|
7158
2bdbaa3a8468
[gaim-migrate @ 7725]
Mark Doliner <markdoliner@pidgin.im>
parents:
7011
diff
changeset
|
104 | if (!cur->tlv->value) { |
|
2bdbaa3a8468
[gaim-migrate @ 7725]
Mark Doliner <markdoliner@pidgin.im>
parents:
7011
diff
changeset
|
105 | freetlv(&cur->tlv); |
|
2bdbaa3a8468
[gaim-migrate @ 7725]
Mark Doliner <markdoliner@pidgin.im>
parents:
7011
diff
changeset
|
106 | free(cur); |
|
7167
9cfb68a44e17
[gaim-migrate @ 7734]
Mark Doliner <markdoliner@pidgin.im>
parents:
7166
diff
changeset
|
107 | aim_tlvlist_free(&list); |
|
7158
2bdbaa3a8468
[gaim-migrate @ 7725]
Mark Doliner <markdoliner@pidgin.im>
parents:
7011
diff
changeset
|
108 | return NULL; |
|
2bdbaa3a8468
[gaim-migrate @ 7725]
Mark Doliner <markdoliner@pidgin.im>
parents:
7011
diff
changeset
|
109 | } |
| 3459 | 110 | } |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
111 | |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
112 | cur->next = list; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
113 | list = cur; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
114 | } |
| 2086 | 115 | } |
| 116 | ||
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
117 | return list; |
| 2086 | 118 | } |
| 119 | ||
| 120 | /** | |
|
7167
9cfb68a44e17
[gaim-migrate @ 7734]
Mark Doliner <markdoliner@pidgin.im>
parents:
7166
diff
changeset
|
121 | * Read a TLV chain from a buffer. |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
3952
diff
changeset
|
122 | * |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3912
diff
changeset
|
123 | * Reads and parses a series of TLV patterns from a data buffer; the |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3912
diff
changeset
|
124 | * returned structure is manipulatable with the rest of the TLV |
|
7167
9cfb68a44e17
[gaim-migrate @ 7734]
Mark Doliner <markdoliner@pidgin.im>
parents:
7166
diff
changeset
|
125 | * routines. When done with a TLV chain, aim_tlvlist_free() should |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3912
diff
changeset
|
126 | * be called to free the dynamic substructures. |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3912
diff
changeset
|
127 | * |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3912
diff
changeset
|
128 | * XXX There should be a flag setable here to have the tlvlist contain |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13240
diff
changeset
|
129 | * bstream references, so that at least the ->value portion of each |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3912
diff
changeset
|
130 | * element doesn't need to be malloc/memcpy'd. This could prove to be |
|
8735
01248ea222d3
[gaim-migrate @ 9490]
Jonathan Champ <royanee@users.sourceforge.net>
parents:
8225
diff
changeset
|
131 | * just as efficient as the in-place TLV parsing used in a couple places |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3912
diff
changeset
|
132 | * in libfaim. |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3912
diff
changeset
|
133 | * |
|
7158
2bdbaa3a8468
[gaim-migrate @ 7725]
Mark Doliner <markdoliner@pidgin.im>
parents:
7011
diff
changeset
|
134 | * @param bs Input bstream |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13240
diff
changeset
|
135 | * @param num The max number of TLVs that will be read, or -1 if unlimited. |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13240
diff
changeset
|
136 | * There are a number of places where you want to read in a tlvchain, |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13240
diff
changeset
|
137 | * but the chain is not at the end of the SNAC, and the chain is |
|
8735
01248ea222d3
[gaim-migrate @ 9490]
Jonathan Champ <royanee@users.sourceforge.net>
parents:
8225
diff
changeset
|
138 | * preceded by the number of TLVs. So you can limit that with this. |
|
8790
3d6d2e2f6296
[gaim-migrate @ 9552]
Jonathan Champ <royanee@users.sourceforge.net>
parents:
8735
diff
changeset
|
139 | * @return Return the TLV chain read |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3912
diff
changeset
|
140 | */ |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13240
diff
changeset
|
141 | aim_tlvlist_t *aim_tlvlist_readnum(ByteStream *bs, guint16 num) |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3912
diff
changeset
|
142 | { |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3912
diff
changeset
|
143 | aim_tlvlist_t *list = NULL, *cur; |
|
4317
f3f135811a70
[gaim-migrate @ 4571]
Mark Doliner <markdoliner@pidgin.im>
parents:
4230
diff
changeset
|
144 | |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13240
diff
changeset
|
145 | while ((byte_stream_empty(bs) > 0) && (num != 0)) { |
|
13235
72bddc689630
[gaim-migrate @ 15600]
Mark Doliner <markdoliner@pidgin.im>
parents:
11285
diff
changeset
|
146 | guint16 type, length; |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3912
diff
changeset
|
147 | |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13240
diff
changeset
|
148 | type = byte_stream_get16(bs); |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13240
diff
changeset
|
149 | length = byte_stream_get16(bs); |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3912
diff
changeset
|
150 | |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13240
diff
changeset
|
151 | if (length > byte_stream_empty(bs)) { |
|
7167
9cfb68a44e17
[gaim-migrate @ 7734]
Mark Doliner <markdoliner@pidgin.im>
parents:
7166
diff
changeset
|
152 | aim_tlvlist_free(&list); |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3912
diff
changeset
|
153 | return NULL; |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3912
diff
changeset
|
154 | } |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3912
diff
changeset
|
155 | |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13240
diff
changeset
|
156 | cur = g_new0(aim_tlvlist_t, 1); |
|
7158
2bdbaa3a8468
[gaim-migrate @ 7725]
Mark Doliner <markdoliner@pidgin.im>
parents:
7011
diff
changeset
|
157 | cur->tlv = createtlv(type, length, NULL); |
|
2bdbaa3a8468
[gaim-migrate @ 7725]
Mark Doliner <markdoliner@pidgin.im>
parents:
7011
diff
changeset
|
158 | if (cur->tlv->length > 0) { |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13240
diff
changeset
|
159 | cur->tlv->value = byte_stream_getraw(bs, length); |
|
7158
2bdbaa3a8468
[gaim-migrate @ 7725]
Mark Doliner <markdoliner@pidgin.im>
parents:
7011
diff
changeset
|
160 | if (!cur->tlv->value) { |
|
2bdbaa3a8468
[gaim-migrate @ 7725]
Mark Doliner <markdoliner@pidgin.im>
parents:
7011
diff
changeset
|
161 | freetlv(&cur->tlv); |
|
2bdbaa3a8468
[gaim-migrate @ 7725]
Mark Doliner <markdoliner@pidgin.im>
parents:
7011
diff
changeset
|
162 | free(cur); |
|
7167
9cfb68a44e17
[gaim-migrate @ 7734]
Mark Doliner <markdoliner@pidgin.im>
parents:
7166
diff
changeset
|
163 | aim_tlvlist_free(&list); |
|
7158
2bdbaa3a8468
[gaim-migrate @ 7725]
Mark Doliner <markdoliner@pidgin.im>
parents:
7011
diff
changeset
|
164 | return NULL; |
|
2bdbaa3a8468
[gaim-migrate @ 7725]
Mark Doliner <markdoliner@pidgin.im>
parents:
7011
diff
changeset
|
165 | } |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3912
diff
changeset
|
166 | } |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3912
diff
changeset
|
167 | |
|
7158
2bdbaa3a8468
[gaim-migrate @ 7725]
Mark Doliner <markdoliner@pidgin.im>
parents:
7011
diff
changeset
|
168 | if (num > 0) |
|
2bdbaa3a8468
[gaim-migrate @ 7725]
Mark Doliner <markdoliner@pidgin.im>
parents:
7011
diff
changeset
|
169 | num--; |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3912
diff
changeset
|
170 | cur->next = list; |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3912
diff
changeset
|
171 | list = cur; |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3912
diff
changeset
|
172 | } |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3912
diff
changeset
|
173 | |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3912
diff
changeset
|
174 | return list; |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3912
diff
changeset
|
175 | } |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3912
diff
changeset
|
176 | |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3912
diff
changeset
|
177 | /** |
|
7167
9cfb68a44e17
[gaim-migrate @ 7734]
Mark Doliner <markdoliner@pidgin.im>
parents:
7166
diff
changeset
|
178 | * Read a TLV chain from a buffer. |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
3952
diff
changeset
|
179 | * |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
3952
diff
changeset
|
180 | * Reads and parses a series of TLV patterns from a data buffer; the |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
3952
diff
changeset
|
181 | * returned structure is manipulatable with the rest of the TLV |
|
7167
9cfb68a44e17
[gaim-migrate @ 7734]
Mark Doliner <markdoliner@pidgin.im>
parents:
7166
diff
changeset
|
182 | * routines. When done with a TLV chain, aim_tlvlist_free() should |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
3952
diff
changeset
|
183 | * be called to free the dynamic substructures. |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
3952
diff
changeset
|
184 | * |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
3952
diff
changeset
|
185 | * XXX There should be a flag setable here to have the tlvlist contain |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13240
diff
changeset
|
186 | * bstream references, so that at least the ->value portion of each |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
3952
diff
changeset
|
187 | * element doesn't need to be malloc/memcpy'd. This could prove to be |
|
8735
01248ea222d3
[gaim-migrate @ 9490]
Jonathan Champ <royanee@users.sourceforge.net>
parents:
8225
diff
changeset
|
188 | * just as efficient as the in-place TLV parsing used in a couple places |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
3952
diff
changeset
|
189 | * in libfaim. |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
3952
diff
changeset
|
190 | * |
|
7158
2bdbaa3a8468
[gaim-migrate @ 7725]
Mark Doliner <markdoliner@pidgin.im>
parents:
7011
diff
changeset
|
191 | * @param bs Input bstream |
|
2bdbaa3a8468
[gaim-migrate @ 7725]
Mark Doliner <markdoliner@pidgin.im>
parents:
7011
diff
changeset
|
192 | * @param len The max length in bytes that will be read. |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13240
diff
changeset
|
193 | * There are a number of places where you want to read in a tlvchain, |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13240
diff
changeset
|
194 | * but the chain is not at the end of the SNAC, and the chain is |
|
8735
01248ea222d3
[gaim-migrate @ 9490]
Jonathan Champ <royanee@users.sourceforge.net>
parents:
8225
diff
changeset
|
195 | * preceded by the length of the TLVs. So you can limit that with this. |
|
8790
3d6d2e2f6296
[gaim-migrate @ 9552]
Jonathan Champ <royanee@users.sourceforge.net>
parents:
8735
diff
changeset
|
196 | * @return Return the TLV chain read |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
3952
diff
changeset
|
197 | */ |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13240
diff
changeset
|
198 | aim_tlvlist_t *aim_tlvlist_readlen(ByteStream *bs, guint16 len) |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
3952
diff
changeset
|
199 | { |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
3952
diff
changeset
|
200 | aim_tlvlist_t *list = NULL, *cur; |
|
4317
f3f135811a70
[gaim-migrate @ 4571]
Mark Doliner <markdoliner@pidgin.im>
parents:
4230
diff
changeset
|
201 | |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13240
diff
changeset
|
202 | while ((byte_stream_empty(bs) > 0) && (len > 0)) { |
|
13235
72bddc689630
[gaim-migrate @ 15600]
Mark Doliner <markdoliner@pidgin.im>
parents:
11285
diff
changeset
|
203 | guint16 type, length; |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
3952
diff
changeset
|
204 | |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13240
diff
changeset
|
205 | type = byte_stream_get16(bs); |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13240
diff
changeset
|
206 | length = byte_stream_get16(bs); |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
3952
diff
changeset
|
207 | |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13240
diff
changeset
|
208 | if (length > byte_stream_empty(bs)) { |
|
7167
9cfb68a44e17
[gaim-migrate @ 7734]
Mark Doliner <markdoliner@pidgin.im>
parents:
7166
diff
changeset
|
209 | aim_tlvlist_free(&list); |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
3952
diff
changeset
|
210 | return NULL; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
3952
diff
changeset
|
211 | } |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
3952
diff
changeset
|
212 | |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13240
diff
changeset
|
213 | cur = g_new0(aim_tlvlist_t, 1); |
|
7158
2bdbaa3a8468
[gaim-migrate @ 7725]
Mark Doliner <markdoliner@pidgin.im>
parents:
7011
diff
changeset
|
214 | cur->tlv = createtlv(type, length, NULL); |
|
2bdbaa3a8468
[gaim-migrate @ 7725]
Mark Doliner <markdoliner@pidgin.im>
parents:
7011
diff
changeset
|
215 | if (cur->tlv->length > 0) { |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13240
diff
changeset
|
216 | cur->tlv->value = byte_stream_getraw(bs, length); |
|
7158
2bdbaa3a8468
[gaim-migrate @ 7725]
Mark Doliner <markdoliner@pidgin.im>
parents:
7011
diff
changeset
|
217 | if (!cur->tlv->value) { |
|
2bdbaa3a8468
[gaim-migrate @ 7725]
Mark Doliner <markdoliner@pidgin.im>
parents:
7011
diff
changeset
|
218 | freetlv(&cur->tlv); |
|
2bdbaa3a8468
[gaim-migrate @ 7725]
Mark Doliner <markdoliner@pidgin.im>
parents:
7011
diff
changeset
|
219 | free(cur); |
|
7167
9cfb68a44e17
[gaim-migrate @ 7734]
Mark Doliner <markdoliner@pidgin.im>
parents:
7166
diff
changeset
|
220 | aim_tlvlist_free(&list); |
|
7158
2bdbaa3a8468
[gaim-migrate @ 7725]
Mark Doliner <markdoliner@pidgin.im>
parents:
7011
diff
changeset
|
221 | return NULL; |
|
2bdbaa3a8468
[gaim-migrate @ 7725]
Mark Doliner <markdoliner@pidgin.im>
parents:
7011
diff
changeset
|
222 | } |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
3952
diff
changeset
|
223 | } |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
3952
diff
changeset
|
224 | |
|
7167
9cfb68a44e17
[gaim-migrate @ 7734]
Mark Doliner <markdoliner@pidgin.im>
parents:
7166
diff
changeset
|
225 | len -= aim_tlvlist_size(&cur); |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
3952
diff
changeset
|
226 | cur->next = list; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
3952
diff
changeset
|
227 | list = cur; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
3952
diff
changeset
|
228 | } |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
3952
diff
changeset
|
229 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
3952
diff
changeset
|
230 | return list; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
3952
diff
changeset
|
231 | } |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
3952
diff
changeset
|
232 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
3952
diff
changeset
|
233 | /** |
|
7167
9cfb68a44e17
[gaim-migrate @ 7734]
Mark Doliner <markdoliner@pidgin.im>
parents:
7166
diff
changeset
|
234 | * Duplicate a TLV chain. |
|
8735
01248ea222d3
[gaim-migrate @ 9490]
Jonathan Champ <royanee@users.sourceforge.net>
parents:
8225
diff
changeset
|
235 | * This is pretty self explanatory. |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
3952
diff
changeset
|
236 | * |
|
7158
2bdbaa3a8468
[gaim-migrate @ 7725]
Mark Doliner <markdoliner@pidgin.im>
parents:
7011
diff
changeset
|
237 | * @param orig The TLV chain you want to make a copy of. |
|
2bdbaa3a8468
[gaim-migrate @ 7725]
Mark Doliner <markdoliner@pidgin.im>
parents:
7011
diff
changeset
|
238 | * @return A newly allocated TLV chain. |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
3952
diff
changeset
|
239 | */ |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13240
diff
changeset
|
240 | aim_tlvlist_t *aim_tlvlist_copy(aim_tlvlist_t *orig) |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
3952
diff
changeset
|
241 | { |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
3952
diff
changeset
|
242 | aim_tlvlist_t *new = NULL; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
3952
diff
changeset
|
243 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
3952
diff
changeset
|
244 | while (orig) { |
|
7167
9cfb68a44e17
[gaim-migrate @ 7734]
Mark Doliner <markdoliner@pidgin.im>
parents:
7166
diff
changeset
|
245 | aim_tlvlist_add_raw(&new, orig->tlv->type, orig->tlv->length, orig->tlv->value); |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
3952
diff
changeset
|
246 | orig = orig->next; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
3952
diff
changeset
|
247 | } |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
3952
diff
changeset
|
248 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
3952
diff
changeset
|
249 | return new; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
3952
diff
changeset
|
250 | } |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
3952
diff
changeset
|
251 | |
|
6101
c3762fa398c4
[gaim-migrate @ 6560]
Mark Doliner <markdoliner@pidgin.im>
parents:
4617
diff
changeset
|
252 | /* |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13240
diff
changeset
|
253 | * Compare two TLV lists for equality. This probably is not the most |
|
6101
c3762fa398c4
[gaim-migrate @ 6560]
Mark Doliner <markdoliner@pidgin.im>
parents:
4617
diff
changeset
|
254 | * efficient way to do this. |
|
c3762fa398c4
[gaim-migrate @ 6560]
Mark Doliner <markdoliner@pidgin.im>
parents:
4617
diff
changeset
|
255 | * |
|
c3762fa398c4
[gaim-migrate @ 6560]
Mark Doliner <markdoliner@pidgin.im>
parents:
4617
diff
changeset
|
256 | * @param one One of the TLV chains to compare. |
|
c3762fa398c4
[gaim-migrate @ 6560]
Mark Doliner <markdoliner@pidgin.im>
parents:
4617
diff
changeset
|
257 | * @param two The other TLV chain to compare. |
|
8790
3d6d2e2f6296
[gaim-migrate @ 9552]
Jonathan Champ <royanee@users.sourceforge.net>
parents:
8735
diff
changeset
|
258 | * @return Return 0 if the lists are the same, return 1 if they are different. |
|
6101
c3762fa398c4
[gaim-migrate @ 6560]
Mark Doliner <markdoliner@pidgin.im>
parents:
4617
diff
changeset
|
259 | */ |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13240
diff
changeset
|
260 | int aim_tlvlist_cmp(aim_tlvlist_t *one, aim_tlvlist_t *two) |
|
6101
c3762fa398c4
[gaim-migrate @ 6560]
Mark Doliner <markdoliner@pidgin.im>
parents:
4617
diff
changeset
|
261 | { |
|
13240
db5187cc40d1
[gaim-migrate @ 15605]
Mark Doliner <markdoliner@pidgin.im>
parents:
13235
diff
changeset
|
262 | ByteStream bs1, bs2; |
|
6101
c3762fa398c4
[gaim-migrate @ 6560]
Mark Doliner <markdoliner@pidgin.im>
parents:
4617
diff
changeset
|
263 | |
|
7167
9cfb68a44e17
[gaim-migrate @ 7734]
Mark Doliner <markdoliner@pidgin.im>
parents:
7166
diff
changeset
|
264 | if (aim_tlvlist_size(&one) != aim_tlvlist_size(&two)) |
|
6101
c3762fa398c4
[gaim-migrate @ 6560]
Mark Doliner <markdoliner@pidgin.im>
parents:
4617
diff
changeset
|
265 | return 1; |
|
c3762fa398c4
[gaim-migrate @ 6560]
Mark Doliner <markdoliner@pidgin.im>
parents:
4617
diff
changeset
|
266 | |
|
15151
bb985812fefa
[gaim-migrate @ 17875]
Mark Doliner <markdoliner@pidgin.im>
parents:
14254
diff
changeset
|
267 | byte_stream_new(&bs1, aim_tlvlist_size(&one)); |
|
bb985812fefa
[gaim-migrate @ 17875]
Mark Doliner <markdoliner@pidgin.im>
parents:
14254
diff
changeset
|
268 | byte_stream_new(&bs2, aim_tlvlist_size(&two)); |
|
6101
c3762fa398c4
[gaim-migrate @ 6560]
Mark Doliner <markdoliner@pidgin.im>
parents:
4617
diff
changeset
|
269 | |
|
7167
9cfb68a44e17
[gaim-migrate @ 7734]
Mark Doliner <markdoliner@pidgin.im>
parents:
7166
diff
changeset
|
270 | aim_tlvlist_write(&bs1, &one); |
|
9cfb68a44e17
[gaim-migrate @ 7734]
Mark Doliner <markdoliner@pidgin.im>
parents:
7166
diff
changeset
|
271 | aim_tlvlist_write(&bs2, &two); |
|
6101
c3762fa398c4
[gaim-migrate @ 6560]
Mark Doliner <markdoliner@pidgin.im>
parents:
4617
diff
changeset
|
272 | |
|
c3762fa398c4
[gaim-migrate @ 6560]
Mark Doliner <markdoliner@pidgin.im>
parents:
4617
diff
changeset
|
273 | if (memcmp(bs1.data, bs2.data, bs1.len)) { |
|
c3762fa398c4
[gaim-migrate @ 6560]
Mark Doliner <markdoliner@pidgin.im>
parents:
4617
diff
changeset
|
274 | free(bs1.data); |
|
c3762fa398c4
[gaim-migrate @ 6560]
Mark Doliner <markdoliner@pidgin.im>
parents:
4617
diff
changeset
|
275 | free(bs2.data); |
|
c3762fa398c4
[gaim-migrate @ 6560]
Mark Doliner <markdoliner@pidgin.im>
parents:
4617
diff
changeset
|
276 | return 1; |
|
c3762fa398c4
[gaim-migrate @ 6560]
Mark Doliner <markdoliner@pidgin.im>
parents:
4617
diff
changeset
|
277 | } |
|
c3762fa398c4
[gaim-migrate @ 6560]
Mark Doliner <markdoliner@pidgin.im>
parents:
4617
diff
changeset
|
278 | |
|
15151
bb985812fefa
[gaim-migrate @ 17875]
Mark Doliner <markdoliner@pidgin.im>
parents:
14254
diff
changeset
|
279 | g_free(bs1.data); |
|
bb985812fefa
[gaim-migrate @ 17875]
Mark Doliner <markdoliner@pidgin.im>
parents:
14254
diff
changeset
|
280 | g_free(bs2.data); |
|
6101
c3762fa398c4
[gaim-migrate @ 6560]
Mark Doliner <markdoliner@pidgin.im>
parents:
4617
diff
changeset
|
281 | |
|
c3762fa398c4
[gaim-migrate @ 6560]
Mark Doliner <markdoliner@pidgin.im>
parents:
4617
diff
changeset
|
282 | return 0; |
|
c3762fa398c4
[gaim-migrate @ 6560]
Mark Doliner <markdoliner@pidgin.im>
parents:
4617
diff
changeset
|
283 | } |
|
c3762fa398c4
[gaim-migrate @ 6560]
Mark Doliner <markdoliner@pidgin.im>
parents:
4617
diff
changeset
|
284 | |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
3952
diff
changeset
|
285 | /** |
|
7167
9cfb68a44e17
[gaim-migrate @ 7734]
Mark Doliner <markdoliner@pidgin.im>
parents:
7166
diff
changeset
|
286 | * Free a TLV chain structure |
| 2086 | 287 | * |
| 288 | * Walks the list of TLVs in the passed TLV chain and | |
| 289 | * frees each one. Note that any references to this data | |
| 290 | * should be removed before calling this. | |
| 291 | * | |
|
8790
3d6d2e2f6296
[gaim-migrate @ 9552]
Jonathan Champ <royanee@users.sourceforge.net>
parents:
8735
diff
changeset
|
292 | * @param list Chain to be freed |
| 2086 | 293 | */ |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13240
diff
changeset
|
294 | void aim_tlvlist_free(aim_tlvlist_t **list) |
| 2086 | 295 | { |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
296 | aim_tlvlist_t *cur; |
| 2086 | 297 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
298 | if (!list || !*list) |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
299 | return; |
| 2086 | 300 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
301 | for (cur = *list; cur; ) { |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
302 | aim_tlvlist_t *tmp; |
|
10986
92a91fb514f4
[gaim-migrate @ 12822]
Mark Doliner <markdoliner@pidgin.im>
parents:
9933
diff
changeset
|
303 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
304 | freetlv(&cur->tlv); |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
305 | |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
306 | tmp = cur->next; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
307 | free(cur); |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
308 | cur = tmp; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
309 | } |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
310 | |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
311 | list = NULL; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
312 | |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
313 | return; |
| 2086 | 314 | } |
| 315 | ||
| 316 | /** | |
|
7167
9cfb68a44e17
[gaim-migrate @ 7734]
Mark Doliner <markdoliner@pidgin.im>
parents:
7166
diff
changeset
|
317 | * Count the number of TLVs in a chain. |
| 2086 | 318 | * |
|
7167
9cfb68a44e17
[gaim-migrate @ 7734]
Mark Doliner <markdoliner@pidgin.im>
parents:
7166
diff
changeset
|
319 | * @param list Chain to be counted. |
|
9cfb68a44e17
[gaim-migrate @ 7734]
Mark Doliner <markdoliner@pidgin.im>
parents:
7166
diff
changeset
|
320 | * @return The number of TLVs stored in the passed chain. |
| 2086 | 321 | */ |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13240
diff
changeset
|
322 | int aim_tlvlist_count(aim_tlvlist_t **list) |
| 2086 | 323 | { |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
324 | aim_tlvlist_t *cur; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
325 | int count; |
| 2086 | 326 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
327 | if (!list || !*list) |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
328 | return 0; |
| 2086 | 329 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
330 | for (cur = *list, count = 0; cur; cur = cur->next) |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
331 | count++; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
332 | |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
333 | return count; |
| 2086 | 334 | } |
| 335 | ||
| 336 | /** | |
|
7167
9cfb68a44e17
[gaim-migrate @ 7734]
Mark Doliner <markdoliner@pidgin.im>
parents:
7166
diff
changeset
|
337 | * Count the number of bytes in a TLV chain. |
| 2086 | 338 | * |
|
7167
9cfb68a44e17
[gaim-migrate @ 7734]
Mark Doliner <markdoliner@pidgin.im>
parents:
7166
diff
changeset
|
339 | * @param list Chain to be sized |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13240
diff
changeset
|
340 | * @return The number of bytes that would be needed to |
|
7167
9cfb68a44e17
[gaim-migrate @ 7734]
Mark Doliner <markdoliner@pidgin.im>
parents:
7166
diff
changeset
|
341 | * write the passed TLV chain to a data buffer. |
| 2086 | 342 | */ |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13240
diff
changeset
|
343 | int aim_tlvlist_size(aim_tlvlist_t **list) |
| 2086 | 344 | { |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
345 | aim_tlvlist_t *cur; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
346 | int size; |
| 2086 | 347 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
348 | if (!list || !*list) |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
349 | return 0; |
| 2086 | 350 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
351 | for (cur = *list, size = 0; cur; cur = cur->next) |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
352 | size += (4 + cur->tlv->length); |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
353 | |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
354 | return size; |
| 2086 | 355 | } |
| 356 | ||
| 357 | /** | |
| 358 | * Adds the passed string as a TLV element of the passed type | |
| 359 | * to the TLV chain. | |
| 360 | * | |
|
7167
9cfb68a44e17
[gaim-migrate @ 7734]
Mark Doliner <markdoliner@pidgin.im>
parents:
7166
diff
changeset
|
361 | * @param list Desination chain (%NULL pointer if empty). |
|
9cfb68a44e17
[gaim-migrate @ 7734]
Mark Doliner <markdoliner@pidgin.im>
parents:
7166
diff
changeset
|
362 | * @param type TLV type. |
|
8790
3d6d2e2f6296
[gaim-migrate @ 9552]
Jonathan Champ <royanee@users.sourceforge.net>
parents:
8735
diff
changeset
|
363 | * @param length Length of string to add (not including %NULL). |
|
3d6d2e2f6296
[gaim-migrate @ 9552]
Jonathan Champ <royanee@users.sourceforge.net>
parents:
8735
diff
changeset
|
364 | * @param value String to add. |
|
8735
01248ea222d3
[gaim-migrate @ 9490]
Jonathan Champ <royanee@users.sourceforge.net>
parents:
8225
diff
changeset
|
365 | * @return The size of the value added. |
| 2086 | 366 | */ |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13240
diff
changeset
|
367 | int aim_tlvlist_add_raw(aim_tlvlist_t **list, const guint16 type, const guint16 length, const guint8 *value) |
| 2086 | 368 | { |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
369 | aim_tlvlist_t *newtlv, *cur; |
| 2086 | 370 | |
|
7166
70825074f830
[gaim-migrate @ 7733]
Mark Doliner <markdoliner@pidgin.im>
parents:
7158
diff
changeset
|
371 | if (list == NULL) |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
372 | return 0; |
| 2086 | 373 | |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13240
diff
changeset
|
374 | newtlv = g_new0(aim_tlvlist_t, 1); |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13240
diff
changeset
|
375 | newtlv->tlv = createtlv(type, length, NULL); |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13240
diff
changeset
|
376 | if (newtlv->tlv->length > 0) |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13240
diff
changeset
|
377 | newtlv->tlv->value = g_memdup(value, length); |
| 2086 | 378 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
379 | if (!*list) |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
380 | *list = newtlv; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
381 | else { |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
382 | for(cur = *list; cur->next; cur = cur->next) |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
383 | ; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
384 | cur->next = newtlv; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
385 | } |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
386 | |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
387 | return newtlv->tlv->length; |
| 2086 | 388 | } |
| 389 | ||
| 390 | /** | |
|
7167
9cfb68a44e17
[gaim-migrate @ 7734]
Mark Doliner <markdoliner@pidgin.im>
parents:
7166
diff
changeset
|
391 | * Add a one byte integer to a TLV chain. |
|
2821
f1ab7f03bdad
[gaim-migrate @ 2834]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2421
diff
changeset
|
392 | * |
|
7167
9cfb68a44e17
[gaim-migrate @ 7734]
Mark Doliner <markdoliner@pidgin.im>
parents:
7166
diff
changeset
|
393 | * @param list Destination chain. |
|
9cfb68a44e17
[gaim-migrate @ 7734]
Mark Doliner <markdoliner@pidgin.im>
parents:
7166
diff
changeset
|
394 | * @param type TLV type to add. |
|
9cfb68a44e17
[gaim-migrate @ 7734]
Mark Doliner <markdoliner@pidgin.im>
parents:
7166
diff
changeset
|
395 | * @param value Value to add. |
|
8735
01248ea222d3
[gaim-migrate @ 9490]
Jonathan Champ <royanee@users.sourceforge.net>
parents:
8225
diff
changeset
|
396 | * @return The size of the value added. |
|
2821
f1ab7f03bdad
[gaim-migrate @ 2834]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2421
diff
changeset
|
397 | */ |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13240
diff
changeset
|
398 | int aim_tlvlist_add_8(aim_tlvlist_t **list, const guint16 type, const guint8 value) |
|
2821
f1ab7f03bdad
[gaim-migrate @ 2834]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2421
diff
changeset
|
399 | { |
|
13235
72bddc689630
[gaim-migrate @ 15600]
Mark Doliner <markdoliner@pidgin.im>
parents:
11285
diff
changeset
|
400 | guint8 v8[1]; |
|
2821
f1ab7f03bdad
[gaim-migrate @ 2834]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2421
diff
changeset
|
401 | |
|
7167
9cfb68a44e17
[gaim-migrate @ 7734]
Mark Doliner <markdoliner@pidgin.im>
parents:
7166
diff
changeset
|
402 | aimutil_put8(v8, value); |
|
2821
f1ab7f03bdad
[gaim-migrate @ 2834]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2421
diff
changeset
|
403 | |
|
7167
9cfb68a44e17
[gaim-migrate @ 7734]
Mark Doliner <markdoliner@pidgin.im>
parents:
7166
diff
changeset
|
404 | return aim_tlvlist_add_raw(list, type, 1, v8); |
|
2821
f1ab7f03bdad
[gaim-migrate @ 2834]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2421
diff
changeset
|
405 | } |
|
f1ab7f03bdad
[gaim-migrate @ 2834]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2421
diff
changeset
|
406 | |
|
f1ab7f03bdad
[gaim-migrate @ 2834]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2421
diff
changeset
|
407 | /** |
|
7167
9cfb68a44e17
[gaim-migrate @ 7734]
Mark Doliner <markdoliner@pidgin.im>
parents:
7166
diff
changeset
|
408 | * Add a two byte integer to a TLV chain. |
| 2086 | 409 | * |
|
7167
9cfb68a44e17
[gaim-migrate @ 7734]
Mark Doliner <markdoliner@pidgin.im>
parents:
7166
diff
changeset
|
410 | * @param list Destination chain. |
|
9cfb68a44e17
[gaim-migrate @ 7734]
Mark Doliner <markdoliner@pidgin.im>
parents:
7166
diff
changeset
|
411 | * @param type TLV type to add. |
|
9cfb68a44e17
[gaim-migrate @ 7734]
Mark Doliner <markdoliner@pidgin.im>
parents:
7166
diff
changeset
|
412 | * @param value Value to add. |
|
8735
01248ea222d3
[gaim-migrate @ 9490]
Jonathan Champ <royanee@users.sourceforge.net>
parents:
8225
diff
changeset
|
413 | * @return The size of the value added. |
| 2086 | 414 | */ |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13240
diff
changeset
|
415 | int aim_tlvlist_add_16(aim_tlvlist_t **list, const guint16 type, const guint16 value) |
| 2086 | 416 | { |
|
13235
72bddc689630
[gaim-migrate @ 15600]
Mark Doliner <markdoliner@pidgin.im>
parents:
11285
diff
changeset
|
417 | guint8 v16[2]; |
| 2086 | 418 | |
|
7167
9cfb68a44e17
[gaim-migrate @ 7734]
Mark Doliner <markdoliner@pidgin.im>
parents:
7166
diff
changeset
|
419 | aimutil_put16(v16, value); |
| 2086 | 420 | |
|
7167
9cfb68a44e17
[gaim-migrate @ 7734]
Mark Doliner <markdoliner@pidgin.im>
parents:
7166
diff
changeset
|
421 | return aim_tlvlist_add_raw(list, type, 2, v16); |
| 2086 | 422 | } |
| 423 | ||
| 424 | /** | |
|
7167
9cfb68a44e17
[gaim-migrate @ 7734]
Mark Doliner <markdoliner@pidgin.im>
parents:
7166
diff
changeset
|
425 | * Add a four byte integer to a TLV chain. |
| 2086 | 426 | * |
|
7167
9cfb68a44e17
[gaim-migrate @ 7734]
Mark Doliner <markdoliner@pidgin.im>
parents:
7166
diff
changeset
|
427 | * @param list Destination chain. |
|
9cfb68a44e17
[gaim-migrate @ 7734]
Mark Doliner <markdoliner@pidgin.im>
parents:
7166
diff
changeset
|
428 | * @param type TLV type to add. |
|
9cfb68a44e17
[gaim-migrate @ 7734]
Mark Doliner <markdoliner@pidgin.im>
parents:
7166
diff
changeset
|
429 | * @param value Value to add. |
|
8735
01248ea222d3
[gaim-migrate @ 9490]
Jonathan Champ <royanee@users.sourceforge.net>
parents:
8225
diff
changeset
|
430 | * @return The size of the value added. |
| 2086 | 431 | */ |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13240
diff
changeset
|
432 | int aim_tlvlist_add_32(aim_tlvlist_t **list, const guint16 type, const guint32 value) |
| 2086 | 433 | { |
|
13235
72bddc689630
[gaim-migrate @ 15600]
Mark Doliner <markdoliner@pidgin.im>
parents:
11285
diff
changeset
|
434 | guint8 v32[4]; |
| 2086 | 435 | |
|
7167
9cfb68a44e17
[gaim-migrate @ 7734]
Mark Doliner <markdoliner@pidgin.im>
parents:
7166
diff
changeset
|
436 | aimutil_put32(v32, value); |
| 2086 | 437 | |
|
7167
9cfb68a44e17
[gaim-migrate @ 7734]
Mark Doliner <markdoliner@pidgin.im>
parents:
7166
diff
changeset
|
438 | return aim_tlvlist_add_raw(list, type, 4, v32); |
| 2086 | 439 | } |
| 440 | ||
| 441 | /** | |
|
10986
92a91fb514f4
[gaim-migrate @ 12822]
Mark Doliner <markdoliner@pidgin.im>
parents:
9933
diff
changeset
|
442 | * Add a string to a TLV chain. |
|
92a91fb514f4
[gaim-migrate @ 12822]
Mark Doliner <markdoliner@pidgin.im>
parents:
9933
diff
changeset
|
443 | * |
|
92a91fb514f4
[gaim-migrate @ 12822]
Mark Doliner <markdoliner@pidgin.im>
parents:
9933
diff
changeset
|
444 | * @param list Destination chain. |
|
92a91fb514f4
[gaim-migrate @ 12822]
Mark Doliner <markdoliner@pidgin.im>
parents:
9933
diff
changeset
|
445 | * @param type TLV type to add. |
|
92a91fb514f4
[gaim-migrate @ 12822]
Mark Doliner <markdoliner@pidgin.im>
parents:
9933
diff
changeset
|
446 | * @param value Value to add. |
|
92a91fb514f4
[gaim-migrate @ 12822]
Mark Doliner <markdoliner@pidgin.im>
parents:
9933
diff
changeset
|
447 | * @return The size of the value added. |
|
92a91fb514f4
[gaim-migrate @ 12822]
Mark Doliner <markdoliner@pidgin.im>
parents:
9933
diff
changeset
|
448 | */ |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13240
diff
changeset
|
449 | int aim_tlvlist_add_str(aim_tlvlist_t **list, const guint16 type, const char *value) |
|
10986
92a91fb514f4
[gaim-migrate @ 12822]
Mark Doliner <markdoliner@pidgin.im>
parents:
9933
diff
changeset
|
450 | { |
|
13235
72bddc689630
[gaim-migrate @ 15600]
Mark Doliner <markdoliner@pidgin.im>
parents:
11285
diff
changeset
|
451 | return aim_tlvlist_add_raw(list, type, strlen(value), (guint8 *)value); |
|
10986
92a91fb514f4
[gaim-migrate @ 12822]
Mark Doliner <markdoliner@pidgin.im>
parents:
9933
diff
changeset
|
452 | } |
|
92a91fb514f4
[gaim-migrate @ 12822]
Mark Doliner <markdoliner@pidgin.im>
parents:
9933
diff
changeset
|
453 | |
|
92a91fb514f4
[gaim-migrate @ 12822]
Mark Doliner <markdoliner@pidgin.im>
parents:
9933
diff
changeset
|
454 | /** |
| 2086 | 455 | * Adds a block of capability blocks to a TLV chain. The bitfield |
| 456 | * passed in should be a bitwise %OR of any of the %AIM_CAPS constants: | |
| 457 | * | |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13240
diff
changeset
|
458 | * %OSCAR_CAPABILITY_BUDDYICON Supports Buddy Icons |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13240
diff
changeset
|
459 | * %OSCAR_CAPABILITY_TALK Supports Voice Chat |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13240
diff
changeset
|
460 | * %OSCAR_CAPABILITY_IMIMAGE Supports DirectIM/IMImage |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13240
diff
changeset
|
461 | * %OSCAR_CAPABILITY_CHAT Supports Chat |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13240
diff
changeset
|
462 | * %OSCAR_CAPABILITY_GETFILE Supports Get File functions |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13240
diff
changeset
|
463 | * %OSCAR_CAPABILITY_SENDFILE Supports Send File functions |
| 2086 | 464 | * |
|
7158
2bdbaa3a8468
[gaim-migrate @ 7725]
Mark Doliner <markdoliner@pidgin.im>
parents:
7011
diff
changeset
|
465 | * @param list Destination chain |
|
2bdbaa3a8468
[gaim-migrate @ 7725]
Mark Doliner <markdoliner@pidgin.im>
parents:
7011
diff
changeset
|
466 | * @param type TLV type to add |
|
2bdbaa3a8468
[gaim-migrate @ 7725]
Mark Doliner <markdoliner@pidgin.im>
parents:
7011
diff
changeset
|
467 | * @param caps Bitfield of capability flags to send |
|
8735
01248ea222d3
[gaim-migrate @ 9490]
Jonathan Champ <royanee@users.sourceforge.net>
parents:
8225
diff
changeset
|
468 | * @return The size of the value added. |
| 2086 | 469 | */ |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13240
diff
changeset
|
470 | int aim_tlvlist_add_caps(aim_tlvlist_t **list, const guint16 type, const guint32 caps) |
| 2086 | 471 | { |
|
13235
72bddc689630
[gaim-migrate @ 15600]
Mark Doliner <markdoliner@pidgin.im>
parents:
11285
diff
changeset
|
472 | guint8 buf[16*16]; /* XXX icky fixed length buffer */ |
|
13240
db5187cc40d1
[gaim-migrate @ 15605]
Mark Doliner <markdoliner@pidgin.im>
parents:
13235
diff
changeset
|
473 | ByteStream bs; |
| 2086 | 474 | |
|
2421
009ae3cf0e83
[gaim-migrate @ 2434]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2270
diff
changeset
|
475 | if (!caps) |
|
009ae3cf0e83
[gaim-migrate @ 2434]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2270
diff
changeset
|
476 | return 0; /* nothing there anyway */ |
|
009ae3cf0e83
[gaim-migrate @ 2434]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2270
diff
changeset
|
477 | |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13240
diff
changeset
|
478 | byte_stream_init(&bs, buf, sizeof(buf)); |
| 2086 | 479 | |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13240
diff
changeset
|
480 | byte_stream_putcaps(&bs, caps); |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
481 | |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13240
diff
changeset
|
482 | return aim_tlvlist_add_raw(list, type, byte_stream_curpos(&bs), buf); |
| 2086 | 483 | } |
| 484 | ||
|
7167
9cfb68a44e17
[gaim-migrate @ 7734]
Mark Doliner <markdoliner@pidgin.im>
parents:
7166
diff
changeset
|
485 | /** |
|
9cfb68a44e17
[gaim-migrate @ 7734]
Mark Doliner <markdoliner@pidgin.im>
parents:
7166
diff
changeset
|
486 | * Adds the given userinfo struct to a TLV chain. |
|
9cfb68a44e17
[gaim-migrate @ 7734]
Mark Doliner <markdoliner@pidgin.im>
parents:
7166
diff
changeset
|
487 | * |
|
9cfb68a44e17
[gaim-migrate @ 7734]
Mark Doliner <markdoliner@pidgin.im>
parents:
7166
diff
changeset
|
488 | * @param list Destination chain. |
|
9cfb68a44e17
[gaim-migrate @ 7734]
Mark Doliner <markdoliner@pidgin.im>
parents:
7166
diff
changeset
|
489 | * @param type TLV type to add. |
|
8735
01248ea222d3
[gaim-migrate @ 9490]
Jonathan Champ <royanee@users.sourceforge.net>
parents:
8225
diff
changeset
|
490 | * @return The size of the value added. |
|
7167
9cfb68a44e17
[gaim-migrate @ 7734]
Mark Doliner <markdoliner@pidgin.im>
parents:
7166
diff
changeset
|
491 | */ |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13240
diff
changeset
|
492 | int aim_tlvlist_add_userinfo(aim_tlvlist_t **list, guint16 type, aim_userinfo_t *userinfo) |
|
2270
c65fc356fb68
[gaim-migrate @ 2280]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2246
diff
changeset
|
493 | { |
|
13235
72bddc689630
[gaim-migrate @ 15600]
Mark Doliner <markdoliner@pidgin.im>
parents:
11285
diff
changeset
|
494 | guint8 buf[1024]; /* bleh */ |
|
13240
db5187cc40d1
[gaim-migrate @ 15605]
Mark Doliner <markdoliner@pidgin.im>
parents:
13235
diff
changeset
|
495 | ByteStream bs; |
|
2270
c65fc356fb68
[gaim-migrate @ 2280]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2246
diff
changeset
|
496 | |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13240
diff
changeset
|
497 | byte_stream_init(&bs, buf, sizeof(buf)); |
|
2270
c65fc356fb68
[gaim-migrate @ 2280]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2246
diff
changeset
|
498 | |
|
7167
9cfb68a44e17
[gaim-migrate @ 7734]
Mark Doliner <markdoliner@pidgin.im>
parents:
7166
diff
changeset
|
499 | aim_putuserinfo(&bs, userinfo); |
|
2270
c65fc356fb68
[gaim-migrate @ 2280]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2246
diff
changeset
|
500 | |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13240
diff
changeset
|
501 | return aim_tlvlist_add_raw(list, type, byte_stream_curpos(&bs), buf); |
|
2270
c65fc356fb68
[gaim-migrate @ 2280]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2246
diff
changeset
|
502 | } |
|
c65fc356fb68
[gaim-migrate @ 2280]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2246
diff
changeset
|
503 | |
| 2086 | 504 | /** |
|
8225
4ef47db8c9bc
[gaim-migrate @ 8948]
Mark Doliner <markdoliner@pidgin.im>
parents:
8092
diff
changeset
|
505 | * Adds the given chatroom info to a TLV chain. |
|
4ef47db8c9bc
[gaim-migrate @ 8948]
Mark Doliner <markdoliner@pidgin.im>
parents:
8092
diff
changeset
|
506 | * |
|
4ef47db8c9bc
[gaim-migrate @ 8948]
Mark Doliner <markdoliner@pidgin.im>
parents:
8092
diff
changeset
|
507 | * @param list Destination chain. |
|
4ef47db8c9bc
[gaim-migrate @ 8948]
Mark Doliner <markdoliner@pidgin.im>
parents:
8092
diff
changeset
|
508 | * @param type TLV type to add. |
|
4ef47db8c9bc
[gaim-migrate @ 8948]
Mark Doliner <markdoliner@pidgin.im>
parents:
8092
diff
changeset
|
509 | * @param roomname The name of the chat. |
|
4ef47db8c9bc
[gaim-migrate @ 8948]
Mark Doliner <markdoliner@pidgin.im>
parents:
8092
diff
changeset
|
510 | * @param instance The instance. |
|
8735
01248ea222d3
[gaim-migrate @ 9490]
Jonathan Champ <royanee@users.sourceforge.net>
parents:
8225
diff
changeset
|
511 | * @return The size of the value added. |
|
8225
4ef47db8c9bc
[gaim-migrate @ 8948]
Mark Doliner <markdoliner@pidgin.im>
parents:
8092
diff
changeset
|
512 | */ |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13240
diff
changeset
|
513 | int aim_tlvlist_add_chatroom(aim_tlvlist_t **list, guint16 type, guint16 exchange, const char *roomname, guint16 instance) |
|
8225
4ef47db8c9bc
[gaim-migrate @ 8948]
Mark Doliner <markdoliner@pidgin.im>
parents:
8092
diff
changeset
|
514 | { |
|
4ef47db8c9bc
[gaim-migrate @ 8948]
Mark Doliner <markdoliner@pidgin.im>
parents:
8092
diff
changeset
|
515 | int len; |
|
13240
db5187cc40d1
[gaim-migrate @ 15605]
Mark Doliner <markdoliner@pidgin.im>
parents:
13235
diff
changeset
|
516 | ByteStream bs; |
|
8225
4ef47db8c9bc
[gaim-migrate @ 8948]
Mark Doliner <markdoliner@pidgin.im>
parents:
8092
diff
changeset
|
517 | |
|
15151
bb985812fefa
[gaim-migrate @ 17875]
Mark Doliner <markdoliner@pidgin.im>
parents:
14254
diff
changeset
|
518 | byte_stream_new(&bs, 2 + 1 + strlen(roomname) + 2); |
|
8225
4ef47db8c9bc
[gaim-migrate @ 8948]
Mark Doliner <markdoliner@pidgin.im>
parents:
8092
diff
changeset
|
519 | |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13240
diff
changeset
|
520 | byte_stream_put16(&bs, exchange); |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13240
diff
changeset
|
521 | byte_stream_put8(&bs, strlen(roomname)); |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13240
diff
changeset
|
522 | byte_stream_putstr(&bs, roomname); |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13240
diff
changeset
|
523 | byte_stream_put16(&bs, instance); |
|
8225
4ef47db8c9bc
[gaim-migrate @ 8948]
Mark Doliner <markdoliner@pidgin.im>
parents:
8092
diff
changeset
|
524 | |
|
15151
bb985812fefa
[gaim-migrate @ 17875]
Mark Doliner <markdoliner@pidgin.im>
parents:
14254
diff
changeset
|
525 | len = aim_tlvlist_add_raw(list, type, byte_stream_curpos(&bs), bs.data); |
|
8225
4ef47db8c9bc
[gaim-migrate @ 8948]
Mark Doliner <markdoliner@pidgin.im>
parents:
8092
diff
changeset
|
526 | |
|
15151
bb985812fefa
[gaim-migrate @ 17875]
Mark Doliner <markdoliner@pidgin.im>
parents:
14254
diff
changeset
|
527 | g_free(bs.data); |
|
8225
4ef47db8c9bc
[gaim-migrate @ 8948]
Mark Doliner <markdoliner@pidgin.im>
parents:
8092
diff
changeset
|
528 | |
|
4ef47db8c9bc
[gaim-migrate @ 8948]
Mark Doliner <markdoliner@pidgin.im>
parents:
8092
diff
changeset
|
529 | return len; |
|
4ef47db8c9bc
[gaim-migrate @ 8948]
Mark Doliner <markdoliner@pidgin.im>
parents:
8092
diff
changeset
|
530 | } |
|
4ef47db8c9bc
[gaim-migrate @ 8948]
Mark Doliner <markdoliner@pidgin.im>
parents:
8092
diff
changeset
|
531 | |
|
4ef47db8c9bc
[gaim-migrate @ 8948]
Mark Doliner <markdoliner@pidgin.im>
parents:
8092
diff
changeset
|
532 | /** |
| 2086 | 533 | * Adds a TLV with a zero length to a TLV chain. |
| 534 | * | |
|
7167
9cfb68a44e17
[gaim-migrate @ 7734]
Mark Doliner <markdoliner@pidgin.im>
parents:
7166
diff
changeset
|
535 | * @param list Destination chain. |
|
9cfb68a44e17
[gaim-migrate @ 7734]
Mark Doliner <markdoliner@pidgin.im>
parents:
7166
diff
changeset
|
536 | * @param type TLV type to add. |
|
8735
01248ea222d3
[gaim-migrate @ 9490]
Jonathan Champ <royanee@users.sourceforge.net>
parents:
8225
diff
changeset
|
537 | * @return The size of the value added. |
| 2086 | 538 | */ |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13240
diff
changeset
|
539 | int aim_tlvlist_add_noval(aim_tlvlist_t **list, const guint16 type) |
| 2086 | 540 | { |
|
7167
9cfb68a44e17
[gaim-migrate @ 7734]
Mark Doliner <markdoliner@pidgin.im>
parents:
7166
diff
changeset
|
541 | return aim_tlvlist_add_raw(list, type, 0, NULL); |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
542 | } |
| 2086 | 543 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
544 | /* |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
545 | * Note that the inner TLV chain will not be modifiable as a tlvchain once |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
546 | * it is written using this. Or rather, it can be, but updates won't be |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
547 | * made to this. |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
548 | * |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
549 | * XXX should probably support sublists for real. |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13240
diff
changeset
|
550 | * |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
551 | * This is so neat. |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
552 | * |
|
8790
3d6d2e2f6296
[gaim-migrate @ 9552]
Jonathan Champ <royanee@users.sourceforge.net>
parents:
8735
diff
changeset
|
553 | * @param list Destination chain. |
|
3d6d2e2f6296
[gaim-migrate @ 9552]
Jonathan Champ <royanee@users.sourceforge.net>
parents:
8735
diff
changeset
|
554 | * @param type TLV type to add. |
|
3d6d2e2f6296
[gaim-migrate @ 9552]
Jonathan Champ <royanee@users.sourceforge.net>
parents:
8735
diff
changeset
|
555 | * @param t1 The TLV chain you want to write. |
|
8794
4c2c247ef665
[gaim-migrate @ 9556]
Mark Doliner <markdoliner@pidgin.im>
parents:
8790
diff
changeset
|
556 | * @return The number of bytes written to the destination TLV chain. |
|
4c2c247ef665
[gaim-migrate @ 9556]
Mark Doliner <markdoliner@pidgin.im>
parents:
8790
diff
changeset
|
557 | * 0 is returned if there was an error or if the destination |
|
4c2c247ef665
[gaim-migrate @ 9556]
Mark Doliner <markdoliner@pidgin.im>
parents:
8790
diff
changeset
|
558 | * TLV chain has length 0. |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
559 | */ |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13240
diff
changeset
|
560 | int aim_tlvlist_add_frozentlvlist(aim_tlvlist_t **list, guint16 type, aim_tlvlist_t **tl) |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
561 | { |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
562 | int buflen; |
|
13240
db5187cc40d1
[gaim-migrate @ 15605]
Mark Doliner <markdoliner@pidgin.im>
parents:
13235
diff
changeset
|
563 | ByteStream bs; |
| 2086 | 564 | |
|
7167
9cfb68a44e17
[gaim-migrate @ 7734]
Mark Doliner <markdoliner@pidgin.im>
parents:
7166
diff
changeset
|
565 | buflen = aim_tlvlist_size(tl); |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
566 | |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
567 | if (buflen <= 0) |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
568 | return 0; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
569 | |
|
15151
bb985812fefa
[gaim-migrate @ 17875]
Mark Doliner <markdoliner@pidgin.im>
parents:
14254
diff
changeset
|
570 | byte_stream_new(&bs, buflen); |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
571 | |
|
7167
9cfb68a44e17
[gaim-migrate @ 7734]
Mark Doliner <markdoliner@pidgin.im>
parents:
7166
diff
changeset
|
572 | aim_tlvlist_write(&bs, tl); |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
573 | |
|
15151
bb985812fefa
[gaim-migrate @ 17875]
Mark Doliner <markdoliner@pidgin.im>
parents:
14254
diff
changeset
|
574 | aim_tlvlist_add_raw(list, type, byte_stream_curpos(&bs), bs.data); |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
575 | |
|
15151
bb985812fefa
[gaim-migrate @ 17875]
Mark Doliner <markdoliner@pidgin.im>
parents:
14254
diff
changeset
|
576 | g_free(bs.data); |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
577 | |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
578 | return buflen; |
| 2086 | 579 | } |
| 580 | ||
| 581 | /** | |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13240
diff
changeset
|
582 | * Substitute a TLV of a given type with a new TLV of the same type. If |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13240
diff
changeset
|
583 | * you attempt to replace a TLV that does not exist, this function will |
|
7167
9cfb68a44e17
[gaim-migrate @ 7734]
Mark Doliner <markdoliner@pidgin.im>
parents:
7166
diff
changeset
|
584 | * just add a new TLV as if you called aim_tlvlist_add_raw(). |
|
7166
70825074f830
[gaim-migrate @ 7733]
Mark Doliner <markdoliner@pidgin.im>
parents:
7158
diff
changeset
|
585 | * |
|
70825074f830
[gaim-migrate @ 7733]
Mark Doliner <markdoliner@pidgin.im>
parents:
7158
diff
changeset
|
586 | * @param list Desination chain (%NULL pointer if empty). |
|
70825074f830
[gaim-migrate @ 7733]
Mark Doliner <markdoliner@pidgin.im>
parents:
7158
diff
changeset
|
587 | * @param type TLV type. |
|
70825074f830
[gaim-migrate @ 7733]
Mark Doliner <markdoliner@pidgin.im>
parents:
7158
diff
changeset
|
588 | * @param length Length of string to add (not including %NULL). |
|
70825074f830
[gaim-migrate @ 7733]
Mark Doliner <markdoliner@pidgin.im>
parents:
7158
diff
changeset
|
589 | * @param value String to add. |
|
70825074f830
[gaim-migrate @ 7733]
Mark Doliner <markdoliner@pidgin.im>
parents:
7158
diff
changeset
|
590 | * @return The length of the TLV. |
|
70825074f830
[gaim-migrate @ 7733]
Mark Doliner <markdoliner@pidgin.im>
parents:
7158
diff
changeset
|
591 | */ |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13240
diff
changeset
|
592 | int aim_tlvlist_replace_raw(aim_tlvlist_t **list, const guint16 type, const guint16 length, const guint8 *value) |
|
7166
70825074f830
[gaim-migrate @ 7733]
Mark Doliner <markdoliner@pidgin.im>
parents:
7158
diff
changeset
|
593 | { |
|
70825074f830
[gaim-migrate @ 7733]
Mark Doliner <markdoliner@pidgin.im>
parents:
7158
diff
changeset
|
594 | aim_tlvlist_t *cur; |
|
70825074f830
[gaim-migrate @ 7733]
Mark Doliner <markdoliner@pidgin.im>
parents:
7158
diff
changeset
|
595 | |
|
70825074f830
[gaim-migrate @ 7733]
Mark Doliner <markdoliner@pidgin.im>
parents:
7158
diff
changeset
|
596 | if (list == NULL) |
|
70825074f830
[gaim-migrate @ 7733]
Mark Doliner <markdoliner@pidgin.im>
parents:
7158
diff
changeset
|
597 | return 0; |
|
70825074f830
[gaim-migrate @ 7733]
Mark Doliner <markdoliner@pidgin.im>
parents:
7158
diff
changeset
|
598 | |
|
70825074f830
[gaim-migrate @ 7733]
Mark Doliner <markdoliner@pidgin.im>
parents:
7158
diff
changeset
|
599 | for (cur = *list; ((cur != NULL) && (cur->tlv->type != type)); cur = cur->next); |
|
70825074f830
[gaim-migrate @ 7733]
Mark Doliner <markdoliner@pidgin.im>
parents:
7158
diff
changeset
|
600 | if (cur == NULL) |
|
7167
9cfb68a44e17
[gaim-migrate @ 7734]
Mark Doliner <markdoliner@pidgin.im>
parents:
7166
diff
changeset
|
601 | return aim_tlvlist_add_raw(list, type, length, value); |
|
7166
70825074f830
[gaim-migrate @ 7733]
Mark Doliner <markdoliner@pidgin.im>
parents:
7158
diff
changeset
|
602 | |
|
70825074f830
[gaim-migrate @ 7733]
Mark Doliner <markdoliner@pidgin.im>
parents:
7158
diff
changeset
|
603 | free(cur->tlv->value); |
|
70825074f830
[gaim-migrate @ 7733]
Mark Doliner <markdoliner@pidgin.im>
parents:
7158
diff
changeset
|
604 | cur->tlv->length = length; |
|
70825074f830
[gaim-migrate @ 7733]
Mark Doliner <markdoliner@pidgin.im>
parents:
7158
diff
changeset
|
605 | if (cur->tlv->length > 0) { |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13240
diff
changeset
|
606 | cur->tlv->value = g_memdup(value, length); |
|
7166
70825074f830
[gaim-migrate @ 7733]
Mark Doliner <markdoliner@pidgin.im>
parents:
7158
diff
changeset
|
607 | } else |
|
70825074f830
[gaim-migrate @ 7733]
Mark Doliner <markdoliner@pidgin.im>
parents:
7158
diff
changeset
|
608 | cur->tlv->value = NULL; |
|
70825074f830
[gaim-migrate @ 7733]
Mark Doliner <markdoliner@pidgin.im>
parents:
7158
diff
changeset
|
609 | |
|
70825074f830
[gaim-migrate @ 7733]
Mark Doliner <markdoliner@pidgin.im>
parents:
7158
diff
changeset
|
610 | return cur->tlv->length; |
|
70825074f830
[gaim-migrate @ 7733]
Mark Doliner <markdoliner@pidgin.im>
parents:
7158
diff
changeset
|
611 | } |
|
70825074f830
[gaim-migrate @ 7733]
Mark Doliner <markdoliner@pidgin.im>
parents:
7158
diff
changeset
|
612 | |
|
70825074f830
[gaim-migrate @ 7733]
Mark Doliner <markdoliner@pidgin.im>
parents:
7158
diff
changeset
|
613 | /** |
|
11159
76ef02141bcb
[gaim-migrate @ 13246]
Mark Doliner <markdoliner@pidgin.im>
parents:
10993
diff
changeset
|
614 | * Substitute a TLV of a given type with a new TLV of the same type. If |
|
76ef02141bcb
[gaim-migrate @ 13246]
Mark Doliner <markdoliner@pidgin.im>
parents:
10993
diff
changeset
|
615 | * you attempt to replace a TLV that does not exist, this function will |
|
10993
8c992e277e86
[gaim-migrate @ 12831]
Mark Doliner <markdoliner@pidgin.im>
parents:
10991
diff
changeset
|
616 | * just add a new TLV as if you called aim_tlvlist_add_str(). |
|
8c992e277e86
[gaim-migrate @ 12831]
Mark Doliner <markdoliner@pidgin.im>
parents:
10991
diff
changeset
|
617 | * |
|
8c992e277e86
[gaim-migrate @ 12831]
Mark Doliner <markdoliner@pidgin.im>
parents:
10991
diff
changeset
|
618 | * @param list Desination chain (%NULL pointer if empty). |
|
8c992e277e86
[gaim-migrate @ 12831]
Mark Doliner <markdoliner@pidgin.im>
parents:
10991
diff
changeset
|
619 | * @param type TLV type. |
|
8c992e277e86
[gaim-migrate @ 12831]
Mark Doliner <markdoliner@pidgin.im>
parents:
10991
diff
changeset
|
620 | * @param str String to add. |
|
8c992e277e86
[gaim-migrate @ 12831]
Mark Doliner <markdoliner@pidgin.im>
parents:
10991
diff
changeset
|
621 | * @return The length of the TLV. |
|
8c992e277e86
[gaim-migrate @ 12831]
Mark Doliner <markdoliner@pidgin.im>
parents:
10991
diff
changeset
|
622 | */ |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13240
diff
changeset
|
623 | int aim_tlvlist_replace_str(aim_tlvlist_t **list, const guint16 type, const char *str) |
|
10993
8c992e277e86
[gaim-migrate @ 12831]
Mark Doliner <markdoliner@pidgin.im>
parents:
10991
diff
changeset
|
624 | { |
|
11159
76ef02141bcb
[gaim-migrate @ 13246]
Mark Doliner <markdoliner@pidgin.im>
parents:
10993
diff
changeset
|
625 | return aim_tlvlist_replace_raw(list, type, strlen(str), (const guchar *)str); |
|
10993
8c992e277e86
[gaim-migrate @ 12831]
Mark Doliner <markdoliner@pidgin.im>
parents:
10991
diff
changeset
|
626 | } |
|
8c992e277e86
[gaim-migrate @ 12831]
Mark Doliner <markdoliner@pidgin.im>
parents:
10991
diff
changeset
|
627 | |
|
8c992e277e86
[gaim-migrate @ 12831]
Mark Doliner <markdoliner@pidgin.im>
parents:
10991
diff
changeset
|
628 | /** |
|
11159
76ef02141bcb
[gaim-migrate @ 13246]
Mark Doliner <markdoliner@pidgin.im>
parents:
10993
diff
changeset
|
629 | * Substitute a TLV of a given type with a new TLV of the same type. If |
|
76ef02141bcb
[gaim-migrate @ 13246]
Mark Doliner <markdoliner@pidgin.im>
parents:
10993
diff
changeset
|
630 | * you attempt to replace a TLV that does not exist, this function will |
|
7167
9cfb68a44e17
[gaim-migrate @ 7734]
Mark Doliner <markdoliner@pidgin.im>
parents:
7166
diff
changeset
|
631 | * just add a new TLV as if you called aim_tlvlist_add_raw(). |
|
7166
70825074f830
[gaim-migrate @ 7733]
Mark Doliner <markdoliner@pidgin.im>
parents:
7158
diff
changeset
|
632 | * |
|
70825074f830
[gaim-migrate @ 7733]
Mark Doliner <markdoliner@pidgin.im>
parents:
7158
diff
changeset
|
633 | * @param list Desination chain (%NULL pointer if empty). |
|
70825074f830
[gaim-migrate @ 7733]
Mark Doliner <markdoliner@pidgin.im>
parents:
7158
diff
changeset
|
634 | * @param type TLV type. |
|
70825074f830
[gaim-migrate @ 7733]
Mark Doliner <markdoliner@pidgin.im>
parents:
7158
diff
changeset
|
635 | * @return The length of the TLV. |
|
70825074f830
[gaim-migrate @ 7733]
Mark Doliner <markdoliner@pidgin.im>
parents:
7158
diff
changeset
|
636 | */ |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13240
diff
changeset
|
637 | int aim_tlvlist_replace_noval(aim_tlvlist_t **list, const guint16 type) |
|
7166
70825074f830
[gaim-migrate @ 7733]
Mark Doliner <markdoliner@pidgin.im>
parents:
7158
diff
changeset
|
638 | { |
|
70825074f830
[gaim-migrate @ 7733]
Mark Doliner <markdoliner@pidgin.im>
parents:
7158
diff
changeset
|
639 | return aim_tlvlist_replace_raw(list, type, 0, NULL); |
|
70825074f830
[gaim-migrate @ 7733]
Mark Doliner <markdoliner@pidgin.im>
parents:
7158
diff
changeset
|
640 | } |
|
70825074f830
[gaim-migrate @ 7733]
Mark Doliner <markdoliner@pidgin.im>
parents:
7158
diff
changeset
|
641 | |
|
70825074f830
[gaim-migrate @ 7733]
Mark Doliner <markdoliner@pidgin.im>
parents:
7158
diff
changeset
|
642 | /** |
|
11159
76ef02141bcb
[gaim-migrate @ 13246]
Mark Doliner <markdoliner@pidgin.im>
parents:
10993
diff
changeset
|
643 | * Substitute a TLV of a given type with a new TLV of the same type. If |
|
76ef02141bcb
[gaim-migrate @ 13246]
Mark Doliner <markdoliner@pidgin.im>
parents:
10993
diff
changeset
|
644 | * you attempt to replace a TLV that does not exist, this function will |
|
7167
9cfb68a44e17
[gaim-migrate @ 7734]
Mark Doliner <markdoliner@pidgin.im>
parents:
7166
diff
changeset
|
645 | * just add a new TLV as if you called aim_tlvlist_add_raw(). |
|
7166
70825074f830
[gaim-migrate @ 7733]
Mark Doliner <markdoliner@pidgin.im>
parents:
7158
diff
changeset
|
646 | * |
|
70825074f830
[gaim-migrate @ 7733]
Mark Doliner <markdoliner@pidgin.im>
parents:
7158
diff
changeset
|
647 | * @param list Desination chain (%NULL pointer if empty). |
|
70825074f830
[gaim-migrate @ 7733]
Mark Doliner <markdoliner@pidgin.im>
parents:
7158
diff
changeset
|
648 | * @param type TLV type. |
|
70825074f830
[gaim-migrate @ 7733]
Mark Doliner <markdoliner@pidgin.im>
parents:
7158
diff
changeset
|
649 | * @param value 8 bit value to add. |
|
70825074f830
[gaim-migrate @ 7733]
Mark Doliner <markdoliner@pidgin.im>
parents:
7158
diff
changeset
|
650 | * @return The length of the TLV. |
|
70825074f830
[gaim-migrate @ 7733]
Mark Doliner <markdoliner@pidgin.im>
parents:
7158
diff
changeset
|
651 | */ |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13240
diff
changeset
|
652 | int aim_tlvlist_replace_8(aim_tlvlist_t **list, const guint16 type, const guint8 value) |
|
7166
70825074f830
[gaim-migrate @ 7733]
Mark Doliner <markdoliner@pidgin.im>
parents:
7158
diff
changeset
|
653 | { |
|
13235
72bddc689630
[gaim-migrate @ 15600]
Mark Doliner <markdoliner@pidgin.im>
parents:
11285
diff
changeset
|
654 | guint8 v8[1]; |
|
7166
70825074f830
[gaim-migrate @ 7733]
Mark Doliner <markdoliner@pidgin.im>
parents:
7158
diff
changeset
|
655 | |
|
70825074f830
[gaim-migrate @ 7733]
Mark Doliner <markdoliner@pidgin.im>
parents:
7158
diff
changeset
|
656 | aimutil_put8(v8, value); |
|
70825074f830
[gaim-migrate @ 7733]
Mark Doliner <markdoliner@pidgin.im>
parents:
7158
diff
changeset
|
657 | |
|
70825074f830
[gaim-migrate @ 7733]
Mark Doliner <markdoliner@pidgin.im>
parents:
7158
diff
changeset
|
658 | return aim_tlvlist_replace_raw(list, type, 1, v8); |
|
70825074f830
[gaim-migrate @ 7733]
Mark Doliner <markdoliner@pidgin.im>
parents:
7158
diff
changeset
|
659 | } |
|
70825074f830
[gaim-migrate @ 7733]
Mark Doliner <markdoliner@pidgin.im>
parents:
7158
diff
changeset
|
660 | |
|
70825074f830
[gaim-migrate @ 7733]
Mark Doliner <markdoliner@pidgin.im>
parents:
7158
diff
changeset
|
661 | /** |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13240
diff
changeset
|
662 | * Substitute a TLV of a given type with a new TLV of the same type. If |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13240
diff
changeset
|
663 | * you attempt to replace a TLV that does not exist, this function will |
|
7167
9cfb68a44e17
[gaim-migrate @ 7734]
Mark Doliner <markdoliner@pidgin.im>
parents:
7166
diff
changeset
|
664 | * just add a new TLV as if you called aim_tlvlist_add_raw(). |
|
7166
70825074f830
[gaim-migrate @ 7733]
Mark Doliner <markdoliner@pidgin.im>
parents:
7158
diff
changeset
|
665 | * |
|
70825074f830
[gaim-migrate @ 7733]
Mark Doliner <markdoliner@pidgin.im>
parents:
7158
diff
changeset
|
666 | * @param list Desination chain (%NULL pointer if empty). |
|
70825074f830
[gaim-migrate @ 7733]
Mark Doliner <markdoliner@pidgin.im>
parents:
7158
diff
changeset
|
667 | * @param type TLV type. |
|
70825074f830
[gaim-migrate @ 7733]
Mark Doliner <markdoliner@pidgin.im>
parents:
7158
diff
changeset
|
668 | * @param value 32 bit value to add. |
|
70825074f830
[gaim-migrate @ 7733]
Mark Doliner <markdoliner@pidgin.im>
parents:
7158
diff
changeset
|
669 | * @return The length of the TLV. |
|
70825074f830
[gaim-migrate @ 7733]
Mark Doliner <markdoliner@pidgin.im>
parents:
7158
diff
changeset
|
670 | */ |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13240
diff
changeset
|
671 | int aim_tlvlist_replace_32(aim_tlvlist_t **list, const guint16 type, const guint32 value) |
|
7166
70825074f830
[gaim-migrate @ 7733]
Mark Doliner <markdoliner@pidgin.im>
parents:
7158
diff
changeset
|
672 | { |
|
13235
72bddc689630
[gaim-migrate @ 15600]
Mark Doliner <markdoliner@pidgin.im>
parents:
11285
diff
changeset
|
673 | guint8 v32[4]; |
|
7166
70825074f830
[gaim-migrate @ 7733]
Mark Doliner <markdoliner@pidgin.im>
parents:
7158
diff
changeset
|
674 | |
|
70825074f830
[gaim-migrate @ 7733]
Mark Doliner <markdoliner@pidgin.im>
parents:
7158
diff
changeset
|
675 | aimutil_put32(v32, value); |
|
70825074f830
[gaim-migrate @ 7733]
Mark Doliner <markdoliner@pidgin.im>
parents:
7158
diff
changeset
|
676 | |
|
70825074f830
[gaim-migrate @ 7733]
Mark Doliner <markdoliner@pidgin.im>
parents:
7158
diff
changeset
|
677 | return aim_tlvlist_replace_raw(list, type, 4, v32); |
|
70825074f830
[gaim-migrate @ 7733]
Mark Doliner <markdoliner@pidgin.im>
parents:
7158
diff
changeset
|
678 | } |
|
70825074f830
[gaim-migrate @ 7733]
Mark Doliner <markdoliner@pidgin.im>
parents:
7158
diff
changeset
|
679 | |
|
70825074f830
[gaim-migrate @ 7733]
Mark Doliner <markdoliner@pidgin.im>
parents:
7158
diff
changeset
|
680 | /** |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13240
diff
changeset
|
681 | * Remove a TLV of a given type. If you attempt to remove a TLV that |
|
7166
70825074f830
[gaim-migrate @ 7733]
Mark Doliner <markdoliner@pidgin.im>
parents:
7158
diff
changeset
|
682 | * does not exist, nothing happens. |
|
70825074f830
[gaim-migrate @ 7733]
Mark Doliner <markdoliner@pidgin.im>
parents:
7158
diff
changeset
|
683 | * |
|
70825074f830
[gaim-migrate @ 7733]
Mark Doliner <markdoliner@pidgin.im>
parents:
7158
diff
changeset
|
684 | * @param list Desination chain (%NULL pointer if empty). |
|
70825074f830
[gaim-migrate @ 7733]
Mark Doliner <markdoliner@pidgin.im>
parents:
7158
diff
changeset
|
685 | * @param type TLV type. |
|
70825074f830
[gaim-migrate @ 7733]
Mark Doliner <markdoliner@pidgin.im>
parents:
7158
diff
changeset
|
686 | */ |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13240
diff
changeset
|
687 | void aim_tlvlist_remove(aim_tlvlist_t **list, const guint16 type) |
|
7166
70825074f830
[gaim-migrate @ 7733]
Mark Doliner <markdoliner@pidgin.im>
parents:
7158
diff
changeset
|
688 | { |
|
70825074f830
[gaim-migrate @ 7733]
Mark Doliner <markdoliner@pidgin.im>
parents:
7158
diff
changeset
|
689 | aim_tlvlist_t *del; |
|
70825074f830
[gaim-migrate @ 7733]
Mark Doliner <markdoliner@pidgin.im>
parents:
7158
diff
changeset
|
690 | |
|
70825074f830
[gaim-migrate @ 7733]
Mark Doliner <markdoliner@pidgin.im>
parents:
7158
diff
changeset
|
691 | if (!list || !(*list)) |
|
70825074f830
[gaim-migrate @ 7733]
Mark Doliner <markdoliner@pidgin.im>
parents:
7158
diff
changeset
|
692 | return; |
|
70825074f830
[gaim-migrate @ 7733]
Mark Doliner <markdoliner@pidgin.im>
parents:
7158
diff
changeset
|
693 | |
|
70825074f830
[gaim-migrate @ 7733]
Mark Doliner <markdoliner@pidgin.im>
parents:
7158
diff
changeset
|
694 | /* Remove the item from the list */ |
|
70825074f830
[gaim-migrate @ 7733]
Mark Doliner <markdoliner@pidgin.im>
parents:
7158
diff
changeset
|
695 | if ((*list)->tlv->type == type) { |
|
70825074f830
[gaim-migrate @ 7733]
Mark Doliner <markdoliner@pidgin.im>
parents:
7158
diff
changeset
|
696 | del = *list; |
|
70825074f830
[gaim-migrate @ 7733]
Mark Doliner <markdoliner@pidgin.im>
parents:
7158
diff
changeset
|
697 | *list = (*list)->next; |
|
70825074f830
[gaim-migrate @ 7733]
Mark Doliner <markdoliner@pidgin.im>
parents:
7158
diff
changeset
|
698 | } else { |
|
70825074f830
[gaim-migrate @ 7733]
Mark Doliner <markdoliner@pidgin.im>
parents:
7158
diff
changeset
|
699 | aim_tlvlist_t *cur; |
|
70825074f830
[gaim-migrate @ 7733]
Mark Doliner <markdoliner@pidgin.im>
parents:
7158
diff
changeset
|
700 | for (cur=*list; (cur->next && (cur->next->tlv->type!=type)); cur=cur->next); |
|
70825074f830
[gaim-migrate @ 7733]
Mark Doliner <markdoliner@pidgin.im>
parents:
7158
diff
changeset
|
701 | if (!cur->next) |
|
70825074f830
[gaim-migrate @ 7733]
Mark Doliner <markdoliner@pidgin.im>
parents:
7158
diff
changeset
|
702 | return; |
|
70825074f830
[gaim-migrate @ 7733]
Mark Doliner <markdoliner@pidgin.im>
parents:
7158
diff
changeset
|
703 | del = cur->next; |
|
70825074f830
[gaim-migrate @ 7733]
Mark Doliner <markdoliner@pidgin.im>
parents:
7158
diff
changeset
|
704 | cur->next = del->next; |
|
70825074f830
[gaim-migrate @ 7733]
Mark Doliner <markdoliner@pidgin.im>
parents:
7158
diff
changeset
|
705 | } |
|
70825074f830
[gaim-migrate @ 7733]
Mark Doliner <markdoliner@pidgin.im>
parents:
7158
diff
changeset
|
706 | |
|
70825074f830
[gaim-migrate @ 7733]
Mark Doliner <markdoliner@pidgin.im>
parents:
7158
diff
changeset
|
707 | /* Free the removed item */ |
|
70825074f830
[gaim-migrate @ 7733]
Mark Doliner <markdoliner@pidgin.im>
parents:
7158
diff
changeset
|
708 | free(del->tlv->value); |
|
70825074f830
[gaim-migrate @ 7733]
Mark Doliner <markdoliner@pidgin.im>
parents:
7158
diff
changeset
|
709 | free(del->tlv); |
|
70825074f830
[gaim-migrate @ 7733]
Mark Doliner <markdoliner@pidgin.im>
parents:
7158
diff
changeset
|
710 | free(del); |
|
70825074f830
[gaim-migrate @ 7733]
Mark Doliner <markdoliner@pidgin.im>
parents:
7158
diff
changeset
|
711 | } |
|
70825074f830
[gaim-migrate @ 7733]
Mark Doliner <markdoliner@pidgin.im>
parents:
7158
diff
changeset
|
712 | |
|
70825074f830
[gaim-migrate @ 7733]
Mark Doliner <markdoliner@pidgin.im>
parents:
7158
diff
changeset
|
713 | /** |
|
8794
4c2c247ef665
[gaim-migrate @ 9556]
Mark Doliner <markdoliner@pidgin.im>
parents:
8790
diff
changeset
|
714 | * Write a TLV chain into a data buffer. |
| 2086 | 715 | * |
| 716 | * Copies a TLV chain into a raw data buffer, writing only the number | |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13240
diff
changeset
|
717 | * of bytes specified. This operation does not free the chain; |
|
7167
9cfb68a44e17
[gaim-migrate @ 7734]
Mark Doliner <markdoliner@pidgin.im>
parents:
7166
diff
changeset
|
718 | * aim_tlvlist_free() must still be called to free up the memory used |
| 2086 | 719 | * by the chain structures. |
| 720 | * | |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13240
diff
changeset
|
721 | * XXX clean this up, make better use of bstreams |
|
8790
3d6d2e2f6296
[gaim-migrate @ 9552]
Jonathan Champ <royanee@users.sourceforge.net>
parents:
8735
diff
changeset
|
722 | * |
|
3d6d2e2f6296
[gaim-migrate @ 9552]
Jonathan Champ <royanee@users.sourceforge.net>
parents:
8735
diff
changeset
|
723 | * @param bs Input bstream |
|
3d6d2e2f6296
[gaim-migrate @ 9552]
Jonathan Champ <royanee@users.sourceforge.net>
parents:
8735
diff
changeset
|
724 | * @param list Source TLV chain |
|
8794
4c2c247ef665
[gaim-migrate @ 9556]
Mark Doliner <markdoliner@pidgin.im>
parents:
8790
diff
changeset
|
725 | * @return Return 0 if the destination bstream is too small. |
| 2086 | 726 | */ |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13240
diff
changeset
|
727 | int aim_tlvlist_write(ByteStream *bs, aim_tlvlist_t **list) |
| 2086 | 728 | { |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
729 | int goodbuflen; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
730 | aim_tlvlist_t *cur; |
| 2086 | 731 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
732 | /* do an initial run to test total length */ |
|
7167
9cfb68a44e17
[gaim-migrate @ 7734]
Mark Doliner <markdoliner@pidgin.im>
parents:
7166
diff
changeset
|
733 | goodbuflen = aim_tlvlist_size(list); |
| 2086 | 734 | |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13240
diff
changeset
|
735 | if (goodbuflen > byte_stream_empty(bs)) |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
736 | return 0; /* not enough buffer */ |
| 2086 | 737 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
738 | /* do the real write-out */ |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
739 | for (cur = *list; cur; cur = cur->next) { |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13240
diff
changeset
|
740 | byte_stream_put16(bs, cur->tlv->type); |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13240
diff
changeset
|
741 | byte_stream_put16(bs, cur->tlv->length); |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
742 | if (cur->tlv->length) |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13240
diff
changeset
|
743 | byte_stream_putraw(bs, cur->tlv->value, cur->tlv->length); |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
744 | } |
| 2086 | 745 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
746 | return 1; /* XXX this is a nonsensical return */ |
| 2086 | 747 | } |
| 748 | ||
| 749 | ||
| 750 | /** | |
|
7166
70825074f830
[gaim-migrate @ 7733]
Mark Doliner <markdoliner@pidgin.im>
parents:
7158
diff
changeset
|
751 | * Grab the Nth TLV of type type in the TLV list list. |
| 2086 | 752 | * |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13240
diff
changeset
|
753 | * Returns a pointer to an aim_tlv_t of the specified type; |
| 2086 | 754 | * %NULL on error. The @nth parameter is specified starting at %1. |
| 755 | * In most cases, there will be no more than one TLV of any type | |
| 756 | * in a chain. | |
| 757 | * | |
|
7167
9cfb68a44e17
[gaim-migrate @ 7734]
Mark Doliner <markdoliner@pidgin.im>
parents:
7166
diff
changeset
|
758 | * @param list Source chain. |
|
9cfb68a44e17
[gaim-migrate @ 7734]
Mark Doliner <markdoliner@pidgin.im>
parents:
7166
diff
changeset
|
759 | * @param type Requested TLV type. |
|
9cfb68a44e17
[gaim-migrate @ 7734]
Mark Doliner <markdoliner@pidgin.im>
parents:
7166
diff
changeset
|
760 | * @param nth Index of TLV of type to get. |
|
7166
70825074f830
[gaim-migrate @ 7733]
Mark Doliner <markdoliner@pidgin.im>
parents:
7158
diff
changeset
|
761 | * @return The TLV you were looking for, or NULL if one could not be found. |
| 2086 | 762 | */ |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13240
diff
changeset
|
763 | aim_tlv_t *aim_tlv_gettlv(aim_tlvlist_t *list, const guint16 type, const int nth) |
| 2086 | 764 | { |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
765 | aim_tlvlist_t *cur; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
766 | int i; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
767 | |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
768 | for (cur = list, i = 0; cur; cur = cur->next) { |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
769 | if (cur && cur->tlv) { |
|
7167
9cfb68a44e17
[gaim-migrate @ 7734]
Mark Doliner <markdoliner@pidgin.im>
parents:
7166
diff
changeset
|
770 | if (cur->tlv->type == type) |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
771 | i++; |
|
7167
9cfb68a44e17
[gaim-migrate @ 7734]
Mark Doliner <markdoliner@pidgin.im>
parents:
7166
diff
changeset
|
772 | if (i >= nth) |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
773 | return cur->tlv; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
774 | } |
| 2086 | 775 | } |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
776 | |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
777 | return NULL; |
| 2086 | 778 | } |
| 779 | ||
| 780 | /** | |
|
9933
61bd3fadbfe6
[gaim-migrate @ 10825]
Dave West <kat@users.sourceforge.net>
parents:
8794
diff
changeset
|
781 | * Get the length of the data of the nth TLV in the given TLV chain. |
|
61bd3fadbfe6
[gaim-migrate @ 10825]
Dave West <kat@users.sourceforge.net>
parents:
8794
diff
changeset
|
782 | * |
|
61bd3fadbfe6
[gaim-migrate @ 10825]
Dave West <kat@users.sourceforge.net>
parents:
8794
diff
changeset
|
783 | * @param list Source chain. |
|
61bd3fadbfe6
[gaim-migrate @ 10825]
Dave West <kat@users.sourceforge.net>
parents:
8794
diff
changeset
|
784 | * @param type Requested TLV type. |
|
61bd3fadbfe6
[gaim-migrate @ 10825]
Dave West <kat@users.sourceforge.net>
parents:
8794
diff
changeset
|
785 | * @param nth Index of TLV of type to get. |
|
61bd3fadbfe6
[gaim-migrate @ 10825]
Dave West <kat@users.sourceforge.net>
parents:
8794
diff
changeset
|
786 | * @return The length of the data in this TLV, or -1 if the TLV could not be |
|
61bd3fadbfe6
[gaim-migrate @ 10825]
Dave West <kat@users.sourceforge.net>
parents:
8794
diff
changeset
|
787 | * found. Unless -1 is returned, this value will be 2 bytes. |
|
61bd3fadbfe6
[gaim-migrate @ 10825]
Dave West <kat@users.sourceforge.net>
parents:
8794
diff
changeset
|
788 | */ |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13240
diff
changeset
|
789 | int aim_tlv_getlength(aim_tlvlist_t *list, const guint16 type, const int nth) |
|
9933
61bd3fadbfe6
[gaim-migrate @ 10825]
Dave West <kat@users.sourceforge.net>
parents:
8794
diff
changeset
|
790 | { |
|
61bd3fadbfe6
[gaim-migrate @ 10825]
Dave West <kat@users.sourceforge.net>
parents:
8794
diff
changeset
|
791 | aim_tlvlist_t *cur; |
|
61bd3fadbfe6
[gaim-migrate @ 10825]
Dave West <kat@users.sourceforge.net>
parents:
8794
diff
changeset
|
792 | int i; |
|
61bd3fadbfe6
[gaim-migrate @ 10825]
Dave West <kat@users.sourceforge.net>
parents:
8794
diff
changeset
|
793 | |
|
61bd3fadbfe6
[gaim-migrate @ 10825]
Dave West <kat@users.sourceforge.net>
parents:
8794
diff
changeset
|
794 | for (cur = list, i = 0; cur; cur = cur->next) { |
|
61bd3fadbfe6
[gaim-migrate @ 10825]
Dave West <kat@users.sourceforge.net>
parents:
8794
diff
changeset
|
795 | if (cur && cur->tlv) { |
|
61bd3fadbfe6
[gaim-migrate @ 10825]
Dave West <kat@users.sourceforge.net>
parents:
8794
diff
changeset
|
796 | if (cur->tlv->type == type) |
|
61bd3fadbfe6
[gaim-migrate @ 10825]
Dave West <kat@users.sourceforge.net>
parents:
8794
diff
changeset
|
797 | i++; |
|
61bd3fadbfe6
[gaim-migrate @ 10825]
Dave West <kat@users.sourceforge.net>
parents:
8794
diff
changeset
|
798 | if (i >= nth) |
|
61bd3fadbfe6
[gaim-migrate @ 10825]
Dave West <kat@users.sourceforge.net>
parents:
8794
diff
changeset
|
799 | return cur->tlv->length; |
|
61bd3fadbfe6
[gaim-migrate @ 10825]
Dave West <kat@users.sourceforge.net>
parents:
8794
diff
changeset
|
800 | } |
|
61bd3fadbfe6
[gaim-migrate @ 10825]
Dave West <kat@users.sourceforge.net>
parents:
8794
diff
changeset
|
801 | } |
|
61bd3fadbfe6
[gaim-migrate @ 10825]
Dave West <kat@users.sourceforge.net>
parents:
8794
diff
changeset
|
802 | |
|
61bd3fadbfe6
[gaim-migrate @ 10825]
Dave West <kat@users.sourceforge.net>
parents:
8794
diff
changeset
|
803 | return -1; |
|
61bd3fadbfe6
[gaim-migrate @ 10825]
Dave West <kat@users.sourceforge.net>
parents:
8794
diff
changeset
|
804 | } |
|
61bd3fadbfe6
[gaim-migrate @ 10825]
Dave West <kat@users.sourceforge.net>
parents:
8794
diff
changeset
|
805 | |
|
13653
fab80366d565
[gaim-migrate @ 16053]
Mark Doliner <markdoliner@pidgin.im>
parents:
13593
diff
changeset
|
806 | char * |
|
fab80366d565
[gaim-migrate @ 16053]
Mark Doliner <markdoliner@pidgin.im>
parents:
13593
diff
changeset
|
807 | aim_tlv_getvalue_as_string(aim_tlv_t *tlv) |
|
fab80366d565
[gaim-migrate @ 16053]
Mark Doliner <markdoliner@pidgin.im>
parents:
13593
diff
changeset
|
808 | { |
|
fab80366d565
[gaim-migrate @ 16053]
Mark Doliner <markdoliner@pidgin.im>
parents:
13593
diff
changeset
|
809 | char *ret; |
|
fab80366d565
[gaim-migrate @ 16053]
Mark Doliner <markdoliner@pidgin.im>
parents:
13593
diff
changeset
|
810 | |
|
fab80366d565
[gaim-migrate @ 16053]
Mark Doliner <markdoliner@pidgin.im>
parents:
13593
diff
changeset
|
811 | ret = malloc(tlv->length + 1); |
|
fab80366d565
[gaim-migrate @ 16053]
Mark Doliner <markdoliner@pidgin.im>
parents:
13593
diff
changeset
|
812 | memcpy(ret, tlv->value, tlv->length); |
|
fab80366d565
[gaim-migrate @ 16053]
Mark Doliner <markdoliner@pidgin.im>
parents:
13593
diff
changeset
|
813 | ret[tlv->length] = '\0'; |
|
fab80366d565
[gaim-migrate @ 16053]
Mark Doliner <markdoliner@pidgin.im>
parents:
13593
diff
changeset
|
814 | |
|
fab80366d565
[gaim-migrate @ 16053]
Mark Doliner <markdoliner@pidgin.im>
parents:
13593
diff
changeset
|
815 | return ret; |
|
fab80366d565
[gaim-migrate @ 16053]
Mark Doliner <markdoliner@pidgin.im>
parents:
13593
diff
changeset
|
816 | } |
|
fab80366d565
[gaim-migrate @ 16053]
Mark Doliner <markdoliner@pidgin.im>
parents:
13593
diff
changeset
|
817 | |
|
9933
61bd3fadbfe6
[gaim-migrate @ 10825]
Dave West <kat@users.sourceforge.net>
parents:
8794
diff
changeset
|
818 | /** |
|
7167
9cfb68a44e17
[gaim-migrate @ 7734]
Mark Doliner <markdoliner@pidgin.im>
parents:
7166
diff
changeset
|
819 | * Retrieve the data from the nth TLV in the given TLV chain as a string. |
| 2086 | 820 | * |
|
7167
9cfb68a44e17
[gaim-migrate @ 7734]
Mark Doliner <markdoliner@pidgin.im>
parents:
7166
diff
changeset
|
821 | * @param list Source TLV chain. |
|
9cfb68a44e17
[gaim-migrate @ 7734]
Mark Doliner <markdoliner@pidgin.im>
parents:
7166
diff
changeset
|
822 | * @param type TLV type to search for. |
|
9cfb68a44e17
[gaim-migrate @ 7734]
Mark Doliner <markdoliner@pidgin.im>
parents:
7166
diff
changeset
|
823 | * @param nth Index of TLV to return. |
|
11159
76ef02141bcb
[gaim-migrate @ 13246]
Mark Doliner <markdoliner@pidgin.im>
parents:
10993
diff
changeset
|
824 | * @return The value of the TLV you were looking for, or NULL if one could |
|
76ef02141bcb
[gaim-migrate @ 13246]
Mark Doliner <markdoliner@pidgin.im>
parents:
10993
diff
changeset
|
825 | * not be found. This is a dynamic buffer and must be freed by the |
|
7167
9cfb68a44e17
[gaim-migrate @ 7734]
Mark Doliner <markdoliner@pidgin.im>
parents:
7166
diff
changeset
|
826 | * caller. |
| 2086 | 827 | */ |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13240
diff
changeset
|
828 | char *aim_tlv_getstr(aim_tlvlist_t *list, const guint16 type, const int nth) |
| 2086 | 829 | { |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
830 | aim_tlv_t *tlv; |
| 2086 | 831 | |
|
7167
9cfb68a44e17
[gaim-migrate @ 7734]
Mark Doliner <markdoliner@pidgin.im>
parents:
7166
diff
changeset
|
832 | if (!(tlv = aim_tlv_gettlv(list, type, nth))) |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
833 | return NULL; |
| 2086 | 834 | |
|
13653
fab80366d565
[gaim-migrate @ 16053]
Mark Doliner <markdoliner@pidgin.im>
parents:
13593
diff
changeset
|
835 | return aim_tlv_getvalue_as_string(tlv); |
| 2086 | 836 | } |
| 837 | ||
| 838 | /** | |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13240
diff
changeset
|
839 | * Retrieve the data from the nth TLV in the given TLV chain as an 8bit |
|
7167
9cfb68a44e17
[gaim-migrate @ 7734]
Mark Doliner <markdoliner@pidgin.im>
parents:
7166
diff
changeset
|
840 | * integer. |
| 2086 | 841 | * |
|
7167
9cfb68a44e17
[gaim-migrate @ 7734]
Mark Doliner <markdoliner@pidgin.im>
parents:
7166
diff
changeset
|
842 | * @param list Source TLV chain. |
|
9cfb68a44e17
[gaim-migrate @ 7734]
Mark Doliner <markdoliner@pidgin.im>
parents:
7166
diff
changeset
|
843 | * @param type TLV type to search for. |
|
9cfb68a44e17
[gaim-migrate @ 7734]
Mark Doliner <markdoliner@pidgin.im>
parents:
7166
diff
changeset
|
844 | * @param nth Index of TLV to return. |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13240
diff
changeset
|
845 | * @return The value the TLV you were looking for, or 0 if one could |
|
7167
9cfb68a44e17
[gaim-migrate @ 7734]
Mark Doliner <markdoliner@pidgin.im>
parents:
7166
diff
changeset
|
846 | * not be found. |
| 2086 | 847 | */ |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13240
diff
changeset
|
848 | guint8 aim_tlv_get8(aim_tlvlist_t *list, const guint16 type, const int nth) |
| 2086 | 849 | { |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
850 | aim_tlv_t *tlv; |
| 2086 | 851 | |
|
7167
9cfb68a44e17
[gaim-migrate @ 7734]
Mark Doliner <markdoliner@pidgin.im>
parents:
7166
diff
changeset
|
852 | if (!(tlv = aim_tlv_gettlv(list, type, nth))) |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
853 | return 0; /* erm */ |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
854 | return aimutil_get8(tlv->value); |
| 2086 | 855 | } |
| 856 | ||
| 857 | /** | |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13240
diff
changeset
|
858 | * Retrieve the data from the nth TLV in the given TLV chain as a 16bit |
|
7167
9cfb68a44e17
[gaim-migrate @ 7734]
Mark Doliner <markdoliner@pidgin.im>
parents:
7166
diff
changeset
|
859 | * integer. |
| 2086 | 860 | * |
|
7167
9cfb68a44e17
[gaim-migrate @ 7734]
Mark Doliner <markdoliner@pidgin.im>
parents:
7166
diff
changeset
|
861 | * @param list Source TLV chain. |
|
9cfb68a44e17
[gaim-migrate @ 7734]
Mark Doliner <markdoliner@pidgin.im>
parents:
7166
diff
changeset
|
862 | * @param type TLV type to search for. |
|
9cfb68a44e17
[gaim-migrate @ 7734]
Mark Doliner <markdoliner@pidgin.im>
parents:
7166
diff
changeset
|
863 | * @param nth Index of TLV to return. |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13240
diff
changeset
|
864 | * @return The value the TLV you were looking for, or 0 if one could |
|
7167
9cfb68a44e17
[gaim-migrate @ 7734]
Mark Doliner <markdoliner@pidgin.im>
parents:
7166
diff
changeset
|
865 | * not be found. |
| 2086 | 866 | */ |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13240
diff
changeset
|
867 | guint16 aim_tlv_get16(aim_tlvlist_t *list, const guint16 type, const int nth) |
| 2086 | 868 | { |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
869 | aim_tlv_t *tlv; |
| 2086 | 870 | |
|
7167
9cfb68a44e17
[gaim-migrate @ 7734]
Mark Doliner <markdoliner@pidgin.im>
parents:
7166
diff
changeset
|
871 | if (!(tlv = aim_tlv_gettlv(list, type, nth))) |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
872 | return 0; /* erm */ |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
873 | return aimutil_get16(tlv->value); |
| 2086 | 874 | } |
| 875 | ||
| 876 | /** | |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13240
diff
changeset
|
877 | * Retrieve the data from the nth TLV in the given TLV chain as a 32bit |
|
7167
9cfb68a44e17
[gaim-migrate @ 7734]
Mark Doliner <markdoliner@pidgin.im>
parents:
7166
diff
changeset
|
878 | * integer. |
| 2086 | 879 | * |
|
7167
9cfb68a44e17
[gaim-migrate @ 7734]
Mark Doliner <markdoliner@pidgin.im>
parents:
7166
diff
changeset
|
880 | * @param list Source TLV chain. |
|
9cfb68a44e17
[gaim-migrate @ 7734]
Mark Doliner <markdoliner@pidgin.im>
parents:
7166
diff
changeset
|
881 | * @param type TLV type to search for. |
|
9cfb68a44e17
[gaim-migrate @ 7734]
Mark Doliner <markdoliner@pidgin.im>
parents:
7166
diff
changeset
|
882 | * @param nth Index of TLV to return. |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13240
diff
changeset
|
883 | * @return The value the TLV you were looking for, or 0 if one could |
|
7167
9cfb68a44e17
[gaim-migrate @ 7734]
Mark Doliner <markdoliner@pidgin.im>
parents:
7166
diff
changeset
|
884 | * not be found. |
| 2086 | 885 | */ |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13240
diff
changeset
|
886 | guint32 aim_tlv_get32(aim_tlvlist_t *list, const guint16 type, const int nth) |
| 2086 | 887 | { |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
888 | aim_tlv_t *tlv; |
| 2086 | 889 | |
|
7167
9cfb68a44e17
[gaim-migrate @ 7734]
Mark Doliner <markdoliner@pidgin.im>
parents:
7166
diff
changeset
|
890 | if (!(tlv = aim_tlv_gettlv(list, type, nth))) |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
891 | return 0; /* erm */ |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
892 | return aimutil_get32(tlv->value); |
| 2086 | 893 | } |