summaryrefslogtreecommitdiff
path: root/indra/newview/llpathfindingobject.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'indra/newview/llpathfindingobject.cpp')
-rw-r--r--indra/newview/llpathfindingobject.cpp101
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();
+ }
+}