00001
00033 #include "llviewerprecompiledheaders.h"
00034 #include "llfloaterregioninfo.h"
00035
00036 #include <algorithm>
00037 #include <functional>
00038
00039 #include "llcachename.h"
00040 #include "lldir.h"
00041 #include "lldispatcher.h"
00042 #include "llglheaders.h"
00043 #include "llregionflags.h"
00044 #include "llstl.h"
00045 #include "indra_constants.h"
00046 #include "message.h"
00047
00048 #include "llagent.h"
00049 #include "llalertdialog.h"
00050 #include "llfloateravatarpicker.h"
00051 #include "llbutton.h"
00052 #include "llcheckboxctrl.h"
00053 #include "llcombobox.h"
00054 #include "llfilepicker.h"
00055 #include "llfloaterdaycycle.h"
00056 #include "llfloatergodtools.h"
00057 #include "llfloatertopobjects.h"
00058 #include "llfloatergroups.h"
00059 #include "llfloatertelehub.h"
00060 #include "llfloaterwindlight.h"
00061 #include "lllineeditor.h"
00062 #include "llalertdialog.h"
00063 #include "llnamelistctrl.h"
00064 #include "llsliderctrl.h"
00065 #include "llspinctrl.h"
00066 #include "lltabcontainer.h"
00067 #include "lltextbox.h"
00068 #include "llinventory.h"
00069 #include "lltexturectrl.h"
00070 #include "llviewercontrol.h"
00071 #include "lluictrlfactory.h"
00072 #include "llviewerimage.h"
00073 #include "llviewerimagelist.h"
00074 #include "llviewerregion.h"
00075 #include "llviewerstats.h"
00076 #include "llviewertexteditor.h"
00077 #include "llviewerwindow.h"
00078 #include "llvlcomposition.h"
00079
00080 const S32 TERRAIN_TEXTURE_COUNT = 4;
00081 const S32 CORNER_COUNT = 4;
00082
00083 extern LLString gLastVersionChannel;
00084
00085
00089
00090 class LLDispatchEstateUpdateInfo : public LLDispatchHandler
00091 {
00092 public:
00093 LLDispatchEstateUpdateInfo() {}
00094 virtual ~LLDispatchEstateUpdateInfo() {}
00095 virtual bool operator()(
00096 const LLDispatcher* dispatcher,
00097 const std::string& key,
00098 const LLUUID& invoice,
00099 const sparam_t& strings);
00100 };
00101
00102 class LLDispatchSetEstateAccess : public LLDispatchHandler
00103 {
00104 public:
00105 LLDispatchSetEstateAccess() {}
00106 virtual ~LLDispatchSetEstateAccess() {}
00107 virtual bool operator()(
00108 const LLDispatcher* dispatcher,
00109 const std::string& key,
00110 const LLUUID& invoice,
00111 const sparam_t& strings);
00112 };
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147 bool estate_dispatch_initialized = false;
00148
00149
00153
00154
00155 LLUUID LLFloaterRegionInfo::sRequestInvoice;
00156
00157 LLFloaterRegionInfo::LLFloaterRegionInfo(const LLSD& seed)
00158 {
00159 LLUICtrlFactory::getInstance()->buildFloater(this, "floater_region_info.xml", NULL, FALSE);
00160 }
00161
00162 BOOL LLFloaterRegionInfo::postBuild()
00163 {
00164 mTab = getChild<LLTabContainer>("region_panels");
00165
00166
00167 LLPanelRegionInfo* panel;
00168 panel = new LLPanelRegionGeneralInfo;
00169 mInfoPanels.push_back(panel);
00170 LLUICtrlFactory::getInstance()->buildPanel(panel, "panel_region_general.xml");
00171 mTab->addTabPanel(panel, panel->getLabel(), TRUE);
00172
00173 panel = new LLPanelRegionDebugInfo;
00174 mInfoPanels.push_back(panel);
00175 LLUICtrlFactory::getInstance()->buildPanel(panel, "panel_region_debug.xml");
00176 mTab->addTabPanel(panel, panel->getLabel(), FALSE);
00177
00178 panel = new LLPanelRegionTextureInfo;
00179 mInfoPanels.push_back(panel);
00180 LLUICtrlFactory::getInstance()->buildPanel(panel, "panel_region_texture.xml");
00181 mTab->addTabPanel(panel, panel->getLabel(), FALSE);
00182
00183 panel = new LLPanelRegionTerrainInfo;
00184 mInfoPanels.push_back(panel);
00185 LLUICtrlFactory::getInstance()->buildPanel(panel, "panel_region_terrain.xml");
00186 mTab->addTabPanel(panel, panel->getLabel(), FALSE);
00187
00188 panel = new LLPanelEstateInfo;
00189 mInfoPanels.push_back(panel);
00190 LLUICtrlFactory::getInstance()->buildPanel(panel, "panel_region_estate.xml");
00191 mTab->addTabPanel(panel, panel->getLabel(), FALSE);
00192
00193 panel = new LLPanelEstateCovenant;
00194 mInfoPanels.push_back(panel);
00195 LLUICtrlFactory::getInstance()->buildPanel(panel, "panel_region_covenant.xml");
00196 mTab->addTabPanel(panel, panel->getLabel(), FALSE);
00197
00198 gMessageSystem->setHandlerFunc(
00199 "EstateOwnerMessage",
00200 &processEstateOwnerRequest);
00201
00202 return TRUE;
00203 }
00204
00205 LLFloaterRegionInfo::~LLFloaterRegionInfo()
00206 {
00207 }
00208
00209 void LLFloaterRegionInfo::onOpen()
00210 {
00211 LLRect rect = gSavedSettings.getRect("FloaterRegionInfo");
00212 S32 left, top;
00213 gFloaterView->getNewFloaterPosition(&left, &top);
00214 rect.translate(left,top);
00215
00216 refreshFromRegion(gAgent.getRegion());
00217 requestRegionInfo();
00218 LLFloater::onOpen();
00219 }
00220
00221
00222 void LLFloaterRegionInfo::requestRegionInfo()
00223 {
00224 LLTabContainer* tab = findInstance()->getChild<LLTabContainer>("region_panels");
00225
00226 tab->getChild<LLPanel>("General")->setCtrlsEnabled(FALSE);
00227 tab->getChild<LLPanel>("Debug")->setCtrlsEnabled(FALSE);
00228 tab->getChild<LLPanel>("Terrain")->setCtrlsEnabled(FALSE);
00229 tab->getChild<LLPanel>("Estate")->setCtrlsEnabled(FALSE);
00230
00231
00232
00233
00234 LLMessageSystem* msg = gMessageSystem;
00235 msg->newMessage("RequestRegionInfo");
00236 msg->nextBlock("AgentData");
00237 msg->addUUID("AgentID", gAgent.getID());
00238 msg->addUUID("SessionID", gAgent.getSessionID());
00239 gAgent.sendReliableMessage();
00240 }
00241
00242
00243 void LLFloaterRegionInfo::processEstateOwnerRequest(LLMessageSystem* msg,void**)
00244 {
00245 static LLDispatcher dispatch;
00246 if(!findInstance())
00247 {
00248 return;
00249 }
00250
00251 if (!estate_dispatch_initialized)
00252 {
00253 LLPanelEstateInfo::initDispatch(dispatch);
00254 }
00255
00256 LLTabContainer* tab = findInstance()->getChild<LLTabContainer>("region_panels");
00257 LLPanelEstateInfo* panel = (LLPanelEstateInfo*)tab->getChild<LLPanel>("Estate");
00258
00259
00260 std::string request;
00261 LLUUID invoice;
00262 LLDispatcher::sparam_t strings;
00263 LLDispatcher::unpackMessage(msg, request, invoice, strings);
00264 if(invoice != getLastInvoice())
00265 {
00266 llwarns << "Mismatched Estate message: " << request.c_str() << llendl;
00267 return;
00268 }
00269
00270
00271 dispatch.dispatch(request, invoice, strings);
00272
00273 LLViewerRegion* region = gAgent.getRegion();
00274 BOOL allow_modify = gAgent.isGodlike() || (region && region->canManageEstate());
00275 panel->setCtrlsEnabled(allow_modify);
00276
00277 }
00278
00279
00280
00281 void LLFloaterRegionInfo::processRegionInfo(LLMessageSystem* msg)
00282 {
00283 LLPanel* panel;
00284
00285 llinfos << "LLFloaterRegionInfo::processRegionInfo" << llendl;
00286 if(!findInstance())
00287 {
00288 return;
00289 }
00290
00291 LLTabContainer* tab = findInstance()->getChild<LLTabContainer>("region_panels");
00292
00293 LLViewerRegion* region = gAgent.getRegion();
00294 BOOL allow_modify = gAgent.isGodlike() || (region && region->canManageEstate());
00295
00296
00297 char sim_name[MAX_STRING];
00298 U32 region_flags;
00299 U8 agent_limit;
00300 F32 object_bonus_factor;
00301 U8 sim_access;
00302 F32 water_height;
00303 F32 terrain_raise_limit;
00304 F32 terrain_lower_limit;
00305 BOOL use_estate_sun;
00306 F32 sun_hour;
00307 msg->getString("RegionInfo", "SimName", MAX_STRING, sim_name);
00308 msg->getU32("RegionInfo", "RegionFlags", region_flags);
00309 msg->getU8("RegionInfo", "MaxAgents", agent_limit);
00310 msg->getF32("RegionInfo", "ObjectBonusFactor", object_bonus_factor);
00311 msg->getU8("RegionInfo", "SimAccess", sim_access);
00312 msg->getF32Fast(_PREHASH_RegionInfo, _PREHASH_WaterHeight, water_height);
00313 msg->getF32Fast(_PREHASH_RegionInfo, _PREHASH_TerrainRaiseLimit, terrain_raise_limit);
00314 msg->getF32Fast(_PREHASH_RegionInfo, _PREHASH_TerrainLowerLimit, terrain_lower_limit);
00315 msg->getBOOL("RegionInfo", "UseEstateSun", use_estate_sun);
00316
00317 msg->getF32("RegionInfo", "SunHour", sun_hour);
00318
00319
00320 panel = tab->getChild<LLPanel>("General");
00321 panel->childSetValue("region_text", LLSD(sim_name));
00322 panel->childSetValue("version_channel_text", gLastVersionChannel);
00323
00324 panel->childSetValue("block_terraform_check", (region_flags & REGION_FLAGS_BLOCK_TERRAFORM) ? TRUE : FALSE );
00325 panel->childSetValue("block_fly_check", (region_flags & REGION_FLAGS_BLOCK_FLY) ? TRUE : FALSE );
00326 panel->childSetValue("allow_damage_check", (region_flags & REGION_FLAGS_ALLOW_DAMAGE) ? TRUE : FALSE );
00327 panel->childSetValue("restrict_pushobject", (region_flags & REGION_FLAGS_RESTRICT_PUSHOBJECT) ? TRUE : FALSE );
00328 panel->childSetValue("allow_land_resell_check", (region_flags & REGION_FLAGS_BLOCK_LAND_RESELL) ? FALSE : TRUE );
00329 panel->childSetValue("allow_parcel_changes_check", (region_flags & REGION_FLAGS_ALLOW_PARCEL_CHANGES) ? TRUE : FALSE );
00330 panel->childSetValue("block_parcel_search_check", (region_flags & REGION_FLAGS_BLOCK_PARCEL_SEARCH) ? TRUE : FALSE );
00331 panel->childSetValue("agent_limit_spin", LLSD((F32)agent_limit) );
00332 panel->childSetValue("object_bonus_spin", LLSD(object_bonus_factor) );
00333 panel->childSetValue("access_combo", LLSD(LLViewerRegion::accessToString(sim_access)) );
00334
00335
00336
00337
00338 U32 parent_estate_id;
00339 msg->getU32("RegionInfo", "ParentEstateID", parent_estate_id);
00340 BOOL teen_grid = (parent_estate_id == 5);
00341 panel->childSetEnabled("access_combo", gAgent.isGodlike() || (region && region->canManageEstate() && !teen_grid));
00342 panel->setCtrlsEnabled(allow_modify);
00343
00344
00345
00346 panel = tab->getChild<LLPanel>("Debug");
00347
00348 panel->childSetValue("region_text", LLSD(sim_name) );
00349 panel->childSetValue("disable_scripts_check", LLSD((BOOL)(region_flags & REGION_FLAGS_SKIP_SCRIPTS)) );
00350 panel->childSetValue("disable_collisions_check", LLSD((BOOL)(region_flags & REGION_FLAGS_SKIP_COLLISIONS)) );
00351 panel->childSetValue("disable_physics_check", LLSD((BOOL)(region_flags & REGION_FLAGS_SKIP_PHYSICS)) );
00352 panel->setCtrlsEnabled(allow_modify);
00353
00354
00355 panel = tab->getChild<LLPanel>("Terrain");
00356
00357 panel->childSetValue("region_text", LLSD(sim_name));
00358 panel->childSetValue("water_height_spin", LLSD(water_height));
00359 panel->childSetValue("terrain_raise_spin", LLSD(terrain_raise_limit));
00360 panel->childSetValue("terrain_lower_spin", LLSD(terrain_lower_limit));
00361 panel->childSetValue("use_estate_sun_check", LLSD(use_estate_sun));
00362
00363 panel->childSetValue("fixed_sun_check", LLSD((BOOL)(region_flags & REGION_FLAGS_SUN_FIXED)));
00364 panel->childSetEnabled("fixed_sun_check", allow_modify && !use_estate_sun);
00365 panel->childSetValue("sun_hour_slider", LLSD(sun_hour));
00366 panel->childSetEnabled("sun_hour_slider", allow_modify && !use_estate_sun);
00367 panel->setCtrlsEnabled(allow_modify);
00368
00369 getInstance()->refreshFromRegion( gAgent.getRegion() );
00370 }
00371
00372
00373 LLPanelEstateInfo* LLFloaterRegionInfo::getPanelEstate()
00374 {
00375 LLFloaterRegionInfo* floater = LLFloaterRegionInfo::getInstance();
00376 if (!floater) return NULL;
00377 LLTabContainer* tab = floater->getChild<LLTabContainer>("region_panels");
00378 LLPanelEstateInfo* panel = (LLPanelEstateInfo*)tab->getChild<LLPanel>("Estate");
00379 return panel;
00380 }
00381
00382
00383 LLPanelEstateCovenant* LLFloaterRegionInfo::getPanelCovenant()
00384 {
00385 LLFloaterRegionInfo* floater = LLFloaterRegionInfo::getInstance();
00386 if (!floater) return NULL;
00387 LLTabContainer* tab = floater->getChild<LLTabContainer>("region_panels");
00388 LLPanelEstateCovenant* panel = (LLPanelEstateCovenant*)tab->getChild<LLPanel>("Covenant");
00389 return panel;
00390 }
00391
00392 void LLFloaterRegionInfo::refreshFromRegion(LLViewerRegion* region)
00393 {
00394
00395 std::for_each(
00396 mInfoPanels.begin(),
00397 mInfoPanels.end(),
00398 llbind2nd(
00399 #if LL_WINDOWS
00400 std::mem_fun1(&LLPanelRegionInfo::refreshFromRegion),
00401 #else
00402 std::mem_fun(&LLPanelRegionInfo::refreshFromRegion),
00403 #endif
00404 region));
00405 }
00406
00407
00408 void LLFloaterRegionInfo::refresh()
00409 {
00410 for(info_panels_t::iterator iter = mInfoPanels.begin();
00411 iter != mInfoPanels.end(); ++iter)
00412 {
00413 (*iter)->refresh();
00414 }
00415 }
00416
00417
00421
00422
00423
00424
00425
00426
00427 void LLPanelRegionInfo::onBtnSet(void* user_data)
00428 {
00429 LLPanelRegionInfo* panel = (LLPanelRegionInfo*)user_data;
00430 if(!panel) return;
00431 if (panel->sendUpdate())
00432 {
00433 panel->disableButton("apply_btn");
00434 }
00435 }
00436
00437
00438 void LLPanelRegionInfo::onChangeChildCtrl(LLUICtrl* ctrl, void* user_data)
00439 {
00440 if (ctrl)
00441 {
00442 LLPanelRegionInfo* panel = (LLPanelRegionInfo*) ctrl->getParent();
00443 panel->updateChild(ctrl);
00444 }
00445 }
00446
00447
00448
00449 void LLPanelRegionInfo::onChangeAnything(LLUICtrl* ctrl, void* user_data)
00450 {
00451 LLPanelRegionInfo* panel = (LLPanelRegionInfo*)user_data;
00452 if(panel)
00453 {
00454 panel->enableButton("apply_btn");
00455 panel->refresh();
00456 }
00457 }
00458
00459
00460
00461 void LLPanelRegionInfo::onChangeText(LLLineEditor* caller, void* user_data)
00462 {
00463
00464 onChangeAnything(0, user_data);
00465 }
00466
00467
00468
00469 BOOL LLPanelRegionInfo::postBuild()
00470 {
00471 childSetAction("apply_btn", onBtnSet, this);
00472 childDisable("apply_btn");
00473 refresh();
00474 return TRUE;
00475 }
00476
00477
00478 void LLPanelRegionInfo::updateChild(LLUICtrl* child_ctr)
00479 {
00480 }
00481
00482
00483 bool LLPanelRegionInfo::refreshFromRegion(LLViewerRegion* region)
00484 {
00485 if (region) mHost = region->getHost();
00486 return true;
00487 }
00488
00489 void LLPanelRegionInfo::sendEstateOwnerMessage(
00490 LLMessageSystem* msg,
00491 const char* request,
00492 const LLUUID& invoice,
00493 const strings_t& strings)
00494 {
00495 llinfos << "Sending estate request '" << request << "'" << llendl;
00496 msg->newMessage("EstateOwnerMessage");
00497 msg->nextBlockFast(_PREHASH_AgentData);
00498 msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
00499 msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
00500 msg->addUUIDFast(_PREHASH_TransactionID, LLUUID::null);
00501 msg->nextBlock("MethodData");
00502 msg->addString("Method", request);
00503 msg->addUUID("Invoice", invoice);
00504 if(strings.empty())
00505 {
00506 msg->nextBlock("ParamList");
00507 msg->addString("Parameter", NULL);
00508 }
00509 else
00510 {
00511 strings_t::const_iterator it = strings.begin();
00512 strings_t::const_iterator end = strings.end();
00513 for(; it != end; ++it)
00514 {
00515 msg->nextBlock("ParamList");
00516 msg->addString("Parameter", (*it).c_str());
00517 }
00518 }
00519 msg->sendReliable(mHost);
00520 }
00521
00522 void LLPanelRegionInfo::enableButton(const char* btn_name, BOOL enable)
00523 {
00524 childSetEnabled(btn_name, enable);
00525 }
00526
00527 void LLPanelRegionInfo::disableButton(const char* btn_name)
00528 {
00529 childDisable(btn_name);
00530 }
00531
00532 void LLPanelRegionInfo::initCtrl(const char* name)
00533 {
00534 childSetCommitCallback(name, onChangeAnything, this);
00535 }
00536
00537 void LLPanelRegionInfo::initTextCtrl(const char* name)
00538 {
00539 childSetCommitCallback(name, onChangeAnything, this);
00540 childSetKeystrokeCallback("abuse_email_address", onChangeText, this);
00541 }
00542
00543 void LLPanelRegionInfo::initHelpBtn(const char* name, const char* xml_alert)
00544 {
00545 childSetAction(name, onClickHelp, (void*)xml_alert);
00546 }
00547
00548
00549 void LLPanelRegionInfo::onClickHelp(void* data)
00550 {
00551 const char* xml_alert = (const char*)data;
00552 gViewerWindow->alertXml(xml_alert);
00553 }
00554
00556
00557
00558 bool LLPanelRegionGeneralInfo::refreshFromRegion(LLViewerRegion* region)
00559 {
00560 BOOL allow_modify = gAgent.isGodlike() || (region && region->canManageEstate());
00561 setCtrlsEnabled(allow_modify);
00562 childDisable("apply_btn");
00563 childSetEnabled("access_text", allow_modify);
00564
00565
00566 childSetEnabled("kick_btn", allow_modify);
00567 childSetEnabled("kick_all_btn", allow_modify);
00568 childSetEnabled("im_btn", allow_modify);
00569 childSetEnabled("manage_telehub_btn", allow_modify);
00570
00571
00572
00573 return LLPanelRegionInfo::refreshFromRegion(region);
00574 }
00575
00576 BOOL LLPanelRegionGeneralInfo::postBuild()
00577 {
00578
00579 initCtrl("block_terraform_check");
00580 initCtrl("block_fly_check");
00581 initCtrl("allow_damage_check");
00582 initCtrl("allow_land_resell_check");
00583 initCtrl("allow_parcel_changes_check");
00584 initCtrl("agent_limit_spin");
00585 initCtrl("object_bonus_spin");
00586 initCtrl("access_combo");
00587 initCtrl("restrict_pushobject");
00588 initCtrl("block_parcel_search_check");
00589
00590 initHelpBtn("terraform_help", "HelpRegionBlockTerraform");
00591 initHelpBtn("fly_help", "HelpRegionBlockFly");
00592 initHelpBtn("damage_help", "HelpRegionAllowDamage");
00593 initHelpBtn("agent_limit_help", "HelpRegionAgentLimit");
00594 initHelpBtn("object_bonus_help", "HelpRegionObjectBonus");
00595 initHelpBtn("access_help", "HelpRegionMaturity");
00596 initHelpBtn("restrict_pushobject_help", "HelpRegionRestrictPushObject");
00597 initHelpBtn("land_resell_help", "HelpRegionLandResell");
00598 initHelpBtn("parcel_changes_help", "HelpParcelChanges");
00599 initHelpBtn("parcel_search_help", "HelpRegionSearch");
00600
00601 childSetAction("kick_btn", onClickKick, this);
00602 childSetAction("kick_all_btn", onClickKickAll, this);
00603 childSetAction("im_btn", onClickMessage, this);
00604 childSetAction("manage_telehub_btn", onClickManageTelehub, this);
00605
00606 return LLPanelRegionInfo::postBuild();
00607 }
00608
00609
00610 void LLPanelRegionGeneralInfo::onClickKick(void* userdata)
00611 {
00612 llinfos << "LLPanelRegionGeneralInfo::onClickKick" << llendl;
00613 LLPanelRegionGeneralInfo* panelp = (LLPanelRegionGeneralInfo*)userdata;
00614
00615
00616
00617 LLFloater* parent_floater = gFloaterView->getParentFloater(panelp);
00618 LLFloater* child_floater = LLFloaterAvatarPicker::show(onKickCommit, userdata, FALSE, TRUE);
00619 parent_floater->addDependentFloater(child_floater);
00620 }
00621
00622
00623 void LLPanelRegionGeneralInfo::onKickCommit(const std::vector<std::string>& names, const std::vector<LLUUID>& ids, void* userdata)
00624 {
00625 if (names.empty() || ids.empty()) return;
00626 if(ids[0].notNull())
00627 {
00628 LLPanelRegionGeneralInfo* self = (LLPanelRegionGeneralInfo*)userdata;
00629 if(!self) return;
00630 strings_t strings;
00631
00632
00633 char buffer[MAX_STRING];
00634 gAgent.getID().toString(buffer);
00635 strings.push_back(buffer);
00636
00637 ids[0].toString(buffer);
00638 strings.push_back(strings_t::value_type(buffer));
00639
00640 LLUUID invoice(LLFloaterRegionInfo::getLastInvoice());
00641 self->sendEstateOwnerMessage(gMessageSystem, "teleporthomeuser", invoice, strings);
00642 }
00643 }
00644
00645
00646 void LLPanelRegionGeneralInfo::onClickKickAll(void* userdata)
00647 {
00648 llinfos << "LLPanelRegionGeneralInfo::onClickKickAll" << llendl;
00649 gViewerWindow->alertXml("KickUsersFromRegion", onKickAllCommit, userdata);
00650 }
00651
00652
00653 void LLPanelRegionGeneralInfo::onKickAllCommit(S32 option, void* userdata)
00654 {
00655 if (option == 0)
00656 {
00657 LLPanelRegionGeneralInfo* self = (LLPanelRegionGeneralInfo*)userdata;
00658 if(!self) return;
00659 strings_t strings;
00660
00661 char buffer[MAX_STRING];
00662 gAgent.getID().toString(buffer);
00663 strings.push_back(buffer);
00664
00665 LLUUID invoice(LLFloaterRegionInfo::getLastInvoice());
00666
00667 self->sendEstateOwnerMessage(gMessageSystem, "teleporthomeallusers", invoice, strings);
00668 }
00669 }
00670
00671
00672 void LLPanelRegionGeneralInfo::onClickMessage(void* userdata)
00673 {
00674 llinfos << "LLPanelRegionGeneralInfo::onClickMessage" << llendl;
00675 gViewerWindow->alertXmlEditText("MessageRegion", LLString::format_map_t(),
00676 NULL, NULL,
00677 onMessageCommit, userdata);
00678 }
00679
00680
00681 void LLPanelRegionGeneralInfo::onMessageCommit(S32 option, const LLString& text, void* userdata)
00682 {
00683 if(option != 0) return;
00684 if(text.empty()) return;
00685 LLPanelRegionGeneralInfo* self = (LLPanelRegionGeneralInfo*)userdata;
00686 if(!self) return;
00687 llinfos << "Message to everyone: " << text << llendl;
00688 strings_t strings;
00689
00690
00691
00692
00693
00694 strings.push_back("-1");
00695 strings.push_back("-1");
00696 char buffer[MAX_STRING];
00697 gAgent.getID().toString(buffer);
00698 strings.push_back(buffer);
00699 std::string name;
00700 gAgent.buildFullname(name);
00701 strings.push_back(strings_t::value_type(name));
00702 strings.push_back(strings_t::value_type(text));
00703 LLUUID invoice(LLFloaterRegionInfo::getLastInvoice());
00704 self->sendEstateOwnerMessage(gMessageSystem, "simulatormessage", invoice, strings);
00705 }
00706
00707
00708 void LLPanelRegionGeneralInfo::onClickManageTelehub(void* data)
00709 {
00710 LLFloaterRegionInfo::getInstance()->close();
00711
00712 LLFloaterTelehub::show();
00713 }
00714
00715
00716
00717
00718
00719
00720
00721
00722
00723
00724
00725
00726 BOOL LLPanelRegionGeneralInfo::sendUpdate()
00727 {
00728 llinfos << "LLPanelRegionGeneralInfo::sendUpdate()" << llendl;
00729
00730
00731 LLSD body;
00732 std::string url = gAgent.getRegion()->getCapability("DispatchRegionInfo");
00733 if (!url.empty())
00734 {
00735 body["block_terraform"] = childGetValue("block_terraform_check");
00736 body["block_fly"] = childGetValue("block_fly_check");
00737 body["allow_damage"] = childGetValue("allow_damage_check");
00738 body["allow_land_resell"] = childGetValue("allow_land_resell_check");
00739 body["agent_limit"] = childGetValue("agent_limit_spin");
00740 body["prim_bonus"] = childGetValue("object_bonus_spin");
00741
00742
00743 body["sim_access"] = LLViewerRegion::stringToAccess(childGetValue("access_combo").asString().c_str());
00744 body["restrict_pushobject"] = childGetValue("restrict_pushobject");
00745 body["allow_parcel_changes"] = childGetValue("allow_parcel_changes_check");
00746 body["block_parcel_search"] = childGetValue("block_parcel_search_check");
00747
00748 LLHTTPClient::post(url, body, new LLHTTPClient::Responder());
00749 }
00750 else
00751 {
00752 strings_t strings;
00753 char buffer[MAX_STRING];
00754
00755 snprintf(buffer, MAX_STRING, "%s", (childGetValue("block_terraform_check").asBoolean() ? "Y" : "N"));
00756 strings.push_back(strings_t::value_type(buffer));
00757
00758 snprintf(buffer, MAX_STRING, "%s", (childGetValue("block_fly_check").asBoolean() ? "Y" : "N"));
00759 strings.push_back(strings_t::value_type(buffer));
00760
00761 snprintf(buffer, MAX_STRING, "%s", (childGetValue("allow_damage_check").asBoolean() ? "Y" : "N"));
00762 strings.push_back(strings_t::value_type(buffer));
00763
00764 snprintf(buffer, MAX_STRING, "%s", (childGetValue("allow_land_resell_check").asBoolean() ? "Y" : "N"));
00765 strings.push_back(strings_t::value_type(buffer));
00766
00767 F32 value = (F32)childGetValue("agent_limit_spin").asReal();
00768 snprintf(buffer, MAX_STRING, "%f", value);
00769 strings.push_back(strings_t::value_type(buffer));
00770
00771 value = (F32)childGetValue("object_bonus_spin").asReal();
00772 snprintf(buffer, MAX_STRING, "%f", value);
00773 strings.push_back(strings_t::value_type(buffer));
00774
00775 U8 access = LLViewerRegion::stringToAccess(childGetValue("access_combo").asString().c_str());
00776 snprintf(buffer, MAX_STRING, "%d", (S32)access);
00777 strings.push_back(strings_t::value_type(buffer));
00778
00779 snprintf(buffer, MAX_STRING, "%s", (childGetValue("restrict_pushobject").asBoolean() ? "Y" : "N"));
00780 strings.push_back(strings_t::value_type(buffer));
00781
00782 snprintf(buffer, MAX_STRING, "%s", (childGetValue("allow_parcel_changes_check").asBoolean() ? "Y" : "N"));
00783 strings.push_back(strings_t::value_type(buffer));
00784
00785 LLUUID invoice(LLFloaterRegionInfo::getLastInvoice());
00786 sendEstateOwnerMessage(gMessageSystem, "setregioninfo", invoice, strings);
00787
00788 LLViewerRegion* region = gAgent.getRegion();
00789 if (region
00790 && access != region->getSimAccess() )
00791 {
00792 gViewerWindow->alertXml("RegionMaturityChange");
00793 }
00794 }
00795
00796
00797
00798
00799
00800 return TRUE;
00801 }
00802
00804
00806 BOOL LLPanelRegionDebugInfo::postBuild()
00807 {
00808 LLPanelRegionInfo::postBuild();
00809 initCtrl("disable_scripts_check");
00810 initCtrl("disable_collisions_check");
00811 initCtrl("disable_physics_check");
00812
00813 initHelpBtn("disable_scripts_help", "HelpRegionDisableScripts");
00814 initHelpBtn("disable_collisions_help", "HelpRegionDisableCollisions");
00815 initHelpBtn("disable_physics_help", "HelpRegionDisablePhysics");
00816 initHelpBtn("top_colliders_help", "HelpRegionTopColliders");
00817 initHelpBtn("top_scripts_help", "HelpRegionTopScripts");
00818 initHelpBtn("restart_help", "HelpRegionRestart");
00819
00820 childSetAction("choose_avatar_btn", onClickChooseAvatar, this);
00821 childSetAction("return_scripted_other_land_btn", onClickReturnScriptedOtherLand, this);
00822 childSetAction("return_scripted_all_btn", onClickReturnScriptedAll, this);
00823 childSetAction("top_colliders_btn", onClickTopColliders, this);
00824 childSetAction("top_scripts_btn", onClickTopScripts, this);
00825 childSetAction("restart_btn", onClickRestart, this);
00826 childSetAction("cancel_restart_btn", onClickCancelRestart, this);
00827
00828 return TRUE;
00829 }
00830
00831
00832 bool LLPanelRegionDebugInfo::refreshFromRegion(LLViewerRegion* region)
00833 {
00834 BOOL allow_modify = gAgent.isGodlike() || (region && region->canManageEstate());
00835 setCtrlsEnabled(allow_modify);
00836 childDisable("apply_btn");
00837
00838 childSetEnabled("choose_avatar_btn", allow_modify);
00839 childSetEnabled("return_scripted_other_land_btn", allow_modify && !mTargetAvatar.isNull());
00840 childSetEnabled("return_scripted_all_btn", allow_modify && !mTargetAvatar.isNull());
00841 childSetEnabled("top_colliders_btn", allow_modify);
00842 childSetEnabled("top_scripts_btn", allow_modify);
00843 childSetEnabled("restart_btn", allow_modify);
00844 childSetEnabled("cancel_restart_btn", allow_modify);
00845
00846 return LLPanelRegionInfo::refreshFromRegion(region);
00847 }
00848
00849
00850 BOOL LLPanelRegionDebugInfo::sendUpdate()
00851 {
00852 llinfos << "LLPanelRegionDebugInfo::sendUpdate" << llendl;
00853 strings_t strings;
00854 char buffer[MAX_STRING];
00855
00856 snprintf(buffer, MAX_STRING, "%s", (childGetValue("disable_scripts_check").asBoolean() ? "Y" : "N"));
00857 strings.push_back(buffer);
00858
00859 snprintf(buffer, MAX_STRING, "%s", (childGetValue("disable_collisions_check").asBoolean() ? "Y" : "N"));
00860 strings.push_back(buffer);
00861
00862 snprintf(buffer, MAX_STRING, "%s", (childGetValue("disable_physics_check").asBoolean() ? "Y" : "N"));
00863 strings.push_back(buffer);
00864
00865 LLUUID invoice(LLFloaterRegionInfo::getLastInvoice());
00866 sendEstateOwnerMessage(gMessageSystem, "setregiondebug", invoice, strings);
00867 return TRUE;
00868 }
00869
00870 void LLPanelRegionDebugInfo::onClickChooseAvatar(void* data)
00871 {
00872 LLFloaterAvatarPicker::show(callbackAvatarID, data, FALSE, TRUE);
00873 }
00874
00875
00876 void LLPanelRegionDebugInfo::callbackAvatarID(const std::vector<std::string>& names, const std::vector<LLUUID>& ids, void* data)
00877 {
00878 LLPanelRegionDebugInfo* self = (LLPanelRegionDebugInfo*) data;
00879 if (ids.empty() || names.empty()) return;
00880 self->mTargetAvatar = ids[0];
00881 self->childSetValue("target_avatar_name", LLSD(names[0]));
00882 self->refreshFromRegion( gAgent.getRegion() );
00883 }
00884
00885
00886 void LLPanelRegionDebugInfo::onClickReturnScriptedOtherLand(void* data)
00887 {
00888 LLPanelRegionDebugInfo* panelp = (LLPanelRegionDebugInfo*) data;
00889 if (panelp->mTargetAvatar.isNull()) return;
00890
00891 LLString::format_map_t args;
00892 args["[USER_NAME]"] = panelp->childGetValue("target_avatar_name").asString();
00893 gViewerWindow->alertXml("ReturnScriptedOnOthersLand", args, callbackReturnScriptedOtherLand, data);
00894 }
00895
00896
00897 void LLPanelRegionDebugInfo::callbackReturnScriptedOtherLand( S32 option, void* userdata )
00898 {
00899 if (option != 0) return;
00900
00901 LLPanelRegionDebugInfo* self = (LLPanelRegionDebugInfo*) userdata;
00902 if (!self->mTargetAvatar.isNull())
00903 {
00904 U32 flags = 0;
00905 flags = flags | SWD_OTHERS_LAND_ONLY;
00906 flags = flags | SWD_ALWAYS_RETURN_OBJECTS;
00907 flags |= SWD_SCRIPTED_ONLY;
00908
00909 send_sim_wide_deletes(self->mTargetAvatar, flags);
00910 }
00911 }
00912
00913
00914 void LLPanelRegionDebugInfo::onClickReturnScriptedAll(void* data)
00915 {
00916 LLPanelRegionDebugInfo* panelp = (LLPanelRegionDebugInfo*) data;
00917 if (panelp->mTargetAvatar.isNull()) return;
00918
00919
00920 LLString::format_map_t args;
00921 args["[USER_NAME]"] = panelp->childGetValue("target_avatar_name").asString();
00922 gViewerWindow->alertXml("ReturnScriptedOnAllLand", args, callbackReturnScriptedAll, data);
00923 }
00924
00925
00926 void LLPanelRegionDebugInfo::callbackReturnScriptedAll( S32 option, void* userdata )
00927 {
00928 if (option != 0) return;
00929
00930 LLPanelRegionDebugInfo* self = (LLPanelRegionDebugInfo*) userdata;
00931 if (!self->mTargetAvatar.isNull())
00932 {
00933 U32 flags = 0;
00934 flags |= SWD_ALWAYS_RETURN_OBJECTS;
00935 flags |= SWD_SCRIPTED_ONLY;
00936
00937 send_sim_wide_deletes(self->mTargetAvatar, flags);
00938 }
00939 }
00940
00941
00942 void LLPanelRegionDebugInfo::onClickTopColliders(void* data)
00943 {
00944 LLPanelRegionDebugInfo* self = (LLPanelRegionDebugInfo*)data;
00945 strings_t strings;
00946 strings.push_back("1");
00947 LLUUID invoice(LLFloaterRegionInfo::getLastInvoice());
00948 LLFloaterTopObjects::show();
00949 LLFloaterTopObjects::clearList();
00950 self->sendEstateOwnerMessage(gMessageSystem, "colliders", invoice, strings);
00951 }
00952
00953
00954 void LLPanelRegionDebugInfo::onClickTopScripts(void* data)
00955 {
00956 LLPanelRegionDebugInfo* self = (LLPanelRegionDebugInfo*)data;
00957 strings_t strings;
00958 strings.push_back("6");
00959 LLUUID invoice(LLFloaterRegionInfo::getLastInvoice());
00960 LLFloaterTopObjects::show();
00961 LLFloaterTopObjects::clearList();
00962 self->sendEstateOwnerMessage(gMessageSystem, "scripts", invoice, strings);
00963 }
00964
00965
00966 void LLPanelRegionDebugInfo::onClickRestart(void* data)
00967 {
00968 gViewerWindow->alertXml("ConfirmRestart", callbackRestart, data);
00969 }
00970
00971
00972 void LLPanelRegionDebugInfo::callbackRestart(S32 option, void* data)
00973 {
00974 if (option != 0) return;
00975
00976 LLPanelRegionDebugInfo* self = (LLPanelRegionDebugInfo*)data;
00977 strings_t strings;
00978 strings.push_back("120");
00979 LLUUID invoice(LLFloaterRegionInfo::getLastInvoice());
00980 self->sendEstateOwnerMessage(gMessageSystem, "restart", invoice, strings);
00981 }
00982
00983
00984 void LLPanelRegionDebugInfo::onClickCancelRestart(void* data)
00985 {
00986 LLPanelRegionDebugInfo* self = (LLPanelRegionDebugInfo*)data;
00987 strings_t strings;
00988 strings.push_back("-1");
00989 LLUUID invoice(LLFloaterRegionInfo::getLastInvoice());
00990 self->sendEstateOwnerMessage(gMessageSystem, "restart", invoice, strings);
00991 }
00992
00993
00995
00996
00997 LLPanelRegionTextureInfo::LLPanelRegionTextureInfo() : LLPanelRegionInfo()
00998 {
00999
01000 }
01001
01002 bool LLPanelRegionTextureInfo::refreshFromRegion(LLViewerRegion* region)
01003 {
01004 BOOL allow_modify = gAgent.isGodlike() || (region && region->canManageEstate());
01005 setCtrlsEnabled(allow_modify);
01006 childDisable("apply_btn");
01007
01008 if (region)
01009 {
01010 childSetValue("region_text", LLSD(region->getName()));
01011 }
01012 else
01013 {
01014 childSetValue("region_text", LLSD(""));
01015 }
01016
01017 if (!region) return LLPanelRegionInfo::refreshFromRegion(region);
01018
01019 LLVLComposition* compp = region->getComposition();
01020 LLTextureCtrl* texture_ctrl;
01021 char buffer[MAX_STRING];
01022 for(S32 i = 0; i < TERRAIN_TEXTURE_COUNT; ++i)
01023 {
01024 snprintf(buffer, MAX_STRING, "texture_detail_%d", i);
01025 texture_ctrl = getChild<LLTextureCtrl>(buffer);
01026 if(texture_ctrl)
01027 {
01028 lldebugs << "Detail Texture " << i << ": "
01029 << compp->getDetailTextureID(i) << llendl;
01030 LLUUID tmp_id(compp->getDetailTextureID(i));
01031 texture_ctrl->setImageAssetID(tmp_id);
01032 }
01033 }
01034
01035 for(S32 i = 0; i < CORNER_COUNT; ++i)
01036 {
01037 snprintf(buffer, MAX_STRING, "height_start_spin_%d", i);
01038 childSetValue(buffer, LLSD(compp->getStartHeight(i)));
01039 snprintf(buffer, MAX_STRING, "height_range_spin_%d", i);
01040 childSetValue(buffer, LLSD(compp->getHeightRange(i)));
01041 }
01042
01043
01044 return LLPanelRegionInfo::refreshFromRegion(region);
01045 }
01046
01047
01048 BOOL LLPanelRegionTextureInfo::postBuild()
01049 {
01050 LLPanelRegionInfo::postBuild();
01051 char buffer[MAX_STRING];
01052 for(S32 i = 0; i < TERRAIN_TEXTURE_COUNT; ++i)
01053 {
01054 snprintf(buffer, MAX_STRING, "texture_detail_%d", i);
01055 initCtrl(buffer);
01056 }
01057
01058 for(S32 i = 0; i < CORNER_COUNT; ++i)
01059 {
01060 snprintf(buffer, MAX_STRING, "height_start_spin_%d", i);
01061 initCtrl(buffer);
01062 snprintf(buffer, MAX_STRING, "height_range_spin_%d", i);
01063 initCtrl(buffer);
01064 }
01065
01066
01067
01068
01069
01070 return LLPanelRegionInfo::postBuild();
01071 }
01072
01073 BOOL LLPanelRegionTextureInfo::sendUpdate()
01074 {
01075 llinfos << "LLPanelRegionTextureInfo::sendUpdate()" << llendl;
01076
01077
01078 if (!validateTextureSizes())
01079 {
01080 return FALSE;
01081 }
01082
01083 LLTextureCtrl* texture_ctrl;
01084 char buffer[MAX_STRING];
01085 char buffer2[MAX_STRING];
01086 char id_str[UUID_STR_LENGTH];
01087 LLMessageSystem* msg = gMessageSystem;
01088 strings_t strings;
01089
01090 LLUUID invoice(LLFloaterRegionInfo::getLastInvoice());
01091
01092 for(S32 i = 0; i < TERRAIN_TEXTURE_COUNT; ++i)
01093 {
01094 snprintf(buffer, MAX_STRING, "texture_detail_%d", i);
01095 texture_ctrl = getChild<LLTextureCtrl>(buffer);
01096 if(texture_ctrl)
01097 {
01098 LLUUID tmp_id(texture_ctrl->getImageAssetID());
01099 tmp_id.toString(id_str);
01100 snprintf(buffer, MAX_STRING, "%d %s", i, id_str);
01101 strings.push_back(strings_t::value_type(buffer));
01102 }
01103 }
01104 sendEstateOwnerMessage(msg, "texturedetail", invoice, strings);
01105 strings.clear();
01106 for(S32 i = 0; i < CORNER_COUNT; ++i)
01107 {
01108 snprintf(buffer, MAX_STRING, "height_start_spin_%d", i);
01109 snprintf(buffer2, MAX_STRING, "height_range_spin_%d", i);
01110 snprintf(buffer, MAX_STRING, "%d %f %f", i, (F32)childGetValue(buffer).asReal(), (F32)childGetValue(buffer2).asReal());
01111 strings.push_back(strings_t::value_type(buffer));
01112 }
01113 sendEstateOwnerMessage(msg, "textureheights", invoice, strings);
01114 strings.clear();
01115 sendEstateOwnerMessage(msg, "texturecommit", invoice, strings);
01116 return TRUE;
01117 }
01118
01119 BOOL LLPanelRegionTextureInfo::validateTextureSizes()
01120 {
01121 for(S32 i = 0; i < TERRAIN_TEXTURE_COUNT; ++i)
01122 {
01123 char buffer[MAX_STRING];
01124 snprintf(buffer, MAX_STRING, "texture_detail_%d", i);
01125 LLTextureCtrl* texture_ctrl = getChild<LLTextureCtrl>(buffer);
01126 if (!texture_ctrl) continue;
01127
01128 LLUUID image_asset_id = texture_ctrl->getImageAssetID();
01129 LLViewerImage* img = gImageList.getImage(image_asset_id);
01130 S32 components = img->getComponents();
01131
01132 S32 width = img->getWidth(0);
01133 S32 height = img->getHeight(0);
01134
01135
01136
01137 if (components != 3)
01138 {
01139 LLString::format_map_t args;
01140 args["[TEXTURE_NUM]"] = llformat("%d",i+1);
01141 args["[TEXTURE_BIT_DEPTH]"] = llformat("%d",components * 8);
01142 gViewerWindow->alertXml("InvalidTerrainBitDepth", args);
01143 return FALSE;
01144 }
01145
01146 if (width > 512 || height > 512)
01147 {
01148
01149 LLString::format_map_t args;
01150 args["[TEXTURE_NUM]"] = i+1;
01151 args["[TEXTURE_SIZE_X]"] = llformat("%d",width);
01152 args["[TEXTURE_SIZE_Y]"] = llformat("%d",height);
01153 gViewerWindow->alertXml("InvalidTerrainSize", args);
01154 return FALSE;
01155
01156 }
01157 }
01158
01159 return TRUE;
01160 }
01161
01162
01163
01164 void LLPanelRegionTextureInfo::onClickDump(void* data)
01165 {
01166 llinfos << "LLPanelRegionTextureInfo::onClickDump()" << llendl;
01167 }
01168
01169
01171
01173 BOOL LLPanelRegionTerrainInfo::postBuild()
01174 {
01175 LLPanelRegionInfo::postBuild();
01176
01177 initHelpBtn("water_height_help", "HelpRegionWaterHeight");
01178 initHelpBtn("terrain_raise_help", "HelpRegionTerrainRaise");
01179 initHelpBtn("terrain_lower_help", "HelpRegionTerrainLower");
01180 initHelpBtn("upload_raw_help", "HelpRegionUploadRaw");
01181 initHelpBtn("download_raw_help", "HelpRegionDownloadRaw");
01182 initHelpBtn("use_estate_sun_help", "HelpRegionUseEstateSun");
01183 initHelpBtn("fixed_sun_help", "HelpRegionFixedSun");
01184 initHelpBtn("bake_terrain_help", "HelpRegionBakeTerrain");
01185
01186 initCtrl("water_height_spin");
01187 initCtrl("terrain_raise_spin");
01188 initCtrl("terrain_lower_spin");
01189
01190 initCtrl("fixed_sun_check");
01191 childSetCommitCallback("fixed_sun_check", onChangeFixedSun, this);
01192 childSetCommitCallback("use_estate_sun_check", onChangeUseEstateTime, this);
01193 childSetCommitCallback("sun_hour_slider", onChangeSunHour, this);
01194
01195 childSetAction("download_raw_btn", onClickDownloadRaw, this);
01196 childSetAction("upload_raw_btn", onClickUploadRaw, this);
01197 childSetAction("bake_terrain_btn", onClickBakeTerrain, this);
01198
01199 return TRUE;
01200 }
01201
01202
01203 bool LLPanelRegionTerrainInfo::refreshFromRegion(LLViewerRegion* region)
01204 {
01205 llinfos << "LLPanelRegionTerrainInfo::refreshFromRegion" << llendl;
01206
01207 BOOL owner_or_god = gAgent.isGodlike()
01208 || (region && (region->getOwner() == gAgent.getID()));
01209 BOOL owner_or_god_or_manager = owner_or_god
01210 || (region && region->isEstateManager());
01211 setCtrlsEnabled(owner_or_god_or_manager);
01212 childDisable("apply_btn");
01213
01214 childSetEnabled("download_raw_btn", owner_or_god);
01215 childSetEnabled("upload_raw_btn", owner_or_god);
01216 childSetEnabled("bake_terrain_btn", owner_or_god);
01217
01218 return LLPanelRegionInfo::refreshFromRegion(region);
01219 }
01220
01221
01222 BOOL LLPanelRegionTerrainInfo::sendUpdate()
01223 {
01224 llinfos << "LLPanelRegionTerrainInfo::sendUpdate" << llendl;
01225 char buffer[MAX_STRING];
01226 strings_t strings;
01227 LLUUID invoice(LLFloaterRegionInfo::getLastInvoice());
01228
01229 snprintf(buffer, MAX_STRING, "%f", (F32)childGetValue("water_height_spin").asReal());
01230 strings.push_back(buffer);
01231 snprintf(buffer, MAX_STRING, "%f", (F32)childGetValue("terrain_raise_spin").asReal());
01232 strings.push_back(buffer);
01233 snprintf(buffer, MAX_STRING, "%f", (F32)childGetValue("terrain_lower_spin").asReal());
01234 strings.push_back(buffer);
01235 snprintf(buffer, MAX_STRING, "%s", (childGetValue("use_estate_sun_check").asBoolean() ? "Y" : "N"));
01236 strings.push_back(buffer);
01237 snprintf(buffer, MAX_STRING, "%s", (childGetValue("fixed_sun_check").asBoolean() ? "Y" : "N"));
01238 strings.push_back(buffer);
01239 snprintf(buffer, MAX_STRING, "%f", (F32)childGetValue("sun_hour_slider").asReal() );
01240 strings.push_back(buffer);
01241
01242
01243
01244 LLFloaterRegionInfo* floater = LLFloaterRegionInfo::getInstance();
01245 if (!floater) return true;
01246
01247 LLTabContainer* tab = floater->getChild<LLTabContainer>("region_panels");
01248 if (!tab) return true;
01249
01250 LLPanelEstateInfo* panel = (LLPanelEstateInfo*)tab->getChild<LLPanel>("Estate");
01251 if (!panel) return true;
01252
01253 BOOL estate_global_time = panel->getGlobalTime();
01254 BOOL estate_fixed_sun = panel->getFixedSun();
01255 F32 estate_sun_hour;
01256 if (estate_global_time)
01257 {
01258 estate_sun_hour = 0.f;
01259 }
01260 else
01261 {
01262 estate_sun_hour = panel->getSunHour();
01263 }
01264
01265 snprintf(buffer, MAX_STRING, "%s", (estate_global_time ? "Y" : "N") );
01266 strings.push_back(buffer);
01267 snprintf(buffer, MAX_STRING, "%s", (estate_fixed_sun ? "Y" : "N") );
01268 strings.push_back(buffer);
01269 snprintf(buffer, MAX_STRING, "%f", estate_sun_hour);
01270 strings.push_back(buffer);
01271
01272 sendEstateOwnerMessage(gMessageSystem, "setregionterrain", invoice, strings);
01273 return TRUE;
01274 }
01275
01276
01277 void LLPanelRegionTerrainInfo::onChangeUseEstateTime(LLUICtrl* ctrl, void* user_data)
01278 {
01279 LLPanelRegionTerrainInfo* panel = (LLPanelRegionTerrainInfo*) user_data;
01280 if (!panel) return;
01281 BOOL use_estate_sun = panel->childGetValue("use_estate_sun_check").asBoolean();
01282 panel->childSetEnabled("fixed_sun_check", !use_estate_sun);
01283 panel->childSetEnabled("sun_hour_slider", !use_estate_sun);
01284 if (use_estate_sun)
01285 {
01286 panel->childSetValue("fixed_sun_check", LLSD(FALSE));
01287 panel->childSetValue("sun_hour_slider", LLSD(0.f));
01288 }
01289 panel->childEnable("apply_btn");
01290 }
01291
01292
01293 void LLPanelRegionTerrainInfo::onChangeFixedSun(LLUICtrl* ctrl, void* user_data)
01294 {
01295 LLPanelRegionTerrainInfo* panel = (LLPanelRegionTerrainInfo*) user_data;
01296 if (!panel) return;
01297
01298
01299 panel->childEnable("apply_btn");
01300 }
01301
01302
01303 void LLPanelRegionTerrainInfo::onChangeSunHour(LLUICtrl* ctrl, void*)
01304 {
01305
01306 LLPanelRegionTerrainInfo* panel = (LLPanelRegionTerrainInfo*) ctrl->getParent();
01307 if (!panel) return;
01308 panel->childEnable("apply_btn");
01309 }
01310
01311
01312 void LLPanelRegionTerrainInfo::onClickDownloadRaw(void* data)
01313 {
01314 LLFilePicker& picker = LLFilePicker::instance();
01315 if (!picker.getSaveFile(LLFilePicker::FFSAVE_RAW, "terrain.raw"))
01316 {
01317 llwarns << "No file" << llendl;
01318 return;
01319 }
01320 LLString filepath = picker.getFirstFile();
01321
01322 LLPanelRegionTerrainInfo* self = (LLPanelRegionTerrainInfo*)data;
01323 strings_t strings;
01324 strings.push_back("download filename");
01325 strings.push_back(filepath);
01326 LLUUID invoice(LLFloaterRegionInfo::getLastInvoice());
01327 self->sendEstateOwnerMessage(gMessageSystem, "terrain", invoice, strings);
01328 }
01329
01330
01331 void LLPanelRegionTerrainInfo::onClickUploadRaw(void* data)
01332 {
01333 LLFilePicker& picker = LLFilePicker::instance();
01334 if (!picker.getOpenFile(LLFilePicker::FFLOAD_RAW))
01335 {
01336 llwarns << "No file" << llendl;
01337 return;
01338 }
01339 LLString filepath = picker.getFirstFile();
01340
01341 LLPanelRegionTerrainInfo* self = (LLPanelRegionTerrainInfo*)data;
01342 strings_t strings;
01343 strings.push_back("upload filename");
01344 strings.push_back(filepath);
01345 LLUUID invoice(LLFloaterRegionInfo::getLastInvoice());
01346 self->sendEstateOwnerMessage(gMessageSystem, "terrain", invoice, strings);
01347
01348 gViewerWindow->alertXml("RawUploadStarted");
01349 }
01350
01351
01352 void LLPanelRegionTerrainInfo::onClickBakeTerrain(void* data)
01353 {
01354 gViewerWindow->alertXml("ConfirmBakeTerrain",
01355 callbackBakeTerrain, data);
01356 }
01357
01358
01359 void LLPanelRegionTerrainInfo::callbackBakeTerrain(S32 option, void* data)
01360 {
01361 if (option != 0) return;
01362
01363 LLPanelRegionTerrainInfo* self = (LLPanelRegionTerrainInfo*)data;
01364 strings_t strings;
01365 strings.push_back("bake");
01366 LLUUID invoice(LLFloaterRegionInfo::getLastInvoice());
01367 self->sendEstateOwnerMessage(gMessageSystem, "terrain", invoice, strings);
01368 }
01369
01371
01372
01373
01374 LLPanelEstateInfo::LLPanelEstateInfo()
01375 : LLPanelRegionInfo(),
01376 mEstateID(0)
01377 {
01378 }
01379
01380
01381 void LLPanelEstateInfo::initDispatch(LLDispatcher& dispatch)
01382 {
01383 std::string name;
01384
01385
01386
01387
01388
01389 name.assign("estateupdateinfo");
01390 static LLDispatchEstateUpdateInfo estate_update_info;
01391 dispatch.addHandler(name, &estate_update_info);
01392
01393 name.assign("setaccess");
01394 static LLDispatchSetEstateAccess set_access;
01395 dispatch.addHandler(name, &set_access);
01396
01397 estate_dispatch_initialized = true;
01398 }
01399
01400
01401
01402 void LLPanelEstateInfo::onChangeUseGlobalTime(LLUICtrl* ctrl, void* user_data)
01403 {
01404 LLPanelEstateInfo* panel = (LLPanelEstateInfo*) user_data;
01405 if (panel)
01406 {
01407 bool enabled = !panel->childGetValue("use_global_time_check").asBoolean();
01408 panel->childSetEnabled("sun_hour_slider", enabled);
01409 panel->childSetEnabled("fixed_sun_check", enabled);
01410 panel->childSetValue("fixed_sun_check", LLSD(FALSE));
01411 panel->enableButton("apply_btn");
01412 }
01413 }
01414
01415
01416 void LLPanelEstateInfo::onChangeFixedSun(LLUICtrl* ctrl, void* user_data)
01417 {
01418 LLPanelEstateInfo* panel = (LLPanelEstateInfo*) user_data;
01419 if (panel)
01420 {
01421 bool enabled = !panel->childGetValue("fixed_sun_check").asBoolean();
01422 panel->childSetEnabled("use_global_time_check", enabled);
01423 panel->childSetValue("use_global_time_check", LLSD(FALSE));
01424 panel->enableButton("apply_btn");
01425 }
01426 }
01427
01428
01429
01430
01431
01432
01433
01434 void LLPanelEstateInfo::onClickEditSky(void* user_data)
01435 {
01436 LLFloaterWindLight::show();
01437 }
01438
01439 void LLPanelEstateInfo::onClickEditDayCycle(void* user_data)
01440 {
01441 LLFloaterDayCycle::show();
01442 }
01443
01444
01445 void LLPanelEstateInfo::onClickAddAllowedAgent(void* user_data)
01446 {
01447 LLPanelEstateInfo* self = (LLPanelEstateInfo*)user_data;
01448 LLCtrlListInterface *list = self->childGetListInterface("allowed_avatar_name_list");
01449 if (!list) return;
01450 if (list->getItemCount() >= ESTATE_MAX_ACCESS_IDS)
01451 {
01452
01453
01454 LLString::format_map_t args;
01455 args["[MAX_AGENTS]"] = llformat("%d",ESTATE_MAX_ACCESS_IDS);
01456 gViewerWindow->alertXml("MaxAllowedAgentOnRegion", args);
01457 return;
01458 }
01459 accessAddCore(ESTATE_ACCESS_ALLOWED_AGENT_ADD, "EstateAllowedAgentAdd");
01460 }
01461
01462
01463 void LLPanelEstateInfo::onClickRemoveAllowedAgent(void* user_data)
01464 {
01465 accessRemoveCore(ESTATE_ACCESS_ALLOWED_AGENT_REMOVE, "EstateAllowedAgentRemove", "allowed_avatar_name_list");
01466 }
01467
01468
01469 void LLPanelEstateInfo::onClickAddAllowedGroup(void* user_data)
01470 {
01471 LLPanelEstateInfo* self = (LLPanelEstateInfo*)user_data;
01472 LLCtrlListInterface *list = self->childGetListInterface("allowed_group_name_list");
01473 if (!list) return;
01474 if (list->getItemCount() >= ESTATE_MAX_ACCESS_IDS)
01475 {
01476 LLString::format_map_t args;
01477 args["[MAX_GROUPS]"] = llformat("%d",ESTATE_MAX_ACCESS_IDS);
01478 gViewerWindow->alertXml("MaxAllowedGroupsOnRegion", args);
01479 return;
01480 }
01481 if (isLindenEstate())
01482 {
01483 gViewerWindow->alertXml("ChangeLindenAccess", addAllowedGroup, user_data);
01484 }
01485 else
01486 {
01487 addAllowedGroup(0, user_data);
01488 }
01489 }
01490
01491
01492 void LLPanelEstateInfo::addAllowedGroup(S32 option, void* user_data)
01493 {
01494 if (option != 0) return;
01495
01496 LLPanelEstateInfo* panelp = (LLPanelEstateInfo*)user_data;
01497
01498 LLFloater* parent_floater = gFloaterView->getParentFloater(panelp);
01499
01500 LLFloaterGroupPicker* widget;
01501 widget = LLFloaterGroupPicker::showInstance(LLSD(gAgent.getID()));
01502 if (widget)
01503 {
01504 widget->setSelectCallback(addAllowedGroup2, user_data);
01505 if (parent_floater)
01506 {
01507 LLRect new_rect = gFloaterView->findNeighboringPosition(parent_floater, widget);
01508 widget->setOrigin(new_rect.mLeft, new_rect.mBottom);
01509 parent_floater->addDependentFloater(widget);
01510 }
01511 }
01512 }
01513
01514
01515 void LLPanelEstateInfo::onClickRemoveAllowedGroup(void* user_data)
01516 {
01517 accessRemoveCore(ESTATE_ACCESS_ALLOWED_GROUP_REMOVE, "EstateAllowedGroupRemove", "allowed_group_name_list");
01518 }
01519
01520
01521 void LLPanelEstateInfo::onClickAddBannedAgent(void* user_data)
01522 {
01523 LLPanelEstateInfo* self = (LLPanelEstateInfo*)user_data;
01524 LLCtrlListInterface *list = self->childGetListInterface("banned_avatar_name_list");
01525 if (!list) return;
01526 if (list->getItemCount() >= ESTATE_MAX_ACCESS_IDS)
01527 {
01528 LLString::format_map_t args;
01529 args["[MAX_BANNED]"] = llformat("%d",ESTATE_MAX_ACCESS_IDS);
01530 gViewerWindow->alertXml("MaxBannedAgentsOnRegion", args);
01531 return;
01532 }
01533 accessAddCore(ESTATE_ACCESS_BANNED_AGENT_ADD, "EstateBannedAgentAdd");
01534 }
01535
01536
01537 void LLPanelEstateInfo::onClickRemoveBannedAgent(void* user_data)
01538 {
01539 accessRemoveCore(ESTATE_ACCESS_BANNED_AGENT_REMOVE, "EstateBannedAgentRemove", "banned_avatar_name_list");
01540 }
01541
01542
01543 void LLPanelEstateInfo::onClickAddEstateManager(void* user_data)
01544 {
01545 LLPanelEstateInfo* self = (LLPanelEstateInfo*)user_data;
01546 LLCtrlListInterface *list = self->childGetListInterface("estate_manager_name_list");
01547 if (!list) return;
01548 if (list->getItemCount() >= ESTATE_MAX_MANAGERS)
01549 {
01550 LLString::format_map_t args;
01551 args["[MAX_MANAGER]"] = llformat("%d",ESTATE_MAX_MANAGERS);
01552 gViewerWindow->alertXml("MaxManagersOnRegion", args);
01553 }
01554 else
01555 {
01556 accessAddCore(ESTATE_ACCESS_MANAGER_ADD, "EstateManagerAdd");
01557 }
01558 }
01559
01560
01561 void LLPanelEstateInfo::onClickRemoveEstateManager(void* user_data)
01562 {
01563 accessRemoveCore(ESTATE_ACCESS_MANAGER_REMOVE, "EstateManagerRemove", "estate_manager_name_list");
01564 }
01565
01566
01567
01568
01569 struct LLKickFromEstateInfo
01570 {
01571 LLPanelEstateInfo *mEstatePanelp;
01572 LLString mDialogName;
01573 LLUUID mAgentID;
01574 };
01575
01576 void LLPanelEstateInfo::onClickKickUser(void *user_data)
01577 {
01578 LLPanelEstateInfo* panelp = (LLPanelEstateInfo*)user_data;
01579
01580
01581
01582 LLFloater* parent_floater = gFloaterView->getParentFloater(panelp);
01583 LLFloater* child_floater = LLFloaterAvatarPicker::show(LLPanelEstateInfo::onKickUserCommit, user_data, FALSE, TRUE);
01584 parent_floater->addDependentFloater(child_floater);
01585 }
01586
01587 void LLPanelEstateInfo::onKickUserCommit(const std::vector<std::string>& names, const std::vector<LLUUID>& ids, void* userdata)
01588 {
01589 if (names.empty() || ids.empty()) return;
01590
01591
01592 if( (ids[0].isNull()) ||
01593 (names[0].length() == 0) )
01594 {
01595 return;
01596 }
01597
01598 LLPanelEstateInfo* self = (LLPanelEstateInfo*)userdata;
01599 if(!self) return;
01600
01601
01602 LLKickFromEstateInfo *kick_info = new LLKickFromEstateInfo();
01603 kick_info->mEstatePanelp = self;
01604 kick_info->mDialogName = "EstateKickUser";
01605 kick_info->mAgentID = ids[0];
01606
01607
01608 LLString::format_map_t args;
01609 args["[EVIL_USER]"] = names[0];
01610 gViewerWindow->alertXml(kick_info->mDialogName, args, LLPanelEstateInfo::kickUserConfirm, (void*)kick_info);
01611
01612 }
01613
01614 void LLPanelEstateInfo::kickUserConfirm(S32 option, void* userdata)
01615 {
01616
01617 LLKickFromEstateInfo *kick_info = (LLKickFromEstateInfo*) userdata;
01618 if (!kick_info) return;
01619
01620 LLUUID invoice(LLFloaterRegionInfo::getLastInvoice());
01621 strings_t strings;
01622 char buffer[MAX_STRING];
01623
01624 switch(option)
01625 {
01626 case 0:
01627
01628 kick_info->mAgentID.toString(buffer);
01629 strings.push_back(strings_t::value_type(buffer));
01630
01631 kick_info->mEstatePanelp->sendEstateOwnerMessage(gMessageSystem, "kickestate", invoice, strings);
01632 break;
01633 default:
01634 break;
01635 }
01636
01637 delete kick_info;
01638 kick_info = NULL;
01639 }
01640
01641
01642
01643
01644 std::string all_estates_text()
01645 {
01646 LLPanelEstateInfo* panel = LLFloaterRegionInfo::getPanelEstate();
01647 if (!panel) return "(error)";
01648
01649 std::string owner = panel->getOwnerName();
01650
01651 LLViewerRegion* region = gAgent.getRegion();
01652 if (gAgent.isGodlike())
01653 {
01654 return llformat("all estates\nowned by %s", owner.c_str());
01655 }
01656 else if (region && region->getOwner() == gAgent.getID())
01657 {
01658 return "all estates you own";
01659 }
01660 else if (region && region->isEstateManager())
01661 {
01662 return llformat("all estates that\nyou manage for %s", owner.c_str());
01663 }
01664 else
01665 {
01666 return "(error)";
01667 }
01668 }
01669
01670
01671 bool LLPanelEstateInfo::isLindenEstate()
01672 {
01673 LLPanelEstateInfo* panel = LLFloaterRegionInfo::getPanelEstate();
01674 if (!panel) return false;
01675
01676 U32 estate_id = panel->getEstateID();
01677 return (estate_id <= ESTATE_LAST_LINDEN);
01678 }
01679
01680 typedef std::vector<LLUUID> AgentOrGroupIDsVector;
01681 struct LLEstateAccessChangeInfo
01682 {
01683 U32 mOperationFlag;
01684 LLString mDialogName;
01685 AgentOrGroupIDsVector mAgentOrGroupIDs;
01686 };
01687
01688
01689
01690 void LLPanelEstateInfo::addAllowedGroup2(LLUUID id, void* user_data)
01691 {
01692 LLEstateAccessChangeInfo* change_info = new LLEstateAccessChangeInfo;
01693 change_info->mOperationFlag = ESTATE_ACCESS_ALLOWED_GROUP_ADD;
01694 change_info->mDialogName = "EstateAllowedGroupAdd";
01695 change_info->mAgentOrGroupIDs.push_back(id);
01696
01697 if (isLindenEstate())
01698 {
01699 accessCoreConfirm(0, (void*)change_info);
01700 }
01701 else
01702 {
01703 LLString::format_map_t args;
01704 args["[ALL_ESTATES]"] = all_estates_text();
01705 gViewerWindow->alertXml(change_info->mDialogName, args, accessCoreConfirm, (void*)change_info);
01706 }
01707 }
01708
01709
01710 void LLPanelEstateInfo::accessAddCore(U32 operation_flag, const char* dialog_name)
01711 {
01712 LLEstateAccessChangeInfo* change_info = new LLEstateAccessChangeInfo;
01713 change_info->mOperationFlag = operation_flag;
01714 change_info->mDialogName = dialog_name;
01715
01716
01717 if (isLindenEstate())
01718 {
01719 gViewerWindow->alertXml("ChangeLindenAccess", accessAddCore2, change_info);
01720 }
01721 else
01722 {
01723
01724 accessAddCore2(0, change_info);
01725 }
01726 }
01727
01728
01729 void LLPanelEstateInfo::accessAddCore2(S32 option, void* data)
01730 {
01731 LLEstateAccessChangeInfo* change_info = (LLEstateAccessChangeInfo*)data;
01732 if (option != 0)
01733 {
01734
01735 delete change_info;
01736 change_info = NULL;
01737 return;
01738 }
01739
01740
01741 LLFloaterAvatarPicker::show(accessAddCore3, (void*)change_info, TRUE, TRUE);
01742 }
01743
01744
01745 void LLPanelEstateInfo::accessAddCore3(const std::vector<std::string>& names, const std::vector<LLUUID>& ids, void* data)
01746 {
01747 LLEstateAccessChangeInfo* change_info = (LLEstateAccessChangeInfo*)data;
01748 if (!change_info) return;
01749 if (ids.empty())
01750 {
01751
01752 delete change_info;
01753 change_info = NULL;
01754 return;
01755 }
01756
01757 change_info->mAgentOrGroupIDs = ids;
01758
01759 LLPanelEstateInfo* panel = LLFloaterRegionInfo::getPanelEstate();
01760 if (!panel) return;
01761 LLViewerRegion* region = gAgent.getRegion();
01762 if (!region) return;
01763
01764 if (change_info->mOperationFlag & ESTATE_ACCESS_ALLOWED_AGENT_ADD)
01765 {
01766 LLCtrlListInterface *list = panel->childGetListInterface("allowed_avatar_name_list");
01767 int currentCount = (list ? list->getItemCount() : 0);
01768 if (ids.size() + currentCount > ESTATE_MAX_ACCESS_IDS)
01769 {
01770 LLString::format_map_t args;
01771 args["[NUM_ADDED]"] = llformat("%d",ids.size());
01772 args["[MAX_AGENTS]"] = llformat("%d",ESTATE_MAX_ACCESS_IDS);
01773 args["[LIST_TYPE]"] = "Allowed Residents";
01774 args["[NUM_EXCESS]"] = llformat("%d",(ids.size()+currentCount)-ESTATE_MAX_ACCESS_IDS);
01775 gViewerWindow->alertXml("MaxAgentOnRegionBatch", args);
01776 delete change_info;
01777 return;
01778 }
01779 }
01780 if (change_info->mOperationFlag & ESTATE_ACCESS_BANNED_AGENT_ADD)
01781 {
01782 LLCtrlListInterface *list = panel->childGetListInterface("banned_avatar_name_list");
01783 int currentCount = (list ? list->getItemCount() : 0);
01784 if (ids.size() + currentCount > ESTATE_MAX_ACCESS_IDS)
01785 {
01786 LLString::format_map_t args;
01787 args["[NUM_ADDED]"] = llformat("%d",ids.size());
01788 args["[MAX_AGENTS]"] = llformat("%d",ESTATE_MAX_ACCESS_IDS);
01789 args["[LIST_TYPE]"] = "Banned Residents";
01790 args["[NUM_EXCESS]"] = llformat("%d",(ids.size()+currentCount)-ESTATE_MAX_ACCESS_IDS);
01791 gViewerWindow->alertXml("MaxAgentOnRegionBatch", args);
01792 delete change_info;
01793 return;
01794 }
01795 }
01796
01797 if (isLindenEstate())
01798 {
01799
01800 accessCoreConfirm(0, (void*)change_info);
01801 }
01802 else
01803 {
01804
01805 LLString::format_map_t args;
01806 args["[ALL_ESTATES]"] = all_estates_text();
01807 gViewerWindow->alertXml(change_info->mDialogName, args, accessCoreConfirm, (void*)change_info);
01808 }
01809 }
01810
01811
01812 void LLPanelEstateInfo::accessRemoveCore(U32 operation_flag, const char* dialog_name, const char* list_ctrl_name)
01813 {
01814 LLPanelEstateInfo* panel = LLFloaterRegionInfo::getPanelEstate();
01815 if (!panel) return;
01816 LLNameListCtrl* name_list = panel->getChild<LLNameListCtrl>(list_ctrl_name);
01817 if (!name_list) return;
01818
01819 std::vector<LLScrollListItem*> list_vector = name_list->getAllSelected();
01820 if (list_vector.size() == 0)
01821 return;
01822
01823 LLEstateAccessChangeInfo* change_info = new LLEstateAccessChangeInfo;
01824 change_info->mOperationFlag = operation_flag;
01825 change_info->mDialogName = dialog_name;
01826
01827 for (std::vector<LLScrollListItem*>::const_iterator iter = list_vector.begin();
01828 iter != list_vector.end();
01829 iter++)
01830 {
01831 LLScrollListItem *item = (*iter);
01832 change_info->mAgentOrGroupIDs.push_back(item->getUUID());
01833 }
01834
01835 if (isLindenEstate())
01836 {
01837
01838 gViewerWindow->alertXml("ChangeLindenAccess",
01839 accessRemoveCore2,
01840 (void*)change_info);
01841 }
01842 else
01843 {
01844
01845 accessRemoveCore2(0, (void*)change_info);
01846 }
01847 }
01848
01849
01850 void LLPanelEstateInfo::accessRemoveCore2(S32 option, void* data)
01851 {
01852 LLEstateAccessChangeInfo* change_info = (LLEstateAccessChangeInfo*)data;
01853 if (option != 0)
01854 {
01855
01856 delete change_info;
01857 change_info = NULL;
01858 return;
01859 }
01860
01861
01862
01863 if (isLindenEstate())
01864 {
01865 accessCoreConfirm(0, (void*)change_info);
01866 }
01867 else
01868 {
01869 LLString::format_map_t args;
01870 args["[ALL_ESTATES]"] = all_estates_text();
01871 gViewerWindow->alertXml(change_info->mDialogName,
01872 args,
01873 accessCoreConfirm,
01874 (void*)change_info);
01875 }
01876 }
01877
01878
01879
01880
01881 void LLPanelEstateInfo::accessCoreConfirm(S32 option, void* data)
01882 {
01883 LLEstateAccessChangeInfo* change_info = (LLEstateAccessChangeInfo*)data;
01884 const U32 originalFlags = change_info->mOperationFlag;
01885 AgentOrGroupIDsVector& ids = change_info->mAgentOrGroupIDs;
01886
01887 LLViewerRegion* region = gAgent.getRegion();
01888
01889 for (AgentOrGroupIDsVector::const_iterator iter = ids.begin();
01890 iter != ids.end();
01891 iter++)
01892 {
01893 U32 flags = originalFlags;
01894 if (iter + 1 != ids.end())
01895 flags |= ESTATE_ACCESS_NO_REPLY;
01896
01897 const LLUUID id = (*iter);
01898 if ((change_info->mOperationFlag & ESTATE_ACCESS_BANNED_AGENT_ADD)
01899 && region && (region->getOwner() == id))
01900 {
01901 gViewerWindow->alertXml("OwnerCanNotBeDenied");
01902 break;
01903 }
01904 switch(option)
01905 {
01906 case 0:
01907
01908 sendEstateAccessDelta(flags, id);
01909 break;
01910 case 1:
01911 {
01912
01913
01914 if (!region) break;
01915 if (region->getOwner() == gAgent.getID()
01916 || gAgent.isGodlike())
01917 {
01918 flags |= ESTATE_ACCESS_APPLY_TO_ALL_ESTATES;
01919 sendEstateAccessDelta(flags, id);
01920 }
01921 else if (region->isEstateManager())
01922 {
01923 flags |= ESTATE_ACCESS_APPLY_TO_MANAGED_ESTATES;
01924 sendEstateAccessDelta(flags, id);
01925 }
01926 break;
01927 }
01928 case 2:
01929 default:
01930 break;
01931 }
01932 }
01933 delete change_info;
01934 change_info = NULL;
01935 }
01936
01937
01938
01939
01940
01941
01942
01943 void LLPanelEstateInfo::sendEstateAccessDelta(U32 flags, const LLUUID& agent_or_group_id)
01944 {
01945 LLMessageSystem* msg = gMessageSystem;
01946 msg->newMessage("EstateOwnerMessage");
01947 msg->nextBlockFast(_PREHASH_AgentData);
01948 msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
01949 msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
01950 msg->addUUIDFast(_PREHASH_TransactionID, LLUUID::null);
01951
01952 msg->nextBlock("MethodData");
01953 msg->addString("Method", "estateaccessdelta");
01954 msg->addUUID("Invoice", LLFloaterRegionInfo::getLastInvoice());
01955
01956 char buf[MAX_STRING];
01957 gAgent.getID().toString(buf);
01958 msg->nextBlock("ParamList");
01959 msg->addString("Parameter", buf);
01960
01961 snprintf(buf, MAX_STRING, "%u", flags);
01962 msg->nextBlock("ParamList");
01963 msg->addString("Parameter", buf);
01964
01965 agent_or_group_id.toString(buf);
01966 msg->nextBlock("ParamList");
01967 msg->addString("Parameter", buf);
01968
01969
01970 LLPanelEstateInfo* panel = LLFloaterRegionInfo::getPanelEstate();
01971
01972 if (flags & (ESTATE_ACCESS_ALLOWED_AGENT_ADD | ESTATE_ACCESS_ALLOWED_AGENT_REMOVE |
01973 ESTATE_ACCESS_BANNED_AGENT_ADD | ESTATE_ACCESS_BANNED_AGENT_REMOVE))
01974 {
01975
01976 panel->clearAccessLists();
01977 }
01978
01979 gAgent.sendReliableMessage();
01980 }
01981
01982
01983 bool LLPanelEstateInfo::refreshFromRegion(LLViewerRegion* region)
01984 {
01985 BOOL god = gAgent.isGodlike();
01986 BOOL owner = (region && (region->getOwner() == gAgent.getID()));
01987 BOOL manager = (region && region->isEstateManager());
01988 setCtrlsEnabled(god || owner || manager);
01989
01990 childDisable("apply_btn");
01991 childSetEnabled("add_allowed_avatar_btn", god || owner || manager);
01992 childSetEnabled("remove_allowed_avatar_btn", god || owner || manager);
01993 childSetEnabled("add_allowed_group_btn", god || owner || manager);
01994 childSetEnabled("remove_allowed_group_btn", god || owner || manager);
01995 childSetEnabled("add_banned_avatar_btn", god || owner || manager);
01996 childSetEnabled("remove_banned_avatar_btn", god || owner || manager);
01997 childSetEnabled("message_estate_btn", god || owner || manager);
01998 childSetEnabled("kick_user_from_estate_btn", god || owner || manager);
01999 childSetEnabled("abuse_email_address", god || owner || manager);
02000
02001
02002 childSetEnabled("add_estate_manager_btn", god || owner);
02003 childSetEnabled("remove_estate_manager_btn", god || owner);
02004 childSetEnabled("estate_manager_name_list", god || owner);
02005
02006
02007 bool rv = LLPanelRegionInfo::refreshFromRegion(region);
02008
02009
02010
02011
02012 strings_t strings;
02013
02014
02015 LLFloaterRegionInfo::nextInvoice();
02016 LLUUID invoice(LLFloaterRegionInfo::getLastInvoice());
02017
02018
02019
02020 LLPanelEstateInfo* panel = LLFloaterRegionInfo::getPanelEstate();
02021 panel->clearAccessLists();
02022
02023
02024 sendEstateOwnerMessage(gMessageSystem, "getinfo", invoice, strings);
02025
02026 refresh();
02027
02028 return rv;
02029 }
02030
02031 void LLPanelEstateInfo::updateChild(LLUICtrl* child_ctrl)
02032 {
02033 if (checkRemovalButton(child_ctrl->getName()))
02034 {
02035
02036 }
02037 else if (checkSunHourSlider(child_ctrl))
02038 {
02039
02040 }
02041 }
02042
02043 bool LLPanelEstateInfo::estateUpdate(LLMessageSystem* msg)
02044 {
02045 llinfos << "LLPanelEstateInfo::estateUpdate()" << llendl;
02046 return false;
02047 }
02048
02049
02050 BOOL LLPanelEstateInfo::postBuild()
02051 {
02052
02053 initCtrl("externally_visible_check");
02054 initCtrl("use_global_time_check");
02055 initCtrl("fixed_sun_check");
02056 initCtrl("allow_direct_teleport");
02057 initCtrl("limit_payment");
02058 initCtrl("limit_age_verified");
02059 initCtrl("voice_chat_check");
02060 initTextCtrl("abuse_email_address");
02061
02062 initHelpBtn("estate_manager_help", "HelpEstateEstateManager");
02063 initHelpBtn("use_global_time_help", "HelpEstateUseGlobalTime");
02064 initHelpBtn("fixed_sun_help", "HelpEstateFixedSun");
02065 initHelpBtn("WLEditSkyHelp", "HelpEditSky");
02066 initHelpBtn("WLEditDayCycleHelp", "HelpEditDayCycle");
02067
02068 initHelpBtn("externally_visible_help", "HelpEstateExternallyVisible");
02069 initHelpBtn("allow_direct_teleport_help", "HelpEstateAllowDirectTeleport");
02070 initHelpBtn("allow_resident_help", "HelpEstateAllowResident");
02071 initHelpBtn("allow_group_help", "HelpEstateAllowGroup");
02072 initHelpBtn("ban_resident_help", "HelpEstateBanResident");
02073 initHelpBtn("abuse_email_address_help", "HelpEstateAbuseEmailAddress");
02074 initHelpBtn("voice_chat_help", "HelpEstateVoiceChat");
02075
02076
02077 childSetCommitCallback("use_global_time_check", onChangeUseGlobalTime, this);
02078 childSetCommitCallback("fixed_sun_check", onChangeFixedSun, this);
02079 childSetCommitCallback("sun_hour_slider", onChangeChildCtrl, this);
02080
02081 childSetCommitCallback("allowed_avatar_name_list", onChangeChildCtrl, this);
02082 LLNameListCtrl *avatar_name_list = getChild<LLNameListCtrl>("allowed_avatar_name_list");
02083 if (avatar_name_list)
02084 {
02085 avatar_name_list->setCommitOnSelectionChange(TRUE);
02086 avatar_name_list->setMaxItemCount(ESTATE_MAX_ACCESS_IDS);
02087 }
02088
02089 childSetAction("add_allowed_avatar_btn", onClickAddAllowedAgent, this);
02090 childSetAction("remove_allowed_avatar_btn", onClickRemoveAllowedAgent, this);
02091
02092 childSetCommitCallback("allowed_group_name_list", onChangeChildCtrl, this);
02093 LLNameListCtrl* group_name_list = getChild<LLNameListCtrl>("allowed_group_name_list");
02094 if (group_name_list)
02095 {
02096 group_name_list->setCommitOnSelectionChange(TRUE);
02097 group_name_list->setMaxItemCount(ESTATE_MAX_ACCESS_IDS);
02098 }
02099
02100 childSetAction("add_allowed_group_btn", onClickAddAllowedGroup, this);
02101 childSetAction("remove_allowed_group_btn", onClickRemoveAllowedGroup, this);
02102
02103 childSetCommitCallback("banned_avatar_name_list", onChangeChildCtrl, this);
02104 LLNameListCtrl* banned_name_list = getChild<LLNameListCtrl>("banned_avatar_name_list");
02105 if (banned_name_list)
02106 {
02107 banned_name_list->setCommitOnSelectionChange(TRUE);
02108 banned_name_list->setMaxItemCount(ESTATE_MAX_ACCESS_IDS);
02109 }
02110
02111 childSetAction("add_banned_avatar_btn", onClickAddBannedAgent, this);
02112 childSetAction("remove_banned_avatar_btn", onClickRemoveBannedAgent, this);
02113
02114 childSetCommitCallback("estate_manager_name_list", onChangeChildCtrl, this);
02115 LLNameListCtrl* manager_name_list = getChild<LLNameListCtrl>("estate_manager_name_list");
02116 if (manager_name_list)
02117 {
02118 manager_name_list->setCommitOnSelectionChange(TRUE);
02119 manager_name_list->setMaxItemCount(ESTATE_MAX_MANAGERS * 4);
02120 }
02121
02122 childSetAction("add_estate_manager_btn", onClickAddEstateManager, this);
02123 childSetAction("remove_estate_manager_btn", onClickRemoveEstateManager, this);
02124 childSetAction("message_estate_btn", onClickMessageEstate, this);
02125 childSetAction("kick_user_from_estate_btn", onClickKickUser, this);
02126
02127 childSetAction("WLEditSky", onClickEditSky, this);
02128 childSetAction("WLEditDayCycle", onClickEditDayCycle, this);
02129
02130 return LLPanelRegionInfo::postBuild();
02131 }
02132
02133 void LLPanelEstateInfo::refresh()
02134 {
02135 bool public_access = childGetValue("externally_visible_check").asBoolean();
02136 childSetEnabled("Only Allow", public_access);
02137 childSetEnabled("limit_payment", public_access);
02138 childSetEnabled("limit_age_verified", public_access);
02139
02140 if (public_access == false)
02141 {
02142 childSetValue("limit_payment", false);
02143 childSetValue("limit_age_verified", false);
02144 }
02145 }
02146
02147 BOOL LLPanelEstateInfo::sendUpdate()
02148 {
02149 llinfos << "LLPanelEsateInfo::sendUpdate()" << llendl;
02150
02151 if (getEstateID() <= ESTATE_LAST_LINDEN)
02152 {
02153
02154 gViewerWindow->alertXml("ChangeLindenEstate",
02155 callbackChangeLindenEstate,
02156 this);
02157 }
02158 else
02159 {
02160
02161 callbackChangeLindenEstate(0, this);
02162 }
02163 return TRUE;
02164 }
02165
02166
02167 void LLPanelEstateInfo::callbackChangeLindenEstate(S32 option, void* data)
02168 {
02169 LLPanelEstateInfo* self = (LLPanelEstateInfo*)data;
02170 switch(option)
02171 {
02172 case 0:
02173
02174 if (!self->commitEstateInfoCaps())
02175 {
02176
02177 LLFloaterRegionInfo::nextInvoice();
02178 self->commitEstateInfoDataserver();
02179 }
02180
02181
02182
02183
02184
02185
02186
02187 break;
02188 case 1:
02189 default:
02190
02191 break;
02192 }
02193 }
02194
02195
02196
02197
02198
02199
02200
02201
02202
02203
02204
02205
02206
02207
02208
02209
02210
02211
02212
02213
02214
02215
02216
02217
02218
02219
02220
02221
02222
02223
02224 class LLEstateChangeInfoResponder : public LLHTTPClient::Responder
02225 {
02226 public:
02227 LLEstateChangeInfoResponder(void* userdata) : mpPanel((LLPanelEstateInfo*)userdata) {};
02228
02229
02230 virtual void result(const LLSD& content)
02231 {
02232
02233 mpPanel->refresh();
02234 }
02235
02236
02237 virtual void error(U32 status, const std::string& reason)
02238 {
02239 llinfos << "LLEstateChangeInfoResponder::error "
02240 << status << ": " << reason << llendl;
02241 }
02242 private:
02243 LLPanelEstateInfo* mpPanel;
02244 };
02245
02246
02247 bool LLPanelEstateInfo::commitEstateInfoCaps()
02248 {
02249 std::string url = gAgent.getRegion()->getCapability("EstateChangeInfo");
02250
02251 if (url.empty())
02252 {
02253
02254 return false;
02255 }
02256
02257 LLSD body;
02258 body["estate_name"] = getEstateName();
02259
02260 body["is_externally_visible"] = childGetValue("externally_visible_check").asBoolean();
02261 body["allow_direct_teleport"] = childGetValue("allow_direct_teleport").asBoolean();
02262 body["is_sun_fixed" ] = childGetValue("fixed_sun_check").asBoolean();
02263 body["deny_anonymous" ] = childGetValue("limit_payment").asBoolean();
02264 body["deny_age_unverified" ] = childGetValue("limit_age_verified").asBoolean();
02265 body["allow_voice_chat" ] = childGetValue("voice_chat_check").asBoolean();
02266 body["invoice" ] = LLFloaterRegionInfo::getLastInvoice();
02267
02268
02269
02270
02271 F32 sun_hour = getSunHour();
02272 if (childGetValue("use_global_time_check").asBoolean())
02273 {
02274 sun_hour = 0.f;
02275 }
02276 body["sun_hour"] = sun_hour;
02277
02278 body["owner_abuse_email"] = childGetValue("abuse_email_address").asString();
02279
02280
02281 LLHTTPClient::post(url, body, new LLEstateChangeInfoResponder((void*)this));
02282 return true;
02283 }
02284
02285
02286
02287
02288
02289
02290
02291
02292 void LLPanelEstateInfo::commitEstateInfoDataserver()
02293 {
02294 LLMessageSystem* msg = gMessageSystem;
02295 msg->newMessage("EstateOwnerMessage");
02296 msg->nextBlockFast(_PREHASH_AgentData);
02297 msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
02298 msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
02299 msg->addUUIDFast(_PREHASH_TransactionID, LLUUID::null);
02300
02301 msg->nextBlock("MethodData");
02302 msg->addString("Method", "estatechangeinfo");
02303 msg->addUUID("Invoice", LLFloaterRegionInfo::getLastInvoice());
02304
02305 msg->nextBlock("ParamList");
02306 msg->addString("Parameter", getEstateName());
02307
02308 char buf[MAX_STRING];
02309 snprintf(buf, MAX_STRING, "%u", computeEstateFlags());
02310 msg->nextBlock("ParamList");
02311 msg->addString("Parameter", buf);
02312
02313 F32 sun_hour = getSunHour();
02314 if (childGetValue("use_global_time_check").asBoolean())
02315 {
02316 sun_hour = 0.f;
02317 }
02318
02319 snprintf(buf, MAX_STRING, "%d", (S32)(sun_hour*1024.0f));
02320 msg->nextBlock("ParamList");
02321 msg->addString("Parameter", buf);
02322
02323 gAgent.sendMessage();
02324 }
02325
02326 void LLPanelEstateInfo::setEstateFlags(U32 flags)
02327 {
02328 childSetValue("externally_visible_check", LLSD(flags & REGION_FLAGS_EXTERNALLY_VISIBLE ? TRUE : FALSE) );
02329 childSetValue("fixed_sun_check", LLSD(flags & REGION_FLAGS_SUN_FIXED ? TRUE : FALSE) );
02330 childSetValue(
02331 "voice_chat_check",
02332 LLSD(flags & REGION_FLAGS_ALLOW_VOICE ? TRUE : FALSE));
02333 childSetValue("allow_direct_teleport", LLSD(flags & REGION_FLAGS_ALLOW_DIRECT_TELEPORT ? TRUE : FALSE) );
02334 childSetValue("limit_payment", LLSD(flags & REGION_FLAGS_DENY_ANONYMOUS ? TRUE : FALSE) );
02335 childSetValue("limit_age_verified", LLSD(flags & REGION_FLAGS_DENY_AGEUNVERIFIED ? TRUE : FALSE) );
02336
02337 refresh();
02338 }
02339
02340 U32 LLPanelEstateInfo::computeEstateFlags()
02341 {
02342 U32 flags = 0;
02343
02344 if (childGetValue("externally_visible_check").asBoolean())
02345 {
02346 flags |= REGION_FLAGS_EXTERNALLY_VISIBLE;
02347 }
02348
02349 if ( childGetValue("voice_chat_check").asBoolean() )
02350 {
02351 flags |= REGION_FLAGS_ALLOW_VOICE;
02352 }
02353
02354 if (childGetValue("allow_direct_teleport").asBoolean())
02355 {
02356 flags |= REGION_FLAGS_ALLOW_DIRECT_TELEPORT;
02357 }
02358
02359 if (childGetValue("fixed_sun_check").asBoolean())
02360 {
02361 flags |= REGION_FLAGS_SUN_FIXED;
02362 }
02363
02364 if (childGetValue("limit_payment").asBoolean())
02365 {
02366 flags |= REGION_FLAGS_DENY_ANONYMOUS;
02367 }
02368
02369 if (childGetValue("limit_age_verified").asBoolean())
02370 {
02371 flags |= REGION_FLAGS_DENY_AGEUNVERIFIED;
02372 }
02373
02374
02375 return flags;
02376 }
02377
02378 BOOL LLPanelEstateInfo::getGlobalTime()
02379 {
02380 return childGetValue("use_global_time_check").asBoolean();
02381 }
02382
02383 void LLPanelEstateInfo::setGlobalTime(bool b)
02384 {
02385 childSetValue("use_global_time_check", LLSD(b));
02386 childSetEnabled("fixed_sun_check", LLSD(!b));
02387 childSetEnabled("sun_hour_slider", LLSD(!b));
02388 if (b)
02389 {
02390 childSetValue("sun_hour_slider", LLSD(0.f));
02391 }
02392 }
02393
02394
02395 BOOL LLPanelEstateInfo::getFixedSun()
02396 {
02397 return childGetValue("fixed_sun_check").asBoolean();
02398 }
02399
02400 void LLPanelEstateInfo::setSunHour(F32 sun_hour)
02401 {
02402 if(sun_hour < 6.0f)
02403 {
02404 sun_hour = 24.0f + sun_hour;
02405 }
02406 childSetValue("sun_hour_slider", LLSD(sun_hour));
02407 }
02408
02409 F32 LLPanelEstateInfo::getSunHour()
02410 {
02411 if (childIsEnabled("sun_hour_slider"))
02412 {
02413 return (F32)childGetValue("sun_hour_slider").asReal();
02414 }
02415 return 0.f;
02416 }
02417
02418 const std::string LLPanelEstateInfo::getEstateName() const
02419 {
02420 return childGetValue("estate_name").asString();
02421 }
02422
02423 void LLPanelEstateInfo::setEstateName(const std::string& name)
02424 {
02425 childSetValue("estate_name", LLSD(name));
02426 }
02427
02428 const std::string LLPanelEstateInfo::getOwnerName() const
02429 {
02430 return childGetValue("estate_owner").asString();
02431 }
02432
02433 void LLPanelEstateInfo::setOwnerName(const std::string& name)
02434 {
02435 childSetValue("estate_owner", LLSD(name));
02436 }
02437
02438 const std::string LLPanelEstateInfo::getAbuseEmailAddress() const
02439 {
02440 return childGetValue("abuse_email_address").asString();
02441 }
02442
02443 void LLPanelEstateInfo::setAbuseEmailAddress(const std::string& address)
02444 {
02445 childSetValue("abuse_email_address", LLSD(address));
02446 }
02447
02448 void LLPanelEstateInfo::setAccessAllowedEnabled(bool enable_agent,
02449 bool enable_group,
02450 bool enable_ban)
02451 {
02452 childSetEnabled("allow_resident_label", enable_agent);
02453 childSetEnabled("allowed_avatar_name_list", enable_agent);
02454 childSetVisible("allowed_avatar_name_list", enable_agent);
02455 childSetEnabled("add_allowed_avatar_btn", enable_agent);
02456 childSetEnabled("remove_allowed_avatar_btn", enable_agent);
02457
02458
02459 childSetEnabled("allow_group_label", enable_group);
02460 childSetEnabled("allowed_group_name_list", enable_group);
02461 childSetVisible("allowed_group_name_list", enable_group);
02462 childSetEnabled("add_allowed_group_btn", enable_group);
02463 childSetEnabled("remove_allowed_group_btn", enable_group);
02464
02465
02466 childSetEnabled("ban_resident_label", enable_ban);
02467 childSetEnabled("banned_avatar_name_list", enable_ban);
02468 childSetVisible("banned_avatar_name_list", enable_ban);
02469 childSetEnabled("add_banned_avatar_btn", enable_ban);
02470 childSetEnabled("remove_banned_avatar_btn", enable_ban);
02471
02472
02473 if (enable_agent)
02474 {
02475 checkRemovalButton("allowed_avatar_name_list");
02476 }
02477
02478 if (enable_group)
02479 {
02480 checkRemovalButton("allowed_group_name_list");
02481 }
02482
02483 if (enable_ban)
02484 {
02485 checkRemovalButton("banned_avatar_name_list");
02486 }
02487 }
02488
02489
02490 void LLPanelEstateInfo::callbackCacheName(
02491 const LLUUID& id,
02492 const char* first,
02493 const char* last,
02494 BOOL is_group,
02495 void*)
02496 {
02497 LLPanelEstateInfo* self = LLFloaterRegionInfo::getPanelEstate();
02498 if (!self) return;
02499
02500 std::string name;
02501
02502 if (id.isNull())
02503 {
02504 name = "(none)";
02505 }
02506 else
02507 {
02508 name = first;
02509 name += " ";
02510 name += last;
02511 }
02512
02513 self->setOwnerName(name);
02514 }
02515
02516 void LLPanelEstateInfo::clearAccessLists()
02517 {
02518 LLNameListCtrl* name_list = getChild<LLNameListCtrl>("allowed_avatar_name_list");
02519 if (name_list)
02520 {
02521 name_list->deleteAllItems();
02522 }
02523
02524 name_list = getChild<LLNameListCtrl>("banned_avatar_name_list");
02525 if (name_list)
02526 {
02527 name_list->deleteAllItems();
02528 }
02529 }
02530
02531
02532 BOOL LLPanelEstateInfo::checkRemovalButton(std::string name)
02533 {
02534 std::string btn_name = "";
02535 if (name == "allowed_avatar_name_list")
02536 {
02537 btn_name = "remove_allowed_avatar_btn";
02538 }
02539 else if (name == "allowed_group_name_list")
02540 {
02541 btn_name = "remove_allowed_group_btn";
02542 }
02543 else if (name == "banned_avatar_name_list")
02544 {
02545 btn_name = "remove_banned_avatar_btn";
02546 }
02547 else if (name == "estate_manager_name_list")
02548 {
02549
02550 LLViewerRegion* region = gAgent.getRegion();
02551 if (region && (region->getOwner() == gAgent.getID()))
02552 {
02553 btn_name = "remove_estate_manager_btn";
02554 }
02555 }
02556
02557
02558 LLNameListCtrl* name_list = getChild<LLNameListCtrl>(name);
02559 childSetEnabled(btn_name.c_str(), name_list && name_list->getFirstSelected() ? TRUE : FALSE);
02560
02561 return (btn_name != "");
02562 }
02563
02564 BOOL LLPanelEstateInfo::checkSunHourSlider(LLUICtrl* child_ctrl)
02565 {
02566 BOOL found_child_ctrl = FALSE;
02567 if (child_ctrl->getName() == "sun_hour_slider")
02568 {
02569 enableButton("apply_btn");
02570 found_child_ctrl = TRUE;
02571 }
02572 return found_child_ctrl;
02573 }
02574
02575
02576 void LLPanelEstateInfo::onClickMessageEstate(void* userdata)
02577 {
02578 llinfos << "LLPanelEstateInfo::onClickMessageEstate" << llendl;
02579 gViewerWindow->alertXmlEditText("MessageEstate", LLString::format_map_t(),
02580 NULL, NULL,
02581 onMessageCommit, userdata);
02582 }
02583
02584
02585 void LLPanelEstateInfo::onMessageCommit(S32 option, const LLString& text, void* userdata)
02586 {
02587 if(option != 0) return;
02588 if(text.empty()) return;
02589 LLPanelEstateInfo* self = (LLPanelEstateInfo*)userdata;
02590 if(!self) return;
02591 llinfos << "Message to everyone: " << text << llendl;
02592 strings_t strings;
02593
02594 std::string name;
02595 gAgent.buildFullname(name);
02596 strings.push_back(strings_t::value_type(name));
02597 strings.push_back(strings_t::value_type(text));
02598 LLUUID invoice(LLFloaterRegionInfo::getLastInvoice());
02599 self->sendEstateOwnerMessage(gMessageSystem, "instantmessage", invoice, strings);
02600 }
02601
02602 LLPanelEstateCovenant::LLPanelEstateCovenant()
02603 : mCovenantID(LLUUID::null)
02604 {
02605 }
02606
02607
02608 bool LLPanelEstateCovenant::refreshFromRegion(LLViewerRegion* region)
02609 {
02610 LLTextBox* region_name = getChild<LLTextBox>("region_name_text");
02611 if (region_name)
02612 {
02613 region_name->setText(region->getName());
02614 }
02615
02616 LLTextBox* resellable_clause = getChild<LLTextBox>("resellable_clause");
02617 if (resellable_clause)
02618 {
02619 if (region->getRegionFlags() & REGION_FLAGS_BLOCK_LAND_RESELL)
02620 {
02621 resellable_clause->setText(getString("can_not_resell"));
02622 }
02623 else
02624 {
02625 resellable_clause->setText(getString("can_resell"));
02626 }
02627 }
02628
02629 LLTextBox* changeable_clause = getChild<LLTextBox>("changeable_clause");
02630 if (changeable_clause)
02631 {
02632 if (region->getRegionFlags() & REGION_FLAGS_ALLOW_PARCEL_CHANGES)
02633 {
02634 changeable_clause->setText(getString("can_change"));
02635 }
02636 else
02637 {
02638 changeable_clause->setText(getString("can_not_change"));
02639 }
02640 }
02641
02642
02643 bool rv = LLPanelRegionInfo::refreshFromRegion(region);
02644 LLMessageSystem *msg = gMessageSystem;
02645 msg->newMessage("EstateCovenantRequest");
02646 msg->nextBlockFast(_PREHASH_AgentData);
02647 msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
02648 msg->addUUIDFast(_PREHASH_SessionID,gAgent.getSessionID());
02649 msg->sendReliable(region->getHost());
02650 return rv;
02651 }
02652
02653
02654 bool LLPanelEstateCovenant::estateUpdate(LLMessageSystem* msg)
02655 {
02656 llinfos << "LLPanelEstateCovenant::estateUpdate()" << llendl;
02657 return true;
02658 }
02659
02660
02661 BOOL LLPanelEstateCovenant::postBuild()
02662 {
02663 initHelpBtn("covenant_help", "HelpEstateCovenant");
02664 mEstateNameText = getChild<LLTextBox>("estate_name_text");
02665 mEstateOwnerText = getChild<LLTextBox>("estate_owner_text");
02666 mLastModifiedText = getChild<LLTextBox>("covenant_timestamp_text");
02667 mEditor = getChild<LLViewerTextEditor>("covenant_editor");
02668 if (mEditor) mEditor->setHandleEditKeysDirectly(TRUE);
02669 LLButton* reset_button = getChild<LLButton>("reset_covenant");
02670 reset_button->setEnabled(gAgent.canManageEstate());
02671 reset_button->setClickedCallback(LLPanelEstateCovenant::resetCovenantID, NULL);
02672
02673 return LLPanelRegionInfo::postBuild();
02674 }
02675
02676
02677 void LLPanelEstateCovenant::updateChild(LLUICtrl* child_ctrl)
02678 {
02679 }
02680
02681
02682 BOOL LLPanelEstateCovenant::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
02683 EDragAndDropType cargo_type,
02684 void* cargo_data,
02685 EAcceptance* accept,
02686 LLString& tooltip_msg)
02687 {
02688 LLInventoryItem* item = (LLInventoryItem*)cargo_data;
02689
02690 if (!gAgent.canManageEstate())
02691 {
02692 *accept = ACCEPT_NO;
02693 return TRUE;
02694 }
02695
02696 switch(cargo_type)
02697 {
02698 case DAD_NOTECARD:
02699 *accept = ACCEPT_YES_COPY_SINGLE;
02700 if (item && drop)
02701 {
02702 gViewerWindow->alertXml("EstateChangeCovenant",
02703 LLPanelEstateCovenant::confirmChangeCovenantCallback,
02704 item);
02705 }
02706 break;
02707 default:
02708 *accept = ACCEPT_NO;
02709 break;
02710 }
02711
02712 return TRUE;
02713 }
02714
02715
02716 void LLPanelEstateCovenant::confirmChangeCovenantCallback(S32 option, void* userdata)
02717 {
02718 LLInventoryItem* item = (LLInventoryItem*)userdata;
02719 LLPanelEstateCovenant* self = LLFloaterRegionInfo::getPanelCovenant();
02720
02721 if (!item || !self) return;
02722
02723 switch(option)
02724 {
02725 case 0:
02726 self->loadInvItem(item);
02727 break;
02728 default:
02729 break;
02730 }
02731 }
02732
02733
02734 void LLPanelEstateCovenant::resetCovenantID(void* userdata)
02735 {
02736 gViewerWindow->alertXml("EstateChangeCovenant",
02737 LLPanelEstateCovenant::confirmResetCovenantCallback,
02738 NULL);
02739 }
02740
02741
02742 void LLPanelEstateCovenant::confirmResetCovenantCallback(S32 option, void* userdata)
02743 {
02744 LLPanelEstateCovenant* self = LLFloaterRegionInfo::getPanelCovenant();
02745 if (!self) return;
02746
02747 switch(option)
02748 {
02749 case 0:
02750 self->loadInvItem(NULL);
02751 break;
02752 default:
02753 break;
02754 }
02755 }
02756
02757 void LLPanelEstateCovenant::loadInvItem(LLInventoryItem *itemp)
02758 {
02759 const BOOL high_priority = TRUE;
02760 if (itemp)
02761 {
02762 gAssetStorage->getInvItemAsset(gAgent.getRegionHost(),
02763 gAgent.getID(),
02764 gAgent.getSessionID(),
02765 itemp->getPermissions().getOwner(),
02766 LLUUID::null,
02767 itemp->getUUID(),
02768 itemp->getAssetUUID(),
02769 itemp->getType(),
02770 onLoadComplete,
02771 (void*)this,
02772 high_priority);
02773 mAssetStatus = ASSET_LOADING;
02774 }
02775 else
02776 {
02777 mAssetStatus = ASSET_LOADED;
02778 setCovenantTextEditor("There is no Covenant provided for this Estate.");
02779 sendChangeCovenantID(LLUUID::null);
02780 }
02781 }
02782
02783
02784 void LLPanelEstateCovenant::onLoadComplete(LLVFS *vfs,
02785 const LLUUID& asset_uuid,
02786 LLAssetType::EType type,
02787 void* user_data, S32 status, LLExtStat ext_status)
02788 {
02789 llinfos << "LLPanelEstateCovenant::onLoadComplete()" << llendl;
02790 LLPanelEstateCovenant* panelp = (LLPanelEstateCovenant*)user_data;
02791 if( panelp )
02792 {
02793 if(0 == status)
02794 {
02795 LLVFile file(vfs, asset_uuid, type, LLVFile::READ);
02796
02797 S32 file_length = file.getSize();
02798
02799 char* buffer = new char[file_length+1];
02800 if (buffer == NULL)
02801 {
02802 llerrs << "Memory Allocation Failed" << llendl;
02803 return;
02804 }
02805
02806 file.read((U8*)buffer, file_length);
02807
02808 buffer[file_length] = 0;
02809
02810 if( (file_length > 19) && !strncmp( buffer, "Linden text version", 19 ) )
02811 {
02812 if( !panelp->mEditor->importBuffer( buffer ) )
02813 {
02814 llwarns << "Problem importing estate covenant." << llendl;
02815 gViewerWindow->alertXml("ProblemImportingEstateCovenant");
02816 }
02817 else
02818 {
02819 panelp->sendChangeCovenantID(asset_uuid);
02820 }
02821 }
02822 else
02823 {
02824
02825 panelp->sendChangeCovenantID(asset_uuid);
02826 }
02827 delete[] buffer;
02828 }
02829 else
02830 {
02831 LLViewerStats::getInstance()->incStat( LLViewerStats::ST_DOWNLOAD_FAILED );
02832
02833 if( LL_ERR_ASSET_REQUEST_NOT_IN_DATABASE == status ||
02834 LL_ERR_FILE_EMPTY == status)
02835 {
02836 gViewerWindow->alertXml("MissingNotecardAssetID");
02837 }
02838 else if (LL_ERR_INSUFFICIENT_PERMISSIONS == status)
02839 {
02840 gViewerWindow->alertXml("NotAllowedToViewNotecard");
02841 }
02842 else
02843 {
02844 gViewerWindow->alertXml("UnableToLoadNotecard");
02845 }
02846
02847 llwarns << "Problem loading notecard: " << status << llendl;
02848 }
02849 panelp->mAssetStatus = ASSET_LOADED;
02850 panelp->setCovenantID(asset_uuid);
02851 }
02852 }
02853
02854
02855
02856
02857 void LLPanelEstateCovenant::sendChangeCovenantID(const LLUUID &asset_id)
02858 {
02859 if (asset_id != getCovenantID())
02860 {
02861 setCovenantID(asset_id);
02862
02863 LLMessageSystem* msg = gMessageSystem;
02864 msg->newMessage("EstateOwnerMessage");
02865 msg->nextBlockFast(_PREHASH_AgentData);
02866 msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
02867 msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
02868 msg->addUUIDFast(_PREHASH_TransactionID, LLUUID::null);
02869
02870 msg->nextBlock("MethodData");
02871 msg->addString("Method", "estatechangecovenantid");
02872 msg->addUUID("Invoice", LLFloaterRegionInfo::getLastInvoice());
02873
02874 msg->nextBlock("ParamList");
02875 msg->addString("Parameter", getCovenantID().asString());
02876 gAgent.sendReliableMessage();
02877 }
02878 }
02879
02880
02881 BOOL LLPanelEstateCovenant::sendUpdate()
02882 {
02883 return TRUE;
02884 }
02885
02886 const std::string& LLPanelEstateCovenant::getEstateName() const
02887 {
02888 return mEstateNameText->getText();
02889 }
02890
02891 void LLPanelEstateCovenant::setEstateName(const std::string& name)
02892 {
02893 mEstateNameText->setText(name);
02894 }
02895
02896
02897 void LLPanelEstateCovenant::updateCovenantText(const std::string& string, const LLUUID& asset_id)
02898 {
02899 LLPanelEstateCovenant* panelp = LLFloaterRegionInfo::getPanelCovenant();
02900 if( panelp )
02901 {
02902 panelp->mEditor->setText(string);
02903 panelp->setCovenantID(asset_id);
02904 }
02905 }
02906
02907
02908 void LLPanelEstateCovenant::updateEstateName(const std::string& name)
02909 {
02910 LLPanelEstateCovenant* panelp = LLFloaterRegionInfo::getPanelCovenant();
02911 if( panelp )
02912 {
02913 panelp->mEstateNameText->setText(name);
02914 }
02915 }
02916
02917
02918 void LLPanelEstateCovenant::updateLastModified(const std::string& text)
02919 {
02920 LLPanelEstateCovenant* panelp = LLFloaterRegionInfo::getPanelCovenant();
02921 if( panelp )
02922 {
02923 panelp->mLastModifiedText->setText(text);
02924 }
02925 }
02926
02927
02928 void LLPanelEstateCovenant::updateEstateOwnerName(const std::string& name)
02929 {
02930 LLPanelEstateCovenant* panelp = LLFloaterRegionInfo::getPanelCovenant();
02931 if( panelp )
02932 {
02933 panelp->mEstateOwnerText->setText(name);
02934 }
02935 }
02936
02937 const std::string& LLPanelEstateCovenant::getOwnerName() const
02938 {
02939 return mEstateOwnerText->getText();
02940 }
02941
02942 void LLPanelEstateCovenant::setOwnerName(const std::string& name)
02943 {
02944 mEstateOwnerText->setText(name);
02945 }
02946
02947 void LLPanelEstateCovenant::setCovenantTextEditor(const std::string& text)
02948 {
02949 mEditor->setText(text);
02950 }
02951
02952
02953
02954
02955
02956
02957
02958
02959
02960
02961
02962
02963 bool LLDispatchEstateUpdateInfo::operator()(
02964 const LLDispatcher* dispatcher,
02965 const std::string& key,
02966 const LLUUID& invoice,
02967 const sparam_t& strings)
02968 {
02969 LLPanelEstateInfo* panel = LLFloaterRegionInfo::getPanelEstate();
02970 if (!panel) return true;
02971
02972
02973
02974
02975 std::string estate_name = strings[0].c_str();
02976 panel->setEstateName(estate_name);
02977
02978 if (strings.size() > 9)
02979 {
02980 std::string abuse_email = strings[9].c_str();
02981 panel->setAbuseEmailAddress(abuse_email);
02982 }
02983 else
02984 {
02985 panel->setAbuseEmailAddress("@ Old Server @");
02986 }
02987
02988 LLViewerRegion* regionp = gAgent.getRegion();
02989
02990 LLUUID owner_id(strings[1].c_str());
02991 regionp->setOwner(owner_id);
02992
02993 const BOOL is_group = FALSE;
02994 gCacheName->get(owner_id, is_group, LLPanelEstateInfo::callbackCacheName);
02995
02996 U32 estate_id = strtoul(strings[2].c_str(), NULL, 10);
02997 panel->setEstateID(estate_id);
02998
02999 U32 flags = strtoul(strings[3].c_str(), NULL, 10);
03000 panel->setEstateFlags(flags);
03001
03002 F32 sun_hour = ((F32)(strtod(strings[4].c_str(), NULL)))/1024.0f;
03003 if(sun_hour == 0 && (flags & REGION_FLAGS_SUN_FIXED ? FALSE : TRUE))
03004 {
03005 panel->setGlobalTime(TRUE);
03006 }
03007 else
03008 {
03009 panel->setGlobalTime(FALSE);
03010 panel->setSunHour(sun_hour);
03011 }
03012
03013 bool visible_from_mainland = (bool)(flags & REGION_FLAGS_EXTERNALLY_VISIBLE);
03014 bool god = gAgent.isGodlike();
03015 bool linden_estate = (estate_id <= ESTATE_LAST_LINDEN);
03016
03017
03018
03019
03020
03021
03022 bool enable_agent = (!visible_from_mainland || (god && linden_estate));
03023 bool enable_group = enable_agent;
03024 bool enable_ban = !linden_estate;
03025 panel->setAccessAllowedEnabled(enable_agent, enable_group, enable_ban);
03026
03027 return true;
03028 }
03029
03030
03031
03032
03033
03034
03035
03036
03037
03038
03039
03040
03041
03042 bool LLDispatchSetEstateAccess::operator()(
03043 const LLDispatcher* dispatcher,
03044 const std::string& key,
03045 const LLUUID& invoice,
03046 const sparam_t& strings)
03047 {
03048 LLPanelEstateInfo* panel = LLFloaterRegionInfo::getPanelEstate();
03049 if (!panel) return true;
03050
03051 S32 index = 1;
03052 U32 access_flags = strtoul(strings[index++].c_str(), NULL,10);
03053 S32 num_allowed_agents = strtol(strings[index++].c_str(), NULL, 10);
03054 S32 num_allowed_groups = strtol(strings[index++].c_str(), NULL, 10);
03055 S32 num_banned_agents = strtol(strings[index++].c_str(), NULL, 10);
03056 S32 num_estate_managers = strtol(strings[index++].c_str(), NULL, 10);
03057
03058
03059 if (num_allowed_agents > 0
03060 && !(access_flags & ESTATE_ACCESS_ALLOWED_AGENTS))
03061 {
03062 llwarns << "non-zero count for allowed agents, but no corresponding flag" << llendl;
03063 }
03064 if (num_allowed_groups > 0
03065 && !(access_flags & ESTATE_ACCESS_ALLOWED_GROUPS))
03066 {
03067 llwarns << "non-zero count for allowed groups, but no corresponding flag" << llendl;
03068 }
03069 if (num_banned_agents > 0
03070 && !(access_flags & ESTATE_ACCESS_BANNED_AGENTS))
03071 {
03072 llwarns << "non-zero count for banned agents, but no corresponding flag" << llendl;
03073 }
03074 if (num_estate_managers > 0
03075 && !(access_flags & ESTATE_ACCESS_MANAGERS))
03076 {
03077 llwarns << "non-zero count for managers, but no corresponding flag" << llendl;
03078 }
03079
03080
03081 if (access_flags & ESTATE_ACCESS_ALLOWED_AGENTS)
03082 {
03083 LLNameListCtrl* allowed_agent_name_list;
03084 allowed_agent_name_list = panel->getChild<LLNameListCtrl>("allowed_avatar_name_list");
03085
03086 int totalAllowedAgents = num_allowed_agents;
03087
03088 if (allowed_agent_name_list)
03089 {
03090 totalAllowedAgents += allowed_agent_name_list->getItemCount();
03091 }
03092
03093 std::string msg = llformat("Allowed residents: (%d, max %d)",
03094 totalAllowedAgents,
03095 ESTATE_MAX_ACCESS_IDS);
03096 panel->childSetValue("allow_resident_label", LLSD(msg));
03097
03098 if (allowed_agent_name_list)
03099 {
03100
03101 for (S32 i = 0; i < num_allowed_agents && i < ESTATE_MAX_ACCESS_IDS; i++)
03102 {
03103 LLUUID id;
03104 memcpy(id.mData, strings[index++].data(), UUID_BYTES);
03105 allowed_agent_name_list->addNameItem(id);
03106 }
03107 panel->childSetEnabled("remove_allowed_avatar_btn", allowed_agent_name_list->getFirstSelected() ? TRUE : FALSE);
03108 allowed_agent_name_list->sortByColumn(0, TRUE);
03109 }
03110 }
03111
03112 if (access_flags & ESTATE_ACCESS_ALLOWED_GROUPS)
03113 {
03114 LLNameListCtrl* allowed_group_name_list;
03115 allowed_group_name_list = panel->getChild<LLNameListCtrl>("allowed_group_name_list");
03116
03117 std::string msg = llformat("Allowed groups: (%d, max %d)",
03118 num_allowed_groups,
03119 (S32) ESTATE_MAX_GROUP_IDS);
03120 panel->childSetValue("allow_group_label", LLSD(msg));
03121
03122 if (allowed_group_name_list)
03123 {
03124 allowed_group_name_list->deleteAllItems();
03125 for (S32 i = 0; i < num_allowed_groups && i < ESTATE_MAX_GROUP_IDS; i++)
03126 {
03127 LLUUID id;
03128 memcpy(id.mData, strings[index++].data(), UUID_BYTES);
03129 allowed_group_name_list->addGroupNameItem(id);
03130 }
03131 panel->childSetEnabled("remove_allowed_group_btn", allowed_group_name_list->getFirstSelected() ? TRUE : FALSE);
03132 allowed_group_name_list->sortByColumn(0, TRUE);
03133 }
03134 }
03135
03136 if (access_flags & ESTATE_ACCESS_BANNED_AGENTS)
03137 {
03138 LLNameListCtrl* banned_agent_name_list;
03139 banned_agent_name_list = panel->getChild<LLNameListCtrl>("banned_avatar_name_list");
03140
03141 int totalBannedAgents = num_banned_agents;
03142
03143 if (banned_agent_name_list)
03144 {
03145 totalBannedAgents += banned_agent_name_list->getItemCount();
03146 }
03147
03148
03149 std::string msg = llformat("Banned residents: (%d, max %d)",
03150 totalBannedAgents,
03151 ESTATE_MAX_ACCESS_IDS);
03152 panel->childSetValue("ban_resident_label", LLSD(msg));
03153
03154 if (banned_agent_name_list)
03155 {
03156
03157 for (S32 i = 0; i < num_banned_agents && i < ESTATE_MAX_ACCESS_IDS; i++)
03158 {
03159 LLUUID id;
03160 memcpy(id.mData, strings[index++].data(), UUID_BYTES);
03161 banned_agent_name_list->addNameItem(id);
03162 }
03163 panel->childSetEnabled("remove_banned_avatar_btn", banned_agent_name_list->getFirstSelected() ? TRUE : FALSE);
03164 banned_agent_name_list->sortByColumn(0, TRUE);
03165 }
03166 }
03167
03168 if (access_flags & ESTATE_ACCESS_MANAGERS)
03169 {
03170 std::string msg = llformat("Estate Managers: (%d, max %d)",
03171 num_estate_managers,
03172 ESTATE_MAX_MANAGERS);
03173 panel->childSetValue("estate_manager_label", LLSD(msg));
03174
03175 LLNameListCtrl* estate_manager_name_list =
03176 panel->getChild<LLNameListCtrl>("estate_manager_name_list");
03177 if (estate_manager_name_list)
03178 {
03179 estate_manager_name_list->deleteAllItems();
03180
03181
03182
03183
03184 for (S32 i = 0; i < num_estate_managers && i < (ESTATE_MAX_MANAGERS * 4); i++)
03185 {
03186 LLUUID id;
03187 memcpy(id.mData, strings[index++].data(), UUID_BYTES);
03188 estate_manager_name_list->addNameItem(id);
03189 }
03190 panel->childSetEnabled("remove_estate_manager_btn", estate_manager_name_list->getFirstSelected() ? TRUE : FALSE);
03191 estate_manager_name_list->sortByColumn(0, TRUE);
03192 }
03193 }
03194
03195 return true;
03196 }