[DEV] add wait for service (2sec) and api to get list of service availlable

This commit is contained in:
Edouard DUPIN 2017-03-26 23:16:21 +02:00
parent abb81cd61a
commit 6091275c64
6 changed files with 106 additions and 15 deletions

View File

@ -381,10 +381,10 @@ int main(int _argc, const char *_argv[]) {
APPL_INFO(" ----------------------------------");
APPL_INFO(" -- Get service count");
APPL_INFO(" ----------------------------------");
zeus::Future<int32_t> retNbService = client1.call(ZEUS_NO_ID_OBJECT, ZEUS_ID_GATEWAY, "getServiceCount");
zeus::Future<int32_t> retNbService = client1.getServiceCount();
zeus::Future<std::vector<std::string>> retServiceList = client1.getServiceList();
retNbService.wait();
APPL_INFO("Nb services = " << retNbService.get());
zeus::Future<std::vector<std::string>> retServiceList = client1.call(ZEUS_NO_ID_OBJECT, ZEUS_ID_GATEWAY, "getServiceList");
retServiceList.wait();
APPL_INFO("List services:");
for (auto &it: retServiceList.get()) {
@ -398,7 +398,9 @@ int main(int _argc, const char *_argv[]) {
}
*/
if (false) {
if ( client1.waitForService("user") == true
&& false) {
APPL_INFO(" ----------------------------------");
APPL_INFO(" -- Get service system-user");
APPL_INFO(" ----------------------------------");
@ -446,7 +448,8 @@ int main(int _argc, const char *_argv[]) {
APPL_INFO(" ----------------------------------");
APPL_INFO(" -- Get service picture");
APPL_INFO(" ----------------------------------");
if (false) {
if ( client1.waitForService("picture") == true
&& false) {
zeus::service::ProxyPicture remoteServicePicture = client1.getService("picture");
if (remoteServicePicture.exist() == true) {
// Send a full path:
@ -455,7 +458,8 @@ int main(int _argc, const char *_argv[]) {
APPL_ERROR("Can not get service Picture ...");
}
}
if (false) {
if ( client1.waitForService("picture") == true
&& false) {
zeus::service::ProxyPicture remoteServicePicture = client1.getService("picture");
if (remoteServicePicture.exist() == true) {
zeus::Future<std::vector<uint32_t>> retCall = remoteServicePicture.albumGetList().wait();
@ -505,7 +509,8 @@ int main(int _argc, const char *_argv[]) {
APPL_INFO(" ----------------------------------");
APPL_INFO(" -- Get service video (send DATA) ");
APPL_INFO(" ----------------------------------");
if (true) {
if ( client1.waitForService("video") == true
&& true) {
zeus::service::ProxyVideo remoteServiceVideo = client1.getService("video");
// remove all media (for test)
if (remoteServiceVideo.exist() == true) {

View File

@ -35,20 +35,22 @@ typedef zeus::Object* (*SERVICE_IO_instanciate_t)(uint32_t, ememory::SharedPtr<z
class PlugginAccess {
private:
std::string m_name;
std::string m_fullName;
void* m_handle;
SERVICE_IO_init_t m_SERVICE_IO_init;
SERVICE_IO_uninit_t m_SERVICE_IO_uninit;
SERVICE_IO_peridic_call_t m_SERVICE_IO_peridic_call;
SERVICE_IO_instanciate_t m_SERVICE_IO_instanciate;
public:
PlugginAccess(const std::string& _name) :
PlugginAccess(const std::string& _name, const std::string& _fullName) :
m_name(_name),
m_fullName(_fullName),
m_handle(nullptr),
m_SERVICE_IO_init(nullptr),
m_SERVICE_IO_uninit(nullptr),
m_SERVICE_IO_instanciate(nullptr) {
std::string srv = etk::FSNodeGetApplicationPath() + "/../lib/libzeus-service-" + m_name + "-impl.so";
APPL_PRINT("Try to open service with name: '" << m_name << "' at position: '" << srv << "'");
std::string srv = etk::FSNodeGetApplicationPath() + "/../lib/lib" + m_fullName + "-impl.so";
APPL_PRINT("Try to open service with name: '" << m_name << "' at position: '" << srv << "' with full name=" << m_fullName);
m_handle = dlopen(srv.c_str(), RTLD_LAZY);
if (!m_handle) {
APPL_ERROR("Can not load Lbrary:" << dlerror());
@ -199,6 +201,35 @@ int main(int _argc, const char *_argv[]) {
return -1;
}
}
#ifdef GATEWAY_ENABLE_LAUNCHER
std::vector<std::pair<std::string,std::string>> listAvaillableServices;
if (services.size() != 0) {
// find all services:
etk::FSNode dataPath(etk::FSNodeGetApplicationPath() + "/../share");
std::vector<std::string> listSubPath = dataPath.folderGetSub(true, false, ".*");
APPL_DEBUG(" Base data path: " << dataPath.getName());
APPL_DEBUG(" SubPath: " << listSubPath);
for (auto &it: listSubPath) {
if (etk::FSNodeExist(it + "/zeus/") == true) {
etk::FSNode dataPath(it + "/zeus/");
std::vector<std::string> listServices = dataPath.folderGetSub(false, true, ".*\\.srv");
for (auto &it2: listServices) {
std::string nameFileSrv = etk::FSNode(it2).getNameFile();
std::vector<std::string> spl = etk::split(std::string(nameFileSrv.begin(), nameFileSrv.end()-4), "-service-");
if (spl.size() != 2) {
APPL_ERROR("reject service, wrong format ... '" << it2 << "' missing XXX-service-SERVICE-NAME.srv");
continue;
}
APPL_INFO("find service : " << it2);
listAvaillableServices.push_back(std::make_pair(spl[1], std::string(nameFileSrv.begin(), nameFileSrv.end()-4)));
}
} else {
// not check the second path ==> no service availlable
}
}
}
#endif
APPL_INFO("==================================");
APPL_INFO("== ZEUS gateway start ==");
APPL_INFO("==================================");
@ -219,9 +250,28 @@ int main(int _argc, const char *_argv[]) {
} else {
bool routerAlive = true;
std::vector<ememory::SharedPtr<PlugginAccess>> listElements;
for (auto &it: services) {
ememory::SharedPtr<PlugginAccess> tmp = ememory::makeShared<PlugginAccess>(it);
listElements.push_back(tmp);
if ( services.size() == 1
&& services[0] == "all") {
for (auto &it: listAvaillableServices) {
ememory::SharedPtr<PlugginAccess> tmp = ememory::makeShared<PlugginAccess>(it.first, it.second);
listElements.push_back(tmp);
}
} else {
for (auto &it: services) {
// find the real service name:
bool find = false;
for (auto &it2: listAvaillableServices) {
if (it2.first == it) {
ememory::SharedPtr<PlugginAccess> tmp = ememory::makeShared<PlugginAccess>(it2.first, it2.second);
listElements.push_back(tmp);
find = true;
break;
}
}
if (find == false) {
APPL_ERROR("Can not find the service: " << it);
}
}
}
for (auto &it: listElements) {
it->init(_argc, _argv, basePath);

View File

@ -239,9 +239,7 @@ ememory::SharedPtr<appl::GateWayInterface> appl::Router::get(const std::string&
int ret = execlp( binary.c_str(),
binary.c_str(), // must repeate the binary name to have the name as first argument ...
userConf.c_str(),
"--srv=user",
"--srv=picture",
"--srv=video",
"--srv=all",
delay.c_str(),
basePath.c_str(),
logFile.c_str(),

View File

@ -187,6 +187,33 @@ zeus::ObjectRemote zeus::Client::getService(const std::string& _name) {
return zeus::ObjectRemote(ret.get());
}
zeus::Future<int32_t> zeus::Client::getServiceCount() {
return call(ZEUS_NO_ID_OBJECT, ZEUS_ID_GATEWAY, "getServiceCount");
}
zeus::Future<std::vector<std::string>> zeus::Client::getServiceList() {
return call(ZEUS_NO_ID_OBJECT, ZEUS_ID_GATEWAY, "getServiceList");
}
// TODO : This is an active waiting ==> this is bad ... ==> use future, it will be better
bool zeus::Client::waitForService(const std::string& _serviceName) {
int32_t delayMax = 10;
while (delayMax > 0) {
auto listValues = getServiceList();
listValues.wait();
for (auto &it: listValues.get()) {
if (it == _serviceName) {
return true;
}
}
std::this_thread::sleep_for(std::chrono::milliseconds(100));
delayMax--;
}
return false;
}
void zeus::Client::onPropertyChangeIp() {
disconnect();
}

View File

@ -156,6 +156,11 @@ namespace zeus {
* @brief Display all connected object remote and local ...
*/
void cleanDeadObject();
public:
zeus::Future<int32_t> getServiceCount();
zeus::Future<std::vector<std::string>> getServiceList();
// TODO : This is an active waiting ==> this is bad ... ==> use future, it will be better
bool waitForService(const std::string& _serviceName);
};
}

View File

@ -276,12 +276,18 @@ int32_t zeus::WebServer::writeBinary(ememory::SharedPtr<zeus::Message> _obj) {
bool zeus::WebServer::onReceiveUri(const std::string& _uri, const std::vector<std::string>& _protocols) {
ZEUS_INFO("Receive Header uri: " << _uri);
bool findProtocol = false;
for (auto &it : _protocols) {
if (it == "zeus/1.0") {
m_connection.setProtocol(it);
findProtocol = true;
break;
}
}
if (findProtocol == false) {
ZEUS_ERROR("Disable connection request URI='" << _uri << "' with wrong protocol:" << _protocols);
return false;
}
// TODO : Add better return on specific user ...
if (m_observerRequestUri != nullptr) {
return m_observerRequestUri(_uri);