plugins/icq/queue.c

changeset 1152
e94e29686ded
child 1192
f55a4cf00dd2
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/plugins/icq/queue.c	Tue Nov 28 02:22:42 2000 +0000
@@ -0,0 +1,167 @@
+/* -*- Mode: C; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/*
+$Id: queue.c 1162 2000-11-28 02:22:42Z warmenhoven $
+$Log$
+Revision 1.1  2000/11/28 02:22:42  warmenhoven
+icq. whoop de doo
+
+Revision 1.9  2000/07/10 01:31:17  bills
+oops - removed #define LIST_TRACE and #define QUEUE_DEBUG
+
+Revision 1.8  2000/07/10 01:26:56  bills
+added more trace messages, reworked packet delete handling: now happens
+during _icq_UDEQueueItemFree rather than during icq_UDPQueueDelSeq - fixes
+memory leak
+
+Revision 1.7  2000/07/09 22:07:37  bills
+use new list_free
+
+Revision 1.6  2000/06/25 16:30:05  denis
+Some sanity checks were added to icq_UDPQueueDelete() and
+icq_UDPQueueFree()
+
+Revision 1.5  2000/05/10 19:06:59  denis
+UDP outgoing packet queue was implemented.
+
+Revision 1.4  2000/03/30 14:15:28  denis
+Fixed FreeBSD warning about obsolete malloc.h header.
+
+Revision 1.3  2000/01/16 03:59:10  bills
+reworked list code so list_nodes don't need to be inside item structures,
+removed strlist code and replaced with generic list calls
+
+Revision 1.2  1999/09/29 17:06:47  denis
+ICQLINK compatibility added.
+
+Revision 1.1  1999/07/16 12:12:13  denis
+Initial support for outgoing packet queue added.
+
+*/
+
+#include <stdlib.h>
+#include <time.h>
+
+#include "queue.h"
+#include "list.h"
+
+void icq_UDPQueueNew(ICQLINK *link)
+{
+  link->icq_UDPQueue = list_new();
+  link->icq_UDPExpireInterval = 15; /* expire interval = 15 sec */
+}
+
+void icq_UDPQueuePut(ICQLINK *link, icq_Packet *p, int attempt)
+{
+  icq_UDPQueueItem *ptr = (icq_UDPQueueItem*)malloc(sizeof(icq_UDPQueueItem));
+#ifdef QUEUE_DEBUG
+  printf("icq_UDPQueuePut(seq=0x%04X, cmd=0x%04X)\n", icq_PacketReadUDPOutSeq1(p),
+         icq_PacketReadUDPOutCmd(p));
+#endif
+  ptr->attempts = attempt;
+  ptr->expire = time(0L)+link->icq_UDPExpireInterval;
+  ptr->pack = p;
+#ifdef QUEUE_DEBUG
+  printf("enqueuing queueitem %p\n", ptr);
+#endif
+  list_enqueue(link->icq_UDPQueue, ptr);
+}
+
+icq_Packet *icq_UDPQueueGet(ICQLINK *link)
+{
+  icq_UDPQueueItem *ptr = (icq_UDPQueueItem*)list_first(link->icq_UDPQueue);
+  icq_Packet *pack = 0L;
+  if(ptr)
+  {
+    pack = ptr->pack;
+    list_remove(link->icq_UDPQueue, (list_node*)ptr);
+  }
+#ifdef QUEUE_DEBUG
+  if(pack)
+    printf("icq_UDPQueueGet(cmd=0x%04X)\n", icq_PacketReadUDPOutCmd(pack));
+#endif
+  return pack;
+}
+
+icq_Packet *icq_UDPQueuePeek(ICQLINK *link)
+{
+  icq_UDPQueueItem *ptr = (icq_UDPQueueItem*)list_first(link->icq_UDPQueue);
+  if(ptr)
+    return ptr->pack;
+  else
+    return 0L;
+}
+
+void _icq_UDPQueueItemFree(void *p)
+{
+  icq_UDPQueueItem *pitem=(icq_UDPQueueItem *)p;
+
+#ifdef QUEUE_DEBUG
+  printf("_icq_UDPQueueItemFree(%p)\n", p);
+#endif
+
+  if (pitem->pack)
+    icq_PacketDelete(pitem->pack);
+
+  free(p);
+}
+
+/* Frees the queue and dispose it */
+void icq_UDPQueueDelete(ICQLINK *link)
+{
+#ifdef QUEUE_DEBUG
+  printf("icq_UDPQueueDelete\n");
+#endif
+  if(link->icq_UDPQueue)
+  {
+    list_delete(link->icq_UDPQueue, _icq_UDPQueueItemFree);
+    link->icq_UDPQueue = 0;
+  }
+}
+
+/* Only frees the queue */
+void icq_UDPQueueFree(ICQLINK *link)
+{
+#ifdef QUEUE_DEBUG
+  printf("icq_UDPQueueFree\n");
+#endif
+  if(link->icq_UDPQueue)
+    list_free(link->icq_UDPQueue, _icq_UDPQueueItemFree);
+}
+
+int icq_UDPQueueFindSeq(void *p, va_list data)
+{
+  WORD seq=va_arg(data, WORD);
+  return icq_PacketReadUDPOutSeq1(((icq_UDPQueueItem *)p)->pack) == seq;
+}
+
+void icq_UDPQueueDelSeq(ICQLINK *link, WORD seq)
+{
+  icq_UDPQueueItem *ptr;
+#ifdef QUEUE_DEBUG
+  printf("icq_UDPQueueDelSeq(seq=0x%04X", seq);
+#endif
+  ptr = list_traverse(link->icq_UDPQueue, icq_UDPQueueFindSeq, seq);
+  if(ptr)
+  {
+#ifdef QUEUE_DEBUG
+    printf(", cmd=0x%04X",icq_PacketReadUDPOutCmd(ptr->pack));
+#endif
+    list_remove(link->icq_UDPQueue, ptr);
+    _icq_UDPQueueItemFree(ptr);
+  }
+#ifdef QUEUE_DEBUG
+  printf(")\n");
+#endif
+}
+
+long icq_UDPQueueInterval(ICQLINK *link)
+{
+  long interval;
+  icq_UDPQueueItem *ptr = (icq_UDPQueueItem*)list_first(link->icq_UDPQueue);
+  if(ptr)
+  {
+    interval = ptr->expire - time(0L);
+    return interval>=0?interval:0;
+  }
+  return -1;
+}

mercurial