[DEV] add wait for service (2sec) and api to get list of service availlable
This commit is contained in:
parent
abb81cd61a
commit
6091275c64
@ -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) {
|
||||
|
@ -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);
|
||||
|
@ -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(),
|
||||
|
@ -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();
|
||||
}
|
||||
|
@ -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);
|
||||
};
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user