[DEV] extract Future in separate file and start test it in real case
This commit is contained in:
parent
e37b00c2d3
commit
fc70573a25
@ -25,7 +25,7 @@ void jus::Client::onClientData(std::string _value) {
|
|||||||
ejson::Object obj(_value);
|
ejson::Object obj(_value);
|
||||||
jus::FutureBase future;
|
jus::FutureBase future;
|
||||||
{
|
{
|
||||||
uint64_t tid = etk::string_to_uint64_t(obj["id"].toString().get());
|
uint64_t tid = obj["id"].toNumber().get();
|
||||||
if (tid == 0) {
|
if (tid == 0) {
|
||||||
JUS_ERROR("call with no ID ==> error ...");
|
JUS_ERROR("call with no ID ==> error ...");
|
||||||
return;
|
return;
|
||||||
@ -43,7 +43,7 @@ void jus::Client::onClientData(std::string _value) {
|
|||||||
}
|
}
|
||||||
future = *it;
|
future = *it;
|
||||||
it = m_pendingCall.erase(it);
|
it = m_pendingCall.erase(it);
|
||||||
return;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (future.isValid() == false) {
|
if (future.isValid() == false) {
|
||||||
@ -51,8 +51,7 @@ void jus::Client::onClientData(std::string _value) {
|
|||||||
m_newData.push_back(std::move(_value));
|
m_newData.push_back(std::move(_value));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// TODO : Call future ...
|
future.setAnswer(obj);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
jus::ServiceRemote jus::Client::getService(const std::string& _name) {
|
jus::ServiceRemote jus::Client::getService(const std::string& _name) {
|
||||||
@ -61,18 +60,23 @@ jus::ServiceRemote jus::Client::getService(const std::string& _name) {
|
|||||||
|
|
||||||
bool jus::Client::link(const std::string& _serviceName) {
|
bool jus::Client::link(const std::string& _serviceName) {
|
||||||
// TODO : Check the number of connection of this service ...
|
// TODO : Check the number of connection of this service ...
|
||||||
bool ret = call_b("link", _serviceName);
|
jus::Future<bool> ret = call("link", _serviceName);
|
||||||
if (ret == false) {
|
ret.wait();
|
||||||
JUS_ERROR("Can not link with the service named: '" << _serviceName << "'");
|
if (ret.hasError() == true) {
|
||||||
|
JUS_WARNING("Can not link with the service named: '" << _serviceName << "' ==> link error");
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
return ret;
|
return ret.get();
|
||||||
}
|
}
|
||||||
|
|
||||||
void jus::Client::unlink(const std::string& _serviceName) {
|
bool jus::Client::unlink(const std::string& _serviceName) {
|
||||||
bool ret = call_b("unlink", _serviceName);
|
jus::Future<bool> ret = call("unlink", _serviceName);
|
||||||
if (ret == false) {
|
ret.wait();
|
||||||
JUS_ERROR("Can not unlink with the service named: '" << _serviceName << "'");
|
if (ret.hasError() == true) {
|
||||||
|
JUS_WARNING("Can not unlink with the service named: '" << _serviceName << "' ==> link error");
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
return ret.get();
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string jus::Client::asyncRead() {
|
std::string jus::Client::asyncRead() {
|
||||||
@ -107,17 +111,19 @@ void jus::Client::onPropertyChangePort(){
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void jus::Client::connect(const std::string& _remoteUserToConnect){
|
bool jus::Client::connect(const std::string& _remoteUserToConnect){
|
||||||
disconnect();
|
disconnect();
|
||||||
JUS_DEBUG("connect [START]");
|
JUS_DEBUG("connect [START]");
|
||||||
enet::Tcp connection = std::move(enet::connectTcpClient(*propertyIp, *propertyPort));
|
enet::Tcp connection = std::move(enet::connectTcpClient(*propertyIp, *propertyPort));
|
||||||
m_interfaceClient.setInterface(std::move(connection));
|
m_interfaceClient.setInterface(std::move(connection));
|
||||||
m_interfaceClient.connect();
|
m_interfaceClient.connect();
|
||||||
bool ret = call_b("connectToUser", _remoteUserToConnect, "jus-client");
|
jus::Future<bool> ret = call("connectToUser", _remoteUserToConnect, "jus-client");
|
||||||
if (ret == false) {
|
ret.wait();
|
||||||
JUS_ERROR("Connection error");
|
if (ret.hasError() == true) {
|
||||||
|
JUS_WARNING("Can not connect to user named: '" << _remoteUserToConnect << "' ==> return error");
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
JUS_DEBUG("connect [STOP]");
|
return ret.get();
|
||||||
}
|
}
|
||||||
|
|
||||||
void jus::Client::disconnect() {
|
void jus::Client::disconnect() {
|
||||||
@ -130,20 +136,7 @@ uint64_t jus::Client::getId() {
|
|||||||
return m_id++;
|
return m_id++;
|
||||||
}
|
}
|
||||||
|
|
||||||
ejson::Object jus::Client::callJson(const ejson::Object& _obj) {
|
jus::FutureBase jus::Client::callJson(uint64_t _transactionId, const ejson::Object& _obj) {
|
||||||
JUS_VERBOSE("Call JSON [START] ");
|
|
||||||
if (m_interfaceClient.isActive() == false) {
|
|
||||||
return ejson::Object();
|
|
||||||
}
|
|
||||||
JUS_DEBUG("Call JSON '" << _obj.generateHumanString() << "'");
|
|
||||||
m_interfaceClient.write(_obj.generateMachineString());
|
|
||||||
std::string ret = asyncRead();
|
|
||||||
JUS_VERBOSE("Call JSON [STOP]");
|
|
||||||
return ejson::Object(ret);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
jus::FutureBase jus::Client::sendJson(uint64_t _transactionId, const ejson::Object& _obj) {
|
|
||||||
JUS_VERBOSE("Send JSON [START] ");
|
JUS_VERBOSE("Send JSON [START] ");
|
||||||
if (m_interfaceClient.isActive() == false) {
|
if (m_interfaceClient.isActive() == false) {
|
||||||
ejson::Object obj;
|
ejson::Object obj;
|
||||||
@ -161,22 +154,4 @@ jus::FutureBase jus::Client::sendJson(uint64_t _transactionId, const ejson::Obje
|
|||||||
JUS_VERBOSE("Send JSON [STOP]");
|
JUS_VERBOSE("Send JSON [STOP]");
|
||||||
return tmpFuture;
|
return tmpFuture;
|
||||||
}
|
}
|
||||||
namespace jus {
|
|
||||||
template<>
|
|
||||||
bool jus::Future<bool>::get() {
|
|
||||||
if (m_data == nullptr) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
ejson::Value val = m_data->m_returnData["return"];
|
|
||||||
if (val.exist() == false) {
|
|
||||||
JUS_WARNING("No Return value ...");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (val.isBoolean() == false) {
|
|
||||||
JUS_WARNING("Wrong return Type get '" << val.getType() << " instead of 'Boolean'");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return val.toBoolean().get();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
341
jus/Client.h
341
jus/Client.h
@ -12,118 +12,9 @@
|
|||||||
#include <jus/ServiceRemote.h>
|
#include <jus/ServiceRemote.h>
|
||||||
#include <chrono>
|
#include <chrono>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
#include <jus/Future.h>
|
||||||
|
|
||||||
namespace jus {
|
namespace jus {
|
||||||
class FutureData {
|
|
||||||
public:
|
|
||||||
uint64_t m_transactionId;
|
|
||||||
bool m_isFinished;
|
|
||||||
ejson::Object m_returnData;
|
|
||||||
};
|
|
||||||
class FutureBase {
|
|
||||||
public: // TODO: Do it better ..
|
|
||||||
ememory::SharedPtr<jus::FutureData> m_data;
|
|
||||||
public:
|
|
||||||
FutureBase() {
|
|
||||||
m_data = nullptr;
|
|
||||||
}
|
|
||||||
FutureBase(uint64_t _transactionId) {
|
|
||||||
m_data = std::make_shared<jus::FutureData>();
|
|
||||||
if (m_data == nullptr) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
m_data->m_transactionId = _transactionId;
|
|
||||||
m_data->m_isFinished = false;
|
|
||||||
}
|
|
||||||
FutureBase(uint64_t _transactionId, bool _isFinished, ejson::Object _returnData) {
|
|
||||||
m_data = std::make_shared<jus::FutureData>();
|
|
||||||
if (m_data == nullptr) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
m_data->m_transactionId = _transactionId;
|
|
||||||
m_data->m_isFinished = _isFinished;
|
|
||||||
m_data->m_returnData = _returnData;
|
|
||||||
}
|
|
||||||
jus::FutureBase operator= (const jus::FutureBase& _base) {
|
|
||||||
m_data = _base.m_data;
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
void setAnswer(const ejson::Object& _returnValue) {
|
|
||||||
if (m_data == nullptr) {
|
|
||||||
JUS_ERROR(" Not a valid future ...");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
m_data->m_returnData = _returnValue;
|
|
||||||
m_data->m_isFinished = true;
|
|
||||||
}
|
|
||||||
uint64_t getTransactionId() {
|
|
||||||
if (m_data == nullptr) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return m_data->m_transactionId;
|
|
||||||
}
|
|
||||||
bool hasError() {
|
|
||||||
if (m_data == nullptr) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return m_data->m_returnData.valueExist("error");
|
|
||||||
}
|
|
||||||
std::string getErrorType() {
|
|
||||||
if (m_data == nullptr) {
|
|
||||||
return "NULL_PTR";
|
|
||||||
}
|
|
||||||
return m_data->m_returnData["error"].toString().get();
|
|
||||||
}
|
|
||||||
std::string getErrorHelp() {
|
|
||||||
if (m_data == nullptr) {
|
|
||||||
return "Thsi is a nullptr future";
|
|
||||||
}
|
|
||||||
return m_data->m_returnData["error-help"].toString().get();
|
|
||||||
}
|
|
||||||
bool isValid() {
|
|
||||||
return m_data != nullptr;
|
|
||||||
}
|
|
||||||
bool isFinished() {
|
|
||||||
if (m_data == nullptr) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return m_data->m_isFinished;
|
|
||||||
}
|
|
||||||
void wait() {
|
|
||||||
while (isFinished() == false) {
|
|
||||||
// TODO : Do it better ... like messaging/mutex_locked ...
|
|
||||||
usleep(10000);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
bool waitFor(std::chrono::microseconds _delta) {
|
|
||||||
std::chrono::steady_clock::time_point start = std::chrono::steady_clock::now();
|
|
||||||
while ( std::chrono::steady_clock::now() - start < _delta
|
|
||||||
&& isFinished() == false) {
|
|
||||||
// TODO : Do it better ... like messaging/mutex_locked ...
|
|
||||||
usleep(10000);
|
|
||||||
}
|
|
||||||
return isFinished();
|
|
||||||
}
|
|
||||||
bool waitUntile(std::chrono::steady_clock::time_point _endTime) {
|
|
||||||
while ( std::chrono::steady_clock::now() < _endTime
|
|
||||||
&& isFinished() == false) {
|
|
||||||
// TODO : Do it better ... like messaging/mutex_locked ...
|
|
||||||
usleep(10000);
|
|
||||||
}
|
|
||||||
return isFinished();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template<class JUS_RETURN>
|
|
||||||
class Future : public jus::FutureBase {
|
|
||||||
public:
|
|
||||||
jus::Future<JUS_RETURN>& operator= (const jus::FutureBase& _base) {
|
|
||||||
m_data = _base.m_data;
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
JUS_RETURN get();
|
|
||||||
};
|
|
||||||
|
|
||||||
class Client : public eproperty::Interface {
|
class Client : public eproperty::Interface {
|
||||||
friend class ServiceRemote;
|
friend class ServiceRemote;
|
||||||
public:
|
public:
|
||||||
@ -138,12 +29,12 @@ namespace jus {
|
|||||||
public:
|
public:
|
||||||
Client();
|
Client();
|
||||||
virtual ~Client();
|
virtual ~Client();
|
||||||
void connect(const std::string& _remoteUserToConnect);
|
bool connect(const std::string& _remoteUserToConnect);
|
||||||
void disconnect();
|
void disconnect();
|
||||||
public:
|
public:
|
||||||
jus::ServiceRemote getService(const std::string& _serviceName);
|
jus::ServiceRemote getService(const std::string& _serviceName);
|
||||||
bool link(const std::string& _serviceName);
|
bool link(const std::string& _serviceName);
|
||||||
void unlink(const std::string& _serviceName);
|
bool unlink(const std::string& _serviceName);
|
||||||
|
|
||||||
// Connect that is not us
|
// Connect that is not us
|
||||||
//bool identify("clientTest1#atria-soft.com", "QSDQSDGQSF54HSXWVCSQDJ654URTDJ654NBXCDFDGAEZ51968");
|
//bool identify("clientTest1#atria-soft.com", "QSDQSDGQSF54HSXWVCSQDJ654URTDJ654NBXCDFDGAEZ51968");
|
||||||
@ -152,236 +43,18 @@ namespace jus {
|
|||||||
private:
|
private:
|
||||||
void onClientData(std::string _value);
|
void onClientData(std::string _value);
|
||||||
std::string asyncRead();
|
std::string asyncRead();
|
||||||
ejson::Object callJson(const ejson::Object& _obj);
|
jus::FutureBase callJson(uint64_t _transactionId, const ejson::Object& _obj);
|
||||||
jus::FutureBase sendJson(uint64_t _transactionId, const ejson::Object& _obj);
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
uint64_t getId();
|
uint64_t getId();
|
||||||
template<class JUS_RETURN, class... _ARGS>
|
template<class... _ARGS>
|
||||||
jus::Future<JUS_RETURN> callAsync(const std::string& _functionName, _ARGS&&... _args) {
|
jus::FutureBase call(const std::string& _functionName, _ARGS&&... _args) {
|
||||||
uint64_t id = getId();
|
uint64_t id = getId();
|
||||||
ejson::Object callElem = jus::createCall(id, _functionName, std::forward<_ARGS>(_args)...);
|
ejson::Object callElem = jus::createCall(id, _functionName, std::forward<_ARGS>(_args)...);
|
||||||
jus::Future<JUS_RETURN> out = sendJson(id, callElem);
|
return callJson(id, callElem);
|
||||||
return out;
|
|
||||||
}
|
|
||||||
|
|
||||||
template<class... _ARGS>
|
|
||||||
void call(const std::string& _functionName, _ARGS&&... _args) {
|
|
||||||
ejson::Object callElem = jus::createCall(getId(), _functionName, std::forward<_ARGS>(_args)...);
|
|
||||||
ejson::Object obj = callJson(callElem);
|
|
||||||
if (obj.valueExist("error") == true) {
|
|
||||||
JUS_WARNING("call error: " << obj["error"]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
template<class... _ARGS>
|
|
||||||
int32_t call_i(const std::string& _functionName, _ARGS&&... _args) {
|
|
||||||
ejson::Object callElem = jus::createCall(getId(), _functionName, std::forward<_ARGS>(_args)...);
|
|
||||||
ejson::Object obj = callJson(callElem);
|
|
||||||
if (obj.valueExist("error") == true) {
|
|
||||||
JUS_WARNING("call error: " << obj["error"]);
|
|
||||||
}
|
|
||||||
ejson::Value val = obj["return"];
|
|
||||||
if (val.exist() == false) {
|
|
||||||
JUS_WARNING("No Return value ...");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
if (val.isNumber() == false) {
|
|
||||||
JUS_WARNING("Wrong return Type get '" << val.getType() << " instead of 'Number'");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return int32_t(val.toNumber().get());
|
|
||||||
}
|
|
||||||
template<class... _ARGS>
|
|
||||||
double call_d(const std::string& _functionName, _ARGS&&... _args) {
|
|
||||||
ejson::Object callElem = jus::createCall(getId(), _functionName, std::forward<_ARGS>(_args)...);
|
|
||||||
ejson::Object obj = callJson(callElem);
|
|
||||||
if (obj.valueExist("error") == true) {
|
|
||||||
JUS_WARNING("call error: " << obj["error"]);
|
|
||||||
}
|
|
||||||
ejson::Value val = obj["return"];
|
|
||||||
if (val.exist() == false) {
|
|
||||||
JUS_WARNING("No Return value ...");
|
|
||||||
return 0.0;
|
|
||||||
}
|
|
||||||
if (val.isNumber() == false) {
|
|
||||||
JUS_WARNING("Wrong return Type get '" << val.getType() << " instead of 'Number'");
|
|
||||||
return 0.0;
|
|
||||||
}
|
|
||||||
return val.toNumber().get();
|
|
||||||
}
|
|
||||||
template<class... _ARGS>
|
|
||||||
std::string call_s(const std::string& _functionName, _ARGS&&... _args) {
|
|
||||||
ejson::Object callElem = jus::createCall(getId(), _functionName, std::forward<_ARGS>(_args)...);
|
|
||||||
ejson::Object obj = callJson(callElem);
|
|
||||||
if (obj.valueExist("error") == true) {
|
|
||||||
JUS_WARNING("call error: " << obj["error"]);
|
|
||||||
}
|
|
||||||
ejson::Value val = obj["return"];
|
|
||||||
if (val.exist() == false) {
|
|
||||||
JUS_WARNING("No Return value ...");
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
if (val.isString() == false) {
|
|
||||||
JUS_WARNING("Wrong return Type get '" << val.getType() << " instead of 'String'");
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
return val.toString().get();
|
|
||||||
}
|
|
||||||
template<class... _ARGS>
|
|
||||||
bool call_b(const std::string& _functionName, _ARGS&&... _args) {
|
|
||||||
ejson::Object callElem = jus::createCall(getId(), _functionName, std::forward<_ARGS>(_args)...);
|
|
||||||
ejson::Object obj = callJson(callElem);
|
|
||||||
if (obj.valueExist("error") == true) {
|
|
||||||
JUS_WARNING("call error: " << obj["error"]);
|
|
||||||
}
|
|
||||||
ejson::Value val = obj["return"];
|
|
||||||
if (val.exist() == false) {
|
|
||||||
JUS_WARNING("No Return value ...");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (val.isBoolean() == false) {
|
|
||||||
JUS_WARNING("Wrong return Type get '" << val.getType() << " instead of 'Boolean'");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return val.toBoolean().get();
|
|
||||||
}
|
|
||||||
template<class... _ARGS>
|
|
||||||
std::vector<int32_t> call_vi(const std::string& _functionName, _ARGS&&... _args) {
|
|
||||||
ejson::Object callElem = jus::createCall(getId(), _functionName, std::forward<_ARGS>(_args)...);
|
|
||||||
ejson::Object obj = callJson(callElem);
|
|
||||||
if (obj.valueExist("error") == true) {
|
|
||||||
JUS_WARNING("call error: " << obj["error"]);
|
|
||||||
}
|
|
||||||
if (obj.valueExist("return") == false) {
|
|
||||||
JUS_WARNING("No Return value ...");
|
|
||||||
return std::vector<int32_t>();
|
|
||||||
}
|
|
||||||
ejson::Value val = obj["return"];
|
|
||||||
if (val.exist() == false) {
|
|
||||||
JUS_WARNING("No Return value ...");
|
|
||||||
return std::vector<int32_t>();
|
|
||||||
}
|
|
||||||
if (val.isArray() == false) {
|
|
||||||
JUS_WARNING("Wrong return Type get '" << val.getType() << " instead of 'Array'");
|
|
||||||
return std::vector<int32_t>();
|
|
||||||
}
|
|
||||||
std::vector<int32_t> out;
|
|
||||||
for (auto it : val.toArray()) {
|
|
||||||
if (val.isNumber() == false) {
|
|
||||||
JUS_WARNING("Wrong return Type (part of array) get '" << it.getType() << " instead of 'Number'");
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
out.push_back(int32_t(val.toNumber().get()));
|
|
||||||
}
|
|
||||||
return out;
|
|
||||||
}
|
|
||||||
template<class... _ARGS>
|
|
||||||
std::vector<double> call_vd(const std::string& _functionName, _ARGS&&... _args) {
|
|
||||||
ejson::Object callElem = jus::createCall(getId(), _functionName, std::forward<_ARGS>(_args)...);
|
|
||||||
ejson::Object obj = callJson(callElem);
|
|
||||||
if (obj.valueExist("error") == true) {
|
|
||||||
JUS_WARNING("call error: " << obj["error"]);
|
|
||||||
}
|
|
||||||
if (obj.valueExist("return") == false) {
|
|
||||||
JUS_WARNING("No Return value ...");
|
|
||||||
return std::vector<double>();
|
|
||||||
}
|
|
||||||
ejson::Value val = obj["return"];
|
|
||||||
if (val.exist() == false) {
|
|
||||||
JUS_WARNING("No Return value ...");
|
|
||||||
return std::vector<double>();
|
|
||||||
}
|
|
||||||
if (val.isArray() == false) {
|
|
||||||
JUS_WARNING("Wrong return Type get '" << val.getType() << " instead of 'Array'");
|
|
||||||
return std::vector<double>();
|
|
||||||
}
|
|
||||||
std::vector<double> out;
|
|
||||||
for (auto it : val.toArray()) {
|
|
||||||
if (it.isNumber() == false) {
|
|
||||||
JUS_WARNING("Wrong return Type (part of array) get '" << it.getType() << " instead of 'Number'");
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
out.push_back(it.toNumber().get());
|
|
||||||
}
|
|
||||||
return out;
|
|
||||||
}
|
|
||||||
template<class... _ARGS>
|
|
||||||
std::vector<std::string> call_vs(const std::string& _functionName, _ARGS&&... _args) {
|
|
||||||
ejson::Object callElem = jus::createCall(getId(), _functionName, std::forward<_ARGS>(_args)...);
|
|
||||||
ejson::Object obj = callJson(callElem);
|
|
||||||
if (obj.valueExist("error") == true) {
|
|
||||||
JUS_WARNING("call error: " << obj["error"]);
|
|
||||||
}
|
|
||||||
if (obj.valueExist("return") == false) {
|
|
||||||
JUS_WARNING("No Return value ...");
|
|
||||||
return std::vector<std::string>();
|
|
||||||
}
|
|
||||||
ejson::Value val = obj["return"];
|
|
||||||
if (val.exist() == false) {
|
|
||||||
JUS_WARNING("No Return value ...");
|
|
||||||
return std::vector<std::string>();
|
|
||||||
}
|
|
||||||
if (val.isArray() == false) {
|
|
||||||
JUS_WARNING("Wrong return Type get '" << val.getType() << " instead of 'Array'");
|
|
||||||
return std::vector<std::string>();
|
|
||||||
}
|
|
||||||
std::vector<std::string> out;
|
|
||||||
for (auto it : val.toArray()) {
|
|
||||||
if (it.isString() == false) {
|
|
||||||
JUS_WARNING("Wrong return Type (part of array) get '" << it.getType() << " instead of 'String'");
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
out.push_back(it.toString().get());
|
|
||||||
}
|
|
||||||
return out;
|
|
||||||
}
|
|
||||||
template<class... _ARGS>
|
|
||||||
std::vector<bool> call_vb(const std::string& _functionName, _ARGS&&... _args) {
|
|
||||||
ejson::Object callElem = jus::createCall(getId(), _functionName, std::forward<_ARGS>(_args)...);
|
|
||||||
ejson::Object obj = callJson(callElem);
|
|
||||||
if (obj.valueExist("error") == true) {
|
|
||||||
JUS_WARNING("call error: " << obj["error"]);
|
|
||||||
}
|
|
||||||
if (obj.valueExist("return") == false) {
|
|
||||||
JUS_WARNING("No Return value ...");
|
|
||||||
return std::vector<bool>();
|
|
||||||
}
|
|
||||||
ejson::Value val = obj["return"];
|
|
||||||
if (val.exist() == false) {
|
|
||||||
JUS_WARNING("No Return value ...");
|
|
||||||
return std::vector<bool>();
|
|
||||||
}
|
|
||||||
if (val.isArray() == false) {
|
|
||||||
JUS_WARNING("Wrong return Type get '" << val.getType() << " instead of 'Array'");
|
|
||||||
return std::vector<bool>();
|
|
||||||
}
|
|
||||||
std::vector<bool> out;
|
|
||||||
for (auto it : val.toArray()) {
|
|
||||||
if (it.isBoolean() == false) {
|
|
||||||
JUS_WARNING("Wrong return Type (part of array) get '" << it.getType() << " instead of 'Boolean'");
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
out.push_back(it.toBoolean().get());
|
|
||||||
}
|
|
||||||
return out;
|
|
||||||
}
|
}
|
||||||
private:
|
private:
|
||||||
void onPropertyChangeIp();
|
void onPropertyChangeIp();
|
||||||
void onPropertyChangePort();
|
void onPropertyChangePort();
|
||||||
};
|
};
|
||||||
/*
|
|
||||||
template<class RETURN_TYPE>
|
|
||||||
RETURN_TYPE Client::call(const std::string& _functionName) {
|
|
||||||
ejson::Object callElem = ejson::Object(std::string("{ 'call':'") + _functionName + "'}");
|
|
||||||
ejson::Object obj = callJson(callElem);
|
|
||||||
return 256;
|
|
||||||
}
|
|
||||||
template<class RETURN_TYPE>
|
|
||||||
RETURN_TYPE Client::call(const std::string& _functionName) {
|
|
||||||
ejson::Object callElem = ejson::Object(std::string("{ 'call':'") + _functionName + "'}");
|
|
||||||
ejson::Object obj = callJson(callElem);
|
|
||||||
return std::vector<std::string>();
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
173
jus/Future.cpp
Normal file
173
jus/Future.cpp
Normal file
@ -0,0 +1,173 @@
|
|||||||
|
/** @file
|
||||||
|
* @author Edouard DUPIN
|
||||||
|
* @copyright 2014, Edouard DUPIN, all right reserved
|
||||||
|
* @license APACHE v2.0 (see license file)
|
||||||
|
*/
|
||||||
|
#include <jus/Future.h>
|
||||||
|
#include <jus/debug.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
namespace jus {
|
||||||
|
template<>
|
||||||
|
bool jus::Future<bool>::get() {
|
||||||
|
if (m_data == nullptr) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
ejson::Value val = m_data->m_returnData["return"];
|
||||||
|
if (val.exist() == false) {
|
||||||
|
JUS_WARNING("No Return value ...");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (val.isBoolean() == false) {
|
||||||
|
JUS_WARNING("Wrong return Type get '" << val.getType() << " instead of 'Boolean'");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return val.toBoolean().get();
|
||||||
|
}
|
||||||
|
template<>
|
||||||
|
int32_t jus::Future<int32_t>::get() {
|
||||||
|
if (m_data == nullptr) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
ejson::Value val = m_data->m_returnData["return"];
|
||||||
|
if (val.exist() == false) {
|
||||||
|
JUS_WARNING("No Return value ...");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
if (val.isNumber() == false) {
|
||||||
|
JUS_WARNING("Wrong return Type get '" << val.getType() << " instead of 'Number'");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return int32_t(val.toNumber().get());
|
||||||
|
}
|
||||||
|
template<>
|
||||||
|
double jus::Future<double>::get() {
|
||||||
|
if (m_data == nullptr) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
ejson::Value val = m_data->m_returnData["return"];
|
||||||
|
if (val.exist() == false) {
|
||||||
|
JUS_WARNING("No Return value ...");
|
||||||
|
return 0.0;
|
||||||
|
}
|
||||||
|
if (val.isNumber() == false) {
|
||||||
|
JUS_WARNING("Wrong return Type get '" << val.getType() << " instead of 'Number'");
|
||||||
|
return 0.0;
|
||||||
|
}
|
||||||
|
return val.toNumber().get();
|
||||||
|
}
|
||||||
|
template<>
|
||||||
|
std::string jus::Future<std::string>::get() {
|
||||||
|
if (m_data == nullptr) {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
ejson::Value val = m_data->m_returnData["return"];
|
||||||
|
if (val.exist() == false) {
|
||||||
|
JUS_WARNING("No Return value ...");
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
if (val.isString() == false) {
|
||||||
|
JUS_WARNING("Wrong return Type get '" << val.getType() << " instead of 'String'");
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
return val.toString().get();
|
||||||
|
}
|
||||||
|
template<>
|
||||||
|
std::vector<int32_t> jus::Future<std::vector<int32_t>>::get() {
|
||||||
|
std::vector<int32_t> out;
|
||||||
|
if (m_data == nullptr) {
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
ejson::Value val = m_data->m_returnData["return"];
|
||||||
|
if (val.exist() == false) {
|
||||||
|
JUS_WARNING("No Return value ...");
|
||||||
|
return std::vector<int32_t>();
|
||||||
|
}
|
||||||
|
if (val.isArray() == false) {
|
||||||
|
JUS_WARNING("Wrong return Type get '" << val.getType() << " instead of 'Array'");
|
||||||
|
return std::vector<int32_t>();
|
||||||
|
}
|
||||||
|
for (auto it : val.toArray()) {
|
||||||
|
if (val.isNumber() == false) {
|
||||||
|
JUS_WARNING("Wrong return Type (part of array) get '" << it.getType() << " instead of 'Number'");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
out.push_back(int32_t(val.toNumber().get()));
|
||||||
|
}
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
template<>
|
||||||
|
std::vector<double> jus::Future<std::vector<double>>::get() {
|
||||||
|
std::vector<double> out;
|
||||||
|
if (m_data == nullptr) {
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
ejson::Value val = m_data->m_returnData["return"];
|
||||||
|
if (val.exist() == false) {
|
||||||
|
JUS_WARNING("No Return value ...");
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
if (val.isArray() == false) {
|
||||||
|
JUS_WARNING("Wrong return Type get '" << val.getType() << " instead of 'Array'");
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
for (auto it : val.toArray()) {
|
||||||
|
if (it.isNumber() == false) {
|
||||||
|
JUS_WARNING("Wrong return Type (part of array) get '" << it.getType() << " instead of 'Number'");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
out.push_back(it.toNumber().get());
|
||||||
|
}
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
template<>
|
||||||
|
std::vector<std::string> jus::Future<std::vector<std::string>>::get() {
|
||||||
|
std::vector<std::string> out;
|
||||||
|
if (m_data == nullptr) {
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
ejson::Value val = m_data->m_returnData["return"];
|
||||||
|
if (val.exist() == false) {
|
||||||
|
JUS_WARNING("No Return value ...");
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
if (val.isArray() == false) {
|
||||||
|
JUS_WARNING("Wrong return Type get '" << val.getType() << " instead of 'Array'");
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
for (auto it : val.toArray()) {
|
||||||
|
if (it.isString() == false) {
|
||||||
|
JUS_WARNING("Wrong return Type (part of array) get '" << it.getType() << " instead of 'String'");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
out.push_back(it.toString().get());
|
||||||
|
}
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
template<>
|
||||||
|
std::vector<bool> jus::Future<std::vector<bool>>::get() {
|
||||||
|
std::vector<bool> out;
|
||||||
|
if (m_data == nullptr) {
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
ejson::Value val = m_data->m_returnData["return"];
|
||||||
|
if (val.exist() == false) {
|
||||||
|
JUS_WARNING("No Return value ...");
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
if (val.isArray() == false) {
|
||||||
|
JUS_WARNING("Wrong return Type get '" << val.getType() << " instead of 'Array'");
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
for (auto it : val.toArray()) {
|
||||||
|
if (it.isBoolean() == false) {
|
||||||
|
JUS_WARNING("Wrong return Type (part of array) get '" << it.getType() << " instead of 'Boolean'");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
out.push_back(it.toBoolean().get());
|
||||||
|
}
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
36
jus/Future.h
Normal file
36
jus/Future.h
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
/** @file
|
||||||
|
* @author Edouard DUPIN
|
||||||
|
* @copyright 2014, Edouard DUPIN, all right reserved
|
||||||
|
* @license APACHE v2.0 (see license file)
|
||||||
|
*/
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <jus/FutureBase.h>
|
||||||
|
|
||||||
|
namespace jus {
|
||||||
|
template<class JUS_RETURN>
|
||||||
|
class Future : public jus::FutureBase {
|
||||||
|
public:
|
||||||
|
Future(const jus::FutureBase& _base):
|
||||||
|
jus::FutureBase(_base) {
|
||||||
|
|
||||||
|
}
|
||||||
|
jus::Future<JUS_RETURN>& operator= (const jus::FutureBase& _base) {
|
||||||
|
m_data = _base.m_data;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
JUS_RETURN get();
|
||||||
|
};
|
||||||
|
template<>
|
||||||
|
class Future<void> : public jus::FutureBase {
|
||||||
|
public:
|
||||||
|
Future(const jus::FutureBase& _base):
|
||||||
|
jus::FutureBase(_base) {
|
||||||
|
|
||||||
|
}
|
||||||
|
jus::Future<void>& operator= (const jus::FutureBase& _base) {
|
||||||
|
m_data = _base.m_data;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
116
jus/FutureBase.cpp
Normal file
116
jus/FutureBase.cpp
Normal file
@ -0,0 +1,116 @@
|
|||||||
|
/** @file
|
||||||
|
* @author Edouard DUPIN
|
||||||
|
* @copyright 2014, Edouard DUPIN, all right reserved
|
||||||
|
* @license APACHE v2.0 (see license file)
|
||||||
|
*/
|
||||||
|
#include <jus/FutureBase.h>
|
||||||
|
#include <jus/debug.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
jus::FutureBase::FutureBase(const jus::FutureBase& _base):
|
||||||
|
m_data(_base.m_data) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
jus::FutureBase::FutureBase() {
|
||||||
|
m_data = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
jus::FutureBase::FutureBase(uint64_t _transactionId) {
|
||||||
|
m_data = std::make_shared<jus::FutureData>();
|
||||||
|
if (m_data == nullptr) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
m_data->m_transactionId = _transactionId;
|
||||||
|
m_data->m_isFinished = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
jus::FutureBase::FutureBase(uint64_t _transactionId, bool _isFinished, ejson::Object _returnData) {
|
||||||
|
m_data = std::make_shared<jus::FutureData>();
|
||||||
|
if (m_data == nullptr) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
m_data->m_transactionId = _transactionId;
|
||||||
|
m_data->m_isFinished = _isFinished;
|
||||||
|
m_data->m_returnData = _returnData;
|
||||||
|
}
|
||||||
|
|
||||||
|
jus::FutureBase jus::FutureBase::operator= (const jus::FutureBase& _base) {
|
||||||
|
m_data = _base.m_data;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
void jus::FutureBase::setAnswer(const ejson::Object& _returnValue) {
|
||||||
|
if (m_data == nullptr) {
|
||||||
|
JUS_ERROR(" Not a valid future ...");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
m_data->m_returnData = _returnValue;
|
||||||
|
m_data->m_isFinished = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint64_t jus::FutureBase::getTransactionId() {
|
||||||
|
if (m_data == nullptr) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return m_data->m_transactionId;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool jus::FutureBase::hasError() {
|
||||||
|
if (m_data == nullptr) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return m_data->m_returnData.valueExist("error");
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string jus::FutureBase::getErrorType() {
|
||||||
|
if (m_data == nullptr) {
|
||||||
|
return "NULL_PTR";
|
||||||
|
}
|
||||||
|
return m_data->m_returnData["error"].toString().get();
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string jus::FutureBase::getErrorHelp() {
|
||||||
|
if (m_data == nullptr) {
|
||||||
|
return "Thsi is a nullptr future";
|
||||||
|
}
|
||||||
|
return m_data->m_returnData["error-help"].toString().get();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool jus::FutureBase::isValid() {
|
||||||
|
return m_data != nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool jus::FutureBase::isFinished() {
|
||||||
|
if (m_data == nullptr) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return m_data->m_isFinished;
|
||||||
|
}
|
||||||
|
|
||||||
|
void jus::FutureBase::wait() {
|
||||||
|
while (isFinished() == false) {
|
||||||
|
// TODO : Do it better ... like messaging/mutex_locked ...
|
||||||
|
usleep(10000);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool jus::FutureBase::waitFor(std::chrono::microseconds _delta) {
|
||||||
|
std::chrono::steady_clock::time_point start = std::chrono::steady_clock::now();
|
||||||
|
while ( std::chrono::steady_clock::now() - start < _delta
|
||||||
|
&& isFinished() == false) {
|
||||||
|
// TODO : Do it better ... like messaging/mutex_locked ...
|
||||||
|
usleep(10000);
|
||||||
|
}
|
||||||
|
return isFinished();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool jus::FutureBase::waitUntil(std::chrono::steady_clock::time_point _endTime) {
|
||||||
|
while ( std::chrono::steady_clock::now() < _endTime
|
||||||
|
&& isFinished() == false) {
|
||||||
|
// TODO : Do it better ... like messaging/mutex_locked ...
|
||||||
|
usleep(10000);
|
||||||
|
}
|
||||||
|
return isFinished();
|
||||||
|
}
|
||||||
|
|
32
jus/FutureBase.h
Normal file
32
jus/FutureBase.h
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
/** @file
|
||||||
|
* @author Edouard DUPIN
|
||||||
|
* @copyright 2014, Edouard DUPIN, all right reserved
|
||||||
|
* @license APACHE v2.0 (see license file)
|
||||||
|
*/
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <jus/FutureData.h>
|
||||||
|
|
||||||
|
namespace jus {
|
||||||
|
class FutureBase {
|
||||||
|
public:
|
||||||
|
ememory::SharedPtr<jus::FutureData> m_data;
|
||||||
|
public:
|
||||||
|
FutureBase(const jus::FutureBase& _base);
|
||||||
|
FutureBase();
|
||||||
|
FutureBase(uint64_t _transactionId);
|
||||||
|
FutureBase(uint64_t _transactionId, bool _isFinished, ejson::Object _returnData);
|
||||||
|
jus::FutureBase operator= (const jus::FutureBase& _base);
|
||||||
|
void setAnswer(const ejson::Object& _returnValue);
|
||||||
|
uint64_t getTransactionId();
|
||||||
|
bool hasError();
|
||||||
|
std::string getErrorType();
|
||||||
|
std::string getErrorHelp();
|
||||||
|
bool isValid();
|
||||||
|
bool isFinished();
|
||||||
|
void wait();
|
||||||
|
bool waitFor(std::chrono::microseconds _delta);
|
||||||
|
bool waitUntil(std::chrono::steady_clock::time_point _endTime);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
19
jus/FutureData.h
Normal file
19
jus/FutureData.h
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
/** @file
|
||||||
|
* @author Edouard DUPIN
|
||||||
|
* @copyright 2014, Edouard DUPIN, all right reserved
|
||||||
|
* @license APACHE v2.0 (see license file)
|
||||||
|
*/
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <etk/types.h>
|
||||||
|
#include <ejson/ejson.h>
|
||||||
|
|
||||||
|
namespace jus {
|
||||||
|
class FutureData {
|
||||||
|
public:
|
||||||
|
uint64_t m_transactionId;
|
||||||
|
bool m_isFinished;
|
||||||
|
ejson::Object m_returnData;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
@ -28,6 +28,7 @@ uint64_t jus::ServiceRemote::getId() {
|
|||||||
return m_clientInterface->getId();
|
return m_clientInterface->getId();
|
||||||
}
|
}
|
||||||
|
|
||||||
ejson::Object jus::ServiceRemote::callJson(const ejson::Object& _obj) {
|
jus::FutureBase jus::ServiceRemote::callJson(uint64_t _transactionId, const ejson::Object& _obj) {
|
||||||
return m_clientInterface->callJson(_obj);
|
return m_clientInterface->callJson(_transactionId, _obj);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -11,6 +11,7 @@
|
|||||||
#include <jus/debug.h>
|
#include <jus/debug.h>
|
||||||
#include <jus/AbstractFunction.h>
|
#include <jus/AbstractFunction.h>
|
||||||
#include <jus/ServiceRemote.h>
|
#include <jus/ServiceRemote.h>
|
||||||
|
#include <jus/Future.h>
|
||||||
|
|
||||||
namespace jus {
|
namespace jus {
|
||||||
class Client;
|
class Client;
|
||||||
@ -24,208 +25,14 @@ namespace jus {
|
|||||||
~ServiceRemote();
|
~ServiceRemote();
|
||||||
bool exist();
|
bool exist();
|
||||||
private:
|
private:
|
||||||
ejson::Object callJson(const ejson::Object& _obj);
|
jus::FutureBase callJson(uint64_t _transactionId, const ejson::Object& _obj);
|
||||||
uint64_t getId();
|
uint64_t getId();
|
||||||
public:
|
public:
|
||||||
template<class... _ARGS>
|
template<class... _ARGS>
|
||||||
void call(const std::string& _functionName, _ARGS&&... _args) {
|
jus::FutureBase call(const std::string& _functionName, _ARGS&&... _args) {
|
||||||
ejson::Object callElem = jus::createCallService(getId(), m_name, _functionName, std::forward<_ARGS>(_args)...);
|
uint64_t id = getId();
|
||||||
ejson::Object obj = callJson(callElem);
|
ejson::Object callElem = jus::createCall(id, _functionName, std::forward<_ARGS>(_args)...);
|
||||||
if (obj.valueExist("error") == true) {
|
return callJson(id, callElem);
|
||||||
JUS_WARNING("call error: " << obj["error"]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
template<class... _ARGS>
|
|
||||||
int32_t call_i(const std::string& _functionName, _ARGS&&... _args) {
|
|
||||||
ejson::Object callElem = jus::createCallService(getId(), m_name, _functionName, std::forward<_ARGS>(_args)...);
|
|
||||||
ejson::Object obj = callJson(callElem);
|
|
||||||
if (obj.valueExist("error") == true) {
|
|
||||||
JUS_WARNING("call error: " << obj["error"]);
|
|
||||||
}
|
|
||||||
ejson::Value val = obj["return"];
|
|
||||||
if (val.exist() == false) {
|
|
||||||
JUS_WARNING("No Return value ...");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
if (val.isNumber() == false) {
|
|
||||||
JUS_WARNING("Wrong return Type get '" << val.getType() << " instead of 'Number'");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return int32_t(val.toNumber().get());
|
|
||||||
}
|
|
||||||
template<class... _ARGS>
|
|
||||||
double call_d(const std::string& _functionName, _ARGS&&... _args) {
|
|
||||||
ejson::Object callElem = jus::createCallService(getId(), m_name, _functionName, std::forward<_ARGS>(_args)...);
|
|
||||||
ejson::Object obj = callJson(callElem);
|
|
||||||
if (obj.valueExist("error") == true) {
|
|
||||||
JUS_WARNING("call error: " << obj["error"]);
|
|
||||||
}
|
|
||||||
ejson::Value val = obj["return"];
|
|
||||||
if (val.exist() == false) {
|
|
||||||
JUS_WARNING("No Return value ...");
|
|
||||||
return 0.0;
|
|
||||||
}
|
|
||||||
if (val.isNumber() == false) {
|
|
||||||
JUS_WARNING("Wrong return Type get '" << val.getType() << " instead of 'Number'");
|
|
||||||
return 0.0;
|
|
||||||
}
|
|
||||||
return val.toNumber().get();
|
|
||||||
}
|
|
||||||
template<class... _ARGS>
|
|
||||||
std::string call_s(const std::string& _functionName, _ARGS&&... _args) {
|
|
||||||
ejson::Object callElem = jus::createCallService(getId(), m_name, _functionName, std::forward<_ARGS>(_args)...);
|
|
||||||
ejson::Object obj = callJson(callElem);
|
|
||||||
if (obj.valueExist("error") == true) {
|
|
||||||
JUS_WARNING("call error: " << obj["error"]);
|
|
||||||
}
|
|
||||||
ejson::Value val = obj["return"];
|
|
||||||
if (val.exist() == false) {
|
|
||||||
JUS_WARNING("No Return value ...");
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
if (val.isString() == false) {
|
|
||||||
JUS_WARNING("Wrong return Type get '" << val.getType() << " instead of 'String'");
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
return val.toString().get();
|
|
||||||
}
|
|
||||||
template<class... _ARGS>
|
|
||||||
bool call_b(const std::string& _functionName, _ARGS&&... _args) {
|
|
||||||
ejson::Object callElem = jus::createCallService(getId(), m_name, _functionName, std::forward<_ARGS>(_args)...);
|
|
||||||
ejson::Object obj = callJson(callElem);
|
|
||||||
if (obj.valueExist("error") == true) {
|
|
||||||
JUS_WARNING("call error: " << obj["error"]);
|
|
||||||
}
|
|
||||||
ejson::Value val = obj["return"];
|
|
||||||
if (val.exist() == false) {
|
|
||||||
JUS_WARNING("No Return value ...");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (val.isBoolean() == false) {
|
|
||||||
JUS_WARNING("Wrong return Type get '" << val.getType() << " instead of 'Boolean'");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return val.toBoolean().get();
|
|
||||||
}
|
|
||||||
template<class... _ARGS>
|
|
||||||
std::vector<int32_t> call_vi(const std::string& _functionName, _ARGS&&... _args) {
|
|
||||||
ejson::Object callElem = jus::createCallService(getId(), m_name, _functionName, std::forward<_ARGS>(_args)...);
|
|
||||||
ejson::Object obj = callJson(callElem);
|
|
||||||
if (obj.valueExist("error") == true) {
|
|
||||||
JUS_WARNING("call error: " << obj["error"]);
|
|
||||||
}
|
|
||||||
if (obj.valueExist("return") == false) {
|
|
||||||
JUS_WARNING("No Return value ...");
|
|
||||||
return std::vector<int32_t>();
|
|
||||||
}
|
|
||||||
ejson::Value val = obj["return"];
|
|
||||||
if (val.exist() == false) {
|
|
||||||
JUS_WARNING("No Return value ...");
|
|
||||||
return std::vector<int32_t>();
|
|
||||||
}
|
|
||||||
if (val.isArray() == false) {
|
|
||||||
JUS_WARNING("Wrong return Type get '" << val.getType() << " instead of 'Array'");
|
|
||||||
return std::vector<int32_t>();
|
|
||||||
}
|
|
||||||
std::vector<int32_t> out;
|
|
||||||
for (auto it : val.toArray()) {
|
|
||||||
if (val.isNumber() == false) {
|
|
||||||
JUS_WARNING("Wrong return Type (part of array) get '" << it.getType() << " instead of 'Number'");
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
out.push_back(int32_t(val.toNumber().get()));
|
|
||||||
}
|
|
||||||
return out;
|
|
||||||
}
|
|
||||||
template<class... _ARGS>
|
|
||||||
std::vector<double> call_vd(const std::string& _functionName, _ARGS&&... _args) {
|
|
||||||
ejson::Object callElem = jus::createCallService(getId(), m_name, _functionName, std::forward<_ARGS>(_args)...);
|
|
||||||
ejson::Object obj = callJson(callElem);
|
|
||||||
if (obj.valueExist("error") == true) {
|
|
||||||
JUS_WARNING("call error: " << obj["error"]);
|
|
||||||
}
|
|
||||||
if (obj.valueExist("return") == false) {
|
|
||||||
JUS_WARNING("No Return value ...");
|
|
||||||
return std::vector<double>();
|
|
||||||
}
|
|
||||||
ejson::Value val = obj["return"];
|
|
||||||
if (val.exist() == false) {
|
|
||||||
JUS_WARNING("No Return value ...");
|
|
||||||
return std::vector<double>();
|
|
||||||
}
|
|
||||||
if (val.isArray() == false) {
|
|
||||||
JUS_WARNING("Wrong return Type get '" << val.getType() << " instead of 'Array'");
|
|
||||||
return std::vector<double>();
|
|
||||||
}
|
|
||||||
std::vector<double> out;
|
|
||||||
for (auto it : val.toArray()) {
|
|
||||||
if (it.isNumber() == false) {
|
|
||||||
JUS_WARNING("Wrong return Type (part of array) get '" << it.getType() << " instead of 'Number'");
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
out.push_back(it.toNumber().get());
|
|
||||||
}
|
|
||||||
return out;
|
|
||||||
}
|
|
||||||
template<class... _ARGS>
|
|
||||||
std::vector<std::string> call_vs(const std::string& _functionName, _ARGS&&... _args) {
|
|
||||||
ejson::Object callElem = jus::createCallService(getId(), m_name, _functionName, std::forward<_ARGS>(_args)...);
|
|
||||||
ejson::Object obj = callJson(callElem);
|
|
||||||
if (obj.valueExist("error") == true) {
|
|
||||||
JUS_WARNING("call error: " << obj["error"]);
|
|
||||||
}
|
|
||||||
if (obj.valueExist("return") == false) {
|
|
||||||
JUS_WARNING("No Return value ...");
|
|
||||||
return std::vector<std::string>();
|
|
||||||
}
|
|
||||||
ejson::Value val = obj["return"];
|
|
||||||
if (val.exist() == false) {
|
|
||||||
JUS_WARNING("No Return value ...");
|
|
||||||
return std::vector<std::string>();
|
|
||||||
}
|
|
||||||
if (val.isArray() == false) {
|
|
||||||
JUS_WARNING("Wrong return Type get '" << val.getType() << " instead of 'Array'");
|
|
||||||
return std::vector<std::string>();
|
|
||||||
}
|
|
||||||
std::vector<std::string> out;
|
|
||||||
for (auto it : val.toArray()) {
|
|
||||||
if (it.isString() == false) {
|
|
||||||
JUS_WARNING("Wrong return Type (part of array) get '" << it.getType() << " instead of 'String'");
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
out.push_back(it.toString().get());
|
|
||||||
}
|
|
||||||
return out;
|
|
||||||
}
|
|
||||||
template<class... _ARGS>
|
|
||||||
std::vector<bool> call_vb(const std::string& _functionName, _ARGS&&... _args) {
|
|
||||||
ejson::Object callElem = jus::createCallService(getId(), m_name, _functionName, std::forward<_ARGS>(_args)...);
|
|
||||||
ejson::Object obj = callJson(callElem);
|
|
||||||
if (obj.valueExist("error") == true) {
|
|
||||||
JUS_WARNING("call error: " << obj["error"]);
|
|
||||||
}
|
|
||||||
if (obj.valueExist("return") == false) {
|
|
||||||
JUS_WARNING("No Return value ...");
|
|
||||||
return std::vector<bool>();
|
|
||||||
}
|
|
||||||
ejson::Value val = obj["return"];
|
|
||||||
if (val.exist() == false) {
|
|
||||||
JUS_WARNING("No Return value ...");
|
|
||||||
return std::vector<bool>();
|
|
||||||
}
|
|
||||||
if (val.isArray() == false) {
|
|
||||||
JUS_WARNING("Wrong return Type get '" << val.getType() << " instead of 'Array'");
|
|
||||||
return std::vector<bool>();
|
|
||||||
}
|
|
||||||
std::vector<bool> out;
|
|
||||||
for (auto it : val.toArray()) {
|
|
||||||
if (it.isBoolean() == false) {
|
|
||||||
JUS_WARNING("Wrong return Type (part of array) get '" << it.getType() << " instead of 'Boolean'");
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
out.push_back(it.toBoolean().get());
|
|
||||||
}
|
|
||||||
return out;
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -35,6 +35,8 @@ def create(target, module_name):
|
|||||||
'jus/AbstractFunction.cpp',
|
'jus/AbstractFunction.cpp',
|
||||||
'jus/AbstractFunctionTypeDirect.cpp',
|
'jus/AbstractFunctionTypeDirect.cpp',
|
||||||
'jus/AbstractFunctionTypeClass.cpp',
|
'jus/AbstractFunctionTypeClass.cpp',
|
||||||
|
'jus/FutureBase.cpp',
|
||||||
|
'jus/Future.cpp',
|
||||||
'jus/ParamType.cpp',
|
'jus/ParamType.cpp',
|
||||||
'jus/Client.cpp',
|
'jus/Client.cpp',
|
||||||
'jus/GateWay.cpp',
|
'jus/GateWay.cpp',
|
||||||
@ -49,6 +51,9 @@ def create(target, module_name):
|
|||||||
'jus/AbstractFunction.h',
|
'jus/AbstractFunction.h',
|
||||||
'jus/AbstractFunctionTypeDirect.h',
|
'jus/AbstractFunctionTypeDirect.h',
|
||||||
'jus/AbstractFunctionTypeClass.h',
|
'jus/AbstractFunctionTypeClass.h',
|
||||||
|
'jus/FutureData.h',
|
||||||
|
'jus/FutureBase.h',
|
||||||
|
'jus/Future.h',
|
||||||
'jus/ParamType.h',
|
'jus/ParamType.h',
|
||||||
'jus/debug.h',
|
'jus/debug.h',
|
||||||
'jus/Client.h',
|
'jus/Client.h',
|
||||||
|
@ -36,7 +36,7 @@ int main(int _argc, const char *_argv[]) {
|
|||||||
client1.connect("test1#atria-soft.com");
|
client1.connect("test1#atria-soft.com");
|
||||||
// Connect that is not us
|
// Connect that is not us
|
||||||
//client1.identify("clientTest1#atria-soft.com", "QSDQSDGQSF54HSXWVCSQDJ654URTDJ654NBXCDFDGAEZ51968");
|
//client1.identify("clientTest1#atria-soft.com", "QSDQSDGQSF54HSXWVCSQDJ654URTDJ654NBXCDFDGAEZ51968");
|
||||||
jus::Future<bool> retIdentify = client1.callAsync<bool>("identify", "clientTest1#atria-soft.com", "QSDQSDGQSF54HSXWVCSQDJ654URTDJ654NBXCDFDGAEZ51968");
|
jus::Future<bool> retIdentify = client1.call("identify", "clientTest1#atria-soft.com", "QSDQSDGQSF54HSXWVCSQDJ654URTDJ654NBXCDFDGAEZ51968");
|
||||||
retIdentify.wait();
|
retIdentify.wait();
|
||||||
//bool retIdentify = client1.call_b("identify", "clientTest1#atria-soft.com", "QSDQSDGQSF54HSXWVCSQDJ654URTDJ654NBXCDFDGAEZ51968");
|
//bool retIdentify = client1.call_b("identify", "clientTest1#atria-soft.com", "QSDQSDGQSF54HSXWVCSQDJ654URTDJ654NBXCDFDGAEZ51968");
|
||||||
|
|
||||||
@ -68,8 +68,9 @@ int main(int _argc, const char *_argv[]) {
|
|||||||
|
|
||||||
jus::ServiceRemote remoteServiceUser = client1.getService("system-user");
|
jus::ServiceRemote remoteServiceUser = client1.getService("system-user");
|
||||||
if (remoteServiceUser.exist() == true) {
|
if (remoteServiceUser.exist() == true) {
|
||||||
std::vector<std::string> retCall = remoteServiceUser.call_vs("getClientGroups");
|
jus::Future<std::vector<std::string>> retCall = client1.call("getClientGroups", "clientTest1#atria-soft.com");
|
||||||
APPL_INFO("system-user.getClientGroups() = " << retCall);
|
retCall.wait();
|
||||||
|
APPL_INFO("system-user.getClientGroups() = " << retCall.get());
|
||||||
}
|
}
|
||||||
int32_t iii=0;
|
int32_t iii=0;
|
||||||
while (iii < 3) {
|
while (iii < 3) {
|
||||||
|
@ -165,7 +165,7 @@ int main(int _argc, const char *_argv[]) {
|
|||||||
serviceInterface.setLastFuncDesc("Get list of group availlable for a client name");
|
serviceInterface.setLastFuncDesc("Get list of group availlable for a client name");
|
||||||
serviceInterface.addLastFuncParam("clientName", "Name of the client");
|
serviceInterface.addLastFuncParam("clientName", "Name of the client");
|
||||||
serviceInterface.advertise("checkTocken", &appl::SystemService::checkTocken);
|
serviceInterface.advertise("checkTocken", &appl::SystemService::checkTocken);
|
||||||
serviceInterface.advertise("checkTocken", &appl::SystemService::getServices);
|
serviceInterface.advertise("getServices", &appl::SystemService::getServices);
|
||||||
for (int32_t iii=0; iii<_argc ; ++iii) {
|
for (int32_t iii=0; iii<_argc ; ++iii) {
|
||||||
std::string data = _argv[iii];
|
std::string data = _argv[iii];
|
||||||
if (etk::start_with(data, "--ip=") == true) {
|
if (etk::start_with(data, "--ip=") == true) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user