Tue, 07 Jan 2003 21:19:05 +0000
[gaim-migrate @ 4475]
This is 128KB of raw kickassyness. AKA ICQ SSI.
I've rewritten all the important parts of ssi.c. Things should be better.
One thing I like a lot is that gaim will store the alias you assign to
buddies in your server list for both AIM and ICQ. WinICQ supports this,
but WinAIM doesn't. However, it doesn't seem to interfere with WinAIM,
and Gaim can still use it. I dunno, I just think it's neat.
Anyway, go nuts. Let me know if something doesn't work, because that's bad.
| 2672 | 1 | /* |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
2 | * Family 0x0013 - Server-Side/Stored Information. |
| 2672 | 3 | * |
| 4 | * Relatively new facility that allows storing of certain types of information, | |
| 5 | * such as a users buddy list, permit/deny list, and permit/deny preferences, | |
| 6 | * to be stored on the server, so that they can be accessed from any client. | |
| 7 | * | |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
8 | * We keep 2 copies of SSI data: |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
9 | * 1) An exact copy of what is stored on the AIM servers. |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
10 | * 2) A local copy that we make changes to, and then send diffs |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
11 | * between this and the exact copy to keep them in sync. |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
12 | * |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
13 | * All the "aim_ssi_itemlist_bleh" functions near the top just modify the list |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
14 | * that is given to them (eg. they don't send SNACs). |
|
3210
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
15 | * |
|
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
16 | * The SNAC sending and receiving functions are lower down in the file, and |
|
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
17 | * they're simpler. They are in the order of the subtypes they deal with, |
|
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
18 | * starting with the request rights function (subtype 0x0002), then parse |
|
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
19 | * rights (subtype 0x0003), then--well, you get the idea. |
|
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
20 | * |
| 2672 | 21 | * This is entirely too complicated. |
| 2991 | 22 | * You don't know the half of it. |
| 23 | * | |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
24 | * XXX - Preserve unknown data in TLV lists |
| 2672 | 25 | * |
| 26 | */ | |
| 27 | ||
| 28 | #define FAIM_INTERNAL | |
| 29 | #include <aim.h> | |
| 30 | ||
|
3210
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
31 | /** |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
32 | * Locally rebuild the 0x00c8 TLV in the additional data of the given group. |
|
3210
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
33 | * |
|
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
34 | * @param list A pointer to a pointer to the current list of items. |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
35 | * @param name A null terminated string containing the group name, or NULL |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
36 | * if you want to modify the master group. |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
37 | * @return Return a pointer to the modified item. |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
38 | */ |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
39 | static struct aim_ssi_item *aim_ssi_itemlist_rebuildgroup(struct aim_ssi_item *list, const char *name) |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
40 | { |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
41 | int newlen; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
42 | struct aim_ssi_item *cur, *group; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
43 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
44 | if (!list) |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
45 | return NULL; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
46 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
47 | /* Find the group */ |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
48 | if (!(group = aim_ssi_itemlist_finditem(list, name, NULL, AIM_SSI_TYPE_GROUP))) |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
49 | return NULL; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
50 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
51 | /* Free the old data */ |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
52 | aim_freetlvchain(&group->data); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
53 | group->data = NULL; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
54 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
55 | /* Find the length for the new additional data */ |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
56 | newlen = 0; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
57 | if (group->gid == 0x0000) { |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
58 | for (cur=list; cur; cur=cur->next) |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
59 | if ((cur->type == AIM_SSI_TYPE_GROUP) && (cur->gid != 0x0000)) |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
60 | newlen += 2; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
61 | } else { |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
62 | for (cur=list; cur; cur=cur->next) |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
63 | if ((cur->gid == group->gid) && (cur->type == AIM_SSI_TYPE_BUDDY)) |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
64 | newlen += 2; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
65 | } |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
66 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
67 | /* Build the new TLV list */ |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
68 | if (newlen > 0) { |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
69 | fu8_t *newdata; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
70 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
71 | if (!(newdata = (fu8_t *)malloc((newlen)*sizeof(fu8_t)))) |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
72 | return NULL; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
73 | newlen = 0; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
74 | if (group->gid == 0x0000) { |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
75 | for (cur=list; cur; cur=cur->next) |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
76 | if ((cur->type == AIM_SSI_TYPE_GROUP) && (cur->gid != 0x0000)) |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
77 | newlen += aimutil_put16(newdata+newlen, cur->gid); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
78 | } else { |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
79 | for (cur=list; cur; cur=cur->next) |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
80 | if ((cur->gid == group->gid) && (cur->type == AIM_SSI_TYPE_BUDDY)) |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
81 | newlen += aimutil_put16(newdata+newlen, cur->bid); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
82 | } |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
83 | aim_addtlvtochain_raw(&group->data, 0x00c8, newlen, newdata); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
84 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
85 | free(newdata); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
86 | } |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
87 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
88 | return group; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
89 | } |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
90 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
91 | /** |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
92 | * Locally add a new item to the given item list. |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
93 | * |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
94 | * XXX - This should copy data, not just use it. |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
95 | * |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
96 | * @param list A pointer to a pointer to the current list of items. |
|
3210
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
97 | * @param name A null terminated string of the name of the new item, or NULL if the |
|
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
98 | * item should have no name. |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
99 | * @param gid The group ID# you want the new item to have, or 0xFFFF if we should pick something. |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
100 | * @param bid The buddy ID# you want the new item to have, or 0xFFFF if we should pick something. |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
101 | * @param type The type of the item, 0x0000 for a contact, 0x0001 for a group, etc. |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
102 | * @param data The additional data for the new item. |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
103 | * @return A pointer to the newly created item. |
| 2991 | 104 | */ |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
105 | static struct aim_ssi_item *aim_ssi_itemlist_add(struct aim_ssi_item **list, const char *name, fu16_t gid, fu16_t bid, fu16_t type, aim_tlvlist_t *data) |
| 2991 | 106 | { |
|
3210
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
107 | int i; |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
108 | struct aim_ssi_item *cur, *new; |
|
3210
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
109 | |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
110 | if (!list) |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
111 | return NULL; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
112 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
113 | if (!(new = (struct aim_ssi_item *)malloc(sizeof(struct aim_ssi_item)))) |
|
3210
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
114 | return NULL; |
|
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
115 | |
|
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
116 | /* Set the name */ |
|
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
117 | if (name) { |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
118 | new->name = (char *)malloc((strlen(name)+1)*sizeof(char)); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
119 | strcpy(new->name, name); |
|
3210
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
120 | } else |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
121 | new->name = NULL; |
|
3210
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
122 | |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
123 | /* Set the group ID# and buddy ID# */ |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
124 | new->gid = gid; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
125 | new->bid = bid; |
|
3210
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
126 | if (type == AIM_SSI_TYPE_GROUP) { |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
127 | if ((new->gid == 0xFFFF) && name) { |
|
3210
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
128 | do { |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
129 | new->gid += 0x0001; |
|
3210
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
130 | for (cur=*list, i=0; ((cur) && (!i)); cur=cur->next) |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
131 | if ((cur->type == AIM_SSI_TYPE_GROUP) && (cur->gid == new->gid)) |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
132 | i=1; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
133 | } while (i); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
134 | } |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
135 | } else { |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
136 | if (new->bid == 0xFFFF) { |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
137 | do { |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
138 | new->bid += 0x0001; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
139 | for (cur=*list, i=0; ((cur) && (!i)); cur=cur->next) |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
140 | if ((cur->bid == new->bid) && (cur->gid == new->gid)) |
|
3210
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
141 | i=1; |
|
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
142 | } while (i); |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
143 | } |
|
3210
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
144 | } |
|
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
145 | |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
146 | /* Set the type */ |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
147 | new->type = type; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
148 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
149 | /* Set the TLV list */ |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
150 | new->data = data; |
|
3210
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
151 | |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
152 | /* Add the item to the list in the correct numerical position. Fancy, eh? */ |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
153 | if (*list) { |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
154 | if ((new->gid < (*list)->gid) || ((new->gid == (*list)->gid) && (new->bid < (*list)->bid))) { |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
155 | new->next = *list; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
156 | *list = new; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
157 | } else { |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
158 | struct aim_ssi_item *prev; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
159 | for ((prev=*list, cur=(*list)->next); (cur && (new->gid > cur->gid || ((new->gid == cur->gid) && (new->bid > cur->bid)))); prev=cur, cur=cur->next); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
160 | new->next = prev->next; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
161 | prev->next = new; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
162 | } |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
163 | } else { |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
164 | new->next = *list; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
165 | *list = new; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
166 | } |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
167 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
168 | return new; |
|
3210
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
169 | } |
|
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
170 | |
|
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
171 | /** |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
172 | * Locally delete an item from the given item list. |
|
3210
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
173 | * |
|
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
174 | * @param list A pointer to a pointer to the current list of items. |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
175 | * @param del A pointer to the item you want to remove from the list. |
|
3210
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
176 | * @return Return 0 if no errors, otherwise return the error number. |
|
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
177 | */ |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
178 | static int aim_ssi_itemlist_del(struct aim_ssi_item **list, struct aim_ssi_item *del) |
|
3210
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
179 | { |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
180 | if (!list || !(*list) || !del) |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
181 | return -EINVAL; |
|
3210
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
182 | |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
183 | /* Remove the item from the list */ |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
184 | if (*list == del) { |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
185 | *list = del->next; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
186 | } else { |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
187 | struct aim_ssi_item *cur; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
188 | for (cur=*list; (cur->next && (cur->next!=del)); cur=cur->next); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
189 | if (cur->next) |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
190 | cur->next = cur->next->next; |
|
3210
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
191 | } |
|
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
192 | |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
193 | /* Free the deleted item */ |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
194 | free(del->name); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
195 | aim_freetlvchain(&del->data); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
196 | free(del); |
|
3210
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
197 | |
| 2991 | 198 | return 0; |
| 199 | } | |
| 200 | ||
|
3210
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
201 | /** |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
202 | * Compare two items to see if they have the same data. |
|
3210
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
203 | * |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
204 | * @param cur1 A pointer to a pointer to the first item. |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
205 | * @param cur2 A pointer to a pointer to the second item. |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
206 | * @return Return 0 if no differences, or a number if there are differences. |
|
3017
e01d7ec2b5db
[gaim-migrate @ 3030]
Mark Doliner <markdoliner@pidgin.im>
parents:
3000
diff
changeset
|
207 | */ |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
208 | static int aim_ssi_itemlist_cmp(struct aim_ssi_item *cur1, struct aim_ssi_item *cur2) |
|
3017
e01d7ec2b5db
[gaim-migrate @ 3030]
Mark Doliner <markdoliner@pidgin.im>
parents:
3000
diff
changeset
|
209 | { |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
210 | if (!cur1 || !cur2) |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
211 | return 1; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
212 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
213 | if (cur1->data && !cur2->data) |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
214 | return 2; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
215 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
216 | if (!cur1->data && cur2->data) |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
217 | return 3; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
218 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
219 | if (cur1->data && cur2->data) { |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
220 | /* Write each TLV list to a bstream and then memcmp them */ |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
221 | aim_bstream_t bs1, bs2; |
|
3210
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
222 | |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
223 | if (aim_sizetlvchain(&cur1->data) != aim_sizetlvchain(&cur2->data)) |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
224 | return 4; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
225 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
226 | aim_bstream_init(&bs1, ((fu8_t *)malloc(aim_sizetlvchain(&cur1->data)*sizeof(fu8_t))), aim_sizetlvchain(&cur1->data)); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
227 | aim_bstream_init(&bs2, ((fu8_t *)malloc(aim_sizetlvchain(&cur2->data)*sizeof(fu8_t))), aim_sizetlvchain(&cur2->data)); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
228 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
229 | aim_writetlvchain(&bs1, &cur1->data); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
230 | aim_writetlvchain(&bs2, &cur2->data); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
231 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
232 | if (memcmp(bs1.data, bs2.data, bs1.len)) { |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
233 | free(bs1.data); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
234 | free(bs2.data); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
235 | return 4; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
236 | } |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
237 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
238 | free(bs1.data); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
239 | free(bs2.data); |
|
3210
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
240 | } |
|
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
241 | |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
242 | if (cur1->name && !cur2->name) |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
243 | return 5; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
244 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
245 | if (!cur1->name && cur2->name) |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
246 | return 6; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
247 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
248 | if (cur1->name && cur2->name && aim_sncmp(cur1->name, cur2->name)) |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
249 | return 7; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
250 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
251 | if (cur1->gid != cur2->gid) |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
252 | return 8; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
253 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
254 | if (cur1->bid != cur2->bid) |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
255 | return 9; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
256 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
257 | if (cur1->type != cur2->type) |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
258 | return 10; |
|
3210
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
259 | |
|
3017
e01d7ec2b5db
[gaim-migrate @ 3030]
Mark Doliner <markdoliner@pidgin.im>
parents:
3000
diff
changeset
|
260 | return 0; |
|
e01d7ec2b5db
[gaim-migrate @ 3030]
Mark Doliner <markdoliner@pidgin.im>
parents:
3000
diff
changeset
|
261 | } |
|
e01d7ec2b5db
[gaim-migrate @ 3030]
Mark Doliner <markdoliner@pidgin.im>
parents:
3000
diff
changeset
|
262 | |
|
3210
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
263 | /** |
|
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
264 | * Locally find an item given a group ID# and a buddy ID#. |
|
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
265 | * |
|
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
266 | * @param list A pointer to the current list of items. |
|
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
267 | * @param gid The group ID# of the desired item. |
|
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
268 | * @param bid The buddy ID# of the desired item. |
|
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
269 | * @return Return a pointer to the item if found, else return NULL; |
| 2991 | 270 | */ |
|
3210
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
271 | faim_export struct aim_ssi_item *aim_ssi_itemlist_find(struct aim_ssi_item *list, fu16_t gid, fu16_t bid) |
| 2991 | 272 | { |
| 273 | struct aim_ssi_item *cur; | |
|
3210
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
274 | for (cur=list; cur; cur=cur->next) |
|
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
275 | if ((cur->gid == gid) && (cur->bid == bid)) |
|
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
276 | return cur; |
| 2991 | 277 | return NULL; |
| 278 | } | |
| 279 | ||
|
3210
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
280 | /** |
|
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
281 | * Locally find an item given a group name, screen name, and type. If group name |
|
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
282 | * and screen name are null, then just return the first item of the given type. |
|
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
283 | * |
|
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
284 | * @param list A pointer to the current list of items. |
|
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
285 | * @param gn The group name of the desired item. |
|
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
286 | * @param bn The buddy name of the desired item. |
|
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
287 | * @param type The type of the desired item. |
|
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
288 | * @return Return a pointer to the item if found, else return NULL; |
|
3109
c193eb9c1c30
[gaim-migrate @ 3123]
Mark Doliner <markdoliner@pidgin.im>
parents:
3090
diff
changeset
|
289 | */ |
| 3466 | 290 | faim_export struct aim_ssi_item *aim_ssi_itemlist_finditem(struct aim_ssi_item *list, const char *gn, const char *sn, fu16_t type) |
|
3109
c193eb9c1c30
[gaim-migrate @ 3123]
Mark Doliner <markdoliner@pidgin.im>
parents:
3090
diff
changeset
|
291 | { |
|
3210
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
292 | struct aim_ssi_item *cur; |
|
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
293 | if (!list) |
|
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
294 | return NULL; |
|
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
295 | |
|
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
296 | if (gn && sn) { /* For finding buddies in groups */ |
|
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
297 | for (cur=list; cur; cur=cur->next) |
|
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
298 | if ((cur->type == type) && (cur->name) && !(aim_sncmp(cur->name, sn))) { |
|
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
299 | struct aim_ssi_item *curg; |
|
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
300 | for (curg=list; curg; curg=curg->next) |
|
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
301 | if ((curg->type == AIM_SSI_TYPE_GROUP) && (curg->gid == cur->gid) && (curg->name) && !(aim_sncmp(curg->name, gn))) |
|
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
302 | return cur; |
|
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
303 | } |
|
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
304 | |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
305 | } else if (gn) { /* For finding groups */ |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
306 | for (cur=list; cur; cur=cur->next) { |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
307 | if ((cur->type == type) && (cur->bid == 0x0000) && (cur->name) && !(aim_sncmp(cur->name, gn))) { |
|
3210
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
308 | return cur; |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
309 | } |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
310 | } |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
311 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
312 | } else if (sn) { /* For finding permits, denies, and ignores */ |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
313 | for (cur=list; cur; cur=cur->next) { |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
314 | if ((cur->type == type) && (cur->gid == 0x0000) && (cur->name) && !(aim_sncmp(cur->name, sn))) { |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
315 | return cur; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
316 | } |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
317 | } |
|
3210
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
318 | |
|
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
319 | /* For stuff without names--permit deny setting, visibility mask, etc. */ |
|
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
320 | } else for (cur=list; cur; cur=cur->next) { |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
321 | if ((cur->type == type) && (!cur->name)) |
|
3210
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
322 | return cur; |
|
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
323 | } |
|
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
324 | |
|
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
325 | return NULL; |
|
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
326 | } |
|
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
327 | |
|
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
328 | /** |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
329 | * Check if the given buddy exists in any group in the buddy list. |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
330 | * |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
331 | * @param list A pointer to the current list of items. |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
332 | * @param sn The group name of the desired item. |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
333 | * @return Return a pointer to the name of the item if found, else return NULL; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
334 | */ |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
335 | faim_export struct aim_ssi_item *aim_ssi_itemlist_exists(struct aim_ssi_item *list, const char *sn) |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
336 | { |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
337 | struct aim_ssi_item *cur; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
338 | if (!list || !sn) |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
339 | return NULL; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
340 | for (cur=list; cur; cur=cur->next) |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
341 | if ((cur->type == AIM_SSI_TYPE_BUDDY) && (cur->name) && (!aim_sncmp(cur->name, sn))) |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
342 | return cur; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
343 | return NULL; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
344 | } |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
345 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
346 | /** |
|
3210
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
347 | * Locally find the parent item of the given buddy name. |
|
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
348 | * |
|
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
349 | * @param list A pointer to the current list of items. |
|
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
350 | * @param bn The buddy name of the desired item. |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
351 | * @return Return a pointer to the name of the item if found, else return NULL; |
|
3210
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
352 | */ |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
353 | faim_export char *aim_ssi_itemlist_findparentname(struct aim_ssi_item *list, const char *sn) |
|
3210
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
354 | { |
|
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
355 | struct aim_ssi_item *cur, *curg; |
|
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
356 | if (!list || !sn) |
|
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
357 | return NULL; |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
358 | if (!(cur = aim_ssi_itemlist_exists(list, sn))) |
|
3210
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
359 | return NULL; |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
360 | if (!(curg = aim_ssi_itemlist_find(list, cur->gid, 0x0000))) |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
361 | return NULL; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
362 | return curg->name; |
|
3210
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
363 | } |
|
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
364 | |
|
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
365 | /** |
|
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
366 | * Locally find the permit/deny setting item, and return the setting. |
|
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
367 | * |
|
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
368 | * @param list A pointer to the current list of items. |
|
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
369 | * @return Return the current SSI permit deny setting, or 0 if no setting was found. |
|
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
370 | */ |
|
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
371 | faim_export int aim_ssi_getpermdeny(struct aim_ssi_item *list) |
|
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
372 | { |
|
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
373 | struct aim_ssi_item *cur = aim_ssi_itemlist_finditem(list, NULL, NULL, AIM_SSI_TYPE_PDINFO); |
|
3109
c193eb9c1c30
[gaim-migrate @ 3123]
Mark Doliner <markdoliner@pidgin.im>
parents:
3090
diff
changeset
|
374 | if (cur) { |
|
c193eb9c1c30
[gaim-migrate @ 3123]
Mark Doliner <markdoliner@pidgin.im>
parents:
3090
diff
changeset
|
375 | aim_tlvlist_t *tlvlist = cur->data; |
|
c193eb9c1c30
[gaim-migrate @ 3123]
Mark Doliner <markdoliner@pidgin.im>
parents:
3090
diff
changeset
|
376 | if (tlvlist) { |
|
c193eb9c1c30
[gaim-migrate @ 3123]
Mark Doliner <markdoliner@pidgin.im>
parents:
3090
diff
changeset
|
377 | aim_tlv_t *tlv = aim_gettlv(tlvlist, 0x00ca, 1); |
|
c193eb9c1c30
[gaim-migrate @ 3123]
Mark Doliner <markdoliner@pidgin.im>
parents:
3090
diff
changeset
|
378 | if (tlv && tlv->value) |
|
c193eb9c1c30
[gaim-migrate @ 3123]
Mark Doliner <markdoliner@pidgin.im>
parents:
3090
diff
changeset
|
379 | return aimutil_get8(tlv->value); |
|
c193eb9c1c30
[gaim-migrate @ 3123]
Mark Doliner <markdoliner@pidgin.im>
parents:
3090
diff
changeset
|
380 | } |
|
c193eb9c1c30
[gaim-migrate @ 3123]
Mark Doliner <markdoliner@pidgin.im>
parents:
3090
diff
changeset
|
381 | } |
|
c193eb9c1c30
[gaim-migrate @ 3123]
Mark Doliner <markdoliner@pidgin.im>
parents:
3090
diff
changeset
|
382 | return 0; |
|
c193eb9c1c30
[gaim-migrate @ 3123]
Mark Doliner <markdoliner@pidgin.im>
parents:
3090
diff
changeset
|
383 | } |
|
c193eb9c1c30
[gaim-migrate @ 3123]
Mark Doliner <markdoliner@pidgin.im>
parents:
3090
diff
changeset
|
384 | |
|
3210
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
385 | /** |
|
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
386 | * Locally find the presence flag item, and return the setting. The returned setting is a |
|
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
387 | * bitmask of the user flags that you are visible to. See the AIM_FLAG_* #defines |
|
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
388 | * in aim.h |
|
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
389 | * |
|
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
390 | * @param list A pointer to the current list of items. |
|
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
391 | * @return Return the current visibility mask. |
|
3109
c193eb9c1c30
[gaim-migrate @ 3123]
Mark Doliner <markdoliner@pidgin.im>
parents:
3090
diff
changeset
|
392 | */ |
|
3210
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
393 | faim_export fu32_t aim_ssi_getpresence(struct aim_ssi_item *list) |
|
3109
c193eb9c1c30
[gaim-migrate @ 3123]
Mark Doliner <markdoliner@pidgin.im>
parents:
3090
diff
changeset
|
394 | { |
|
3210
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
395 | struct aim_ssi_item *cur = aim_ssi_itemlist_finditem(list, NULL, NULL, AIM_SSI_TYPE_PRESENCEPREFS); |
|
3109
c193eb9c1c30
[gaim-migrate @ 3123]
Mark Doliner <markdoliner@pidgin.im>
parents:
3090
diff
changeset
|
396 | if (cur) { |
|
c193eb9c1c30
[gaim-migrate @ 3123]
Mark Doliner <markdoliner@pidgin.im>
parents:
3090
diff
changeset
|
397 | aim_tlvlist_t *tlvlist = cur->data; |
|
c193eb9c1c30
[gaim-migrate @ 3123]
Mark Doliner <markdoliner@pidgin.im>
parents:
3090
diff
changeset
|
398 | if (tlvlist) { |
|
c193eb9c1c30
[gaim-migrate @ 3123]
Mark Doliner <markdoliner@pidgin.im>
parents:
3090
diff
changeset
|
399 | aim_tlv_t *tlv = aim_gettlv(tlvlist, 0x00c9, 1); |
|
c193eb9c1c30
[gaim-migrate @ 3123]
Mark Doliner <markdoliner@pidgin.im>
parents:
3090
diff
changeset
|
400 | if (tlv && tlv->length) |
|
c193eb9c1c30
[gaim-migrate @ 3123]
Mark Doliner <markdoliner@pidgin.im>
parents:
3090
diff
changeset
|
401 | return aimutil_get32(tlv->value); |
|
c193eb9c1c30
[gaim-migrate @ 3123]
Mark Doliner <markdoliner@pidgin.im>
parents:
3090
diff
changeset
|
402 | } |
|
c193eb9c1c30
[gaim-migrate @ 3123]
Mark Doliner <markdoliner@pidgin.im>
parents:
3090
diff
changeset
|
403 | } |
|
c193eb9c1c30
[gaim-migrate @ 3123]
Mark Doliner <markdoliner@pidgin.im>
parents:
3090
diff
changeset
|
404 | return 0xFFFFFFFF; |
|
c193eb9c1c30
[gaim-migrate @ 3123]
Mark Doliner <markdoliner@pidgin.im>
parents:
3090
diff
changeset
|
405 | } |
|
c193eb9c1c30
[gaim-migrate @ 3123]
Mark Doliner <markdoliner@pidgin.im>
parents:
3090
diff
changeset
|
406 | |
|
3210
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
407 | /** |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
408 | * Locally find the alias of the given buddy. |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
409 | * |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
410 | * @param list A pointer to the current list of items. |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
411 | * @return A pointer to a NULL terminated string that is the buddies |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
412 | * alias, or NULL if the buddy has no alias. You should free |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
413 | * this returned value! |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
414 | */ |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
415 | faim_export char *aim_ssi_getalias(struct aim_ssi_item *list, char *gn, char *sn) |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
416 | { |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
417 | struct aim_ssi_item *cur = aim_ssi_itemlist_finditem(list, gn, sn, AIM_SSI_TYPE_BUDDY); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
418 | if (cur) { |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
419 | aim_tlvlist_t *tlvlist = cur->data; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
420 | if (tlvlist) { |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
421 | aim_tlv_t *tlv = aim_gettlv(tlvlist, 0x0131, 1); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
422 | if (tlv && tlv->length) { |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
423 | char *alias = (char *)(char *)malloc((tlv->length+1)*sizeof(char)); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
424 | strncpy(alias, tlv->value, tlv->length); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
425 | alias[tlv->length] = 0; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
426 | return alias; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
427 | } |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
428 | } |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
429 | } |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
430 | return NULL; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
431 | } |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
432 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
433 | /** |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
434 | * If there are changes, then create temporary items and |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
435 | * call addmoddel. |
|
3210
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
436 | * |
|
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
437 | * @param sess The oscar session. |
|
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
438 | * @param conn The bos connection for this session. |
|
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
439 | * @return Return 0 if no errors, otherwise return the error number. |
| 2991 | 440 | */ |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
441 | static int aim_ssi_sync(aim_session_t *sess, aim_conn_t *conn) |
| 2991 | 442 | { |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
443 | struct aim_ssi_item *cur1, *cur2; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
444 | struct aim_ssi_tmp *cur, *new; |
| 2991 | 445 | |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
446 | if (!sess || !conn) |
| 2991 | 447 | return -EINVAL; |
| 448 | ||
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
449 | /* If we're waiting for an ack, we shouldn't do anything else */ |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
450 | if (sess->ssi.waiting_for_ack) |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
451 | return 0; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
452 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
453 | /* |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
454 | * Compare the 2 lists and create an aim_ssi_tmp for each difference. |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
455 | * We should only send either additions, modifications, or deletions |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
456 | * before waiting for an acknowledgement. So first do deletions, then |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
457 | * additions, then modifications. Also, both the official and the local |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
458 | * list should be in ascending numerical order for the group ID#s and the |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
459 | * buddy ID#s, which makes things more efficient. I think. |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
460 | */ |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
461 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
462 | /* Deletions */ |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
463 | if (!sess->ssi.pending) { |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
464 | for (cur1=sess->ssi.official; cur1; cur1=cur1->next) { |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
465 | if (!aim_ssi_itemlist_find(sess->ssi.local, cur1->gid, cur1->bid)) { |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
466 | new = (struct aim_ssi_tmp *)malloc(sizeof(struct aim_ssi_tmp)); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
467 | new->action = AIM_CB_SSI_DEL; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
468 | new->ack = 0xffff; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
469 | new->name = NULL; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
470 | new->item = cur1; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
471 | new->next = NULL; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
472 | if (sess->ssi.pending) { |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
473 | for (cur=sess->ssi.pending; cur->next; cur=cur->next); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
474 | cur->next = new; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
475 | } else |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
476 | sess->ssi.pending = new; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
477 | } |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
478 | } |
| 2991 | 479 | } |
| 480 | ||
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
481 | /* Additions */ |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
482 | if (!sess->ssi.pending) { |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
483 | for (cur1=sess->ssi.local; cur1; cur1=cur1->next) { |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
484 | if (!aim_ssi_itemlist_find(sess->ssi.official, cur1->gid, cur1->bid)) { |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
485 | new = (struct aim_ssi_tmp *)malloc(sizeof(struct aim_ssi_tmp)); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
486 | new->action = AIM_CB_SSI_ADD; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
487 | new->ack = 0xffff; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
488 | new->name = NULL; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
489 | new->item = cur1; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
490 | new->next = NULL; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
491 | if (sess->ssi.pending) { |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
492 | for (cur=sess->ssi.pending; cur->next; cur=cur->next); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
493 | cur->next = new; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
494 | } else |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
495 | sess->ssi.pending = new; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
496 | } |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
497 | } |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
498 | } |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
499 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
500 | /* Modifications */ |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
501 | if (!sess->ssi.pending) { |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
502 | for (cur1=sess->ssi.local; cur1; cur1=cur1->next) { |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
503 | cur2 = aim_ssi_itemlist_find(sess->ssi.official, cur1->gid, cur1->bid); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
504 | if (cur2 && (aim_ssi_itemlist_cmp(cur1, cur2))) { |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
505 | new = (struct aim_ssi_tmp *)malloc(sizeof(struct aim_ssi_tmp)); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
506 | new->action = AIM_CB_SSI_MOD; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
507 | new->ack = 0xffff; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
508 | new->name = NULL; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
509 | new->item = cur1; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
510 | new->next = NULL; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
511 | if (sess->ssi.pending) { |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
512 | for (cur=sess->ssi.pending; cur->next; cur=cur->next); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
513 | cur->next = new; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
514 | } else |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
515 | sess->ssi.pending = new; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
516 | } |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
517 | } |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
518 | } |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
519 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
520 | /* We're out of stuff to do, so tell the AIM servers we're done and exit */ |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
521 | if (!sess->ssi.pending) { |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
522 | aim_ssi_modend(sess, conn); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
523 | return 0; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
524 | } |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
525 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
526 | /* Make sure we don't send anything else between now |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
527 | * and when we receive the ack for the following operation */ |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
528 | sess->ssi.waiting_for_ack = 1; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
529 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
530 | /* Now go mail off our data and wait 4 to 6 weeks */ |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
531 | aim_ssi_addmoddel(sess, conn); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
532 | |
| 2991 | 533 | return 0; |
| 534 | } | |
| 535 | ||
|
3210
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
536 | /** |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
537 | * Free all SSI data. |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
538 | * |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
539 | * This doesn't remove it from the server, that's different. |
|
3210
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
540 | * |
|
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
541 | * @param sess The oscar session. |
|
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
542 | * @return Return 0 if no errors, otherwise return the error number. |
| 2991 | 543 | */ |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
544 | static int aim_ssi_freelist(aim_session_t *sess) |
| 2991 | 545 | { |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
546 | struct aim_ssi_item *cur, *del; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
547 | struct aim_ssi_tmp *curtmp, *deltmp; |
| 2991 | 548 | |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
549 | cur = sess->ssi.official; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
550 | while (cur) { |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
551 | del = cur; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
552 | cur = cur->next; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
553 | free(del->name); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
554 | aim_freetlvchain(&del->data); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
555 | free(del); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
556 | } |
| 2991 | 557 | |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
558 | cur = sess->ssi.local; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
559 | while (cur) { |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
560 | del = cur; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
561 | cur = cur->next; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
562 | free(del->name); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
563 | aim_freetlvchain(&del->data); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
564 | free(del); |
| 2991 | 565 | } |
| 566 | ||
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
567 | curtmp = sess->ssi.pending; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
568 | while (curtmp) { |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
569 | deltmp = curtmp; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
570 | curtmp = curtmp->next; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
571 | free(deltmp); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
572 | } |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
573 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
574 | sess->ssi.numitems = 0; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
575 | sess->ssi.official = NULL; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
576 | sess->ssi.local = NULL; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
577 | sess->ssi.pending = NULL; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
578 | sess->ssi.timestamp = (time_t)0; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
579 | |
| 2991 | 580 | return 0; |
| 581 | } | |
| 582 | ||
|
3210
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
583 | /** |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
584 | * Delete all SSI data. |
|
3210
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
585 | * |
|
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
586 | * @param sess The oscar session. |
|
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
587 | * @param conn The bos connection for this session. |
|
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
588 | * @return Return 0 if no errors, otherwise return the error number. |
| 2991 | 589 | */ |
| 590 | faim_export int aim_ssi_deletelist(aim_session_t *sess, aim_conn_t *conn) | |
| 591 | { | |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
592 | struct aim_ssi_item *cur, *del; |
| 2991 | 593 | |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
594 | /* Free the local list */ |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
595 | cur = sess->ssi.local; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
596 | while (cur) { |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
597 | del = cur; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
598 | cur = cur->next; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
599 | free(del->name); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
600 | aim_freetlvchain(&del->data); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
601 | free(del); |
| 2991 | 602 | } |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
603 | sess->ssi.local = NULL; |
| 2991 | 604 | |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
605 | /* Sync our local list with the server list */ |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
606 | aim_ssi_sync(sess, conn); |
| 2991 | 607 | |
| 608 | return 0; | |
| 609 | } | |
| 610 | ||
|
3210
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
611 | /** |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
612 | * This "cleans" the ssi list. It does the following: |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
613 | * 1) Makes sure that all buddies are in a group. |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
614 | * 2) Makes sure there are no empty groups |
|
3210
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
615 | * |
|
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
616 | * @param sess The oscar session. |
|
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
617 | * @param conn The bos connection for this session. |
|
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
618 | * @return Return 0 if no errors, otherwise return the error number. |
| 2991 | 619 | */ |
| 620 | faim_export int aim_ssi_cleanlist(aim_session_t *sess, aim_conn_t *conn) | |
| 621 | { | |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
622 | struct aim_ssi_item *cur; |
| 2991 | 623 | |
| 624 | /* If there are any buddies directly in the master group, put them in a real group */ | |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
625 | /* This will kind of mess up if you hit the item limit, but this function isn't too critical */ |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
626 | for (cur=sess->ssi.local; cur; cur=cur->next) |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
627 | if ((cur->type == AIM_SSI_TYPE_BUDDY) && (cur->gid == 0x0000)) |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
628 | aim_ssi_addbuddy(sess, conn, cur->name, "orphans", NULL, NULL, NULL, 0); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
629 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
630 | /* Now DESTROY any buddies that are directly in the master group */ |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
631 | for (cur=sess->ssi.local; cur; cur=cur->next) |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
632 | if ((cur->type == AIM_SSI_TYPE_BUDDY) && (cur->gid == 0x0000)) |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
633 | aim_ssi_delbuddy(sess, conn, cur->name, NULL); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
634 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
635 | /* Check if there are empty groups */ |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
636 | for (cur=sess->ssi.local; cur; cur=cur->next) |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
637 | if ((cur->type == AIM_SSI_TYPE_GROUP) && (!cur->data)) |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
638 | aim_ssi_itemlist_del(&sess->ssi.local, cur); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
639 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
640 | /* Check if the master group is empty */ |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
641 | if ((cur = aim_ssi_itemlist_find(sess->ssi.local, 0x0000, 0x0000)) && (!cur->data)) |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
642 | aim_ssi_itemlist_del(&sess->ssi.local, cur); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
643 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
644 | /* Sync our local list with the server list */ |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
645 | aim_ssi_sync(sess, conn); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
646 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
647 | return 0; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
648 | } |
| 2991 | 649 | |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
650 | /** |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
651 | * Add a buddy to the list. |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
652 | * |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
653 | * @param sess The oscar session. |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
654 | * @param conn The bos connection for this session. |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
655 | * @param name The name of the item. |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
656 | * @param group The group of the item. |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
657 | * @param alias The alias/nickname of the item, or NULL. |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
658 | * @param comment The buddy comment for the item, or NULL. |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
659 | * @param smsnum The locally assigned SMS number, or NULL. |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
660 | * @return Return 0 if no errors, otherwise return the error number. |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
661 | */ |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
662 | faim_export int aim_ssi_addbuddy(aim_session_t *sess, aim_conn_t *conn, const char *name, const char *group, const char *alias, const char *comment, const char *smsnum, int needauth) |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
663 | { |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
664 | struct aim_ssi_item *parent; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
665 | aim_tlvlist_t *data = NULL; |
| 2991 | 666 | |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
667 | if (!sess || !conn || !name || !group) |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
668 | return -EINVAL; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
669 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
670 | /* Find the parent */ |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
671 | if (!(parent = aim_ssi_itemlist_finditem(sess->ssi.local, group, NULL, AIM_SSI_TYPE_GROUP))) { |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
672 | /* Find the parent's parent (the master group) */ |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
673 | if (!(parent = aim_ssi_itemlist_find(sess->ssi.local, 0x0000, 0x0000))) |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
674 | if (!(parent = aim_ssi_itemlist_add(&sess->ssi.local, NULL, 0x0000, 0x0000, AIM_SSI_TYPE_GROUP, NULL))) |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
675 | return -ENOMEM; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
676 | /* Add the parent */ |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
677 | if (!(parent = aim_ssi_itemlist_add(&sess->ssi.local, group, 0xFFFF, 0x0000, AIM_SSI_TYPE_GROUP, NULL))) |
|
3210
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
678 | return -ENOMEM; |
|
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
679 | |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
680 | /* Modify the parent's parent (the master group) */ |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
681 | aim_ssi_itemlist_rebuildgroup(sess->ssi.local, NULL); |
|
3210
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
682 | } |
|
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
683 | |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
684 | /* Create a TLV list for the new buddy */ |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
685 | if (needauth) |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
686 | aim_addtlvtochain_noval(&data, 0x0066); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
687 | if (alias) |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
688 | aim_addtlvtochain_raw(&data, 0x0131, strlen(alias), alias); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
689 | if (smsnum) |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
690 | aim_addtlvtochain_raw(&data, 0x013a, strlen(smsnum), smsnum); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
691 | if (comment) |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
692 | aim_addtlvtochain_raw(&data, 0x013c, strlen(comment), comment); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
693 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
694 | /* Add that bad boy */ |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
695 | aim_ssi_itemlist_add(&sess->ssi.local, name, parent->gid, 0xFFFF, AIM_SSI_TYPE_BUDDY, data); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
696 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
697 | /* Modify the parent group */ |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
698 | aim_ssi_itemlist_rebuildgroup(sess->ssi.local, group); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
699 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
700 | /* Sync our local list with the server list */ |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
701 | aim_ssi_sync(sess, conn); |
|
3210
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
702 | |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
703 | return 0; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
704 | } |
|
3210
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
705 | |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
706 | /** |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
707 | * Add a permit buddy to the list. |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
708 | * |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
709 | * @param sess The oscar session. |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
710 | * @param conn The bos connection for this session. |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
711 | * @param name The name of the item.. |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
712 | * @return Return 0 if no errors, otherwise return the error number. |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
713 | */ |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
714 | faim_export int aim_ssi_addpermit(aim_session_t *sess, aim_conn_t *conn, const char *name) |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
715 | { |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
716 | if (!sess || !conn || !name) |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
717 | return -EINVAL; |
| 2991 | 718 | |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
719 | /* Add that bad boy */ |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
720 | aim_ssi_itemlist_add(&sess->ssi.local, name, 0x0000, 0xFFFF, AIM_SSI_TYPE_PERMIT, NULL); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
721 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
722 | /* Sync our local list with the server list */ |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
723 | aim_ssi_sync(sess, conn); |
| 2991 | 724 | |
| 725 | return 0; | |
| 726 | } | |
| 727 | ||
|
3210
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
728 | /** |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
729 | * Add a deny buddy to the list. |
| 2991 | 730 | * |
|
3210
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
731 | * @param sess The oscar session. |
|
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
732 | * @param conn The bos connection for this session. |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
733 | * @param name The name of the item.. |
|
3210
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
734 | * @return Return 0 if no errors, otherwise return the error number. |
| 2991 | 735 | */ |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
736 | faim_export int aim_ssi_adddeny(aim_session_t *sess, aim_conn_t *conn, const char *name) |
| 2991 | 737 | { |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
738 | if (!sess || !conn || !name) |
| 2991 | 739 | return -EINVAL; |
| 740 | ||
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
741 | /* Add that bad boy */ |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
742 | aim_ssi_itemlist_add(&sess->ssi.local, name, 0x0000, 0xFFFF, AIM_SSI_TYPE_DENY, NULL); |
|
3017
e01d7ec2b5db
[gaim-migrate @ 3030]
Mark Doliner <markdoliner@pidgin.im>
parents:
3000
diff
changeset
|
743 | |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
744 | /* Sync our local list with the server list */ |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
745 | aim_ssi_sync(sess, conn); |
| 2991 | 746 | |
| 747 | return 0; | |
| 748 | } | |
| 749 | ||
|
3210
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
750 | /** |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
751 | * Deletes a buddy from the list. |
|
3210
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
752 | * |
|
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
753 | * @param sess The oscar session. |
|
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
754 | * @param conn The bos connection for this session. |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
755 | * @param name The name of the item, or NULL. |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
756 | * @param group The group of the item, or NULL. |
|
3210
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
757 | * @return Return 0 if no errors, otherwise return the error number. |
|
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
758 | */ |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
759 | faim_export int aim_ssi_delbuddy(aim_session_t *sess, aim_conn_t *conn, const char *name, const char *group) |
| 2991 | 760 | { |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
761 | struct aim_ssi_item *del; |
| 2991 | 762 | |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
763 | if (!sess || !conn || !name || !group) |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
764 | return -EINVAL; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
765 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
766 | /* Find the buddy */ |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
767 | if (!(del = aim_ssi_itemlist_finditem(sess->ssi.local, group, name, AIM_SSI_TYPE_BUDDY))) |
| 2991 | 768 | return -EINVAL; |
| 769 | ||
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
770 | /* Remove the item from the list */ |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
771 | aim_ssi_itemlist_del(&sess->ssi.local, del); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
772 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
773 | /* Modify the parent group */ |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
774 | aim_ssi_itemlist_rebuildgroup(sess->ssi.local, group); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
775 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
776 | /* Check if we should delete the parent group */ |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
777 | if ((del = aim_ssi_itemlist_finditem(sess->ssi.local, group, NULL, AIM_SSI_TYPE_GROUP)) && (!del->data)) { |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
778 | aim_ssi_itemlist_del(&sess->ssi.local, del); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
779 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
780 | /* Modify the parent group */ |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
781 | aim_ssi_itemlist_rebuildgroup(sess->ssi.local, NULL); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
782 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
783 | /* Check if we should delete the parent's parent (the master group) */ |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
784 | if ((del = aim_ssi_itemlist_find(sess->ssi.local, 0x0000, 0x0000)) && (!del->data)) { |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
785 | aim_ssi_itemlist_del(&sess->ssi.local, del); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
786 | } |
| 2991 | 787 | } |
| 788 | ||
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
789 | /* Sync our local list with the server list */ |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
790 | aim_ssi_sync(sess, conn); |
| 2991 | 791 | |
| 792 | return 0; | |
| 793 | } | |
| 794 | ||
|
3210
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
795 | /** |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
796 | * Deletes a permit buddy from the list. |
|
3210
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
797 | * |
|
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
798 | * @param sess The oscar session. |
|
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
799 | * @param conn The bos connection for this session. |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
800 | * @param name The name of the item, or NULL. |
|
3210
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
801 | * @return Return 0 if no errors, otherwise return the error number. |
|
3017
e01d7ec2b5db
[gaim-migrate @ 3030]
Mark Doliner <markdoliner@pidgin.im>
parents:
3000
diff
changeset
|
802 | */ |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
803 | faim_export int aim_ssi_delpermit(aim_session_t *sess, aim_conn_t *conn, const char *name) |
| 2991 | 804 | { |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
805 | struct aim_ssi_item *del; |
| 2991 | 806 | |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
807 | if (!sess || !conn || !name) |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
808 | return -EINVAL; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
809 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
810 | /* Find the item */ |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
811 | if (!(del = aim_ssi_itemlist_finditem(sess->ssi.local, NULL, name, AIM_SSI_TYPE_PERMIT))) |
| 2991 | 812 | return -EINVAL; |
| 813 | ||
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
814 | /* Remove the item from the list */ |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
815 | aim_ssi_itemlist_del(&sess->ssi.local, del); |
| 2991 | 816 | |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
817 | /* Sync our local list with the server list */ |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
818 | aim_ssi_sync(sess, conn); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
819 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
820 | return 0; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
821 | } |
| 2991 | 822 | |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
823 | /** |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
824 | * Deletes a deny buddy from the list. |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
825 | * |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
826 | * @param sess The oscar session. |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
827 | * @param conn The bos connection for this session. |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
828 | * @param name The name of the item, or NULL. |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
829 | * @return Return 0 if no errors, otherwise return the error number. |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
830 | */ |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
831 | faim_export int aim_ssi_deldeny(aim_session_t *sess, aim_conn_t *conn, const char *name) |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
832 | { |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
833 | struct aim_ssi_item *del; |
| 2991 | 834 | |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
835 | if (!sess || !conn || !name) |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
836 | return -EINVAL; |
| 2991 | 837 | |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
838 | /* Find the item */ |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
839 | if (!(del = aim_ssi_itemlist_finditem(sess->ssi.local, NULL, name, AIM_SSI_TYPE_PERMIT))) |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
840 | return -EINVAL; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
841 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
842 | /* Remove the item from the list */ |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
843 | aim_ssi_itemlist_del(&sess->ssi.local, del); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
844 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
845 | /* Sync our local list with the server list */ |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
846 | aim_ssi_sync(sess, conn); |
| 2991 | 847 | |
| 848 | return 0; | |
| 849 | } | |
| 850 | ||
|
3210
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
851 | /** |
|
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
852 | * Move a buddy from one group to another group. This basically just deletes the |
|
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
853 | * buddy and re-adds it. |
|
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
854 | * |
|
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
855 | * @param sess The oscar session. |
|
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
856 | * @param conn The bos connection for this session. |
|
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
857 | * @param oldgn The group that the buddy is currently in. |
|
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
858 | * @param newgn The group that the buddy should be moved in to. |
|
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
859 | * @param sn The name of the buddy to be moved. |
|
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
860 | * @return Return 0 if no errors, otherwise return the error number. |
|
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
861 | */ |
| 3867 | 862 | faim_export int aim_ssi_movebuddy(aim_session_t *sess, aim_conn_t *conn, const char *oldgn, const char *newgn, const char *sn) |
| 3140 | 863 | { |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
864 | aim_ssi_delbuddy(sess, conn, sn, oldgn); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
865 | aim_ssi_addbuddy(sess, conn, sn, newgn, NULL, NULL, NULL, 0); |
| 3140 | 866 | return 0; |
| 867 | } | |
| 868 | ||
|
3210
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
869 | /** |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
870 | * Rename a group. |
|
3348
57ed471963ba
[gaim-migrate @ 3367]
Mark Doliner <markdoliner@pidgin.im>
parents:
3332
diff
changeset
|
871 | * |
|
57ed471963ba
[gaim-migrate @ 3367]
Mark Doliner <markdoliner@pidgin.im>
parents:
3332
diff
changeset
|
872 | * @param sess The oscar session. |
|
57ed471963ba
[gaim-migrate @ 3367]
Mark Doliner <markdoliner@pidgin.im>
parents:
3332
diff
changeset
|
873 | * @param conn The bos connection for this session. |
|
57ed471963ba
[gaim-migrate @ 3367]
Mark Doliner <markdoliner@pidgin.im>
parents:
3332
diff
changeset
|
874 | * @param oldgn The old group name. |
|
57ed471963ba
[gaim-migrate @ 3367]
Mark Doliner <markdoliner@pidgin.im>
parents:
3332
diff
changeset
|
875 | * @param newgn The new group name. |
|
57ed471963ba
[gaim-migrate @ 3367]
Mark Doliner <markdoliner@pidgin.im>
parents:
3332
diff
changeset
|
876 | * @return Return 0 if no errors, otherwise return the error number. |
|
57ed471963ba
[gaim-migrate @ 3367]
Mark Doliner <markdoliner@pidgin.im>
parents:
3332
diff
changeset
|
877 | */ |
| 3867 | 878 | faim_export int aim_ssi_rename_group(aim_session_t *sess, aim_conn_t *conn, const char *oldgn, const char *newgn) |
|
3348
57ed471963ba
[gaim-migrate @ 3367]
Mark Doliner <markdoliner@pidgin.im>
parents:
3332
diff
changeset
|
879 | { |
|
57ed471963ba
[gaim-migrate @ 3367]
Mark Doliner <markdoliner@pidgin.im>
parents:
3332
diff
changeset
|
880 | struct aim_ssi_item *group; |
|
57ed471963ba
[gaim-migrate @ 3367]
Mark Doliner <markdoliner@pidgin.im>
parents:
3332
diff
changeset
|
881 | |
|
57ed471963ba
[gaim-migrate @ 3367]
Mark Doliner <markdoliner@pidgin.im>
parents:
3332
diff
changeset
|
882 | if (!sess || !conn || !oldgn || !newgn) |
|
57ed471963ba
[gaim-migrate @ 3367]
Mark Doliner <markdoliner@pidgin.im>
parents:
3332
diff
changeset
|
883 | return -EINVAL; |
|
57ed471963ba
[gaim-migrate @ 3367]
Mark Doliner <markdoliner@pidgin.im>
parents:
3332
diff
changeset
|
884 | |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
885 | if (!(group = aim_ssi_itemlist_finditem(sess->ssi.local, oldgn, NULL, AIM_SSI_TYPE_GROUP))) |
|
3017
e01d7ec2b5db
[gaim-migrate @ 3030]
Mark Doliner <markdoliner@pidgin.im>
parents:
3000
diff
changeset
|
886 | return -EINVAL; |
|
e01d7ec2b5db
[gaim-migrate @ 3030]
Mark Doliner <markdoliner@pidgin.im>
parents:
3000
diff
changeset
|
887 | |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
888 | free(group->name); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
889 | group->name = (char *)malloc((strlen(newgn)+1)*sizeof(char)); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
890 | strcpy(group->name, newgn); |
| 2991 | 891 | |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
892 | /* Sync our local list with the server list */ |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
893 | aim_ssi_sync(sess, conn); |
| 2991 | 894 | |
| 895 | return 0; | |
| 896 | } | |
| 897 | ||
|
3210
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
898 | /** |
| 2991 | 899 | * Stores your permit/deny setting on the server, and starts using it. |
|
3210
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
900 | * |
|
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
901 | * @param sess The oscar session. |
|
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
902 | * @param conn The bos connection for this session. |
|
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
903 | * @param permdeny Your permit/deny setting. Can be one of the following: |
|
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
904 | * 1 - Allow all users |
|
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
905 | * 2 - Block all users |
|
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
906 | * 3 - Allow only the users below |
|
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
907 | * 4 - Block only the users below |
|
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
908 | * 5 - Allow only users on my buddy list |
|
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
909 | * @param vismask A bitmask of the class of users to whom you want to be |
|
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
910 | * visible. See the AIM_FLAG_BLEH #defines in aim.h |
|
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
911 | * @return Return 0 if no errors, otherwise return the error number. |
| 2991 | 912 | */ |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
913 | faim_export int aim_ssi_setpermdeny(aim_session_t *sess, aim_conn_t *conn, fu8_t permdeny, fu32_t vismask) |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
914 | { |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
915 | struct aim_ssi_item *tmp; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
916 | aim_tlvlist_t *data = NULL; |
| 2991 | 917 | |
| 918 | if (!sess || !conn) | |
| 919 | return -EINVAL; | |
| 920 | ||
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
921 | /* Need to add the x00ca TLV to the TLV chain */ |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
922 | aim_addtlvtochain8(&data, 0x00ca, permdeny); |
| 2991 | 923 | |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
924 | /* Need to add the x00cb TLV to the TLV chain */ |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
925 | aim_addtlvtochain32(&data, 0x00cb, vismask); |
| 2991 | 926 | |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
927 | if ((tmp = aim_ssi_itemlist_finditem(sess->ssi.local, NULL, NULL, AIM_SSI_TYPE_PDINFO))) { |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
928 | aim_freetlvchain(&tmp->data); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
929 | tmp->data = data; |
| 2991 | 930 | } else { |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
931 | tmp = aim_ssi_itemlist_add(&sess->ssi.local, NULL, 0x0000, 0xFFFF, AIM_SSI_TYPE_PDINFO, data); |
| 2991 | 932 | } |
| 933 | ||
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
934 | /* Sync our local list with the server list */ |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
935 | aim_ssi_sync(sess, conn); |
| 2991 | 936 | |
| 937 | return 0; | |
| 938 | } | |
| 939 | ||
|
3210
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
940 | /** |
|
3109
c193eb9c1c30
[gaim-migrate @ 3123]
Mark Doliner <markdoliner@pidgin.im>
parents:
3090
diff
changeset
|
941 | * Stores your setting for whether you should show up as idle or not. |
|
3210
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
942 | * |
|
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
943 | * @param sess The oscar session. |
|
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
944 | * @param conn The bos connection for this session. |
|
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
945 | * @param presence I think it's a bitmask, but I only know what one of the bits is: |
|
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
946 | * 0x00000400 - Allow others to see your idle time |
|
9f0e2d3d8a02
[gaim-migrate @ 3227]
Mark Doliner <markdoliner@pidgin.im>
parents:
3140
diff
changeset
|
947 | * @return Return 0 if no errors, otherwise return the error number. |
|
3109
c193eb9c1c30
[gaim-migrate @ 3123]
Mark Doliner <markdoliner@pidgin.im>
parents:
3090
diff
changeset
|
948 | */ |
|
c193eb9c1c30
[gaim-migrate @ 3123]
Mark Doliner <markdoliner@pidgin.im>
parents:
3090
diff
changeset
|
949 | faim_export int aim_ssi_setpresence(aim_session_t *sess, aim_conn_t *conn, fu32_t presence) { |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
950 | struct aim_ssi_item *tmp; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
951 | aim_tlvlist_t *data = NULL; |
|
3109
c193eb9c1c30
[gaim-migrate @ 3123]
Mark Doliner <markdoliner@pidgin.im>
parents:
3090
diff
changeset
|
952 | |
|
c193eb9c1c30
[gaim-migrate @ 3123]
Mark Doliner <markdoliner@pidgin.im>
parents:
3090
diff
changeset
|
953 | if (!sess || !conn) |
|
c193eb9c1c30
[gaim-migrate @ 3123]
Mark Doliner <markdoliner@pidgin.im>
parents:
3090
diff
changeset
|
954 | return -EINVAL; |
|
c193eb9c1c30
[gaim-migrate @ 3123]
Mark Doliner <markdoliner@pidgin.im>
parents:
3090
diff
changeset
|
955 | |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
956 | /* Need to add the x00c9 TLV to the TLV chain */ |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
957 | aim_addtlvtochain32(&data, 0x00c9, presence); |
|
3109
c193eb9c1c30
[gaim-migrate @ 3123]
Mark Doliner <markdoliner@pidgin.im>
parents:
3090
diff
changeset
|
958 | |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
959 | if ((tmp = aim_ssi_itemlist_finditem(sess->ssi.local, NULL, NULL, AIM_SSI_TYPE_PRESENCEPREFS))) { |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
960 | aim_freetlvchain(&tmp->data); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
961 | tmp->data = data; |
|
3109
c193eb9c1c30
[gaim-migrate @ 3123]
Mark Doliner <markdoliner@pidgin.im>
parents:
3090
diff
changeset
|
962 | } else { |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
963 | tmp = aim_ssi_itemlist_add(&sess->ssi.local, NULL, 0x0000, 0xFFFF, AIM_SSI_TYPE_PRESENCEPREFS, data); |
|
3109
c193eb9c1c30
[gaim-migrate @ 3123]
Mark Doliner <markdoliner@pidgin.im>
parents:
3090
diff
changeset
|
964 | } |
|
c193eb9c1c30
[gaim-migrate @ 3123]
Mark Doliner <markdoliner@pidgin.im>
parents:
3090
diff
changeset
|
965 | |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
966 | /* Sync our local list with the server list */ |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
967 | aim_ssi_sync(sess, conn); |
|
3109
c193eb9c1c30
[gaim-migrate @ 3123]
Mark Doliner <markdoliner@pidgin.im>
parents:
3090
diff
changeset
|
968 | |
|
c193eb9c1c30
[gaim-migrate @ 3123]
Mark Doliner <markdoliner@pidgin.im>
parents:
3090
diff
changeset
|
969 | return 0; |
|
c193eb9c1c30
[gaim-migrate @ 3123]
Mark Doliner <markdoliner@pidgin.im>
parents:
3090
diff
changeset
|
970 | } |
|
c193eb9c1c30
[gaim-migrate @ 3123]
Mark Doliner <markdoliner@pidgin.im>
parents:
3090
diff
changeset
|
971 | |
|
c193eb9c1c30
[gaim-migrate @ 3123]
Mark Doliner <markdoliner@pidgin.im>
parents:
3090
diff
changeset
|
972 | /* |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
973 | * Subtype 0x0002 - Request SSI Rights. |
| 2672 | 974 | */ |
| 975 | faim_export int aim_ssi_reqrights(aim_session_t *sess, aim_conn_t *conn) | |
| 976 | { | |
|
3017
e01d7ec2b5db
[gaim-migrate @ 3030]
Mark Doliner <markdoliner@pidgin.im>
parents:
3000
diff
changeset
|
977 | return aim_genericreq_n(sess, conn, AIM_CB_FAM_SSI, AIM_CB_SSI_REQRIGHTS); |
| 2672 | 978 | } |
| 979 | ||
| 980 | /* | |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
981 | * Subtype 0x0003 - SSI Rights Information. |
| 2672 | 982 | */ |
| 983 | static int parserights(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx, aim_modsnac_t *snac, aim_bstream_t *bs) | |
| 984 | { | |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
985 | int ret = 0, i; |
| 2672 | 986 | aim_rxcallback_t userfunc; |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
987 | aim_tlvlist_t *tlvlist; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
988 | aim_tlv_t *tlv; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
989 | aim_bstream_t bstream; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
990 | fu16_t *maxitems; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
991 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
992 | /* This SNAC is made up of a bunch of TLVs */ |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
993 | tlvlist = aim_readtlvchain(bs); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
994 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
995 | /* TLV 0x0004 contains the maximum number of each item */ |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
996 | if (!(tlv = aim_gettlv(tlvlist, 0x0004, 1))) { |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
997 | aim_freetlvchain(&tlvlist); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
998 | return 0; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
999 | } |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1000 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1001 | aim_bstream_init(&bstream, tlv->value, tlv->length); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1002 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1003 | if (!(maxitems = (fu16_t *)malloc((tlv->length/2)*sizeof(fu16_t)))) { |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1004 | aim_freetlvchain(&tlvlist); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1005 | return 0; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1006 | } |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1007 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1008 | for (i=0; i<(tlv->length/2); i++) |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1009 | maxitems[i] = aimbs_get16(&bstream); |
| 2672 | 1010 | |
| 1011 | if ((userfunc = aim_callhandler(sess, rx->conn, snac->family, snac->subtype))) | |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1012 | ret = userfunc(sess, rx, tlv->length/2, maxitems); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1013 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1014 | aim_freetlvchain(&tlvlist); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1015 | free(maxitems); |
| 2672 | 1016 | |
| 1017 | return ret; | |
| 1018 | } | |
| 1019 | ||
| 1020 | /* | |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1021 | * Subtype 0x0004 - Request SSI Data. |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1022 | * XXX - If you don't a timestamp and revision number? |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1023 | * |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1024 | * Note that the client should never increment the revision, only the server. |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1025 | * |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1026 | */ |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1027 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1028 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1029 | /* |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1030 | * Subtype 0x0005 - Request SSI Data. |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1031 | * XXX - If you have a timestamp and revision number? |
| 2672 | 1032 | * |
| 1033 | * The data will only be sent if it is newer than the posted local | |
| 1034 | * timestamp and revision. | |
| 1035 | * | |
| 1036 | * Note that the client should never increment the revision, only the server. | |
| 1037 | * | |
| 1038 | */ | |
| 1039 | faim_export int aim_ssi_reqdata(aim_session_t *sess, aim_conn_t *conn, time_t localstamp, fu16_t localrev) | |
| 1040 | { | |
| 1041 | aim_frame_t *fr; | |
| 1042 | aim_snacid_t snacid; | |
| 1043 | ||
| 1044 | if (!sess || !conn) | |
| 1045 | return -EINVAL; | |
| 1046 | ||
| 1047 | if (!(fr = aim_tx_new(sess, conn, AIM_FRAMETYPE_FLAP, 0x02, 10+4+2))) | |
| 1048 | return -ENOMEM; | |
| 1049 | ||
|
3017
e01d7ec2b5db
[gaim-migrate @ 3030]
Mark Doliner <markdoliner@pidgin.im>
parents:
3000
diff
changeset
|
1050 | snacid = aim_cachesnac(sess, AIM_CB_FAM_SSI, AIM_CB_SSI_REQLIST, 0x0000, NULL, 0); |
| 2672 | 1051 | |
|
3017
e01d7ec2b5db
[gaim-migrate @ 3030]
Mark Doliner <markdoliner@pidgin.im>
parents:
3000
diff
changeset
|
1052 | aim_putsnac(&fr->data, AIM_CB_FAM_SSI, AIM_CB_SSI_REQLIST, 0x0000, snacid); |
| 2672 | 1053 | aimbs_put32(&fr->data, localstamp); |
| 1054 | aimbs_put16(&fr->data, localrev); | |
| 1055 | ||
| 1056 | aim_tx_enqueue(sess, fr); | |
| 1057 | ||
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1058 | /* Free any current data, just in case */ |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1059 | aim_ssi_freelist(sess); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1060 | |
| 2672 | 1061 | return 0; |
| 1062 | } | |
| 1063 | ||
| 1064 | /* | |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1065 | * Subtype 0x0006 - SSI Data. |
| 2672 | 1066 | */ |
| 1067 | static int parsedata(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx, aim_modsnac_t *snac, aim_bstream_t *bs) | |
| 1068 | { | |
| 1069 | int ret = 0; | |
| 1070 | aim_rxcallback_t userfunc; | |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1071 | struct aim_ssi_item *cur, *new; |
| 2672 | 1072 | fu8_t fmtver; /* guess */ |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1073 | fu16_t numitems, namelen; |
| 2991 | 1074 | fu32_t timestamp; |
| 2672 | 1075 | |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1076 | if (snac->flags & 0x0001) { |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1077 | /* XXX - Free all ssi data? */ |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1078 | } |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1079 | |
| 2991 | 1080 | fmtver = aimbs_get8(bs); /* Version of ssi data. Should be 0x00 */ |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1081 | numitems = aimbs_get16(bs); /* # of times ssi data has been modified */ |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1082 | sess->ssi.numitems += numitems; |
| 2672 | 1083 | |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1084 | /* Read in the list */ |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1085 | /* If we already have a partial list, move cur to the end of it */ |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1086 | if (sess->ssi.official) |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1087 | for (cur=sess->ssi.official; cur->next; cur=cur->next); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1088 | while (aim_bstream_empty(bs) > 4) { /* last four bytes are timestamp */ |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1089 | if (!sess->ssi.official) { |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1090 | if (!(sess->ssi.official = malloc(sizeof(struct aim_ssi_item)))) |
| 2991 | 1091 | return -ENOMEM; |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1092 | cur = sess->ssi.official; |
| 2991 | 1093 | } else { |
| 1094 | if (!(cur->next = malloc(sizeof(struct aim_ssi_item)))) | |
| 1095 | return -ENOMEM; | |
| 1096 | cur = cur->next; | |
| 1097 | } | |
| 2672 | 1098 | if ((namelen = aimbs_get16(bs))) |
| 2991 | 1099 | cur->name = aimbs_getstr(bs, namelen); |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1100 | else |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1101 | cur->name = NULL; |
| 2991 | 1102 | cur->gid = aimbs_get16(bs); |
| 1103 | cur->bid = aimbs_get16(bs); | |
| 1104 | cur->type = aimbs_get16(bs); | |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1105 | cur->data = aim_readtlvchain_len(bs, aimbs_get16(bs)); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1106 | cur->next = NULL; |
| 2672 | 1107 | } |
| 1108 | ||
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1109 | /* Read in the timestamp */ |
| 2991 | 1110 | timestamp = aimbs_get32(bs); |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1111 | sess->ssi.timestamp = timestamp; |
| 2672 | 1112 | |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1113 | if (!(snac->flags & 0x0001)) { |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1114 | /* Make a copy of the list */ |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1115 | for (cur=sess->ssi.official; cur; cur=cur->next) { |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1116 | if (!sess->ssi.local) { |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1117 | if (!(sess->ssi.local = malloc(sizeof(struct aim_ssi_item)))) |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1118 | return -ENOMEM; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1119 | new = sess->ssi.local; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1120 | } else { |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1121 | if (!(new->next = malloc(sizeof(struct aim_ssi_item)))) |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1122 | return -ENOMEM; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1123 | new = new->next; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1124 | } |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1125 | if (cur->name) { |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1126 | new->name = (char *)malloc((strlen(cur->name)+1)*sizeof(char)); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1127 | strcpy(new->name, cur->name); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1128 | } else |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1129 | new->name = NULL; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1130 | new->gid = cur->gid; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1131 | new->bid = cur->bid; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1132 | new->type = cur->type; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1133 | new->data = aim_tlvlist_copy(cur->data); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1134 | } |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1135 | new->next = NULL; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1136 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1137 | sess->ssi.received_data = 1; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1138 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1139 | if ((userfunc = aim_callhandler(sess, rx->conn, snac->family, snac->subtype))) |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1140 | ret = userfunc(sess, rx, fmtver, sess->ssi.numitems, sess->ssi.official, sess->ssi.timestamp); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1141 | } |
| 2672 | 1142 | |
| 1143 | return ret; | |
| 1144 | } | |
| 1145 | ||
| 1146 | /* | |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1147 | * Subtype 0x0007 - SSI Activate Data. |
| 2672 | 1148 | * |
| 1149 | * Should be sent after receiving 13/6 or 13/f to tell the server you | |
| 1150 | * are ready to begin using the list. It will promptly give you the | |
| 1151 | * presence information for everyone in your list and put your permit/deny | |
| 1152 | * settings into effect. | |
| 1153 | * | |
| 1154 | */ | |
| 1155 | faim_export int aim_ssi_enable(aim_session_t *sess, aim_conn_t *conn) | |
| 1156 | { | |
|
3017
e01d7ec2b5db
[gaim-migrate @ 3030]
Mark Doliner <markdoliner@pidgin.im>
parents:
3000
diff
changeset
|
1157 | return aim_genericreq_n(sess, conn, AIM_CB_FAM_SSI, 0x0007); |
| 2672 | 1158 | } |
| 1159 | ||
| 1160 | /* | |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1161 | * Subtype 0x0008/0x0009/0x000a - SSI Add/Mod/Del Item(s). |
| 2991 | 1162 | * |
|
3017
e01d7ec2b5db
[gaim-migrate @ 3030]
Mark Doliner <markdoliner@pidgin.im>
parents:
3000
diff
changeset
|
1163 | * Sends the SNAC to add, modify, or delete an item from the server-stored |
|
e01d7ec2b5db
[gaim-migrate @ 3030]
Mark Doliner <markdoliner@pidgin.im>
parents:
3000
diff
changeset
|
1164 | * information. These 3 SNACs all have an identical structure. The only |
|
e01d7ec2b5db
[gaim-migrate @ 3030]
Mark Doliner <markdoliner@pidgin.im>
parents:
3000
diff
changeset
|
1165 | * difference is the subtype that is set for the SNAC. |
| 2991 | 1166 | * |
| 1167 | */ | |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1168 | faim_export int aim_ssi_addmoddel(aim_session_t *sess, aim_conn_t *conn) |
| 2991 | 1169 | { |
| 1170 | aim_frame_t *fr; | |
| 1171 | aim_snacid_t snacid; | |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1172 | int snaclen; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1173 | struct aim_ssi_tmp *cur; |
| 2991 | 1174 | |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1175 | if (!sess || !conn || !sess->ssi.pending || !sess->ssi.pending->item) |
| 2991 | 1176 | return -EINVAL; |
| 1177 | ||
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1178 | /* Calculate total SNAC size */ |
| 2991 | 1179 | snaclen = 10; /* For family, subtype, flags, and SNAC ID */ |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1180 | for (cur=sess->ssi.pending; cur; cur=cur->next) { |
| 2991 | 1181 | snaclen += 10; /* For length, GID, BID, type, and length */ |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1182 | if (cur->item->name) |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1183 | snaclen += strlen(cur->item->name); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1184 | if (cur->item->data) |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1185 | snaclen += aim_sizetlvchain(&cur->item->data); |
| 2991 | 1186 | } |
| 1187 | ||
| 1188 | if (!(fr = aim_tx_new(sess, conn, AIM_FRAMETYPE_FLAP, 0x02, snaclen))) | |
| 1189 | return -ENOMEM; | |
| 1190 | ||
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1191 | snacid = aim_cachesnac(sess, AIM_CB_FAM_SSI, sess->ssi.pending->action, 0x0000, NULL, 0); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1192 | aim_putsnac(&fr->data, AIM_CB_FAM_SSI, sess->ssi.pending->action, 0x0000, snacid); |
| 2991 | 1193 | |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1194 | for (cur=sess->ssi.pending; cur; cur=cur->next) { |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1195 | aimbs_put16(&fr->data, cur->item->name ? strlen(cur->item->name) : 0); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1196 | if (cur->item->name) |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1197 | aimbs_putraw(&fr->data, cur->item->name, strlen(cur->item->name)); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1198 | aimbs_put16(&fr->data, cur->item->gid); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1199 | aimbs_put16(&fr->data, cur->item->bid); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1200 | aimbs_put16(&fr->data, cur->item->type); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1201 | aimbs_put16(&fr->data, cur->item->data ? aim_sizetlvchain(&cur->item->data) : 0); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1202 | if (cur->item->data) |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1203 | aim_writetlvchain(&fr->data, &cur->item->data); |
| 2991 | 1204 | } |
| 1205 | ||
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1206 | aim_tx_enqueue(sess, fr); |
| 2991 | 1207 | |
| 1208 | return 0; | |
| 1209 | } | |
| 1210 | ||
| 1211 | /* | |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1212 | * Subtype 0x0008 - Incoming SSI add. |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1213 | * |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1214 | * XXX - It would probably be good for the client to actually do something when it gets this. |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1215 | */ |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1216 | static int parseadd(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx, aim_modsnac_t *snac, aim_bstream_t *bs) |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1217 | { |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1218 | int ret = 0; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1219 | aim_rxcallback_t userfunc; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1220 | char *name; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1221 | fu16_t len, gid, bid, type; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1222 | aim_tlvlist_t *data; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1223 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1224 | while (aim_bstream_empty(bs)) { |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1225 | if ((len = aimbs_get16(bs))) |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1226 | name = aimbs_getstr(bs, len); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1227 | else |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1228 | name = NULL; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1229 | gid = aimbs_get16(bs); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1230 | bid = aimbs_get16(bs); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1231 | type = aimbs_get16(bs); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1232 | if ((len = aimbs_get16(bs))) |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1233 | data = aim_readtlvchain_len(bs, len); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1234 | else |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1235 | data = NULL; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1236 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1237 | aim_ssi_itemlist_add(&sess->ssi.local, name, gid, bid, type, data); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1238 | aim_ssi_itemlist_add(&sess->ssi.official, name, gid, bid, type, aim_tlvlist_copy(data)); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1239 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1240 | if ((userfunc = aim_callhandler(sess, rx->conn, snac->family, snac->subtype))) |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1241 | ret = userfunc(sess, rx); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1242 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1243 | free(name); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1244 | } |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1245 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1246 | return ret; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1247 | } |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1248 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1249 | /* |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1250 | * Subtype 0x0009 - Incoming SSI mod. |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1251 | * |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1252 | * XXX - It would probably be good for the client to actually do something when it gets this. |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1253 | */ |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1254 | static int parsemod(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx, aim_modsnac_t *snac, aim_bstream_t *bs) |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1255 | { |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1256 | int ret = 0; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1257 | aim_rxcallback_t userfunc; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1258 | char *name; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1259 | fu16_t len, gid, bid, type; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1260 | aim_tlvlist_t *data; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1261 | struct aim_ssi_item *item; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1262 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1263 | while (aim_bstream_empty(bs)) { |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1264 | if ((len = aimbs_get16(bs))) |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1265 | name = aimbs_getstr(bs, len); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1266 | else |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1267 | name = NULL; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1268 | gid = aimbs_get16(bs); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1269 | bid = aimbs_get16(bs); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1270 | type = aimbs_get16(bs); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1271 | if ((len = aimbs_get16(bs))) |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1272 | data = aim_readtlvchain_len(bs, len); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1273 | else |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1274 | data = NULL; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1275 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1276 | /* Replace the 2 local items with the given one */ |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1277 | if ((item = aim_ssi_itemlist_find(sess->ssi.local, gid, bid))) { |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1278 | item->type = type; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1279 | free(item->name); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1280 | if (name) { |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1281 | item->name = (char *)malloc((strlen(name)+1)*sizeof(char)); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1282 | strcpy(item->name, name); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1283 | } else |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1284 | item->name = NULL; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1285 | aim_freetlvchain(&item->data); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1286 | item->data = data; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1287 | } |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1288 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1289 | if ((item = aim_ssi_itemlist_find(sess->ssi.official, gid, bid))) { |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1290 | item->type = type; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1291 | free(item->name); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1292 | if (name) { |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1293 | item->name = (char *)malloc((strlen(name)+1)*sizeof(char)); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1294 | strcpy(item->name, name); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1295 | } else |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1296 | item->name = NULL; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1297 | aim_freetlvchain(&item->data); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1298 | item->data = data; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1299 | } |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1300 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1301 | if ((userfunc = aim_callhandler(sess, rx->conn, snac->family, snac->subtype))) |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1302 | ret = userfunc(sess, rx); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1303 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1304 | free(name); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1305 | } |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1306 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1307 | return ret; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1308 | } |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1309 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1310 | /* |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1311 | * Subtype 0x000a - Incoming SSI del. |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1312 | * |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1313 | * XXX - It would probably be good for the client to actually do something when it gets this. |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1314 | */ |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1315 | static int parsedel(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx, aim_modsnac_t *snac, aim_bstream_t *bs) |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1316 | { |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1317 | int ret = 0; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1318 | aim_rxcallback_t userfunc; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1319 | fu16_t gid, bid; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1320 | struct aim_ssi_item *del; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1321 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1322 | while (aim_bstream_empty(bs)) { |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1323 | aim_bstream_advance(bs, aimbs_get16(bs)); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1324 | gid = aimbs_get16(bs); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1325 | bid = aimbs_get16(bs); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1326 | aimbs_get16(bs); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1327 | aim_bstream_advance(bs, aimbs_get16(bs)); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1328 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1329 | del = aim_ssi_itemlist_find(sess->ssi.local, gid, bid); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1330 | aim_ssi_itemlist_del(&sess->ssi.local, del); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1331 | del = aim_ssi_itemlist_find(sess->ssi.official, gid, bid); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1332 | aim_ssi_itemlist_del(&sess->ssi.official, del); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1333 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1334 | if ((userfunc = aim_callhandler(sess, rx->conn, snac->family, snac->subtype))) |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1335 | ret = userfunc(sess, rx); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1336 | } |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1337 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1338 | return ret; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1339 | } |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1340 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1341 | /* |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1342 | * Subtype 0x000e - SSI Add/Mod/Del Ack. |
| 2991 | 1343 | * |
|
3017
e01d7ec2b5db
[gaim-migrate @ 3030]
Mark Doliner <markdoliner@pidgin.im>
parents:
3000
diff
changeset
|
1344 | * Response to add, modify, or delete SNAC (sent with aim_ssi_addmoddel). |
| 2991 | 1345 | * |
| 1346 | */ | |
| 1347 | static int parseack(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx, aim_modsnac_t *snac, aim_bstream_t *bs) | |
| 1348 | { | |
| 1349 | int ret = 0; | |
| 1350 | aim_rxcallback_t userfunc; | |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1351 | struct aim_ssi_tmp *cur, *del; |
| 2991 | 1352 | |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1353 | /* Read in the success/failure flags from the ack SNAC */ |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1354 | cur = sess->ssi.pending; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1355 | while (cur && (aim_bstream_empty(bs)>0)) { |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1356 | cur->ack = aimbs_get16(bs); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1357 | cur = cur->next; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1358 | } |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1359 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1360 | /* |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1361 | * If outcome is 0, then add the item to the item list, or replace the other item, |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1362 | * or remove the old item. If outcome is non-zero, then remove the item from the |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1363 | * local list, or unmodify it, or add it. |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1364 | */ |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1365 | for (cur=sess->ssi.pending; (cur && (cur->ack != 0xffff)); cur=cur->next) { |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1366 | if (cur->item) { |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1367 | if (cur->ack) { |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1368 | /* Our action was unsuccessful, so change the local list back to how it was */ |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1369 | if (cur->action == AIM_CB_SSI_ADD) { |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1370 | /* Remove the item from the items list */ |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1371 | if (cur->item->name) { |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1372 | cur->name = (char *)malloc((strlen(cur->item->name)+1)*sizeof(char)); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1373 | strcpy(cur->name, cur->item->name); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1374 | } |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1375 | aim_ssi_itemlist_del(&sess->ssi.local, cur->item); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1376 | cur->item = NULL; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1377 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1378 | } else if (cur->action == AIM_CB_SSI_MOD) { |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1379 | /* Replace the new item with the old item in the items list */ |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1380 | struct aim_ssi_item *cur1; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1381 | if ((cur1 = aim_ssi_itemlist_find(sess->ssi.local, cur->item->gid, cur->item->bid))) { |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1382 | free(cur1->name); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1383 | if (cur->item->name) { |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1384 | cur1->name = (char *)malloc((strlen(cur->item->name)+1)*sizeof(char)); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1385 | strcpy(cur1->name, cur->item->name); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1386 | } else |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1387 | cur1->name = NULL; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1388 | aim_freetlvchain(&cur1->data); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1389 | cur1->data = aim_tlvlist_copy(cur->item->data); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1390 | } |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1391 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1392 | } else if (cur->action == AIM_CB_SSI_DEL) { |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1393 | /* Add the item to the items list */ |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1394 | aim_tlvlist_t *data; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1395 | data = aim_tlvlist_copy(cur->item->data); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1396 | aim_ssi_itemlist_add(&sess->ssi.local, cur->item->name, cur->item->gid, cur->item->bid, cur->item->type, data); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1397 | } |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1398 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1399 | } else { |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1400 | /* Do the exact opposite */ |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1401 | if (cur->action == AIM_CB_SSI_ADD) { |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1402 | /* Add the item to the items list */ |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1403 | aim_tlvlist_t *data; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1404 | data = aim_tlvlist_copy(cur->item->data); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1405 | aim_ssi_itemlist_add(&sess->ssi.official, cur->item->name, cur->item->gid, cur->item->bid, cur->item->type, data); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1406 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1407 | } else if (cur->action == AIM_CB_SSI_MOD) { |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1408 | /* Replace the old item with the new item in the items list */ |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1409 | struct aim_ssi_item *cur1; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1410 | if ((cur1 = aim_ssi_itemlist_find(sess->ssi.official, cur->item->gid, cur->item->bid))) { |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1411 | free(cur1->name); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1412 | if (cur->item->name) { |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1413 | cur1->name = (char *)malloc((strlen(cur->item->name)+1)*sizeof(char)); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1414 | strcpy(cur1->name, cur->item->name); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1415 | } else |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1416 | cur1->name = NULL; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1417 | aim_freetlvchain(&cur1->data); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1418 | cur1->data = aim_tlvlist_copy(cur->item->data); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1419 | } |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1420 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1421 | } else if (cur->action == AIM_CB_SSI_DEL) { |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1422 | /* Remove the item from the items list */ |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1423 | aim_ssi_itemlist_del(&sess->ssi.official, cur->item); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1424 | cur->item = NULL; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1425 | } |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1426 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1427 | } |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1428 | } /* End if (cur->item) */ |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1429 | } /* End for loop */ |
| 2991 | 1430 | |
| 1431 | if ((userfunc = aim_callhandler(sess, rx->conn, snac->family, snac->subtype))) | |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1432 | ret = userfunc(sess, rx, sess->ssi.pending); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1433 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1434 | /* Free all aim_ssi_tmp's with an outcome */ |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1435 | cur = sess->ssi.pending; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1436 | while (cur && (cur->ack != 0xffff)) { |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1437 | del = cur; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1438 | cur = cur->next; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1439 | free(del->name); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1440 | free(del); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1441 | } |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1442 | sess->ssi.pending = cur; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1443 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1444 | /* If we're not waiting for any more acks, then send more SNACs */ |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1445 | if (!sess->ssi.pending) { |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1446 | sess->ssi.pending = NULL; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1447 | sess->ssi.waiting_for_ack = 0; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1448 | aim_ssi_sync(sess, rx->conn); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1449 | } |
| 2991 | 1450 | |
| 1451 | return ret; | |
| 1452 | } | |
| 1453 | ||
| 1454 | /* | |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1455 | * Subtype 0x000f - SSI Data Unchanged. |
| 2672 | 1456 | * |
| 1457 | * Response to aim_ssi_reqdata() if the server-side data is not newer than | |
| 1458 | * posted local stamp/revision. | |
| 1459 | * | |
| 1460 | */ | |
| 1461 | static int parsedataunchanged(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx, aim_modsnac_t *snac, aim_bstream_t *bs) | |
| 1462 | { | |
| 1463 | int ret = 0; | |
| 1464 | aim_rxcallback_t userfunc; | |
| 1465 | ||
| 2991 | 1466 | sess->ssi.received_data = 1; |
| 1467 | ||
| 2672 | 1468 | if ((userfunc = aim_callhandler(sess, rx->conn, snac->family, snac->subtype))) |
| 1469 | ret = userfunc(sess, rx); | |
| 1470 | ||
| 1471 | return ret; | |
| 1472 | } | |
| 1473 | ||
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1474 | /* |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1475 | * Subtype 0x0011 - SSI Begin Data Modification. |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1476 | * |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1477 | * Tells the server you're going to start modifying data. |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1478 | * |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1479 | */ |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1480 | faim_export int aim_ssi_modbegin(aim_session_t *sess, aim_conn_t *conn) |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1481 | { |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1482 | return aim_genericreq_n(sess, conn, AIM_CB_FAM_SSI, AIM_CB_SSI_EDITSTART); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1483 | } |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1484 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1485 | /* |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1486 | * Subtype 0x0012 - SSI End Data Modification. |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1487 | * |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1488 | * Tells the server you're finished modifying data. |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1489 | * |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1490 | */ |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1491 | faim_export int aim_ssi_modend(aim_session_t *sess, aim_conn_t *conn) |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1492 | { |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1493 | return aim_genericreq_n(sess, conn, AIM_CB_FAM_SSI, AIM_CB_SSI_EDITSTOP); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1494 | } |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1495 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1496 | /* |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1497 | * Subtype 0x0014 - Grant authorization |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1498 | * |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1499 | * Authorizes a contact so they can add you to their contact list. |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1500 | * |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1501 | */ |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1502 | faim_export int aim_ssi_sendauth(aim_session_t *sess, aim_conn_t *conn, char *sn, char *msg) |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1503 | { |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1504 | aim_frame_t *fr; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1505 | aim_snacid_t snacid; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1506 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1507 | if (!sess || !conn || !sn) |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1508 | return -EINVAL; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1509 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1510 | if (!(fr = aim_tx_new(sess, conn, AIM_FRAMETYPE_FLAP, 0x02, 10+1+strlen(sn)+2+(msg ? strlen(msg)+1 : 0)+2))) |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1511 | return -ENOMEM; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1512 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1513 | snacid = aim_cachesnac(sess, AIM_CB_FAM_SSI, AIM_CB_SSI_SENDAUTH, 0x0000, NULL, 0); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1514 | aim_putsnac(&fr->data, AIM_CB_FAM_SSI, AIM_CB_SSI_SENDAUTH, 0x0000, snacid); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1515 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1516 | /* Screen name */ |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1517 | aimbs_put8(&fr->data, strlen(sn)); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1518 | aimbs_putraw(&fr->data, sn, strlen(sn)); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1519 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1520 | /* Message (null terminated) */ |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1521 | aimbs_put16(&fr->data, msg ? strlen(msg) : 0); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1522 | if (msg) { |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1523 | aimbs_putraw(&fr->data, msg, strlen(msg)); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1524 | aimbs_put8(&fr->data, 0x00); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1525 | } |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1526 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1527 | /* Unknown */ |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1528 | aimbs_put16(&fr->data, 0x0000); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1529 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1530 | aim_tx_enqueue(sess, fr); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1531 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1532 | return 0; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1533 | } |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1534 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1535 | /* |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1536 | * Subtype 0x0015 - Receive an authorization grant |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1537 | */ |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1538 | static int receiveauthgrant(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx, aim_modsnac_t *snac, aim_bstream_t *bs) |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1539 | { |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1540 | int ret = 0; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1541 | aim_rxcallback_t userfunc; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1542 | fu16_t tmp; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1543 | char *sn, *msg; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1544 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1545 | /* Read screen name */ |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1546 | if ((tmp = aimbs_get8(bs))) |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1547 | sn = aimbs_getstr(bs, tmp); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1548 | else |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1549 | sn = NULL; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1550 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1551 | /* Read message (null terminated) */ |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1552 | if ((tmp = aimbs_get16(bs))) |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1553 | msg = aimbs_getstr(bs, tmp); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1554 | else |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1555 | msg = NULL; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1556 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1557 | /* Unknown */ |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1558 | tmp = aimbs_get16(bs); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1559 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1560 | if ((userfunc = aim_callhandler(sess, rx->conn, snac->family, snac->subtype))) |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1561 | ret = userfunc(sess, rx, sn, msg); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1562 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1563 | free(sn); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1564 | free(msg); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1565 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1566 | return ret; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1567 | } |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1568 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1569 | /* |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1570 | * Subtype 0x0018 - Send authorization request |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1571 | * |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1572 | * Sends a request for authorization to the given contact. The request will either be |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1573 | * granted, denied, or dropped. |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1574 | * |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1575 | */ |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1576 | faim_export int aim_ssi_sendauthrequest(aim_session_t *sess, aim_conn_t *conn, char *sn, char *msg) |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1577 | { |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1578 | aim_frame_t *fr; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1579 | aim_snacid_t snacid; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1580 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1581 | if (!sess || !conn || !sn) |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1582 | return -EINVAL; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1583 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1584 | if (!(fr = aim_tx_new(sess, conn, AIM_FRAMETYPE_FLAP, 0x02, 10+1+strlen(sn)+2+(msg ? strlen(msg)+1 : 0)+2))) |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1585 | return -ENOMEM; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1586 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1587 | snacid = aim_cachesnac(sess, AIM_CB_FAM_SSI, AIM_CB_SSI_SENDAUTHREQ, 0x0000, NULL, 0); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1588 | aim_putsnac(&fr->data, AIM_CB_FAM_SSI, AIM_CB_SSI_SENDAUTHREQ, 0x0000, snacid); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1589 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1590 | /* Screen name */ |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1591 | aimbs_put8(&fr->data, strlen(sn)); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1592 | aimbs_putraw(&fr->data, sn, strlen(sn)); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1593 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1594 | /* Message (null terminated) */ |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1595 | aimbs_put16(&fr->data, msg ? strlen(msg) : 0); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1596 | if (msg) { |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1597 | aimbs_putraw(&fr->data, msg, strlen(msg)); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1598 | aimbs_put8(&fr->data, 0x00); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1599 | } |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1600 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1601 | /* Unknown */ |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1602 | aimbs_put16(&fr->data, 0x0000); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1603 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1604 | aim_tx_enqueue(sess, fr); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1605 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1606 | return 0; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1607 | } |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1608 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1609 | /* |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1610 | * Subtype 0x0019 - Receive an authorization request |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1611 | */ |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1612 | static int receiveauthrequest(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx, aim_modsnac_t *snac, aim_bstream_t *bs) |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1613 | { |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1614 | int ret = 0; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1615 | aim_rxcallback_t userfunc; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1616 | fu16_t tmp; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1617 | char *sn, *msg; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1618 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1619 | /* Read screen name */ |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1620 | if ((tmp = aimbs_get8(bs))) |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1621 | sn = aimbs_getstr(bs, tmp); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1622 | else |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1623 | sn = NULL; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1624 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1625 | /* Read message (null terminated) */ |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1626 | if ((tmp = aimbs_get16(bs))) |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1627 | msg = aimbs_getstr(bs, tmp); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1628 | else |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1629 | msg = NULL; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1630 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1631 | /* Unknown */ |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1632 | tmp = aimbs_get16(bs); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1633 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1634 | if ((userfunc = aim_callhandler(sess, rx->conn, snac->family, snac->subtype))) |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1635 | ret = userfunc(sess, rx, sn, msg); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1636 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1637 | free(sn); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1638 | free(msg); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1639 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1640 | return ret; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1641 | } |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1642 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1643 | /* |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1644 | * Subtype 0x001a - Send authorization reply |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1645 | * |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1646 | * Sends a reply to a request for authorization. The reply can either |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1647 | * grant authorization or deny authorization. |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1648 | * |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1649 | * if reply=0x00 then deny |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1650 | * if reply=0x01 then grant |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1651 | * |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1652 | */ |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1653 | faim_export int aim_ssi_sendauthreply(aim_session_t *sess, aim_conn_t *conn, char *sn, fu8_t reply, char *msg) |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1654 | { |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1655 | aim_frame_t *fr; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1656 | aim_snacid_t snacid; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1657 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1658 | if (!sess || !conn || !sn) |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1659 | return -EINVAL; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1660 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1661 | if (!(fr = aim_tx_new(sess, conn, AIM_FRAMETYPE_FLAP, 0x02, 10 + 1+strlen(sn) + 1 + 2+(msg ? strlen(msg)+1 : 0) + 2))) |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1662 | return -ENOMEM; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1663 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1664 | snacid = aim_cachesnac(sess, AIM_CB_FAM_SSI, AIM_CB_SSI_SENDAUTHREP, 0x0000, NULL, 0); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1665 | aim_putsnac(&fr->data, AIM_CB_FAM_SSI, AIM_CB_SSI_SENDAUTHREP, 0x0000, snacid); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1666 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1667 | /* Screen name */ |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1668 | aimbs_put8(&fr->data, strlen(sn)); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1669 | aimbs_putraw(&fr->data, sn, strlen(sn)); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1670 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1671 | /* Grant or deny */ |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1672 | aimbs_put8(&fr->data, reply); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1673 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1674 | /* Message (null terminated) */ |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1675 | aimbs_put16(&fr->data, msg ? (strlen(msg)+1) : 0); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1676 | if (msg) { |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1677 | aimbs_putraw(&fr->data, msg, strlen(msg)); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1678 | aimbs_put8(&fr->data, 0x00); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1679 | } |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1680 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1681 | /* Unknown */ |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1682 | aimbs_put16(&fr->data, 0x0000); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1683 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1684 | aim_tx_enqueue(sess, fr); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1685 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1686 | return 0; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1687 | } |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1688 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1689 | /* |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1690 | * Subtype 0x001b - Receive an authorization reply |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1691 | * You get this bad boy when other people respond to the authorization |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1692 | * request that you have previously sent them. |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1693 | */ |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1694 | static int receiveauthreply(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx, aim_modsnac_t *snac, aim_bstream_t *bs) |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1695 | { |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1696 | int ret = 0; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1697 | aim_rxcallback_t userfunc; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1698 | fu16_t tmp; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1699 | fu8_t reply; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1700 | char *sn, *msg; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1701 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1702 | /* Read screen name */ |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1703 | if ((tmp = aimbs_get8(bs))) |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1704 | sn = aimbs_getstr(bs, tmp); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1705 | else |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1706 | sn = NULL; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1707 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1708 | /* Read reply */ |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1709 | reply = aimbs_get8(bs); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1710 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1711 | /* Read message (null terminated) */ |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1712 | if ((tmp = aimbs_get16(bs))) |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1713 | msg = aimbs_getstr(bs, tmp); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1714 | else |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1715 | msg = NULL; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1716 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1717 | /* Unknown */ |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1718 | tmp = aimbs_get16(bs); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1719 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1720 | if ((userfunc = aim_callhandler(sess, rx->conn, snac->family, snac->subtype))) |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1721 | ret = userfunc(sess, rx, sn, reply, msg); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1722 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1723 | free(sn); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1724 | free(msg); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1725 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1726 | return ret; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1727 | } |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1728 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1729 | /* |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1730 | * Subtype 0x001c - Receive a message telling you someone added you to their list. |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1731 | */ |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1732 | static int receiveadded(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx, aim_modsnac_t *snac, aim_bstream_t *bs) |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1733 | { |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1734 | int ret = 0; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1735 | aim_rxcallback_t userfunc; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1736 | fu16_t tmp; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1737 | char *sn; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1738 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1739 | /* Read screen name */ |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1740 | if ((tmp = aimbs_get8(bs))) |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1741 | sn = aimbs_getstr(bs, tmp); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1742 | else |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1743 | sn = NULL; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1744 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1745 | if ((userfunc = aim_callhandler(sess, rx->conn, snac->family, snac->subtype))) |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1746 | ret = userfunc(sess, rx, sn); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1747 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1748 | free(sn); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1749 | |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1750 | return ret; |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1751 | } |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1752 | |
| 2672 | 1753 | static int snachandler(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx, aim_modsnac_t *snac, aim_bstream_t *bs) |
| 1754 | { | |
| 1755 | ||
|
3017
e01d7ec2b5db
[gaim-migrate @ 3030]
Mark Doliner <markdoliner@pidgin.im>
parents:
3000
diff
changeset
|
1756 | if (snac->subtype == AIM_CB_SSI_RIGHTSINFO) |
| 2672 | 1757 | return parserights(sess, mod, rx, snac, bs); |
|
3017
e01d7ec2b5db
[gaim-migrate @ 3030]
Mark Doliner <markdoliner@pidgin.im>
parents:
3000
diff
changeset
|
1758 | else if (snac->subtype == AIM_CB_SSI_LIST) |
| 2672 | 1759 | return parsedata(sess, mod, rx, snac, bs); |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1760 | else if (snac->subtype == AIM_CB_SSI_ADD) |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1761 | return parseadd(sess, mod, rx, snac, bs); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1762 | else if (snac->subtype == AIM_CB_SSI_MOD) |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1763 | return parsemod(sess, mod, rx, snac, bs); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1764 | else if (snac->subtype == AIM_CB_SSI_DEL) |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1765 | return parsedel(sess, mod, rx, snac, bs); |
| 2991 | 1766 | else if (snac->subtype == AIM_CB_SSI_SRVACK) |
| 1767 | return parseack(sess, mod, rx, snac, bs); | |
|
3017
e01d7ec2b5db
[gaim-migrate @ 3030]
Mark Doliner <markdoliner@pidgin.im>
parents:
3000
diff
changeset
|
1768 | else if (snac->subtype == AIM_CB_SSI_NOLIST) |
| 2672 | 1769 | return parsedataunchanged(sess, mod, rx, snac, bs); |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1770 | else if (snac->subtype == AIM_CB_SSI_RECVAUTH) |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1771 | return receiveauthgrant(sess, mod, rx, snac, bs); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1772 | else if (snac->subtype == AIM_CB_SSI_RECVAUTHREQ) |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1773 | return receiveauthrequest(sess, mod, rx, snac, bs); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1774 | else if (snac->subtype == AIM_CB_SSI_RECVAUTHREP) |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1775 | return receiveauthreply(sess, mod, rx, snac, bs); |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1776 | else if (snac->subtype == AIM_CB_SSI_ADDED) |
|
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1777 | return receiveadded(sess, mod, rx, snac, bs); |
| 2672 | 1778 | |
| 1779 | return 0; | |
| 1780 | } | |
| 1781 | ||
| 2991 | 1782 | static void ssi_shutdown(aim_session_t *sess, aim_module_t *mod) |
| 1783 | { | |
| 1784 | aim_ssi_freelist(sess); | |
| 1785 | ||
| 1786 | return; | |
| 1787 | } | |
| 1788 | ||
| 2672 | 1789 | faim_internal int ssi_modfirst(aim_session_t *sess, aim_module_t *mod) |
| 1790 | { | |
| 1791 | ||
|
3017
e01d7ec2b5db
[gaim-migrate @ 3030]
Mark Doliner <markdoliner@pidgin.im>
parents:
3000
diff
changeset
|
1792 | mod->family = AIM_CB_FAM_SSI; |
|
4230
b5393db78439
[gaim-migrate @ 4475]
Mark Doliner <markdoliner@pidgin.im>
parents:
4071
diff
changeset
|
1793 | mod->version = 0x0004; |
| 2672 | 1794 | mod->toolid = 0x0110; |
|
4071
f0c425b22b92
[gaim-migrate @ 4283]
Mark Doliner <markdoliner@pidgin.im>
parents:
3867
diff
changeset
|
1795 | mod->toolversion = 0x0629; |
| 2672 | 1796 | mod->flags = 0; |
| 1797 | strncpy(mod->name, "ssi", sizeof(mod->name)); | |
| 1798 | mod->snachandler = snachandler; | |
| 2991 | 1799 | mod->shutdown = ssi_shutdown; |
| 2672 | 1800 | |
| 1801 | return 0; | |
| 1802 | } |