zeus/jus/Service.cpp

126 lines
3.8 KiB
C++
Raw Normal View History

/** @file
* @author Edouard DUPIN
* @copyright 2016, Edouard DUPIN, all right reserved
* @license APACHE v2.0 (see license file)
*/
#include <jus/Service.h>
#include <jus/debug.h>
#include <etk/stdTools.h>
2016-05-23 21:18:37 +02:00
#include <enet/TcpClient.h>
#include <ejson/ejson.h>
#include <unistd.h>
jus::Service::Service() :
propertyIp(this, "ip", "127.0.0.1", "Ip to connect server", &jus::Service::onPropertyChangeIp),
2016-05-23 22:38:46 +02:00
propertyPort(this, "port", 1982, "Port to connect server", &jus::Service::onPropertyChangePort) {
m_interfaceClient.connect(this, &jus::Service::onClientData);
advertise("getExtention", &jus::Service::getExtention);
setLastFuncDesc("Get List of availlable extention of this service");
addLastFuncReturn("A list of extention register in the service");
}
jus::Service::~Service() {
}
std::vector<std::string> jus::Service::getExtention() {
return std::vector<std::string>();
}
void jus::Service::onClientData(std::string _value) {
ejson::Object request(_value);
2016-05-25 21:25:33 +02:00
ejson::Value tmpID = request["id"];
request.remove("id");
2016-05-23 21:18:37 +02:00
JUS_INFO("Request: " << _value);
ejson::Value answer = callJson(request);
// check if an answer is needed
if (answer.isNull() == false) {
2016-05-25 21:25:33 +02:00
answer.toObject().add("id", tmpID);
JUS_INFO("Answer: " << answer.generateHumanString());
m_interfaceClient.write(answer.generateMachineString());
}
}
void jus::Service::onPropertyChangeIp() {
2016-05-23 21:18:37 +02:00
disconnect();
}
void jus::Service::onPropertyChangePort(){
2016-05-23 21:18:37 +02:00
disconnect();
}
2016-05-25 21:25:33 +02:00
void jus::Service::connect(const std::string& _serviceName, uint32_t _numberRetry){
2016-05-23 21:18:37 +02:00
disconnect();
JUS_DEBUG("connect [START]");
2016-05-25 21:25:33 +02:00
enet::Tcp connection = std::move(enet::connectTcpClient(*propertyIp, *propertyPort, _numberRetry));
if (connection.getConnectionStatus() != enet::Tcp::status::link) {
JUS_DEBUG("connect [STOP] ==> can not connect");
return;
}
2016-05-23 21:18:37 +02:00
m_interfaceClient.setInterface(std::move(connection));
m_interfaceClient.connect();
m_interfaceClient.write(std::string("{\"connect-service\":\"") + _serviceName + "\"}");
JUS_DEBUG("connect [STOP]");
}
void jus::Service::disconnect(){
JUS_DEBUG("disconnect [START]");
m_interfaceClient.disconnect();
JUS_DEBUG("disconnect [STOP]");
}
2016-05-25 21:25:33 +02:00
bool jus::Service::GateWayAlive() {
return m_interfaceClient.isActive();
}
void jus::Service::pingIsAlive() {
2016-05-25 21:25:33 +02:00
if (std::chrono::steady_clock::now() - m_interfaceClient.getLastTimeSend() >= std::chrono::seconds(30)) {
m_interfaceClient.write("{\"event\":\"IS-ALIVE\"}");
}
}
ejson::Value jus::Service::callJson(const ejson::Object& _obj) {
2016-05-25 21:25:33 +02:00
if (_obj.valueExist("event") == true) {
std::string event = _obj["event"].toString().get();
if (event == "IS-ALIVE") {
// Gateway just aswer a keep alive information ...
// Nothing to do ...
} else if (event == "new") {
uint64_t clientId = _obj["client-id"].toNumber().getU64();
2016-05-25 21:25:33 +02:00
std::string userName = _obj["user"].toString().get();
std::string clientName = _obj["client"].toString().get();
std::vector<std::string> clientGroup = convertJsonTo<std::vector<std::string>>(_obj["groups"]);
clientConnect(clientId, userName, clientName, clientGroup);
2016-05-25 21:25:33 +02:00
} else if (event == "delete") {
uint64_t clientId = _obj["client-id"].toNumber().getU64();
2016-05-25 21:25:33 +02:00
clientDisconnect(clientId);
} else {
JUS_ERROR("Unknow event: '" << event << "'");
}
return ejson::Null();
}
ejson::Object tmpp;
uint64_t clientId = _obj["client-id"].toNumber().getU64();
2016-05-25 21:25:33 +02:00
if (_obj.valueExist("call") == true) {
std::string call = _obj["call"].toString().get();
if (isFunctionAuthorized(clientId, call) == true) {
tmpp = callJson2(clientId, _obj);
tmpp.add("client-id", ejson::Number(clientId));
return tmpp;
} else {
tmpp.add("error", ejson::String("NOT-AUTHORIZED-FUNCTION"));
}
} else {
tmpp.add("error", ejson::String("NOT-IMPLEMENTED-FUNCTION"));
2016-05-23 21:18:37 +02:00
}
tmpp.add("client-id", ejson::Number(clientId));
return tmpp;
}