void Dispatcher::handlePublicationReceived(const JoynrMessage& message) { std::string jsonSubscriptionPublication = message.getPayload(); try { SubscriptionPublication subscriptionPublication = JsonSerializer::deserialize<SubscriptionPublication>(jsonSubscriptionPublication); std::string subscriptionId = subscriptionPublication.getSubscriptionId(); assert(subscriptionManager != nullptr); std::shared_ptr<ISubscriptionCallback> callback = subscriptionManager->getSubscriptionCallback(subscriptionId); if (!callback) { JOYNR_LOG_ERROR(logger, "Dropping reply for non/no more existing subscription with id = {}", subscriptionId); return; } subscriptionManager->touchSubscriptionState(subscriptionId); int typeId = callback->getTypeId(); // Get the publication interpreter - this has to be a reference to support // PublicationInterpreter polymorphism IPublicationInterpreter& interpreter = MetaTypeRegistrar::instance().getPublicationInterpreter(typeId); interpreter.execute(callback, subscriptionPublication); } catch (const std::invalid_argument& e) { JOYNR_LOG_ERROR( logger, "Unable to deserialize subscription publication object from: {} - error: {}", jsonSubscriptionPublication, e.what()); } }
void InProcessPublicationSender::sendSubscriptionPublication( const std::string& senderParticipantId, const std::string& receiverParticipantId, const MessagingQos& qos, const SubscriptionPublication& subscriptionPublication) { Q_UNUSED(senderParticipantId); // interface has sourcePartId, because JoynrMessages have a // source and dest. partId. Those are not necessary for in // process Q_UNUSED(receiverParticipantId); Q_UNUSED(qos); /** * just call the InProcessDispatcher! */ QString subscriptionId = subscriptionPublication.getSubscriptionId(); LOG_TRACE(logger, "Sending publication. id=" + subscriptionId); assert(subscriptionManager != NULL); subscriptionManager->touchSubscriptionState(subscriptionId); QSharedPointer<ISubscriptionCallback> callback = subscriptionManager->getSubscriptionCallback(subscriptionId); if (callback.isNull()) { LOG_ERROR(logger, "Dropping reply for non/no more existing subscription with id=" + subscriptionId); return; } int typeId = callback->getTypeId(); // Get the publication interpreter - this has to be a reference to support // PublicationInterpreter polymorphism IPublicationInterpreter& interpreter = MetaTypeRegistrar::instance().getPublicationInterpreter(typeId); LOG_TRACE(logger, "Interpreting publication. id=" + subscriptionId); interpreter.execute(callback, subscriptionPublication); }
void Dispatcher::handlePublicationReceived(const JoynrMessage& message) { QByteArray jsonSubscriptionPublication = message.getPayload(); SubscriptionPublication* subscriptionPublication = JsonSerializer::deserialize<SubscriptionPublication>(jsonSubscriptionPublication); if (subscriptionPublication == Q_NULLPTR) { LOG_ERROR(logger, QString("Unable to deserialize subscription publication object from: %1") .arg(QString::fromUtf8(jsonSubscriptionPublication))); return; } QString subscriptionId = subscriptionPublication->getSubscriptionId(); assert(subscriptionManager != NULL); QSharedPointer<ISubscriptionCallback> callback = subscriptionManager->getSubscriptionCallback(subscriptionId); if (callback.isNull()) { LOG_ERROR(logger, "Dropping reply for non/no more existing subscription with id=" + subscriptionId); delete subscriptionPublication; return; } subscriptionManager->touchSubscriptionState(subscriptionId); int typeId = callback->getTypeId(); // Get the publication interpreter - this has to be a reference to support // PublicationInterpreter polymorphism IPublicationInterpreter& interpreter = MetaTypeRegistrar::instance().getPublicationInterpreter(typeId); interpreter.execute(callback, *subscriptionPublication); delete subscriptionPublication; }