1152
|
1 /* -*- Mode: C; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
|
2 /*
|
|
3 $Id: queue.c 1162 2000-11-28 02:22:42Z warmenhoven $
|
|
4 $Log$
|
|
5 Revision 1.1 2000/11/28 02:22:42 warmenhoven
|
|
6 icq. whoop de doo
|
|
7
|
|
8 Revision 1.9 2000/07/10 01:31:17 bills
|
|
9 oops - removed #define LIST_TRACE and #define QUEUE_DEBUG
|
|
10
|
|
11 Revision 1.8 2000/07/10 01:26:56 bills
|
|
12 added more trace messages, reworked packet delete handling: now happens
|
|
13 during _icq_UDEQueueItemFree rather than during icq_UDPQueueDelSeq - fixes
|
|
14 memory leak
|
|
15
|
|
16 Revision 1.7 2000/07/09 22:07:37 bills
|
|
17 use new list_free
|
|
18
|
|
19 Revision 1.6 2000/06/25 16:30:05 denis
|
|
20 Some sanity checks were added to icq_UDPQueueDelete() and
|
|
21 icq_UDPQueueFree()
|
|
22
|
|
23 Revision 1.5 2000/05/10 19:06:59 denis
|
|
24 UDP outgoing packet queue was implemented.
|
|
25
|
|
26 Revision 1.4 2000/03/30 14:15:28 denis
|
|
27 Fixed FreeBSD warning about obsolete malloc.h header.
|
|
28
|
|
29 Revision 1.3 2000/01/16 03:59:10 bills
|
|
30 reworked list code so list_nodes don't need to be inside item structures,
|
|
31 removed strlist code and replaced with generic list calls
|
|
32
|
|
33 Revision 1.2 1999/09/29 17:06:47 denis
|
|
34 ICQLINK compatibility added.
|
|
35
|
|
36 Revision 1.1 1999/07/16 12:12:13 denis
|
|
37 Initial support for outgoing packet queue added.
|
|
38
|
|
39 */
|
|
40
|
|
41 #include <stdlib.h>
|
|
42 #include <time.h>
|
|
43
|
|
44 #include "queue.h"
|
|
45 #include "list.h"
|
|
46
|
|
47 void icq_UDPQueueNew(ICQLINK *link)
|
|
48 {
|
|
49 link->icq_UDPQueue = list_new();
|
|
50 link->icq_UDPExpireInterval = 15; /* expire interval = 15 sec */
|
|
51 }
|
|
52
|
|
53 void icq_UDPQueuePut(ICQLINK *link, icq_Packet *p, int attempt)
|
|
54 {
|
|
55 icq_UDPQueueItem *ptr = (icq_UDPQueueItem*)malloc(sizeof(icq_UDPQueueItem));
|
|
56 #ifdef QUEUE_DEBUG
|
|
57 printf("icq_UDPQueuePut(seq=0x%04X, cmd=0x%04X)\n", icq_PacketReadUDPOutSeq1(p),
|
|
58 icq_PacketReadUDPOutCmd(p));
|
|
59 #endif
|
|
60 ptr->attempts = attempt;
|
|
61 ptr->expire = time(0L)+link->icq_UDPExpireInterval;
|
|
62 ptr->pack = p;
|
|
63 #ifdef QUEUE_DEBUG
|
|
64 printf("enqueuing queueitem %p\n", ptr);
|
|
65 #endif
|
|
66 list_enqueue(link->icq_UDPQueue, ptr);
|
|
67 }
|
|
68
|
|
69 icq_Packet *icq_UDPQueueGet(ICQLINK *link)
|
|
70 {
|
|
71 icq_UDPQueueItem *ptr = (icq_UDPQueueItem*)list_first(link->icq_UDPQueue);
|
|
72 icq_Packet *pack = 0L;
|
|
73 if(ptr)
|
|
74 {
|
|
75 pack = ptr->pack;
|
|
76 list_remove(link->icq_UDPQueue, (list_node*)ptr);
|
|
77 }
|
|
78 #ifdef QUEUE_DEBUG
|
|
79 if(pack)
|
|
80 printf("icq_UDPQueueGet(cmd=0x%04X)\n", icq_PacketReadUDPOutCmd(pack));
|
|
81 #endif
|
|
82 return pack;
|
|
83 }
|
|
84
|
|
85 icq_Packet *icq_UDPQueuePeek(ICQLINK *link)
|
|
86 {
|
|
87 icq_UDPQueueItem *ptr = (icq_UDPQueueItem*)list_first(link->icq_UDPQueue);
|
|
88 if(ptr)
|
|
89 return ptr->pack;
|
|
90 else
|
|
91 return 0L;
|
|
92 }
|
|
93
|
|
94 void _icq_UDPQueueItemFree(void *p)
|
|
95 {
|
|
96 icq_UDPQueueItem *pitem=(icq_UDPQueueItem *)p;
|
|
97
|
|
98 #ifdef QUEUE_DEBUG
|
|
99 printf("_icq_UDPQueueItemFree(%p)\n", p);
|
|
100 #endif
|
|
101
|
|
102 if (pitem->pack)
|
|
103 icq_PacketDelete(pitem->pack);
|
|
104
|
|
105 free(p);
|
|
106 }
|
|
107
|
|
108 /* Frees the queue and dispose it */
|
|
109 void icq_UDPQueueDelete(ICQLINK *link)
|
|
110 {
|
|
111 #ifdef QUEUE_DEBUG
|
|
112 printf("icq_UDPQueueDelete\n");
|
|
113 #endif
|
|
114 if(link->icq_UDPQueue)
|
|
115 {
|
|
116 list_delete(link->icq_UDPQueue, _icq_UDPQueueItemFree);
|
|
117 link->icq_UDPQueue = 0;
|
|
118 }
|
|
119 }
|
|
120
|
|
121 /* Only frees the queue */
|
|
122 void icq_UDPQueueFree(ICQLINK *link)
|
|
123 {
|
|
124 #ifdef QUEUE_DEBUG
|
|
125 printf("icq_UDPQueueFree\n");
|
|
126 #endif
|
|
127 if(link->icq_UDPQueue)
|
|
128 list_free(link->icq_UDPQueue, _icq_UDPQueueItemFree);
|
|
129 }
|
|
130
|
|
131 int icq_UDPQueueFindSeq(void *p, va_list data)
|
|
132 {
|
|
133 WORD seq=va_arg(data, WORD);
|
|
134 return icq_PacketReadUDPOutSeq1(((icq_UDPQueueItem *)p)->pack) == seq;
|
|
135 }
|
|
136
|
|
137 void icq_UDPQueueDelSeq(ICQLINK *link, WORD seq)
|
|
138 {
|
|
139 icq_UDPQueueItem *ptr;
|
|
140 #ifdef QUEUE_DEBUG
|
|
141 printf("icq_UDPQueueDelSeq(seq=0x%04X", seq);
|
|
142 #endif
|
|
143 ptr = list_traverse(link->icq_UDPQueue, icq_UDPQueueFindSeq, seq);
|
|
144 if(ptr)
|
|
145 {
|
|
146 #ifdef QUEUE_DEBUG
|
|
147 printf(", cmd=0x%04X",icq_PacketReadUDPOutCmd(ptr->pack));
|
|
148 #endif
|
|
149 list_remove(link->icq_UDPQueue, ptr);
|
|
150 _icq_UDPQueueItemFree(ptr);
|
|
151 }
|
|
152 #ifdef QUEUE_DEBUG
|
|
153 printf(")\n");
|
|
154 #endif
|
|
155 }
|
|
156
|
|
157 long icq_UDPQueueInterval(ICQLINK *link)
|
|
158 {
|
|
159 long interval;
|
|
160 icq_UDPQueueItem *ptr = (icq_UDPQueueItem*)list_first(link->icq_UDPQueue);
|
|
161 if(ptr)
|
|
162 {
|
|
163 interval = ptr->expire - time(0L);
|
|
164 return interval>=0?interval:0;
|
|
165 }
|
|
166 return -1;
|
|
167 }
|