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