#include "generic_base.h" #include #include #include namespace DDS { namespace Helper { static inline bool endsWith(std::string const &str, std::string const &end) { if (end.size() > str.size()) return false; return std::equal(end.rbegin(), end.rend(), str.rbegin()); } static inline std::string getSimpleTopicName(const std::string &fqName) { const size_t idx = fqName.rfind("::"); if (idx == std::string::npos) return fqName; return fqName.substr(idx + 2); } std::string getFunctionTopicName(const std::string &fqName) { const std::string ftName = getSimpleTopicName(fqName); static const std::string request("Request"); static const std::string reply("Reply"); if (endsWith(ftName, request)) return ftName.substr(0, ftName.size() - request.size()); if (endsWith(ftName, reply)) return ftName.substr(0, ftName.size() - reply.size()); return ftName; } std::string getShortTopicName(const std::string &fqName) { return std::string("LTS_") + getSimpleTopicName(fqName); } QMetaMethod getMethod(NGL::INGLLogger &logger, QObject *objectToInform, const char *slotToExecute, const char *signalSignature, bool bWarnOnEmptySlot) { QMetaMethod ret; if(!slotToExecute || !objectToInform) { if(bWarnOnEmptySlot) WARNING_LOG(logger) << "invalid arguments to getMethod()"; return ret; } int slotCode = slotToExecute[0] - '0'; if(slotCode != QSLOT_CODE && slotCode != QSIGNAL_CODE) { ERROR_LOG(logger) << "Use the SLOT or SIGNAL macro for slot name!"; return ret; } slotToExecute++; const QMetaObject *mo = objectToInform->metaObject(); const QByteArray slot = QMetaObject::normalizedSignature(slotToExecute); const int indexOfSlot = mo->indexOfSlot(slot.data()); if(indexOfSlot < 0) { WARNING_LOG(logger) << "No such slot " << mo->className() << "::" << slot; return ret; } const QByteArray signal = QMetaObject::normalizedSignature(signalSignature); if(!QMetaObject::checkConnectArgs(signal.data(), slot.data())) { WARNING_LOG(logger) << "Incompatible slot arguments " << mo->className() << "::" << slot << ", must be: " << signal; return ret; } return mo->method(indexOfSlot); } } }