ReaderServicePtr LibraryManager::getReaderService(ReaderUnitPtr reader, ReaderServiceType type) { ReaderServicePtr srv; for (auto &&itr : libLoaded) { IDynLibrary *lib = itr.second; if (lib->hasSymbol("getReaderService")) { int (*fptr)(ReaderUnitPtr, ReaderServicePtr &, ReaderServiceType) = nullptr; fptr = reinterpret_cast<decltype(fptr)>(lib->getSymbol("getReaderService")); assert(fptr); fptr(reader, srv, type); if (srv) break; } } return srv; }
std::shared_ptr<CardService> LibraryManager::getCardService(std::shared_ptr<Chip> chip, CardServiceType type) { std::shared_ptr<CardService> srv; for (auto &&itr : libLoaded) { IDynLibrary *lib = itr.second; if (lib->hasSymbol("getCardService")) { int (*fptr)(std::shared_ptr<Chip>, std::shared_ptr<CardService> &, CardServiceType) = nullptr; fptr = reinterpret_cast<decltype(fptr)>(lib->getSymbol("getCardService")); assert(fptr); fptr(chip, srv, type); if (srv) break; } } return srv; }
std::shared_ptr<AccessControlCardService> LibraryManager::getAccessControlCardService( std::shared_ptr<Chip> chip) { std::shared_ptr<AccessControlCardService> srv; for (auto &&itr : libLoaded) { const std::string &libname = itr.first; IDynLibrary *lib = itr.second; int (*fptr)(std::shared_ptr<Chip>, std::shared_ptr<AccessControlCardService> &) = nullptr; if (lib->hasSymbol("getAccessControlCardService")) { fptr = reinterpret_cast<decltype(fptr)>(lib->getSymbol("getAccessControlCardService")); assert(fptr); fptr(chip, srv); if (srv) break; } } return srv; }
std::shared_ptr<ReaderUnit> LibraryManager::getReader(const std::string &readerName) const { // The idea here is simply to loop over all shared library // and opportunistically call the `getReaderUnit()` function if it exists, hoping // that some module will be able to fulfil our request. std::shared_ptr<ReaderUnit> readerUnit; for (auto &&itr : libLoaded) { IDynLibrary *lib = itr.second; if (lib->hasSymbol("getReaderUnit")) { int(*fptr)(const std::string &, std::shared_ptr<ReaderUnit> &) = nullptr; fptr = reinterpret_cast<decltype(fptr)>(lib->getSymbol("getReaderUnit")); assert(fptr); fptr(readerName, readerUnit); if (readerUnit) break; } } return readerUnit; }