Mercurial > pidgin.yaz
comparison plugins/icq/queue.c @ 1152:201ec77f3a60
[gaim-migrate @ 1162]
icq. whoop de doo
committer: Tailor Script <tailor@pidgin.im>
author | Eric Warmenhoven <eric@warmenhoven.org> |
---|---|
date | Tue, 28 Nov 2000 02:22:42 +0000 |
parents | |
children | a97e334ecfa2 |
comparison
equal
deleted
inserted
replaced
1151:428372cc1e39 | 1152:201ec77f3a60 |
---|---|
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 } |