summaryrefslogtreecommitdiff
path: root/indra
diff options
context:
space:
mode:
authorAndrey Kleshchev <andreykproductengine@lindenlab.com>2025-02-20 23:47:21 +0200
committerAndrey Kleshchev <117672381+akleshchev@users.noreply.github.com>2025-02-21 18:09:54 +0200
commit1754aea5ff8f8a78f5a25e6652692eee7df4ff23 (patch)
tree48b99a8e1efa69f8a7f434389a8f890e91c2e938 /indra
parent5db82e47aa24af721e95794390d54769910ec7fc (diff)
#3547 Store and restore position when rebulding picks
instead of re-requesting parcel data for a dozen parcels. Add request timeout in case parcel request hits throttle
Diffstat (limited to 'indra')
-rw-r--r--indra/newview/llavatarpropertiesprocessor.cpp1
-rw-r--r--indra/newview/llpanelprofilepicks.cpp77
-rw-r--r--indra/newview/llpanelprofilepicks.h7
3 files changed, 80 insertions, 5 deletions
diff --git a/indra/newview/llavatarpropertiesprocessor.cpp b/indra/newview/llavatarpropertiesprocessor.cpp
index 6277e65b2d..7dce627044 100644
--- a/indra/newview/llavatarpropertiesprocessor.cpp
+++ b/indra/newview/llavatarpropertiesprocessor.cpp
@@ -669,6 +669,7 @@ void LLAvatarPropertiesProcessor::sendClassifiedInfoUpdate(const LLAvatarClassif
void LLAvatarPropertiesProcessor::sendPickInfoRequest(const LLUUID& creator_id, const LLUUID& pick_id)
{
+ LL_DEBUGS("PickInfo") << " Requiesting pick info for " << pick_id << LL_ENDL;
// Must ask for a pick based on the creator id because
// the pick database is distributed to the inventory cluster. JC
std::vector<std::string> request_params{ creator_id.asString(), pick_id.asString() };
diff --git a/indra/newview/llpanelprofilepicks.cpp b/indra/newview/llpanelprofilepicks.cpp
index 08f3d3af5a..c2edc58687 100644
--- a/indra/newview/llpanelprofilepicks.cpp
+++ b/indra/newview/llpanelprofilepicks.cpp
@@ -55,6 +55,8 @@
static LLPanelInjector<LLPanelProfilePicks> t_panel_profile_picks("panel_profile_picks");
static LLPanelInjector<LLPanelProfilePick> t_panel_profile_pick("panel_profile_pick");
+static const F32 REQUEST_TIMOUT = 60;
+static const F32 LOCATION_CACHE_TIMOUT = 900;
class LLPickHandler : public LLCommandHandler
{
@@ -306,6 +308,7 @@ void LLPanelProfilePicks::processProperties(void* data, EAvatarProcessorType typ
void LLPanelProfilePicks::processProperties(const LLAvatarData* avatar_picks)
{
+ LL_DEBUGS("PickInfo") << "Processing picks for avatar " << getAvatarId() << LL_ENDL;
LLUUID selected_id = mPickToSelectOnLoad;
bool has_selection = false;
if (mPickToSelectOnLoad.isNull())
@@ -320,6 +323,25 @@ void LLPanelProfilePicks::processProperties(const LLAvatarData* avatar_picks)
}
}
+ // Avoid pointlesly requesting parcel data,
+ // store previous values
+ std::map<LLUUID, std::string> parcelid_location_map;
+ std::map<LLUUID, LLUUID> pickid_parcelid_map;
+
+ for (S32 tab_idx = 0; tab_idx < mTabContainer->getTabCount(); ++tab_idx)
+ {
+ LLPanelProfilePick* pick_panel = dynamic_cast<LLPanelProfilePick*>(mTabContainer->getPanelByIndex(tab_idx));
+ if (pick_panel && pick_panel->getPickId().notNull())
+ {
+ std::string location = pick_panel->getPickLocation();
+ if (!location.empty())
+ {
+ parcelid_location_map[pick_panel->getParcelID()] = pick_panel->getPickLocation();
+ pickid_parcelid_map[pick_panel->getPickId()] = pick_panel->getParcelID();
+ }
+ }
+ }
+
mTabContainer->deleteAllTabs();
LLAvatarData::picks_list_t::const_iterator it = avatar_picks->picks_list.begin();
@@ -334,6 +356,15 @@ void LLPanelProfilePicks::processProperties(const LLAvatarData* avatar_picks)
pick_panel->setPickName(pick_name);
pick_panel->setAvatarId(getAvatarId());
+ std::map<LLUUID, LLUUID>::const_iterator found_pick = pickid_parcelid_map.find(pick_id);
+ if (found_pick != pickid_parcelid_map.end())
+ {
+ std::map<LLUUID, std::string>::const_iterator found = parcelid_location_map.find(found_pick->second);
+ if (found != parcelid_location_map.end() && !found->second.empty())
+ {
+ pick_panel->setPickLocation(found_pick->second, found->second);
+ }
+ }
mTabContainer->addTabPanel(
LLTabContainer::TabPanelParams().
panel(pick_panel).
@@ -353,6 +384,11 @@ void LLPanelProfilePicks::processProperties(const LLAvatarData* avatar_picks)
LLPanelProfilePick* pick_panel = LLPanelProfilePick::create();
pick_panel->setAvatarId(getAvatarId());
+ std::map<LLUUID, std::string>::const_iterator found = parcelid_location_map.find(data.parcel_id);
+ if (found != parcelid_location_map.end() && !found->second.empty())
+ {
+ pick_panel->setPickLocation(data.parcel_id, found->second);
+ }
pick_panel->processProperties(&data);
mTabContainer->addTabPanel(
LLTabContainer::TabPanelParams().
@@ -638,9 +674,14 @@ void LLPanelProfilePick::processProperties(void* data, EAvatarProcessorType type
void LLPanelProfilePick::processProperties(const LLPickData* pick_info)
{
+ LL_DEBUGS("PickInfo") << "Processing properties for pick " << mPickId << LL_ENDL;
mIsEditing = false;
mPickDescription->setParseHTML(true);
- mParcelId = pick_info->parcel_id;
+ if (mParcelId != pick_info->parcel_id)
+ {
+ mParcelId = pick_info->parcel_id;
+ mPickLocationStr.clear();
+ }
setSnapshotId(pick_info->snapshot_id);
if (!getSelfProfile())
{
@@ -650,8 +691,11 @@ void LLPanelProfilePick::processProperties(const LLPickData* pick_info)
setPickDesc(pick_info->desc);
setPosGlobal(pick_info->pos_global);
- // Send remote parcel info request to get parcel name and sim (region) name.
- sendParcelInfoRequest();
+ if (mPickLocationStr.empty() || mLastRequestTimer.getElapsedTimeF32() > LOCATION_CACHE_TIMOUT)
+ {
+ // Send remote parcel info request to get parcel name and sim (region) name.
+ sendParcelInfoRequest();
+ }
// *NOTE dzaporozhan
// We want to keep listening to APT_PICK_INFO because user may
@@ -691,9 +735,17 @@ void LLPanelProfilePick::setPickDesc(const std::string& desc)
mPickDescription->setValue(desc);
}
+void LLPanelProfilePick::setPickLocation(const LLUUID &parcel_id, const std::string& location)
+{
+ setParcelID(parcel_id); // resets mPickLocationStr
+ setPickLocation(location);
+}
+
void LLPanelProfilePick::setPickLocation(const std::string& location)
{
getChild<LLUICtrl>("pick_location")->setValue(location);
+ mPickLocationStr = location;
+ mLastRequestTimer.reset();
}
void LLPanelProfilePick::onClickMap()
@@ -790,16 +842,19 @@ std::string LLPanelProfilePick::getLocationNotice()
void LLPanelProfilePick::sendParcelInfoRequest()
{
- if (mParcelId != mRequestedId)
+ if (mParcelId != mRequestedId || mLastRequestTimer.getElapsedTimeF32() > REQUEST_TIMOUT)
{
if (mRequestedId.notNull())
{
LLRemoteParcelInfoProcessor::getInstance()->removeObserver(mRequestedId, this);
}
+ LL_DEBUGS("PickInfo") << "Sending parcel request " << mParcelId << " for pick " << mPickId << LL_ENDL;
LLRemoteParcelInfoProcessor::getInstance()->addObserver(mParcelId, this);
LLRemoteParcelInfoProcessor::getInstance()->sendParcelInfoRequest(mParcelId);
mRequestedId = mParcelId;
+ mLastRequestTimer.reset();
+ mPickLocationStr.clear();
}
}
@@ -816,6 +871,20 @@ void LLPanelProfilePick::processParcelInfo(const LLParcelData& parcel_data)
}
}
+void LLPanelProfilePick::setParcelID(const LLUUID& parcel_id)
+{
+ if (mParcelId != parcel_id)
+ {
+ mParcelId = parcel_id;
+ mPickLocationStr.clear();
+ }
+ if (mRequestedId.notNull() && mRequestedId != parcel_id)
+ {
+ LLRemoteParcelInfoProcessor::getInstance()->removeObserver(mRequestedId, this);
+ mRequestedId.setNull();
+ }
+}
+
void LLPanelProfilePick::sendUpdate()
{
LLPickData pick_data;
diff --git a/indra/newview/llpanelprofilepicks.h b/indra/newview/llpanelprofilepicks.h
index e3f50f5576..b4d3eb010e 100644
--- a/indra/newview/llpanelprofilepicks.h
+++ b/indra/newview/llpanelprofilepicks.h
@@ -117,6 +117,8 @@ public:
virtual void setPickName(const std::string& name);
const std::string getPickName();
+ virtual void setPickLocation(const LLUUID& parcel_id, const std::string& location);
+ std::string getPickLocation() { return mPickLocationStr; };
void processProperties(void* data, EAvatarProcessorType type) override;
void processProperties(const LLPickData* pick_data);
@@ -135,7 +137,8 @@ public:
//This stuff we got from LLRemoteParcelObserver, in the last one we intentionally do nothing
void processParcelInfo(const LLParcelData& parcel_data) override;
- void setParcelID(const LLUUID& parcel_id) override { mParcelId = parcel_id; }
+ void setParcelID(const LLUUID& parcel_id) override;
+ LLUUID getParcelID() const { return mParcelId; }
void setErrorStatus(S32 status, const std::string& reason) override {};
protected:
@@ -230,6 +233,8 @@ protected:
LLUUID mPickId;
LLUUID mRequestedId;
std::string mPickNameStr;
+ std::string mPickLocationStr;
+ LLTimer mLastRequestTimer;
boost::signals2::connection mRegionCallbackConnection;
boost::signals2::connection mParcelCallbackConnection;