source: libfaim/msgcookie.c @ 601733d

barnowl_perlaimdebianowlrelease-1.4release-1.5release-1.6release-1.7release-1.8release-1.9
Last change on this file since 601733d was e374dee, checked in by James M. Kretchmar <kretch@mit.edu>, 17 years ago
*** empty log message ***
  • Property mode set to 100644
File size: 4.9 KB
Line 
1/*
2 * Cookie Caching stuff. Adam wrote this, apparently just some
3 * derivatives of n's SNAC work. I cleaned it up, added comments.
4 *
5 */
6
7/*
8 * I'm assuming that cookies are type-specific. that is, we can have
9 * "1234578" for type 1 and type 2 concurrently. if i'm wrong, then we
10 * lose some error checking. if we assume cookies are not type-specific and are
11 * wrong, we get quirky behavior when cookies step on each others' toes.
12 */
13
14#define FAIM_INTERNAL
15#include <aim.h>
16
17/**
18 * aim_cachecookie - appends a cookie to the cookie list
19 * @sess: session to add to
20 * @cookie: pointer to struct to append
21 *
22 * if cookie->cookie for type cookie->type is found, updates the
23 * ->addtime of the found structure; otherwise adds the given cookie
24 * to the cache
25 *
26 * returns -1 on error, 0 on append, 1 on update.  the cookie you pass
27 * in may be free'd, so don't count on its value after calling this!
28 *
29 */
30faim_internal int aim_cachecookie(aim_session_t *sess, aim_msgcookie_t *cookie)
31{
32        aim_msgcookie_t *newcook;
33
34        if (!sess || !cookie)
35                return -EINVAL;
36
37        newcook = aim_checkcookie(sess, cookie->cookie, cookie->type);
38       
39        if (newcook == cookie) {
40                newcook->addtime = time(NULL);
41                return 1;
42        } else if (newcook)
43                aim_cookie_free(sess, newcook);
44
45        cookie->addtime = time(NULL); 
46
47        cookie->next = sess->msgcookies;
48        sess->msgcookies = cookie;
49
50        return 0;
51}
52
53/**
54 * aim_uncachecookie - grabs a cookie from the cookie cache (removes it from the list)
55 * @sess: session to grab cookie from
56 * @cookie: cookie string to look for
57 * @type: cookie type to look for
58 *
59 * takes a cookie string and a cookie type and finds the cookie struct associated with that duple, removing it from the cookie list ikn the process.
60 *
61 * if found, returns the struct; if none found (or on error), returns NULL:
62 */
63faim_internal aim_msgcookie_t *aim_uncachecookie(aim_session_t *sess, fu8_t *cookie, int type)
64{
65        aim_msgcookie_t *cur, **prev;
66
67        if (!cookie || !sess->msgcookies)
68                return NULL;
69
70        for (prev = &sess->msgcookies; (cur = *prev); ) {
71                if ((cur->type == type) && 
72                                (memcmp(cur->cookie, cookie, 8) == 0)) {
73                        *prev = cur->next;
74                        return cur;
75                }
76                prev = &cur->next;
77        }
78
79        return NULL;
80}
81
82/**
83 * aim_mkcookie - generate an aim_msgcookie_t *struct from a cookie string, a type, and a data pointer.
84 * @c: pointer to the cookie string array
85 * @type: cookie type to use
86 * @data: data to be cached with the cookie
87 *
88 * returns NULL on error, a pointer to the newly-allocated cookie on
89 * success.
90 *
91 */
92faim_internal aim_msgcookie_t *aim_mkcookie(fu8_t *c, int type, void *data) 
93{
94        aim_msgcookie_t *cookie;
95
96        if (!c)
97                return NULL;
98
99        if (!(cookie = calloc(1, sizeof(aim_msgcookie_t))))
100                return NULL;
101
102        cookie->data = data;
103        cookie->type = type;
104        memcpy(cookie->cookie, c, 8);
105
106        return cookie;
107}
108
109/**
110 * aim_checkcookie - check to see if a cookietuple has been cached
111 * @sess: session to check for the cookie in
112 * @cookie: pointer to the cookie string array
113 * @type: type of the cookie to look for
114 *
115 * this returns a pointer to the cookie struct (still in the list) on
116 * success; returns NULL on error/not found
117 *
118 */
119
120faim_internal aim_msgcookie_t *aim_checkcookie(aim_session_t *sess, const fu8_t *cookie, int type)
121{
122        aim_msgcookie_t *cur;
123
124        for (cur = sess->msgcookies; cur; cur = cur->next) {
125                if ((cur->type == type) && 
126                                (memcmp(cur->cookie, cookie, 8) == 0))
127                        return cur;   
128        }
129
130        return NULL;
131}
132
133#if 0 /* debugging feature */
134faim_internal int aim_dumpcookie(aim_session_t *sess, aim_msgcookie_t *cookie)
135{
136
137        if (!cookie)
138                return -EINVAL;
139
140        faimdprintf(sess, 0, "\tCookie at %p: %d/%s with %p, next %p\n", cookie,
141                        cookie->type, cookie->cookie, cookie->data, cookie->next);
142
143        return 0;
144}
145#endif
146
147/**
148 * aim_cookie_free - free an aim_msgcookie_t struct
149 * @sess: session to remove the cookie from
150 * @cookiep: the address of a pointer to the cookie struct to remove
151 *
152 * this function removes the cookie *cookie from teh list of cookies
153 * in sess, and then frees all memory associated with it. including
154 * its data! if you want to use the private data after calling this,
155 * make sure you copy it first.
156 *
157 * returns -1 on error, 0 on success.
158 *
159 */
160faim_internal int aim_cookie_free(aim_session_t *sess, aim_msgcookie_t *cookie) 
161{
162        aim_msgcookie_t *cur, **prev;
163
164        if (!sess || !cookie)
165                return -EINVAL;
166
167        for (prev = &sess->msgcookies; (cur = *prev); ) {
168                if (cur == cookie)
169                        *prev = cur->next;
170                else
171                        prev = &cur->next;
172        }
173
174        free(cookie->data);
175        free(cookie);
176
177        return 0;
178} 
179
180/* XXX I hate switch */
181faim_internal int aim_msgcookie_gettype(int reqclass) 
182{
183        /* XXX: hokey-assed. needs fixed. */
184        switch(reqclass) {
185        case AIM_CAPS_BUDDYICON: return AIM_COOKIETYPE_OFTICON;
186        case AIM_CAPS_VOICE: return AIM_COOKIETYPE_OFTVOICE;
187        case AIM_CAPS_DIRECTIM: return AIM_COOKIETYPE_OFTIMAGE;
188        case AIM_CAPS_CHAT: return AIM_COOKIETYPE_CHAT;
189        case AIM_CAPS_GETFILE: return AIM_COOKIETYPE_OFTGET;
190        case AIM_CAPS_SENDFILE: return AIM_COOKIETYPE_OFTSEND;
191        default: return AIM_COOKIETYPE_UNKNOWN;
192        }           
193}
Note: See TracBrowser for help on using the repository browser.