summaryrefslogtreecommitdiff
path: root/indra/newview/llfloatertopobjects.cpp
diff options
context:
space:
mode:
authorAnsariel <ansariel.hiller@phoenixviewer.com>2024-05-22 19:04:52 +0200
committerAnsariel <ansariel.hiller@phoenixviewer.com>2024-05-22 19:04:52 +0200
commit1b67dd855c41f5a0cda7ec2a68d98071986ca703 (patch)
treeab243607f74f78200787bba5b9b88f07ef1b966f /indra/newview/llfloatertopobjects.cpp
parent6d6eabca44d08d5b97bfe3e941d2b9687c2246ea (diff)
parente1623bb276f83a43ce7a197e388720c05bdefe61 (diff)
Merge remote-tracking branch 'origin/main' into DRTVWR-600-maint-A
# Conflicts: # autobuild.xml # indra/cmake/CMakeLists.txt # indra/cmake/GoogleMock.cmake # indra/llaudio/llaudioengine_fmodstudio.cpp # indra/llaudio/llaudioengine_fmodstudio.h # indra/llaudio/lllistener_fmodstudio.cpp # indra/llaudio/lllistener_fmodstudio.h # indra/llaudio/llstreamingaudio_fmodstudio.cpp # indra/llaudio/llstreamingaudio_fmodstudio.h # indra/llcharacter/llmultigesture.cpp # indra/llcharacter/llmultigesture.h # indra/llimage/llimage.cpp # indra/llimage/llimagepng.cpp # indra/llimage/llimageworker.cpp # indra/llimage/tests/llimageworker_test.cpp # indra/llmessage/tests/llmockhttpclient.h # indra/llprimitive/llgltfmaterial.h # indra/llrender/llfontfreetype.cpp # indra/llui/llcombobox.cpp # indra/llui/llfolderview.cpp # indra/llui/llfolderviewmodel.h # indra/llui/lllineeditor.cpp # indra/llui/lllineeditor.h # indra/llui/lltextbase.cpp # indra/llui/lltextbase.h # indra/llui/lltexteditor.cpp # indra/llui/lltextvalidate.cpp # indra/llui/lltextvalidate.h # indra/llui/lluictrl.h # indra/llui/llview.cpp # indra/llwindow/llwindowmacosx.cpp # indra/newview/app_settings/settings.xml # indra/newview/llappearancemgr.cpp # indra/newview/llappearancemgr.h # indra/newview/llavatarpropertiesprocessor.cpp # indra/newview/llavatarpropertiesprocessor.h # indra/newview/llbreadcrumbview.cpp # indra/newview/llbreadcrumbview.h # indra/newview/llbreastmotion.cpp # indra/newview/llbreastmotion.h # indra/newview/llconversationmodel.h # indra/newview/lldensityctrl.cpp # indra/newview/lldensityctrl.h # indra/newview/llface.inl # indra/newview/llfloatereditsky.cpp # indra/newview/llfloatereditwater.cpp # indra/newview/llfloateremojipicker.h # indra/newview/llfloaterimsessiontab.cpp # indra/newview/llfloaterprofiletexture.cpp # indra/newview/llfloaterprofiletexture.h # indra/newview/llgesturemgr.cpp # indra/newview/llgesturemgr.h # indra/newview/llimpanel.cpp # indra/newview/llimpanel.h # indra/newview/llinventorybridge.cpp # indra/newview/llinventorybridge.h # indra/newview/llinventoryclipboard.cpp # indra/newview/llinventoryclipboard.h # indra/newview/llinventoryfunctions.cpp # indra/newview/llinventoryfunctions.h # indra/newview/llinventorygallery.cpp # indra/newview/lllistbrowser.cpp # indra/newview/lllistbrowser.h # indra/newview/llpanelobjectinventory.cpp # indra/newview/llpanelprofile.cpp # indra/newview/llpanelprofile.h # indra/newview/llpreviewgesture.cpp # indra/newview/llsavedsettingsglue.cpp # indra/newview/llsavedsettingsglue.h # indra/newview/lltooldraganddrop.cpp # indra/newview/llurllineeditorctrl.cpp # indra/newview/llvectorperfoptions.cpp # indra/newview/llvectorperfoptions.h # indra/newview/llviewerparceloverlay.cpp # indra/newview/llviewertexlayer.cpp # indra/newview/llviewertexturelist.cpp # indra/newview/macmain.h # indra/test/test.cpp
Diffstat (limited to 'indra/newview/llfloatertopobjects.cpp')
-rw-r--r--indra/newview/llfloatertopobjects.cpp1100
1 files changed, 550 insertions, 550 deletions
diff --git a/indra/newview/llfloatertopobjects.cpp b/indra/newview/llfloatertopobjects.cpp
index 5192e62fe5..412d764af7 100644
--- a/indra/newview/llfloatertopobjects.cpp
+++ b/indra/newview/llfloatertopobjects.cpp
@@ -1,550 +1,550 @@
-/**
- * @file llfloatertopobjects.cpp
- * @brief Shows top colliders, top scripts, etc.
- *
- * $LicenseInfo:firstyear=2005&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-#include "llviewerprecompiledheaders.h"
-
-#include "llfloatertopobjects.h"
-
-// library includes
-#include "message.h"
-#include "llavatarnamecache.h"
-#include "llfontgl.h"
-
-#include "llagent.h"
-#include "llbutton.h"
-#include "llfloatergodtools.h"
-#include "llfloaterreg.h"
-#include "llnotificationsutil.h"
-#include "llparcel.h"
-#include "llscrolllistctrl.h"
-#include "llscrolllistitem.h"
-#include "llscrolllistcell.h"
-#include "lllineeditor.h"
-#include "lltextbox.h"
-#include "lltracker.h"
-#include "llviewermessage.h"
-#include "llviewerparcelmgr.h"
-#include "llviewerregion.h"
-#include "lluictrlfactory.h"
-#include "llviewerobjectlist.h"
-#include "llviewerwindow.h"
-#include "llfloaterregioninfo.h"
-
-//LLFloaterTopObjects* LLFloaterTopObjects::sInstance = NULL;
-
-// Globals
-// const U32 TIME_STR_LENGTH = 30;
-/*
-// static
-void LLFloaterTopObjects::show()
-{
- if (sInstance)
- {
- sInstance->setVisibleAndFrontmost();
- return;
- }
-
- sInstance = new LLFloaterTopObjects();
- sInstance->center();
-}
-*/
-LLFloaterTopObjects::LLFloaterTopObjects(const LLSD& key)
-: LLFloater(key),
- mInitialized(false),
- mtotalScore(0.f)
-{
- mCommitCallbackRegistrar.add("TopObjects.ShowBeacon", boost::bind(&LLFloaterTopObjects::onClickShowBeacon, this));
- mCommitCallbackRegistrar.add("TopObjects.ReturnSelected", boost::bind(&LLFloaterTopObjects::onReturnSelected, this));
- mCommitCallbackRegistrar.add("TopObjects.ReturnAll", boost::bind(&LLFloaterTopObjects::onReturnAll, this));
- mCommitCallbackRegistrar.add("TopObjects.Refresh", boost::bind(&LLFloaterTopObjects::onRefresh, this));
- mCommitCallbackRegistrar.add("TopObjects.GetByObjectName", boost::bind(&LLFloaterTopObjects::onGetByObjectName, this));
- mCommitCallbackRegistrar.add("TopObjects.GetByOwnerName", boost::bind(&LLFloaterTopObjects::onGetByOwnerName, this));
- mCommitCallbackRegistrar.add("TopObjects.GetByParcelName", boost::bind(&LLFloaterTopObjects::onGetByParcelName, this));
- mCommitCallbackRegistrar.add("TopObjects.CommitObjectsList",boost::bind(&LLFloaterTopObjects::onCommitObjectsList, this));
-
- mCommitCallbackRegistrar.add("TopObjects.TeleportToSelected", boost::bind(&LLFloaterTopObjects::teleportToSelectedObject, this));
-}
-
-LLFloaterTopObjects::~LLFloaterTopObjects()
-{
-}
-
-// virtual
-bool LLFloaterTopObjects::postBuild()
-{
- mObjectsScrollList = getChild<LLScrollListCtrl>("objects_list");
- mObjectsScrollList->setFocus(true);
- mObjectsScrollList->setDoubleClickCallback(onDoubleClickObjectsList, this);
- mObjectsScrollList->setCommitOnSelectionChange(true);
- mObjectsScrollList->setCommitCallback(boost::bind(&LLFloaterTopObjects::onSelectionChanged, this));
-
- setDefaultBtn("show_beacon_btn");
-
- mCurrentMode = STAT_REPORT_TOP_SCRIPTS;
- mFlags = 0;
- mFilter.clear();
-
- return true;
-}
-// static
-void LLFloaterTopObjects::setMode(U32 mode)
-{
- LLFloaterTopObjects* instance = LLFloaterReg::getTypedInstance<LLFloaterTopObjects>("top_objects");
- if(!instance) return;
- instance->mCurrentMode = mode;
-}
-
-// static
-void LLFloaterTopObjects::handle_land_reply(LLMessageSystem* msg, void** data)
-{
- LLFloaterTopObjects* instance = LLFloaterReg::getTypedInstance<LLFloaterTopObjects>("top_objects");
- if(instance && instance->isInVisibleChain())
- {
- instance->handleReply(msg, data);
- //HACK: for some reason sometimes top scripts originally comes back
- //with no results even though they're there
- if (!instance->mObjectListIDs.size() && !instance->mInitialized)
- {
- instance->onRefresh();
- instance->mInitialized = true;
- }
- }
- else
- {
- LLFloaterRegionInfo* region_info_floater = LLFloaterReg::getTypedInstance<LLFloaterRegionInfo>("region_info");
- if(region_info_floater)
- {
- region_info_floater->enableTopButtons();
- }
- }
-
-}
-
-void LLFloaterTopObjects::handleReply(LLMessageSystem *msg, void** data)
-{
- U32 request_flags;
- U32 total_count;
- U64 total_memory = 0;
-
- msg->getU32Fast(_PREHASH_RequestData, _PREHASH_RequestFlags, request_flags);
- msg->getU32Fast(_PREHASH_RequestData, _PREHASH_TotalObjectCount, total_count);
- msg->getU32Fast(_PREHASH_RequestData, _PREHASH_ReportType, mCurrentMode);
-
- LLScrollListCtrl *list = getChild<LLScrollListCtrl>("objects_list");
-
- S32 block_count = msg->getNumberOfBlocks("ReportData");
- for (S32 block = 0; block < block_count; ++block)
- {
- U32 task_local_id;
- U32 time_stamp = 0;
- LLUUID task_id;
- F32 location_x, location_y, location_z;
- F32 score;
- std::string name_buf;
- std::string owner_buf;
- std::string parcel_buf("unknown");
- F32 mono_score = 0.f;
- bool have_extended_data = false;
- S32 public_urls = 0;
- F32 script_memory = 0.f;
-
- msg->getU32Fast(_PREHASH_ReportData, _PREHASH_TaskLocalID, task_local_id, block);
- msg->getUUIDFast(_PREHASH_ReportData, _PREHASH_TaskID, task_id, block);
- msg->getF32Fast(_PREHASH_ReportData, _PREHASH_LocationX, location_x, block);
- msg->getF32Fast(_PREHASH_ReportData, _PREHASH_LocationY, location_y, block);
- msg->getF32Fast(_PREHASH_ReportData, _PREHASH_LocationZ, location_z, block);
- msg->getF32Fast(_PREHASH_ReportData, _PREHASH_Score, score, block);
- msg->getStringFast(_PREHASH_ReportData, _PREHASH_TaskName, name_buf, block);
- msg->getStringFast(_PREHASH_ReportData, _PREHASH_OwnerName, owner_buf, block);
-
- if(msg->has("DataExtended"))
- {
- have_extended_data = true;
- msg->getU32("DataExtended", "TimeStamp", time_stamp, block);
- msg->getF32("DataExtended", "MonoScore", mono_score, block);
- msg->getS32("DataExtended", "PublicURLs", public_urls, block);
-
- std::string parcel_name;
- F32 script_size = 0.f;
- msg->getString("DataExtended", "ParcelName", parcel_name, block);
- msg->getF32("DataExtended", "Size", script_size, block);
- if (parcel_name.size() > 0 || script_size > 0)
- {
- parcel_buf = parcel_name;
- script_memory = script_size;
- total_memory += script_size;
- }
- }
-
- LLSD element;
-
- element["id"] = task_id;
-
- LLSD columns;
- S32 column_num = 0;
- columns[column_num]["column"] = "score";
- columns[column_num]["value"] = llformat("%0.3f", score);
- columns[column_num++]["font"] = "SANSSERIF";
-
- columns[column_num]["column"] = "name";
- columns[column_num]["value"] = name_buf;
- columns[column_num++]["font"] = "SANSSERIF";
-
- // Owner names can have trailing spaces sent from server
- LLStringUtil::trim(owner_buf);
-
- // *TODO: Send owner_id from server and look up display name
- owner_buf = LLCacheName::buildUsername(owner_buf);
-
- columns[column_num]["column"] = "owner";
- columns[column_num]["value"] = owner_buf;
- columns[column_num++]["font"] = "SANSSERIF";
-
- columns[column_num]["column"] = "location";
- columns[column_num]["value"] = llformat("<%0.f, %0.f, %0.f>", location_x, location_y, location_z);
- columns[column_num++]["font"] = "SANSSERIF";
-
- columns[column_num]["column"] = "parcel";
- columns[column_num]["value"] = parcel_buf;
- columns[column_num++]["font"] = "SANSSERIF";
-
- columns[column_num]["column"] = "time";
- columns[column_num]["type"] = "date";
- columns[column_num]["value"] = LLDate((time_t)time_stamp);
- columns[column_num++]["font"] = "SANSSERIF";
-
- if (mCurrentMode == STAT_REPORT_TOP_SCRIPTS
- && have_extended_data)
- {
- columns[column_num]["column"] = "memory";
- columns[column_num]["value"] = llformat("%0.0f", (script_memory / 1024.f));
- columns[column_num++]["font"] = "SANSSERIF";
-
- columns[column_num]["column"] = "URLs";
- columns[column_num]["value"] = llformat("%d", public_urls);
- columns[column_num++]["font"] = "SANSSERIF";
- }
- element["columns"] = columns;
- list->addElement(element);
-
- mObjectListData.append(element);
- mObjectListIDs.push_back(task_id);
-
- mtotalScore += score;
- }
-
- if (total_count == 0 && list->getItemCount() == 0)
- {
- list->setCommentText(getString("none_descriptor"));
- }
- else
- {
- list->selectFirstItem();
- }
-
- if (mCurrentMode == STAT_REPORT_TOP_SCRIPTS)
- {
- setTitle(getString("top_scripts_title"));
- list->setColumnLabel("score", getString("scripts_score_label"));
-
- LLUIString format = getString("top_scripts_text");
- total_memory /= 1024;
- format.setArg("[MEMORY]", llformat("%ld", total_memory));
- format.setArg("[COUNT]", llformat("%d", total_count));
- format.setArg("[TIME]", llformat("%0.3f", mtotalScore));
- getChild<LLUICtrl>("title_text")->setValue(LLSD(format));
- list->setColumnLabel("URLs", getString("URLs"));
- list->setColumnLabel("memory", getString("memory"));
- }
- else
- {
- setTitle(getString("top_colliders_title"));
- list->setColumnLabel("score", getString("colliders_score_label"));
- list->setColumnLabel("URLs", "");
- list->setColumnLabel("memory", "");
- LLUIString format = getString("top_colliders_text");
- format.setArg("[COUNT]", llformat("%d", total_count));
- getChild<LLUICtrl>("title_text")->setValue(LLSD(format));
- }
-
- LLFloaterRegionInfo* region_info_floater = LLFloaterReg::getTypedInstance<LLFloaterRegionInfo>("region_info");
- if(region_info_floater)
- {
- region_info_floater->enableTopButtons();
- }
- getChildView("refresh_btn")->setEnabled(true);
-}
-
-void LLFloaterTopObjects::onCommitObjectsList()
-{
- updateSelectionInfo();
-}
-
-void LLFloaterTopObjects::updateSelectionInfo()
-{
- LLScrollListCtrl* list = getChild<LLScrollListCtrl>("objects_list");
-
- if (!list) return;
-
- LLUUID object_id = list->getCurrentID();
- if (object_id.isNull()) return;
-
- std::string object_id_string = object_id.asString();
-
- getChild<LLUICtrl>("id_editor")->setValue(LLSD(object_id_string));
- LLScrollListItem* sli = list->getFirstSelected();
- llassert(sli);
- if (sli)
- {
- getChild<LLUICtrl>("object_name_editor")->setValue(sli->getColumn(1)->getValue().asString());
- getChild<LLUICtrl>("owner_name_editor")->setValue(sli->getColumn(2)->getValue().asString());
- getChild<LLUICtrl>("parcel_name_editor")->setValue(sli->getColumn(4)->getValue().asString());
- }
-}
-
-// static
-void LLFloaterTopObjects::onDoubleClickObjectsList(void* data)
-{
- LLFloaterTopObjects* self = (LLFloaterTopObjects*)data;
- self->showBeacon();
-}
-
-// static
-void LLFloaterTopObjects::onClickShowBeacon()
-{
- showBeacon();
-}
-
-void LLFloaterTopObjects::returnObjects(bool all)
-{
- LLMessageSystem *msg = gMessageSystem;
-
- LLViewerRegion* region = gAgent.getRegion();
- if (!region) return;
-
- LLCtrlListInterface *list = getChild<LLUICtrl>("objects_list")->getListInterface();
- if (!list || list->getItemCount() == 0) return;
-
- uuid_vec_t::iterator id_itor;
-
- bool start_message = true;
-
- for (id_itor = mObjectListIDs.begin(); id_itor != mObjectListIDs.end(); ++id_itor)
- {
- LLUUID task_id = *id_itor;
- if (!all && !list->isSelected(task_id))
- {
- // Selected only
- continue;
- }
- if (start_message)
- {
- msg->newMessageFast(_PREHASH_ParcelReturnObjects);
- msg->nextBlockFast(_PREHASH_AgentData);
- msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
- msg->addUUIDFast(_PREHASH_SessionID,gAgent.getSessionID());
- msg->nextBlockFast(_PREHASH_ParcelData);
- msg->addS32Fast(_PREHASH_LocalID, -1); // Whole region
- msg->addS32Fast(_PREHASH_ReturnType, RT_NONE);
- start_message = false;
- }
-
- msg->nextBlockFast(_PREHASH_TaskIDs);
- msg->addUUIDFast(_PREHASH_TaskID, task_id);
-
- if (msg->isSendFullFast(_PREHASH_TaskIDs))
- {
- msg->sendReliable(region->getHost());
- start_message = true;
- }
- }
-
- if (!start_message)
- {
- msg->sendReliable(region->getHost());
- }
-}
-
-//static
-bool LLFloaterTopObjects::callbackReturnAll(const LLSD& notification, const LLSD& response)
-{
- S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
- LLFloaterTopObjects* instance = LLFloaterReg::getTypedInstance<LLFloaterTopObjects>("top_objects");
- if(!instance) return false;
- if (option == 0)
- {
- instance->returnObjects(true);
- }
- return false;
-}
-
-void LLFloaterTopObjects::onReturnAll()
-{
- LLNotificationsUtil::add("ReturnAllTopObjects", LLSD(), LLSD(), &callbackReturnAll);
-}
-
-
-void LLFloaterTopObjects::onReturnSelected()
-{
- returnObjects(false);
-}
-
-
-void LLFloaterTopObjects::clearList()
-{
- LLCtrlListInterface *list = childGetListInterface("objects_list");
-
- if (list)
- {
- list->operateOnAll(LLCtrlListInterface::OP_DELETE);
- }
-
- mObjectListData.clear();
- mObjectListIDs.clear();
- mtotalScore = 0.f;
-
- onSelectionChanged();
-}
-
-
-void LLFloaterTopObjects::onRefresh()
-{
- U32 mode = STAT_REPORT_TOP_SCRIPTS;
- U32 flags = 0;
- std::string filter = "";
-
- mode = mCurrentMode;
- flags = mFlags;
- filter = mFilter;
- clearList();
-
- LLMessageSystem *msg = gMessageSystem;
- msg->newMessageFast(_PREHASH_LandStatRequest);
- msg->nextBlockFast(_PREHASH_AgentData);
- msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID() );
- msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID() );
- msg->nextBlockFast(_PREHASH_RequestData);
- msg->addU32Fast(_PREHASH_ReportType, mode);
- msg->addU32Fast(_PREHASH_RequestFlags, flags);
- msg->addStringFast(_PREHASH_Filter, filter);
- msg->addS32Fast(_PREHASH_ParcelLocalID, 0);
-
- LLFloaterRegionInfo* region_info_floater = LLFloaterReg::getTypedInstance<LLFloaterRegionInfo>("region_info");
- if(region_info_floater)
- {
- region_info_floater->disableTopButtons();
- }
- disableRefreshBtn();
-
- msg->sendReliable(gAgent.getRegionHost());
-
- mFilter.clear();
- mFlags = 0;
-}
-
-void LLFloaterTopObjects::disableRefreshBtn()
-{
- getChildView("refresh_btn")->setEnabled(false);
-}
-
-void LLFloaterTopObjects::onGetByObjectName()
-{
- mFlags = STAT_FILTER_BY_OBJECT;
- mFilter = getChild<LLUICtrl>("object_name_editor")->getValue().asString();
- onRefresh();
-}
-
-void LLFloaterTopObjects::onGetByOwnerName()
-{
- mFlags = STAT_FILTER_BY_OWNER;
- mFilter = getChild<LLUICtrl>("owner_name_editor")->getValue().asString();
- onRefresh();
-}
-
-
-void LLFloaterTopObjects::onGetByParcelName()
-{
- mFlags = STAT_FILTER_BY_PARCEL_NAME;
- mFilter = getChild<LLUICtrl>("parcel_name_editor")->getValue().asString();
- onRefresh();
-}
-
-
-void LLFloaterTopObjects::showBeacon()
-{
- LLScrollListCtrl* list = getChild<LLScrollListCtrl>("objects_list");
- if (!list) return;
-
- LLScrollListItem* first_selected = list->getFirstSelected();
- if (!first_selected) return;
-
- std::string name = first_selected->getColumn(1)->getValue().asString();
- std::string pos_string = first_selected->getColumn(3)->getValue().asString();
-
- F32 x, y, z;
- S32 matched = sscanf(pos_string.c_str(), "<%g,%g,%g>", &x, &y, &z);
- if (matched != 3) return;
-
- LLVector3 pos_agent(x, y, z);
- LLVector3d pos_global = gAgent.getPosGlobalFromAgent(pos_agent);
- std::string tooltip("");
- LLTracker::trackLocation(pos_global, name, tooltip, LLTracker::LOCATION_ITEM);
-}
-
-void LLFloaterTopObjects::teleportToSelectedObject()
-{
- std::vector<LLScrollListItem*> selected_items = mObjectsScrollList->getAllSelected();
- if (selected_items.size() == 1)
- {
- LLScrollListItem* first_selected = selected_items.front();
-
- LLVector3d teleport_location;
- LLViewerObject *viewer_object = gObjectList.findObject(first_selected->getUUID());
- if (viewer_object == NULL)
- {
- // If we cannot find the object in the viewer list, teleport to the last reported position
- std::string pos_string = first_selected->getColumn(3)->getValue().asString();
-
- F32 x, y, z;
- S32 matched = sscanf(pos_string.c_str(), "<%g,%g,%g>", &x, &y, &z);
- if (matched != 3) return;
-
- LLVector3 pos_agent(x, y, z);
- teleport_location = gAgent.getPosGlobalFromAgent(pos_agent);
- }
- else
- {
- // If we can find the object in the viewer list, teleport to the known current position
- teleport_location = viewer_object->getPositionGlobal();
- }
- gAgent.teleportViaLocationLookAt(teleport_location);
- }
-}
-
-void LLFloaterTopObjects::onSelectionChanged()
-{
- getChildView("teleport_btn")->setEnabled(mObjectsScrollList->getNumSelected() == 1);
-}
+/**
+ * @file llfloatertopobjects.cpp
+ * @brief Shows top colliders, top scripts, etc.
+ *
+ * $LicenseInfo:firstyear=2005&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llfloatertopobjects.h"
+
+// library includes
+#include "message.h"
+#include "llavatarnamecache.h"
+#include "llfontgl.h"
+
+#include "llagent.h"
+#include "llbutton.h"
+#include "llfloatergodtools.h"
+#include "llfloaterreg.h"
+#include "llnotificationsutil.h"
+#include "llparcel.h"
+#include "llscrolllistctrl.h"
+#include "llscrolllistitem.h"
+#include "llscrolllistcell.h"
+#include "lllineeditor.h"
+#include "lltextbox.h"
+#include "lltracker.h"
+#include "llviewermessage.h"
+#include "llviewerparcelmgr.h"
+#include "llviewerregion.h"
+#include "lluictrlfactory.h"
+#include "llviewerobjectlist.h"
+#include "llviewerwindow.h"
+#include "llfloaterregioninfo.h"
+
+//LLFloaterTopObjects* LLFloaterTopObjects::sInstance = NULL;
+
+// Globals
+// const U32 TIME_STR_LENGTH = 30;
+/*
+// static
+void LLFloaterTopObjects::show()
+{
+ if (sInstance)
+ {
+ sInstance->setVisibleAndFrontmost();
+ return;
+ }
+
+ sInstance = new LLFloaterTopObjects();
+ sInstance->center();
+}
+*/
+LLFloaterTopObjects::LLFloaterTopObjects(const LLSD& key)
+: LLFloater(key),
+ mInitialized(false),
+ mtotalScore(0.f)
+{
+ mCommitCallbackRegistrar.add("TopObjects.ShowBeacon", boost::bind(&LLFloaterTopObjects::onClickShowBeacon, this));
+ mCommitCallbackRegistrar.add("TopObjects.ReturnSelected", boost::bind(&LLFloaterTopObjects::onReturnSelected, this));
+ mCommitCallbackRegistrar.add("TopObjects.ReturnAll", boost::bind(&LLFloaterTopObjects::onReturnAll, this));
+ mCommitCallbackRegistrar.add("TopObjects.Refresh", boost::bind(&LLFloaterTopObjects::onRefresh, this));
+ mCommitCallbackRegistrar.add("TopObjects.GetByObjectName", boost::bind(&LLFloaterTopObjects::onGetByObjectName, this));
+ mCommitCallbackRegistrar.add("TopObjects.GetByOwnerName", boost::bind(&LLFloaterTopObjects::onGetByOwnerName, this));
+ mCommitCallbackRegistrar.add("TopObjects.GetByParcelName", boost::bind(&LLFloaterTopObjects::onGetByParcelName, this));
+ mCommitCallbackRegistrar.add("TopObjects.CommitObjectsList",boost::bind(&LLFloaterTopObjects::onCommitObjectsList, this));
+
+ mCommitCallbackRegistrar.add("TopObjects.TeleportToSelected", boost::bind(&LLFloaterTopObjects::teleportToSelectedObject, this));
+}
+
+LLFloaterTopObjects::~LLFloaterTopObjects()
+{
+}
+
+// virtual
+bool LLFloaterTopObjects::postBuild()
+{
+ mObjectsScrollList = getChild<LLScrollListCtrl>("objects_list");
+ mObjectsScrollList->setFocus(true);
+ mObjectsScrollList->setDoubleClickCallback(onDoubleClickObjectsList, this);
+ mObjectsScrollList->setCommitOnSelectionChange(true);
+ mObjectsScrollList->setCommitCallback(boost::bind(&LLFloaterTopObjects::onSelectionChanged, this));
+
+ setDefaultBtn("show_beacon_btn");
+
+ mCurrentMode = STAT_REPORT_TOP_SCRIPTS;
+ mFlags = 0;
+ mFilter.clear();
+
+ return true;
+}
+// static
+void LLFloaterTopObjects::setMode(U32 mode)
+{
+ LLFloaterTopObjects* instance = LLFloaterReg::getTypedInstance<LLFloaterTopObjects>("top_objects");
+ if(!instance) return;
+ instance->mCurrentMode = mode;
+}
+
+// static
+void LLFloaterTopObjects::handle_land_reply(LLMessageSystem* msg, void** data)
+{
+ LLFloaterTopObjects* instance = LLFloaterReg::getTypedInstance<LLFloaterTopObjects>("top_objects");
+ if(instance && instance->isInVisibleChain())
+ {
+ instance->handleReply(msg, data);
+ //HACK: for some reason sometimes top scripts originally comes back
+ //with no results even though they're there
+ if (!instance->mObjectListIDs.size() && !instance->mInitialized)
+ {
+ instance->onRefresh();
+ instance->mInitialized = true;
+ }
+ }
+ else
+ {
+ LLFloaterRegionInfo* region_info_floater = LLFloaterReg::getTypedInstance<LLFloaterRegionInfo>("region_info");
+ if(region_info_floater)
+ {
+ region_info_floater->enableTopButtons();
+ }
+ }
+
+}
+
+void LLFloaterTopObjects::handleReply(LLMessageSystem *msg, void** data)
+{
+ U32 request_flags;
+ U32 total_count;
+ U64 total_memory = 0;
+
+ msg->getU32Fast(_PREHASH_RequestData, _PREHASH_RequestFlags, request_flags);
+ msg->getU32Fast(_PREHASH_RequestData, _PREHASH_TotalObjectCount, total_count);
+ msg->getU32Fast(_PREHASH_RequestData, _PREHASH_ReportType, mCurrentMode);
+
+ LLScrollListCtrl *list = getChild<LLScrollListCtrl>("objects_list");
+
+ S32 block_count = msg->getNumberOfBlocks("ReportData");
+ for (S32 block = 0; block < block_count; ++block)
+ {
+ U32 task_local_id;
+ U32 time_stamp = 0;
+ LLUUID task_id;
+ F32 location_x, location_y, location_z;
+ F32 score;
+ std::string name_buf;
+ std::string owner_buf;
+ std::string parcel_buf("unknown");
+ F32 mono_score = 0.f;
+ bool have_extended_data = false;
+ S32 public_urls = 0;
+ F32 script_memory = 0.f;
+
+ msg->getU32Fast(_PREHASH_ReportData, _PREHASH_TaskLocalID, task_local_id, block);
+ msg->getUUIDFast(_PREHASH_ReportData, _PREHASH_TaskID, task_id, block);
+ msg->getF32Fast(_PREHASH_ReportData, _PREHASH_LocationX, location_x, block);
+ msg->getF32Fast(_PREHASH_ReportData, _PREHASH_LocationY, location_y, block);
+ msg->getF32Fast(_PREHASH_ReportData, _PREHASH_LocationZ, location_z, block);
+ msg->getF32Fast(_PREHASH_ReportData, _PREHASH_Score, score, block);
+ msg->getStringFast(_PREHASH_ReportData, _PREHASH_TaskName, name_buf, block);
+ msg->getStringFast(_PREHASH_ReportData, _PREHASH_OwnerName, owner_buf, block);
+
+ if(msg->has("DataExtended"))
+ {
+ have_extended_data = true;
+ msg->getU32("DataExtended", "TimeStamp", time_stamp, block);
+ msg->getF32("DataExtended", "MonoScore", mono_score, block);
+ msg->getS32("DataExtended", "PublicURLs", public_urls, block);
+
+ std::string parcel_name;
+ F32 script_size = 0.f;
+ msg->getString("DataExtended", "ParcelName", parcel_name, block);
+ msg->getF32("DataExtended", "Size", script_size, block);
+ if (parcel_name.size() > 0 || script_size > 0)
+ {
+ parcel_buf = parcel_name;
+ script_memory = script_size;
+ total_memory += script_size;
+ }
+ }
+
+ LLSD element;
+
+ element["id"] = task_id;
+
+ LLSD columns;
+ S32 column_num = 0;
+ columns[column_num]["column"] = "score";
+ columns[column_num]["value"] = llformat("%0.3f", score);
+ columns[column_num++]["font"] = "SANSSERIF";
+
+ columns[column_num]["column"] = "name";
+ columns[column_num]["value"] = name_buf;
+ columns[column_num++]["font"] = "SANSSERIF";
+
+ // Owner names can have trailing spaces sent from server
+ LLStringUtil::trim(owner_buf);
+
+ // *TODO: Send owner_id from server and look up display name
+ owner_buf = LLCacheName::buildUsername(owner_buf);
+
+ columns[column_num]["column"] = "owner";
+ columns[column_num]["value"] = owner_buf;
+ columns[column_num++]["font"] = "SANSSERIF";
+
+ columns[column_num]["column"] = "location";
+ columns[column_num]["value"] = llformat("<%0.f, %0.f, %0.f>", location_x, location_y, location_z);
+ columns[column_num++]["font"] = "SANSSERIF";
+
+ columns[column_num]["column"] = "parcel";
+ columns[column_num]["value"] = parcel_buf;
+ columns[column_num++]["font"] = "SANSSERIF";
+
+ columns[column_num]["column"] = "time";
+ columns[column_num]["type"] = "date";
+ columns[column_num]["value"] = LLDate((time_t)time_stamp);
+ columns[column_num++]["font"] = "SANSSERIF";
+
+ if (mCurrentMode == STAT_REPORT_TOP_SCRIPTS
+ && have_extended_data)
+ {
+ columns[column_num]["column"] = "memory";
+ columns[column_num]["value"] = llformat("%0.0f", (script_memory / 1024.f));
+ columns[column_num++]["font"] = "SANSSERIF";
+
+ columns[column_num]["column"] = "URLs";
+ columns[column_num]["value"] = llformat("%d", public_urls);
+ columns[column_num++]["font"] = "SANSSERIF";
+ }
+ element["columns"] = columns;
+ list->addElement(element);
+
+ mObjectListData.append(element);
+ mObjectListIDs.push_back(task_id);
+
+ mtotalScore += score;
+ }
+
+ if (total_count == 0 && list->getItemCount() == 0)
+ {
+ list->setCommentText(getString("none_descriptor"));
+ }
+ else
+ {
+ list->selectFirstItem();
+ }
+
+ if (mCurrentMode == STAT_REPORT_TOP_SCRIPTS)
+ {
+ setTitle(getString("top_scripts_title"));
+ list->setColumnLabel("score", getString("scripts_score_label"));
+
+ LLUIString format = getString("top_scripts_text");
+ total_memory /= 1024;
+ format.setArg("[MEMORY]", llformat("%ld", total_memory));
+ format.setArg("[COUNT]", llformat("%d", total_count));
+ format.setArg("[TIME]", llformat("%0.3f", mtotalScore));
+ getChild<LLUICtrl>("title_text")->setValue(LLSD(format));
+ list->setColumnLabel("URLs", getString("URLs"));
+ list->setColumnLabel("memory", getString("memory"));
+ }
+ else
+ {
+ setTitle(getString("top_colliders_title"));
+ list->setColumnLabel("score", getString("colliders_score_label"));
+ list->setColumnLabel("URLs", "");
+ list->setColumnLabel("memory", "");
+ LLUIString format = getString("top_colliders_text");
+ format.setArg("[COUNT]", llformat("%d", total_count));
+ getChild<LLUICtrl>("title_text")->setValue(LLSD(format));
+ }
+
+ LLFloaterRegionInfo* region_info_floater = LLFloaterReg::getTypedInstance<LLFloaterRegionInfo>("region_info");
+ if(region_info_floater)
+ {
+ region_info_floater->enableTopButtons();
+ }
+ getChildView("refresh_btn")->setEnabled(true);
+}
+
+void LLFloaterTopObjects::onCommitObjectsList()
+{
+ updateSelectionInfo();
+}
+
+void LLFloaterTopObjects::updateSelectionInfo()
+{
+ LLScrollListCtrl* list = getChild<LLScrollListCtrl>("objects_list");
+
+ if (!list) return;
+
+ LLUUID object_id = list->getCurrentID();
+ if (object_id.isNull()) return;
+
+ std::string object_id_string = object_id.asString();
+
+ getChild<LLUICtrl>("id_editor")->setValue(LLSD(object_id_string));
+ LLScrollListItem* sli = list->getFirstSelected();
+ llassert(sli);
+ if (sli)
+ {
+ getChild<LLUICtrl>("object_name_editor")->setValue(sli->getColumn(1)->getValue().asString());
+ getChild<LLUICtrl>("owner_name_editor")->setValue(sli->getColumn(2)->getValue().asString());
+ getChild<LLUICtrl>("parcel_name_editor")->setValue(sli->getColumn(4)->getValue().asString());
+ }
+}
+
+// static
+void LLFloaterTopObjects::onDoubleClickObjectsList(void* data)
+{
+ LLFloaterTopObjects* self = (LLFloaterTopObjects*)data;
+ self->showBeacon();
+}
+
+// static
+void LLFloaterTopObjects::onClickShowBeacon()
+{
+ showBeacon();
+}
+
+void LLFloaterTopObjects::returnObjects(bool all)
+{
+ LLMessageSystem *msg = gMessageSystem;
+
+ LLViewerRegion* region = gAgent.getRegion();
+ if (!region) return;
+
+ LLCtrlListInterface *list = getChild<LLUICtrl>("objects_list")->getListInterface();
+ if (!list || list->getItemCount() == 0) return;
+
+ uuid_vec_t::iterator id_itor;
+
+ bool start_message = true;
+
+ for (id_itor = mObjectListIDs.begin(); id_itor != mObjectListIDs.end(); ++id_itor)
+ {
+ LLUUID task_id = *id_itor;
+ if (!all && !list->isSelected(task_id))
+ {
+ // Selected only
+ continue;
+ }
+ if (start_message)
+ {
+ msg->newMessageFast(_PREHASH_ParcelReturnObjects);
+ msg->nextBlockFast(_PREHASH_AgentData);
+ msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
+ msg->addUUIDFast(_PREHASH_SessionID,gAgent.getSessionID());
+ msg->nextBlockFast(_PREHASH_ParcelData);
+ msg->addS32Fast(_PREHASH_LocalID, -1); // Whole region
+ msg->addS32Fast(_PREHASH_ReturnType, RT_NONE);
+ start_message = false;
+ }
+
+ msg->nextBlockFast(_PREHASH_TaskIDs);
+ msg->addUUIDFast(_PREHASH_TaskID, task_id);
+
+ if (msg->isSendFullFast(_PREHASH_TaskIDs))
+ {
+ msg->sendReliable(region->getHost());
+ start_message = true;
+ }
+ }
+
+ if (!start_message)
+ {
+ msg->sendReliable(region->getHost());
+ }
+}
+
+//static
+bool LLFloaterTopObjects::callbackReturnAll(const LLSD& notification, const LLSD& response)
+{
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
+ LLFloaterTopObjects* instance = LLFloaterReg::getTypedInstance<LLFloaterTopObjects>("top_objects");
+ if(!instance) return false;
+ if (option == 0)
+ {
+ instance->returnObjects(true);
+ }
+ return false;
+}
+
+void LLFloaterTopObjects::onReturnAll()
+{
+ LLNotificationsUtil::add("ReturnAllTopObjects", LLSD(), LLSD(), &callbackReturnAll);
+}
+
+
+void LLFloaterTopObjects::onReturnSelected()
+{
+ returnObjects(false);
+}
+
+
+void LLFloaterTopObjects::clearList()
+{
+ LLCtrlListInterface *list = childGetListInterface("objects_list");
+
+ if (list)
+ {
+ list->operateOnAll(LLCtrlListInterface::OP_DELETE);
+ }
+
+ mObjectListData.clear();
+ mObjectListIDs.clear();
+ mtotalScore = 0.f;
+
+ onSelectionChanged();
+}
+
+
+void LLFloaterTopObjects::onRefresh()
+{
+ U32 mode = STAT_REPORT_TOP_SCRIPTS;
+ U32 flags = 0;
+ std::string filter = "";
+
+ mode = mCurrentMode;
+ flags = mFlags;
+ filter = mFilter;
+ clearList();
+
+ LLMessageSystem *msg = gMessageSystem;
+ msg->newMessageFast(_PREHASH_LandStatRequest);
+ msg->nextBlockFast(_PREHASH_AgentData);
+ msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID() );
+ msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID() );
+ msg->nextBlockFast(_PREHASH_RequestData);
+ msg->addU32Fast(_PREHASH_ReportType, mode);
+ msg->addU32Fast(_PREHASH_RequestFlags, flags);
+ msg->addStringFast(_PREHASH_Filter, filter);
+ msg->addS32Fast(_PREHASH_ParcelLocalID, 0);
+
+ LLFloaterRegionInfo* region_info_floater = LLFloaterReg::getTypedInstance<LLFloaterRegionInfo>("region_info");
+ if(region_info_floater)
+ {
+ region_info_floater->disableTopButtons();
+ }
+ disableRefreshBtn();
+
+ msg->sendReliable(gAgent.getRegionHost());
+
+ mFilter.clear();
+ mFlags = 0;
+}
+
+void LLFloaterTopObjects::disableRefreshBtn()
+{
+ getChildView("refresh_btn")->setEnabled(false);
+}
+
+void LLFloaterTopObjects::onGetByObjectName()
+{
+ mFlags = STAT_FILTER_BY_OBJECT;
+ mFilter = getChild<LLUICtrl>("object_name_editor")->getValue().asString();
+ onRefresh();
+}
+
+void LLFloaterTopObjects::onGetByOwnerName()
+{
+ mFlags = STAT_FILTER_BY_OWNER;
+ mFilter = getChild<LLUICtrl>("owner_name_editor")->getValue().asString();
+ onRefresh();
+}
+
+
+void LLFloaterTopObjects::onGetByParcelName()
+{
+ mFlags = STAT_FILTER_BY_PARCEL_NAME;
+ mFilter = getChild<LLUICtrl>("parcel_name_editor")->getValue().asString();
+ onRefresh();
+}
+
+
+void LLFloaterTopObjects::showBeacon()
+{
+ LLScrollListCtrl* list = getChild<LLScrollListCtrl>("objects_list");
+ if (!list) return;
+
+ LLScrollListItem* first_selected = list->getFirstSelected();
+ if (!first_selected) return;
+
+ std::string name = first_selected->getColumn(1)->getValue().asString();
+ std::string pos_string = first_selected->getColumn(3)->getValue().asString();
+
+ F32 x, y, z;
+ S32 matched = sscanf(pos_string.c_str(), "<%g,%g,%g>", &x, &y, &z);
+ if (matched != 3) return;
+
+ LLVector3 pos_agent(x, y, z);
+ LLVector3d pos_global = gAgent.getPosGlobalFromAgent(pos_agent);
+ std::string tooltip("");
+ LLTracker::trackLocation(pos_global, name, tooltip, LLTracker::LOCATION_ITEM);
+}
+
+void LLFloaterTopObjects::teleportToSelectedObject()
+{
+ std::vector<LLScrollListItem*> selected_items = mObjectsScrollList->getAllSelected();
+ if (selected_items.size() == 1)
+ {
+ LLScrollListItem* first_selected = selected_items.front();
+
+ LLVector3d teleport_location;
+ LLViewerObject *viewer_object = gObjectList.findObject(first_selected->getUUID());
+ if (viewer_object == NULL)
+ {
+ // If we cannot find the object in the viewer list, teleport to the last reported position
+ std::string pos_string = first_selected->getColumn(3)->getValue().asString();
+
+ F32 x, y, z;
+ S32 matched = sscanf(pos_string.c_str(), "<%g,%g,%g>", &x, &y, &z);
+ if (matched != 3) return;
+
+ LLVector3 pos_agent(x, y, z);
+ teleport_location = gAgent.getPosGlobalFromAgent(pos_agent);
+ }
+ else
+ {
+ // If we can find the object in the viewer list, teleport to the known current position
+ teleport_location = viewer_object->getPositionGlobal();
+ }
+ gAgent.teleportViaLocationLookAt(teleport_location);
+ }
+}
+
+void LLFloaterTopObjects::onSelectionChanged()
+{
+ getChildView("teleport_btn")->setEnabled(mObjectsScrollList->getNumSelected() == 1);
+}