forked from voipmonitor/sniffer
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathfilter_call.cpp
More file actions
120 lines (117 loc) · 4.73 KB
/
filter_call.cpp
File metadata and controls
120 lines (117 loc) · 4.73 KB
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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
#include "filter_call.h"
#include "calltable.h"
cCallFilter::cCallFilter(const char *filter) {
setUseRecordArray(false);
setFilter(filter);
}
void cCallFilter::setFilter(const char *filter) {
JsonItem jsonData;
jsonData.parse(filter);
map<string, string> filterData;
for(unsigned int i = 0; i < jsonData.getLocalCount(); i++) {
JsonItem *item = jsonData.getLocalItem(i);
string filterTypeName = item->getLocalName();
string filterValue = item->getLocalValue();
if(filterValue.empty()) {
continue;
}
filterData[filterTypeName] = filterValue;
}
if(!filterData["calldate"].empty()) {
cRecordFilterItem_calldate *filter = new cRecordFilterItem_calldate(this, cf_calldate, atol(filterData["calldate"].c_str()), cRecordFilterItem_base::_ge);
addFilter(filter);
}
if(!filterData["sipcallerip"].empty() &&
filterData["sipcallerdip_type"] == "0") {
cRecordFilterItem_IP *filter1 = new cRecordFilterItem_IP(this, cf_callerip);
filter1->addWhite(filterData["sipcallerip"].c_str());
cRecordFilterItem_IP *filter2 = new cRecordFilterItem_IP(this, cf_calledip);
filter2->addWhite(filterData["sipcallerip"].c_str());
cRecordFilterItem_CallProxy *filter3 = new cRecordFilterItem_CallProxy(this);
filter3->addWhite(filterData["sipcallerip"].c_str());
addFilter(filter1, filter2, filter3);
} else {
cRecordFilterItems gItems(cRecordFilterItems::_and);
if(!filterData["sipcallerip"].empty()) {
cRecordFilterItem_IP *filter = new cRecordFilterItem_IP(this, cf_callerip);
filter->addWhite(filterData["sipcallerip"].c_str());
gItems.addFilter(filter);
}
if(!filterData["sipcalledip"].empty()) {
cRecordFilterItem_IP *filter = new cRecordFilterItem_IP(this, cf_calledip);
filter->addWhite(filterData["sipcalledip"].c_str());
gItems.addFilter(filter);
}
if(gItems.isSet()) {
addFilter(&gItems);
}
}
if(!filterData["caller"].empty() &&
filterData["callerd_type"] == "0") {
cRecordFilterItem_CheckString *filter1 = new cRecordFilterItem_CheckString(this, cf_caller);
filter1->addWhite(filterData["caller"].c_str());
cRecordFilterItem_CheckString *filter2 = new cRecordFilterItem_CheckString(this, cf_called);
filter2->addWhite(filterData["caller"].c_str());
addFilter(filter1, filter2);
} else {
cRecordFilterItems gItems(cRecordFilterItems::_and);
if(!filterData["caller"].empty()) {
cRecordFilterItem_CheckString *filter = new cRecordFilterItem_CheckString(this, cf_caller);
filter->addWhite(filterData["caller"].c_str());
gItems.addFilter(filter);
}
if(!filterData["called"].empty()) {
cRecordFilterItem_CheckString *filter = new cRecordFilterItem_CheckString(this, cf_called);
filter->addWhite(filterData["called"].c_str());
gItems.addFilter(filter);
}
if(gItems.isSet()) {
addFilter(&gItems);
}
}
if(!filterData["caller_domain"].empty() &&
filterData["callerd_domain_type"] == "0") {
cRecordFilterItem_CheckString *filter1 = new cRecordFilterItem_CheckString(this, cf_callerdomain);
filter1->addWhite(filterData["caller_domain"].c_str());
cRecordFilterItem_CheckString *filter2 = new cRecordFilterItem_CheckString(this, cf_calleddomain);
filter2->addWhite(filterData["caller_domain"].c_str());
addFilter(filter1, filter2);
} else {
cRecordFilterItems gItems(cRecordFilterItems::_and);
if(!filterData["caller_domain"].empty()) {
cRecordFilterItem_CheckString *filter = new cRecordFilterItem_CheckString(this, cf_callerdomain);
filter->addWhite(filterData["caller_domain"].c_str());
gItems.addFilter(filter);
}
if(!filterData["called_domain"].empty()) {
cRecordFilterItem_CheckString *filter = new cRecordFilterItem_CheckString(this, cf_calleddomain);
filter->addWhite(filterData["called_domain"].c_str());
gItems.addFilter(filter);
}
if(gItems.isSet()) {
addFilter(&gItems);
}
}
if(!filterData["callid"].empty()) {
cRecordFilterItem_CheckString *filter = new cRecordFilterItem_CheckString(this, cf_callid);
filter->addWhite(filterData["callid"].c_str());
addFilter(filter);
}
if(!filterData["sensor_id"].empty()) {
cRecordFilterItem_numList *filter = new cRecordFilterItem_numList(this, cf_id_sensor);
filter->addNum(atol(filterData["sensor_id"].c_str()));
addFilter(filter);
}
if(!filterData["connected"].empty() && atoi(filterData["connected"].c_str())) {
cRecordFilterItem_numInterval *filter = new cRecordFilterItem_numInterval(this, cf_connect_duration, 0, cRecordFilterItem_base::_gt);
addFilter(filter);
}
if(!filterData["international"].empty()) {
cRecordFilterItem_numList *filter = new cRecordFilterItem_numList(this, cf_called_international);
filter->addNum(atoi(filterData["international"].c_str()));
addFilter(filter);
}
if(!filterData["OR"].empty() && atoi(filterData["OR"].c_str())) {
setCond(cRecordFilter::_or);
}
}