-
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathZaparooLaunchApi.cpp
87 lines (78 loc) · 2.37 KB
/
ZaparooLaunchApi.cpp
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
#include <Arduino.h>
#include <ArduinoJson.h>
#include <ArduinoWebsockets.h>
#include <UUID.h>
#include <atomic>
#include "ZaparooLaunchApi.h"
#include "ZaparooRestResult.h"
using namespace websockets;
String defaultValue={};
ZaparooLaunchApi::ZaparooLaunchApi(){}
int ZaparooLaunchApi::launch(const String& content){
return launch(content, defaultValue);
}
int ZaparooLaunchApi::launchUid(const String& uid){
return launch(defaultValue, uid);
}
int ZaparooLaunchApi::launch(const String& content, const String& uid){
JsonDocument doc;
UUID uuid;
const char* id = uuid.toCharArray();
doc["jsonrpc"]= "2.0";
doc["method"]="launch";
doc["id"]= uuid.toCharArray();
doc["params"]["text"] = content;
doc["params"]["uid"] = uid;
doc.shrinkToFit();
ZaparooRestResult result = launchPayload(doc);
return parseNoResult(result);
}
int ZaparooLaunchApi::stop(){
JsonDocument doc;
UUID uuid;
doc["jsonrpc"]= "2.0";
doc["method"]="stop";
doc["id"]= uuid.toCharArray();
doc.shrinkToFit();
ZaparooRestResult result = launchPayload(doc);
return parseNoResult(result);
}
int ZaparooLaunchApi::parseNoResult(ZaparooRestResult& resultContainer){
if(resultContainer.getErrorCode() == 0 && (!resultContainer.hasResult() && resultContainer.getResult().containsKey("result"))){
return 3; //Failed to launch path
}
return resultContainer.getErrorCode();
}
ZaparooRestResult ZaparooLaunchApi::launchPayload(const JsonDocument& doc){
WebsocketsClient client;
std::atomic<bool> complete;
complete.store(false);
const char* id = doc["id"];
ZaparooRestResult restResult;
client.onMessage([&, &id, &complete, &restResult](WebsocketsMessage msg){
if(complete.load()) return;
JsonDocument result;
DeserializationError error = deserializeJson(result, msg.data());
if (error) {
restResult.setErrorCode(4); //Failed to parse json
complete.store(true);
return;
}
const char* resultId = result["id"];
if(strcmp(id, resultId) != 0) return;
restResult.setResult(result);
complete.store(true);
});
if(!client.connect(_url)){
restResult.setErrorCode(2);
return restResult;
}
String request;
serializeJson(doc, request);
client.send(request);
while(!complete.load()){
client.poll();
}
client.close();
return restResult;
}