From de2ce3f51ff54e67017d765c95264c66211c89da Mon Sep 17 00:00:00 2001 From: Chris Baker Date: Thu, 23 Aug 2012 19:40:10 -0700 Subject: Start of getting WSGI service on viewer --- indra/newview/llgroupmgr.cpp | 91 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) (limited to 'indra/newview/llgroupmgr.cpp') diff --git a/indra/newview/llgroupmgr.cpp b/indra/newview/llgroupmgr.cpp index aceb7f0614..3300034f7f 100644 --- a/indra/newview/llgroupmgr.cpp +++ b/indra/newview/llgroupmgr.cpp @@ -1500,6 +1500,10 @@ void LLGroupMgr::sendGroupMembersRequest(const LLUUID& group_id) } } + + + + void LLGroupMgr::sendGroupRoleDataRequest(const LLUUID& group_id) { lldebugs << "LLGroupMgr::sendGroupRoleDataRequest" << llendl; @@ -1832,6 +1836,93 @@ void LLGroupMgr::sendGroupMemberEjects(const LLUUID& group_id, } } + +////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////// +// STUBBED IN FOR code completion +class GroupMemberDataResponder : public LLHTTPClient::Responder +{ +public: + GroupMemberDataResponder() {} + virtual ~GroupMemberDataResponder() {} + virtual void result(const LLSD& pContent); + virtual void error(U32 pStatus, const std::string& pReason) {} +private: + LLSD mMemberData; +}; + +void GroupMemberDataResponder::result(const LLSD& pContent) +{ + LL_INFOS("BAKER") << "BAKER TAG ////////////////////////////////////////////////////////////////" << LL_ENDL; + // Did we get anything in pContent? + if(pContent.size()) + { + LL_INFOS("BAKER") << "Lik dis if u cry evertim" << LL_ENDL; + + // BAKER TODO: + // Figure out what to do with all the dataz. + // Looks like processGroupMembersReply does the work + LLUUID agent_id = pContent["agent_id"]; + LLUUID group_id = pContent["group_id"]; + LLSD member_list = pContent["members"]; + LLSD titles = pContent["titles"]; + LLSD defaults = pContent["defaults"]; + + int i = 0; + ++i; + + + + } + else + { + LL_INFOS("BAKER") << "WE AIN'T FOUND SHIT!" << LL_ENDL; + + // BAKER TODO: + // Handle this case + + } + LL_INFOS("BAKER") << "//////////////////////////////////////////////////////////////////////////\n" << LL_ENDL; +} + +////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////// + +////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////// +// BAKER +// static +void LLGroupMgr::sendCapGroupMembersRequest(const LLUUID& group_id) +{ + //sendGroupMembersRequest(group_id); + //return; + +#if 1 + LLViewerRegion* currentRegion = gAgent.getRegion(); + + // Check to make sure we have our capabilities + if(!currentRegion->capabilitiesReceived()) + { + LL_INFOS("BAKER") << " Capabilities not received! -- OSHITSON --" << LL_ENDL; + // BAKER TODO: Handle this! + } + + // Get our capability + std::string cap_url = currentRegion->getCapability("GroupMemberData"); + + // 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(); + // This could take a while to finish, timeout after 10 minutes. + LLHTTPClient::post(cap_url, body, grp_data_responder, LLSD(), 600); +#endif +} +////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////// + + void LLGroupMgr::sendGroupRoleChanges(const LLUUID& group_id) { lldebugs << "LLGroupMgr::sendGroupRoleChanges" << llendl; -- cgit v1.3 From 238ac6c0e869d1c8c380e3e7b70d4803c385f352 Mon Sep 17 00:00:00 2001 From: Chris Baker Date: Tue, 28 Aug 2012 17:32:01 -0700 Subject: Got viewer displaying new data format --- indra/newview/llgroupmgr.cpp | 142 ++++++++++++++++++++++++++++++++++--------- indra/newview/llgroupmgr.h | 2 + 2 files changed, 114 insertions(+), 30 deletions(-) (limited to 'indra/newview/llgroupmgr.cpp') diff --git a/indra/newview/llgroupmgr.cpp b/indra/newview/llgroupmgr.cpp index 3300034f7f..2e1d1d5c77 100644 --- a/indra/newview/llgroupmgr.cpp +++ b/indra/newview/llgroupmgr.cpp @@ -1851,38 +1851,13 @@ private: LLSD mMemberData; }; -void GroupMemberDataResponder::result(const LLSD& pContent) +void GroupMemberDataResponder::result(const LLSD& content) { LL_INFOS("BAKER") << "BAKER TAG ////////////////////////////////////////////////////////////////" << LL_ENDL; - // Did we get anything in pContent? - if(pContent.size()) - { - LL_INFOS("BAKER") << "Lik dis if u cry evertim" << LL_ENDL; - - // BAKER TODO: - // Figure out what to do with all the dataz. - // Looks like processGroupMembersReply does the work - LLUUID agent_id = pContent["agent_id"]; - LLUUID group_id = pContent["group_id"]; - LLSD member_list = pContent["members"]; - LLSD titles = pContent["titles"]; - LLSD defaults = pContent["defaults"]; - - int i = 0; - ++i; - - - - } - else - { - LL_INFOS("BAKER") << "WE AIN'T FOUND SHIT!" << LL_ENDL; - - // BAKER TODO: - // Handle this case - - } + LL_INFOS("BAKER") << "Got data from responder" << LL_ENDL; + LLGroupMgr::processCapGroupMembersRequest(content); LL_INFOS("BAKER") << "//////////////////////////////////////////////////////////////////////////\n" << LL_ENDL; + } ////////////////////////////////////////////////////////////////////////// @@ -1898,6 +1873,7 @@ void LLGroupMgr::sendCapGroupMembersRequest(const LLUUID& group_id) //return; #if 1 + LLViewerRegion* currentRegion = gAgent.getRegion(); // Check to make sure we have our capabilities @@ -1912,13 +1888,119 @@ void LLGroupMgr::sendCapGroupMembersRequest(const LLUUID& group_id) // Post to our service. Add a body containing the group_id. LLSD body = LLSD::emptyMap(); - body["group_id"] = group_id; + body["group_id"] = group_id; + // Session id? LLHTTPClient::ResponderPtr grp_data_responder = new GroupMemberDataResponder(); // This could take a while to finish, timeout after 10 minutes. LLHTTPClient::post(cap_url, body, grp_data_responder, LLSD(), 600); + #endif } + + +// static +void LLGroupMgr::processCapGroupMembersRequest(const LLSD& content) +{ + LL_INFOS("BAKER") << "BAKER TAG ////////////////////////////////////////////////////////////////" << LL_ENDL; + // Did we get anything in content? + if(!content.size()) + { + LL_INFOS("BAKER") << "WE AIN'T FOUND SHIT!" << LL_ENDL; + // BAKER TODO: + // Handle this case + } + + LL_INFOS("BAKER") << "Lik dis if u cry evertim" << LL_ENDL; + + // 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]; + contribution = 0; + member_powers = default_powers; + is_owner = false; + + const LLUUID member_id(member_iter_start->first); + LLSD member_info = member_iter_start->second; + + // Online Status + if(member_info.has("last_login")) + { + online_status = member_info["last_login"]; + if(online_status == "Online") + online_status = LLTrans::getString("group_member_status_online"); + else + formatDateString(online_status); + } + + // Title + if(member_info.has("title")) + title = titles[member_info["title"].asInteger()]; + + // Powers + if(member_info.has("powers")) + member_powers = llstrtou64(member_info["powers"].asString().c_str(), NULL, 16); + + // Land Contribution + 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; + } + + group_datap->mMemberDataComplete = TRUE; + group_datap->mRoleMemberDataComplete = TRUE; + group_datap->mMemberRequestID.setNull(); + group_datap->mChanged = TRUE; + LLGroupMgr::getInstance()->notifyObservers(GC_MEMBER_DATA); + + LL_INFOS("BAKER") << "//////////////////////////////////////////////////////////////////////////\n" << LL_ENDL; +} + ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// diff --git a/indra/newview/llgroupmgr.h b/indra/newview/llgroupmgr.h index 5b535f5056..b0c3cd025d 100644 --- a/indra/newview/llgroupmgr.h +++ b/indra/newview/llgroupmgr.h @@ -341,7 +341,9 @@ public: uuid_vec_t& member_ids); // BAKER + //static void sendCapGroupMembersRequest(const LLUUID& group_id); void sendCapGroupMembersRequest(const LLUUID& group_id); + static void processCapGroupMembersRequest(const LLSD& content); void cancelGroupRoleChanges(const LLUUID& group_id); -- cgit v1.3 From 7ecf3ce40f4ec27a43878a3a2192c97479d22fcf Mon Sep 17 00:00:00 2001 From: Chris Baker Date: Fri, 31 Aug 2012 17:53:47 -0700 Subject: - Fixed an issue where service was called twice in a frame - Changed level of output logs - Cleaned up comments --- indra/newview/llgroupmgr.cpp | 54 +++++++++++++++++------------------ indra/newview/llgroupmgr.h | 3 +- indra/newview/llpanelgroupgeneral.cpp | 16 ++++------- indra/newview/llpanelgroupinvite.cpp | 4 --- indra/newview/llpanelgrouproles.cpp | 12 -------- 5 files changed, 34 insertions(+), 55 deletions(-) (limited to 'indra/newview/llgroupmgr.cpp') diff --git a/indra/newview/llgroupmgr.cpp b/indra/newview/llgroupmgr.cpp index 2e1d1d5c77..b9bcedda13 100644 --- a/indra/newview/llgroupmgr.cpp +++ b/indra/newview/llgroupmgr.cpp @@ -36,6 +36,7 @@ #include #include +#include "llappviewer.h" #include "llagent.h" #include "llui.h" #include "message.h" @@ -745,6 +746,7 @@ void LLGroupMgrGroupData::cancelRoleChanges() LLGroupMgr::LLGroupMgr() { + mLastGroupMembersRequestFrame = 0; } LLGroupMgr::~LLGroupMgr() @@ -1501,9 +1503,6 @@ void LLGroupMgr::sendGroupMembersRequest(const LLUUID& group_id) } - - - void LLGroupMgr::sendGroupRoleDataRequest(const LLUUID& group_id) { lldebugs << "LLGroupMgr::sendGroupRoleDataRequest" << llendl; @@ -1839,7 +1838,7 @@ void LLGroupMgr::sendGroupMemberEjects(const LLUUID& group_id, ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// -// STUBBED IN FOR code completion +// I DON'T KNOW WHERE TO PUT THIS class GroupMemberDataResponder : public LLHTTPClient::Responder { public: @@ -1853,26 +1852,18 @@ private: void GroupMemberDataResponder::result(const LLSD& content) { - LL_INFOS("BAKER") << "BAKER TAG ////////////////////////////////////////////////////////////////" << LL_ENDL; - LL_INFOS("BAKER") << "Got data from responder" << LL_ENDL; LLGroupMgr::processCapGroupMembersRequest(content); - LL_INFOS("BAKER") << "//////////////////////////////////////////////////////////////////////////\n" << LL_ENDL; - } - -////////////////////////////////////////////////////////////////////////// -////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// -// BAKER + + // static void LLGroupMgr::sendCapGroupMembersRequest(const LLUUID& group_id) { - //sendGroupMembersRequest(group_id); - //return; - -#if 1 + // Have we requested the information already this frame? + if(mLastGroupMembersRequestFrame == gFrameCount) + return; LLViewerRegion* currentRegion = gAgent.getRegion(); @@ -1895,24 +1886,20 @@ void LLGroupMgr::sendCapGroupMembersRequest(const LLUUID& group_id) // This could take a while to finish, timeout after 10 minutes. LLHTTPClient::post(cap_url, body, grp_data_responder, LLSD(), 600); -#endif + mLastGroupMembersRequestFrame = gFrameCount; } // static void LLGroupMgr::processCapGroupMembersRequest(const LLSD& content) { - LL_INFOS("BAKER") << "BAKER TAG ////////////////////////////////////////////////////////////////" << LL_ENDL; // Did we get anything in content? if(!content.size()) { - LL_INFOS("BAKER") << "WE AIN'T FOUND SHIT!" << LL_ENDL; // BAKER TODO: - // Handle this case + // Maybe display a popup saying something went wrong? } - LL_INFOS("BAKER") << "Lik dis if u cry evertim" << LL_ENDL; - // If we have no members, there's no reason to do anything else S32 num_members = content["member_count"]; if(num_members < 1) @@ -1979,6 +1966,7 @@ void LLGroupMgr::processCapGroupMembersRequest(const LLSD& content) if(member_info.has("donated_square_meters")) contribution = member_info["donated_square_meters"]; + // Owner Flag if(member_info.has("owner")) is_owner = true; @@ -1992,18 +1980,28 @@ void LLGroupMgr::processCapGroupMembersRequest(const LLSD& content) 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. + if(group_datap->mTitles.size() < 1) + LLGroupMgr::getInstance()->sendGroupTitlesRequest(group_id); + + group_datap->mMemberDataComplete = TRUE; - group_datap->mRoleMemberDataComplete = 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); - LL_INFOS("BAKER") << "//////////////////////////////////////////////////////////////////////////\n" << LL_ENDL; } -////////////////////////////////////////////////////////////////////////// -////////////////////////////////////////////////////////////////////////// - void LLGroupMgr::sendGroupRoleChanges(const LLUUID& group_id) { diff --git a/indra/newview/llgroupmgr.h b/indra/newview/llgroupmgr.h index b0c3cd025d..62b2978f21 100644 --- a/indra/newview/llgroupmgr.h +++ b/indra/newview/llgroupmgr.h @@ -341,7 +341,6 @@ public: uuid_vec_t& member_ids); // BAKER - //static void sendCapGroupMembersRequest(const LLUUID& group_id); void sendCapGroupMembersRequest(const LLUUID& group_id); static void processCapGroupMembersRequest(const LLSD& content); @@ -380,6 +379,8 @@ private: typedef std::set observer_set_t; typedef std::map observer_map_t; observer_map_t mParticularObservers; + + S32 mLastGroupMembersRequestFrame; }; diff --git a/indra/newview/llpanelgroupgeneral.cpp b/indra/newview/llpanelgroupgeneral.cpp index fa5f5574dc..5b1c15ca45 100644 --- a/indra/newview/llpanelgroupgeneral.cpp +++ b/indra/newview/llpanelgroupgeneral.cpp @@ -317,10 +317,6 @@ void LLPanelGroupGeneral::activate() if (!gdatap || !gdatap->isMemberDataComplete() ) { - ////////////////////////////////////////////////////////////////////////// - // BAKER TODO: - // Use cap here! - ////////////////////////////////////////////////////////////////////////// LLGroupMgr::getInstance()->sendCapGroupMembersRequest(mGroupID); //LLGroupMgr::getInstance()->sendGroupMembersRequest(mGroupID); } @@ -719,7 +715,7 @@ void LLPanelGroupGeneral::updateMembers() for( ; mMemberProgress != gdatap->mMembers.end() && ifirst << ", " << mMemberProgress->second->getTitle() << llendl; + lldebugs << "Adding " << mMemberProgress->first << ", " << mMemberProgress->second->getTitle() << llendl; LLGroupMemberData* member = mMemberProgress->second; if (!member) { @@ -763,15 +759,15 @@ void LLPanelGroupGeneral::updateMembers() } sAllTime += all_timer.getElapsedTimeF32(); - llinfos << "Updated " << i << " of " << UPDATE_MEMBERS_PER_FRAME << "members in the list." << llendl; + lldebugs << "Updated " << i << " of " << UPDATE_MEMBERS_PER_FRAME << "members in the list." << llendl; if (mMemberProgress == gdatap->mMembers.end()) { - llinfos << " member list completed." << llendl; + lldebugs << " member list completed." << llendl; mListVisibleMembers->setEnabled(TRUE); - llinfos << "All Time: " << sAllTime << llendl; - llinfos << "SD Time: " << sSDTime << llendl; - llinfos << "Element Time: " << sElementTime << llendl; + lldebugs << "All Time: " << sAllTime << llendl; + lldebugs << "SD Time: " << sSDTime << llendl; + lldebugs << "Element Time: " << sElementTime << llendl; } else { diff --git a/indra/newview/llpanelgroupinvite.cpp b/indra/newview/llpanelgroupinvite.cpp index f05358bf59..f1ba84ec36 100644 --- a/indra/newview/llpanelgroupinvite.cpp +++ b/indra/newview/llpanelgroupinvite.cpp @@ -571,10 +571,6 @@ void LLPanelGroupInvite::updateLists() { LLGroupMgr::getInstance()->sendGroupPropertiesRequest(mImplementation->mGroupID); - ////////////////////////////////////////////////////////////////////////// - // BAKER TODO: - // Use cap here! - ////////////////////////////////////////////////////////////////////////// LLGroupMgr::getInstance()->sendCapGroupMembersRequest(mImplementation->mGroupID); //LLGroupMgr::getInstance()->sendGroupMembersRequest(mImplementation->mGroupID); diff --git a/indra/newview/llpanelgrouproles.cpp b/indra/newview/llpanelgrouproles.cpp index 9b0fb37693..0e40224346 100644 --- a/indra/newview/llpanelgrouproles.cpp +++ b/indra/newview/llpanelgrouproles.cpp @@ -356,10 +356,6 @@ void LLPanelGroupRoles::activate() if (!gdatap || !gdatap->isMemberDataComplete() ) { - ////////////////////////////////////////////////////////////////////////// - // BAKER TODO: - // Use cap here! - ////////////////////////////////////////////////////////////////////////// LLGroupMgr::getInstance()->sendCapGroupMembersRequest(mGroupID); //LLGroupMgr::getInstance()->sendGroupMembersRequest(mGroupID); } @@ -1992,10 +1988,6 @@ void LLPanelGroupRolesSubTab::update(LLGroupChange gc) if (!gdatap || !gdatap->isMemberDataComplete()) { - ////////////////////////////////////////////////////////////////////////// - // BAKER TODO: - // Use cap here! - ////////////////////////////////////////////////////////////////////////// LLGroupMgr::getInstance()->sendCapGroupMembersRequest(mGroupID); //LLGroupMgr::getInstance()->sendGroupMembersRequest(mGroupID); } @@ -2590,10 +2582,6 @@ void LLPanelGroupActionsSubTab::handleActionSelect() } else { - ////////////////////////////////////////////////////////////////////////// - // BAKER TODO: - // Use cap here! - ////////////////////////////////////////////////////////////////////////// LLGroupMgr::getInstance()->sendCapGroupMembersRequest(mGroupID); //LLGroupMgr::getInstance()->sendGroupMembersRequest(mGroupID); } -- cgit v1.3 From 5dfbc62c1bbab145b1f1b826833c0e485fc73250 Mon Sep 17 00:00:00 2001 From: Chris Baker Date: Tue, 4 Sep 2012 10:54:16 -0700 Subject: Cleaned up comments --- indra/newview/llgroupmgr.cpp | 25 ++++++++----------------- 1 file changed, 8 insertions(+), 17 deletions(-) (limited to 'indra/newview/llgroupmgr.cpp') diff --git a/indra/newview/llgroupmgr.cpp b/indra/newview/llgroupmgr.cpp index b9bcedda13..7a738bd9ea 100644 --- a/indra/newview/llgroupmgr.cpp +++ b/indra/newview/llgroupmgr.cpp @@ -1836,9 +1836,7 @@ void LLGroupMgr::sendGroupMemberEjects(const LLUUID& group_id, } -////////////////////////////////////////////////////////////////////////// -////////////////////////////////////////////////////////////////////////// -// I DON'T KNOW WHERE TO PUT THIS +// Responder class for capability group management class GroupMemberDataResponder : public LLHTTPClient::Responder { public: @@ -1854,8 +1852,6 @@ void GroupMemberDataResponder::result(const LLSD& content) { LLGroupMgr::processCapGroupMembersRequest(content); } -////////////////////////////////////////////////////////////////////////// -////////////////////////////////////////////////////////////////////////// // static @@ -1870,8 +1866,8 @@ void LLGroupMgr::sendCapGroupMembersRequest(const LLUUID& group_id) // Check to make sure we have our capabilities if(!currentRegion->capabilitiesReceived()) { - LL_INFOS("BAKER") << " Capabilities not received! -- OSHITSON --" << LL_ENDL; - // BAKER TODO: Handle this! + LL_INFOS("BAKER") << " Capabilities not received!" << LL_ENDL; + return; } // Get our capability @@ -1880,10 +1876,10 @@ void LLGroupMgr::sendCapGroupMembersRequest(const LLUUID& group_id) // Post to our service. Add a body containing the group_id. LLSD body = LLSD::emptyMap(); body["group_id"] = group_id; - // Session id? LLHTTPClient::ResponderPtr grp_data_responder = new GroupMemberDataResponder(); - // This could take a while to finish, timeout after 10 minutes. + + // This could take a while to finish, timeout after 10 minutes. LLHTTPClient::post(cap_url, body, grp_data_responder, LLSD(), 600); mLastGroupMembersRequestFrame = gFrameCount; @@ -1896,8 +1892,8 @@ void LLGroupMgr::processCapGroupMembersRequest(const LLSD& content) // Did we get anything in content? if(!content.size()) { - // BAKER TODO: - // Maybe display a popup saying something went wrong? + LL_DEBUGS("GrpMgr") << "No group member data received." << LL_ENDL; + return; } // If we have no members, there's no reason to do anything else @@ -1943,8 +1939,7 @@ void LLGroupMgr::processCapGroupMembersRequest(const LLSD& content) const LLUUID member_id(member_iter_start->first); LLSD member_info = member_iter_start->second; - - // Online Status + if(member_info.has("last_login")) { online_status = member_info["last_login"]; @@ -1954,19 +1949,15 @@ void LLGroupMgr::processCapGroupMembersRequest(const LLSD& content) formatDateString(online_status); } - // Title if(member_info.has("title")) title = titles[member_info["title"].asInteger()]; - // Powers if(member_info.has("powers")) member_powers = llstrtou64(member_info["powers"].asString().c_str(), NULL, 16); - // Land Contribution if(member_info.has("donated_square_meters")) contribution = member_info["donated_square_meters"]; - // Owner Flag if(member_info.has("owner")) is_owner = true; -- cgit v1.3 From e459024c8283a26a1aefce0db65e0d7dd2c7e16d Mon Sep 17 00:00:00 2001 From: Baker Linden Date: Wed, 5 Sep 2012 15:55:34 -0700 Subject: [MAINT-513] Large group management - Reduced the timeout to 5 minutes, down from 10 minutes. - Provided output for GroupMemberResponder error - Removed commented calls to sendGroupMembersRequest - Reordered calls to sendCapGroupMembersRequest so it's called last --- indra/newview/llgroupmgr.cpp | 16 ++++++++++++---- indra/newview/llpanelgroupgeneral.cpp | 2 -- indra/newview/llpanelgroupinvite.cpp | 5 +---- indra/newview/llpanelgrouproles.cpp | 3 --- 4 files changed, 13 insertions(+), 13 deletions(-) (limited to 'indra/newview/llgroupmgr.cpp') diff --git a/indra/newview/llgroupmgr.cpp b/indra/newview/llgroupmgr.cpp index 7a738bd9ea..3fed8bb9b0 100644 --- a/indra/newview/llgroupmgr.cpp +++ b/indra/newview/llgroupmgr.cpp @@ -1843,11 +1843,16 @@ public: GroupMemberDataResponder() {} virtual ~GroupMemberDataResponder() {} virtual void result(const LLSD& pContent); - virtual void error(U32 pStatus, const std::string& pReason) {} + 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); @@ -1866,7 +1871,7 @@ void LLGroupMgr::sendCapGroupMembersRequest(const LLUUID& group_id) // Check to make sure we have our capabilities if(!currentRegion->capabilitiesReceived()) { - LL_INFOS("BAKER") << " Capabilities not received!" << LL_ENDL; + LL_WARNS("GrpMgr") << " Capabilities not received!" << LL_ENDL; return; } @@ -1879,8 +1884,8 @@ void LLGroupMgr::sendCapGroupMembersRequest(const LLUUID& group_id) LLHTTPClient::ResponderPtr grp_data_responder = new GroupMemberDataResponder(); - // This could take a while to finish, timeout after 10 minutes. - LLHTTPClient::post(cap_url, body, grp_data_responder, LLSD(), 600); + // This could take a while to finish, timeout after 5 minutes. + LLHTTPClient::post(cap_url, body, grp_data_responder, LLSD(), 300); mLastGroupMembersRequestFrame = gFrameCount; } @@ -1975,6 +1980,9 @@ void LLGroupMgr::processCapGroupMembersRequest(const LLSD& content) // 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); diff --git a/indra/newview/llpanelgroupgeneral.cpp b/indra/newview/llpanelgroupgeneral.cpp index 5b1c15ca45..f6ce7de47e 100644 --- a/indra/newview/llpanelgroupgeneral.cpp +++ b/indra/newview/llpanelgroupgeneral.cpp @@ -313,12 +313,10 @@ void LLPanelGroupGeneral::activate() { LLGroupMgr::getInstance()->sendGroupTitlesRequest(mGroupID); LLGroupMgr::getInstance()->sendGroupPropertiesRequest(mGroupID); - if (!gdatap || !gdatap->isMemberDataComplete() ) { LLGroupMgr::getInstance()->sendCapGroupMembersRequest(mGroupID); - //LLGroupMgr::getInstance()->sendGroupMembersRequest(mGroupID); } mFirstUse = FALSE; diff --git a/indra/newview/llpanelgroupinvite.cpp b/indra/newview/llpanelgroupinvite.cpp index f1ba84ec36..1ed8d8cf03 100644 --- a/indra/newview/llpanelgroupinvite.cpp +++ b/indra/newview/llpanelgroupinvite.cpp @@ -570,11 +570,8 @@ void LLPanelGroupInvite::updateLists() if (!mPendingUpdate) { LLGroupMgr::getInstance()->sendGroupPropertiesRequest(mImplementation->mGroupID); - - LLGroupMgr::getInstance()->sendCapGroupMembersRequest(mImplementation->mGroupID); - //LLGroupMgr::getInstance()->sendGroupMembersRequest(mImplementation->mGroupID); - LLGroupMgr::getInstance()->sendGroupRoleDataRequest(mImplementation->mGroupID); + LLGroupMgr::getInstance()->sendCapGroupMembersRequest(mImplementation->mGroupID); } mPendingUpdate = TRUE; } diff --git a/indra/newview/llpanelgrouproles.cpp b/indra/newview/llpanelgrouproles.cpp index 0e40224346..bbe47ae943 100644 --- a/indra/newview/llpanelgrouproles.cpp +++ b/indra/newview/llpanelgrouproles.cpp @@ -357,7 +357,6 @@ void LLPanelGroupRoles::activate() if (!gdatap || !gdatap->isMemberDataComplete() ) { LLGroupMgr::getInstance()->sendCapGroupMembersRequest(mGroupID); - //LLGroupMgr::getInstance()->sendGroupMembersRequest(mGroupID); } // Check role data. @@ -1989,7 +1988,6 @@ void LLPanelGroupRolesSubTab::update(LLGroupChange gc) if (!gdatap || !gdatap->isMemberDataComplete()) { LLGroupMgr::getInstance()->sendCapGroupMembersRequest(mGroupID); - //LLGroupMgr::getInstance()->sendGroupMembersRequest(mGroupID); } if (!gdatap || !gdatap->isRoleMemberDataComplete()) @@ -2583,7 +2581,6 @@ void LLPanelGroupActionsSubTab::handleActionSelect() else { LLGroupMgr::getInstance()->sendCapGroupMembersRequest(mGroupID); - //LLGroupMgr::getInstance()->sendGroupMembersRequest(mGroupID); } if (gdatap->isRoleDataComplete()) -- cgit v1.3 From c30ecf2ebd6ff6b6b4def9da25aea2b4c975328d Mon Sep 17 00:00:00 2001 From: Baker Linden Date: Thu, 6 Sep 2012 15:19:05 -0700 Subject: Added explicit casting for Linux build, hopefully making it work. --- indra/newview/llgroupmgr.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'indra/newview/llgroupmgr.cpp') diff --git a/indra/newview/llgroupmgr.cpp b/indra/newview/llgroupmgr.cpp index 3fed8bb9b0..9841eda625 100644 --- a/indra/newview/llgroupmgr.cpp +++ b/indra/newview/llgroupmgr.cpp @@ -1937,7 +1937,7 @@ void LLGroupMgr::processCapGroupMembersRequest(const LLSD& content) { // Reset defaults online_status = "unknown"; - title = titles[0]; + title = (std::string)titles[0]; contribution = 0; member_powers = default_powers; is_owner = false; @@ -1947,7 +1947,7 @@ void LLGroupMgr::processCapGroupMembersRequest(const LLSD& content) if(member_info.has("last_login")) { - online_status = member_info["last_login"]; + online_status = (std::string)member_info["last_login"]; if(online_status == "Online") online_status = LLTrans::getString("group_member_status_online"); else @@ -1955,7 +1955,7 @@ void LLGroupMgr::processCapGroupMembersRequest(const LLSD& content) } if(member_info.has("title")) - title = titles[member_info["title"].asInteger()]; + title = (std::string)titles[member_info["title"].asInteger()]; if(member_info.has("powers")) member_powers = llstrtou64(member_info["powers"].asString().c_str(), NULL, 16); -- cgit v1.3 From 5520bebaeb486462a3482173ccc8518d9158e0d5 Mon Sep 17 00:00:00 2001 From: Baker Linden Date: Thu, 6 Sep 2012 16:00:59 -0700 Subject: Do the proper fix this time... --- indra/newview/llgroupmgr.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'indra/newview/llgroupmgr.cpp') diff --git a/indra/newview/llgroupmgr.cpp b/indra/newview/llgroupmgr.cpp index 9841eda625..9c0a30e689 100644 --- a/indra/newview/llgroupmgr.cpp +++ b/indra/newview/llgroupmgr.cpp @@ -1937,7 +1937,7 @@ void LLGroupMgr::processCapGroupMembersRequest(const LLSD& content) { // Reset defaults online_status = "unknown"; - title = (std::string)titles[0]; + title = titles[0].asString(); contribution = 0; member_powers = default_powers; is_owner = false; @@ -1947,7 +1947,7 @@ void LLGroupMgr::processCapGroupMembersRequest(const LLSD& content) if(member_info.has("last_login")) { - online_status = (std::string)member_info["last_login"]; + online_status = member_info["last_login"].asString(); if(online_status == "Online") online_status = LLTrans::getString("group_member_status_online"); else @@ -1955,7 +1955,7 @@ void LLGroupMgr::processCapGroupMembersRequest(const LLSD& content) } if(member_info.has("title")) - title = (std::string)titles[member_info["title"].asInteger()]; + title = titles[member_info["title"].asInteger()].asString(); if(member_info.has("powers")) member_powers = llstrtou64(member_info["powers"].asString().c_str(), NULL, 16); -- cgit v1.3 From a905f7c74ee35ac16237311eb1d0fbda6577aadb Mon Sep 17 00:00:00 2001 From: Chris Baker Date: Wed, 3 Oct 2012 21:16:04 +0000 Subject: - Fixed an issue where group list wouldn't fall back to UDP if the region doesn't support the new GroupMemberData capabaility - Fixed a potential null pointer crash. Thanks to Ansariel from Firestorm for these! Reviewer: Myself --- indra/newview/llgroupmgr.cpp | 14 ++++++++++++++ 1 file changed, 14 insertions(+) (limited to 'indra/newview/llgroupmgr.cpp') diff --git a/indra/newview/llgroupmgr.cpp b/indra/newview/llgroupmgr.cpp index 9c0a30e689..6916cf813a 100644 --- a/indra/newview/llgroupmgr.cpp +++ b/indra/newview/llgroupmgr.cpp @@ -1867,6 +1867,12 @@ void LLGroupMgr::sendCapGroupMembersRequest(const LLUUID& group_id) 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()) @@ -1878,6 +1884,14 @@ void LLGroupMgr::sendCapGroupMembersRequest(const LLUUID& group_id) // 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; -- cgit v1.3 From 5c22524f29e4ab1f287f0e443bbdbea2f516c0d2 Mon Sep 17 00:00:00 2001 From: Kelly Washington Date: Mon, 3 Dec 2012 16:37:05 -0800 Subject: MAINT-1979 Viewer crashes while attempting to join group in the moment of loading group members * Fix one race condition that could dereference a dangling pointer. reviewed with Simon and Baker. --- indra/newview/llgroupmgr.cpp | 14 ++++++++---- indra/newview/llgroupmgr.h | 5 +++++ indra/newview/llpanelgroupgeneral.cpp | 13 ++++++----- indra/newview/llpanelgroupgeneral.h | 3 +-- indra/newview/llpanelgrouproles.cpp | 41 ++++++++++++++++------------------- indra/newview/llpanelgrouproles.h | 7 ++---- 6 files changed, 45 insertions(+), 38 deletions(-) (limited to 'indra/newview/llgroupmgr.cpp') diff --git a/indra/newview/llgroupmgr.cpp b/indra/newview/llgroupmgr.cpp index 6916cf813a..81eb1d397e 100644 --- a/indra/newview/llgroupmgr.cpp +++ b/indra/newview/llgroupmgr.cpp @@ -238,6 +238,7 @@ LLGroupMgrGroupData::LLGroupMgrGroupData(const LLUUID& id) : mPendingRoleMemberRequest(FALSE), mAccessTime(0.0f) { + mMemberVersion.generate(); } void LLGroupMgrGroupData::setAccessed() @@ -318,14 +319,14 @@ void LLGroupMgrGroupData::setRoleData(const LLUUID& role_id, LLRoleData role_dat role_data.mChangeType = RC_UPDATE_DATA; } else - { + { role_data.mChangeType = RC_UPDATE_POWERS; } mRoleChanges[role_id] = role_data; } else - { + { llwarns << "Change being made to non-existant role " << role_id << llendl; } } @@ -424,6 +425,7 @@ void LLGroupMgrGroupData::removeMemberData() } mMembers.clear(); mMemberDataComplete = FALSE; + mMemberVersion.generate(); } void LLGroupMgrGroupData::removeRoleData() @@ -945,6 +947,8 @@ void LLGroupMgr::processGroupMembersReply(LLMessageSystem* msg, void** data) } } + group_datap->mMemberVersion.generate(); + if (group_datap->mMembers.size() == (U32)group_datap->mMemberCount) { group_datap->mMemberDataComplete = TRUE; @@ -1771,8 +1775,6 @@ void LLGroupMgr::sendGroupMemberEjects(const LLUUID& group_id, bool start_message = true; LLMessageSystem* msg = gMessageSystem; - - LLGroupMgrGroupData* group_datap = LLGroupMgr::getInstance()->getGroupData(group_id); if (!group_datap) return; @@ -1833,6 +1835,8 @@ void LLGroupMgr::sendGroupMemberEjects(const LLUUID& group_id, { gAgent.sendReliableMessage(); } + + group_datap->mMemberVersion.generate(); } @@ -1990,6 +1994,8 @@ void LLGroupMgr::processCapGroupMembersRequest(const LLSD& content) group_datap->mMembers[member_id] = data; } + group_datap->mMemberVersion.generate(); + // 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 diff --git a/indra/newview/llgroupmgr.h b/indra/newview/llgroupmgr.h index 62b2978f21..d8c1ab7ef5 100644 --- a/indra/newview/llgroupmgr.h +++ b/indra/newview/llgroupmgr.h @@ -236,6 +236,8 @@ public: F32 getAccessTime() const { return mAccessTime; } void setAccessed(); + const LLUUID& getMemberVersion() const { return mMemberVersion; } + public: typedef std::map member_list_t; typedef std::map role_list_t; @@ -284,6 +286,9 @@ private: BOOL mPendingRoleMemberRequest; F32 mAccessTime; + + // Generate a new ID every time mMembers + LLUUID mMemberVersion; }; struct LLRoleAction diff --git a/indra/newview/llpanelgroupgeneral.cpp b/indra/newview/llpanelgroupgeneral.cpp index 51b4d2ea65..993ffb7825 100644 --- a/indra/newview/llpanelgroupgeneral.cpp +++ b/indra/newview/llpanelgroupgeneral.cpp @@ -670,7 +670,6 @@ void LLPanelGroupGeneral::update(LLGroupChange gc) { mMemberProgress = gdatap->mMembers.begin(); mPendingMemberUpdate = TRUE; - mUdpateSessionID.generate(); sSDTime = 0.0f; sElementTime = 0.0f; @@ -730,7 +729,7 @@ void LLPanelGroupGeneral::updateMembers() // If name is not cached, onNameCache() should be called when it is cached and add this member to list. LLAvatarNameCache::get(mMemberProgress->first, boost::bind(&LLPanelGroupGeneral::onNameCache, - this, mUdpateSessionID, member, _1, _2)); + this, gdatap->getMemberVersion(), member, _2)); } } @@ -768,11 +767,15 @@ void LLPanelGroupGeneral::addMember(LLGroupMemberData* member) } } -void LLPanelGroupGeneral::onNameCache(const LLUUID& update_id, LLGroupMemberData* member, const LLUUID& id, const LLAvatarName& av_name) +void LLPanelGroupGeneral::onNameCache(const LLUUID& update_id, LLGroupMemberData* member, const LLAvatarName& av_name) { - if (!member - || update_id != mUdpateSessionID) + LLGroupMgrGroupData* gdatap = LLGroupMgr::getInstance()->getGroupData(mGroupID); + + if (!gdatap + || !gdatap->isMemberDataComplete() + || gdatap->getMemberVersion() != update_id) { + // Stale data return; } diff --git a/indra/newview/llpanelgroupgeneral.h b/indra/newview/llpanelgroupgeneral.h index b179f78c56..1b4e8e2645 100644 --- a/indra/newview/llpanelgroupgeneral.h +++ b/indra/newview/llpanelgroupgeneral.h @@ -63,7 +63,7 @@ public: virtual void setupCtrls (LLPanel* parent); - void onNameCache(const LLUUID& update_id, LLGroupMemberData* member, const LLUUID& id, const LLAvatarName& av_name); + void onNameCache(const LLUUID& update_id, LLGroupMemberData* member, const LLAvatarName& av_name); private: void reset(); @@ -90,7 +90,6 @@ private: BOOL mChanged; BOOL mFirstUse; std::string mIncompleteMemberDataStr; - LLUUID mUdpateSessionID; // Group information (include any updates in updateChanged) LLLineEditor *mGroupNameEditor; diff --git a/indra/newview/llpanelgrouproles.cpp b/indra/newview/llpanelgrouproles.cpp index 5720168f81..ff106882f4 100644 --- a/indra/newview/llpanelgrouproles.cpp +++ b/indra/newview/llpanelgrouproles.cpp @@ -745,7 +745,6 @@ LLPanelGroupMembersSubTab::LLPanelGroupMembersSubTab() mHasMatch(FALSE), mNumOwnerAdditions(0) { - mUdpateSessionID = LLUUID::null; } LLPanelGroupMembersSubTab::~LLPanelGroupMembersSubTab() @@ -1427,13 +1426,20 @@ U64 LLPanelGroupMembersSubTab::getAgentPowersBasedOnRoleChanges(const LLUUID& ag return GP_NO_POWERS; } - LLGroupMemberData* member_data = gdatap->mMembers[agent_id]; - if ( !member_data ) + LLGroupMgrGroupData::member_list_t::iterator iter = gdatap->mMembers.find(agent_id); + if ( iter == gdatap->mMembers.end() ) { llwarns << "LLPanelGroupMembersSubTab::getAgentPowersBasedOnRoleChanges() -- No member data for member with UUID " << agent_id << llendl; return GP_NO_POWERS; } + LLGroupMemberData* member_data = (*iter).second; + if (!member_data) + { + llwarns << "LLPanelGroupMembersSubTab::getAgentPowersBasedOnRoleChanges() -- Null member data for member with UUID " << agent_id << llendl; + return GP_NO_POWERS; + } + //see if there are unsaved role changes for this agent role_change_data_map_t* role_change_datap = NULL; member_role_changes_map_t::iterator member = mMemberRoleChangeData.find(agent_id); @@ -1548,10 +1554,6 @@ void LLPanelGroupMembersSubTab::update(LLGroupChange gc) mMemberProgress = gdatap->mMembers.begin(); mPendingMemberUpdate = TRUE; mHasMatch = FALSE; - // Generate unique ID for current updateMembers()- see onNameCache for details. - // Using unique UUID is perhaps an overkill but this way we are perfectly safe - // from coincidences. - mUdpateSessionID.generate(); } else { @@ -1579,14 +1581,14 @@ void LLPanelGroupMembersSubTab::update(LLGroupChange gc) } } -void LLPanelGroupMembersSubTab::addMemberToList(LLUUID id, LLGroupMemberData* data) +void LLPanelGroupMembersSubTab::addMemberToList(LLGroupMemberData* data) { if (!data) return; LLUIString donated = getString("donation_area"); donated.setArg("[AREA]", llformat("%d", data->getContribution())); LLNameListCtrl::NameItem item_params; - item_params.value = id; + item_params.value = data->getID(); item_params.columns.add().column("name").font.name("SANSSERIF_SMALL").style("NORMAL"); @@ -1600,17 +1602,12 @@ void LLPanelGroupMembersSubTab::addMemberToList(LLUUID id, LLGroupMemberData* da mHasMatch = TRUE; } -void LLPanelGroupMembersSubTab::onNameCache(const LLUUID& update_id, LLGroupMemberData* member, const LLUUID& id, const LLAvatarName& av_name) +void LLPanelGroupMembersSubTab::onNameCache(const LLUUID& update_id, LLGroupMemberData* member, const LLAvatarName& av_name) { - // Update ID is used to determine whether member whose id is passed - // into onNameCache() was passed after current or previous user-initiated update. - // This is needed to avoid probable duplication of members in list after changing filter - // or adding of members of another group if gets for their names were called on - // previous update. If this id is from get() called from older update, - // we do nothing. - if (mUdpateSessionID != update_id) return; - - if (!member) + LLGroupMgrGroupData* gdatap = LLGroupMgr::getInstance()->getGroupData(mGroupID); + if (!gdatap + || gdatap->getMemberVersion() != update_id + || !member) { return; } @@ -1618,7 +1615,7 @@ void LLPanelGroupMembersSubTab::onNameCache(const LLUUID& update_id, LLGroupMemb // trying to avoid unnecessary hash lookups if (matchesSearchFilter(av_name.getLegacyName())) { - addMemberToList(id, member); + addMemberToList(member); if(!mMembersList->getEnabled()) { mMembersList->setEnabled(TRUE); @@ -1672,14 +1669,14 @@ void LLPanelGroupMembersSubTab::updateMembers() { if (matchesSearchFilter(av_name.getLegacyName())) { - addMemberToList(mMemberProgress->first, mMemberProgress->second); + addMemberToList(mMemberProgress->second); } } else { // If name is not cached, onNameCache() should be called when it is cached and add this member to list. LLAvatarNameCache::get(mMemberProgress->first, boost::bind(&LLPanelGroupMembersSubTab::onNameCache, - this, mUdpateSessionID, mMemberProgress->second, _1, _2)); + this, gdatap->getMemberVersion(), mMemberProgress->second, _2)); } } diff --git a/indra/newview/llpanelgrouproles.h b/indra/newview/llpanelgrouproles.h index 8b454e020a..bead8bd85b 100644 --- a/indra/newview/llpanelgrouproles.h +++ b/indra/newview/llpanelgrouproles.h @@ -187,8 +187,8 @@ public: virtual void setGroupID(const LLUUID& id); - void addMemberToList(LLUUID id, LLGroupMemberData* data); - void onNameCache(const LLUUID& update_id, LLGroupMemberData* member, const LLUUID& id, const LLAvatarName& av_name); + void addMemberToList(LLGroupMemberData* data); + void onNameCache(const LLUUID& update_id, LLGroupMemberData* member, const LLAvatarName& av_name); protected: typedef std::map role_change_data_map_t; @@ -210,9 +210,6 @@ protected: BOOL mPendingMemberUpdate; BOOL mHasMatch; - // This id is generated after each user initiated member list update(opening Roles or changing filter) - LLUUID mUdpateSessionID; - member_role_changes_map_t mMemberRoleChangeData; U32 mNumOwnerAdditions; -- cgit v1.3