Baker Linden's group update, added with some care, won't compile,

Note: These changesets removed the some caps in llviewerregion.cpp, I have made a note of these, but left them in.
Please take a look at the Singu Note:'s and Singu: TODO:'s when working on this.
This commit is contained in:
Lirusaito
2012-12-04 03:53:05 -05:00
parent b9cfd2fae5
commit 922e234fe9
6 changed files with 207 additions and 23 deletions

View File

@@ -36,6 +36,7 @@
#include <vector>
#include <algorithm>
#include "llappviewer.h" //For gFrameCount
#include "llagent.h"
#include "llui.h"
#include "message.h"
@@ -44,6 +45,7 @@
#include "llstatusbar.h"
#include "lleconomy.h"
#include "llviewercontrol.h"
#include "llviewerregion.h"
#include "llviewerwindow.h"
#include "llfloaterdirectory.h"
#include "llfloatergroupinfo.h"
@@ -821,6 +823,7 @@ void LLGroupMgrGroupData::cancelRoleChanges()
LLGroupMgr::LLGroupMgr()
{
mLastGroupMembersRequestFrame = 0;
}
LLGroupMgr::~LLGroupMgr()
@@ -1885,6 +1888,184 @@ void LLGroupMgr::sendGroupMemberEjects(const LLUUID& group_id,
}
}
// Responder class for capability group management
class GroupMemberDataResponder : public LLHTTPClient::Responder
{ //Singu: TODO: make this comply with CT3 standards and compile
public:
GroupMemberDataResponder() {}
virtual ~GroupMemberDataResponder() {}
virtual void result(const LLSD& pContent);
virtual void error(U32 pStatus, const std::string& pReason);
private:
LLSD mMemberData;
};
void GroupMemberDataResponder::error(U32 pStatus, const std::string& pReason)
{
LL_WARNS("GrpMgr") << "Error receiving group member data." << LL_ENDL;
}
void GroupMemberDataResponder::result(const LLSD& content)
{
LLGroupMgr::processCapGroupMembersRequest(content);
}
// static
void LLGroupMgr::sendCapGroupMembersRequest(const LLUUID& group_id)
{
// Have we requested the information already this frame?
if (mLastGroupMembersRequestFrame == gFrameCount)
return;
LLViewerRegion* currentRegion = gAgent.getRegion();
// Thank you FS:Ansariel!
if (!currentRegion)
{
LL_WARNS("GrpMgr") << "Agent does not have a current region. Uh-oh!" << LL_ENDL;
return;
}
// Check to make sure we have our capabilities
if (!currentRegion->capabilitiesReceived())
{
LL_WARNS("GrpMgr") << " Capabilities not received!" << LL_ENDL;
return;
}
// Get our capability
std::string cap_url = currentRegion->getCapability("GroupMemberData");
// Thank you FS:Ansariel!
if (cap_url.empty())
{
LL_INFOS("GrpMgr") << "Region has no GroupMemberData capability. Falling back to UDP fetch." << LL_ENDL;
sendGroupMembersRequest(group_id);
return;
}
// Post to our service. Add a body containing the group_id.
LLSD body = LLSD::emptyMap();
body["group_id"] = group_id;
LLHTTPClient::ResponderPtr grp_data_responder = new GroupMemberDataResponder();
//Singu: TODO: make this timeout after 5 minutes somehow.. AIHTTPTimeoutPolicy?
// This could take a while to finish, timeout after 5 minutes.
//LLHTTPClient::post(cap_url, body, grp_data_responder, LLSD(), 300);
LLHTTPClient::post(cap_url, body, grp_data_responder);
mLastGroupMembersRequestFrame = gFrameCount;
}
// static
void LLGroupMgr::processCapGroupMembersRequest(const LLSD& content)
{
// Did we get anything in content?
if (!content.size())
{
LL_DEBUGS("GrpMgr") << "No group member data received." << LL_ENDL;
return;
}
// If we have no members, there's no reason to do anything else
S32 num_members = content["member_count"];
if (num_members < 1)
return;
LLUUID group_id = content["group_id"].asUUID();
LLGroupMgrGroupData* group_datap = LLGroupMgr::getInstance()->getGroupData(group_id);
if (!group_datap)
{
LL_WARNS("GrpMgr") << "Received incorrect, possibly stale, group or request id" << LL_ENDL;
return;
}
group_datap->mMemberCount = num_members;
LLSD member_list = content["members"];
LLSD titles = content["titles"];
LLSD defaults = content["defaults"];
std::string online_status;
std::string title;
S32 contribution;
U64 member_powers;
// If this is changed to a bool, make sure to change the LLGroupMemberData constructor
BOOL is_owner;
// Compute this once, rather than every time.
U64 default_powers = llstrtou64(defaults["default_powers"].asString().c_str(), NULL, 16);
LLSD::map_const_iterator member_iter_start = member_list.beginMap();
LLSD::map_const_iterator member_iter_end = member_list.endMap();
for ( ; member_iter_start != member_iter_end; ++member_iter_start)
{
// Reset defaults
online_status = "unknown";
title = titles[0].asString();
contribution = 0;
member_powers = default_powers;
is_owner = false;
const LLUUID member_id(member_iter_start->first);
LLSD member_info = member_iter_start->second;
if (member_info.has("last_login"))
{
online_status = member_info["last_login"].asString();
if (online_status == "Online")
online_status = LLTrans::getString("group_member_status_online");
else
formatDateString(online_status);
}
if (member_info.has("title"))
title = titles[member_info["title"].asInteger()].asString();
if (member_info.has("powers"))
member_powers = llstrtou64(member_info["powers"].asString().c_str(), NULL, 16);
if (member_info.has("donated_square_meters"))
contribution = member_info["donated_square_meters"];
if (member_info.has("owner"))
is_owner = true;
LLGroupMemberData* data = new LLGroupMemberData(member_id,
contribution,
member_powers,
title,
online_status,
is_owner);
group_datap->mMembers[member_id] = data;
}
// Technically, we have this data, but to prevent completely overhauling
// this entire system (it would be nice, but I don't have the time),
// I'm going to be dumb and just call services I most likely don't need
// with the thought being that the system might need it to be done.
//
// TODO: Refactor to reduce multiple calls for data we already have.
if (group_datap->mTitles.size() < 1)
LLGroupMgr::getInstance()->sendGroupTitlesRequest(group_id);
group_datap->mMemberDataComplete = TRUE;
group_datap->mMemberRequestID.setNull();
// Make the role-member data request
if (group_datap->mPendingRoleMemberRequest)
{
group_datap->mPendingRoleMemberRequest = FALSE;
LLGroupMgr::getInstance()->sendGroupRoleMembersRequest(group_id);
}
group_datap->mChanged = TRUE;
LLGroupMgr::getInstance()->notifyObservers(GC_MEMBER_DATA);
}
void LLGroupMgr::sendGroupRoleChanges(const LLUUID& group_id)
{
lldebugs << "LLGroupMgr::sendGroupRoleChanges" << llendl;