Tue, 14 Oct 2003 04:35:46 +0000
[gaim-migrate @ 7836]
Correctly handle failed get info requests.
This should fix that bug that's assigned to me, and also the
problem SimGuy (and other people) have had where you need to
Get Info twice before it works.
| 2086 | 1 | /* |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
2931
diff
changeset
|
2 | * misc.c |
| 2086 | 3 | * |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
2931
diff
changeset
|
4 | * Random stuff. Basically just a few functions for sending |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
2931
diff
changeset
|
5 | * simple SNACs, and then the generic error handler. |
| 2086 | 6 | * |
| 7 | */ | |
| 8 | ||
| 9 | #define FAIM_INTERNAL | |
| 10 | #include <aim.h> | |
| 11 | ||
| 12 | /* | |
| 13 | * Generic routine for sending commands. | |
| 14 | * | |
| 15 | * | |
| 16 | * I know I can do this in a smarter way...but I'm not thinking straight | |
| 17 | * right now... | |
| 18 | * | |
| 19 | * I had one big function that handled all three cases, but then it broke | |
| 20 | * and I split it up into three. But then I fixed it. I just never went | |
| 21 | * back to the single. I don't see any advantage to doing it either way. | |
| 22 | * | |
| 23 | */ | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2167
diff
changeset
|
24 | faim_internal int aim_genericreq_n(aim_session_t *sess, aim_conn_t *conn, fu16_t family, fu16_t subtype) |
| 2086 | 25 | { |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2167
diff
changeset
|
26 | aim_frame_t *fr; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2167
diff
changeset
|
27 | aim_snacid_t snacid = 0x00000000; |
| 2086 | 28 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2167
diff
changeset
|
29 | if (!(fr = aim_tx_new(sess, conn, AIM_FRAMETYPE_FLAP, 0x02, 10))) |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2167
diff
changeset
|
30 | return -ENOMEM; |
| 2086 | 31 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2167
diff
changeset
|
32 | aim_putsnac(&fr->data, family, subtype, 0x0000, snacid); |
| 2086 | 33 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2167
diff
changeset
|
34 | aim_tx_enqueue(sess, fr); |
| 2086 | 35 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2167
diff
changeset
|
36 | return 0; |
| 2086 | 37 | } |
| 38 | ||
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2167
diff
changeset
|
39 | faim_internal int aim_genericreq_n_snacid(aim_session_t *sess, aim_conn_t *conn, fu16_t family, fu16_t subtype) |
| 2086 | 40 | { |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2167
diff
changeset
|
41 | aim_frame_t *fr; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2167
diff
changeset
|
42 | aim_snacid_t snacid; |
| 2086 | 43 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2167
diff
changeset
|
44 | if (!(fr = aim_tx_new(sess, conn, AIM_FRAMETYPE_FLAP, 0x02, 10))) |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2167
diff
changeset
|
45 | return -ENOMEM; |
| 2086 | 46 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2167
diff
changeset
|
47 | snacid = aim_cachesnac(sess, family, subtype, 0x0000, NULL, 0); |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2167
diff
changeset
|
48 | aim_putsnac(&fr->data, family, subtype, 0x0000, snacid); |
| 2086 | 49 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2167
diff
changeset
|
50 | aim_tx_enqueue(sess, fr); |
| 2086 | 51 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2167
diff
changeset
|
52 | return 0; |
| 2086 | 53 | } |
| 54 | ||
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2167
diff
changeset
|
55 | faim_internal int aim_genericreq_l(aim_session_t *sess, aim_conn_t *conn, fu16_t family, fu16_t subtype, fu32_t *longdata) |
| 2086 | 56 | { |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2167
diff
changeset
|
57 | aim_frame_t *fr; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2167
diff
changeset
|
58 | aim_snacid_t snacid; |
| 2086 | 59 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2167
diff
changeset
|
60 | if (!longdata) |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2167
diff
changeset
|
61 | return aim_genericreq_n(sess, conn, family, subtype); |
| 2086 | 62 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2167
diff
changeset
|
63 | if (!(fr = aim_tx_new(sess, conn, AIM_FRAMETYPE_FLAP, 0x02, 10+4))) |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2167
diff
changeset
|
64 | return -ENOMEM; |
| 2086 | 65 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2167
diff
changeset
|
66 | snacid = aim_cachesnac(sess, family, subtype, 0x0000, NULL, 0); |
| 2086 | 67 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2167
diff
changeset
|
68 | aim_putsnac(&fr->data, family, subtype, 0x0000, snacid); |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2167
diff
changeset
|
69 | aimbs_put32(&fr->data, *longdata); |
| 2086 | 70 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2167
diff
changeset
|
71 | aim_tx_enqueue(sess, fr); |
| 2086 | 72 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2167
diff
changeset
|
73 | return 0; |
| 2086 | 74 | } |
| 75 | ||
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2167
diff
changeset
|
76 | faim_internal int aim_genericreq_s(aim_session_t *sess, aim_conn_t *conn, fu16_t family, fu16_t subtype, fu16_t *shortdata) |
| 2086 | 77 | { |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2167
diff
changeset
|
78 | aim_frame_t *fr; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2167
diff
changeset
|
79 | aim_snacid_t snacid; |
| 2086 | 80 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2167
diff
changeset
|
81 | if (!shortdata) |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2167
diff
changeset
|
82 | return aim_genericreq_n(sess, conn, family, subtype); |
| 2086 | 83 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2167
diff
changeset
|
84 | if (!(fr = aim_tx_new(sess, conn, AIM_FRAMETYPE_FLAP, 0x02, 10+2))) |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2167
diff
changeset
|
85 | return -ENOMEM; |
| 2086 | 86 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2167
diff
changeset
|
87 | snacid = aim_cachesnac(sess, family, subtype, 0x0000, NULL, 0); |
| 2086 | 88 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2167
diff
changeset
|
89 | aim_putsnac(&fr->data, family, subtype, 0x0000, snacid); |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2167
diff
changeset
|
90 | aimbs_put16(&fr->data, *shortdata); |
| 2086 | 91 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2167
diff
changeset
|
92 | aim_tx_enqueue(sess, fr); |
| 2086 | 93 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2167
diff
changeset
|
94 | return 0; |
| 2086 | 95 | } |
| 96 | ||
| 97 | /* | |
|
2703
6111a9790868
[gaim-migrate @ 2716]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2675
diff
changeset
|
98 | * Should be generic enough to handle the errors for all groups. |
| 2086 | 99 | * |
| 100 | */ | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2167
diff
changeset
|
101 | static int generror(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx, aim_modsnac_t *snac, aim_bstream_t *bs) |
| 2086 | 102 | { |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2167
diff
changeset
|
103 | int ret = 0; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2167
diff
changeset
|
104 | int error = 0; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2167
diff
changeset
|
105 | aim_rxcallback_t userfunc; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2167
diff
changeset
|
106 | aim_snac_t *snac2; |
| 2086 | 107 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2167
diff
changeset
|
108 | snac2 = aim_remsnac(sess, snac->id); |
| 2086 | 109 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2167
diff
changeset
|
110 | if (aim_bstream_empty(bs)) |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2167
diff
changeset
|
111 | error = aimbs_get16(bs); |
| 2086 | 112 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2167
diff
changeset
|
113 | if ((userfunc = aim_callhandler(sess, rx->conn, snac->family, snac->subtype))) |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2167
diff
changeset
|
114 | ret = userfunc(sess, rx, error, snac2 ? snac2->data : NULL); |
| 2086 | 115 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2167
diff
changeset
|
116 | if (snac2) |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2167
diff
changeset
|
117 | free(snac2->data); |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2167
diff
changeset
|
118 | free(snac2); |
| 2086 | 119 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2167
diff
changeset
|
120 | return ret; |
| 2086 | 121 | } |
| 122 | ||
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2167
diff
changeset
|
123 | static int snachandler(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx, aim_modsnac_t *snac, aim_bstream_t *bs) |
| 2086 | 124 | { |
| 125 | ||
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2167
diff
changeset
|
126 | if (snac->subtype == 0x0001) |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2167
diff
changeset
|
127 | return generror(sess, mod, rx, snac, bs); |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2167
diff
changeset
|
128 | else if ((snac->family == 0xffff) && (snac->subtype == 0xffff)) { |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2167
diff
changeset
|
129 | aim_rxcallback_t userfunc; |
| 2086 | 130 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2167
diff
changeset
|
131 | if ((userfunc = aim_callhandler(sess, rx->conn, snac->family, snac->subtype))) |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2167
diff
changeset
|
132 | return userfunc(sess, rx); |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2167
diff
changeset
|
133 | } |
| 2086 | 134 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2167
diff
changeset
|
135 | return 0; |
| 2086 | 136 | } |
| 137 | ||
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2167
diff
changeset
|
138 | faim_internal int misc_modfirst(aim_session_t *sess, aim_module_t *mod) |
| 2086 | 139 | { |
| 140 | ||
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2167
diff
changeset
|
141 | mod->family = 0xffff; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2167
diff
changeset
|
142 | mod->version = 0x0000; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2167
diff
changeset
|
143 | mod->flags = AIM_MODFLAG_MULTIFAMILY; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2167
diff
changeset
|
144 | strncpy(mod->name, "misc", sizeof(mod->name)); |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2167
diff
changeset
|
145 | mod->snachandler = snachandler; |
| 2086 | 146 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2167
diff
changeset
|
147 | return 0; |
| 2086 | 148 | } |