bool YarpPluginSettings::subopen(SharedLibraryFactory& factory, const ConstString& dll_name, const ConstString& fn_name) { YARP_SPRINTF2(impl::Logger::get(),debug,"Trying plugin [dll: %s] [fn: %s]", dll_name.c_str(),fn_name.c_str()); bool ok = factory.open(dll_name.c_str(),fn_name.c_str()); if (verbose) { fprintf(stderr,"Trying to find library '%s' containing function '%s' -- %s\n", dll_name.c_str(), fn_name.c_str(), ok ? "found" :"fail"); } if (ok) { YARP_SPRINTF2(impl::Logger::get(),debug, "Found plugin [dll: %s] [fn: %s]", dll_name.c_str(),fn_name.c_str()); this->dll_name = dll_name; this->fn_name = fn_name; } else if (verbose || (factory.getStatus() != SharedLibraryFactory::STATUS_LIBRARY_NOT_FOUND)) { fprintf(stderr, "error while opening %s:\n %s\n", dll_name.c_str(), factory.getError().c_str()); } return ok; }
void YarpPluginSettings::reportStatus(SharedLibraryFactory& factory) const { int problem = factory.getStatus(); if (problem==0) { return; } switch (problem) { case SharedLibraryFactory::STATUS_LIBRARY_NOT_LOADED: if (verbose) { fprintf(stderr,"Cannot load plugin from shared library (%s)\n", dll_name.c_str()); fprintf(stderr,"(%s)\n", factory.getError().c_str()); } break; case SharedLibraryFactory::STATUS_LIBRARY_NOT_FOUND: fprintf(stderr,"Cannot load plugin from shared library (%s)\n", dll_name.c_str()); fprintf(stderr,"(%s)\n", factory.getError().c_str()); break; case SharedLibraryFactory::STATUS_FACTORY_NOT_FOUND: fprintf(stderr,"cannot find YARP hook in shared library (%s:%s)\n", dll_name.c_str(), fn_name.c_str()); fprintf(stderr,"(%s)\n", factory.getError().c_str()); break; case SharedLibraryFactory::STATUS_FACTORY_NOT_FUNCTIONAL: fprintf(stderr,"YARP hook in shared library misbehaved (%s:%s)\n", dll_name.c_str(), fn_name.c_str()); fprintf(stderr,"(the library may be too old/new and need to be recompiled to match YARP version)\n"); fprintf(stderr,"(%s)\n", factory.getError().c_str()); break; default: fprintf(stderr,"Unknown error (%s:%s)\n", dll_name.c_str(), fn_name.c_str()); fprintf(stderr,"(%s)\n", factory.getError().c_str()); break; } }
bool YarpPluginSettings::open(SharedLibraryFactory& factory) { YARP_SPRINTF3(impl::Logger::get(),debug,"Plugin [name: %s] [dll: %s] [fn: %s]", name.c_str(),dll_name.c_str(),fn_name.c_str()); if (selector!=NULL && name != "") { // we may have a YARP-specific search path available, // and a proper name for the DLL Bottle paths = selector->getSearchPath(); for (int i=0; i<paths.size(); i++) { Searchable& options = paths.get(i); ConstString path = options.find("path").asString(); ConstString ext = options.find("extension").asString(); ConstString prefix = options.find("prefix").asString(); ConstString full = path + "/" + prefix + name + ext; bool ok = subopen(factory,full,(fn_name=="")?name:fn_name); if (ok) return true; } } if (dll_name!=""||fn_name!="") { return open(factory,dll_name, fn_name); } #ifdef YARP_HAS_ACE bool ok = false; ConstString str(name); ConstString libName = name; ConstString fnName = name; int sindex = str.find(":"); if (sindex>=0) { libName = str.substr(0,sindex); fnName = str.substr(sindex+1); ok = open(factory,libName,fnName); } if ((!ok) && sindex<0) { libName = ConstString("yarp_") + name; fnName = name; ok = open(factory,libName,fnName); } if ((!ok) && sindex<0) { int index = str.find("_"); if (index>=0) { libName = ConstString("yarp_") + str.substr(0,index); fnName = str; ok = open(factory,libName,fnName); } } return ok; #else return factory.open(dll_name.c_str(), fn_name.c_str()); #endif }
bool YarpPluginSettings::subopen(SharedLibraryFactory& factory, const ConstString& dll_name, const ConstString& fn_name) { YARP_SPRINTF2(impl::Logger::get(),debug,"Trying plugin [dll: %s] [fn: %s]", dll_name.c_str(),fn_name.c_str()); bool ok = factory.open(dll_name.c_str(),fn_name.c_str()); if (verbose) { fprintf(stderr,"Trying to find library '%s' containing function '%s' -- %s\n", dll_name.c_str(), fn_name.c_str(), ok?"found":"not found"); } if (ok) { YARP_SPRINTF2(impl::Logger::get(),debug, "Found plugin [dll: %s] [fn: %s]", dll_name.c_str(),fn_name.c_str()); this->dll_name = dll_name; this->fn_name = fn_name; } return ok; }
bool YarpPluginSettings::open(SharedLibraryFactory& factory, const ConstString& dll_name, const ConstString& fn_name) { bool ok = subopen(factory,dll_name,fn_name); if (!ok) { if (factory.getStatus() == SharedLibraryFactory::STATUS_FACTORY_NOT_FOUND) { if (fn_ext!="") { ok = subopen(factory,dll_name,fn_name + fn_ext); } else { ok = subopen(factory,dll_name,fn_name + "_carrier"); if (!ok) { ok = subopen(factory,dll_name,fn_name + "_device"); } } } } return ok; }
bool YarpPluginSettings::open(SharedLibraryFactory& factory) { YARP_SPRINTF3(impl::Logger::get(),debug,"Plugin [name: %s] [dll: %s] [fn: %s]", name.c_str(),dll_name.c_str(),fn_name.c_str()); if (selector!=YARP_NULLPTR && name != "") { // we may have a YARP-specific search path available, // and a proper name for the DLL Bottle paths = selector->getSearchPath(); for (int i=0; i<paths.size(); i++) { Searchable& options = paths.get(i); ConstString path = options.find("path").asString(); ConstString ext = options.find("extension").asString(); ConstString basename = (dll_name.find('.')!=ConstString::npos) ? name : dll_name; ConstString fn = (fn_name=="")?name:fn_name; ConstString fullpath; #if defined(_MSC_VER) && !defined(NDEBUG) // MSVC DEBUG build: try debug name before basic name fullpath = path + "/" + basename + "d" + ext; if (subopen(factory, fullpath, fn)) return true; #endif // defined(_MSC_VER) && !defined(NDEBUG) // Basic name fullpath = path + "/" + basename + ext; if (subopen(factory, fullpath, fn)) return true; #if defined(_MSC_VER) && defined(NDEBUG) // MSVC RELEASE build: try debug name after basic name fullpath = path + "/" + basename + "d" + ext; if (subopen(factory, fullpath, fn)) return true; #endif // defined(_MSC_VER) && defined(NDEBUG) #ifdef CMAKE_INTDIR // On multi-config system, try to find the plugin in the // current config subdirectory #if defined(_MSC_VER) && !defined(NDEBUG) // MSVC DEBUG build: try debug name before basic name fullpath = path + "/" + CMAKE_INTDIR + "/" + dll_name + "d" + ext; if (subopen(factory, fullpath, fn)) return true; #endif // defined(_MSC_VER) && !defined(NDEBUG) // Basic name fullpath = path + "/" + CMAKE_INTDIR + "/" + dll_name + ext; if (subopen(factory, fullpath, fn)) return true; #if defined(_MSC_VER) && defined(NDEBUG) // MSVC RELEASE build: try debug name after basic name fullpath = path + "/" + CMAKE_INTDIR + "/" + dll_name + "d" + ext; if (subopen(factory, fullpath, fn)) return true; #endif // defined(_MSC_VER) && defined(NDEBUG) #endif // CMAKE_INTDIR } } if (dll_name!=""||fn_name!="") { return open(factory, dll_name, fn_name); } return factory.open((ConstString("yarp_") + name).c_str(), (fn_name=="")?name.c_str():fn_name.c_str()); }
std::string toString() { std::string s; Property done; for (unsigned int i=0; i<delegates.size(); i++) { if (delegates[i]==nullptr) continue; std::string name = delegates[i]->getName(); done.put(name,1); std::string wrapper = delegates[i]->getWrapper(); s += "Device \""; s += delegates[i]->getName(); s += "\""; s += ","; s += " C++ class "; s += delegates[i]->getCode(); s += ", "; if (wrapper=="") { s += "has no network wrapper"; } else if (wrapper!=name) { s += "wrapped by \""; s += delegates[i]->getWrapper(); s += "\""; } else { s += "is a network wrapper."; } s += "\n"; } scan(); Bottle lst = getSelectedPlugins(); for (size_t i=0; i<lst.size(); i++) { Value& prop = lst.get(i); std::string name = prop.check("name",Value("untitled")).asString(); if (done.check(name)) continue; SharedLibraryFactory lib; YarpPluginSettings settings; settings.setSelector(*this); settings.readFromSearchable(prop,name); settings.open(lib); std::string location = lib.getName().c_str(); if (location=="") { // A wrong library name ends up with empty location yWarning("Wrong library name for plugin %s", name.c_str()); continue; } std::string cxx = prop.check("cxx",Value("unknown")).asString(); std::string wrapper = prop.check("wrapper",Value("unknown")).asString(); s += "Device \""; s += name; s += "\""; s += ","; s += " available on request (found in "; s += location; s += " library)"; if (cxx!="unknown") { s += ", C++ class "; s += cxx; s += " "; } if (wrapper=="") { s += "no network wrapper known"; // will never come here since the prop.check fallback is set to unknown few lines above!!! } else if (wrapper=="unknown") { //s += "network wrapper unknown"; } else if (wrapper!=name) { s += ", wrapped by \""; s += wrapper.c_str(); s += "\""; } else { s += ", is a network wrapper"; } s += ".\n"; } return s; }
ConstString toString() { ConstString s; Property done; for (unsigned int i=0; i<delegates.size(); i++) { if (delegates[i]==NULL) continue; ConstString name = delegates[i]->getName(); done.put(name,1); ConstString wrapper = delegates[i]->getWrapper(); s += "Device \""; s += delegates[i]->getName(); s += "\""; s += ","; s += " C++ class "; s += delegates[i]->getCode(); s += ", "; if (wrapper=="") { s += "has no network wrapper"; } else if (wrapper!=name) { s += "wrapped by \""; s += delegates[i]->getWrapper(); s += "\""; } else { s += "is a network wrapper."; } s += "\n"; } scan(); Bottle lst = getSelectedPlugins(); for (int i=0; i<lst.size(); i++) { Value& prop = lst.get(i); ConstString name = prop.check("name",Value("untitled")).asString(); if (done.check(name)) continue; SharedLibraryFactory lib; YarpPluginSettings settings; settings.setSelector(*this); settings.readFromSearchable(prop,name); settings.open(lib); ConstString location = lib.getName().c_str(); if (location=="") continue; ConstString cxx = prop.check("cxx",Value("unknown")).asString(); ConstString wrapper = prop.check("wrapper",Value("unknown")).asString(); s += "Device \""; s += name; s += "\""; s += ","; s += " available on request (found in "; s += location; s += " library)"; if (cxx!="unknown") { s += ", C++ class "; s += cxx; s += " "; } if (wrapper=="") { s += "no network wrapper known"; } else if (wrapper=="unknown") { //s += "network wrapper unknown"; } else if (wrapper!=name) { s += "wrapped by \""; s += delegates[i]->getWrapper(); s += "\""; } else { s += "is a network wrapper."; } s += "\n"; } return s; }