Changes to make GCC happy:

- Add template<> to those specialization that missed it
- Change template<> template<> to just template<>
- Change RlvCommandOptionHelper::parseOption<RlvCommandOptionGeneric>(rlvCmd.getOption()) to RlvCommandOptionHelper::parseOption<RlvCommandOptionGeneric>(rlvCmd.getOption(), rlvCmdOption ) as otherwise a wrong template go picked wich resulted in linker errors.
- Rearrange RlvBehaviourDictionary to be above the classes that need the defintion (RlvBehaviourDictionary::instance call)
- Change '(".("RLV_FOLDER_FLAG_NOSTRIP")"' to '(".(" RLV_FOLDER_FLAG_NOSTRIP ")"'. The GCC preprecessor does not like it w/o spaces.
master
Nicky 2016-06-12 17:13:05 +02:00
parent a06f0ef3a6
commit 4e47e36e98
3 changed files with 80 additions and 72 deletions

View File

@ -1165,7 +1165,8 @@ ERlvCmdRet RlvHandler::processAddRemCommand(const RlvCommand& rlvCmd)
case RLV_BHVR_REMOUTFIT: // @remoutfit[:<layer>]=n|y - Checked: 2010-08-29 (RLVa-1.2.1c) | Modified: RLVa-1.2.1c
{
// If there's an option it should specify a wearable type name (reference count on no option *and* a valid option)
RlvCommandOptionGeneric rlvCmdOption = RlvCommandOptionHelper::parseOption<RlvCommandOptionGeneric>(rlvCmd.getOption());
RlvCommandOptionGeneric rlvCmdOption;
RlvCommandOptionHelper::parseOption<RlvCommandOptionGeneric>(rlvCmd.getOption(), rlvCmdOption);
VERIFY_OPTION_REF( (rlvCmdOption.isEmpty()) || (rlvCmdOption.isWearableType()) );
// We need to flush any queued force-wear commands before changing the restrictions
@ -1320,6 +1321,7 @@ ERlvCmdRet RlvCommandHandlerBaseImpl<RLV_TYPE_ADDREM>::processCommand(const RlvC
}
// Handles: @bhvr=n|y
template<>
ERlvCmdRet RlvBehaviourGenericHandler<RLV_OPTION_NONE>::onCommand(const RlvCommand& rlvCmd, bool& fRefCount)
{
// There should be no option
@ -1331,6 +1333,7 @@ ERlvCmdRet RlvBehaviourGenericHandler<RLV_OPTION_NONE>::onCommand(const RlvComma
}
// Handles: @bhvr:<uuid>=n|y
template<>
ERlvCmdRet RlvBehaviourGenericHandler<RLV_OPTION_EXCEPTION>::onCommand(const RlvCommand& rlvCmd, bool& fRefCount)
{
// There should be an option and it should specify a valid UUID
@ -1348,6 +1351,7 @@ ERlvCmdRet RlvBehaviourGenericHandler<RLV_OPTION_EXCEPTION>::onCommand(const Rlv
}
// Handles: @bhvr[:<uuid>]=n|y
template<>
ERlvCmdRet RlvBehaviourGenericHandler<RLV_OPTION_NONE_OR_EXCEPTION>::onCommand(const RlvCommand& rlvCmd, bool& fRefCount)
{
// If there is an option then it should specify a valid UUID (but don't reference count)
@ -1361,6 +1365,7 @@ ERlvCmdRet RlvBehaviourGenericHandler<RLV_OPTION_NONE_OR_EXCEPTION>::onCommand(c
}
// Handles: @bhvr:<modifier>=n|y
template<>
ERlvCmdRet RlvBehaviourGenericHandler<RLV_OPTION_MODIFIER>::onCommand(const RlvCommand& rlvCmd, bool& fRefCount)
{
// There should be an option and it should specify a valid modifier (RlvBehaviourModifier performs the appropriate type checks)
@ -1379,6 +1384,7 @@ ERlvCmdRet RlvBehaviourGenericHandler<RLV_OPTION_MODIFIER>::onCommand(const RlvC
}
// Handles: @bhvr[:<modifier>]=n|y
template<>
ERlvCmdRet RlvBehaviourGenericHandler<RLV_OPTION_NONE_OR_MODIFIER>::onCommand(const RlvCommand& rlvCmd, bool& fRefCount)
{
// If there is an option then it should specify a valid modifier (and reference count)
@ -1400,7 +1406,7 @@ ERlvCmdRet RlvBehaviourGenericHandler<RLV_OPTION_NONE_OR_MODIFIER>::onCommand(co
}
// Handles: @addattach[:<attachpt>]=n|y and @remattach[:<attachpt>]=n|y
template<> template<>
template<>
ERlvCmdRet RlvBehaviourAddRemAttachHandler::onCommand(const RlvCommand& rlvCmd, bool& fRefCount)
{
// Sanity check - if there's an option it should specify a valid attachment point name
@ -1433,7 +1439,7 @@ ERlvCmdRet RlvBehaviourAddRemAttachHandler::onCommand(const RlvCommand& rlvCmd,
}
// Handles: @detach[:<attachpt>]=n|y
template<> template<>
template<>
ERlvCmdRet RlvBehaviourHandler<RLV_BHVR_DETACH>::onCommand(const RlvCommand& rlvCmd, bool& fRefCount)
{
// We need to flush any queued force-wear commands before changing the restrictions
@ -1476,7 +1482,8 @@ ERlvCmdRet RlvBehaviourHandler<RLV_BHVR_DETACH>::onCommand(const RlvCommand& rlv
// Checked: 2010-11-30 (RLVa-1.3.0b) | Added: RLVa-1.3.0b
ERlvCmdRet RlvHandler::onAddRemFolderLock(const RlvCommand& rlvCmd, bool& fRefCount)
{
RlvCommandOptionGeneric rlvCmdOption = RlvCommandOptionHelper::parseOption<RlvCommandOptionGeneric>(rlvCmd.getOption());
RlvCommandOptionGeneric rlvCmdOption;
RlvCommandOptionHelper::parseOption<RlvCommandOptionGeneric>(rlvCmd.getOption(), rlvCmdOption);
RlvFolderLocks::folderlock_source_t lockSource;
if (rlvCmdOption.isEmpty())
@ -1521,7 +1528,8 @@ ERlvCmdRet RlvHandler::onAddRemFolderLock(const RlvCommand& rlvCmd, bool& fRefCo
ERlvCmdRet RlvHandler::onAddRemFolderLockException(const RlvCommand& rlvCmd, bool& fRefCount)
{
// Sanity check - the option should specify a shared folder path
RlvCommandOptionGeneric rlvCmdOption = RlvCommandOptionHelper::parseOption<RlvCommandOptionGeneric>(rlvCmd.getOption());
RlvCommandOptionGeneric rlvCmdOption;
RlvCommandOptionHelper::parseOption<RlvCommandOptionGeneric>(rlvCmd.getOption(), rlvCmdOption );
if (!rlvCmdOption.isSharedFolder())
return RLV_RET_FAILED_OPTION;
@ -1545,7 +1553,7 @@ ERlvCmdRet RlvHandler::onAddRemFolderLockException(const RlvCommand& rlvCmd, boo
}
// Handles: @edit=n|y toggles
template<> template<>
template<>
void RlvBehaviourToggleHandler<RLV_BHVR_EDIT>::onCommandToggle(ERlvBehaviour eBhvr, bool fHasBhvr)
{
if (fHasBhvr)
@ -1570,7 +1578,7 @@ void RlvBehaviourToggleHandler<RLV_BHVR_EDIT>::onCommandToggle(ERlvBehaviour eBh
}
// Handles: @sendchannel[:<channel>]=n|y
template<> template<>
template<>
ERlvCmdRet RlvBehaviourHandler<RLV_BHVR_SENDCHANNEL>::onCommand(const RlvCommand& rlvCmd, bool& fRefCount)
{
// If there's an option then it should be a valid (= positive and non-zero) chat channel
@ -1593,14 +1601,14 @@ ERlvCmdRet RlvBehaviourHandler<RLV_BHVR_SENDCHANNEL>::onCommand(const RlvCommand
}
// Handles: @sendim=n|y toggles
template<> template<>
template<>
void RlvBehaviourToggleHandler<RLV_BHVR_SENDIM>::onCommandToggle(ERlvBehaviour eBhvr, bool fHasBhvr)
{
gSavedPerAccountSettings.getControl("DoNotDisturbModeResponse")->setHiddenFromSettingsEditor(fHasBhvr);
}
// Handles: @edit=n|y toggles
template<> template<>
template<>
void RlvBehaviourToggleHandler<RLV_BHVR_SETDEBUG>::onCommandToggle(ERlvBehaviour eBhvr, bool fHasBhvr)
{
for (const auto& dbgSetting : RlvExtGetSet::m_DbgAllowed)
@ -1611,7 +1619,7 @@ void RlvBehaviourToggleHandler<RLV_BHVR_SETDEBUG>::onCommandToggle(ERlvBehaviour
}
// Handles: @edit=n|y toggles
template<> template<>
template<>
void RlvBehaviourToggleHandler<RLV_BHVR_SETENV>::onCommandToggle(ERlvBehaviour eBhvr, bool fHasBhvr)
{
const std::string strEnvFloaters[] = { "env_post_process", "env_settings", "env_delete_preset", "env_edit_sky", "env_edit_water", "env_edit_day_cycle" };
@ -1641,7 +1649,7 @@ void RlvBehaviourToggleHandler<RLV_BHVR_SETENV>::onCommandToggle(ERlvBehaviour e
}
// Handles: @showhovertext:<uuid>=n|y
template<> template<>
template<>
ERlvCmdRet RlvBehaviourHandler<RLV_BHVR_SHOWHOVERTEXT>::onCommand(const RlvCommand& rlvCmd, bool& fRefCount)
{
// There should be an option and it should specify a valid UUID
@ -1664,7 +1672,7 @@ ERlvCmdRet RlvBehaviourHandler<RLV_BHVR_SHOWHOVERTEXT>::onCommand(const RlvComma
}
// Handles: @edit=n|y toggles
template<> template<>
template<>
void RlvBehaviourToggleHandler<RLV_BHVR_SHOWINV>::onCommandToggle(ERlvBehaviour eBhvr, bool fHasBhvr)
{
if (LLApp::isQuitting())
@ -1778,7 +1786,8 @@ ERlvCmdRet RlvHandler::processForceCommand(const RlvCommand& rlvCmd) const
{
if (RlvBehaviourInfo::FORCEWEAR_CONTEXT_NONE & rlvCmd.getBehaviourFlags())
{
RlvCommandOptionGeneric rlvCmdOption = RlvCommandOptionHelper::parseOption<RlvCommandOptionGeneric>(rlvCmd.getOption());
RlvCommandOptionGeneric rlvCmdOption;
RlvCommandOptionHelper::parseOption<RlvCommandOptionGeneric>(rlvCmd.getOption(), rlvCmdOption);
VERIFY_OPTION(rlvCmdOption.isSharedFolder());
eRet = onForceWear(rlvCmdOption.getSharedFolder(), rlvCmd.getBehaviourFlags());
}
@ -1802,7 +1811,7 @@ ERlvCmdRet RlvHandler::processForceCommand(const RlvCommand& rlvCmd) const
}
// Handles: @detachme=force
template<> template<>
template<>
ERlvCmdRet RlvForceHandler<RLV_BHVR_DETACHME>::onCommand(const RlvCommand& rlvCmd)
{
if (rlvCmd.hasOption())
@ -1817,13 +1826,14 @@ ERlvCmdRet RlvForceHandler<RLV_BHVR_DETACHME>::onCommand(const RlvCommand& rlvCm
}
// Handles: @remattach[:<folder|attachpt|attachgroup>]=force
template<> template<>
template<>
ERlvCmdRet RlvForceRemAttachHandler::onCommand(const RlvCommand& rlvCmd)
{
if (!isAgentAvatarValid())
return RLV_RET_FAILED;
RlvCommandOptionGeneric rlvCmdOption = RlvCommandOptionHelper::parseOption<RlvCommandOptionGeneric>(rlvCmd.getOption());
RlvCommandOptionGeneric rlvCmdOption;
RlvCommandOptionHelper::parseOption<RlvCommandOptionGeneric>(rlvCmd.getOption(), rlvCmdOption);
if (rlvCmdOption.isSharedFolder())
return gRlvHandler.onForceWear(rlvCmdOption.getSharedFolder(), rlvCmd.getBehaviourFlags());
@ -1859,10 +1869,11 @@ ERlvCmdRet RlvForceRemAttachHandler::onCommand(const RlvCommand& rlvCmd)
}
// Handles: @remoutfit[:<folder|layer>]=force
template<> template<>
template<>
ERlvCmdRet RlvForceHandler<RLV_BHVR_REMOUTFIT>::onCommand(const RlvCommand& rlvCmd)
{
RlvCommandOptionGeneric rlvCmdOption = RlvCommandOptionHelper::parseOption<RlvCommandOptionGeneric>(rlvCmd.getOption());
RlvCommandOptionGeneric rlvCmdOption;
RlvCommandOptionHelper::parseOption<RlvCommandOptionGeneric>(rlvCmd.getOption(), rlvCmdOption);
if (rlvCmdOption.isSharedFolder())
return gRlvHandler.onForceWear(rlvCmdOption.getSharedFolder(), rlvCmd.getBehaviourFlags());
@ -1907,7 +1918,7 @@ void RlvHandler::onForceWearCallback(const uuid_vec_t& idItems, U32 nFlags) cons
}
// Handles: @setgroup:<uuid|name>=force
template<> template<>
template<>
ERlvCmdRet RlvForceHandler<RLV_BHVR_SETGROUP>::onCommand(const RlvCommand& rlvCmd)
{
if (gRlvHandler.hasBehaviourExcept(RLV_BHVR_SETGROUP, rlvCmd.getObjectID()))
@ -1938,7 +1949,7 @@ ERlvCmdRet RlvForceHandler<RLV_BHVR_SETGROUP>::onCommand(const RlvCommand& rlvCm
}
// Handles: @sit:<uuid>=force
template<> template<>
template<>
ERlvCmdRet RlvForceHandler<RLV_BHVR_SIT>::onCommand(const RlvCommand& rlvCmd)
{
LLViewerObject* pObj = NULL; LLUUID idTarget(rlvCmd.getOption());
@ -1969,7 +1980,7 @@ ERlvCmdRet RlvForceHandler<RLV_BHVR_SIT>::onCommand(const RlvCommand& rlvCmd)
}
// Handles: @tpto:<vector>[;<angle>]=force
template<> template<>
template<>
ERlvCmdRet RlvForceHandler<RLV_BHVR_TPTO>::onCommand(const RlvCommand& rlvCmd)
{
std::vector<std::string> optionList;
@ -2269,7 +2280,7 @@ ERlvCmdRet RlvHandler::onGetAttachNames(const RlvCommand& rlvCmd, std::string& s
}
// Handles: @getcommand[:<behaviour>[;<type>[;<separator>]]]=<channel>
template<> template<>
template<>
ERlvCmdRet RlvReplyHandler<RLV_BHVR_GETCOMMAND>::onCommand(const RlvCommand& rlvCmd, std::string& strReply)
{
std::vector<std::string> optionList;

View File

@ -101,10 +101,10 @@ template<> struct RlvCommandHandlerBaseImpl<RLV_TYPE_REPLY> { static ERlvCmdRet
template <ERlvParamType paramType, ERlvBehaviour eBhvr>
struct RlvCommandHandler
{
template<typename = typename std::enable_if<paramType == RLV_TYPE_ADDREM>::type> static ERlvCmdRet onCommand(const RlvCommand&, bool&);
template<typename = typename std::enable_if<paramType == RLV_TYPE_ADDREM>::type> static void onCommandToggle(ERlvBehaviour, bool);
template<typename = typename std::enable_if<paramType == RLV_TYPE_FORCE>::type> static ERlvCmdRet onCommand(const RlvCommand&);
template<typename = typename std::enable_if<paramType == RLV_TYPE_REPLY>::type> static ERlvCmdRet onCommand(const RlvCommand&, std::string&);
static ERlvCmdRet onCommand(const RlvCommand&, bool&);
static void onCommandToggle(ERlvBehaviour, bool);
static ERlvCmdRet onCommand(const RlvCommand&);
static ERlvCmdRet onCommand(const RlvCommand&, std::string&);
};
// Aliases to improve readability in definitions
@ -125,12 +125,10 @@ class RlvCommandProcessor : public RlvBehaviourInfo
{
public:
// Default constructor used by behaviour specializations
template<typename = typename std::enable_if<eBhvr != RLV_BHVR_UNKNOWN>::type>
RlvCommandProcessor(const std::string& strBhvr, U32 nBhvrFlags = 0) : RlvBehaviourInfo(strBhvr, eBhvr, paramType, nBhvrFlags) {}
// Constructor used when we don't want to specialize on behaviour (see RlvBehaviourGenericProcessor)
template<typename = typename std::enable_if<eBhvr == RLV_BHVR_UNKNOWN>::type>
RlvCommandProcessor(const std::string& strBhvr, ERlvBehaviour eBhvr, U32 nBhvrFlags = 0) : RlvBehaviourInfo(strBhvr, eBhvr, paramType, nBhvrFlags) {}
RlvCommandProcessor(const std::string& strBhvr, ERlvBehaviour a_eBhvr, U32 nBhvrFlags = 0) : RlvBehaviourInfo(strBhvr, a_eBhvr, paramType, nBhvrFlags) {}
ERlvCmdRet processCommand(const RlvCommand& rlvCmd) const override { return baseImpl::processCommand(rlvCmd, &handlerImpl::onCommand); }
};
@ -240,6 +238,47 @@ protected:
void onValueChange() const override;
};
// ============================================================================
// RlvBehaviourDictionary and related classes
//
class RlvBehaviourDictionary : public LLSingleton<RlvBehaviourDictionary>
{
friend class LLSingleton<RlvBehaviourDictionary>;
protected:
RlvBehaviourDictionary();
~RlvBehaviourDictionary();
public:
void addEntry(const RlvBehaviourInfo* pEntry);
void addModifier(ERlvBehaviour eBhvr, ERlvBehaviourModifier eModifier, RlvBehaviourModifier* pModifierEntry);
/*
* General helper functions
*/
public:
ERlvBehaviour getBehaviourFromString(const std::string& strBhvr, ERlvParamType eParamType, bool* pfStrict = NULL) const;
const RlvBehaviourInfo* getBehaviourInfo(const std::string& strBhvr, ERlvParamType eParamType, bool* pfStrict = NULL) const;
bool getCommands(const std::string& strMatch, ERlvParamType eParamType, std::list<std::string>& cmdList) const;
bool getHasStrict(ERlvBehaviour eBhvr) const;
RlvBehaviourModifier* getModifier(ERlvBehaviourModifier eBhvrMod) const { return (eBhvrMod < RLV_MODIFIER_COUNT) ? m_BehaviourModifiers[eBhvrMod] : nullptr; }
RlvBehaviourModifier* getModifierFromBehaviour(ERlvBehaviour eBhvr) const;
void toggleBehaviourFlag(const std::string& strBhvr, ERlvParamType eParamType, RlvBehaviourInfo::EBehaviourFlags eBvhrFlag, bool fEnable);
/*
* Member variables
*/
protected:
typedef std::list<const RlvBehaviourInfo*> rlv_bhvrinfo_list_t;
typedef std::map<std::pair<std::string, ERlvParamType>, const RlvBehaviourInfo*> rlv_string2info_map_t;
typedef std::multimap<ERlvBehaviour, const RlvBehaviourInfo*> rlv_bhvr2info_map_t;
typedef std::map<ERlvBehaviour, ERlvBehaviourModifier> rlv_bhvr2mod_map_t;
rlv_bhvrinfo_list_t m_BhvrInfoList;
rlv_string2info_map_t m_String2InfoMap;
rlv_bhvr2info_map_t m_Bhvr2InfoMap;
rlv_bhvr2mod_map_t m_Bhvr2ModifierMap;
RlvBehaviourModifier* m_BehaviourModifiers[RLV_MODIFIER_COUNT];
};
// Inspired by LLControlCache<T>
template<typename T>
class RlvBehaviourModifierCache : public LLRefCount, public LLInstanceTracker<RlvBehaviourModifierCache<T>, ERlvBehaviourModifier>
@ -302,48 +341,6 @@ protected:
LLPointer<RlvBehaviourModifierCache<T>> mCachedModifierPtr;
};
// ============================================================================
// RlvBehaviourDictionary and related classes
//
class RlvBehaviourDictionary : public LLSingleton<RlvBehaviourDictionary>
{
friend class LLSingleton<RlvBehaviourDictionary>;
protected:
RlvBehaviourDictionary();
~RlvBehaviourDictionary();
public:
void addEntry(const RlvBehaviourInfo* pEntry);
void addModifier(ERlvBehaviour eBhvr, ERlvBehaviourModifier eModifier, RlvBehaviourModifier* pModifierEntry);
/*
* General helper functions
*/
public:
ERlvBehaviour getBehaviourFromString(const std::string& strBhvr, ERlvParamType eParamType, bool* pfStrict = NULL) const;
const RlvBehaviourInfo* getBehaviourInfo(const std::string& strBhvr, ERlvParamType eParamType, bool* pfStrict = NULL) const;
bool getCommands(const std::string& strMatch, ERlvParamType eParamType, std::list<std::string>& cmdList) const;
bool getHasStrict(ERlvBehaviour eBhvr) const;
RlvBehaviourModifier* getModifier(ERlvBehaviourModifier eBhvrMod) const { return (eBhvrMod < RLV_MODIFIER_COUNT) ? m_BehaviourModifiers[eBhvrMod] : nullptr; }
RlvBehaviourModifier* getModifierFromBehaviour(ERlvBehaviour eBhvr) const;
void toggleBehaviourFlag(const std::string& strBhvr, ERlvParamType eParamType, RlvBehaviourInfo::EBehaviourFlags eBvhrFlag, bool fEnable);
/*
* Member variables
*/
protected:
typedef std::list<const RlvBehaviourInfo*> rlv_bhvrinfo_list_t;
typedef std::map<std::pair<std::string, ERlvParamType>, const RlvBehaviourInfo*> rlv_string2info_map_t;
typedef std::multimap<ERlvBehaviour, const RlvBehaviourInfo*> rlv_bhvr2info_map_t;
typedef std::map<ERlvBehaviour, ERlvBehaviourModifier> rlv_bhvr2mod_map_t;
rlv_bhvrinfo_list_t m_BhvrInfoList;
rlv_string2info_map_t m_String2InfoMap;
rlv_bhvr2info_map_t m_Bhvr2InfoMap;
rlv_bhvr2mod_map_t m_Bhvr2ModifierMap;
RlvBehaviourModifier* m_BehaviourModifiers[RLV_MODIFIER_COUNT];
};
// ============================================================================
// RlvCommand
//

View File

@ -309,7 +309,7 @@ inline bool RlvInventory::isFoldedFolder(const LLInventoryCategory* pFolder, boo
// .(<attachpt>) type folder
(0 != RlvAttachPtLookup::getAttachPointIndex(pFolder))
// .(nostrip) folder
|| ( (pFolder) && (".("RLV_FOLDER_FLAG_NOSTRIP")" == pFolder->getName()) )
|| ( (pFolder) && (".(" RLV_FOLDER_FLAG_NOSTRIP ")" == pFolder->getName()) )
// Composite folder (if composite folders are enabled and we're asked to look for them)
#ifdef RLV_EXPERIMENTAL_COMPOSITEFOLDERS
|| ( (fCheckComposite) && (RlvSettings::getEnableComposites()) &&