view libfaim/aim_snac.c @ 133:e277d5f0c1dd

[gaim-migrate @ 143] Let's see if I can remember everything I did: - Fixed a bug I let slip. If you choose the new option to not play login sounds when you log in, and then quit before the timeout is up, it would save that you didn't want login sounds at all. - Added two new plugin events: event_away and event_buddy_away. - Made GtkWidget *imaway in away.c and void play(uchar *, int) in sound.c not static any more (though not referenced in gaim.h). This is so plugins can use those (and not have to worry about writing their own sound code). - Wrote a quick plugin to auto-iconify windows when you go away. I had just been locally patching my own copy, since I figured it wasn't worth including as an option. It also demonstrates some of the issues of deciding between USE_APPLET and not. Perhaps plugins are the way to go with some things that would otherwise have been options (for example, the Lag-O-Meter is one of those things that could possibly have been a plugin instead of hard-coded in). I think that's everything. committer: Tailor Script <tailor@pidgin.im>
author Eric Warmenhoven <eric@warmenhoven.org>
date Wed, 19 Apr 2000 02:04:30 +0000
parents 68b230f8da5f
children 6ced2f1c8b24
line wrap: on
line source


/*
 *
 * Various SNAC-related dodads... 
 *
 * outstanding_snacs is a list of aim_snac_t structs.  A SNAC should be added
 * whenever a new SNAC is sent and it should remain in the list until the
 * response for it has been receieved.
 *
 * First edition badly written by Adam Fritzler (afritz@delphid.ml.org)
 * Current edition nicely rewritten (it even works) by n (n@ml.org)
 *
 */

#include <aim.h>
#include <assert.h>

struct aim_snac_t	*aim_outstanding_snacs = NULL;
u_long	aim_snac_nextid = 0x00000001;

u_long	aim_newsnac(struct aim_snac_t *newsnac) {
	struct aim_snac_t	*snac = NULL, *cur = aim_outstanding_snacs;
  
	assert(newsnac != NULL);
	snac = calloc(1, sizeof(struct aim_snac_t));
	assert(snac != NULL);
	memcpy(snac, newsnac, sizeof(struct aim_snac_t));
	snac->issuetime = time(&snac->issuetime);
	snac->next = NULL;

	if (cur == NULL) {
		aim_outstanding_snacs = snac;
		return(snac->id);
	}
	while (cur->next != NULL)
		cur = cur->next;
	cur->next = snac;
	return(snac->id);
}

struct aim_snac_t	*aim_remsnac(u_long id) {
	struct aim_snac_t	*cur = aim_outstanding_snacs;

	if (cur == NULL)
		return(NULL);
	if (cur->id == id) {
		aim_outstanding_snacs = cur->next;
		return(cur);
	}
	while (cur->next != NULL) {
		if (cur->next->id == id) {
			struct aim_snac_t	*tmp = NULL;

			tmp = cur->next;
			cur->next = cur->next->next;
			return(tmp);
		}
		cur = cur->next;
	}
	return(NULL);
}

/*
 * This is for cleaning up old SNACs that either don't get replies or
 * a reply was never received for.  Garabage collection. Plain and simple.
 *
 * maxage is the _minimum_ age in seconds to keep SNACs (though I don't know
 * why its called _max_age).
 *
 */
int aim_cleansnacs(int maxage)
{
  struct aim_snac_t *cur = aim_outstanding_snacs;
  struct aim_snac_t *remed = NULL;
  time_t curtime;
  
  curtime = time(&curtime);

  while (cur)
    {
      if ( (cur) && (((cur->issuetime) + maxage) < curtime))
	{
#if DEBUG > 1
	  printf("aimsnac: WARNING purged obsolete snac %ul\n", cur->id);
#endif
	  remed = aim_remsnac(cur->id);
	  if (remed)
	    {
	      if (remed->data)
		free(remed->data);
	      free(remed);
	    }
	}
      cur = cur->next;
    }

  return 0;
}

int aim_putsnac(u_char *buf, int family, int subtype, int flags, u_long snacid)
{
  int curbyte = 0;
  curbyte += aimutil_put16(buf+curbyte,family&0xffff);
  curbyte += aimutil_put16(buf+curbyte,subtype&0xffff);
  curbyte += aimutil_put16(buf+curbyte,flags&0xffff);
  curbyte += aimutil_put32(buf+curbyte,snacid);
  return curbyte;
}