-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathBackEnd.cpp
182 lines (141 loc) · 6.38 KB
/
BackEnd.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
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
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
#include "BackEnd.h"
BackEnd::BackEnd(QObject *parent) : QObject(parent) {
//sending 'true' to the constructor will drop all tables
//and recreate them, all data will be lost
databaseHelper = DatabaseHelper(true);
//get accessCode, accessCodeStatus and checkbox value from the database
QHash<QString, QString> hashmap = databaseHelper.getSettings();
accessCode = hashmap["access_code"];
accessCodeStatusFlag = hashmap["code_status"].toInt();
checkboxValue = hashmap["checkbox_value"].toInt();
jsonWebToken = hashmap["json_webtoken"];
qInfo() << "[access_code]: " + accessCode + "\n";
qInfo() << "[code_status]: " + QString::number(accessCodeStatusFlag)+ "\n";
qInfo() << "[checkbox_value]: " + QString::number(checkboxValue) + "\n";
qInfo() << "[json_webtoken]: " + jsonWebToken + "\n";
//network check - connect to google.ca
QTcpSocket *socket = new QTcpSocket();
socket->connectToHost("www.google.ca", 80);
if(socket->waitForConnected(5000)) {
connectionStatusFlag = true;
}
else {
connectionStatusFlag = false;
}
}
//getter methods
QString BackEnd::serverAccessCode() {
return accessCode;
}
QString BackEnd::locationData() {
return "";
}
bool BackEnd::serverAccessCodeStatus() {
return accessCodeStatusFlag;
}
bool BackEnd::locationDataSentStatus() {
return sendLocationDataFlag;
}
bool BackEnd::networkConnectionStatus() {
return connectionStatusFlag;
}
int BackEnd::checkboxStatus() {
return checkboxValue;
}
//setter methods
void BackEnd::setServerAccessCode(const QString &newCode) {
if(newCode != "") {
accessCode = newCode;
//perform a server test with the new string
//TODO::
accessCodeStatusFlag = true;
databaseHelper.updateAccessCode(accessCode);
databaseHelper.updateAccessCodeStatus(accessCodeStatusFlag);
databaseHelper.updateJsonWebToken("JSON WEBTOKEN NEW UPDATED VALUE");
emit serverAccessCodeChanged();
}
}
void BackEnd::setCheckboxStatus(const int &newValue) {
checkboxValue = newValue;
databaseHelper.updateCheckboxValue(checkboxValue);
}
void BackEnd::setLocationData(const QString &locationInformation) {
if(locationInformation.length() > 1) {
//parse the string to get the latitude, longitude and timestamp
coordinates = locationInformation.left(locationInformation.indexOf("|"));
timestamp = locationInformation.mid(locationInformation.indexOf("|") + 1);
latitude = coordinates.left(coordinates.indexOf(" "));
longitude = coordinates.mid(coordinates.indexOf(" ") + 1);
//convert the datetime format from UTC to MYSQL format
QDateTime datetime = QDateTime::fromString(timestamp);
timestamp = datetime.toString("yyyy-MM-dd hh:mm:ss");
jsonInner = QJsonObject();
jsonInner["access_code"] = accessCode;
jsonInner["latitude"] = latitude;
jsonInner["longitude"] = longitude;
jsonInner["timestamp"] = timestamp;
json = QJsonObject();
json["device"] = jsonInner;
//convert JSON to store in database or send over network
jsonDocument = QJsonDocument(json);
jsonString = jsonDocument.toJson(QJsonDocument::Compact);
qInfo() << "JSON STRING COMPRESSED: " << jsonString;
//network check
QTcpSocket *socket = new QTcpSocket();
socket->connectToHost("www.google.ca", 80);
if(socket->waitForConnected(5000)) {
connectionStatusFlag = true;
emit networkConnectionStatusChanged();
}
else {
connectionStatusFlag = false;
emit networkConnectionStatusChanged();
}
if(accessCodeStatusFlag && connectionStatusFlag) {
//access code is valid and there is an internet connection
//send current location and any stored locations, delete the stored locations after
QUrl serviceUrl = QUrl("http://192.168.1.136:3002/location");
//send current location
jsonData = jsonDocument.toJson(QJsonDocument::Compact);
//set headers
request = QNetworkRequest(serviceUrl);
request.setRawHeader("Authorization", "Bearer: TOKEN_HERE");
request.setHeader(QNetworkRequest::ContentTypeHeader,"application/json");
request.setHeader(QNetworkRequest::ContentLengthHeader,QByteArray::number(jsonData.size()));
networkManager = new QNetworkAccessManager(this);
QObject::connect(networkManager, SIGNAL(finished(QNetworkReply *)), this, SLOT(onLocationReply(QNetworkReply *)));
// Send as POST (regardless if we know connection is established)
networkManager->post(request, jsonData);
//send stored locations
QVector<QString> locations = databaseHelper.getSavedLocations();
for(int i = 0; i < locations.size(); i++) {
qInfo() << "Location: " + QString::number(i) + " = " + locations.at(i);
jsonData = locations.at(i).toUtf8();
//set headers
request = QNetworkRequest(serviceUrl);
request.setRawHeader("Authorization", "Bearer: TOKEN_HERE");
request.setHeader(QNetworkRequest::ContentTypeHeader,"application/json");
request.setHeader(QNetworkRequest::ContentLengthHeader,QByteArray::number(jsonData.size()));
networkManager = new QNetworkAccessManager(this);
QObject::connect(networkManager, SIGNAL(finished(QNetworkReply *)), this, SLOT(onLocationReply(QNetworkReply *)));
// Send as POST (regardless if we know connection is established)
networkManager->post(request, jsonData);
}
sendLocationDataFlag = true;
//all data sent successfully, delete the stored locations
databaseHelper.clearSavedLocations();
emit locationDataSent();
}
else if(accessCodeStatusFlag) {
//access code is valid but there is no internet connection
//store the location json file in the database
databaseHelper.saveLocation(jsonString);
sendLocationDataFlag = false;
emit locationDataSent();
}
else {
//no access code set, dont store any location data
qInfo() << "No location data stored or sent";
}
}
}