From 96674592dd3493682a6cccb0b3dcf8ca019fd7a4 Mon Sep 17 00:00:00 2001 From: Piotr Piastucki Date: Wed, 13 Aug 2014 13:46:55 +0000 Subject: Made SkypeClassic plugin compatible with Miranda IM again so that plugins for both IMs can be maintained with one codebase. Compatibility wrapper for Miranda IM is in ng-compat/m_core.h Changed files back to C and removed C++ code. Changed Miranda NG project files so that the c files compile as C++ in order to be compatible with Miranda NG headers (/TP). Added back build scripts and make file to automatically build Miranda IM version using Makefile. git-svn-id: http://svn.miranda-ng.org/main/trunk@10177 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c --- protocols/SkypeClassic/src/msgq.c | 90 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 protocols/SkypeClassic/src/msgq.c (limited to 'protocols/SkypeClassic/src/msgq.c') diff --git a/protocols/SkypeClassic/src/msgq.c b/protocols/SkypeClassic/src/msgq.c new file mode 100644 index 0000000000..e1ab0d1998 --- /dev/null +++ b/protocols/SkypeClassic/src/msgq.c @@ -0,0 +1,90 @@ +/* + * Implements a simple message queue for send and receive queue. + * We could use memlist.c, but it's not efficient + * enough for this purpose (would always memmove on removing first + * element), therefore it's implemented as tail queue. + */ + +#include "skype.h" +#include "msgq.h" +#include "debug.h" + + +void MsgQ_Init(TYP_MSGQ *q) +{ + TAILQ_INIT(&q->l); + InitializeCriticalSection (&q->cs); +} + +void MsgQ_Exit(TYP_MSGQ *q) +{ + struct MsgQueue *ptr; + + EnterCriticalSection(&q->cs); + while ((ptr=q->l.tqh_first) != NULL) + free(MsgQ_RemoveMsg(q, ptr)); + LeaveCriticalSection(&q->cs); + DeleteCriticalSection (&q->cs); +} + +BOOL MsgQ_Add(TYP_MSGQ *q, char *msg) +{ + struct MsgQueue *ptr; + + if ((ptr=(struct MsgQueue*)malloc(sizeof(struct MsgQueue))) == NULL) + return FALSE; + ptr->message = _strdup(msg); // Don't forget to free! + ptr->tAdded = SkypeTime(NULL); + SkypeTime(&ptr->tReceived); + EnterCriticalSection(&q->cs); + TAILQ_INSERT_TAIL(&q->l, ptr, l); + //LOG (("MsgQ_Add (%s) @%lu/%ld", msg, ptr->tReceived, ptr->tAdded)); + LeaveCriticalSection(&q->cs); + return TRUE; +} + +char *MsgQ_RemoveMsg(TYP_MSGQ *q, struct MsgQueue *ptr) +{ + char *msg; + + if (!ptr) return NULL; + EnterCriticalSection(&q->cs); + TAILQ_REMOVE(&q->l, ptr, l); + LeaveCriticalSection(&q->cs); + msg=ptr->message; + free(ptr); + return msg; +} + +char *MsgQ_Get(TYP_MSGQ *q) +{ + char *msg; + + msg=MsgQ_RemoveMsg(q, q->l.tqh_first); + return msg; +} + +int MsgQ_CollectGarbage(TYP_MSGQ *q, time_t age) +{ + struct MsgQueue *ptr; + int i=0; + + EnterCriticalSection(&q->cs); + ptr=q->l.tqh_first; + while (ptr) + { + if (ptr->tAdded && SkypeTime(NULL)-ptr->tAdded>age) + { + struct MsgQueue *ptr_; + LOG(("GarbageCollector throwing out message: %s", ptr->message)); + ptr_=ptr; + ptr=ptr->l.tqe_next; + free(MsgQ_RemoveMsg(q, ptr_)); + i++; + continue; + } + ptr=ptr->l.tqe_next; + } + LeaveCriticalSection(&q->cs); + return i; +} -- cgit v1.2.3