diff --git a/indra/newview/rlvhandler.cpp b/indra/newview/rlvhandler.cpp index c1c4b7d8073266b9b616ffd5ab7b78e1d34c3231..cbd54958e50f55e713f14083d784e58db9c9d0f7 100644 --- a/indra/newview/rlvhandler.cpp +++ b/indra/newview/rlvhandler.cpp @@ -1251,6 +1251,7 @@ ERlvCmdRet RlvHandler::processAddRemCommand(const RlvCommand& rlvCmd) if (rlvCmd.isStrict()) addException(rlvCmd.getObjectID(), RLV_BHVR_PERMISSIVE, eBhvr); m_Behaviours[eBhvr]++; + rlvCmd.markRefCounted(); } else { @@ -1283,6 +1284,7 @@ ERlvCmdRet RlvCommandHandlerBaseImpl<RLV_TYPE_ADDREM>::processCommand(const RlvC if (rlvCmd.isStrict()) gRlvHandler.addException(rlvCmd.getObjectID(), RLV_BHVR_PERMISSIVE, eBhvr); gRlvHandler.m_Behaviours[eBhvr]++; + rlvCmd.markRefCounted(); } else { diff --git a/indra/newview/rlvhelper.cpp b/indra/newview/rlvhelper.cpp index 4a4d8356b3ffaf394501b6a88feb0f3680f05bb9..d8baee2adf961e5930f8f782a32acca6ea6affa0 100644 --- a/indra/newview/rlvhelper.cpp +++ b/indra/newview/rlvhelper.cpp @@ -860,9 +860,19 @@ bool RlvObject::hasBehaviour(ERlvBehaviour eBehaviour, bool fStrictOnly) const bool RlvObject::hasBehaviour(ERlvBehaviour eBehaviour, const std::string& strOption, bool fStrictOnly) const { - for (rlv_command_list_t::const_iterator itCmd = m_Commands.begin(); itCmd != m_Commands.end(); ++itCmd) - if ( (itCmd->getBehaviourType() == eBehaviour) && (itCmd->getOption() == strOption) && ((!fStrictOnly) || (itCmd->isStrict())) ) + for (const RlvCommand& rlvCmd : m_Commands) + { + // The specified behaviour is contained within the current object if: + // - the (parsed) behaviour matches + // - the option matches (or we're checking for an empty option and the command was reference counted) + // - we're not matching on strict (or it is a strict command) + if ( (rlvCmd.getBehaviourType() == eBehaviour) && + ( (rlvCmd.getOption() == strOption) || ((strOption.empty()) && (rlvCmd.isRefCounted())) ) && + ( (!fStrictOnly) ||(rlvCmd.isStrict()) ) ) + { return true; + } + } return false; } diff --git a/indra/newview/rlvhelper.h b/indra/newview/rlvhelper.h index cfe64a48f5283b1400c2ff0f54a15daa15ee4a7f..41daab136031f103a7cd86fe67c1b9380a1d8460 100644 --- a/indra/newview/rlvhelper.h +++ b/indra/newview/rlvhelper.h @@ -369,12 +369,14 @@ class RlvCommand ERlvCmdRet getReturnType() const { return m_eRet; } bool hasOption() const { return !m_strOption.empty(); } bool isBlocked() const { return (m_pBhvrInfo) ? m_pBhvrInfo->isBlocked() : false; } + bool isRefCounted() const { return m_fRefCounted; } bool isStrict() const { return m_fStrict; } bool isValid() const { return m_fValid; } ERlvCmdRet processCommand() const { return (m_pBhvrInfo) ? m_pBhvrInfo->processCommand(*this) : RLV_RET_NO_PROCESSOR; } protected: static bool parseCommand(const std::string& strCommand, std::string& strBehaviour, std::string& strOption, std::string& strParam); + bool markRefCounted() const { return m_fRefCounted = true; } /* * Operators @@ -395,9 +397,11 @@ class RlvCommand std::string m_strOption; std::string m_strParam; ERlvCmdRet m_eRet; + mutable bool m_fRefCounted; friend class RlvHandler; friend class RlvObject; + template<ERlvParamType> friend struct RlvCommandHandlerBaseImpl; }; // ============================================================================