Tue, 19 Mar 2002 06:26:05 +0000
[gaim-migrate @ 3093]
AIM 4.8 Mobile indicator by Mark "the KingAnt" Doliner.
committer: Sean Egan <seanegan@pidgin.im>
| 2086 | 1 | |
| 2 | #define FAIM_INTERNAL | |
| 3 | #include <aim.h> | |
| 4 | ||
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
5 | static aim_tlv_t *createtlv(void) |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
6 | { |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
7 | aim_tlv_t *newtlv; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
8 | |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
9 | if (!(newtlv = (aim_tlv_t *)malloc(sizeof(aim_tlv_t)))) |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
10 | return NULL; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
11 | memset(newtlv, 0, sizeof(aim_tlv_t)); |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
12 | |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
13 | return newtlv; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
14 | } |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
15 | |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
16 | static void freetlv(aim_tlv_t **oldtlv) |
|
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 | |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
19 | if (!oldtlv || !*oldtlv) |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
20 | return; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
21 | |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
22 | free((*oldtlv)->value); |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
23 | free(*oldtlv); |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
24 | *oldtlv = NULL; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
25 | |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
26 | return; |
|
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 | |
| 2086 | 29 | /** |
| 30 | * aim_readtlvchain - Read a TLV chain from a buffer. | |
| 31 | * @buf: Input buffer | |
| 32 | * @maxlen: Length of input buffer | |
| 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 | |
| 36 | * routines. When done with a TLV chain, aim_freetlvchain() should | |
| 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 |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
42 | * just as effecient as the in-place TLV parsing used in a couple places |
|
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 | * |
| 2086 | 45 | */ |
|
2270
c65fc356fb68
[gaim-migrate @ 2280]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2246
diff
changeset
|
46 | faim_internal aim_tlvlist_t *aim_readtlvchain(aim_bstream_t *bs) |
| 2086 | 47 | { |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
48 | aim_tlvlist_t *list = NULL, *cur; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
49 | fu16_t type, length; |
| 2086 | 50 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
51 | while (aim_bstream_empty(bs)) { |
| 2086 | 52 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
53 | type = aimbs_get16(bs); |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
54 | length = aimbs_get16(bs); |
| 2086 | 55 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
56 | #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
|
57 | /* |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
58 | * Okay, so now AOL has decided that any TLV of |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
59 | * type 0x0013 can only be two bytes, despite |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
60 | * what the actual given length is. So here |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
61 | * we dump any invalid TLVs of that sort. Hopefully |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
62 | * theres no special cases to this special case. |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
63 | * - mid (30jun2000) |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
64 | */ |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
65 | if ((type == 0x0013) && (length != 0x0002)) |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
66 | length = 0x0002; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
67 | #else |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
68 | if (0) |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
69 | ; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
70 | #endif |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
71 | else { |
| 2086 | 72 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
73 | cur = (aim_tlvlist_t *)malloc(sizeof(aim_tlvlist_t)); |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
74 | memset(cur, 0, sizeof(aim_tlvlist_t)); |
| 2086 | 75 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
76 | cur->tlv = createtlv(); |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
77 | cur->tlv->type = type; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
78 | if ((cur->tlv->length = length)) |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
79 | cur->tlv->value = aimbs_getraw(bs, length); |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
80 | |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
81 | cur->next = list; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
82 | list = cur; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
83 | } |
| 2086 | 84 | } |
| 85 | ||
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
86 | return list; |
| 2086 | 87 | } |
| 88 | ||
| 89 | /** | |
| 90 | * aim_freetlvchain - Free a TLV chain structure | |
| 91 | * @list: Chain to be freed | |
| 92 | * | |
| 93 | * Walks the list of TLVs in the passed TLV chain and | |
| 94 | * frees each one. Note that any references to this data | |
| 95 | * should be removed before calling this. | |
| 96 | * | |
| 97 | */ | |
|
2270
c65fc356fb68
[gaim-migrate @ 2280]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2246
diff
changeset
|
98 | faim_internal void aim_freetlvchain(aim_tlvlist_t **list) |
| 2086 | 99 | { |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
100 | aim_tlvlist_t *cur; |
| 2086 | 101 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
102 | if (!list || !*list) |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
103 | return; |
| 2086 | 104 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
105 | for (cur = *list; cur; ) { |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
106 | aim_tlvlist_t *tmp; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
107 | |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
108 | freetlv(&cur->tlv); |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
109 | |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
110 | tmp = cur->next; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
111 | free(cur); |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
112 | cur = tmp; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
113 | } |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
114 | |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
115 | list = NULL; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
116 | |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
117 | return; |
| 2086 | 118 | } |
| 119 | ||
| 120 | /** | |
| 121 | * aim_counttlvchain - Count the number of TLVs in a chain | |
| 122 | * @list: Chain to be counted | |
| 123 | * | |
| 124 | * Returns the number of TLVs stored in the passed chain. | |
| 125 | * | |
| 126 | */ | |
|
2270
c65fc356fb68
[gaim-migrate @ 2280]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2246
diff
changeset
|
127 | faim_internal int aim_counttlvchain(aim_tlvlist_t **list) |
| 2086 | 128 | { |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
129 | aim_tlvlist_t *cur; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
130 | int count; |
| 2086 | 131 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
132 | if (!list || !*list) |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
133 | return 0; |
| 2086 | 134 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
135 | for (cur = *list, count = 0; cur; cur = cur->next) |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
136 | count++; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
137 | |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
138 | return count; |
| 2086 | 139 | } |
| 140 | ||
| 141 | /** | |
| 142 | * aim_sizetlvchain - Count the number of bytes in a TLV chain | |
| 143 | * @list: Chain to be sized | |
| 144 | * | |
| 145 | * Returns the number of bytes that would be needed to | |
| 146 | * write the passed TLV chain to a data buffer. | |
| 147 | * | |
| 148 | */ | |
|
2270
c65fc356fb68
[gaim-migrate @ 2280]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2246
diff
changeset
|
149 | faim_internal int aim_sizetlvchain(aim_tlvlist_t **list) |
| 2086 | 150 | { |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
151 | aim_tlvlist_t *cur; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
152 | int size; |
| 2086 | 153 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
154 | if (!list || !*list) |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
155 | return 0; |
| 2086 | 156 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
157 | for (cur = *list, size = 0; cur; cur = cur->next) |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
158 | size += (4 + cur->tlv->length); |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
159 | |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
160 | return size; |
| 2086 | 161 | } |
| 162 | ||
| 163 | /** | |
| 164 | * aim_addtlvtochain_str - Add a string to a TLV chain | |
| 165 | * @list: Desination chain (%NULL pointer if empty) | |
| 166 | * @type: TLV type | |
| 167 | * @str: String to add | |
| 168 | * @len: Length of string to add (not including %NULL) | |
| 169 | * | |
| 170 | * Adds the passed string as a TLV element of the passed type | |
| 171 | * to the TLV chain. | |
| 172 | * | |
| 173 | */ | |
|
2270
c65fc356fb68
[gaim-migrate @ 2280]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2246
diff
changeset
|
174 | faim_internal int aim_addtlvtochain_raw(aim_tlvlist_t **list, const fu16_t t, const fu16_t l, const fu8_t *v) |
| 2086 | 175 | { |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
176 | aim_tlvlist_t *newtlv, *cur; |
| 2086 | 177 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
178 | if (!list) |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
179 | return 0; |
| 2086 | 180 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
181 | if (!(newtlv = (aim_tlvlist_t *)malloc(sizeof(aim_tlvlist_t)))) |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
182 | return 0; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
183 | memset(newtlv, 0x00, sizeof(aim_tlvlist_t)); |
| 2086 | 184 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
185 | if (!(newtlv->tlv = createtlv())) { |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
186 | free(newtlv); |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
187 | return 0; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
188 | } |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
189 | newtlv->tlv->type = t; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
190 | if ((newtlv->tlv->length = l)) { |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
191 | newtlv->tlv->value = (fu8_t *)malloc(newtlv->tlv->length); |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
192 | memcpy(newtlv->tlv->value, v, newtlv->tlv->length); |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
193 | } |
| 2086 | 194 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
195 | if (!*list) |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
196 | *list = newtlv; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
197 | else { |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
198 | for(cur = *list; cur->next; cur = cur->next) |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
199 | ; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
200 | cur->next = newtlv; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
201 | } |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
202 | |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
203 | return newtlv->tlv->length; |
| 2086 | 204 | } |
| 205 | ||
| 206 | /** | |
|
2821
f1ab7f03bdad
[gaim-migrate @ 2834]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2421
diff
changeset
|
207 | * aim_addtlvtochain8 - Add a 8bit integer to a TLV chain |
|
f1ab7f03bdad
[gaim-migrate @ 2834]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2421
diff
changeset
|
208 | * @list: Destination chain |
|
f1ab7f03bdad
[gaim-migrate @ 2834]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2421
diff
changeset
|
209 | * @type: TLV type to add |
|
f1ab7f03bdad
[gaim-migrate @ 2834]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2421
diff
changeset
|
210 | * @val: Value to add |
|
f1ab7f03bdad
[gaim-migrate @ 2834]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2421
diff
changeset
|
211 | * |
|
f1ab7f03bdad
[gaim-migrate @ 2834]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2421
diff
changeset
|
212 | * Adds a one-byte unsigned integer to a TLV chain. |
|
f1ab7f03bdad
[gaim-migrate @ 2834]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2421
diff
changeset
|
213 | * |
|
f1ab7f03bdad
[gaim-migrate @ 2834]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2421
diff
changeset
|
214 | */ |
|
f1ab7f03bdad
[gaim-migrate @ 2834]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2421
diff
changeset
|
215 | faim_internal int aim_addtlvtochain8(aim_tlvlist_t **list, const fu16_t t, const fu8_t v) |
|
f1ab7f03bdad
[gaim-migrate @ 2834]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2421
diff
changeset
|
216 | { |
|
f1ab7f03bdad
[gaim-migrate @ 2834]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2421
diff
changeset
|
217 | fu8_t v8[1]; |
|
f1ab7f03bdad
[gaim-migrate @ 2834]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2421
diff
changeset
|
218 | |
|
f1ab7f03bdad
[gaim-migrate @ 2834]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2421
diff
changeset
|
219 | aimutil_put8(v8, v); |
|
f1ab7f03bdad
[gaim-migrate @ 2834]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2421
diff
changeset
|
220 | |
|
f1ab7f03bdad
[gaim-migrate @ 2834]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2421
diff
changeset
|
221 | return aim_addtlvtochain_raw(list, t, 1, v8); |
|
f1ab7f03bdad
[gaim-migrate @ 2834]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2421
diff
changeset
|
222 | } |
|
f1ab7f03bdad
[gaim-migrate @ 2834]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2421
diff
changeset
|
223 | |
|
f1ab7f03bdad
[gaim-migrate @ 2834]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2421
diff
changeset
|
224 | /** |
| 2086 | 225 | * aim_addtlvtochain16 - Add a 16bit integer to a TLV chain |
| 226 | * @list: Destination chain | |
| 227 | * @type: TLV type to add | |
| 228 | * @val: Value to add | |
| 229 | * | |
| 230 | * Adds a two-byte unsigned integer to a TLV chain. | |
| 231 | * | |
| 232 | */ | |
|
2270
c65fc356fb68
[gaim-migrate @ 2280]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2246
diff
changeset
|
233 | faim_internal int aim_addtlvtochain16(aim_tlvlist_t **list, const fu16_t t, const fu16_t v) |
| 2086 | 234 | { |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
235 | fu8_t v16[2]; |
| 2086 | 236 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
237 | aimutil_put16(v16, v); |
| 2086 | 238 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
239 | return aim_addtlvtochain_raw(list, t, 2, v16); |
| 2086 | 240 | } |
| 241 | ||
| 242 | /** | |
| 243 | * aim_addtlvtochain32 - Add a 32bit integer to a TLV chain | |
| 244 | * @list: Destination chain | |
| 245 | * @type: TLV type to add | |
| 246 | * @val: Value to add | |
| 247 | * | |
| 248 | * Adds a four-byte unsigned integer to a TLV chain. | |
| 249 | * | |
| 250 | */ | |
|
2270
c65fc356fb68
[gaim-migrate @ 2280]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2246
diff
changeset
|
251 | faim_internal int aim_addtlvtochain32(aim_tlvlist_t **list, const fu16_t t, const fu32_t v) |
| 2086 | 252 | { |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
253 | fu8_t v32[4]; |
| 2086 | 254 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
255 | aimutil_put32(v32, v); |
| 2086 | 256 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
257 | return aim_addtlvtochain_raw(list, t, 4, v32); |
| 2086 | 258 | } |
| 259 | ||
| 260 | /** | |
| 261 | * aim_addtlvtochain_caps - Add a capability block to a TLV chain | |
| 262 | * @list: Destination chain | |
| 263 | * @type: TLV type to add | |
| 264 | * @caps: Bitfield of capability flags to send | |
| 265 | * | |
| 266 | * Adds a block of capability blocks to a TLV chain. The bitfield | |
| 267 | * passed in should be a bitwise %OR of any of the %AIM_CAPS constants: | |
| 268 | * | |
| 269 | * %AIM_CAPS_BUDDYICON Supports Buddy Icons | |
| 270 | * | |
| 271 | * %AIM_CAPS_VOICE Supports Voice Chat | |
| 272 | * | |
| 273 | * %AIM_CAPS_IMIMAGE Supports DirectIM/IMImage | |
| 274 | * | |
| 275 | * %AIM_CAPS_CHAT Supports Chat | |
| 276 | * | |
| 277 | * %AIM_CAPS_GETFILE Supports Get File functions | |
| 278 | * | |
| 279 | * %AIM_CAPS_SENDFILE Supports Send File functions | |
| 280 | * | |
| 281 | */ | |
|
2866
159551b6db88
[gaim-migrate @ 2879]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2821
diff
changeset
|
282 | faim_internal int aim_addtlvtochain_caps(aim_tlvlist_t **list, const fu16_t t, const fu32_t caps) |
| 2086 | 283 | { |
|
2866
159551b6db88
[gaim-migrate @ 2879]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2821
diff
changeset
|
284 | fu8_t buf[16*16]; /* XXX icky fixed length buffer */ |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
285 | aim_bstream_t bs; |
| 2086 | 286 | |
|
2421
009ae3cf0e83
[gaim-migrate @ 2434]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2270
diff
changeset
|
287 | if (!caps) |
|
009ae3cf0e83
[gaim-migrate @ 2434]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2270
diff
changeset
|
288 | return 0; /* nothing there anyway */ |
|
009ae3cf0e83
[gaim-migrate @ 2434]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2270
diff
changeset
|
289 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
290 | aim_bstream_init(&bs, buf, sizeof(buf)); |
| 2086 | 291 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
292 | aim_putcap(&bs, caps); |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
293 | |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
294 | return aim_addtlvtochain_raw(list, t, aim_bstream_curpos(&bs), buf); |
| 2086 | 295 | } |
| 296 | ||
|
2421
009ae3cf0e83
[gaim-migrate @ 2434]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2270
diff
changeset
|
297 | faim_internal int aim_addtlvtochain_userinfo(aim_tlvlist_t **list, fu16_t type, aim_userinfo_t *ui) |
|
2270
c65fc356fb68
[gaim-migrate @ 2280]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2246
diff
changeset
|
298 | { |
|
c65fc356fb68
[gaim-migrate @ 2280]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2246
diff
changeset
|
299 | fu8_t buf[1024]; /* bleh */ |
|
c65fc356fb68
[gaim-migrate @ 2280]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2246
diff
changeset
|
300 | aim_bstream_t bs; |
|
c65fc356fb68
[gaim-migrate @ 2280]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2246
diff
changeset
|
301 | |
|
c65fc356fb68
[gaim-migrate @ 2280]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2246
diff
changeset
|
302 | aim_bstream_init(&bs, buf, sizeof(buf)); |
|
c65fc356fb68
[gaim-migrate @ 2280]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2246
diff
changeset
|
303 | |
|
c65fc356fb68
[gaim-migrate @ 2280]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2246
diff
changeset
|
304 | aim_putuserinfo(&bs, ui); |
|
c65fc356fb68
[gaim-migrate @ 2280]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2246
diff
changeset
|
305 | |
|
c65fc356fb68
[gaim-migrate @ 2280]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2246
diff
changeset
|
306 | return aim_addtlvtochain_raw(list, type, aim_bstream_curpos(&bs), buf); |
|
c65fc356fb68
[gaim-migrate @ 2280]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2246
diff
changeset
|
307 | } |
|
c65fc356fb68
[gaim-migrate @ 2280]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2246
diff
changeset
|
308 | |
| 2086 | 309 | /** |
| 310 | * aim_addtlvtochain_noval - Add a blank TLV to a TLV chain | |
| 311 | * @list: Destination chain | |
| 312 | * @type: TLV type to add | |
| 313 | * | |
| 314 | * Adds a TLV with a zero length to a TLV chain. | |
| 315 | * | |
| 316 | */ | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
317 | faim_internal int aim_addtlvtochain_noval(aim_tlvlist_t **list, const fu16_t t) |
| 2086 | 318 | { |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
319 | return aim_addtlvtochain_raw(list, t, 0, NULL); |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
320 | } |
| 2086 | 321 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
322 | /* |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
323 | * 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
|
324 | * 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
|
325 | * made to this. |
|
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 | * XXX should probably support sublists for real. |
|
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 | * This is so neat. |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
330 | * |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
331 | */ |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
332 | faim_internal int aim_addtlvtochain_frozentlvlist(aim_tlvlist_t **list, fu16_t type, aim_tlvlist_t **tl) |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
333 | { |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
334 | fu8_t *buf; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
335 | int buflen; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
336 | aim_bstream_t bs; |
| 2086 | 337 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
338 | buflen = aim_sizetlvchain(tl); |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
339 | |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
340 | if (buflen <= 0) |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
341 | return 0; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
342 | |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
343 | if (!(buf = malloc(buflen))) |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
344 | return 0; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
345 | |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
346 | aim_bstream_init(&bs, buf, buflen); |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
347 | |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
348 | aim_writetlvchain(&bs, tl); |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
349 | |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
350 | aim_addtlvtochain_raw(list, type, aim_bstream_curpos(&bs), buf); |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
351 | |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
352 | free(buf); |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
353 | |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
354 | return buflen; |
| 2086 | 355 | } |
| 356 | ||
| 357 | /** | |
| 358 | * aim_writetlvchain - Write a TLV chain into a data buffer. | |
| 359 | * @buf: Destination buffer | |
| 360 | * @buflen: Maximum number of bytes that will be written to buffer | |
| 361 | * @list: Source TLV chain | |
| 362 | * | |
| 363 | * Copies a TLV chain into a raw data buffer, writing only the number | |
| 364 | * of bytes specified. This operation does not free the chain; | |
| 365 | * aim_freetlvchain() must still be called to free up the memory used | |
| 366 | * by the chain structures. | |
| 367 | * | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
368 | * XXX clean this up, make better use of bstreams |
| 2086 | 369 | */ |
|
2270
c65fc356fb68
[gaim-migrate @ 2280]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2246
diff
changeset
|
370 | faim_internal int aim_writetlvchain(aim_bstream_t *bs, aim_tlvlist_t **list) |
| 2086 | 371 | { |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
372 | int goodbuflen; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
373 | aim_tlvlist_t *cur; |
| 2086 | 374 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
375 | /* do an initial run to test total length */ |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
376 | for (cur = *list, goodbuflen = 0; cur; cur = cur->next) { |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
377 | goodbuflen += 2 + 2; /* type + len */ |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
378 | goodbuflen += cur->tlv->length; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
379 | } |
| 2086 | 380 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
381 | if (goodbuflen > aim_bstream_empty(bs)) |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
382 | return 0; /* not enough buffer */ |
| 2086 | 383 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
384 | /* do the real write-out */ |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
385 | for (cur = *list; cur; cur = cur->next) { |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
386 | aimbs_put16(bs, cur->tlv->type); |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
387 | aimbs_put16(bs, cur->tlv->length); |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
388 | if (cur->tlv->length) |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
389 | aimbs_putraw(bs, cur->tlv->value, cur->tlv->length); |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
390 | } |
| 2086 | 391 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
392 | return 1; /* XXX this is a nonsensical return */ |
| 2086 | 393 | } |
| 394 | ||
| 395 | ||
| 396 | /** | |
| 397 | * aim_gettlv - Grab the Nth TLV of type type in the TLV list list. | |
| 398 | * @list: Source chain | |
| 399 | * @type: Requested TLV type | |
| 400 | * @nth: Index of TLV of type to get | |
| 401 | * | |
| 402 | * Returns a pointer to an aim_tlv_t of the specified type; | |
| 403 | * %NULL on error. The @nth parameter is specified starting at %1. | |
| 404 | * In most cases, there will be no more than one TLV of any type | |
| 405 | * in a chain. | |
| 406 | * | |
| 407 | */ | |
|
2270
c65fc356fb68
[gaim-migrate @ 2280]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2246
diff
changeset
|
408 | faim_internal aim_tlv_t *aim_gettlv(aim_tlvlist_t *list, const fu16_t t, const int n) |
| 2086 | 409 | { |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
410 | aim_tlvlist_t *cur; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
411 | int i; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
412 | |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
413 | for (cur = list, i = 0; cur; cur = cur->next) { |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
414 | if (cur && cur->tlv) { |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
415 | if (cur->tlv->type == t) |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
416 | i++; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
417 | if (i >= n) |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
418 | return cur->tlv; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
419 | } |
| 2086 | 420 | } |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
421 | |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
422 | return NULL; |
| 2086 | 423 | } |
| 424 | ||
| 425 | /** | |
| 426 | * aim_gettlv_str - Retrieve the Nth TLV in chain as a string. | |
| 427 | * @list: Source TLV chain | |
| 428 | * @type: TLV type to search for | |
| 429 | * @nth: Index of TLV to return | |
| 430 | * | |
| 431 | * Same as aim_gettlv(), except that the return value is a %NULL- | |
| 432 | * terminated string instead of an aim_tlv_t. This is a | |
| 433 | * dynamic buffer and must be freed by the caller. | |
| 434 | * | |
| 435 | */ | |
|
2270
c65fc356fb68
[gaim-migrate @ 2280]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2246
diff
changeset
|
436 | faim_internal char *aim_gettlv_str(aim_tlvlist_t *list, const fu16_t t, const int n) |
| 2086 | 437 | { |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
438 | aim_tlv_t *tlv; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
439 | char *newstr; |
| 2086 | 440 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
441 | if (!(tlv = aim_gettlv(list, t, n))) |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
442 | return NULL; |
| 2086 | 443 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
444 | newstr = (char *) malloc(tlv->length + 1); |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
445 | memcpy(newstr, tlv->value, tlv->length); |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
446 | *(newstr + tlv->length) = '\0'; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
447 | |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
448 | return newstr; |
| 2086 | 449 | } |
| 450 | ||
| 451 | /** | |
| 452 | * aim_gettlv8 - Retrieve the Nth TLV in chain as a 8bit integer. | |
| 453 | * @list: Source TLV chain | |
| 454 | * @type: TLV type to search for | |
| 455 | * @nth: Index of TLV to return | |
| 456 | * | |
| 457 | * Same as aim_gettlv(), except that the return value is a | |
| 458 | * 8bit integer instead of an aim_tlv_t. | |
| 459 | * | |
| 460 | */ | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
461 | faim_internal fu8_t aim_gettlv8(aim_tlvlist_t *list, const fu16_t t, const int n) |
| 2086 | 462 | { |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
463 | aim_tlv_t *tlv; |
| 2086 | 464 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
465 | if (!(tlv = aim_gettlv(list, t, n))) |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
466 | return 0; /* erm */ |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
467 | return aimutil_get8(tlv->value); |
| 2086 | 468 | } |
| 469 | ||
| 470 | /** | |
| 471 | * aim_gettlv16 - Retrieve the Nth TLV in chain as a 16bit integer. | |
| 472 | * @list: Source TLV chain | |
| 473 | * @type: TLV type to search for | |
| 474 | * @nth: Index of TLV to return | |
| 475 | * | |
| 476 | * Same as aim_gettlv(), except that the return value is a | |
| 477 | * 16bit integer instead of an aim_tlv_t. | |
| 478 | * | |
| 479 | */ | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
480 | faim_internal fu16_t aim_gettlv16(aim_tlvlist_t *list, const fu16_t t, const int n) |
| 2086 | 481 | { |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
482 | aim_tlv_t *tlv; |
| 2086 | 483 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
484 | if (!(tlv = aim_gettlv(list, t, n))) |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
485 | return 0; /* erm */ |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
486 | return aimutil_get16(tlv->value); |
| 2086 | 487 | } |
| 488 | ||
| 489 | /** | |
| 490 | * aim_gettlv32 - Retrieve the Nth TLV in chain as a 32bit integer. | |
| 491 | * @list: Source TLV chain | |
| 492 | * @type: TLV type to search for | |
| 493 | * @nth: Index of TLV to return | |
| 494 | * | |
| 495 | * Same as aim_gettlv(), except that the return value is a | |
| 496 | * 32bit integer instead of an aim_tlv_t. | |
| 497 | * | |
| 498 | */ | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
499 | faim_internal fu32_t aim_gettlv32(aim_tlvlist_t *list, const fu16_t t, const int n) |
| 2086 | 500 | { |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
501 | aim_tlv_t *tlv; |
| 2086 | 502 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
503 | if (!(tlv = aim_gettlv(list, t, n))) |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
504 | return 0; /* erm */ |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
505 | return aimutil_get32(tlv->value); |
| 2086 | 506 | } |
| 507 | ||
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
508 | #if 0 |
| 2086 | 509 | /** |
| 510 | * aim_puttlv_8 - Write a one-byte TLV. | |
| 511 | * @buf: Destination buffer | |
| 512 | * @t: TLV type | |
| 513 | * @v: Value | |
| 514 | * | |
| 515 | * Writes a TLV with a one-byte integer value portion. | |
| 516 | * | |
| 517 | */ | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
518 | faim_export int aim_puttlv_8(fu8_t *buf, const fu16_t t, const fu8_t v) |
| 2086 | 519 | { |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
520 | fu8_t v8[1]; |
| 2086 | 521 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
522 | aimutil_put8(v8, v); |
| 2086 | 523 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
524 | return aim_puttlv_raw(buf, t, 1, v8); |
| 2086 | 525 | } |
| 526 | ||
| 527 | /** | |
| 528 | * aim_puttlv_16 - Write a two-byte TLV. | |
| 529 | * @buf: Destination buffer | |
| 530 | * @t: TLV type | |
| 531 | * @v: Value | |
| 532 | * | |
| 533 | * Writes a TLV with a two-byte integer value portion. | |
| 534 | * | |
| 535 | */ | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
536 | faim_export int aim_puttlv_16(fu8_t *buf, const fu16_t t, const fu16_t v) |
| 2086 | 537 | { |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
538 | fu8_t v16[2]; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
539 | |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
540 | aimutil_put16(v16, v); |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
541 | |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
542 | return aim_puttlv_raw(buf, t, 2, v16); |
| 2086 | 543 | } |
| 544 | ||
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
545 | |
| 2086 | 546 | /** |
| 547 | * aim_puttlv_32 - Write a four-byte TLV. | |
| 548 | * @buf: Destination buffer | |
| 549 | * @t: TLV type | |
| 550 | * @v: Value | |
| 551 | * | |
| 552 | * Writes a TLV with a four-byte integer value portion. | |
| 553 | * | |
| 554 | */ | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
555 | faim_export int aim_puttlv_32(fu8_t *buf, const fu16_t t, const fu32_t v) |
| 2086 | 556 | { |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
557 | fu8_t v32[4]; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
558 | |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
559 | aimutil_put32(v32, v); |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
560 | |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
561 | return aim_puttlv_raw(buf, t, 4, v32); |
| 2086 | 562 | } |
| 563 | ||
| 564 | /** | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
565 | * aim_puttlv_raw - Write a raw TLV. |
| 2086 | 566 | * @buf: Destination buffer |
| 567 | * @t: TLV type | |
| 568 | * @l: Length of string | |
| 569 | * @v: String to write | |
| 570 | * | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
571 | * Writes a TLV with a raw value portion. (Only the first @l |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
572 | * bytes of the passed buffer will be written, which should not |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
573 | * include a terminating NULL.) |
| 2086 | 574 | * |
| 575 | */ | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
576 | faim_export int aim_puttlv_raw(fu8_t *buf, const fu16_t t, const fu16_t l, const fu8_t *v) |
| 2086 | 577 | { |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
578 | int i; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
579 | |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
580 | i = aimutil_put16(buf, t); |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
581 | i += aimutil_put16(buf+i, l); |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
582 | if (l) |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
583 | memcpy(buf+i, v, l); |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
584 | i += l; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
585 | |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
586 | return i; |
| 2086 | 587 | } |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
588 | #endif |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
589 |