llfloaterregioninfo.cpp
上传用户:king477883
上传日期:2021-03-01
资源大小:9553k
文件大小:94k
源码类别:

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llfloaterregioninfo.cpp
  3.  * @author Aaron Brashears
  4.  * @brief Implementation of the region info and controls floater and panels.
  5.  *
  6.  * $LicenseInfo:firstyear=2004&license=viewergpl$
  7.  * 
  8.  * Copyright (c) 2004-2010, Linden Research, Inc.
  9.  * 
  10.  * Second Life Viewer Source Code
  11.  * The source code in this file ("Source Code") is provided by Linden Lab
  12.  * to you under the terms of the GNU General Public License, version 2.0
  13.  * ("GPL"), unless you have obtained a separate licensing agreement
  14.  * ("Other License"), formally executed by you and Linden Lab.  Terms of
  15.  * the GPL can be found in doc/GPL-license.txt in this distribution, or
  16.  * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
  17.  * 
  18.  * There are special exceptions to the terms and conditions of the GPL as
  19.  * it is applied to this Source Code. View the full text of the exception
  20.  * in the file doc/FLOSS-exception.txt in this software distribution, or
  21.  * online at
  22.  * http://secondlifegrid.net/programs/open_source/licensing/flossexception
  23.  * 
  24.  * By copying, modifying or distributing this software, you acknowledge
  25.  * that you have read and understood your obligations described above,
  26.  * and agree to abide by those obligations.
  27.  * 
  28.  * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
  29.  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  30.  * COMPLETENESS OR PERFORMANCE.
  31.  * $/LicenseInfo$
  32.  */
  33. #include "llviewerprecompiledheaders.h"
  34. #include "llfloaterregioninfo.h"
  35. #include <algorithm>
  36. #include <functional>
  37. #include "lldir.h"
  38. #include "lldispatcher.h"
  39. #include "llglheaders.h"
  40. #include "llregionflags.h"
  41. #include "llstl.h"
  42. #include "llvfile.h"
  43. #include "llxfermanager.h"
  44. #include "indra_constants.h"
  45. #include "message.h"
  46. #include "llagent.h"
  47. #include "llappviewer.h"
  48. #include "llfloateravatarpicker.h"
  49. #include "llbutton.h" 
  50. #include "llcheckboxctrl.h"
  51. #include "llcombobox.h"
  52. #include "llfilepicker.h"
  53. #include "llfloatergodtools.h" // for send_sim_wide_deletes()
  54. #include "llfloatertopobjects.h" // added to fix SL-32336
  55. #include "llfloatergroups.h"
  56. #include "llfloaterreg.h"
  57. #include "llfloatertelehub.h"
  58. #include "llfloaterwindlight.h"
  59. #include "llinventorymodel.h"
  60. #include "lllineeditor.h"
  61. #include "llnamelistctrl.h"
  62. #include "llnotifications.h"
  63. #include "llnotificationsutil.h"
  64. #include "llscrolllistitem.h"
  65. #include "llsliderctrl.h"
  66. #include "llslurl.h"
  67. #include "llspinctrl.h"
  68. #include "lltabcontainer.h"
  69. #include "lltextbox.h"
  70. #include "llinventory.h"
  71. #include "lltexturectrl.h"
  72. #include "lltrans.h"
  73. #include "llviewercontrol.h"
  74. #include "lluictrlfactory.h"
  75. #include "llviewerinventory.h"
  76. #include "llviewertexture.h"
  77. #include "llviewertexturelist.h"
  78. #include "llviewerregion.h"
  79. #include "llviewerstats.h"
  80. #include "llviewertexteditor.h"
  81. #include "llviewerwindow.h"
  82. #include "llvlcomposition.h"
  83. #include "lltrans.h"
  84. #include "llagentui.h"
  85. const S32 TERRAIN_TEXTURE_COUNT = 4;
  86. const S32 CORNER_COUNT = 4;
  87. ///----------------------------------------------------------------------------
  88. /// Local class declaration
  89. ///----------------------------------------------------------------------------
  90. class LLDispatchEstateUpdateInfo : public LLDispatchHandler
  91. {
  92. public:
  93. LLDispatchEstateUpdateInfo() {}
  94. virtual ~LLDispatchEstateUpdateInfo() {}
  95. virtual bool operator()(
  96. const LLDispatcher* dispatcher,
  97. const std::string& key,
  98. const LLUUID& invoice,
  99. const sparam_t& strings);
  100. };
  101. class LLDispatchSetEstateAccess : public LLDispatchHandler
  102. {
  103. public:
  104. LLDispatchSetEstateAccess() {}
  105. virtual ~LLDispatchSetEstateAccess() {}
  106. virtual bool operator()(
  107. const LLDispatcher* dispatcher,
  108. const std::string& key,
  109. const LLUUID& invoice,
  110. const sparam_t& strings);
  111. };
  112. /*
  113. void unpack_request_params(
  114. LLMessageSystem* msg,
  115. LLDispatcher::sparam_t& strings,
  116. LLDispatcher::iparam_t& integers)
  117. {
  118. char str_buf[MAX_STRING];
  119. S32 str_count = msg->getNumberOfBlocksFast(_PREHASH_StringData);
  120. S32 i;
  121. for (i = 0; i < str_count; ++i)
  122. {
  123. // we treat the SParam as binary data (since it might be an 
  124. // LLUUID in compressed form which may have embedded 's,)
  125. str_buf[0] = '';
  126. S32 data_size = msg->getSizeFast(_PREHASH_StringData, i, _PREHASH_SParam);
  127. if (data_size >= 0)
  128. {
  129. msg->getBinaryDataFast(_PREHASH_StringData, _PREHASH_SParam,
  130.    str_buf, data_size, i, MAX_STRING - 1);
  131. strings.push_back(std::string(str_buf, data_size));
  132. }
  133. }
  134. U32 int_buf;
  135. S32 int_count = msg->getNumberOfBlocksFast(_PREHASH_IntegerData);
  136. for (i = 0; i < int_count; ++i)
  137. {
  138. msg->getU32("IntegerData", "IParam", int_buf, i);
  139. integers.push_back(int_buf);
  140. }
  141. }
  142. */
  143. bool estate_dispatch_initialized = false;
  144. ///----------------------------------------------------------------------------
  145. /// LLFloaterRegionInfo
  146. ///----------------------------------------------------------------------------
  147. //S32 LLFloaterRegionInfo::sRequestSerial = 0;
  148. LLUUID LLFloaterRegionInfo::sRequestInvoice;
  149. LLFloaterRegionInfo::LLFloaterRegionInfo(const LLSD& seed)
  150. : LLFloater(seed)
  151. {
  152. //LLUICtrlFactory::getInstance()->buildFloater(this, "floater_region_info.xml", FALSE);
  153. }
  154. BOOL LLFloaterRegionInfo::postBuild()
  155. {
  156. mTab = getChild<LLTabContainer>("region_panels");
  157. // contruct the panels
  158. LLPanelRegionInfo* panel;
  159. panel = new LLPanelRegionGeneralInfo;
  160. mInfoPanels.push_back(panel);
  161. panel->getCommitCallbackRegistrar().add("RegionInfo.ManageTelehub", boost::bind(&LLPanelRegionInfo::onClickManageTelehub, panel));
  162. LLUICtrlFactory::getInstance()->buildPanel(panel, "panel_region_general.xml");
  163. mTab->addTabPanel(LLTabContainer::TabPanelParams().panel(panel).select_tab(true));
  164. panel = new LLPanelRegionDebugInfo;
  165. mInfoPanels.push_back(panel);
  166. LLUICtrlFactory::getInstance()->buildPanel(panel, "panel_region_debug.xml");
  167. mTab->addTabPanel(panel);
  168. panel = new LLPanelRegionTextureInfo;
  169. mInfoPanels.push_back(panel);
  170. LLUICtrlFactory::getInstance()->buildPanel(panel, "panel_region_texture.xml");
  171. mTab->addTabPanel(panel);
  172. panel = new LLPanelRegionTerrainInfo;
  173. mInfoPanels.push_back(panel);
  174. LLUICtrlFactory::getInstance()->buildPanel(panel, "panel_region_terrain.xml");
  175. mTab->addTabPanel(panel);
  176. panel = new LLPanelEstateInfo;
  177. mInfoPanels.push_back(panel);
  178. LLUICtrlFactory::getInstance()->buildPanel(panel, "panel_region_estate.xml");
  179. mTab->addTabPanel(panel);
  180. panel = new LLPanelEstateCovenant;
  181. mInfoPanels.push_back(panel);
  182. LLUICtrlFactory::getInstance()->buildPanel(panel, "panel_region_covenant.xml");
  183. mTab->addTabPanel(panel);
  184. gMessageSystem->setHandlerFunc(
  185. "EstateOwnerMessage", 
  186. &processEstateOwnerRequest);
  187. return TRUE;
  188. }
  189. LLFloaterRegionInfo::~LLFloaterRegionInfo()
  190. {
  191. }
  192. void LLFloaterRegionInfo::onOpen(const LLSD& key)
  193. {
  194. refreshFromRegion(gAgent.getRegion());
  195. requestRegionInfo();
  196. }
  197. // static
  198. void LLFloaterRegionInfo::requestRegionInfo()
  199. {
  200. LLTabContainer* tab = getChild<LLTabContainer>("region_panels");
  201. tab->getChild<LLPanel>("General")->setCtrlsEnabled(FALSE);
  202. tab->getChild<LLPanel>("Debug")->setCtrlsEnabled(FALSE);
  203. tab->getChild<LLPanel>("Terrain")->setCtrlsEnabled(FALSE);
  204. tab->getChild<LLPanel>("Estate")->setCtrlsEnabled(FALSE);
  205. // Must allow anyone to request the RegionInfo data
  206. // so non-owners/non-gods can see the values. 
  207. // Therefore can't use an EstateOwnerMessage JC
  208. LLMessageSystem* msg = gMessageSystem;
  209. msg->newMessage("RequestRegionInfo");
  210. msg->nextBlock("AgentData");
  211. msg->addUUID("AgentID", gAgent.getID());
  212. msg->addUUID("SessionID", gAgent.getSessionID());
  213. gAgent.sendReliableMessage();
  214. }
  215. // static
  216. void LLFloaterRegionInfo::processEstateOwnerRequest(LLMessageSystem* msg,void**)
  217. {
  218. static LLDispatcher dispatch;
  219. LLFloaterRegionInfo* floater = LLFloaterReg::getTypedInstance<LLFloaterRegionInfo>("region_info");
  220. if(!floater)
  221. {
  222. return;
  223. }
  224. if (!estate_dispatch_initialized)
  225. {
  226. LLPanelEstateInfo::initDispatch(dispatch);
  227. }
  228. LLTabContainer* tab = floater->getChild<LLTabContainer>("region_panels");
  229. LLPanelEstateInfo* panel = (LLPanelEstateInfo*)tab->getChild<LLPanel>("Estate");
  230. // unpack the message
  231. std::string request;
  232. LLUUID invoice;
  233. LLDispatcher::sparam_t strings;
  234. LLDispatcher::unpackMessage(msg, request, invoice, strings);
  235. if(invoice != getLastInvoice())
  236. {
  237. llwarns << "Mismatched Estate message: " << request << llendl;
  238. return;
  239. }
  240. //dispatch the message
  241. dispatch.dispatch(request, invoice, strings);
  242. LLViewerRegion* region = gAgent.getRegion();
  243. panel->updateControls(region);
  244. }
  245. // static
  246. void LLFloaterRegionInfo::processRegionInfo(LLMessageSystem* msg)
  247. {
  248. LLPanel* panel;
  249. LLFloaterRegionInfo* floater = LLFloaterReg::getTypedInstance<LLFloaterRegionInfo>("region_info");
  250. llinfos << "LLFloaterRegionInfo::processRegionInfo" << llendl;
  251. if(!floater)
  252. {
  253. return;
  254. }
  255. LLTabContainer* tab = floater->getChild<LLTabContainer>("region_panels");
  256. LLViewerRegion* region = gAgent.getRegion();
  257. BOOL allow_modify = gAgent.isGodlike() || (region && region->canManageEstate());
  258. // extract message
  259. std::string sim_name;
  260. std::string sim_type = LLTrans::getString("land_type_unknown");
  261. U32 region_flags;
  262. U8 agent_limit;
  263. F32 object_bonus_factor;
  264. U8 sim_access;
  265. F32 water_height;
  266. F32 terrain_raise_limit;
  267. F32 terrain_lower_limit;
  268. BOOL use_estate_sun;
  269. F32 sun_hour;
  270. msg->getString("RegionInfo", "SimName", sim_name);
  271. msg->getU32("RegionInfo", "RegionFlags", region_flags);
  272. msg->getU8("RegionInfo", "MaxAgents", agent_limit);
  273. msg->getF32("RegionInfo", "ObjectBonusFactor", object_bonus_factor);
  274. msg->getU8("RegionInfo", "SimAccess", sim_access);
  275. msg->getF32Fast(_PREHASH_RegionInfo, _PREHASH_WaterHeight, water_height);
  276. msg->getF32Fast(_PREHASH_RegionInfo, _PREHASH_TerrainRaiseLimit, terrain_raise_limit);
  277. msg->getF32Fast(_PREHASH_RegionInfo, _PREHASH_TerrainLowerLimit, terrain_lower_limit);
  278. msg->getBOOL("RegionInfo", "UseEstateSun", use_estate_sun);
  279. // actually the "last set" sun hour, not the current sun hour. JC
  280. msg->getF32("RegionInfo", "SunHour", sun_hour);
  281. // the only reasonable way to decide if we actually have any data is to
  282. // check to see if any of these fields have nonzero sizes
  283. if (msg->getSize("RegionInfo2", "ProductSKU") > 0 ||
  284. msg->getSize("RegionInfo2", "ProductName") > 0)
  285. {
  286. msg->getString("RegionInfo2", "ProductName", sim_type);
  287. }
  288. // GENERAL PANEL
  289. panel = tab->getChild<LLPanel>("General");
  290. panel->childSetValue("region_text", LLSD(sim_name));
  291. panel->childSetValue("region_type", LLSD(sim_type));
  292. panel->childSetValue("version_channel_text", gLastVersionChannel);
  293. panel->childSetValue("block_terraform_check", (region_flags & REGION_FLAGS_BLOCK_TERRAFORM) ? TRUE : FALSE );
  294. panel->childSetValue("block_fly_check", (region_flags & REGION_FLAGS_BLOCK_FLY) ? TRUE : FALSE );
  295. panel->childSetValue("allow_damage_check", (region_flags & REGION_FLAGS_ALLOW_DAMAGE) ? TRUE : FALSE );
  296. panel->childSetValue("restrict_pushobject", (region_flags & REGION_FLAGS_RESTRICT_PUSHOBJECT) ? TRUE : FALSE );
  297. panel->childSetValue("allow_land_resell_check", (region_flags & REGION_FLAGS_BLOCK_LAND_RESELL) ? FALSE : TRUE );
  298. panel->childSetValue("allow_parcel_changes_check", (region_flags & REGION_FLAGS_ALLOW_PARCEL_CHANGES) ? TRUE : FALSE );
  299. panel->childSetValue("block_parcel_search_check", (region_flags & REGION_FLAGS_BLOCK_PARCEL_SEARCH) ? TRUE : FALSE );
  300. panel->childSetValue("agent_limit_spin", LLSD((F32)agent_limit) );
  301. panel->childSetValue("object_bonus_spin", LLSD(object_bonus_factor) );
  302. panel->childSetValue("access_combo", LLSD(sim_access) );
  303.   // detect teen grid for maturity
  304. U32 parent_estate_id;
  305. msg->getU32("RegionInfo", "ParentEstateID", parent_estate_id);
  306. BOOL teen_grid = (parent_estate_id == 5);  // *TODO add field to estate table and test that
  307. panel->childSetEnabled("access_combo", gAgent.isGodlike() || (region && region->canManageEstate() && !teen_grid));
  308. panel->setCtrlsEnabled(allow_modify);
  309. // DEBUG PANEL
  310. panel = tab->getChild<LLPanel>("Debug");
  311. panel->childSetValue("region_text", LLSD(sim_name) );
  312. panel->childSetValue("disable_scripts_check", LLSD((BOOL)(region_flags & REGION_FLAGS_SKIP_SCRIPTS)) );
  313. panel->childSetValue("disable_collisions_check", LLSD((BOOL)(region_flags & REGION_FLAGS_SKIP_COLLISIONS)) );
  314. panel->childSetValue("disable_physics_check", LLSD((BOOL)(region_flags & REGION_FLAGS_SKIP_PHYSICS)) );
  315. panel->setCtrlsEnabled(allow_modify);
  316. // TERRAIN PANEL
  317. panel = tab->getChild<LLPanel>("Terrain");
  318. panel->childSetValue("region_text", LLSD(sim_name));
  319. panel->childSetValue("water_height_spin", LLSD(water_height));
  320. panel->childSetValue("terrain_raise_spin", LLSD(terrain_raise_limit));
  321. panel->childSetValue("terrain_lower_spin", LLSD(terrain_lower_limit));
  322. panel->childSetValue("use_estate_sun_check", LLSD(use_estate_sun));
  323. panel->childSetValue("fixed_sun_check", LLSD((BOOL)(region_flags & REGION_FLAGS_SUN_FIXED)));
  324. panel->childSetEnabled("fixed_sun_check", allow_modify && !use_estate_sun);
  325. panel->childSetValue("sun_hour_slider", LLSD(sun_hour));
  326. panel->childSetEnabled("sun_hour_slider", allow_modify && !use_estate_sun);
  327. panel->setCtrlsEnabled(allow_modify);
  328. floater->refreshFromRegion( gAgent.getRegion() );
  329. }
  330. // static
  331. LLPanelEstateInfo* LLFloaterRegionInfo::getPanelEstate()
  332. {
  333. LLFloaterRegionInfo* floater = LLFloaterReg::getTypedInstance<LLFloaterRegionInfo>("region_info");
  334. if (!floater) return NULL;
  335. LLTabContainer* tab = floater->getChild<LLTabContainer>("region_panels");
  336. LLPanelEstateInfo* panel = (LLPanelEstateInfo*)tab->getChild<LLPanel>("Estate");
  337. return panel;
  338. }
  339. // static
  340. LLPanelEstateCovenant* LLFloaterRegionInfo::getPanelCovenant()
  341. {
  342. LLFloaterRegionInfo* floater = LLFloaterReg::getTypedInstance<LLFloaterRegionInfo>("region_info");
  343. if (!floater) return NULL;
  344. LLTabContainer* tab = floater->getChild<LLTabContainer>("region_panels");
  345. LLPanelEstateCovenant* panel = (LLPanelEstateCovenant*)tab->getChild<LLPanel>("Covenant");
  346. return panel;
  347. }
  348. void LLFloaterRegionInfo::refreshFromRegion(LLViewerRegion* region)
  349. {
  350. if (!region)
  351. {
  352. return; 
  353. }
  354. // call refresh from region on all panels
  355. std::for_each(
  356. mInfoPanels.begin(),
  357. mInfoPanels.end(),
  358. llbind2nd(
  359. #if LL_WINDOWS
  360. std::mem_fun1(&LLPanelRegionInfo::refreshFromRegion),
  361. #else
  362. std::mem_fun(&LLPanelRegionInfo::refreshFromRegion),
  363. #endif
  364. region));
  365. }
  366. // public
  367. void LLFloaterRegionInfo::refresh()
  368. {
  369. for(info_panels_t::iterator iter = mInfoPanels.begin();
  370. iter != mInfoPanels.end(); ++iter)
  371. {
  372. (*iter)->refresh();
  373. }
  374. }
  375. ///----------------------------------------------------------------------------
  376. /// Local class implementation
  377. ///----------------------------------------------------------------------------
  378. //
  379. // LLPanelRegionInfo
  380. //
  381. LLPanelRegionInfo::LLPanelRegionInfo()
  382. : LLPanel()
  383. {
  384. }
  385. void LLPanelRegionInfo::onBtnSet()
  386. {
  387. if (sendUpdate())
  388. {
  389. disableButton("apply_btn");
  390. }
  391. }
  392. void LLPanelRegionInfo::onChangeChildCtrl(LLUICtrl* ctrl)
  393. {
  394. updateChild(ctrl); // virtual function
  395. }
  396. // Enables the "set" button if it is not already enabled
  397. void LLPanelRegionInfo::onChangeAnything()
  398. {
  399. enableButton("apply_btn");
  400. refresh();
  401. }
  402. // static
  403. // Enables set button on change to line editor
  404. void LLPanelRegionInfo::onChangeText(LLLineEditor* caller, void* user_data)
  405. {
  406. LLPanelRegionInfo* panel = dynamic_cast<LLPanelRegionInfo*>(caller->getParent());
  407. if(panel)
  408. {
  409. panel->enableButton("apply_btn");
  410. panel->refresh();
  411. }
  412. }
  413. // virtual
  414. BOOL LLPanelRegionInfo::postBuild()
  415. {
  416. getChild<LLUICtrl>("apply_btn")->setCommitCallback(boost::bind(&LLPanelRegionInfo::onBtnSet, this));
  417. childDisable("apply_btn");
  418. refresh();
  419. return TRUE;
  420. }
  421. // virtual 
  422. void LLPanelRegionInfo::updateChild(LLUICtrl* child_ctr)
  423. {
  424. }
  425. // virtual
  426. bool LLPanelRegionInfo::refreshFromRegion(LLViewerRegion* region)
  427. {
  428. if (region) mHost = region->getHost();
  429. return true;
  430. }
  431. void LLPanelRegionInfo::sendEstateOwnerMessage(
  432. LLMessageSystem* msg,
  433. const std::string& request,
  434. const LLUUID& invoice,
  435. const strings_t& strings)
  436. {
  437. llinfos << "Sending estate request '" << request << "'" << llendl;
  438. msg->newMessage("EstateOwnerMessage");
  439. msg->nextBlockFast(_PREHASH_AgentData);
  440. msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
  441. msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
  442. msg->addUUIDFast(_PREHASH_TransactionID, LLUUID::null); //not used
  443. msg->nextBlock("MethodData");
  444. msg->addString("Method", request);
  445. msg->addUUID("Invoice", invoice);
  446. if(strings.empty())
  447. {
  448. msg->nextBlock("ParamList");
  449. msg->addString("Parameter", NULL);
  450. }
  451. else
  452. {
  453. strings_t::const_iterator it = strings.begin();
  454. strings_t::const_iterator end = strings.end();
  455. for(; it != end; ++it)
  456. {
  457. msg->nextBlock("ParamList");
  458. msg->addString("Parameter", *it);
  459. }
  460. }
  461. msg->sendReliable(mHost);
  462. }
  463. void LLPanelRegionInfo::enableButton(const std::string& btn_name, BOOL enable)
  464. {
  465. childSetEnabled(btn_name, enable);
  466. }
  467. void LLPanelRegionInfo::disableButton(const std::string& btn_name)
  468. {
  469. childDisable(btn_name);
  470. }
  471. void LLPanelRegionInfo::initCtrl(const std::string& name)
  472. {
  473. getChild<LLUICtrl>(name)->setCommitCallback(boost::bind(&LLPanelRegionInfo::onChangeAnything, this));
  474. }
  475. void LLPanelRegionInfo::onClickManageTelehub()
  476. {
  477. LLFloaterReg::hideInstance("region_info");
  478. LLFloaterReg::showInstance("telehubs");
  479. }
  480. /////////////////////////////////////////////////////////////////////////////
  481. // LLPanelRegionGeneralInfo
  482. //
  483. bool LLPanelRegionGeneralInfo::refreshFromRegion(LLViewerRegion* region)
  484. {
  485. BOOL allow_modify = gAgent.isGodlike() || (region && region->canManageEstate());
  486. setCtrlsEnabled(allow_modify);
  487. childDisable("apply_btn");
  488. childSetEnabled("access_text", allow_modify);
  489. // childSetEnabled("access_combo", allow_modify);
  490. // now set in processRegionInfo for teen grid detection
  491. childSetEnabled("kick_btn", allow_modify);
  492. childSetEnabled("kick_all_btn", allow_modify);
  493. childSetEnabled("im_btn", allow_modify);
  494. childSetEnabled("manage_telehub_btn", allow_modify);
  495. // Data gets filled in by processRegionInfo
  496. return LLPanelRegionInfo::refreshFromRegion(region);
  497. }
  498. BOOL LLPanelRegionGeneralInfo::postBuild()
  499. {
  500. // Enable the "Apply" button if something is changed. JC
  501. initCtrl("block_terraform_check");
  502. initCtrl("block_fly_check");
  503. initCtrl("allow_damage_check");
  504. initCtrl("allow_land_resell_check");
  505. initCtrl("allow_parcel_changes_check");
  506. initCtrl("agent_limit_spin");
  507. initCtrl("object_bonus_spin");
  508. initCtrl("access_combo");
  509. initCtrl("restrict_pushobject");
  510. initCtrl("block_parcel_search_check");
  511. childSetAction("kick_btn", boost::bind(&LLPanelRegionGeneralInfo::onClickKick, this));
  512. childSetAction("kick_all_btn", onClickKickAll, this);
  513. childSetAction("im_btn", onClickMessage, this);
  514. // childSetAction("manage_telehub_btn", onClickManageTelehub, this);
  515. return LLPanelRegionInfo::postBuild();
  516. }
  517. void LLPanelRegionGeneralInfo::onClickKick()
  518. {
  519. llinfos << "LLPanelRegionGeneralInfo::onClickKick" << llendl;
  520. // this depends on the grandparent view being a floater
  521. // in order to set up floater dependency
  522. LLFloater* parent_floater = gFloaterView->getParentFloater(this);
  523. LLFloater* child_floater = LLFloaterAvatarPicker::show(boost::bind(&LLPanelRegionGeneralInfo::onKickCommit, this, _1,_2), FALSE, TRUE);
  524. parent_floater->addDependentFloater(child_floater);
  525. }
  526. void LLPanelRegionGeneralInfo::onKickCommit(const std::vector<std::string>& names, const std::vector<LLUUID>& ids)
  527. {
  528. if (names.empty() || ids.empty()) return;
  529. if(ids[0].notNull())
  530. {
  531. strings_t strings;
  532. // [0] = our agent id
  533. // [1] = target agent id
  534. std::string buffer;
  535. gAgent.getID().toString(buffer);
  536. strings.push_back(buffer);
  537. ids[0].toString(buffer);
  538. strings.push_back(strings_t::value_type(buffer));
  539. LLUUID invoice(LLFloaterRegionInfo::getLastInvoice());
  540. sendEstateOwnerMessage(gMessageSystem, "teleporthomeuser", invoice, strings);
  541. }
  542. }
  543. // static
  544. void LLPanelRegionGeneralInfo::onClickKickAll(void* userdata)
  545. {
  546. llinfos << "LLPanelRegionGeneralInfo::onClickKickAll" << llendl;
  547. LLNotificationsUtil::add("KickUsersFromRegion", 
  548. LLSD(), 
  549. LLSD(), 
  550. boost::bind(&LLPanelRegionGeneralInfo::onKickAllCommit, (LLPanelRegionGeneralInfo*)userdata, _1, _2));
  551. }
  552. bool LLPanelRegionGeneralInfo::onKickAllCommit(const LLSD& notification, const LLSD& response)
  553. {
  554. S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
  555. if (option == 0)
  556. {
  557. strings_t strings;
  558. // [0] = our agent id
  559. std::string buffer;
  560. gAgent.getID().toString(buffer);
  561. strings.push_back(buffer);
  562. LLUUID invoice(LLFloaterRegionInfo::getLastInvoice());
  563. // historical message name
  564. sendEstateOwnerMessage(gMessageSystem, "teleporthomeallusers", invoice, strings);
  565. }
  566. return false;
  567. }
  568. // static
  569. void LLPanelRegionGeneralInfo::onClickMessage(void* userdata)
  570. {
  571. llinfos << "LLPanelRegionGeneralInfo::onClickMessage" << llendl;
  572. LLNotificationsUtil::add("MessageRegion", 
  573. LLSD(), 
  574. LLSD(), 
  575. boost::bind(&LLPanelRegionGeneralInfo::onMessageCommit, (LLPanelRegionGeneralInfo*)userdata, _1, _2));
  576. }
  577. // static
  578. bool LLPanelRegionGeneralInfo::onMessageCommit(const LLSD& notification, const LLSD& response)
  579. {
  580. if(LLNotificationsUtil::getSelectedOption(notification, response) != 0) return false;
  581. std::string text = response["message"].asString();
  582. if (text.empty()) return false;
  583. llinfos << "Message to everyone: " << text << llendl;
  584. strings_t strings;
  585. // [0] grid_x, unused here
  586. // [1] grid_y, unused here
  587. // [2] agent_id of sender
  588. // [3] sender name
  589. // [4] message
  590. strings.push_back("-1");
  591. strings.push_back("-1");
  592. std::string buffer;
  593. gAgent.getID().toString(buffer);
  594. strings.push_back(buffer);
  595. std::string name;
  596. LLAgentUI::buildFullname(name);
  597. strings.push_back(strings_t::value_type(name));
  598. strings.push_back(strings_t::value_type(text));
  599. LLUUID invoice(LLFloaterRegionInfo::getLastInvoice());
  600. sendEstateOwnerMessage(gMessageSystem, "simulatormessage", invoice, strings);
  601. return false;
  602. }
  603. // setregioninfo
  604. // strings[0] = 'Y' - block terraform, 'N' - not
  605. // strings[1] = 'Y' - block fly, 'N' - not
  606. // strings[2] = 'Y' - allow damage, 'N' - not
  607. // strings[3] = 'Y' - allow land sale, 'N' - not
  608. // strings[4] = agent limit
  609. // strings[5] = object bonus
  610. // strings[6] = sim access (0 = unknown, 13 = PG, 21 = Mature, 42 = Adult)
  611. // strings[7] = restrict pushobject
  612. // strings[8] = 'Y' - allow parcel subdivide, 'N' - not
  613. // strings[9] = 'Y' - block parcel search, 'N' - allow
  614. BOOL LLPanelRegionGeneralInfo::sendUpdate()
  615. {
  616. llinfos << "LLPanelRegionGeneralInfo::sendUpdate()" << llendl;
  617. // First try using a Cap.  If that fails use the old method.
  618. LLSD body;
  619. std::string url = gAgent.getRegion()->getCapability("DispatchRegionInfo");
  620. if (!url.empty())
  621. {
  622. body["block_terraform"] = childGetValue("block_terraform_check");
  623. body["block_fly"] = childGetValue("block_fly_check");
  624. body["allow_damage"] = childGetValue("allow_damage_check");
  625. body["allow_land_resell"] = childGetValue("allow_land_resell_check");
  626. body["agent_limit"] = childGetValue("agent_limit_spin");
  627. body["prim_bonus"] = childGetValue("object_bonus_spin");
  628. body["sim_access"] = childGetValue("access_combo");
  629. body["restrict_pushobject"] = childGetValue("restrict_pushobject");
  630. body["allow_parcel_changes"] = childGetValue("allow_parcel_changes_check");
  631. body["block_parcel_search"] = childGetValue("block_parcel_search_check");
  632. LLHTTPClient::post(url, body, new LLHTTPClient::Responder());
  633. }
  634. else
  635. {
  636. strings_t strings;
  637. std::string buffer;
  638. buffer = llformat("%s", (childGetValue("block_terraform_check").asBoolean() ? "Y" : "N"));
  639. strings.push_back(strings_t::value_type(buffer));
  640. buffer = llformat("%s", (childGetValue("block_fly_check").asBoolean() ? "Y" : "N"));
  641. strings.push_back(strings_t::value_type(buffer));
  642. buffer = llformat("%s", (childGetValue("allow_damage_check").asBoolean() ? "Y" : "N"));
  643. strings.push_back(strings_t::value_type(buffer));
  644. buffer = llformat("%s", (childGetValue("allow_land_resell_check").asBoolean() ? "Y" : "N"));
  645. strings.push_back(strings_t::value_type(buffer));
  646. F32 value = (F32)childGetValue("agent_limit_spin").asReal();
  647. buffer = llformat("%f", value);
  648. strings.push_back(strings_t::value_type(buffer));
  649. value = (F32)childGetValue("object_bonus_spin").asReal();
  650. buffer = llformat("%f", value);
  651. strings.push_back(strings_t::value_type(buffer));
  652. buffer = llformat("%d", childGetValue("access_combo").asInteger());
  653. strings.push_back(strings_t::value_type(buffer));
  654. buffer = llformat("%s", (childGetValue("restrict_pushobject").asBoolean() ? "Y" : "N"));
  655. strings.push_back(strings_t::value_type(buffer));
  656. buffer = llformat("%s", (childGetValue("allow_parcel_changes_check").asBoolean() ? "Y" : "N"));
  657. strings.push_back(strings_t::value_type(buffer));
  658. LLUUID invoice(LLFloaterRegionInfo::getLastInvoice());
  659. sendEstateOwnerMessage(gMessageSystem, "setregioninfo", invoice, strings);
  660. }
  661. // if we changed access levels, tell user about it
  662. LLViewerRegion* region = gAgent.getRegion();
  663. if (region && (childGetValue("access_combo").asInteger() != region->getSimAccess()) )
  664. {
  665. LLNotificationsUtil::add("RegionMaturityChange");
  666. }
  667. return TRUE;
  668. }
  669. /////////////////////////////////////////////////////////////////////////////
  670. // LLPanelRegionDebugInfo
  671. /////////////////////////////////////////////////////////////////////////////
  672. BOOL LLPanelRegionDebugInfo::postBuild()
  673. {
  674. LLPanelRegionInfo::postBuild();
  675. initCtrl("disable_scripts_check");
  676. initCtrl("disable_collisions_check");
  677. initCtrl("disable_physics_check");
  678. childSetAction("choose_avatar_btn", boost::bind(&LLPanelRegionDebugInfo::onClickChooseAvatar, this));
  679. childSetAction("return_btn", onClickReturn, this);
  680. childSetAction("top_colliders_btn", onClickTopColliders, this);
  681. childSetAction("top_scripts_btn", onClickTopScripts, this);
  682. childSetAction("restart_btn", onClickRestart, this);
  683. childSetAction("cancel_restart_btn", onClickCancelRestart, this);
  684. return TRUE;
  685. }
  686. // virtual
  687. bool LLPanelRegionDebugInfo::refreshFromRegion(LLViewerRegion* region)
  688. {
  689. BOOL allow_modify = gAgent.isGodlike() || (region && region->canManageEstate());
  690. setCtrlsEnabled(allow_modify);
  691. childDisable("apply_btn");
  692. childDisable("target_avatar_name");
  693. childSetEnabled("choose_avatar_btn", allow_modify);
  694. childSetEnabled("return_scripts", allow_modify && !mTargetAvatar.isNull());
  695. childSetEnabled("return_other_land", allow_modify && !mTargetAvatar.isNull());
  696. childSetEnabled("return_estate_wide", allow_modify && !mTargetAvatar.isNull());
  697. childSetEnabled("return_btn", allow_modify && !mTargetAvatar.isNull());
  698. childSetEnabled("top_colliders_btn", allow_modify);
  699. childSetEnabled("top_scripts_btn", allow_modify);
  700. childSetEnabled("restart_btn", allow_modify);
  701. childSetEnabled("cancel_restart_btn", allow_modify);
  702. return LLPanelRegionInfo::refreshFromRegion(region);
  703. }
  704. // virtual
  705. BOOL LLPanelRegionDebugInfo::sendUpdate()
  706. {
  707. llinfos << "LLPanelRegionDebugInfo::sendUpdate" << llendl;
  708. strings_t strings;
  709. std::string buffer;
  710. buffer = llformat("%s", (childGetValue("disable_scripts_check").asBoolean() ? "Y" : "N"));
  711. strings.push_back(buffer);
  712. buffer = llformat("%s", (childGetValue("disable_collisions_check").asBoolean() ? "Y" : "N"));
  713. strings.push_back(buffer);
  714. buffer = llformat("%s", (childGetValue("disable_physics_check").asBoolean() ? "Y" : "N"));
  715. strings.push_back(buffer);
  716. LLUUID invoice(LLFloaterRegionInfo::getLastInvoice());
  717. sendEstateOwnerMessage(gMessageSystem, "setregiondebug", invoice, strings);
  718. return TRUE;
  719. }
  720. void LLPanelRegionDebugInfo::onClickChooseAvatar()
  721. {
  722. LLFloaterAvatarPicker::show(boost::bind(&LLPanelRegionDebugInfo::callbackAvatarID, this, _1, _2), FALSE, TRUE);
  723. }
  724. void LLPanelRegionDebugInfo::callbackAvatarID(const std::vector<std::string>& names, const std::vector<LLUUID>& ids)
  725. {
  726. if (ids.empty() || names.empty()) return;
  727. mTargetAvatar = ids[0];
  728. childSetValue("target_avatar_name", LLSD(names[0]));
  729. refreshFromRegion( gAgent.getRegion() );
  730. }
  731. // static
  732. void LLPanelRegionDebugInfo::onClickReturn(void* data)
  733. {
  734. LLPanelRegionDebugInfo* panelp = (LLPanelRegionDebugInfo*) data;
  735. if (panelp->mTargetAvatar.isNull()) return;
  736. LLSD args;
  737. args["USER_NAME"] = panelp->childGetValue("target_avatar_name").asString();
  738. LLSD payload;
  739. payload["avatar_id"] = panelp->mTargetAvatar;
  740. U32 flags = SWD_ALWAYS_RETURN_OBJECTS;
  741. if (panelp->childGetValue("return_scripts").asBoolean())
  742. {
  743. flags |= SWD_SCRIPTED_ONLY;
  744. }
  745. if (panelp->childGetValue("return_other_land").asBoolean())
  746. {
  747. flags |= SWD_OTHERS_LAND_ONLY;
  748. }
  749. payload["flags"] = int(flags);
  750. payload["return_estate_wide"] = panelp->childGetValue("return_estate_wide").asBoolean();
  751. LLNotificationsUtil::add("EstateObjectReturn", args, payload, 
  752. boost::bind(&LLPanelRegionDebugInfo::callbackReturn, panelp, _1, _2));
  753. }
  754. bool LLPanelRegionDebugInfo::callbackReturn(const LLSD& notification, const LLSD& response)
  755. {
  756. S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
  757. if (option != 0) return false;
  758. LLUUID target_avatar = notification["payload"]["avatar_id"].asUUID();
  759. if (!target_avatar.isNull())
  760. {
  761. U32 flags = notification["payload"]["flags"].asInteger();
  762. bool return_estate_wide = notification["payload"]["return_estate_wide"];
  763. if (return_estate_wide)
  764. {
  765. // send as estate message - routed by spaceserver to all regions in estate
  766. strings_t strings;
  767. strings.push_back(llformat("%d", flags));
  768. strings.push_back(target_avatar.asString());
  769. LLUUID invoice(LLFloaterRegionInfo::getLastInvoice());
  770. sendEstateOwnerMessage(gMessageSystem, "estateobjectreturn", invoice, strings);
  771. }
  772. else
  773. {
  774. // send to this simulator only
  775.    send_sim_wide_deletes(target_avatar, flags);
  776.    }
  777. }
  778. return false;
  779. }
  780. // static
  781. void LLPanelRegionDebugInfo::onClickTopColliders(void* data)
  782. {
  783. LLPanelRegionDebugInfo* self = (LLPanelRegionDebugInfo*)data;
  784. strings_t strings;
  785. strings.push_back("1"); // one physics step
  786. LLUUID invoice(LLFloaterRegionInfo::getLastInvoice());
  787. LLFloaterTopObjects* instance = LLFloaterReg::getTypedInstance<LLFloaterTopObjects>("top_objects");
  788. if(!instance) return;
  789. LLFloaterReg::showInstance("top_objects");
  790. instance->clearList();
  791. self->sendEstateOwnerMessage(gMessageSystem, "colliders", invoice, strings);
  792. }
  793. // static
  794. void LLPanelRegionDebugInfo::onClickTopScripts(void* data)
  795. {
  796. LLPanelRegionDebugInfo* self = (LLPanelRegionDebugInfo*)data;
  797. strings_t strings;
  798. strings.push_back("6"); // top 5 scripts
  799. LLUUID invoice(LLFloaterRegionInfo::getLastInvoice());
  800. LLFloaterTopObjects* instance = LLFloaterReg::getTypedInstance<LLFloaterTopObjects>("top_objects");
  801. if(!instance) return;
  802. LLFloaterReg::showInstance("top_objects");
  803. instance->clearList();
  804. self->sendEstateOwnerMessage(gMessageSystem, "scripts", invoice, strings);
  805. }
  806. // static
  807. void LLPanelRegionDebugInfo::onClickRestart(void* data)
  808. {
  809. LLNotificationsUtil::add("ConfirmRestart", LLSD(), LLSD(), 
  810. boost::bind(&LLPanelRegionDebugInfo::callbackRestart, (LLPanelRegionDebugInfo*)data, _1, _2));
  811. }
  812. bool LLPanelRegionDebugInfo::callbackRestart(const LLSD& notification, const LLSD& response)
  813. {
  814. S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
  815. if (option != 0) return false;
  816. strings_t strings;
  817. strings.push_back("120");
  818. LLUUID invoice(LLFloaterRegionInfo::getLastInvoice());
  819. sendEstateOwnerMessage(gMessageSystem, "restart", invoice, strings);
  820. return false;
  821. }
  822. // static
  823. void LLPanelRegionDebugInfo::onClickCancelRestart(void* data)
  824. {
  825. LLPanelRegionDebugInfo* self = (LLPanelRegionDebugInfo*)data;
  826. strings_t strings;
  827. strings.push_back("-1");
  828. LLUUID invoice(LLFloaterRegionInfo::getLastInvoice());
  829. self->sendEstateOwnerMessage(gMessageSystem, "restart", invoice, strings);
  830. }
  831. /////////////////////////////////////////////////////////////////////////////
  832. // LLPanelRegionTextureInfo
  833. //
  834. LLPanelRegionTextureInfo::LLPanelRegionTextureInfo() : LLPanelRegionInfo()
  835. {
  836. // nothing.
  837. }
  838. bool LLPanelRegionTextureInfo::refreshFromRegion(LLViewerRegion* region)
  839. {
  840. BOOL allow_modify = gAgent.isGodlike() || (region && region->canManageEstate());
  841. setCtrlsEnabled(allow_modify);
  842. childDisable("apply_btn");
  843. if (region)
  844. {
  845. childSetValue("region_text", LLSD(region->getName()));
  846. }
  847. else
  848. {
  849. childSetValue("region_text", LLSD(""));
  850. }
  851. if (!region) return LLPanelRegionInfo::refreshFromRegion(region);
  852. LLVLComposition* compp = region->getComposition();
  853. LLTextureCtrl* texture_ctrl;
  854. std::string buffer;
  855. for(S32 i = 0; i < TERRAIN_TEXTURE_COUNT; ++i)
  856. {
  857. buffer = llformat("texture_detail_%d", i);
  858. texture_ctrl = getChild<LLTextureCtrl>(buffer);
  859. if(texture_ctrl)
  860. {
  861. lldebugs << "Detail Texture " << i << ": "
  862.  << compp->getDetailTextureID(i) << llendl;
  863. LLUUID tmp_id(compp->getDetailTextureID(i));
  864. texture_ctrl->setImageAssetID(tmp_id);
  865. }
  866. }
  867. for(S32 i = 0; i < CORNER_COUNT; ++i)
  868.     {
  869. buffer = llformat("height_start_spin_%d", i);
  870. childSetValue(buffer, LLSD(compp->getStartHeight(i)));
  871. buffer = llformat("height_range_spin_%d", i);
  872. childSetValue(buffer, LLSD(compp->getHeightRange(i)));
  873. }
  874. // Call the parent for common book-keeping
  875. return LLPanelRegionInfo::refreshFromRegion(region);
  876. }
  877. BOOL LLPanelRegionTextureInfo::postBuild()
  878. {
  879. LLPanelRegionInfo::postBuild();
  880. std::string buffer;
  881. for(S32 i = 0; i < TERRAIN_TEXTURE_COUNT; ++i)
  882. {
  883. buffer = llformat("texture_detail_%d", i);
  884. initCtrl(buffer);
  885. }
  886. for(S32 i = 0; i < CORNER_COUNT; ++i)
  887. {
  888. buffer = llformat("height_start_spin_%d", i);
  889. initCtrl(buffer);
  890. buffer = llformat("height_range_spin_%d", i);
  891. initCtrl(buffer);
  892. }
  893. // LLButton* btn = ("dump", LLRect(0, 20, 100, 0), "", onClickDump, this);
  894. // btn->setFollows(FOLLOWS_TOP|FOLLOWS_LEFT);
  895. // addChild(btn);
  896. return LLPanelRegionInfo::postBuild();
  897. }
  898. BOOL LLPanelRegionTextureInfo::sendUpdate()
  899. {
  900. llinfos << "LLPanelRegionTextureInfo::sendUpdate()" << llendl;
  901. // Make sure user hasn't chosen wacky textures.
  902. if (!validateTextureSizes())
  903. {
  904. return FALSE;
  905. }
  906. LLTextureCtrl* texture_ctrl;
  907. std::string buffer;
  908. std::string id_str;
  909. LLMessageSystem* msg = gMessageSystem;
  910. strings_t strings;
  911. LLUUID invoice(LLFloaterRegionInfo::getLastInvoice());
  912. for(S32 i = 0; i < TERRAIN_TEXTURE_COUNT; ++i)
  913. {
  914. buffer = llformat("texture_detail_%d", i);
  915. texture_ctrl = getChild<LLTextureCtrl>(buffer);
  916. if(texture_ctrl)
  917. {
  918. LLUUID tmp_id(texture_ctrl->getImageAssetID());
  919. tmp_id.toString(id_str);
  920. buffer = llformat("%d %s", i, id_str.c_str());
  921. strings.push_back(buffer);
  922. }
  923. }
  924. sendEstateOwnerMessage(msg, "texturedetail", invoice, strings);
  925. strings.clear();
  926. for(S32 i = 0; i < CORNER_COUNT; ++i)
  927. {
  928. buffer = llformat("height_start_spin_%d", i);
  929. std::string buffer2 = llformat("height_range_spin_%d", i);
  930. std::string buffer3 = llformat("%d %f %f", i, (F32)childGetValue(buffer).asReal(), (F32)childGetValue(buffer2).asReal());
  931. strings.push_back(buffer3);
  932. }
  933. sendEstateOwnerMessage(msg, "textureheights", invoice, strings);
  934. strings.clear();
  935. sendEstateOwnerMessage(msg, "texturecommit", invoice, strings);
  936. return TRUE;
  937. }
  938. BOOL LLPanelRegionTextureInfo::validateTextureSizes()
  939. {
  940. for(S32 i = 0; i < TERRAIN_TEXTURE_COUNT; ++i)
  941. {
  942. std::string buffer;
  943. buffer = llformat("texture_detail_%d", i);
  944. LLTextureCtrl* texture_ctrl = getChild<LLTextureCtrl>(buffer);
  945. if (!texture_ctrl) continue;
  946. LLUUID image_asset_id = texture_ctrl->getImageAssetID();
  947. LLViewerTexture* img = LLViewerTextureManager::getFetchedTexture(image_asset_id);
  948. S32 components = img->getComponents();
  949. // Must ask for highest resolution version's width. JC
  950. S32 width = img->getFullWidth();
  951. S32 height = img->getFullHeight();
  952. //llinfos << "texture detail " << i << " is " << width << "x" << height << "x" << components << llendl;
  953. if (components != 3)
  954. {
  955. LLSD args;
  956. args["TEXTURE_NUM"] = i+1;
  957. args["TEXTURE_BIT_DEPTH"] = llformat("%d",components * 8);
  958. LLNotificationsUtil::add("InvalidTerrainBitDepth", args);
  959. return FALSE;
  960. }
  961. if (width > 512 || height > 512)
  962. {
  963. LLSD args;
  964. args["TEXTURE_NUM"] = i+1;
  965. args["TEXTURE_SIZE_X"] = width;
  966. args["TEXTURE_SIZE_Y"] = height;
  967. LLNotificationsUtil::add("InvalidTerrainSize", args);
  968. return FALSE;
  969. }
  970. }
  971. return TRUE;
  972. }
  973. // static
  974. void LLPanelRegionTextureInfo::onClickDump(void* data)
  975. {
  976. llinfos << "LLPanelRegionTextureInfo::onClickDump()" << llendl;
  977. }
  978. /////////////////////////////////////////////////////////////////////////////
  979. // LLPanelRegionTerrainInfo
  980. /////////////////////////////////////////////////////////////////////////////
  981. BOOL LLPanelRegionTerrainInfo::postBuild()
  982. {
  983. LLPanelRegionInfo::postBuild();
  984. initCtrl("water_height_spin");
  985. initCtrl("terrain_raise_spin");
  986. initCtrl("terrain_lower_spin");
  987. initCtrl("fixed_sun_check");
  988. getChild<LLUICtrl>("fixed_sun_check")->setCommitCallback(boost::bind(&LLPanelRegionTerrainInfo::onChangeFixedSun, this));
  989. getChild<LLUICtrl>("use_estate_sun_check")->setCommitCallback(boost::bind(&LLPanelRegionTerrainInfo::onChangeUseEstateTime, this));
  990. getChild<LLUICtrl>("sun_hour_slider")->setCommitCallback(boost::bind(&LLPanelRegionTerrainInfo::onChangeSunHour, this));
  991. childSetAction("download_raw_btn", onClickDownloadRaw, this);
  992. childSetAction("upload_raw_btn", onClickUploadRaw, this);
  993. childSetAction("bake_terrain_btn", onClickBakeTerrain, this);
  994. return TRUE;
  995. }
  996. // virtual
  997. bool LLPanelRegionTerrainInfo::refreshFromRegion(LLViewerRegion* region)
  998. {
  999. llinfos << "LLPanelRegionTerrainInfo::refreshFromRegion" << llendl;
  1000. BOOL owner_or_god = gAgent.isGodlike() 
  1001. || (region && (region->getOwner() == gAgent.getID()));
  1002. BOOL owner_or_god_or_manager = owner_or_god
  1003. || (region && region->isEstateManager());
  1004. setCtrlsEnabled(owner_or_god_or_manager);
  1005. childDisable("apply_btn");
  1006. childSetEnabled("download_raw_btn", owner_or_god);
  1007. childSetEnabled("upload_raw_btn", owner_or_god);
  1008. childSetEnabled("bake_terrain_btn", owner_or_god);
  1009. return LLPanelRegionInfo::refreshFromRegion(region);
  1010. }
  1011. // virtual
  1012. BOOL LLPanelRegionTerrainInfo::sendUpdate()
  1013. {
  1014. llinfos << "LLPanelRegionTerrainInfo::sendUpdate" << llendl;
  1015. std::string buffer;
  1016. strings_t strings;
  1017. LLUUID invoice(LLFloaterRegionInfo::getLastInvoice());
  1018. buffer = llformat("%f", (F32)childGetValue("water_height_spin").asReal());
  1019. strings.push_back(buffer);
  1020. buffer = llformat("%f", (F32)childGetValue("terrain_raise_spin").asReal());
  1021. strings.push_back(buffer);
  1022. buffer = llformat("%f", (F32)childGetValue("terrain_lower_spin").asReal());
  1023. strings.push_back(buffer);
  1024. buffer = llformat("%s", (childGetValue("use_estate_sun_check").asBoolean() ? "Y" : "N"));
  1025. strings.push_back(buffer);
  1026. buffer = llformat("%s", (childGetValue("fixed_sun_check").asBoolean() ? "Y" : "N"));
  1027. strings.push_back(buffer);
  1028. buffer = llformat("%f", (F32)childGetValue("sun_hour_slider").asReal() );
  1029. strings.push_back(buffer);
  1030. // Grab estate information in case the user decided to set the
  1031. // region back to estate time. JC
  1032. LLFloaterRegionInfo* floater = LLFloaterReg::getTypedInstance<LLFloaterRegionInfo>("region_info");
  1033. if (!floater) return true;
  1034. LLTabContainer* tab = floater->getChild<LLTabContainer>("region_panels");
  1035. if (!tab) return true;
  1036. LLPanelEstateInfo* panel = (LLPanelEstateInfo*)tab->getChild<LLPanel>("Estate");
  1037. if (!panel) return true;
  1038. BOOL estate_global_time = panel->getGlobalTime();
  1039. BOOL estate_fixed_sun = panel->getFixedSun();
  1040. F32 estate_sun_hour;
  1041. if (estate_global_time)
  1042. {
  1043. estate_sun_hour = 0.f;
  1044. }
  1045. else
  1046. {
  1047. estate_sun_hour = panel->getSunHour();
  1048. }
  1049. buffer = llformat("%s", (estate_global_time ? "Y" : "N") );
  1050. strings.push_back(buffer);
  1051. buffer = llformat("%s", (estate_fixed_sun ? "Y" : "N") );
  1052. strings.push_back(buffer);
  1053. buffer = llformat("%f", estate_sun_hour);
  1054. strings.push_back(buffer);
  1055. sendEstateOwnerMessage(gMessageSystem, "setregionterrain", invoice, strings);
  1056. return TRUE;
  1057. }
  1058. void LLPanelRegionTerrainInfo::onChangeUseEstateTime()
  1059. {
  1060. BOOL use_estate_sun = childGetValue("use_estate_sun_check").asBoolean();
  1061. childSetEnabled("fixed_sun_check", !use_estate_sun);
  1062. childSetEnabled("sun_hour_slider", !use_estate_sun);
  1063. if (use_estate_sun)
  1064. {
  1065. childSetValue("fixed_sun_check", LLSD(FALSE));
  1066. childSetValue("sun_hour_slider", LLSD(0.f));
  1067. }
  1068. childEnable("apply_btn");
  1069. }
  1070. void LLPanelRegionTerrainInfo::onChangeFixedSun()
  1071. {
  1072. // Just enable the apply button.  We let the sun-hour slider be enabled
  1073. // for both fixed-sun and non-fixed-sun. JC
  1074. childEnable("apply_btn");
  1075. }
  1076. void LLPanelRegionTerrainInfo::onChangeSunHour()
  1077. {
  1078. childEnable("apply_btn");
  1079. }
  1080. // static
  1081. void LLPanelRegionTerrainInfo::onClickDownloadRaw(void* data)
  1082. {
  1083. LLFilePicker& picker = LLFilePicker::instance();
  1084. if (!picker.getSaveFile(LLFilePicker::FFSAVE_RAW, "terrain.raw"))
  1085. {
  1086. llwarns << "No file" << llendl;
  1087. return;
  1088. }
  1089. std::string filepath = picker.getFirstFile();
  1090. gXferManager->expectFileForRequest(filepath);
  1091. LLPanelRegionTerrainInfo* self = (LLPanelRegionTerrainInfo*)data;
  1092. strings_t strings;
  1093. strings.push_back("download filename");
  1094. strings.push_back(filepath);
  1095. LLUUID invoice(LLFloaterRegionInfo::getLastInvoice());
  1096. self->sendEstateOwnerMessage(gMessageSystem, "terrain", invoice, strings);
  1097. }
  1098. // static
  1099. void LLPanelRegionTerrainInfo::onClickUploadRaw(void* data)
  1100. {
  1101. LLFilePicker& picker = LLFilePicker::instance();
  1102. if (!picker.getOpenFile(LLFilePicker::FFLOAD_RAW))
  1103. {
  1104. llwarns << "No file" << llendl;
  1105. return;
  1106. }
  1107. std::string filepath = picker.getFirstFile();
  1108. gXferManager->expectFileForTransfer(filepath);
  1109. LLPanelRegionTerrainInfo* self = (LLPanelRegionTerrainInfo*)data;
  1110. strings_t strings;
  1111. strings.push_back("upload filename");
  1112. strings.push_back(filepath);
  1113. LLUUID invoice(LLFloaterRegionInfo::getLastInvoice());
  1114. self->sendEstateOwnerMessage(gMessageSystem, "terrain", invoice, strings);
  1115. LLNotificationsUtil::add("RawUploadStarted");
  1116. }
  1117. // static
  1118. void LLPanelRegionTerrainInfo::onClickBakeTerrain(void* data)
  1119. {
  1120. LLNotificationsUtil::add("ConfirmBakeTerrain", LLSD(), LLSD(), boost::bind(&LLPanelRegionTerrainInfo::callbackBakeTerrain, (LLPanelRegionTerrainInfo*)data, _1, _2));
  1121. }
  1122. bool LLPanelRegionTerrainInfo::callbackBakeTerrain(const LLSD& notification, const LLSD& response)
  1123. {
  1124. S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
  1125. if (option != 0) return false;
  1126. strings_t strings;
  1127. strings.push_back("bake");
  1128. LLUUID invoice(LLFloaterRegionInfo::getLastInvoice());
  1129. sendEstateOwnerMessage(gMessageSystem, "terrain", invoice, strings);
  1130. return false;
  1131. }
  1132. /////////////////////////////////////////////////////////////////////////////
  1133. // LLPanelEstateInfo
  1134. //
  1135. LLPanelEstateInfo::LLPanelEstateInfo() 
  1136. : LLPanelRegionInfo(),
  1137. mEstateID(0) // invalid
  1138. {
  1139. }
  1140. // static
  1141. void LLPanelEstateInfo::initDispatch(LLDispatcher& dispatch)
  1142. {
  1143. std::string name;
  1144. // name.assign("setowner");
  1145. // static LLDispatchSetEstateOwner set_owner;
  1146. // dispatch.addHandler(name, &set_owner);
  1147. name.assign("estateupdateinfo");
  1148. static LLDispatchEstateUpdateInfo estate_update_info;
  1149. dispatch.addHandler(name, &estate_update_info);
  1150. name.assign("setaccess");
  1151. static LLDispatchSetEstateAccess set_access;
  1152. dispatch.addHandler(name, &set_access);
  1153. estate_dispatch_initialized = true;
  1154. }
  1155. // Disables the sun-hour slider and the use fixed time check if the use global time is check
  1156. void LLPanelEstateInfo::onChangeUseGlobalTime()
  1157. {
  1158. bool enabled = !childGetValue("use_global_time_check").asBoolean();
  1159. childSetEnabled("sun_hour_slider", enabled);
  1160. childSetEnabled("fixed_sun_check", enabled);
  1161. childSetValue("fixed_sun_check", LLSD(FALSE));
  1162. enableButton("apply_btn");
  1163. }
  1164. // Enables the sun-hour slider if the fixed-sun checkbox is set
  1165. void LLPanelEstateInfo::onChangeFixedSun()
  1166. {
  1167. bool enabled = !childGetValue("fixed_sun_check").asBoolean();
  1168. childSetEnabled("use_global_time_check", enabled);
  1169. childSetValue("use_global_time_check", LLSD(FALSE));
  1170. enableButton("apply_btn");
  1171. }
  1172. //---------------------------------------------------------------------------
  1173. // Add/Remove estate access button callbacks
  1174. //---------------------------------------------------------------------------
  1175. void LLPanelEstateInfo::onClickEditSky(void* user_data)
  1176. {
  1177. LLFloaterReg::showInstance("env_windlight");
  1178. }
  1179. void LLPanelEstateInfo::onClickEditDayCycle(void* user_data)
  1180. {
  1181. LLFloaterReg::showInstance("env_day_cycle");
  1182. }
  1183. // static
  1184. void LLPanelEstateInfo::onClickAddAllowedAgent(void* user_data)
  1185. {
  1186. LLPanelEstateInfo* self = (LLPanelEstateInfo*)user_data;
  1187. LLCtrlListInterface *list = self->childGetListInterface("allowed_avatar_name_list");
  1188. if (!list) return;
  1189. if (list->getItemCount() >= ESTATE_MAX_ACCESS_IDS)
  1190. {
  1191. //args
  1192. LLSD args;
  1193. args["MAX_AGENTS"] = llformat("%d",ESTATE_MAX_ACCESS_IDS);
  1194. LLNotificationsUtil::add("MaxAllowedAgentOnRegion", args);
  1195. return;
  1196. }
  1197. accessAddCore(ESTATE_ACCESS_ALLOWED_AGENT_ADD, "EstateAllowedAgentAdd");
  1198. }
  1199. // static
  1200. void LLPanelEstateInfo::onClickRemoveAllowedAgent(void* user_data)
  1201. {
  1202. accessRemoveCore(ESTATE_ACCESS_ALLOWED_AGENT_REMOVE, "EstateAllowedAgentRemove", "allowed_avatar_name_list");
  1203. }
  1204. void LLPanelEstateInfo::onClickAddAllowedGroup()
  1205. {
  1206. LLCtrlListInterface *list = childGetListInterface("allowed_group_name_list");
  1207. if (!list) return;
  1208. if (list->getItemCount() >= ESTATE_MAX_ACCESS_IDS)
  1209. {
  1210. LLSD args;
  1211. args["MAX_GROUPS"] = llformat("%d",ESTATE_MAX_ACCESS_IDS);
  1212. LLNotificationsUtil::add("MaxAllowedGroupsOnRegion", args);
  1213. return;
  1214. }
  1215. LLNotification::Params params("ChangeLindenAccess");
  1216. params.functor.function(boost::bind(&LLPanelEstateInfo::addAllowedGroup, this, _1, _2));
  1217. if (isLindenEstate())
  1218. {
  1219. LLNotifications::instance().add(params);
  1220. }
  1221. else
  1222. {
  1223. LLNotifications::instance().forceResponse(params, 0);
  1224. }
  1225. }
  1226. bool LLPanelEstateInfo::addAllowedGroup(const LLSD& notification, const LLSD& response)
  1227. {
  1228. S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
  1229. if (option != 0) return false;
  1230. LLFloater* parent_floater = gFloaterView->getParentFloater(this);
  1231. LLFloaterGroupPicker* widget = LLFloaterReg::showTypedInstance<LLFloaterGroupPicker>("group_picker", LLSD(gAgent.getID()));
  1232. if (widget)
  1233. {
  1234. widget->removeNoneOption();
  1235. widget->setSelectGroupCallback(boost::bind(&LLPanelEstateInfo::addAllowedGroup2, this, _1));
  1236. if (parent_floater)
  1237. {
  1238. LLRect new_rect = gFloaterView->findNeighboringPosition(parent_floater, widget);
  1239. widget->setOrigin(new_rect.mLeft, new_rect.mBottom);
  1240. parent_floater->addDependentFloater(widget);
  1241. }
  1242. }
  1243. return false;
  1244. }
  1245. // static
  1246. void LLPanelEstateInfo::onClickRemoveAllowedGroup(void* user_data)
  1247. {
  1248. accessRemoveCore(ESTATE_ACCESS_ALLOWED_GROUP_REMOVE, "EstateAllowedGroupRemove", "allowed_group_name_list");
  1249. }
  1250. // static
  1251. void LLPanelEstateInfo::onClickAddBannedAgent(void* user_data)
  1252. {
  1253. LLPanelEstateInfo* self = (LLPanelEstateInfo*)user_data;
  1254. LLCtrlListInterface *list = self->childGetListInterface("banned_avatar_name_list");
  1255. if (!list) return;
  1256. if (list->getItemCount() >= ESTATE_MAX_ACCESS_IDS)
  1257. {
  1258. LLSD args;
  1259. args["MAX_BANNED"] = llformat("%d",ESTATE_MAX_ACCESS_IDS);
  1260. LLNotificationsUtil::add("MaxBannedAgentsOnRegion", args);
  1261. return;
  1262. }
  1263. accessAddCore(ESTATE_ACCESS_BANNED_AGENT_ADD, "EstateBannedAgentAdd");
  1264. }
  1265. // static
  1266. void LLPanelEstateInfo::onClickRemoveBannedAgent(void* user_data)
  1267. {
  1268. accessRemoveCore(ESTATE_ACCESS_BANNED_AGENT_REMOVE, "EstateBannedAgentRemove", "banned_avatar_name_list");
  1269. }
  1270. // static
  1271. void LLPanelEstateInfo::onClickAddEstateManager(void* user_data)
  1272. {
  1273. LLPanelEstateInfo* self = (LLPanelEstateInfo*)user_data;
  1274. LLCtrlListInterface *list = self->childGetListInterface("estate_manager_name_list");
  1275. if (!list) return;
  1276. if (list->getItemCount() >= ESTATE_MAX_MANAGERS)
  1277. { // Tell user they can't add more managers
  1278. LLSD args;
  1279. args["MAX_MANAGER"] = llformat("%d",ESTATE_MAX_MANAGERS);
  1280. LLNotificationsUtil::add("MaxManagersOnRegion", args);
  1281. }
  1282. else
  1283. { // Go pick managers to add
  1284. accessAddCore(ESTATE_ACCESS_MANAGER_ADD, "EstateManagerAdd");
  1285. }
  1286. }
  1287. // static
  1288. void LLPanelEstateInfo::onClickRemoveEstateManager(void* user_data)
  1289. {
  1290. accessRemoveCore(ESTATE_ACCESS_MANAGER_REMOVE, "EstateManagerRemove", "estate_manager_name_list");
  1291. }
  1292. //---------------------------------------------------------------------------
  1293. // Kick from estate methods
  1294. //---------------------------------------------------------------------------
  1295. void LLPanelEstateInfo::onClickKickUser()
  1296. {
  1297. // this depends on the grandparent view being a floater
  1298. // in order to set up floater dependency
  1299. LLFloater* parent_floater = gFloaterView->getParentFloater(this);
  1300. LLFloater* child_floater = LLFloaterAvatarPicker::show(boost::bind(&LLPanelEstateInfo::onKickUserCommit, this, _1, _2), FALSE, TRUE);
  1301. parent_floater->addDependentFloater(child_floater);
  1302. }
  1303. void LLPanelEstateInfo::onKickUserCommit(const std::vector<std::string>& names, const std::vector<LLUUID>& ids)
  1304. {
  1305. if (names.empty() || ids.empty()) return;
  1306. //check to make sure there is one valid user and id
  1307. if( (ids[0].isNull()) ||
  1308. (names[0].length() == 0) )
  1309. {
  1310. return;
  1311. }
  1312. //Bring up a confirmation dialog
  1313. LLSD args;
  1314. args["EVIL_USER"] = names[0];
  1315. LLSD payload;
  1316. payload["agent_id"] = ids[0];
  1317. LLNotificationsUtil::add("EstateKickUser", args, payload, boost::bind(&LLPanelEstateInfo::kickUserConfirm, this, _1, _2));
  1318. }
  1319. bool LLPanelEstateInfo::kickUserConfirm(const LLSD& notification, const LLSD& response)
  1320. {
  1321. S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
  1322. switch(option)
  1323. {
  1324. case 0:
  1325. {
  1326. //Kick User
  1327. strings_t strings;
  1328. strings.push_back(notification["payload"]["agent_id"].asString());
  1329. sendEstateOwnerMessage(gMessageSystem, "kickestate", LLFloaterRegionInfo::getLastInvoice(), strings);
  1330. break;
  1331. }
  1332. default:
  1333. break;
  1334. }
  1335. return false;
  1336. }
  1337. //---------------------------------------------------------------------------
  1338. // Core Add/Remove estate access methods
  1339. // TODO: INTERNATIONAL: don't build message text here;
  1340. // instead, create multiple translatable messages and choose
  1341. // one based on the status.
  1342. //---------------------------------------------------------------------------
  1343. std::string all_estates_text()
  1344. {
  1345. LLPanelEstateInfo* panel = LLFloaterRegionInfo::getPanelEstate();
  1346. if (!panel) return "(" + LLTrans::getString("RegionInfoError") + ")";
  1347. LLStringUtil::format_map_t args;
  1348. std::string owner = panel->getOwnerName();
  1349. LLViewerRegion* region = gAgent.getRegion();
  1350. if (gAgent.isGodlike())
  1351. {
  1352. args["[OWNER]"] = owner.c_str();
  1353. return LLTrans::getString("RegionInfoAllEstatesOwnedBy", args);
  1354. }
  1355. else if (region && region->getOwner() == gAgent.getID())
  1356. {
  1357. return LLTrans::getString("RegionInfoAllEstatesYouOwn");
  1358. }
  1359. else if (region && region->isEstateManager())
  1360. {
  1361. args["[OWNER]"] = owner.c_str();
  1362. return LLTrans::getString("RegionInfoAllEstatesYouManage", args);
  1363. }
  1364. else
  1365. {
  1366. return "(" + LLTrans::getString("RegionInfoError") + ")";
  1367. }
  1368. }
  1369. // static
  1370. bool LLPanelEstateInfo::isLindenEstate()
  1371. {
  1372. LLPanelEstateInfo* panel = LLFloaterRegionInfo::getPanelEstate();
  1373. if (!panel) return false;
  1374. U32 estate_id = panel->getEstateID();
  1375. return (estate_id <= ESTATE_LAST_LINDEN);
  1376. }
  1377. typedef std::vector<LLUUID> AgentOrGroupIDsVector;
  1378. struct LLEstateAccessChangeInfo
  1379. {
  1380. LLEstateAccessChangeInfo(const LLSD& sd)
  1381. {
  1382. mDialogName = sd["dialog_name"].asString();
  1383. mOperationFlag = (U32)sd["operation"].asInteger();
  1384. LLSD::array_const_iterator end_it = sd["allowed_ids"].endArray();
  1385. for (LLSD::array_const_iterator id_it = sd["allowed_ids"].beginArray();
  1386. id_it != end_it;
  1387. ++id_it)
  1388. {
  1389. mAgentOrGroupIDs.push_back(id_it->asUUID());
  1390. }
  1391. }
  1392. const LLSD asLLSD() const
  1393. {
  1394. LLSD sd;
  1395. sd["name"] = mDialogName;
  1396. sd["operation"] = (S32)mOperationFlag;
  1397. for (AgentOrGroupIDsVector::const_iterator it = mAgentOrGroupIDs.begin();
  1398. it != mAgentOrGroupIDs.end();
  1399. ++it)
  1400. {
  1401. sd["allowed_ids"].append(*it);
  1402. }
  1403. return sd;
  1404. }
  1405. U32 mOperationFlag; // ESTATE_ACCESS_BANNED_AGENT_ADD, _REMOVE, etc.
  1406. std::string mDialogName;
  1407. AgentOrGroupIDsVector mAgentOrGroupIDs; // List of agent IDs to apply to this change
  1408. };
  1409. // Special case callback for groups, since it has different callback format than names
  1410. void LLPanelEstateInfo::addAllowedGroup2(LLUUID id)
  1411. {
  1412. LLSD payload;
  1413. payload["operation"] = (S32)ESTATE_ACCESS_ALLOWED_GROUP_ADD;
  1414. payload["dialog_name"] = "EstateAllowedGroupAdd";
  1415. payload["allowed_ids"].append(id);
  1416. LLSD args;
  1417. args["ALL_ESTATES"] = all_estates_text();
  1418. LLNotification::Params params("EstateAllowedGroupAdd");
  1419. params.payload(payload)
  1420. .substitutions(args)
  1421. .functor.function(accessCoreConfirm);
  1422. if (isLindenEstate())
  1423. {
  1424. LLNotifications::instance().forceResponse(params, 0);
  1425. }
  1426. else
  1427. {
  1428. LLNotifications::instance().add(params);
  1429. }
  1430. }
  1431. // static
  1432. void LLPanelEstateInfo::accessAddCore(U32 operation_flag, const std::string& dialog_name)
  1433. {
  1434. LLSD payload;
  1435. payload["operation"] = (S32)operation_flag;
  1436. payload["dialog_name"] = dialog_name;
  1437. // agent id filled in after avatar picker
  1438. LLNotification::Params params("ChangeLindenAccess");
  1439. params.payload(payload)
  1440. .functor.function(accessAddCore2);
  1441. if (isLindenEstate())
  1442. {
  1443. LLNotifications::instance().add(params);
  1444. }
  1445. else
  1446. {
  1447. // same as clicking "OK"
  1448. LLNotifications::instance().forceResponse(params, 0);
  1449. }
  1450. }
  1451. // static
  1452. bool LLPanelEstateInfo::accessAddCore2(const LLSD& notification, const LLSD& response)
  1453. {
  1454. S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
  1455. if (option != 0)
  1456. {
  1457. // abort change
  1458. return false;
  1459. }
  1460. LLEstateAccessChangeInfo* change_info = new LLEstateAccessChangeInfo(notification["payload"]);
  1461. // avatar picker yes multi-select, yes close-on-select
  1462. LLFloaterAvatarPicker::show(boost::bind(&LLPanelEstateInfo::accessAddCore3, _1, _2, (void*)change_info), TRUE, TRUE);
  1463. return false;
  1464. }
  1465. // static
  1466. void LLPanelEstateInfo::accessAddCore3(const std::vector<std::string>& names, const std::vector<LLUUID>& ids, void* data)
  1467. {
  1468. LLEstateAccessChangeInfo* change_info = (LLEstateAccessChangeInfo*)data;
  1469. if (!change_info) return;
  1470. if (ids.empty()) 
  1471. {
  1472. // User didn't select a name.
  1473. delete change_info;
  1474. change_info = NULL;
  1475. return;
  1476. }
  1477. // User did select a name.
  1478. change_info->mAgentOrGroupIDs = ids;
  1479. // Can't put estate owner on ban list
  1480. LLPanelEstateInfo* panel = LLFloaterRegionInfo::getPanelEstate();
  1481. if (!panel) return;
  1482. LLViewerRegion* region = gAgent.getRegion();
  1483. if (!region) return;
  1484. if (change_info->mOperationFlag & ESTATE_ACCESS_ALLOWED_AGENT_ADD)
  1485. {
  1486. LLCtrlListInterface *list = panel->childGetListInterface("allowed_avatar_name_list");
  1487. int currentCount = (list ? list->getItemCount() : 0);
  1488. if (ids.size() + currentCount > ESTATE_MAX_ACCESS_IDS)
  1489. {
  1490. LLSD args;
  1491. args["NUM_ADDED"] = llformat("%d",ids.size());
  1492. args["MAX_AGENTS"] = llformat("%d",ESTATE_MAX_ACCESS_IDS);
  1493. args["LIST_TYPE"] = "Allowed Residents";
  1494. args["NUM_EXCESS"] = llformat("%d",(ids.size()+currentCount)-ESTATE_MAX_ACCESS_IDS);
  1495. LLNotificationsUtil::add("MaxAgentOnRegionBatch", args);
  1496. delete change_info;
  1497. return;
  1498. }
  1499. }
  1500. if (change_info->mOperationFlag & ESTATE_ACCESS_BANNED_AGENT_ADD)
  1501. {
  1502. LLCtrlListInterface *list = panel->childGetListInterface("banned_avatar_name_list");
  1503. int currentCount = (list ? list->getItemCount() : 0);
  1504. if (ids.size() + currentCount > ESTATE_MAX_ACCESS_IDS)
  1505. {
  1506. LLSD args;
  1507. args["NUM_ADDED"] = llformat("%d",ids.size());
  1508. args["MAX_AGENTS"] = llformat("%d",ESTATE_MAX_ACCESS_IDS);
  1509. args["LIST_TYPE"] = "Banned Residents";
  1510. args["NUM_EXCESS"] = llformat("%d",(ids.size()+currentCount)-ESTATE_MAX_ACCESS_IDS);
  1511. LLNotificationsUtil::add("MaxAgentOnRegionBatch", args);
  1512. delete change_info;
  1513. return;
  1514. }
  1515. }
  1516. LLSD args;
  1517. args["ALL_ESTATES"] = all_estates_text();
  1518. LLNotification::Params params(change_info->mDialogName);
  1519. params.substitutions(args)
  1520. .payload(change_info->asLLSD())
  1521. .functor.function(accessCoreConfirm);
  1522. if (isLindenEstate())
  1523. {
  1524. // just apply to this estate
  1525. LLNotifications::instance().forceResponse(params, 0);
  1526. }
  1527. else
  1528. {
  1529. // ask if this estate or all estates with this owner
  1530. LLNotifications::instance().add(params);
  1531. }
  1532. }
  1533. // static
  1534. void LLPanelEstateInfo::accessRemoveCore(U32 operation_flag, const std::string& dialog_name, const std::string& list_ctrl_name)
  1535. {
  1536. LLPanelEstateInfo* panel = LLFloaterRegionInfo::getPanelEstate();
  1537. if (!panel) return;
  1538. LLNameListCtrl* name_list = panel->getChild<LLNameListCtrl>(list_ctrl_name);
  1539. if (!name_list) return;
  1540. std::vector<LLScrollListItem*> list_vector = name_list->getAllSelected();
  1541. if (list_vector.size() == 0)
  1542. return;
  1543. LLSD payload;
  1544. payload["operation"] = (S32)operation_flag;
  1545. payload["dialog_name"] = dialog_name;
  1546. for (std::vector<LLScrollListItem*>::const_iterator iter = list_vector.begin();
  1547.      iter != list_vector.end();
  1548.      iter++)
  1549. {
  1550. LLScrollListItem *item = (*iter);
  1551. payload["allowed_ids"].append(item->getUUID());
  1552. }
  1553. LLNotification::Params params("ChangeLindenAccess");
  1554. params.payload(payload)
  1555. .functor.function(accessRemoveCore2);
  1556. if (isLindenEstate())
  1557. {
  1558. // warn on change linden estate
  1559. LLNotifications::instance().add(params);
  1560. }
  1561. else
  1562. {
  1563. // just proceed, as if clicking OK
  1564. LLNotifications::instance().forceResponse(params, 0);
  1565. }
  1566. }
  1567. // static
  1568. bool LLPanelEstateInfo::accessRemoveCore2(const LLSD& notification, const LLSD& response)
  1569. {
  1570. S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
  1571. if (option != 0)
  1572. {
  1573. // abort
  1574. return false;
  1575. }
  1576. // If Linden estate, can only apply to "this" estate, not all estates
  1577. // owned by NULL.
  1578. if (isLindenEstate())
  1579. {
  1580. accessCoreConfirm(notification, response);
  1581. }
  1582. else
  1583. {
  1584. LLSD args;
  1585. args["ALL_ESTATES"] = all_estates_text();
  1586. LLNotificationsUtil::add(notification["payload"]["dialog_name"], 
  1587. args,
  1588. notification["payload"],
  1589. accessCoreConfirm);
  1590. }
  1591. return false;
  1592. }
  1593. // Used for both access add and remove operations, depending on the mOperationFlag
  1594. // passed in (ESTATE_ACCESS_BANNED_AGENT_ADD, ESTATE_ACCESS_ALLOWED_AGENT_REMOVE, etc.)
  1595. // static
  1596. bool LLPanelEstateInfo::accessCoreConfirm(const LLSD& notification, const LLSD& response)
  1597. {
  1598. S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
  1599. const U32 originalFlags = (U32)notification["payload"]["operation"].asInteger();
  1600. LLViewerRegion* region = gAgent.getRegion();
  1601. LLSD::array_const_iterator end_it = notification["payload"]["allowed_ids"].endArray();
  1602. for (LLSD::array_const_iterator iter = notification["payload"]["allowed_ids"].beginArray();
  1603. iter != end_it;
  1604.      iter++)
  1605. {
  1606. U32 flags = originalFlags;
  1607. if (iter + 1 != end_it)
  1608. flags |= ESTATE_ACCESS_NO_REPLY;
  1609. const LLUUID id = iter->asUUID();
  1610. if (((U32)notification["payload"]["operation"].asInteger() & ESTATE_ACCESS_BANNED_AGENT_ADD)
  1611.     && region && (region->getOwner() == id))
  1612. {
  1613. LLNotificationsUtil::add("OwnerCanNotBeDenied");
  1614. break;
  1615. }
  1616. switch(option)
  1617. {
  1618. case 0:
  1619.     // This estate
  1620.     sendEstateAccessDelta(flags, id);
  1621.     break;
  1622. case 1:
  1623. {
  1624. // All estates, either than I own or manage for this owner.  
  1625. // This will be verified on simulator. JC
  1626. if (!region) break;
  1627. if (region->getOwner() == gAgent.getID()
  1628.     || gAgent.isGodlike())
  1629. {
  1630. flags |= ESTATE_ACCESS_APPLY_TO_ALL_ESTATES;
  1631. sendEstateAccessDelta(flags, id);
  1632. }
  1633. else if (region->isEstateManager())
  1634. {
  1635. flags |= ESTATE_ACCESS_APPLY_TO_MANAGED_ESTATES;
  1636. sendEstateAccessDelta(flags, id);
  1637. }
  1638. break;
  1639. }
  1640. case 2:
  1641. default:
  1642.     break;
  1643. }
  1644. }
  1645. return false;
  1646. }
  1647. // key = "estateaccessdelta"
  1648. // str(estate_id) will be added to front of list by forward_EstateOwnerRequest_to_dataserver
  1649. // str[0] = str(agent_id) requesting the change
  1650. // str[1] = str(flags) (ESTATE_ACCESS_DELTA_*)
  1651. // str[2] = str(agent_id) to add or remove
  1652. // static
  1653. void LLPanelEstateInfo::sendEstateAccessDelta(U32 flags, const LLUUID& agent_or_group_id)
  1654. {
  1655. LLMessageSystem* msg = gMessageSystem;
  1656. msg->newMessage("EstateOwnerMessage");
  1657. msg->nextBlockFast(_PREHASH_AgentData);
  1658. msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
  1659. msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
  1660. msg->addUUIDFast(_PREHASH_TransactionID, LLUUID::null); //not used
  1661. msg->nextBlock("MethodData");
  1662. msg->addString("Method", "estateaccessdelta");
  1663. msg->addUUID("Invoice", LLFloaterRegionInfo::getLastInvoice());
  1664. std::string buf;
  1665. gAgent.getID().toString(buf);
  1666. msg->nextBlock("ParamList");
  1667. msg->addString("Parameter", buf);
  1668. buf = llformat("%u", flags);
  1669. msg->nextBlock("ParamList");
  1670. msg->addString("Parameter", buf);
  1671. agent_or_group_id.toString(buf);
  1672. msg->nextBlock("ParamList");
  1673. msg->addString("Parameter", buf);
  1674. LLPanelEstateInfo* panel = LLFloaterRegionInfo::getPanelEstate();
  1675. if (flags & (ESTATE_ACCESS_ALLOWED_AGENT_ADD | ESTATE_ACCESS_ALLOWED_AGENT_REMOVE |
  1676.          ESTATE_ACCESS_BANNED_AGENT_ADD | ESTATE_ACCESS_BANNED_AGENT_REMOVE))
  1677. {
  1678. panel->clearAccessLists();
  1679. }
  1680. gAgent.sendReliableMessage();
  1681. }
  1682. void LLPanelEstateInfo::updateControls(LLViewerRegion* region)
  1683. {
  1684. BOOL god = gAgent.isGodlike();
  1685. BOOL owner = (region && (region->getOwner() == gAgent.getID()));
  1686. BOOL manager = (region && region->isEstateManager());
  1687. setCtrlsEnabled(god || owner || manager);
  1688. childDisable("apply_btn");
  1689. childSetEnabled("add_allowed_avatar_btn", god || owner || manager);
  1690. childSetEnabled("remove_allowed_avatar_btn", god || owner || manager);
  1691. childSetEnabled("add_allowed_group_btn", god || owner || manager);
  1692. childSetEnabled("remove_allowed_group_btn", god || owner || manager);
  1693. childSetEnabled("add_banned_avatar_btn", god || owner || manager);
  1694. childSetEnabled("remove_banned_avatar_btn", god || owner || manager);
  1695. childSetEnabled("message_estate_btn", god || owner || manager);
  1696. childSetEnabled("kick_user_from_estate_btn", god || owner || manager);
  1697. // estate managers can't add estate managers
  1698. childSetEnabled("add_estate_manager_btn", god || owner);
  1699. childSetEnabled("remove_estate_manager_btn", god || owner);
  1700. childSetEnabled("estate_manager_name_list", god || owner);
  1701. }
  1702. bool LLPanelEstateInfo::refreshFromRegion(LLViewerRegion* region)
  1703. {
  1704. updateControls(region);
  1705. // let the parent class handle the general data collection. 
  1706. bool rv = LLPanelRegionInfo::refreshFromRegion(region);
  1707. // We want estate info. To make sure it works across region
  1708. // boundaries and multiple packets, we add a serial number to the
  1709. // integers and track against that on update.
  1710. strings_t strings;
  1711. //integers_t integers;
  1712. //LLFloaterRegionInfo::incrementSerial();
  1713. LLFloaterRegionInfo::nextInvoice();
  1714. LLUUID invoice(LLFloaterRegionInfo::getLastInvoice());
  1715. //integers.push_back(LLFloaterRegionInfo::());::getPanelEstate();
  1716. LLPanelEstateInfo* panel = LLFloaterRegionInfo::getPanelEstate();
  1717. panel->clearAccessLists();
  1718. sendEstateOwnerMessage(gMessageSystem, "getinfo", invoice, strings);
  1719. refresh();
  1720. return rv;
  1721. }
  1722. void LLPanelEstateInfo::updateChild(LLUICtrl* child_ctrl)
  1723. {
  1724. if (checkRemovalButton(child_ctrl->getName()))
  1725. {
  1726. // do nothing
  1727. }
  1728. else if (checkSunHourSlider(child_ctrl))
  1729. {
  1730. // do nothing
  1731. }
  1732. }
  1733. bool LLPanelEstateInfo::estateUpdate(LLMessageSystem* msg)
  1734. {
  1735. llinfos << "LLPanelEstateInfo::estateUpdate()" << llendl;
  1736. return false;
  1737. }
  1738. BOOL LLPanelEstateInfo::postBuild()
  1739. {
  1740. // set up the callbacks for the generic controls
  1741. initCtrl("externally_visible_check");
  1742. initCtrl("use_global_time_check");
  1743. initCtrl("fixed_sun_check");
  1744. initCtrl("allow_direct_teleport");
  1745. initCtrl("limit_payment");
  1746. initCtrl("limit_age_verified");
  1747. initCtrl("voice_chat_check");
  1748. // set up the use global time checkbox
  1749. getChild<LLUICtrl>("use_global_time_check")->setCommitCallback(boost::bind(&LLPanelEstateInfo::onChangeUseGlobalTime, this));
  1750. getChild<LLUICtrl>("fixed_sun_check")->setCommitCallback(boost::bind(&LLPanelEstateInfo::onChangeFixedSun, this));
  1751. getChild<LLUICtrl>("sun_hour_slider")->setCommitCallback(boost::bind(&LLPanelEstateInfo::onChangeChildCtrl, this, _1));
  1752. getChild<LLUICtrl>("allowed_avatar_name_list")->setCommitCallback(boost::bind(&LLPanelEstateInfo::onChangeChildCtrl, this, _1));
  1753. LLNameListCtrl *avatar_name_list = getChild<LLNameListCtrl>("allowed_avatar_name_list");
  1754. if (avatar_name_list)
  1755. {
  1756. avatar_name_list->setCommitOnSelectionChange(TRUE);
  1757. avatar_name_list->setMaxItemCount(ESTATE_MAX_ACCESS_IDS);
  1758. }
  1759. childSetAction("add_allowed_avatar_btn", onClickAddAllowedAgent, this);
  1760. childSetAction("remove_allowed_avatar_btn", onClickRemoveAllowedAgent, this);
  1761. getChild<LLUICtrl>("allowed_group_name_list")->setCommitCallback(boost::bind(&LLPanelEstateInfo::onChangeChildCtrl, this, _1));
  1762. LLNameListCtrl* group_name_list = getChild<LLNameListCtrl>("allowed_group_name_list");
  1763. if (group_name_list)
  1764. {
  1765. group_name_list->setCommitOnSelectionChange(TRUE);
  1766. group_name_list->setMaxItemCount(ESTATE_MAX_ACCESS_IDS);
  1767. }
  1768. getChild<LLUICtrl>("add_allowed_group_btn")->setCommitCallback(boost::bind(&LLPanelEstateInfo::onClickAddAllowedGroup, this));
  1769. childSetAction("remove_allowed_group_btn", onClickRemoveAllowedGroup, this);
  1770. getChild<LLUICtrl>("banned_avatar_name_list")->setCommitCallback(boost::bind(&LLPanelEstateInfo::onChangeChildCtrl, this, _1));
  1771. LLNameListCtrl* banned_name_list = getChild<LLNameListCtrl>("banned_avatar_name_list");
  1772. if (banned_name_list)
  1773. {
  1774. banned_name_list->setCommitOnSelectionChange(TRUE);
  1775. banned_name_list->setMaxItemCount(ESTATE_MAX_ACCESS_IDS);
  1776. }
  1777. childSetAction("add_banned_avatar_btn", onClickAddBannedAgent, this);
  1778. childSetAction("remove_banned_avatar_btn", onClickRemoveBannedAgent, this);
  1779. getChild<LLUICtrl>("estate_manager_name_list")->setCommitCallback(boost::bind(&LLPanelEstateInfo::onChangeChildCtrl, this, _1));
  1780. LLNameListCtrl* manager_name_list = getChild<LLNameListCtrl>("estate_manager_name_list");
  1781. if (manager_name_list)
  1782. {
  1783. manager_name_list->setCommitOnSelectionChange(TRUE);
  1784. manager_name_list->setMaxItemCount(ESTATE_MAX_MANAGERS * 4); // Allow extras for dupe issue
  1785. }
  1786. childSetAction("add_estate_manager_btn", onClickAddEstateManager, this);
  1787. childSetAction("remove_estate_manager_btn", onClickRemoveEstateManager, this);
  1788. childSetAction("message_estate_btn", onClickMessageEstate, this);
  1789. childSetAction("kick_user_from_estate_btn", boost::bind(&LLPanelEstateInfo::onClickKickUser, this));
  1790. childSetAction("WLEditSky", onClickEditSky, this);
  1791. childSetAction("WLEditDayCycle", onClickEditDayCycle, this);
  1792. return LLPanelRegionInfo::postBuild();
  1793. }
  1794. void LLPanelEstateInfo::refresh()
  1795. {
  1796. bool public_access = childGetValue("externally_visible_check").asBoolean();
  1797. childSetEnabled("Only Allow", public_access);
  1798. childSetEnabled("limit_payment", public_access);
  1799. childSetEnabled("limit_age_verified", public_access);
  1800. // if this is set to false, then the limit fields are meaningless and should be turned off
  1801. if (public_access == false)
  1802. {
  1803. childSetValue("limit_payment", false);
  1804. childSetValue("limit_age_verified", false);
  1805. }
  1806. }
  1807. BOOL LLPanelEstateInfo::sendUpdate()
  1808. {
  1809. llinfos << "LLPanelEsateInfo::sendUpdate()" << llendl;
  1810. LLNotification::Params params("ChangeLindenEstate");
  1811. params.functor.function(boost::bind(&LLPanelEstateInfo::callbackChangeLindenEstate, this, _1, _2));
  1812. if (getEstateID() <= ESTATE_LAST_LINDEN)
  1813. {
  1814. // trying to change reserved estate, warn
  1815. LLNotifications::instance().add(params);
  1816. }
  1817. else
  1818. {
  1819. // for normal estates, just make the change
  1820. LLNotifications::instance().forceResponse(params, 0);
  1821. }
  1822. return TRUE;
  1823. }
  1824. bool LLPanelEstateInfo::callbackChangeLindenEstate(const LLSD& notification, const LLSD& response)
  1825. {
  1826. S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
  1827. switch(option)
  1828. {
  1829. case 0:
  1830. // send the update
  1831. if (!commitEstateInfoCaps())
  1832. {
  1833. // the caps method failed, try the old way
  1834. LLFloaterRegionInfo::nextInvoice();
  1835. commitEstateInfoDataserver();
  1836. }
  1837. // we don't want to do this because we'll get it automatically from the sim
  1838. // after the spaceserver processes it
  1839. // else
  1840. // {
  1841. // // caps method does not automatically send this info
  1842. // LLFloaterRegionInfo::requestRegionInfo();
  1843. // }
  1844. break;
  1845. case 1:
  1846. default:
  1847. // do nothing
  1848. break;
  1849. }
  1850. return false;
  1851. }
  1852. /*
  1853. // Request = "getowner"
  1854. // SParam[0] = "" (empty string)
  1855. // IParam[0] = serial
  1856. void LLPanelEstateInfo::getEstateOwner()
  1857. {
  1858. // TODO -- disable the panel
  1859. // and call this function whenever we cross a region boundary
  1860. // re-enable when owner matches, and get new estate info
  1861. LLMessageSystem* msg = gMessageSystem;
  1862. msg->newMessageFast(_PREHASH_EstateOwnerRequest);
  1863. msg->nextBlockFast(_PREHASH_AgentData);
  1864. msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
  1865. msg->nextBlockFast(_PREHASH_RequestData);
  1866. msg->addStringFast(_PREHASH_Request, "getowner");
  1867. // we send an empty string so that the variable block is not empty
  1868. msg->nextBlockFast(_PREHASH_StringData);
  1869. msg->addStringFast(_PREHASH_SParam, "");
  1870. msg->nextBlockFast(_PREHASH_IntegerData);
  1871. msg->addS32Fast(_PREHASH_IParam, LLFloaterRegionInfo::getSerial());
  1872. gAgent.sendMessage();
  1873. }
  1874. */
  1875. class LLEstateChangeInfoResponder : public LLHTTPClient::Responder
  1876. {
  1877. public:
  1878. LLEstateChangeInfoResponder(LLPanelEstateInfo* panel)
  1879. {
  1880. mpPanel = panel->getHandle();
  1881. }
  1882. // if we get a normal response, handle it here
  1883. virtual void result(const LLSD& content)
  1884. {
  1885.     // refresh the panel from the database
  1886. LLPanelEstateInfo* panel = dynamic_cast<LLPanelEstateInfo*>(mpPanel.get());
  1887. if (panel)
  1888. panel->refresh();
  1889. }
  1890. // if we get an error response
  1891. virtual void error(U32 status, const std::string& reason)
  1892. {
  1893. llinfos << "LLEstateChangeInfoResponder::error "
  1894. << status << ": " << reason << llendl;
  1895. }
  1896. private:
  1897. LLHandle<LLPanel> mpPanel;
  1898. };
  1899. // tries to send estate info using a cap; returns true if it succeeded
  1900. bool LLPanelEstateInfo::commitEstateInfoCaps()
  1901. {
  1902. std::string url = gAgent.getRegion()->getCapability("EstateChangeInfo");
  1903. if (url.empty())
  1904. {
  1905. // whoops, couldn't find the cap, so bail out
  1906. return false;
  1907. }
  1908. LLSD body;
  1909. body["estate_name"] = getEstateName();
  1910. body["is_externally_visible"] = childGetValue("externally_visible_check").asBoolean();
  1911. body["allow_direct_teleport"] = childGetValue("allow_direct_teleport").asBoolean();
  1912. body["is_sun_fixed"         ] = childGetValue("fixed_sun_check").asBoolean();
  1913. body["deny_anonymous"       ] = childGetValue("limit_payment").asBoolean();
  1914. body["deny_age_unverified"  ] = childGetValue("limit_age_verified").asBoolean();
  1915. body["allow_voice_chat"     ] = childGetValue("voice_chat_check").asBoolean();
  1916. body["invoice"              ] = LLFloaterRegionInfo::getLastInvoice();
  1917. // block fly is in estate database but not in estate UI, so we're not supporting it
  1918. //body["block_fly"            ] = childGetValue("").asBoolean();
  1919. F32 sun_hour = getSunHour();
  1920. if (childGetValue("use_global_time_check").asBoolean())
  1921. {
  1922. sun_hour = 0.f; // 0 = global time
  1923. }
  1924. body["sun_hour"] = sun_hour;
  1925. // we use a responder so that we can re-get the data after committing to the database
  1926. LLHTTPClient::post(url, body, new LLEstateChangeInfoResponder(this));
  1927.     return true;
  1928. }
  1929. /* This is the old way of doing things, is deprecated, and should be 
  1930.    deleted when the dataserver model can be removed */
  1931. // key = "estatechangeinfo"
  1932. // strings[0] = str(estate_id) (added by simulator before relay - not here)
  1933. // strings[1] = estate_name
  1934. // strings[2] = str(estate_flags)
  1935. // strings[3] = str((S32)(sun_hour * 1024.f))
  1936. void LLPanelEstateInfo::commitEstateInfoDataserver()
  1937. {
  1938. LLMessageSystem* msg = gMessageSystem;
  1939. msg->newMessage("EstateOwnerMessage");
  1940. msg->nextBlockFast(_PREHASH_AgentData);
  1941. msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
  1942. msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
  1943. msg->addUUIDFast(_PREHASH_TransactionID, LLUUID::null); //not used
  1944. msg->nextBlock("MethodData");
  1945. msg->addString("Method", "estatechangeinfo");
  1946. msg->addUUID("Invoice", LLFloaterRegionInfo::getLastInvoice());
  1947. msg->nextBlock("ParamList");
  1948. msg->addString("Parameter", getEstateName());
  1949. std::string buffer;
  1950. buffer = llformat("%u", computeEstateFlags());
  1951. msg->nextBlock("ParamList");
  1952. msg->addString("Parameter", buffer);
  1953. F32 sun_hour = getSunHour();
  1954. if (childGetValue("use_global_time_check").asBoolean())
  1955. {
  1956. sun_hour = 0.f; // 0 = global time
  1957. }
  1958. buffer = llformat("%d", (S32)(sun_hour*1024.0f));
  1959. msg->nextBlock("ParamList");
  1960. msg->addString("Parameter", buffer);
  1961. gAgent.sendMessage();
  1962. }
  1963. void LLPanelEstateInfo::setEstateFlags(U32 flags)
  1964. {
  1965. childSetValue("externally_visible_check", LLSD(flags & REGION_FLAGS_EXTERNALLY_VISIBLE ? TRUE : FALSE) );
  1966. childSetValue("fixed_sun_check", LLSD(flags & REGION_FLAGS_SUN_FIXED ? TRUE : FALSE) );
  1967. childSetValue(
  1968. "voice_chat_check",
  1969. LLSD(flags & REGION_FLAGS_ALLOW_VOICE ? TRUE : FALSE));
  1970. childSetValue("allow_direct_teleport", LLSD(flags & REGION_FLAGS_ALLOW_DIRECT_TELEPORT ? TRUE : FALSE) );
  1971. childSetValue("limit_payment", LLSD(flags & REGION_FLAGS_DENY_ANONYMOUS ? TRUE : FALSE) );
  1972. childSetValue("limit_age_verified", LLSD(flags & REGION_FLAGS_DENY_AGEUNVERIFIED ? TRUE : FALSE) );
  1973. refresh();
  1974. }
  1975. U32 LLPanelEstateInfo::computeEstateFlags()
  1976. {
  1977. U32 flags = 0;
  1978. if (childGetValue("externally_visible_check").asBoolean())
  1979. {
  1980. flags |= REGION_FLAGS_EXTERNALLY_VISIBLE;
  1981. }
  1982. if ( childGetValue("voice_chat_check").asBoolean() )
  1983. {
  1984. flags |= REGION_FLAGS_ALLOW_VOICE;
  1985. }
  1986. if (childGetValue("allow_direct_teleport").asBoolean())
  1987. {
  1988. flags |= REGION_FLAGS_ALLOW_DIRECT_TELEPORT;
  1989. }
  1990. if (childGetValue("fixed_sun_check").asBoolean())
  1991. {
  1992. flags |= REGION_FLAGS_SUN_FIXED;
  1993. }
  1994. if (childGetValue("limit_payment").asBoolean())
  1995. {
  1996. flags |= REGION_FLAGS_DENY_ANONYMOUS;
  1997. }
  1998. if (childGetValue("limit_age_verified").asBoolean())
  1999. {
  2000. flags |= REGION_FLAGS_DENY_AGEUNVERIFIED;
  2001. }
  2002. return flags;
  2003. }
  2004. BOOL LLPanelEstateInfo::getGlobalTime()
  2005. {
  2006. return childGetValue("use_global_time_check").asBoolean();
  2007. }
  2008. void LLPanelEstateInfo::setGlobalTime(bool b)
  2009. {
  2010. childSetValue("use_global_time_check", LLSD(b));
  2011. childSetEnabled("fixed_sun_check", LLSD(!b));
  2012. childSetEnabled("sun_hour_slider", LLSD(!b));
  2013. if (b)
  2014. {
  2015. childSetValue("sun_hour_slider", LLSD(0.f));
  2016. }
  2017. }
  2018. BOOL LLPanelEstateInfo::getFixedSun()
  2019. {
  2020. return childGetValue("fixed_sun_check").asBoolean();
  2021. }
  2022. void LLPanelEstateInfo::setSunHour(F32 sun_hour)
  2023. {
  2024. if(sun_hour < 6.0f)
  2025. {
  2026. sun_hour = 24.0f + sun_hour;
  2027. }
  2028. childSetValue("sun_hour_slider", LLSD(sun_hour));
  2029. }
  2030. F32 LLPanelEstateInfo::getSunHour()
  2031. {
  2032. if (childIsEnabled("sun_hour_slider"))
  2033. {
  2034. return (F32)childGetValue("sun_hour_slider").asReal();
  2035. }
  2036. return 0.f;
  2037. }
  2038. const std::string LLPanelEstateInfo::getEstateName() const
  2039. {
  2040. return childGetValue("estate_name").asString();
  2041. }
  2042. void LLPanelEstateInfo::setEstateName(const std::string& name)
  2043. {
  2044. childSetValue("estate_name", LLSD(name));
  2045. }
  2046. const std::string LLPanelEstateInfo::getOwnerName() const
  2047. {
  2048. return childGetValue("estate_owner").asString();
  2049. }
  2050. void LLPanelEstateInfo::setOwnerName(const std::string& name)
  2051. {
  2052. childSetValue("estate_owner", LLSD(name));
  2053. }
  2054. void LLPanelEstateInfo::setAccessAllowedEnabled(bool enable_agent,
  2055. bool enable_group,
  2056. bool enable_ban)
  2057. {
  2058. childSetEnabled("allow_resident_label", enable_agent);
  2059. childSetEnabled("allowed_avatar_name_list", enable_agent);
  2060. childSetVisible("allowed_avatar_name_list", enable_agent);
  2061. childSetEnabled("add_allowed_avatar_btn", enable_agent);
  2062. childSetEnabled("remove_allowed_avatar_btn", enable_agent);
  2063. // Groups
  2064. childSetEnabled("allow_group_label", enable_group);
  2065. childSetEnabled("allowed_group_name_list", enable_group);
  2066. childSetVisible("allowed_group_name_list", enable_group);
  2067. childSetEnabled("add_allowed_group_btn", enable_group);
  2068. childSetEnabled("remove_allowed_group_btn", enable_group);
  2069. // Ban
  2070. childSetEnabled("ban_resident_label", enable_ban);
  2071. childSetEnabled("banned_avatar_name_list", enable_ban);
  2072. childSetVisible("banned_avatar_name_list", enable_ban);
  2073. childSetEnabled("add_banned_avatar_btn", enable_ban);
  2074. childSetEnabled("remove_banned_avatar_btn", enable_ban);
  2075. // Update removal buttons if needed
  2076. if (enable_agent)
  2077. {
  2078. checkRemovalButton("allowed_avatar_name_list");
  2079. }
  2080. if (enable_group)
  2081. {
  2082. checkRemovalButton("allowed_group_name_list");
  2083. }
  2084. if (enable_ban)
  2085. {
  2086. checkRemovalButton("banned_avatar_name_list");
  2087. }
  2088. }
  2089. void LLPanelEstateInfo::clearAccessLists() 
  2090. {
  2091. LLNameListCtrl* name_list = getChild<LLNameListCtrl>("allowed_avatar_name_list");
  2092. if (name_list)
  2093. {
  2094. name_list->deleteAllItems();
  2095. }
  2096. name_list = getChild<LLNameListCtrl>("banned_avatar_name_list");
  2097. if (name_list)
  2098. {
  2099. name_list->deleteAllItems();
  2100. }
  2101. }
  2102. // enables/disables the "remove" button for the various allow/ban lists
  2103. BOOL LLPanelEstateInfo::checkRemovalButton(std::string name)
  2104. {
  2105. std::string btn_name = "";
  2106. if (name == "allowed_avatar_name_list")
  2107. {
  2108. btn_name = "remove_allowed_avatar_btn";
  2109. }
  2110. else if (name == "allowed_group_name_list")
  2111. {
  2112. btn_name = "remove_allowed_group_btn";
  2113. }
  2114. else if (name == "banned_avatar_name_list")
  2115. {
  2116. btn_name = "remove_banned_avatar_btn";
  2117. }
  2118. else if (name == "estate_manager_name_list")
  2119. {
  2120. //ONLY OWNER CAN ADD /DELET ESTATE MANAGER
  2121. LLViewerRegion* region = gAgent.getRegion();
  2122. if (region && (region->getOwner() == gAgent.getID()))
  2123. {
  2124. btn_name = "remove_estate_manager_btn";
  2125. }
  2126. }
  2127. // enable the remove button if something is selected
  2128. LLNameListCtrl* name_list = getChild<LLNameListCtrl>(name);
  2129. childSetEnabled(btn_name, name_list && name_list->getFirstSelected() ? TRUE : FALSE);
  2130. return (btn_name != "");
  2131. }
  2132. BOOL LLPanelEstateInfo::checkSunHourSlider(LLUICtrl* child_ctrl)
  2133. {
  2134. BOOL found_child_ctrl = FALSE;
  2135. if (child_ctrl->getName() == "sun_hour_slider")
  2136. {
  2137. enableButton("apply_btn");
  2138. found_child_ctrl = TRUE;
  2139. }
  2140. return found_child_ctrl;
  2141. }
  2142. // static
  2143. void LLPanelEstateInfo::onClickMessageEstate(void* userdata)
  2144. {
  2145. llinfos << "LLPanelEstateInfo::onClickMessageEstate" << llendl;
  2146. LLNotificationsUtil::add("MessageEstate", LLSD(), LLSD(), boost::bind(&LLPanelEstateInfo::onMessageCommit, (LLPanelEstateInfo*)userdata, _1, _2));
  2147. }
  2148. bool LLPanelEstateInfo::onMessageCommit(const LLSD& notification, const LLSD& response)
  2149. {
  2150. S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
  2151. std::string text = response["message"].asString();
  2152. if(option != 0) return false;
  2153. if(text.empty()) return false;
  2154. llinfos << "Message to everyone: " << text << llendl;
  2155. strings_t strings;
  2156. //integers_t integers;
  2157. std::string name;
  2158. LLAgentUI::buildFullname(name);
  2159. strings.push_back(strings_t::value_type(name));
  2160. strings.push_back(strings_t::value_type(text));
  2161. LLUUID invoice(LLFloaterRegionInfo::getLastInvoice());
  2162. sendEstateOwnerMessage(gMessageSystem, "instantmessage", invoice, strings);
  2163. return false;
  2164. }
  2165. LLPanelEstateCovenant::LLPanelEstateCovenant()
  2166. :
  2167. mCovenantID(LLUUID::null),
  2168. mAssetStatus(ASSET_ERROR)
  2169. {
  2170. }
  2171. // virtual 
  2172. bool LLPanelEstateCovenant::refreshFromRegion(LLViewerRegion* region)
  2173. {
  2174. LLTextBox* region_name = getChild<LLTextBox>("region_name_text");
  2175. if (region_name)
  2176. {
  2177. region_name->setText(region->getName());
  2178. }
  2179. LLTextBox* resellable_clause = getChild<LLTextBox>("resellable_clause");
  2180. if (resellable_clause)
  2181. {
  2182. if (region->getRegionFlags() & REGION_FLAGS_BLOCK_LAND_RESELL)
  2183. {
  2184. resellable_clause->setText(getString("can_not_resell"));
  2185. }
  2186. else
  2187. {
  2188. resellable_clause->setText(getString("can_resell"));
  2189. }
  2190. }
  2191. LLTextBox* changeable_clause = getChild<LLTextBox>("changeable_clause");
  2192. if (changeable_clause)
  2193. {
  2194. if (region->getRegionFlags() & REGION_FLAGS_ALLOW_PARCEL_CHANGES)
  2195. {
  2196. changeable_clause->setText(getString("can_change"));
  2197. }
  2198. else
  2199. {
  2200. changeable_clause->setText(getString("can_not_change"));
  2201. }
  2202. }
  2203. LLTextBox* region_maturity = getChild<LLTextBox>("region_maturity_text");
  2204. if (region_maturity)
  2205. {
  2206. region_maturity->setText(region->getSimAccessString());
  2207. }
  2208. LLTextBox* region_landtype = getChild<LLTextBox>("region_landtype_text");
  2209. if (region_landtype)
  2210. {
  2211. region_landtype->setText(region->getSimProductName());
  2212. }
  2213. // let the parent class handle the general data collection. 
  2214. bool rv = LLPanelRegionInfo::refreshFromRegion(region);
  2215. LLMessageSystem *msg = gMessageSystem;
  2216. msg->newMessage("EstateCovenantRequest");
  2217. msg->nextBlockFast(_PREHASH_AgentData);
  2218. msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
  2219. msg->addUUIDFast(_PREHASH_SessionID,gAgent.getSessionID());
  2220. msg->sendReliable(region->getHost());
  2221. return rv;
  2222. }
  2223. // virtual 
  2224. bool LLPanelEstateCovenant::estateUpdate(LLMessageSystem* msg)
  2225. {
  2226. llinfos << "LLPanelEstateCovenant::estateUpdate()" << llendl;
  2227. return true;
  2228. }
  2229. // virtual 
  2230. BOOL LLPanelEstateCovenant::postBuild()
  2231. {
  2232. mEstateNameText = getChild<LLTextBox>("estate_name_text");
  2233. mEstateOwnerText = getChild<LLTextBox>("estate_owner_text");
  2234. mLastModifiedText = getChild<LLTextBox>("covenant_timestamp_text");
  2235. mEditor = getChild<LLViewerTextEditor>("covenant_editor");
  2236. LLButton* reset_button = getChild<LLButton>("reset_covenant");
  2237. reset_button->setEnabled(gAgent.canManageEstate());
  2238. reset_button->setClickedCallback(LLPanelEstateCovenant::resetCovenantID, NULL);
  2239. return LLPanelRegionInfo::postBuild();
  2240. }
  2241. // virtual 
  2242. void LLPanelEstateCovenant::updateChild(LLUICtrl* child_ctrl)
  2243. {
  2244. }
  2245. // virtual
  2246. BOOL LLPanelEstateCovenant::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
  2247.   EDragAndDropType cargo_type,
  2248.   void* cargo_data,
  2249.   EAcceptance* accept,
  2250.   std::string& tooltip_msg)
  2251. {
  2252. LLInventoryItem* item = (LLInventoryItem*)cargo_data;
  2253. if (!gAgent.canManageEstate())
  2254. {
  2255. *accept = ACCEPT_NO;
  2256. return TRUE;
  2257. }
  2258. switch(cargo_type)
  2259. {
  2260. case DAD_NOTECARD:
  2261. *accept = ACCEPT_YES_COPY_SINGLE;
  2262. if (item && drop)
  2263. {
  2264. LLSD payload;
  2265. payload["item_id"] = item->getUUID();
  2266. LLNotificationsUtil::add("EstateChangeCovenant", LLSD(), payload,
  2267. LLPanelEstateCovenant::confirmChangeCovenantCallback);
  2268. }
  2269. break;
  2270. default:
  2271. *accept = ACCEPT_NO;
  2272. break;
  2273. }
  2274. return TRUE;
  2275. // static 
  2276. bool LLPanelEstateCovenant::confirmChangeCovenantCallback(const LLSD& notification, const LLSD& response)
  2277. {
  2278. S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
  2279. LLInventoryItem* item = gInventory.getItem(notification["payload"]["item_id"].asUUID());
  2280. LLPanelEstateCovenant* self = LLFloaterRegionInfo::getPanelCovenant();
  2281. if (!item || !self) return false;
  2282. switch(option)
  2283. {
  2284. case 0:
  2285. self->loadInvItem(item);
  2286. break;
  2287. default:
  2288. break;
  2289. }
  2290. return false;
  2291. }
  2292. // static
  2293. void LLPanelEstateCovenant::resetCovenantID(void* userdata)
  2294. {
  2295. LLNotificationsUtil::add("EstateChangeCovenant", LLSD(), LLSD(), confirmResetCovenantCallback);
  2296. }
  2297. // static
  2298. bool LLPanelEstateCovenant::confirmResetCovenantCallback(const LLSD& notification, const LLSD& response)
  2299. {
  2300. LLPanelEstateCovenant* self = LLFloaterRegionInfo::getPanelCovenant();
  2301. if (!self) return false;
  2302. S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
  2303. switch(option)
  2304. {
  2305. case 0:
  2306. self->loadInvItem(NULL);
  2307. break;
  2308. default:
  2309. break;
  2310. }
  2311. return false;
  2312. }
  2313. void LLPanelEstateCovenant::loadInvItem(LLInventoryItem *itemp)
  2314. {
  2315. const BOOL high_priority = TRUE;
  2316. if (itemp)
  2317. {
  2318. gAssetStorage->getInvItemAsset(gAgent.getRegionHost(),
  2319. gAgent.getID(),
  2320. gAgent.getSessionID(),
  2321. itemp->getPermissions().getOwner(),
  2322. LLUUID::null,
  2323. itemp->getUUID(),
  2324. itemp->getAssetUUID(),
  2325. itemp->getType(),
  2326.                                     onLoadComplete,
  2327. (void*)this,
  2328. high_priority);
  2329. mAssetStatus = ASSET_LOADING;
  2330. }
  2331. else
  2332. {
  2333. mAssetStatus = ASSET_LOADED;
  2334. setCovenantTextEditor(LLTrans::getString("RegionNoCovenant"));
  2335. sendChangeCovenantID(LLUUID::null);
  2336. }
  2337. }
  2338. // static
  2339. void LLPanelEstateCovenant::onLoadComplete(LLVFS *vfs,
  2340.    const LLUUID& asset_uuid,
  2341.    LLAssetType::EType type,
  2342.    void* user_data, S32 status, LLExtStat ext_status)
  2343. {
  2344. llinfos << "LLPanelEstateCovenant::onLoadComplete()" << llendl;
  2345. LLPanelEstateCovenant* panelp = (LLPanelEstateCovenant*)user_data;
  2346. if( panelp )
  2347. {
  2348. if(0 == status)
  2349. {
  2350. LLVFile file(vfs, asset_uuid, type, LLVFile::READ);
  2351. S32 file_length = file.getSize();
  2352. std::vector<char> buffer(file_length+1);
  2353. file.read((U8*)&buffer[0], file_length);
  2354. // put a EOS at the end
  2355. buffer[file_length] = 0;
  2356. if( (file_length > 19) && !strncmp( &buffer[0], "Linden text version", 19 ) )
  2357. {
  2358. if( !panelp->mEditor->importBuffer( &buffer[0], file_length+1 ) )
  2359. {
  2360. llwarns << "Problem importing estate covenant." << llendl;
  2361. LLNotificationsUtil::add("ProblemImportingEstateCovenant");
  2362. }
  2363. else
  2364. {
  2365. panelp->sendChangeCovenantID(asset_uuid);
  2366. }
  2367. }
  2368. else
  2369. {
  2370. // Version 0 (just text, doesn't include version number)
  2371. panelp->sendChangeCovenantID(asset_uuid);
  2372. }
  2373. }
  2374. else
  2375. {
  2376. LLViewerStats::getInstance()->incStat( LLViewerStats::ST_DOWNLOAD_FAILED );
  2377. if( LL_ERR_ASSET_REQUEST_NOT_IN_DATABASE == status ||
  2378. LL_ERR_FILE_EMPTY == status)
  2379. {
  2380. LLNotificationsUtil::add("MissingNotecardAssetID");
  2381. }
  2382. else if (LL_ERR_INSUFFICIENT_PERMISSIONS == status)
  2383. {
  2384. LLNotificationsUtil::add("NotAllowedToViewNotecard");
  2385. }
  2386. else
  2387. {
  2388. LLNotificationsUtil::add("UnableToLoadNotecardAsset");
  2389. }
  2390. llwarns << "Problem loading notecard: " << status << llendl;
  2391. }
  2392. panelp->mAssetStatus = ASSET_LOADED;
  2393. panelp->setCovenantID(asset_uuid);
  2394. }
  2395. }
  2396. // key = "estatechangecovenantid"
  2397. // strings[0] = str(estate_id) (added by simulator before relay - not here)
  2398. // strings[1] = str(covenant_id)
  2399. void LLPanelEstateCovenant::sendChangeCovenantID(const LLUUID &asset_id)
  2400. {
  2401. if (asset_id != getCovenantID())
  2402. {
  2403.         setCovenantID(asset_id);
  2404. LLMessageSystem* msg = gMessageSystem;
  2405. msg->newMessage("EstateOwnerMessage");
  2406. msg->nextBlockFast(_PREHASH_AgentData);
  2407. msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
  2408. msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
  2409. msg->addUUIDFast(_PREHASH_TransactionID, LLUUID::null); //not used
  2410. msg->nextBlock("MethodData");
  2411. msg->addString("Method", "estatechangecovenantid");
  2412. msg->addUUID("Invoice", LLFloaterRegionInfo::getLastInvoice());
  2413. msg->nextBlock("ParamList");
  2414. msg->addString("Parameter", getCovenantID().asString());
  2415. gAgent.sendReliableMessage();
  2416. }
  2417. }
  2418. // virtual 
  2419. BOOL LLPanelEstateCovenant::sendUpdate()
  2420. {
  2421. return TRUE;
  2422. }
  2423. std::string LLPanelEstateCovenant::getEstateName() const
  2424. {
  2425. return mEstateNameText->getText();
  2426. }
  2427. void LLPanelEstateCovenant::setEstateName(const std::string& name)
  2428. {
  2429. mEstateNameText->setText(name);
  2430. }
  2431. // static
  2432. void LLPanelEstateCovenant::updateCovenantText(const std::string& string, const LLUUID& asset_id)
  2433. {
  2434. LLPanelEstateCovenant* panelp = LLFloaterRegionInfo::getPanelCovenant();
  2435. if( panelp )
  2436. {
  2437. panelp->mEditor->setText(string);
  2438. panelp->setCovenantID(asset_id);
  2439. }
  2440. }
  2441. // static
  2442. void LLPanelEstateCovenant::updateEstateName(const std::string& name)
  2443. {
  2444. LLPanelEstateCovenant* panelp = LLFloaterRegionInfo::getPanelCovenant();
  2445. if( panelp )
  2446. {
  2447. panelp->mEstateNameText->setText(name);
  2448. }
  2449. }
  2450. // static
  2451. void LLPanelEstateCovenant::updateLastModified(const std::string& text)
  2452. {
  2453. LLPanelEstateCovenant* panelp = LLFloaterRegionInfo::getPanelCovenant();
  2454. if( panelp )
  2455. {
  2456. panelp->mLastModifiedText->setText(text);
  2457. }
  2458. }
  2459. // static
  2460. void LLPanelEstateCovenant::updateEstateOwnerName(const std::string& name)
  2461. {
  2462. LLPanelEstateCovenant* panelp = LLFloaterRegionInfo::getPanelCovenant();
  2463. if( panelp )
  2464. {
  2465. panelp->mEstateOwnerText->setText(name);
  2466. }
  2467. }
  2468. std::string LLPanelEstateCovenant::getOwnerName() const
  2469. {
  2470. return mEstateOwnerText->getText();
  2471. }
  2472. void LLPanelEstateCovenant::setOwnerName(const std::string& name)
  2473. {
  2474. mEstateOwnerText->setText(name);
  2475. }
  2476. void LLPanelEstateCovenant::setCovenantTextEditor(const std::string& text)
  2477. {
  2478. mEditor->setText(text);
  2479. }
  2480. // key = "estateupdateinfo"
  2481. // strings[0] = estate name
  2482. // strings[1] = str(owner_id)
  2483. // strings[2] = str(estate_id)
  2484. // strings[3] = str(estate_flags)
  2485. // strings[4] = str((S32)(sun_hour * 1024))
  2486. // strings[5] = str(parent_estate_id)
  2487. // strings[6] = str(covenant_id)
  2488. // strings[7] = str(covenant_timestamp)
  2489. // strings[8] = str(send_to_agent_only)
  2490. // strings[9] = str(abuse_email_addr)
  2491. bool LLDispatchEstateUpdateInfo::operator()(
  2492. const LLDispatcher* dispatcher,
  2493. const std::string& key,
  2494. const LLUUID& invoice,
  2495. const sparam_t& strings)
  2496. {
  2497. LLPanelEstateInfo* panel = LLFloaterRegionInfo::getPanelEstate();
  2498. if (!panel) return true;
  2499. // NOTE: LLDispatcher extracts strings with an extra  at the
  2500. // end.  If we pass the std::string direct to the UI/renderer
  2501. // it draws with a weird character at the end of the string.
  2502. std::string estate_name = strings[0].c_str(); // preserve c_str() call!
  2503. panel->setEstateName(estate_name);
  2504. LLViewerRegion* regionp = gAgent.getRegion();
  2505. LLUUID owner_id(strings[1]);
  2506. regionp->setOwner(owner_id);
  2507. // Update estate owner name in UI
  2508. std::string owner_name =
  2509. LLSLURL::buildCommand("agent", owner_id, "inspect");
  2510. panel->setOwnerName(owner_name);
  2511. U32 estate_id = strtoul(strings[2].c_str(), NULL, 10);
  2512. panel->setEstateID(estate_id);
  2513. U32 flags = strtoul(strings[3].c_str(), NULL, 10);
  2514. panel->setEstateFlags(flags);
  2515. F32 sun_hour = ((F32)(strtod(strings[4].c_str(), NULL)))/1024.0f;
  2516. if(sun_hour == 0 && (flags & REGION_FLAGS_SUN_FIXED ? FALSE : TRUE))
  2517. {
  2518. panel->setGlobalTime(TRUE);
  2519. else
  2520. {
  2521. panel->setGlobalTime(FALSE);
  2522. panel->setSunHour(sun_hour);
  2523. }
  2524. bool visible_from_mainland = (bool)(flags & REGION_FLAGS_EXTERNALLY_VISIBLE);
  2525. bool god = gAgent.isGodlike();
  2526. bool linden_estate = (estate_id <= ESTATE_LAST_LINDEN);
  2527. // If visible from mainland, disable the access allowed
  2528. // UI, as anyone can teleport there.
  2529. // However, gods need to be able to edit the access list for
  2530. // linden estates, regardless of visibility, to allow object
  2531. // and L$ transfers.
  2532. bool enable_agent = (!visible_from_mainland || (god && linden_estate));
  2533. bool enable_group = enable_agent;
  2534. bool enable_ban = !linden_estate;
  2535. panel->setAccessAllowedEnabled(enable_agent, enable_group, enable_ban);
  2536. return true;
  2537. }
  2538. // key = "setaccess"
  2539. // strings[0] = str(estate_id)
  2540. // strings[1] = str(packed_access_lists)
  2541. // strings[2] = str(num allowed agent ids)
  2542. // strings[3] = str(num allowed group ids)
  2543. // strings[4] = str(num banned agent ids)
  2544. // strings[5] = str(num estate manager agent ids)
  2545. // strings[6] = bin(uuid)
  2546. // strings[7] = bin(uuid)
  2547. // strings[8] = bin(uuid)
  2548. // ...
  2549. bool LLDispatchSetEstateAccess::operator()(
  2550. const LLDispatcher* dispatcher,
  2551. const std::string& key,
  2552. const LLUUID& invoice,
  2553. const sparam_t& strings)
  2554. {
  2555. LLPanelEstateInfo* panel = LLFloaterRegionInfo::getPanelEstate();
  2556. if (!panel) return true;
  2557. S32 index = 1; // skip estate_id
  2558. U32 access_flags = strtoul(strings[index++].c_str(), NULL,10);
  2559. S32 num_allowed_agents = strtol(strings[index++].c_str(), NULL, 10);
  2560. S32 num_allowed_groups = strtol(strings[index++].c_str(), NULL, 10);
  2561. S32 num_banned_agents = strtol(strings[index++].c_str(), NULL, 10);
  2562. S32 num_estate_managers = strtol(strings[index++].c_str(), NULL, 10);
  2563. // sanity ckecks
  2564. if (num_allowed_agents > 0
  2565. && !(access_flags & ESTATE_ACCESS_ALLOWED_AGENTS))
  2566. {
  2567. llwarns << "non-zero count for allowed agents, but no corresponding flag" << llendl;
  2568. }
  2569. if (num_allowed_groups > 0
  2570. && !(access_flags & ESTATE_ACCESS_ALLOWED_GROUPS))
  2571. {
  2572. llwarns << "non-zero count for allowed groups, but no corresponding flag" << llendl;
  2573. }
  2574. if (num_banned_agents > 0
  2575. && !(access_flags & ESTATE_ACCESS_BANNED_AGENTS))
  2576. {
  2577. llwarns << "non-zero count for banned agents, but no corresponding flag" << llendl;
  2578. }
  2579. if (num_estate_managers > 0
  2580. && !(access_flags & ESTATE_ACCESS_MANAGERS))
  2581. {
  2582. llwarns << "non-zero count for managers, but no corresponding flag" << llendl;
  2583. }
  2584. // grab the UUID's out of the string fields
  2585. if (access_flags & ESTATE_ACCESS_ALLOWED_AGENTS)
  2586. {
  2587. LLNameListCtrl* allowed_agent_name_list;
  2588. allowed_agent_name_list = panel->getChild<LLNameListCtrl>("allowed_avatar_name_list");
  2589. int totalAllowedAgents = num_allowed_agents;
  2590. if (allowed_agent_name_list) 
  2591. {
  2592. totalAllowedAgents += allowed_agent_name_list->getItemCount();
  2593. }
  2594. LLStringUtil::format_map_t args;
  2595. args["[ALLOWEDAGENTS]"] = llformat ("%d", totalAllowedAgents);
  2596. args["[MAXACCESS]"] = llformat ("%d", ESTATE_MAX_ACCESS_IDS);
  2597. std::string msg = LLTrans::getString("RegionInfoAllowedResidents", args);
  2598. panel->childSetValue("allow_resident_label", LLSD(msg));
  2599. if (allowed_agent_name_list)
  2600. {
  2601. //allowed_agent_name_list->deleteAllItems();
  2602. for (S32 i = 0; i < num_allowed_agents && i < ESTATE_MAX_ACCESS_IDS; i++)
  2603. {
  2604. LLUUID id;
  2605. memcpy(id.mData, strings[index++].data(), UUID_BYTES); /* Flawfinder: ignore */
  2606. allowed_agent_name_list->addNameItem(id);
  2607. }
  2608. panel->childSetEnabled("remove_allowed_avatar_btn", allowed_agent_name_list->getFirstSelected() ? TRUE : FALSE);
  2609. allowed_agent_name_list->sortByColumnIndex(0, TRUE);
  2610. }
  2611. }
  2612. if (access_flags & ESTATE_ACCESS_ALLOWED_GROUPS)
  2613. {
  2614. LLNameListCtrl* allowed_group_name_list;
  2615. allowed_group_name_list = panel->getChild<LLNameListCtrl>("allowed_group_name_list");
  2616. LLStringUtil::format_map_t args;
  2617. args["[ALLOWEDGROUPS]"] = llformat ("%d", num_allowed_groups);
  2618. args["[MAXACCESS]"] = llformat ("%d", ESTATE_MAX_GROUP_IDS);
  2619. std::string msg = LLTrans::getString("RegionInfoAllowedGroups", args);
  2620. panel->childSetValue("allow_group_label", LLSD(msg));
  2621. if (allowed_group_name_list)
  2622. {
  2623. allowed_group_name_list->deleteAllItems();
  2624. for (S32 i = 0; i < num_allowed_groups && i < ESTATE_MAX_GROUP_IDS; i++)
  2625. {
  2626. LLUUID id;
  2627. memcpy(id.mData, strings[index++].data(), UUID_BYTES); /* Flawfinder: ignore */
  2628. allowed_group_name_list->addGroupNameItem(id);
  2629. }
  2630. panel->childSetEnabled("remove_allowed_group_btn", allowed_group_name_list->getFirstSelected() ? TRUE : FALSE);
  2631. allowed_group_name_list->sortByColumnIndex(0, TRUE);
  2632. }
  2633. }
  2634. if (access_flags & ESTATE_ACCESS_BANNED_AGENTS)
  2635. {
  2636. LLNameListCtrl* banned_agent_name_list;
  2637. banned_agent_name_list = panel->getChild<LLNameListCtrl>("banned_avatar_name_list");
  2638. int totalBannedAgents = num_banned_agents;
  2639. if (banned_agent_name_list) 
  2640. {
  2641. totalBannedAgents += banned_agent_name_list->getItemCount();
  2642. }
  2643. std::string msg = llformat("Banned residents: (%d, max %d)",
  2644. totalBannedAgents,
  2645. ESTATE_MAX_ACCESS_IDS);
  2646. panel->childSetValue("ban_resident_label", LLSD(msg));
  2647. if (banned_agent_name_list)
  2648. {
  2649. //banned_agent_name_list->deleteAllItems();
  2650. for (S32 i = 0; i < num_banned_agents && i < ESTATE_MAX_ACCESS_IDS; i++)
  2651. {
  2652. LLUUID id;
  2653. memcpy(id.mData, strings[index++].data(), UUID_BYTES); /* Flawfinder: ignore */
  2654. banned_agent_name_list->addNameItem(id);
  2655. }
  2656. panel->childSetEnabled("remove_banned_avatar_btn", banned_agent_name_list->getFirstSelected() ? TRUE : FALSE);
  2657. banned_agent_name_list->sortByColumnIndex(0, TRUE);
  2658. }
  2659. }
  2660. if (access_flags & ESTATE_ACCESS_MANAGERS)
  2661. {
  2662. std::string msg = llformat("Estate Managers: (%d, max %d)",
  2663. num_estate_managers,
  2664. ESTATE_MAX_MANAGERS);
  2665. panel->childSetValue("estate_manager_label", LLSD(msg));
  2666. LLNameListCtrl* estate_manager_name_list =
  2667. panel->getChild<LLNameListCtrl>("estate_manager_name_list");
  2668. if (estate_manager_name_list)
  2669. {
  2670. estate_manager_name_list->deleteAllItems(); // Clear existing entries
  2671. // There should be only ESTATE_MAX_MANAGERS people in the list, but if the database gets more (SL-46107) don't 
  2672. // truncate the list unless it's really big.  Go ahead and show the extras so the user doesn't get confused, 
  2673. // and they can still remove them.
  2674. for (S32 i = 0; i < num_estate_managers && i < (ESTATE_MAX_MANAGERS * 4); i++)
  2675. {
  2676. LLUUID id;
  2677. memcpy(id.mData, strings[index++].data(), UUID_BYTES); /* Flawfinder: ignore */
  2678. estate_manager_name_list->addNameItem(id);
  2679. }
  2680. panel->childSetEnabled("remove_estate_manager_btn", estate_manager_name_list->getFirstSelected() ? TRUE : FALSE);
  2681. estate_manager_name_list->sortByColumnIndex(0, TRUE);
  2682. }
  2683. }
  2684. return true;
  2685. }