/** * @RDE_HEADER@ * GenericBase * $Id$ * $HeadURL$ * $Author$ */ #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) { // add short project name instead of long project namespace (with ::) // i. e. Lts::SpatialData => LTS_SpatialData 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'; // check if it's really a signal or slot if(slotCode != QSLOT_CODE && slotCode != QSIGNAL_CODE) { ERROR_LOG(logger) << "Use the SLOT or SIGNAL macro for slot name!"; return ret; } slotToExecute++; // skip code 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); } } // namespace Helper } // namespace DDS