diff --git a/indra/newview/rlvcommon.h b/indra/newview/rlvcommon.h index 6965a70ab1..c0f728bc54 100644 --- a/indra/newview/rlvcommon.h +++ b/indra/newview/rlvcommon.h @@ -183,16 +183,16 @@ protected: // Extensibility classes // -class RlvCommandHandler +class RlvExtCommandHandler { public: - virtual ~RlvCommandHandler() {} + virtual ~RlvExtCommandHandler() {} virtual bool onAddRemCommand(const RlvCommand& rlvCmd, ERlvCmdRet& cmdRet) { return false; } virtual bool onClearCommand(const RlvCommand& rlvCmd, ERlvCmdRet& cmdRet) { return false; } virtual bool onReplyCommand(const RlvCommand& rlvCmd, ERlvCmdRet& cmdRet) { return false; } virtual bool onForceCommand(const RlvCommand& rlvCmd, ERlvCmdRet& cmdRet) { return false; } }; -typedef bool (RlvCommandHandler::*rlvCommandHandler)(const RlvCommand& rlvCmd, ERlvCmdRet& cmdRet); +typedef bool (RlvExtCommandHandler::*rlvExtCommandHandler)(const RlvCommand& rlvCmd, ERlvCmdRet& cmdRet); // ============================================================================ // Generic menu enablers diff --git a/indra/newview/rlvdefines.h b/indra/newview/rlvdefines.h index 91c0733621..3e45ff3398 100644 --- a/indra/newview/rlvdefines.h +++ b/indra/newview/rlvdefines.h @@ -223,7 +223,7 @@ enum ERlvBehaviour { RLV_BHVR_UNKNOWN }; -enum RlvCommandOptionType +enum RlvBehaviourOptionType { RLV_OPTION_NONE, RLV_OPTION_EXCEPTION, @@ -255,7 +255,8 @@ enum ERlvCmdRet { RLV_RET_FAILED_DISABLED, // Command failed (command disabled by user) RLV_RET_FAILED_UNKNOWN, // Command failed (unknown command) RLV_RET_FAILED_NOSHAREDROOT, // Command failed (missing #RLV) - RLV_RET_DEPRECATED // Command has been deprecated + RLV_RET_DEPRECATED, // Command has been deprecated + RLV_RET_NO_PROCESSOR // Command doesn't have a template processor define (legacy code) }; enum ERlvExceptionCheck diff --git a/indra/newview/rlvextensions.h b/indra/newview/rlvextensions.h index 7f161fd825..08a6d1fca7 100644 --- a/indra/newview/rlvextensions.h +++ b/indra/newview/rlvextensions.h @@ -27,7 +27,7 @@ * */ -class RlvExtGetSet : public RlvCommandHandler +class RlvExtGetSet : public RlvExtCommandHandler { public: RlvExtGetSet(); diff --git a/indra/newview/rlvhandler.cpp b/indra/newview/rlvhandler.cpp index d941932251..26b36ac23d 100644 --- a/indra/newview/rlvhandler.cpp +++ b/indra/newview/rlvhandler.cpp @@ -1,6 +1,6 @@ /** * - * Copyright (c) 2009-2011, Kitty Barnett + * Copyright (c) 2009-2016, Kitty Barnett * * The source code in this file is provided to you under the terms of the * GNU Lesser General Public License, version 2.1, but WITHOUT ANY WARRANTY; @@ -20,6 +20,7 @@ #include "llappviewer.h" #include "llgroupactions.h" #include "llhudtext.h" +#include "llmoveview.h" #include "llstartup.h" #include "llviewermessage.h" #include "llviewerobjectlist.h" @@ -47,6 +48,12 @@ rlv_handler_t gRlvHandler; // Option parsing template specialization implmentation // +template +struct RlvCommandOptionParser +{ + static bool parseOption(const std::string& strOption, optionType& valueOption); +}; + bool RlvCommandOptionParser::parseOption(const std::string& strOption, LLUUID& idOption) { idOption.set(strOption); @@ -62,8 +69,35 @@ bool RlvCommandOptionParser::parseOption(const std::string& strOption, int& // Command processing template specialization implmentation // +ERlvCmdRet RlvBehaviourProcessorHelper::processBehaviourImpl(const RlvCommand& rlvCmd, RlvBhvrHandler* pHandlerFunc) +{ + bool fRefCount = false; + ERlvCmdRet eRet = (*pHandlerFunc)(rlvCmd, fRefCount); + + // If this command represents a restriction that's been added/removed then we need to do some additional processing + if ( (RLV_RET_SUCCESS == eRet) && (fRefCount) ) + { + ERlvBehaviour eBhvr = rlvCmd.getBehaviourType(); + S16& refBhvr = gRlvHandler.m_Behaviours[eBhvr]; + if (RLV_TYPE_ADD == rlvCmd.getParamType()) + { + if (rlvCmd.isStrict()) + gRlvHandler.addException(rlvCmd.getObjectID(), RLV_BHVR_PERMISSIVE, eBhvr); + refBhvr++; + } + else + { + if (rlvCmd.isStrict()) + gRlvHandler.removeException(rlvCmd.getObjectID(), RLV_BHVR_PERMISSIVE, eBhvr); + refBhvr--; + } + } + + return eRet; +} + // Handles: @bhvr=n|y -ERlvCmdRet RlvCommandGenericProcessor::processCommand(const RlvCommand& rlvCmd, bool& fRefCount) +ERlvCmdRet RlvBehaviourGenericHandler::onCommand(const RlvCommand& rlvCmd, bool& fRefCount) { // There should be no option if (rlvCmd.hasOption()) @@ -74,7 +108,7 @@ ERlvCmdRet RlvCommandGenericProcessor::process } // Handles: @bhvr:=n|y -ERlvCmdRet RlvCommandGenericProcessor::processCommand(const RlvCommand& rlvCmd, bool& fRefCount) +ERlvCmdRet RlvBehaviourGenericHandler::onCommand(const RlvCommand& rlvCmd, bool& fRefCount) { // There should be an option and it should specify a valid UUID LLUUID idException; @@ -91,20 +125,27 @@ ERlvCmdRet RlvCommandGenericProcessor::pr } // Handles: @bhvr[:]=n|y -ERlvCmdRet RlvCommandGenericProcessor::processCommand(const RlvCommand& rlvCmd, bool& fRefCount) +ERlvCmdRet RlvBehaviourGenericHandler::onCommand(const RlvCommand& rlvCmd, bool& fRefCount) { // If there is an option then it should specify a valid UUID (but don't reference count) if (rlvCmd.hasOption()) { - ERlvCmdRet eRet = RlvCommandGenericProcessor::processCommand(rlvCmd, fRefCount); + ERlvCmdRet eRet = RlvBehaviourGenericHandler::onCommand(rlvCmd, fRefCount); fRefCount = false; return eRet; } - return RlvCommandGenericProcessor::processCommand(rlvCmd, fRefCount); + return RlvBehaviourGenericHandler::onCommand(rlvCmd, fRefCount); } +// Handles: @sendim=n|y toggles +void RlvBehaviourToggleHandler::onCommandToggle(ERlvBehaviour eBhvr, bool fHasBhvr) +{ + gSavedPerAccountSettings.getControl("DoNotDisturbModeResponse")->setHiddenFromSettingsEditor(fHasBhvr); +} + + // Handles: @sendchannel[:]=n|y -ERlvCmdRet RlvCommandProcessor::processCommand(const RlvCommand& rlvCmd, bool& fRefCount) +ERlvCmdRet RlvBehaviourHandler::onCommand(const RlvCommand& rlvCmd, bool& fRefCount) { // If there's an option then it should be a valid (= positive and non-zero) chat channel if (rlvCmd.hasOption()) @@ -126,7 +167,7 @@ ERlvCmdRet RlvCommandProcessor::processCo } // Handles: @showhovertext:=n|y -ERlvCmdRet RlvCommandProcessor::processCommand(const RlvCommand& rlvCmd, bool& fRefCount) +ERlvCmdRet RlvBehaviourHandler::onCommand(const RlvCommand& rlvCmd, bool& fRefCount) { // There should be an option and it should specify a valid UUID LLUUID idException; @@ -148,7 +189,7 @@ ERlvCmdRet RlvCommandProcessor::process } // Handles: @setgroup:=force -ERlvCmdRet RlvCommandProcessor::processCommand(const RlvCommand& rlvCmd, bool&) +ERlvCmdRet RlvCommandHandler::onCommand(const RlvCommand& rlvCmd) { if (gRlvHandler.hasBehaviourExcept(RLV_BHVR_SETGROUP, rlvCmd.getObjectID())) { @@ -178,7 +219,7 @@ ERlvCmdRet RlvCommandProcessor::processComman } // Handles: @sit:=force -ERlvCmdRet RlvCommandProcessor::processCommand(const RlvCommand& rlvCmd, bool&) +ERlvCmdRet RlvCommandHandler::onCommand(const RlvCommand& rlvCmd) { LLViewerObject* pObj = NULL; LLUUID idTarget(rlvCmd.getOption()); // Sanity checking - we need to know about the object and it should identify a prim/linkset @@ -377,14 +418,14 @@ void RlvHandler::removeException(const LLUUID& idObj, ERlvBehaviour eBhvr, const // // Checked: 2010-04-07 (RLVa-1.2.0d) | Modified: RLVa-1.1.0f -void RlvHandler::addCommandHandler(RlvCommandHandler* pCmdHandler) +void RlvHandler::addCommandHandler(RlvExtCommandHandler* pCmdHandler) { if ( (pCmdHandler) && (std::find(m_CommandHandlers.begin(), m_CommandHandlers.end(), pCmdHandler) == m_CommandHandlers.end()) ) m_CommandHandlers.push_back(pCmdHandler); } // Checked: 2010-04-07 (RLVa-1.2.0d) | Modified: RLVa-1.1.0f -void RlvHandler::removeCommandHandler(RlvCommandHandler* pCmdHandler) +void RlvHandler::removeCommandHandler(RlvExtCommandHandler* pCmdHandler) { if (pCmdHandler) m_CommandHandlers.remove(pCmdHandler); @@ -393,7 +434,7 @@ void RlvHandler::removeCommandHandler(RlvCommandHandler* pCmdHandler) // Checked: 2010-04-07 (RLVa-1.2.0d) | Modified: RLVa-1.1.0a void RlvHandler::clearCommandHandlers() { - std::list::const_iterator itHandler = m_CommandHandlers.begin(); + std::list::const_iterator itHandler = m_CommandHandlers.begin(); while (itHandler != m_CommandHandlers.end()) { delete *itHandler; @@ -403,9 +444,9 @@ void RlvHandler::clearCommandHandlers() } // Checked: 2010-04-07 (RLVa-1.2.0d) | Modified: RLVa-1.1.0f -bool RlvHandler::notifyCommandHandlers(rlvCommandHandler f, const RlvCommand& rlvCmd, ERlvCmdRet& eRet, bool fNotifyAll) const +bool RlvHandler::notifyCommandHandlers(rlvExtCommandHandler f, const RlvCommand& rlvCmd, ERlvCmdRet& eRet, bool fNotifyAll) const { - std::list::const_iterator itHandler = m_CommandHandlers.begin(); bool fContinue = true; eRet = RLV_RET_UNKNOWN; + std::list::const_iterator itHandler = m_CommandHandlers.begin(); bool fContinue = true; eRet = RLV_RET_UNKNOWN; while ( (itHandler != m_CommandHandlers.end()) && ((fContinue) || (fNotifyAll)) ) { ERlvCmdRet eCmdRet = RLV_RET_UNKNOWN; @@ -583,7 +624,7 @@ ERlvCmdRet RlvHandler::processClearCommand(const RlvCommand& rlvCmd) // Let our observers know about clear commands ERlvCmdRet eRet = RLV_RET_SUCCESS; - notifyCommandHandlers(&RlvCommandHandler::onClearCommand, rlvCmd, eRet, true); + notifyCommandHandlers(&RlvExtCommandHandler::onClearCommand, rlvCmd, eRet, true); return RLV_RET_SUCCESS; // Don't fail clear commands even if the object didn't exist since it confuses people } @@ -1298,9 +1339,18 @@ ERlvCmdRet RlvHandler::processAddRemCommand(const RlvCommand& rlvCmd) // * added to the RlvObject // * removed from the RlvObject (which still exists at this point even if this is the last restriction) // - the object's UUID may or may not exist in gObjectList (see handling of @detach=n|y) + + // Try a command processor first + ERlvCmdRet eRet = rlvCmd.processCommand(); + if (RLV_RET_NO_PROCESSOR != eRet) + { + return eRet; + } + + // Process the command the legacy way ERlvBehaviour eBhvr = rlvCmd.getBehaviourType(); ERlvParamType eType = rlvCmd.getParamType(); - ERlvCmdRet eRet = RLV_RET_SUCCESS; bool fRefCount = false; const std::string& strOption = rlvCmd.getOption(); + eRet = RLV_RET_SUCCESS; bool fRefCount = false; const std::string& strOption = rlvCmd.getOption(); switch (eBhvr) { case RLV_BHVR_DETACH: // @detach[: