diff options
Diffstat (limited to 'indra/newview/llpathfindingobject.cpp')
-rw-r--r-- | indra/newview/llpathfindingobject.cpp | 101 |
1 files changed, 82 insertions, 19 deletions
diff --git a/indra/newview/llpathfindingobject.cpp b/indra/newview/llpathfindingobject.cpp index cde3777414..858d3203c0 100644 --- a/indra/newview/llpathfindingobject.cpp +++ b/indra/newview/llpathfindingobject.cpp @@ -32,16 +32,17 @@ #include <string> -#include "v3math.h" #include "llavatarname.h" #include "llavatarnamecache.h" #include "llsd.h" #include "lluuid.h" +#include "v3math.h" -#define PATHFINDING_OBJECT_NAME_FIELD "name" -#define PATHFINDING_OBJECT_DESCRIPTION_FIELD "description" -#define PATHFINDING_OBJECT_OWNER_FIELD "owner" -#define PATHFINDING_OBJECT_POSITION_FIELD "position" +#define PATHFINDING_OBJECT_NAME_FIELD "name" +#define PATHFINDING_OBJECT_DESCRIPTION_FIELD "description" +#define PATHFINDING_OBJECT_OWNER_FIELD "owner" +#define PATHFINDING_OBJECT_POSITION_FIELD "position" +#define PATHFINDING_OBJECT_IS_GROUP_OWNED_FIELD "owner_is_group" //--------------------------------------------------------------------------- // LLPathfindingObject @@ -52,8 +53,12 @@ LLPathfindingObject::LLPathfindingObject() mName(), mDescription(), mOwnerUUID(), + mHasOwnerName(false), mOwnerName(), - mLocation() + mAvatarNameCacheConnection(), + mIsGroupOwned(false), + mLocation(), + mOwnerNameSignal() { } @@ -62,8 +67,12 @@ LLPathfindingObject::LLPathfindingObject(const std::string &pUUID, const LLSD &p mName(), mDescription(), mOwnerUUID(), + mHasOwnerName(false), mOwnerName(), - mLocation() + mAvatarNameCacheConnection(), + mIsGroupOwned(false), + mLocation(), + mOwnerNameSignal() { parseObjectData(pObjectData); } @@ -73,13 +82,19 @@ LLPathfindingObject::LLPathfindingObject(const LLPathfindingObject& pOther) mName(pOther.mName), mDescription(pOther.mDescription), mOwnerUUID(pOther.mOwnerUUID), - mOwnerName(pOther.mOwnerName), - mLocation(pOther.mLocation) + mHasOwnerName(false), + mOwnerName(), + mAvatarNameCacheConnection(), + mIsGroupOwned(pOther.mIsGroupOwned), + mLocation(pOther.mLocation), + mOwnerNameSignal() { + fetchOwnerName(); } LLPathfindingObject::~LLPathfindingObject() { + disconnectAvatarNameCacheConnection(); } LLPathfindingObject &LLPathfindingObject::operator =(const LLPathfindingObject& pOther) @@ -88,7 +103,8 @@ LLPathfindingObject &LLPathfindingObject::operator =(const LLPathfindingObject& mName = pOther.mName; mDescription = pOther.mDescription; mOwnerUUID = pOther.mOwnerUUID; - mOwnerName = pOther.mOwnerName; + fetchOwnerName(); + mIsGroupOwned = pOther.mIsGroupOwned; mLocation = pOther.mLocation; return *this; @@ -98,7 +114,7 @@ std::string LLPathfindingObject::getOwnerName() const { std::string ownerName; - if (hasOwnerName()) + if (hasOwner()) { ownerName = mOwnerName.getCompleteName(); } @@ -106,6 +122,23 @@ std::string LLPathfindingObject::getOwnerName() const return ownerName; } +LLPathfindingObject::name_connection_t LLPathfindingObject::registerOwnerNameListener(name_callback_t pOwnerNameCallback) +{ + llassert(hasOwner()); + + name_connection_t connection; + if (hasOwnerName()) + { + pOwnerNameCallback(this); + } + else + { + connection = mOwnerNameSignal.connect(pOwnerNameCallback); + } + + return connection; +} + void LLPathfindingObject::parseObjectData(const LLSD &pObjectData) { llassert(pObjectData.has(PATHFINDING_OBJECT_NAME_FIELD)); @@ -116,21 +149,51 @@ void LLPathfindingObject::parseObjectData(const LLSD &pObjectData) llassert(pObjectData.get(PATHFINDING_OBJECT_DESCRIPTION_FIELD).isString()); mDescription = pObjectData.get(PATHFINDING_OBJECT_DESCRIPTION_FIELD).asString(); -#ifdef SERVER_SIDE_OWNER_ROLLOUT_COMPLETE llassert(pObjectData.has(PATHFINDING_OBJECT_OWNER_FIELD)); llassert(pObjectData.get(PATHFINDING_OBJECT_OWNER_FIELD).isUUID()); mOwnerUUID = pObjectData.get(PATHFINDING_OBJECT_OWNER_FIELD).asUUID(); - LLAvatarNameCache::get(mOwnerUUID, &mOwnerName); -#else // SERVER_SIDE_OWNER_ROLLOUT_COMPLETE - if (pObjectData.has(PATHFINDING_OBJECT_OWNER_FIELD)) + fetchOwnerName(); + + if (pObjectData.has(PATHFINDING_OBJECT_IS_GROUP_OWNED_FIELD)) { - llassert(pObjectData.get(PATHFINDING_OBJECT_OWNER_FIELD).isUUID()); - mOwnerUUID = pObjectData.get(PATHFINDING_OBJECT_OWNER_FIELD).asUUID(); - LLAvatarNameCache::get(mOwnerUUID, &mOwnerName); + llassert(pObjectData.get(PATHFINDING_OBJECT_IS_GROUP_OWNED_FIELD).isBoolean()); + mIsGroupOwned = pObjectData.get(PATHFINDING_OBJECT_IS_GROUP_OWNED_FIELD).asBoolean(); } -#endif // SERVER_SIDE_OWNER_ROLLOUT_COMPLETE llassert(pObjectData.has(PATHFINDING_OBJECT_POSITION_FIELD)); llassert(pObjectData.get(PATHFINDING_OBJECT_POSITION_FIELD).isArray()); mLocation.setValue(pObjectData.get(PATHFINDING_OBJECT_POSITION_FIELD)); } + +void LLPathfindingObject::fetchOwnerName() +{ + mHasOwnerName = false; + if (hasOwner()) + { + mHasOwnerName = LLAvatarNameCache::get(mOwnerUUID, &mOwnerName); + if (!mHasOwnerName) + { + mAvatarNameCacheConnection = LLAvatarNameCache::get(mOwnerUUID, boost::bind(&LLPathfindingObject::handleAvatarNameFetch, this, _1, _2)); + } + } +} + +void LLPathfindingObject::handleAvatarNameFetch(const LLUUID &pOwnerUUID, const LLAvatarName &pAvatarName) +{ + llassert(mOwnerUUID == pOwnerUUID); + + mOwnerName = pAvatarName; + mHasOwnerName = true; + + disconnectAvatarNameCacheConnection(); + + mOwnerNameSignal(this); +} + +void LLPathfindingObject::disconnectAvatarNameCacheConnection() +{ + if (mAvatarNameCacheConnection.connected()) + { + mAvatarNameCacheConnection.disconnect(); + } +} |