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);
}
|