diff options
Diffstat (limited to 'indra/llmessage')
| -rw-r--r-- | indra/llmessage/llassetstorage.cpp | 50 | ||||
| -rw-r--r-- | indra/llmessage/llassetstorage.h | 31 | ||||
| -rw-r--r-- | indra/llmessage/llcircuit.cpp | 6 | ||||
| -rw-r--r-- | indra/llmessage/lldispatcher.cpp | 106 | ||||
| -rw-r--r-- | indra/llmessage/lldispatcher.h | 6 | ||||
| -rw-r--r-- | indra/llmessage/llregionflags.h | 3 | ||||
| -rw-r--r-- | indra/llmessage/message_prehash.cpp | 5 | ||||
| -rw-r--r-- | indra/llmessage/message_prehash.h | 5 | 
8 files changed, 149 insertions, 63 deletions
| diff --git a/indra/llmessage/llassetstorage.cpp b/indra/llmessage/llassetstorage.cpp index 596d57c7b7..18b2b124e1 100644 --- a/indra/llmessage/llassetstorage.cpp +++ b/indra/llmessage/llassetstorage.cpp @@ -62,6 +62,42 @@ const LLUUID CATEGORIZE_LOST_AND_FOUND_ID(std::string("00000000-0000-0000-0000-0  const U64 TOXIC_ASSET_LIFETIME = (120 * 1000000);       // microseconds +namespace +{ +    bool operator == (const LLAssetStorage::LLGetAssetCallback &lhs, const LLAssetStorage::LLGetAssetCallback &rhs) +    { +        auto fnPtrLhs = lhs.target<LLAssetStorage::LLGetAssetCallback>(); +        auto fnPtrRhs = rhs.target<LLAssetStorage::LLGetAssetCallback>(); +        if (fnPtrLhs && fnPtrRhs) +            return (*fnPtrLhs == *fnPtrRhs); +        else if (!fnPtrLhs && !fnPtrRhs) +            return true; +        return false; +    } + +// Rider: This is the general case of the operator declared above. The code compares the callback  +// passed into the LLAssetStorage functions to determine if there are duplicated requests for an  +// asset.  Unfortunately std::function does not provide a direct way to compare two variables so  +// we define the operator here.  +// XCode is not very happy with the variadic temples in use below so we will just define the specific  +// case of comparing two LLGetAssetCallback objects since that is all we really use. +//  +//     template<typename T, typename... U> +//     bool operator == (const std::function<T(U...)> &a, const std::function <T(U...)> &b) +//     { +//         typedef T(fnType)(U...); +//  +//         auto fnPtrA = a.target<T(*)(U...)>(); +//         auto fnPtrB = b.target<T(*)(U...)>(); +//         if (fnPtrA && fnPtrB) +//             return (*fnPtrA == *fnPtrB); +//         else if (!fnPtrA && !fnPtrB) +//             return true; +//         return false; +//     } + +} +  ///----------------------------------------------------------------------------  /// LLAssetInfo  ///---------------------------------------------------------------------------- @@ -160,7 +196,7 @@ void LLAssetInfo::setFromNameValue( const LLNameValue& nv )  LLBaseDownloadRequest::LLBaseDownloadRequest(const LLUUID &uuid, const LLAssetType::EType type)      : mUUID(uuid),        mType(type), -      mDownCallback(NULL), +      mDownCallback(),        mUserData(NULL),        mHost(),        mIsTemp(FALSE), @@ -191,7 +227,7 @@ LLBaseDownloadRequest* LLBaseDownloadRequest::getCopy()  LLAssetRequest::LLAssetRequest(const LLUUID &uuid, const LLAssetType::EType type)      :   LLBaseDownloadRequest(uuid, type), -        mUpCallback( NULL ), +        mUpCallback(),          mInfoCallback( NULL ),          mIsLocal(FALSE),          mIsUserWaiting(FALSE), @@ -449,7 +485,7 @@ bool LLAssetStorage::findInStaticVFSAndInvokeCallback(const LLUUID& uuid, LLAsse  // IW - uuid is passed by value to avoid side effects, please don't re-add &      void LLAssetStorage::getAssetData(const LLUUID uuid,                                    LLAssetType::EType type,  -                                  LLGetAssetCallback callback,  +                                  LLAssetStorage::LLGetAssetCallback callback,                                    void *user_data,                                     BOOL is_priority)  { @@ -496,7 +532,7 @@ void LLAssetStorage::getAssetData(const LLUUID uuid,      BOOL exists = mVFS->getExists(uuid, type);      LLVFile file(mVFS, uuid, type);      U32 size = exists ? file.getSize() : 0; -     +      if (size > 0)      {          // we've already got the file @@ -1326,9 +1362,13 @@ void LLAssetStorage::getAssetData(const LLUUID uuid,           iter != mPendingDownloads.end();  )      {          LLAssetRequest* tmp = *iter++; + +        //void(*const* cbptr)(LLVFS *, const LLUUID &, LLAssetType::EType, void *, S32, LLExtStat)  +        auto cbptr = tmp->mDownCallback.target<void(*)(LLVFS *, const LLUUID &, LLAssetType::EType, void *, S32, LLExtStat)>(); +          if (type == tmp->getType() &&               uuid == tmp->getUUID() && -            legacyGetDataCallback == tmp->mDownCallback && +            (cbptr && (*cbptr == legacyGetDataCallback)) &&              callback == ((LLLegacyAssetRequest *)tmp->mUserData)->mDownCallback &&              user_data == ((LLLegacyAssetRequest *)tmp->mUserData)->mUserData)          { diff --git a/indra/llmessage/llassetstorage.h b/indra/llmessage/llassetstorage.h index 33b88473b9..c799d8eefc 100644 --- a/indra/llmessage/llassetstorage.h +++ b/indra/llmessage/llassetstorage.h @@ -28,6 +28,7 @@  #ifndef LL_LLASSETSTORAGE_H  #define LL_LLASSETSTORAGE_H  #include <string> +#include <functional>  #include "lluuid.h"  #include "lltimer.h" @@ -59,6 +60,14 @@ const int LL_ERR_ASSET_REQUEST_NOT_IN_DATABASE = -4;  const int LL_ERR_INSUFFICIENT_PERMISSIONS = -5;  const int LL_ERR_PRICE_MISMATCH = -23018; +// *TODO: these typedefs are passed into the VFS via a legacy C function pointer +// future project would be to convert these to C++ callables (std::function<>) so that  +// we can use bind and remove the userData parameter. +//  +typedef std::function<void(LLVFS *vfs, const LLUUID &asset_id, LLAssetType::EType asset_type, void *user_data, S32 status, LLExtStat ext_status)> LLGetAssetCallback; +typedef std::function<void(const LLUUID &asset_id, void *user_data, S32 status, LLExtStat ext_status)> LLStoreAssetCallback; + +  class LLAssetInfo  {  protected: @@ -110,7 +119,8 @@ protected:      LLAssetType::EType mType;  public: -    void(*mDownCallback)(LLVFS*, const LLUUID&, LLAssetType::EType, void *, S32, LLExtStat); +    LLGetAssetCallback mDownCallback; +//    void(*mDownCallback)(LLVFS*, const LLUUID&, LLAssetType::EType, void *, S32, LLExtStat);      void	*mUserData;      LLHost  mHost; @@ -131,7 +141,8 @@ public:      virtual LLBaseDownloadRequest* getCopy(); -	void	(*mUpCallback)(const LLUUID&, void *, S32, LLExtStat); +    LLStoreAssetCallback mUpCallback; +//	void	(*mUpCallback)(const LLUUID&, void *, S32, LLExtStat);  	void	(*mInfoCallback)(LLAssetInfo *, void *, S32);  	BOOL	mIsLocal; @@ -182,12 +193,7 @@ protected:  // Map of known bad assets  typedef std::map<LLUUID,U64,lluuid_less> toxic_asset_map_t; -// *TODO: these typedefs are passed into the VFS via a legacy C function pointer -// future project would be to convert these to C++ callables (std::function<>) so that  -// we can use bind and remove the userData parameter. -//  -typedef void (*LLGetAssetCallback)(LLVFS *vfs, const LLUUID &asset_id, -                                   LLAssetType::EType asset_type, void *user_data, S32 status, LLExtStat ext_status); +  class LLAssetStorage  { @@ -195,7 +201,8 @@ public:  	// VFS member is public because static child methods need it :(  	LLVFS *mVFS;  	LLVFS *mStaticVFS; -	typedef void (*LLStoreAssetCallback)(const LLUUID &asset_id, void *user_data, S32 status, LLExtStat ext_status); +    typedef ::LLStoreAssetCallback LLStoreAssetCallback; +    typedef ::LLGetAssetCallback LLGetAssetCallback;  	enum ERequestType  	{ @@ -377,8 +384,8 @@ protected:  	void _cleanupRequests(BOOL all, S32 error);  	void _callUploadCallbacks(const LLUUID &uuid, const LLAssetType::EType asset_type, BOOL success, LLExtStat ext_status); -	virtual void _queueDataRequest(const LLUUID& uuid, LLAssetType::EType type, -								   void (*callback)(LLVFS *vfs, const LLUUID&, LLAssetType::EType, void *, S32, LLExtStat), +	virtual void _queueDataRequest(const LLUUID& uuid, LLAssetType::EType type, LLGetAssetCallback callback, +//								   void (*callback)(LLVFS *vfs, const LLUUID&, LLAssetType::EType, void *, S32, LLExtStat),  								   void *user_data, BOOL duplicate,  								   BOOL is_priority) = 0; @@ -424,7 +431,7 @@ class LLLegacyAssetRequest  {  public:  	void	(*mDownCallback)(const char *, const LLUUID&, void *, S32, LLExtStat); -	LLAssetStorage::LLStoreAssetCallback mUpCallback; +	LLStoreAssetCallback mUpCallback;  	void	*mUserData;  }; diff --git a/indra/llmessage/llcircuit.cpp b/indra/llmessage/llcircuit.cpp index 8dbe2f8411..8baa2e328b 100644 --- a/indra/llmessage/llcircuit.cpp +++ b/indra/llmessage/llcircuit.cpp @@ -543,7 +543,7 @@ void LLCircuitData::checkPeriodTime()  		mBytesOutLastPeriod	= mBytesOutThisPeriod;  		mBytesInThisPeriod	= S32Bytes(0);  		mBytesOutThisPeriod	= S32Bytes(0); -		mLastPeriodLength	= period_length; +		mLastPeriodLength	= F32Seconds::convert(period_length);  		mPeriodTime = mt_sec;  	} @@ -1378,8 +1378,8 @@ F32Milliseconds LLCircuitData::getPingInTransitTime()  	if (mPingsInTransit)  	{ -		time_since_ping_was_sent =  ((mPingsInTransit*mHeartbeatInterval - F32Seconds(1))  -			+ (LLMessageSystem::getMessageTimeSeconds() - mPingTime)); +		time_since_ping_was_sent =  F32Milliseconds::convert(((mPingsInTransit*mHeartbeatInterval - F32Seconds(1))  +			+ (LLMessageSystem::getMessageTimeSeconds() - mPingTime)));  	}  	return time_since_ping_was_sent; diff --git a/indra/llmessage/lldispatcher.cpp b/indra/llmessage/lldispatcher.cpp index c40fe0d389..717ef10f70 100644 --- a/indra/llmessage/lldispatcher.cpp +++ b/indra/llmessage/lldispatcher.cpp @@ -101,48 +101,70 @@ LLDispatchHandler* LLDispatcher::addHandler(  // static  bool LLDispatcher::unpackMessage( -		LLMessageSystem* msg, -		LLDispatcher::key_t& method, -		LLUUID& invoice, -		LLDispatcher::sparam_t& parameters) +    LLMessageSystem* msg, +    LLDispatcher::key_t& method, +    LLUUID& invoice, +    LLDispatcher::sparam_t& parameters)  { -	char buf[MAX_STRING];	/*Flawfinder: ignore*/ -	msg->getStringFast(_PREHASH_MethodData, _PREHASH_Method, method); -	msg->getUUIDFast(_PREHASH_MethodData, _PREHASH_Invoice, invoice); -	S32 size; -	S32 count = msg->getNumberOfBlocksFast(_PREHASH_ParamList); -	for (S32 i = 0; i < count; ++i) -	{ -		// we treat the SParam as binary data (since it might be an  -		// LLUUID in compressed form which may have embedded \0's,) -		size = msg->getSizeFast(_PREHASH_ParamList, i, _PREHASH_Parameter); -		if (size >= 0) -		{ -			msg->getBinaryDataFast( -				_PREHASH_ParamList, _PREHASH_Parameter, -				buf, size, i, MAX_STRING-1); +    char buf[MAX_STRING];	/*Flawfinder: ignore*/ +    msg->getStringFast(_PREHASH_MethodData, _PREHASH_Method, method); +    msg->getUUIDFast(_PREHASH_MethodData, _PREHASH_Invoice, invoice); +    S32 size; +    S32 count = msg->getNumberOfBlocksFast(_PREHASH_ParamList); +    for (S32 i = 0; i < count; ++i) +    { +        // we treat the SParam as binary data (since it might be an  +        // LLUUID in compressed form which may have embedded \0's,) +        size = msg->getSizeFast(_PREHASH_ParamList, i, _PREHASH_Parameter); +        if (size >= 0) +        { +            msg->getBinaryDataFast( +                _PREHASH_ParamList, _PREHASH_Parameter, +                buf, size, i, MAX_STRING - 1); -			// If the last byte of the data is 0x0, this is either a normally -			// packed string, or a binary packed UUID (which for these messages -			// are packed with a 17th byte 0x0).  Unpack into a std::string -			// without the trailing \0, so "abc\0" becomes std::string("abc", 3) -			// which matches const char* "abc". -			if (size > 0 -				&& buf[size-1] == 0x0) -			{ -				// special char*/size constructor because UUIDs may have embedded -				// 0x0 bytes. -				std::string binary_data(buf, size-1); -				parameters.push_back(binary_data); -			} -			else -			{ -				// This is either a NULL string, or a string that was packed  -				// incorrectly as binary data, without the usual trailing '\0'. -				std::string string_data(buf, size); -				parameters.push_back(string_data); -			} -		} -	} -	return true; +            // If the last byte of the data is 0x0, this is either a normally +            // packed string, or a binary packed UUID (which for these messages +            // are packed with a 17th byte 0x0).  Unpack into a std::string +            // without the trailing \0, so "abc\0" becomes std::string("abc", 3) +            // which matches const char* "abc". +            if (size > 0 +                && buf[size - 1] == 0x0) +            { +                // special char*/size constructor because UUIDs may have embedded +                // 0x0 bytes. +                std::string binary_data(buf, size - 1); +                parameters.push_back(binary_data); +            } +            else +            { +                // This is either a NULL string, or a string that was packed  +                // incorrectly as binary data, without the usual trailing '\0'. +                std::string string_data(buf, size); +                parameters.push_back(string_data); +            } +        } +    } +    return true; +} + +// static +bool LLDispatcher::unpackLargeMessage( +    LLMessageSystem* msg, +    LLDispatcher::key_t& method, +    LLUUID& invoice, +    LLDispatcher::sparam_t& parameters) +{ +    msg->getStringFast(_PREHASH_MethodData, _PREHASH_Method, method); +    msg->getUUIDFast(_PREHASH_MethodData, _PREHASH_Invoice, invoice); +    S32 count = msg->getNumberOfBlocksFast(_PREHASH_ParamList); +    for (S32 i = 0; i < count; ++i) +    { +        // This method treats all Parameter List params as strings and unpacks +        // them regardless of length. If there is binary data it is the callers  +        // responsibility to decode it. +        std::string param; +        msg->getStringFast(_PREHASH_ParamList, _PREHASH_Parameter, param, i); +        parameters.push_back(param); +    } +    return true;  } diff --git a/indra/llmessage/lldispatcher.h b/indra/llmessage/lldispatcher.h index 9d1751f588..43c63ac4df 100644 --- a/indra/llmessage/lldispatcher.h +++ b/indra/llmessage/lldispatcher.h @@ -105,6 +105,12 @@ public:  		LLUUID& invoice,  		sparam_t& parameters); +    static bool unpackLargeMessage( +        LLMessageSystem* msg, +        key_t& method, +        LLUUID& invoice, +        sparam_t& parameters); +  protected:  	typedef std::map<key_t, LLDispatchHandler*> dispatch_map_t;  	dispatch_map_t mHandlers; diff --git a/indra/llmessage/llregionflags.h b/indra/llmessage/llregionflags.h index e1ccd333f1..c13f39df9b 100644 --- a/indra/llmessage/llregionflags.h +++ b/indra/llmessage/llregionflags.h @@ -54,6 +54,9 @@ const U64 REGION_FLAGS_BLOCK_LAND_RESELL		= (1 << 7);  // All content wiped once per night  const U64 REGION_FLAGS_SANDBOX					= (1 << 8); + +const U64 REGION_FLAGS_ALLOW_ENVIRONMENT_OVERRIDE = (1 << 9); +  const U64 REGION_FLAGS_SKIP_COLLISIONS			= (1 << 12); // Pin all non agent rigid bodies  const U64 REGION_FLAGS_SKIP_SCRIPTS				= (1 << 13);  const U64 REGION_FLAGS_SKIP_PHYSICS				= (1 << 14); // Skip all physics diff --git a/indra/llmessage/message_prehash.cpp b/indra/llmessage/message_prehash.cpp index f8e11e324e..fba5b7453d 100644 --- a/indra/llmessage/message_prehash.cpp +++ b/indra/llmessage/message_prehash.cpp @@ -1376,7 +1376,9 @@ char const* const _PREHASH_RegionDenyAgeUnverified = LLMessageStringTable::getIn  char const* const _PREHASH_AgeVerificationBlock = LLMessageStringTable::getInstance()->getString("AgeVerificationBlock");  char const* const _PREHASH_RegionAllowAccessBlock = LLMessageStringTable::getInstance()->getString("RegionAllowAccessBlock");  char const* const _PREHASH_RegionAllowAccessOverride = LLMessageStringTable::getInstance()->getString("RegionAllowAccessOverride"); - +char const* const _PREHASH_ParcelEnvironmentBlock = LLMessageStringTable::getInstance()->getString("ParcelEnvironmentBlock"); +char const* const _PREHASH_ParcelEnvironmentVersion = LLMessageStringTable::getInstance()->getString("ParcelEnvironmentVersion"); +char const* const _PREHASH_RegionAllowEnvironmentOverride = LLMessageStringTable::getInstance()->getString("RegionAllowEnvironmentOverride");  char const* const _PREHASH_UCoord = LLMessageStringTable::getInstance()->getString("UCoord");  char const* const _PREHASH_VCoord = LLMessageStringTable::getInstance()->getString("VCoord");  char const* const _PREHASH_FaceIndex = LLMessageStringTable::getInstance()->getString("FaceIndex"); @@ -1392,3 +1394,4 @@ char const* const _PREHASH_AppearanceHover = LLMessageStringTable::getInstance()  char const* const _PREHASH_HoverHeight = LLMessageStringTable::getInstance()->getString("HoverHeight");  char const* const _PREHASH_Experience = LLMessageStringTable::getInstance()->getString("Experience");  char const* const _PREHASH_ExperienceID = LLMessageStringTable::getInstance()->getString("ExperienceID"); +char const* const _PREHASH_LargeGenericMessage = LLMessageStringTable::getInstance()->getString("LargeGenericMessage"); diff --git a/indra/llmessage/message_prehash.h b/indra/llmessage/message_prehash.h index 334236fb25..4f72c01ddf 100644 --- a/indra/llmessage/message_prehash.h +++ b/indra/llmessage/message_prehash.h @@ -1376,6 +1376,9 @@ extern char const* const _PREHASH_RegionDenyAgeUnverified;  extern char const* const _PREHASH_AgeVerificationBlock;  extern char const* const _PREHASH_RegionAllowAccessBlock;  extern char const* const _PREHASH_RegionAllowAccessOverride; +extern char const* const _PREHASH_ParcelEnvironmentBlock; +extern char const* const _PREHASH_ParcelEnvironmentVersion; +extern char const* const _PREHASH_RegionAllowEnvironmentOverride;  extern char const* const _PREHASH_UCoord;  extern char const* const _PREHASH_VCoord;  extern char const* const _PREHASH_FaceIndex; @@ -1391,4 +1394,6 @@ extern char const* const _PREHASH_AppearanceHover;  extern char const* const _PREHASH_HoverHeight;  extern char const* const _PREHASH_Experience;  extern char const* const _PREHASH_ExperienceID; +extern char const* const _PREHASH_LargeGenericMessage; +  #endif | 
