annotate src/protocols/oscar/icon.c @ 4853:fbfdacf7c611

[gaim-migrate @ 5180] This is better auto-getting of icons for oscar. Ethan made me write a tobase16 fucntion and a from16 function (and he done gave me some good advice for that, too) which convert to and from arbitrary data and a null terminated string of hex. I use these to get and store the md5 checksum for each icon sent to you. This way, Gaim will request the icon when the md5sum differs. Er, so the md5sum is stored in blist.xml. Previously, Gaim would only request the icon if you did not have any buddy icon for the other person. Now it will request it if the local md5sum differs from the server md5sum. To sum it up again, if their icon changes, gaim will request the new one. I tried using the base64 functions, but they look like they want to work with null terminated strings, rather than arbitrary data. committer: Tailor Script <tailor@pidgin.im>
author Mark Doliner <mark@kingant.net>
date Sat, 22 Mar 2003 07:29:34 +0000
parents e6654fab588b
children 773135edda4a
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
4805
a7e99eb2c0f2 [gaim-migrate @ 5125]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
1 /*
a7e99eb2c0f2 [gaim-migrate @ 5125]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
2 * Family 0x0010 - Server stored buddy icons
a7e99eb2c0f2 [gaim-migrate @ 5125]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
3 *
a7e99eb2c0f2 [gaim-migrate @ 5125]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
4 * Used for storing and retrieving your cute little buddy icon
a7e99eb2c0f2 [gaim-migrate @ 5125]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
5 * from the AIM servers.
a7e99eb2c0f2 [gaim-migrate @ 5125]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
6 *
a7e99eb2c0f2 [gaim-migrate @ 5125]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
7 */
a7e99eb2c0f2 [gaim-migrate @ 5125]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
8
a7e99eb2c0f2 [gaim-migrate @ 5125]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
9 #define FAIM_INTERNAL
a7e99eb2c0f2 [gaim-migrate @ 5125]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
10 #include <aim.h>
a7e99eb2c0f2 [gaim-migrate @ 5125]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
11
a7e99eb2c0f2 [gaim-migrate @ 5125]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
12 /**
a7e99eb2c0f2 [gaim-migrate @ 5125]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
13 * Subtype 0x0004 - Request someone's icon.
a7e99eb2c0f2 [gaim-migrate @ 5125]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
14 *
a7e99eb2c0f2 [gaim-migrate @ 5125]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
15 * @param sess The oscar session.
a7e99eb2c0f2 [gaim-migrate @ 5125]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
16 * @param conn The icon connection for this session.
a7e99eb2c0f2 [gaim-migrate @ 5125]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
17 * @return Return 0 if no errors, otherwise return the error number.
a7e99eb2c0f2 [gaim-migrate @ 5125]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
18 */
4853
fbfdacf7c611 [gaim-migrate @ 5180]
Mark Doliner <mark@kingant.net>
parents: 4826
diff changeset
19 faim_export int aim_icon_requesticon(aim_session_t *sess, const char *sn, const fu8_t *iconcsum, fu16_t iconcsumlen)
4805
a7e99eb2c0f2 [gaim-migrate @ 5125]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
20 {
a7e99eb2c0f2 [gaim-migrate @ 5125]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
21 aim_conn_t *conn;
a7e99eb2c0f2 [gaim-migrate @ 5125]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
22 aim_frame_t *fr;
a7e99eb2c0f2 [gaim-migrate @ 5125]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
23 aim_snacid_t snacid;
a7e99eb2c0f2 [gaim-migrate @ 5125]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
24
4853
fbfdacf7c611 [gaim-migrate @ 5180]
Mark Doliner <mark@kingant.net>
parents: 4826
diff changeset
25 if (!sess || !(conn = aim_conn_findbygroup(sess, 0x0010)) || !sn || !strlen(sn) || !iconcsum || !iconcsumlen)
4805
a7e99eb2c0f2 [gaim-migrate @ 5125]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
26 return -EINVAL;
a7e99eb2c0f2 [gaim-migrate @ 5125]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
27
4853
fbfdacf7c611 [gaim-migrate @ 5180]
Mark Doliner <mark@kingant.net>
parents: 4826
diff changeset
28 if (!(fr = aim_tx_new(sess, conn, AIM_FRAMETYPE_FLAP, 0x02, 10 + 1+strlen(sn) + 4 + 1+iconcsumlen)))
4805
a7e99eb2c0f2 [gaim-migrate @ 5125]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
29 return -ENOMEM;
a7e99eb2c0f2 [gaim-migrate @ 5125]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
30 snacid = aim_cachesnac(sess, 0x0010, 0x0004, 0x0000, NULL, 0);
a7e99eb2c0f2 [gaim-migrate @ 5125]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
31 aim_putsnac(&fr->data, 0x0010, 0x0004, 0x0000, snacid);
a7e99eb2c0f2 [gaim-migrate @ 5125]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
32
a7e99eb2c0f2 [gaim-migrate @ 5125]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
33 /* Screen name */
a7e99eb2c0f2 [gaim-migrate @ 5125]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
34 aimbs_put8(&fr->data, strlen(sn));
a7e99eb2c0f2 [gaim-migrate @ 5125]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
35 aimbs_putraw(&fr->data, sn, strlen(sn));
a7e99eb2c0f2 [gaim-migrate @ 5125]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
36
4826
e6654fab588b [gaim-migrate @ 5151]
Mark Doliner <mark@kingant.net>
parents: 4805
diff changeset
37 /* Some numbers. You like numbers, right? */
e6654fab588b [gaim-migrate @ 5151]
Mark Doliner <mark@kingant.net>
parents: 4805
diff changeset
38 aimbs_put8(&fr->data, 0x01);
e6654fab588b [gaim-migrate @ 5151]
Mark Doliner <mark@kingant.net>
parents: 4805
diff changeset
39 aimbs_put16(&fr->data, 0x0001);
4805
a7e99eb2c0f2 [gaim-migrate @ 5125]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
40 aimbs_put8(&fr->data, 0x01);
a7e99eb2c0f2 [gaim-migrate @ 5125]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
41
a7e99eb2c0f2 [gaim-migrate @ 5125]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
42 /* Icon string */
4853
fbfdacf7c611 [gaim-migrate @ 5180]
Mark Doliner <mark@kingant.net>
parents: 4826
diff changeset
43 aimbs_put8(&fr->data, iconcsumlen);
fbfdacf7c611 [gaim-migrate @ 5180]
Mark Doliner <mark@kingant.net>
parents: 4826
diff changeset
44 aimbs_putraw(&fr->data, iconcsum, iconcsumlen);
4805
a7e99eb2c0f2 [gaim-migrate @ 5125]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
45
a7e99eb2c0f2 [gaim-migrate @ 5125]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
46 aim_tx_enqueue(sess, fr);
a7e99eb2c0f2 [gaim-migrate @ 5125]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
47
a7e99eb2c0f2 [gaim-migrate @ 5125]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
48 return 0;
a7e99eb2c0f2 [gaim-migrate @ 5125]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
49 }
a7e99eb2c0f2 [gaim-migrate @ 5125]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
50
a7e99eb2c0f2 [gaim-migrate @ 5125]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
51
a7e99eb2c0f2 [gaim-migrate @ 5125]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
52 /**
a7e99eb2c0f2 [gaim-migrate @ 5125]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
53 * Subtype 0x0005 - Receive a buddy icon.
a7e99eb2c0f2 [gaim-migrate @ 5125]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
54 *
a7e99eb2c0f2 [gaim-migrate @ 5125]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
55 * This is sent in response to a buddy icon request.
a7e99eb2c0f2 [gaim-migrate @ 5125]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
56 */
a7e99eb2c0f2 [gaim-migrate @ 5125]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
57 static int parseicon(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx, aim_modsnac_t *snac, aim_bstream_t *bs)
a7e99eb2c0f2 [gaim-migrate @ 5125]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
58 {
a7e99eb2c0f2 [gaim-migrate @ 5125]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
59 aim_rxcallback_t userfunc;
a7e99eb2c0f2 [gaim-migrate @ 5125]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
60 int i;
a7e99eb2c0f2 [gaim-migrate @ 5125]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
61 char *sn;
4853
fbfdacf7c611 [gaim-migrate @ 5180]
Mark Doliner <mark@kingant.net>
parents: 4826
diff changeset
62 fu16_t flags, iconlen;
fbfdacf7c611 [gaim-migrate @ 5180]
Mark Doliner <mark@kingant.net>
parents: 4826
diff changeset
63 fu8_t number, iconcsumlen, *iconcsum, *icon;
4805
a7e99eb2c0f2 [gaim-migrate @ 5125]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
64
a7e99eb2c0f2 [gaim-migrate @ 5125]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
65 sn = aimbs_getstr(bs, aimbs_get8(bs));
4853
fbfdacf7c611 [gaim-migrate @ 5180]
Mark Doliner <mark@kingant.net>
parents: 4826
diff changeset
66 flags = aimbs_get16(bs);
fbfdacf7c611 [gaim-migrate @ 5180]
Mark Doliner <mark@kingant.net>
parents: 4826
diff changeset
67 number = aimbs_get8(bs);
fbfdacf7c611 [gaim-migrate @ 5180]
Mark Doliner <mark@kingant.net>
parents: 4826
diff changeset
68 iconcsumlen = aimbs_get8(bs);
fbfdacf7c611 [gaim-migrate @ 5180]
Mark Doliner <mark@kingant.net>
parents: 4826
diff changeset
69 iconcsum = aimbs_getraw(bs, iconcsumlen);
4805
a7e99eb2c0f2 [gaim-migrate @ 5125]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
70 iconlen = aimbs_get16(bs);
a7e99eb2c0f2 [gaim-migrate @ 5125]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
71 icon = aimbs_getraw(bs, iconlen);
a7e99eb2c0f2 [gaim-migrate @ 5125]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
72
a7e99eb2c0f2 [gaim-migrate @ 5125]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
73 if ((userfunc = aim_callhandler(sess, rx->conn, snac->family, snac->subtype)))
4853
fbfdacf7c611 [gaim-migrate @ 5180]
Mark Doliner <mark@kingant.net>
parents: 4826
diff changeset
74 return userfunc(sess, rx, sn, iconcsum, iconcsumlen, icon, iconlen);
4805
a7e99eb2c0f2 [gaim-migrate @ 5125]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
75
4853
fbfdacf7c611 [gaim-migrate @ 5180]
Mark Doliner <mark@kingant.net>
parents: 4826
diff changeset
76 free(iconcsum);
4805
a7e99eb2c0f2 [gaim-migrate @ 5125]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
77 free(icon);
a7e99eb2c0f2 [gaim-migrate @ 5125]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
78
a7e99eb2c0f2 [gaim-migrate @ 5125]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
79 return 0;
a7e99eb2c0f2 [gaim-migrate @ 5125]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
80 }
a7e99eb2c0f2 [gaim-migrate @ 5125]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
81
a7e99eb2c0f2 [gaim-migrate @ 5125]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
82 static int snachandler(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx, aim_modsnac_t *snac, aim_bstream_t *bs)
a7e99eb2c0f2 [gaim-migrate @ 5125]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
83 {
a7e99eb2c0f2 [gaim-migrate @ 5125]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
84
a7e99eb2c0f2 [gaim-migrate @ 5125]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
85 if (snac->subtype == 0x0005)
a7e99eb2c0f2 [gaim-migrate @ 5125]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
86 return parseicon(sess, mod, rx, snac, bs);
a7e99eb2c0f2 [gaim-migrate @ 5125]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
87
a7e99eb2c0f2 [gaim-migrate @ 5125]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
88 return 0;
a7e99eb2c0f2 [gaim-migrate @ 5125]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
89 }
a7e99eb2c0f2 [gaim-migrate @ 5125]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
90
a7e99eb2c0f2 [gaim-migrate @ 5125]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
91 faim_internal int icon_modfirst(aim_session_t *sess, aim_module_t *mod)
a7e99eb2c0f2 [gaim-migrate @ 5125]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
92 {
a7e99eb2c0f2 [gaim-migrate @ 5125]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
93
a7e99eb2c0f2 [gaim-migrate @ 5125]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
94 mod->family = 0x0010;
a7e99eb2c0f2 [gaim-migrate @ 5125]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
95 mod->version = 0x0001;
a7e99eb2c0f2 [gaim-migrate @ 5125]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
96 mod->toolid = 0x0010;
a7e99eb2c0f2 [gaim-migrate @ 5125]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
97 mod->toolversion = 0x0629;
a7e99eb2c0f2 [gaim-migrate @ 5125]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
98 mod->flags = 0;
a7e99eb2c0f2 [gaim-migrate @ 5125]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
99 strncpy(mod->name, "icon", sizeof(mod->name));
a7e99eb2c0f2 [gaim-migrate @ 5125]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
100 mod->snachandler = snachandler;
a7e99eb2c0f2 [gaim-migrate @ 5125]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
101
a7e99eb2c0f2 [gaim-migrate @ 5125]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
102 return 0;
a7e99eb2c0f2 [gaim-migrate @ 5125]
Mark Doliner <mark@kingant.net>
parents:
diff changeset
103 }