summaryrefslogtreecommitdiff
path: root/plugins/IMO2sProxy/src/imo2skype/callqueue.c
blob: f579eb184eb61e60fae3ed5afcb0f99f7c3987be (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
/* Module:  callqueue.c
   Purpose: Queue for incoming calls
   Author:  leecher
   Date:    02.09.2009

   Fixme:   Sort on insert, do a binary search instead of iterating list.
*/

#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "callqueue.h"

static volatile unsigned int m_uMsgNr=0;
static void FreeEntry(void *pPEntry);

// -----------------------------------------------------------------------------
// Interface
// -----------------------------------------------------------------------------

TYP_LIST *CallQueue_Init(void)
{
	TYP_LIST *hList = List_Init(16);

	return hList;
}

// -----------------------------------------------------------------------------

void CallQueue_Exit(TYP_LIST *hList)
{
	Queue_Exit (hList, FreeEntry);
}

// -----------------------------------------------------------------------------

CALLENTRY *CallQueue_Insert(TYP_LIST *hList, cJSON *pNick, int iDirection)
{
	CALLENTRY *pEntry;
	cJSON *pStream, *pVal, *pPipe;

	if (!(pEntry = Queue_InsertEntry(hList, sizeof(CALLENTRY), ++m_uMsgNr,
		FreeEntry))) return NULL;
	pEntry->pszUser = strdup(cJSON_GetObjectItem(pNick, "buid")->valuestring);
	time (&pEntry->timestamp);
	strcpy (pEntry->szStatus, "RINGING");

	if (pStream = cJSON_GetObjectItem(pNick, "send_stream"))
	{
		strcpy (pEntry->szSendStream, pStream->valuestring);
		if (pStream = cJSON_GetObjectItem(pNick, "recv_stream"))
			strcpy (pEntry->szRecvStream, pStream->valuestring);
	}
	else
	{
		// Copy pipe to Call object
		if (pPipe = cJSON_GetObjectItem(pNick, "pipe"))
		{
			if (pVal = cJSON_GetObjectItem(pPipe, "ip"))
				strncpy (pEntry->szIP, pVal->valuestring, sizeof(pEntry->szIP));
			if (pVal = cJSON_GetObjectItem(pPipe, "conv"))
				strncpy (pEntry->szConv, pVal->valuestring, sizeof(pEntry->szConv));
			if (pVal = cJSON_GetObjectItem(pPipe, "role"))
				pEntry->iRole = pVal->valueint;
		}
	}
	pEntry->iDirection = iDirection;
	return pEntry;
}

// -----------------------------------------------------------------------------

BOOL CallQueue_Remove(TYP_LIST *hList, unsigned int uMsgNr)
{
	return Queue_Remove (hList, uMsgNr, FreeEntry);
}

// -----------------------------------------------------------------------------

CALLENTRY *CallQueue_Find(TYP_LIST *hList, unsigned int uMsgNr)
{
	return (CALLENTRY*)Queue_Find(hList, uMsgNr);
}

// -----------------------------------------------------------------------------
// Static
// -----------------------------------------------------------------------------

static void FreeEntry(void *pPEntry)
{
	CALLENTRY *pEntry = (CALLENTRY*)pPEntry;

	free (pEntry->pszUser);
}