-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathRequest.cpp
More file actions
163 lines (99 loc) · 4.03 KB
/
Request.cpp
File metadata and controls
163 lines (99 loc) · 4.03 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
121
122
123
124
125
126
127
128
129
#include "Request.h"
#include <new>
#include <utility>
using namespace std;
// TODO(damian): hate that this is manual. This is SUPER error prone.
pair<Request_type, bool> request_type_from_int(int id) {
switch (id) {
case 0: return pair(Request_type::report, true);
case 1: return pair(Request_type::quit, true);
case 2: return pair(Request_type::track, true);
case 3: return pair(Request_type::untrack, true);
case 4: return pair(Request_type::grouped_report, true);
case 5: return pair(Request_type::pc_time, true);
case 6: return pair(Request_type::report_apps_only, true);
case 7: return pair(Request_type::tracked_only, true);
case 8: return pair(Request_type::change_update_time, true);
default: return pair(Request_type::report, false);
}
}
pair<Request, bool> request_from_json(const char* json_as_c_str) {
json j = json::parse(json_as_c_str, nullptr, false);
if (j.is_discarded() || !j.contains("request_id") || !j["request_id"].is_number()) {
return pair(Request(), false);
}
auto result = request_type_from_int(j["request_id"]);
if (!result.second) return pair(Request(), false);
switch (result.first) {
case Request_type::report: return report(&j);
case Request_type::quit: return quit(&j);
case Request_type::track: return track(&j);
case Request_type::untrack: return untrack(&j);
case Request_type::grouped_report: return grouped_report(&j);
case Request_type::pc_time: return pc_time(&j);
case Request_type::report_apps_only: return report_apps_only(&j);
case Request_type::tracked_only: return report_tracked_only(&j);
case Request_type::change_update_time: return change_update_time(&j);
default: return pair(Request(), false);
}
}
pair<Request, bool> report(json* j) {
Request request = {};
request.variant = Report_request{};
return pair(request, true);
}
pair<Request, bool> quit(json* j) {
Request request = {};
request.variant = Quit_request{};
return pair(request, true);
}
pair<Request, bool> track(json* j) {
if (!j->contains("extra") || !(*j)["extra"].contains("path") || !(*j)["extra"]["path"].is_string()) {
return pair(Request(), false);
}
Track_request track = {};
track.path = (*j)["extra"]["path"];
Request request = {};
request.variant = track;
return pair(request, true);
}
pair<Request, bool> untrack(json* j) {
if (!j->contains("extra") || !(*j)["extra"].contains("path") || !(*j)["extra"]["path"].is_string()) {
return pair(Request(), false);
}
Untrack_request untrack = {};
untrack.path = (*j)["extra"]["path"];
Request request = {};
request.variant = untrack;
return pair(request, true);
}
pair<Request, bool> grouped_report(json* j) {
Request request = {};
request.variant = Grouped_report_request{};
return pair(request, true);
}
pair<Request, bool> pc_time(json* j) {
Request request = {};
request.variant = Pc_time_request{};
return pair(request, true);
}
pair<Request, bool> report_apps_only(json* j) {
Request request = {};
request.variant = Report_apps_only_request{};
return pair(request, true);
}
pair<Request, bool> report_tracked_only(json* j) {
Request request = {};
request.variant = Report_tracked_only{};
return pair(request, true);
}
pair<Request, bool> change_update_time(json* j) {
if (!j->contains("extra") || !(*j)["extra"].contains("update_time_sec") || !(*j)["extra"]["update_time_sec"].is_number_unsigned()) {
return pair(Request(), false);
}
Change_update_time_request change_time = {};
change_time.duration_in_sec = (*j)["extra"]["update_time_sec"];
Request request = {};
request.variant = change_time;
return pair(request, true);
}