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