void Subscriber::OnMessage(Safir::Dob::MessageProxy messageProxy) { DoseStressTest::RootMessagePtr rootMsg = boost::static_pointer_cast<DoseStressTest::RootMessage>(messageProxy.GetMessage()); switch (rootMsg->GetTypeId()) { case DoseStressTest::MessageWithAckLarge::ClassTypeId: { m_receivedWithAckLargeStat->Tick(); if (rootMsg->SequenceNumber().GetVal() != m_lastSequenceNumberWithAckLarge + 1) { //tick up number of lost messages m_missedWithAckLargeStat->Tick(rootMsg->SequenceNumber().GetVal() - m_lastSequenceNumberWithAckLarge); } m_lastSequenceNumberWithAckLarge = rootMsg->SequenceNumber().GetVal(); } break; case DoseStressTest::MessageWithAck::ClassTypeId: { m_receivedWithAckStat->Tick(); if (rootMsg->SequenceNumber().GetVal() != m_lastSequenceNumberWithAck + 1) { //tick up number of lost messages m_missedWithAckStat->Tick(rootMsg->SequenceNumber().GetVal() - m_lastSequenceNumberWithAck); } m_lastSequenceNumberWithAck = rootMsg->SequenceNumber().GetVal(); } break; case DoseStressTest::MessageWithoutAckLarge::ClassTypeId: { m_receivedWithoutAckLargeStat->Tick(); if (rootMsg->SequenceNumber().GetVal() != m_lastSequenceNumberWithoutAckLarge + 1) { //tick up number of lost messages m_missedWithoutAckLargeStat->Tick(rootMsg->SequenceNumber().GetVal() - m_lastSequenceNumberWithoutAckLarge); } m_lastSequenceNumberWithoutAckLarge = rootMsg->SequenceNumber().GetVal(); } break; case DoseStressTest::MessageWithoutAck::ClassTypeId: { m_receivedWithoutAckStat->Tick(); if (rootMsg->SequenceNumber().GetVal() != m_lastSequenceNumberWithoutAck + 1) { //tick up number of lost messages m_missedWithoutAckStat->Tick(rootMsg->SequenceNumber().GetVal() - m_lastSequenceNumberWithoutAck); } m_lastSequenceNumberWithoutAck = rootMsg->SequenceNumber().GetVal(); } break; } }
//----------------------------------------------------------------------------- void BackdoorKeeper::OnMessage(const Safir::Dob::MessageProxy messageProxy) { try { const boost::wregex::flag_type regExpFlags = boost::regex::perl | boost::regex::icase; const Safir::Dob::MessagePtr message = messageProxy.GetMessage(); const Safir::Application::BackdoorCommandPtr cmd = boost::dynamic_pointer_cast<Safir::Application::BackdoorCommand>(message); if (cmd == NULL) { // Unexpected message return; // *** RETURN *** } if (!cmd->NodeName().IsNull()) { if (!boost::regex_search(Safir::Dob::ThisNodeParameters::Name(), boost::wregex(cmd->NodeName().GetVal(), regExpFlags))) { // Node name doesn't match return; // *** RETURN *** } } Safir::Dob::ConnectionAspectMisc connectionAspectMisc(m_connection); if (!cmd->ConnectionName().IsNull()) { if (!boost::regex_search(connectionAspectMisc.GetConnectionName(), boost::wregex(cmd->ConnectionName().GetVal(), regExpFlags))) { // Connection name doesn't match return; // *** RETURN *** } } if (cmd->Command().IsNull()) { // No command given return; // *** RETURN *** } // Ok, it seems that this PI-command is for this application std::vector<std::wstring> cmdTokens; const wchar_t* delimiters = L" \t\n\r"; Tokenize(cmd->Command().GetVal(), cmdTokens, delimiters); if (!cmdTokens.empty()) { if (cmdTokens[0] == pingCmd) { // It's a 'ping' command. Answer to it without bothering // the subclass implementator. std::wostringstream ostr; ostr << "Ping reply from " << connectionAspectMisc.GetConnectionName() << " on node " << Safir::Dob::ThisNodeParameters::Name(); Safir::Logging::SendSystemLog(Safir::Logging::Debug, ostr.str()); return; // *** RETURN *** } else if (cmdTokens[0] == helpCmd) { // Get help text from subclass implementator. Safir::Logging::SendSystemLog(Safir::Logging::Debug, m_backdoor->GetHelpText()); return; // *** RETURN *** } } // Let the subclass handle the command m_backdoor->HandleCommand(cmdTokens); } catch (boost::bad_expression& /* e*/ ) { // An invalid regular expression was used, skip this command return; // *** RETURN *** } }