[FIXED] An RLV_LOCK_ADD locked root folder is considered remove-locked when determining whether a folder is RLV_LOCK_REMOVE type locked

-> see FIRE-3485

--HG--
branch : RLVa
meow-7.2.2
Kitty Barnett 2016-07-12 23:10:50 +02:00
parent 822845e78f
commit 51b95b190b
3 changed files with 14 additions and 13 deletions

View File

@ -307,9 +307,10 @@ enum ERlvExceptionCheck
enum ERlvLockMask
{
RLV_LOCK_ADD = 0x01,
RLV_LOCK_REMOVE = 0x02,
RLV_LOCK_ANY = RLV_LOCK_ADD | RLV_LOCK_REMOVE
RLV_LOCK_NONE = 0x00,
RLV_LOCK_ADD = 0x01,
RLV_LOCK_REMOVE = 0x02,
RLV_LOCK_ANY = RLV_LOCK_ADD | RLV_LOCK_REMOVE
};
enum ERlvWearMask

View File

@ -941,7 +941,7 @@ protected:
// Checked: 2011-03-28 (RLVa-1.3.0g) | Modified: RLVa-1.3.0g
RlvFolderLocks::RlvFolderLocks()
: m_fLookupDirty(false), m_fLockedRoot(false), m_cntLockAdd(0), m_cntLockRem(0)
: m_fLookupDirty(false), m_RootLockType(RLV_LOCK_NONE), m_cntLockAdd(0), m_cntLockRem(0)
{
LLOutfitObserver::instance().addCOFChangedCallback(boost::bind(&RlvFolderLocks::onNeedsLookupRefresh, this));
RlvInventory::instance().addSharedRootIDChangedCallback(boost::bind(&RlvFolderLocks::onNeedsLookupRefresh, this));
@ -1193,7 +1193,7 @@ bool RlvFolderLocks::isLockedFolder(LLUUID idFolder, ERlvLockMask eLockTypeMask,
idFolderCur = (pParent) ? pParent->getParentUUID() : idFolderRoot;
}
// If we didn't encounter an explicit deny lock with no exception then the folder is locked if the entire inventory is locked down
return (m_fLockedRoot) && (eSourceTypeMask & ST_ROOTFOLDER) && (idsRlvObjRem.empty()) && (idsRlvObjAdd.empty());
return (m_RootLockType & eLockTypeMask) && (eSourceTypeMask & ST_ROOTFOLDER) && (idsRlvObjRem.empty()) && (idsRlvObjAdd.empty());
}
// Checked: 2010-11-30 (RLVa-1.3.0b) | Added: RLVa-1.3.0b
@ -1209,7 +1209,7 @@ void RlvFolderLocks::refreshLockedLookups() const
//
// Refresh locked folders
//
m_fLockedRoot = false;
m_RootLockType = RLV_LOCK_NONE;
m_LockedFolderMap.clear();
for (folderlock_list_t::const_iterator itFolderLock = m_FolderLocks.begin(); itFolderLock != m_FolderLocks.end(); ++itFolderLock)
{
@ -1223,8 +1223,8 @@ void RlvFolderLocks::refreshLockedLookups() const
const LLViewerInventoryCategory* pFolder = lockedFolders.at(idxFolder);
if (idFolderRoot != pFolder->getUUID())
m_LockedFolderMap.insert(std::pair<LLUUID, const folderlock_descr_t*>(pFolder->getUUID(), pLockDescr));
else
m_fLockedRoot |= (SCOPE_SUBTREE == pLockDescr->eLockScope);
else if (SCOPE_SUBTREE == pLockDescr->eLockScope)
m_RootLockType |= (U32)pLockDescr->eLockType;
}
}
}

View File

@ -376,11 +376,11 @@ protected:
// Cached item look-up variables
typedef std::multimap<LLUUID, const folderlock_descr_t*> folderlock_map_t;
mutable bool m_fLookupDirty;
mutable bool m_fLockedRoot;
mutable uuid_vec_t m_LockedAttachmentRem;
mutable folderlock_map_t m_LockedFolderMap;
mutable uuid_vec_t m_LockedWearableRem;
mutable bool m_fLookupDirty;
mutable U32 m_RootLockType;
mutable uuid_vec_t m_LockedAttachmentRem;
mutable folderlock_map_t m_LockedFolderMap;
mutable uuid_vec_t m_LockedWearableRem;
private:
friend class LLSingleton<RlvFolderLocks>;
};