Changeset 862371b for libfaim/snac.c


Ignore:
Timestamp:
Jun 29, 2003, 1:47:04 PM (18 years ago)
Author:
James M. Kretchmar <kretch@mit.edu>
Branches:
master, barnowl_perlaim, debian, owl, release-1.4, release-1.5, release-1.6, release-1.7, release-1.8, release-1.9
Children:
e016fc2
Parents:
03ad7b2
Message:
*** empty log message ***
File:
1 edited

Legend:

Unmodified
Added
Removed
  • libfaim/snac.c

    r5e53c4a r862371b  
    9090                if (cur->id == id) {
    9191                        *prev = cur->next;
     92                        if (cur->flags & AIM_SNACFLAGS_DESTRUCTOR) {
     93                                struct aim_snac_destructor *asd = cur->data;
     94                                cur->data = asd->data;
     95                                free(asd);
     96                        }
    9297                        return cur;
    9398                } else
     
    97102        return cur;
    98103}
     104
     105/* Free a SNAC, and call the appropriate destructor if necessary.
     106 */
     107faim_internal faim_shortfunc void aim_cleansnac(aim_session_t *sess, aim_snac_t *snac)
     108{
     109        aim_module_t *cur;
     110
     111        if (snac->flags & AIM_SNACFLAGS_DESTRUCTOR) {
     112                struct aim_snac_destructor *d = snac->data;
     113                aim_modsnac_t modsnac;
     114
     115                modsnac.id = snac->id;
     116                modsnac.subtype = snac->type;
     117                modsnac.family = snac->family;
     118                modsnac.flags = snac->flags;
     119
     120                for (cur = (aim_module_t *)sess->modlistv; cur; cur = cur->next)
     121                {
     122                        if (!cur->snacdestructor)
     123                                continue;
     124                        if (!(cur->flags & AIM_MODFLAG_MULTIFAMILY) &&
     125                                (cur->family != modsnac.family))
     126                                continue;
     127                        if (cur->snacdestructor(sess, d->conn, &modsnac,
     128                                                d->data))
     129                                break;
     130                }
     131                free(d->data);
     132        }
     133
     134        free(snac->data);
     135        free(snac);
     136}
     137
    99138
    100139/*
     
    123162                                *prev = cur->next;
    124163
    125                                 /* XXX should we have destructors here? */
    126                                 free(cur->data);
    127                                 free(cur);
    128 
     164                                aim_cleansnac(sess, cur);
    129165                        } else
    130166                                prev = &cur->next;
Note: See TracChangeset for help on using the changeset viewer.