llfloaterregioninfo.cpp

Go to the documentation of this file.
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"  // for send_sim_wide_deletes()
00057 #include "llfloatertopobjects.h" // added to fix SL-32336
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 void unpack_request_params(
00117         LLMessageSystem* msg,
00118         LLDispatcher::sparam_t& strings,
00119         LLDispatcher::iparam_t& integers)
00120 {
00121         char str_buf[MAX_STRING];
00122         S32 str_count = msg->getNumberOfBlocksFast(_PREHASH_StringData);
00123         S32 i;
00124         for (i = 0; i < str_count; ++i)
00125         {
00126                 // we treat the SParam as binary data (since it might be an 
00127                 // LLUUID in compressed form which may have embedded \0's,)
00128                 str_buf[0] = '\0';
00129                 S32 data_size = msg->getSizeFast(_PREHASH_StringData, i, _PREHASH_SParam);
00130                 msg->getBinaryDataFast(_PREHASH_StringData, _PREHASH_SParam,
00131                                                            str_buf, data_size, i, MAX_STRING - 1);
00132                 strings.push_back(std::string(str_buf, data_size));
00133         }
00134 
00135         U32 int_buf;
00136         S32 int_count = msg->getNumberOfBlocksFast(_PREHASH_IntegerData);
00137         for (i = 0; i < int_count; ++i)
00138         {
00139                 msg->getU32("IntegerData", "IParam", int_buf, i);
00140                 integers.push_back(int_buf);
00141         }
00142 }
00143 */
00144 
00145 
00146 
00147 bool estate_dispatch_initialized = false;
00148 
00149 
00153 
00154 //S32 LLFloaterRegionInfo::sRequestSerial = 0;
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         // contruct the panels
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 // static
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         // Must allow anyone to request the RegionInfo data
00232         // so non-owners/non-gods can see the values. 
00233         // Therefore can't use an EstateOwnerMessage JC
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 // static
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         // unpack the message
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         //dispatch the message
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 // static
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         // extract message
00297         char sim_name[MAX_STRING];              /* Flawfinder: ignore*/
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         // actually the "last set" sun hour, not the current sun hour. JC
00317         msg->getF32("RegionInfo", "SunHour", sun_hour);
00318 
00319         // GENERAL PANEL
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         // detect teen grid for maturity
00337 
00338         U32 parent_estate_id;
00339         msg->getU32("RegionInfo", "ParentEstateID", parent_estate_id);
00340         BOOL teen_grid = (parent_estate_id == 5);  // *TODO add field to estate table and test that
00341         panel->childSetEnabled("access_combo", gAgent.isGodlike() || (region && region->canManageEstate() && !teen_grid));
00342         panel->setCtrlsEnabled(allow_modify);
00343         
00344 
00345         // DEBUG PANEL
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         // TERRAIN PANEL
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 // static
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 // static
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         // call refresh from region on all panels
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 // public
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 // LLPanelRegionInfo
00424 //
00425 
00426 // static
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 //static 
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 // static
00448 // Enables the "set" button if it is not already enabled
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 // static
00460 // Enables set button on change to line editor
00461 void LLPanelRegionInfo::onChangeText(LLLineEditor* caller, void* user_data)
00462 {
00463         // reuse the previous method
00464         onChangeAnything(0, user_data);
00465 }
00466 
00467 
00468 // virtual
00469 BOOL LLPanelRegionInfo::postBuild()
00470 {
00471         childSetAction("apply_btn", onBtnSet, this);
00472         childDisable("apply_btn");
00473         refresh();
00474         return TRUE;
00475 }
00476 
00477 // virtual 
00478 void LLPanelRegionInfo::updateChild(LLUICtrl* child_ctr)
00479 {
00480 }
00481 
00482 // virtual
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); //not used
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 // static
00549 void LLPanelRegionInfo::onClickHelp(void* data)
00550 {
00551         const char* xml_alert = (const char*)data;
00552         gViewerWindow->alertXml(xml_alert);
00553 }
00554 
00556 // LLPanelRegionGeneralInfo
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         // childSetEnabled("access_combo", allow_modify);
00565         // now set in processRegionInfo for teen grid detection
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         // Data gets filled in by processRegionInfo
00572 
00573         return LLPanelRegionInfo::refreshFromRegion(region);
00574 }
00575 
00576 BOOL LLPanelRegionGeneralInfo::postBuild()
00577 {
00578         // Enable the "Apply" button if something is changed. JC
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 // static
00610 void LLPanelRegionGeneralInfo::onClickKick(void* userdata)
00611 {
00612         llinfos << "LLPanelRegionGeneralInfo::onClickKick" << llendl;
00613         LLPanelRegionGeneralInfo* panelp = (LLPanelRegionGeneralInfo*)userdata;
00614 
00615         // this depends on the grandparent view being a floater
00616         // in order to set up floater dependency
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 // static
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                 // [0] = our agent id
00632                 // [1] = target agent id
00633                 char buffer[MAX_STRING];                /* Flawfinder: ignore*/
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 // static
00646 void LLPanelRegionGeneralInfo::onClickKickAll(void* userdata)
00647 {
00648         llinfos << "LLPanelRegionGeneralInfo::onClickKickAll" << llendl;
00649         gViewerWindow->alertXml("KickUsersFromRegion", onKickAllCommit, userdata);
00650 }
00651 
00652 // static
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                 // [0] = our agent id
00661                 char buffer[MAX_STRING];                /* Flawfinder: ignore*/
00662                 gAgent.getID().toString(buffer);
00663                 strings.push_back(buffer);
00664 
00665                 LLUUID invoice(LLFloaterRegionInfo::getLastInvoice());
00666                 // historical message name
00667                 self->sendEstateOwnerMessage(gMessageSystem, "teleporthomeallusers", invoice, strings);
00668         }
00669 }
00670 
00671 // static
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 // static
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         // [0] grid_x, unused here
00690         // [1] grid_y, unused here
00691         // [2] agent_id of sender
00692         // [3] sender name
00693         // [4] message
00694         strings.push_back("-1");
00695         strings.push_back("-1");
00696         char buffer[MAX_STRING];                /* Flawfinder: ignore*/
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 // static
00708 void LLPanelRegionGeneralInfo::onClickManageTelehub(void* data)
00709 {
00710         LLFloaterRegionInfo::getInstance()->close();
00711 
00712         LLFloaterTelehub::show();
00713 }
00714 
00715 // setregioninfo
00716 // strings[0] = 'Y' - block terraform, 'N' - not
00717 // strings[1] = 'Y' - block fly, 'N' - not
00718 // strings[2] = 'Y' - allow damage, 'N' - not
00719 // strings[3] = 'Y' - allow land sale, 'N' - not
00720 // strings[4] = agent limit
00721 // strings[5] = object bonus
00722 // strings[6] = sim access (0 = unknown, 13 = PG, 21 = Mature)
00723 // strings[7] = restrict pushobject
00724 // strings[8] = 'Y' - allow parcel subdivide, 'N' - not
00725 // strings[9] = 'Y' - block parcel search, 'N' - allow
00726 BOOL LLPanelRegionGeneralInfo::sendUpdate()
00727 {
00728         llinfos << "LLPanelRegionGeneralInfo::sendUpdate()" << llendl;
00729 
00730         // First try using a Cap.  If that fails use the old method.
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                 // the combo box stores strings "Mature" and "PG", but we have to convert back to a number, 
00742                 // because the sim doesn't know from strings for this stuff
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];                /* Flawfinder: ignore*/
00754 
00755                 snprintf(buffer, MAX_STRING, "%s", (childGetValue("block_terraform_check").asBoolean() ? "Y" : "N"));                   /* Flawfinder: ignore */
00756                 strings.push_back(strings_t::value_type(buffer));
00757 
00758                 snprintf(buffer, MAX_STRING, "%s", (childGetValue("block_fly_check").asBoolean() ? "Y" : "N"));                 /* Flawfinder: ignore */
00759                 strings.push_back(strings_t::value_type(buffer));
00760 
00761                 snprintf(buffer, MAX_STRING, "%s", (childGetValue("allow_damage_check").asBoolean() ? "Y" : "N"));                      /* Flawfinder: ignore */
00762                 strings.push_back(strings_t::value_type(buffer));
00763 
00764                 snprintf(buffer, MAX_STRING, "%s", (childGetValue("allow_land_resell_check").asBoolean() ? "Y" : "N"));                 /* Flawfinder: ignore */
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);                      /* Flawfinder: ignore */
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);                      /* Flawfinder: ignore */
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);                        /* Flawfinder: ignore */
00777                 strings.push_back(strings_t::value_type(buffer));
00778 
00779                 snprintf(buffer, MAX_STRING, "%s", (childGetValue("restrict_pushobject").asBoolean() ? "Y" : "N"));                     /* Flawfinder: ignore */
00780                 strings.push_back(strings_t::value_type(buffer));
00781 
00782                 snprintf(buffer, MAX_STRING, "%s", (childGetValue("allow_parcel_changes_check").asBoolean() ? "Y" : "N"));                      /* Flawfinder: ignore */
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() )           /* Flawfinder: ignore */
00791                 {
00792                         gViewerWindow->alertXml("RegionMaturityChange");
00793                 }
00794         }
00795 
00796 
00797         //integers_t integers;
00798 
00799 
00800         return TRUE;
00801 }
00802 
00804 // LLPanelRegionDebugInfo
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 // virtual
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 // virtual
00850 BOOL LLPanelRegionDebugInfo::sendUpdate()
00851 {
00852         llinfos << "LLPanelRegionDebugInfo::sendUpdate" << llendl;
00853         strings_t strings;
00854         char buffer[MAX_STRING];                /* Flawfinder: ignore */
00855 
00856         snprintf(buffer, MAX_STRING, "%s", (childGetValue("disable_scripts_check").asBoolean() ? "Y" : "N"));                   /* Flawfinder: ignore */
00857         strings.push_back(buffer);
00858 
00859         snprintf(buffer, MAX_STRING, "%s", (childGetValue("disable_collisions_check").asBoolean() ? "Y" : "N"));                        /* Flawfinder: ignore */
00860         strings.push_back(buffer);
00861 
00862         snprintf(buffer, MAX_STRING, "%s", (childGetValue("disable_physics_check").asBoolean() ? "Y" : "N"));                   /* Flawfinder: ignore */
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 // static
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 // static
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 // static
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 // static
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 // static
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 // static
00942 void LLPanelRegionDebugInfo::onClickTopColliders(void* data)
00943 {
00944         LLPanelRegionDebugInfo* self = (LLPanelRegionDebugInfo*)data;
00945         strings_t strings;
00946         strings.push_back("1"); // one physics step
00947         LLUUID invoice(LLFloaterRegionInfo::getLastInvoice());
00948         LLFloaterTopObjects::show();
00949         LLFloaterTopObjects::clearList();
00950         self->sendEstateOwnerMessage(gMessageSystem, "colliders", invoice, strings);
00951 }
00952 
00953 // static
00954 void LLPanelRegionDebugInfo::onClickTopScripts(void* data)
00955 {
00956         LLPanelRegionDebugInfo* self = (LLPanelRegionDebugInfo*)data;
00957         strings_t strings;
00958         strings.push_back("6"); // top 5 scripts
00959         LLUUID invoice(LLFloaterRegionInfo::getLastInvoice());
00960         LLFloaterTopObjects::show();
00961         LLFloaterTopObjects::clearList();
00962         self->sendEstateOwnerMessage(gMessageSystem, "scripts", invoice, strings);
00963 }
00964 
00965 // static
00966 void LLPanelRegionDebugInfo::onClickRestart(void* data)
00967 {
00968         gViewerWindow->alertXml("ConfirmRestart", callbackRestart, data);
00969 }
00970 
00971 // static
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 // static
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 // LLPanelRegionTextureInfo
00996 //
00997 LLPanelRegionTextureInfo::LLPanelRegionTextureInfo() : LLPanelRegionInfo()
00998 {
00999         // nothing.
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];                /* Flawfinder: ignore */
01022         for(S32 i = 0; i < TERRAIN_TEXTURE_COUNT; ++i)
01023         {
01024                 snprintf(buffer, MAX_STRING, "texture_detail_%d", i);                   /* Flawfinder: ignore */
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);                        /* Flawfinder: ignore */
01038                 childSetValue(buffer, LLSD(compp->getStartHeight(i)));
01039                 snprintf(buffer, MAX_STRING, "height_range_spin_%d", i);                /* Flawfinder: ignore */
01040                 childSetValue(buffer, LLSD(compp->getHeightRange(i)));
01041         }
01042 
01043         // Call the parent for common book-keeping
01044         return LLPanelRegionInfo::refreshFromRegion(region);
01045 }
01046 
01047 
01048 BOOL LLPanelRegionTextureInfo::postBuild()
01049 {
01050         LLPanelRegionInfo::postBuild();
01051         char buffer[MAX_STRING];                /* Flawfinder: ignore */
01052         for(S32 i = 0; i < TERRAIN_TEXTURE_COUNT; ++i)
01053         {
01054                 snprintf(buffer, MAX_STRING, "texture_detail_%d", i);                   /* Flawfinder: ignore */
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);                        /* Flawfinder: ignore */
01061                 initCtrl(buffer);
01062                 snprintf(buffer, MAX_STRING, "height_range_spin_%d", i);                        /* Flawfinder: ignore */
01063                 initCtrl(buffer);
01064         }
01065 
01066 //      LLButton* btn = new LLButton("dump", LLRect(0, 20, 100, 0), "", onClickDump, this);
01067 //      btn->setFollows(FOLLOWS_TOP|FOLLOWS_LEFT);
01068 //      addChild(btn);
01069 
01070         return LLPanelRegionInfo::postBuild();
01071 }
01072 
01073 BOOL LLPanelRegionTextureInfo::sendUpdate()
01074 {
01075         llinfos << "LLPanelRegionTextureInfo::sendUpdate()" << llendl;
01076 
01077         // Make sure user hasn't chosen wacky textures.
01078         if (!validateTextureSizes())
01079         {
01080                 return FALSE;
01081         }
01082 
01083         LLTextureCtrl* texture_ctrl;
01084         char buffer[MAX_STRING];                /* Flawfinder: ignore */
01085         char buffer2[MAX_STRING];               /* Flawfinder: ignore */
01086         char id_str[UUID_STR_LENGTH];   /* Flawfinder: ignore */
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);                   /* Flawfinder: ignore */
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);                       /* Flawfinder: ignore */
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);                        /* Flawfinder: ignore */
01109                 snprintf(buffer2, MAX_STRING, "height_range_spin_%d", i);                       /* Flawfinder: ignore */
01110                 snprintf(buffer, MAX_STRING, "%d %f %f", i, (F32)childGetValue(buffer).asReal(), (F32)childGetValue(buffer2).asReal());                 /* Flawfinder: ignore */
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];                /* Flawfinder: ignore */
01124                 snprintf(buffer, MAX_STRING, "texture_detail_%d", i);                   /* Flawfinder: ignore */
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                 // Must ask for highest resolution version's width. JC
01132                 S32 width = img->getWidth(0);
01133                 S32 height = img->getHeight(0);
01134 
01135                 //llinfos << "texture detail " << i << " is " << width << "x" << height << "x" << components << llendl;
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 // static
01164 void LLPanelRegionTextureInfo::onClickDump(void* data)
01165 {
01166         llinfos << "LLPanelRegionTextureInfo::onClickDump()" << llendl;
01167 }
01168 
01169 
01171 // LLPanelRegionTerrainInfo
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 // virtual
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 // virtual
01222 BOOL LLPanelRegionTerrainInfo::sendUpdate()
01223 {
01224         llinfos << "LLPanelRegionTerrainInfo::sendUpdate" << llendl;
01225         char buffer[MAX_STRING];                /* Flawfinder: ignore */
01226         strings_t strings;
01227         LLUUID invoice(LLFloaterRegionInfo::getLastInvoice());
01228 
01229         snprintf(buffer, MAX_STRING, "%f", (F32)childGetValue("water_height_spin").asReal());                   /* Flawfinder: ignore */
01230         strings.push_back(buffer);
01231         snprintf(buffer, MAX_STRING, "%f", (F32)childGetValue("terrain_raise_spin").asReal());                  /* Flawfinder: ignore */
01232         strings.push_back(buffer);
01233         snprintf(buffer, MAX_STRING, "%f", (F32)childGetValue("terrain_lower_spin").asReal());                  /* Flawfinder: ignore */
01234         strings.push_back(buffer);
01235         snprintf(buffer, MAX_STRING, "%s", (childGetValue("use_estate_sun_check").asBoolean() ? "Y" : "N"));                    /* Flawfinder: ignore */
01236         strings.push_back(buffer);
01237         snprintf(buffer, MAX_STRING, "%s", (childGetValue("fixed_sun_check").asBoolean() ? "Y" : "N"));                 /* Flawfinder: ignore */
01238         strings.push_back(buffer);
01239         snprintf(buffer, MAX_STRING, "%f", (F32)childGetValue("sun_hour_slider").asReal() );                    /* Flawfinder: ignore */
01240         strings.push_back(buffer);
01241 
01242         // Grab estate information in case the user decided to set the
01243         // region back to estate time. JC
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") );                  /* Flawfinder: ignore */
01266         strings.push_back(buffer);
01267         snprintf(buffer, MAX_STRING, "%s", (estate_fixed_sun ? "Y" : "N") );                    /* Flawfinder: ignore */
01268         strings.push_back(buffer);
01269         snprintf(buffer, MAX_STRING, "%f", estate_sun_hour);                    /* Flawfinder: ignore */
01270         strings.push_back(buffer);
01271 
01272         sendEstateOwnerMessage(gMessageSystem, "setregionterrain", invoice, strings);
01273         return TRUE;
01274 }
01275 
01276 // static 
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 // static 
01293 void LLPanelRegionTerrainInfo::onChangeFixedSun(LLUICtrl* ctrl, void* user_data)
01294 {
01295         LLPanelRegionTerrainInfo* panel = (LLPanelRegionTerrainInfo*) user_data;
01296         if (!panel) return;
01297         // Just enable the apply button.  We let the sun-hour slider be enabled
01298         // for both fixed-sun and non-fixed-sun. JC
01299         panel->childEnable("apply_btn");
01300 }
01301 
01302 // static 
01303 void LLPanelRegionTerrainInfo::onChangeSunHour(LLUICtrl* ctrl, void*)
01304 {
01305         // can't use userdata to get panel, slider uses it internally
01306         LLPanelRegionTerrainInfo* panel = (LLPanelRegionTerrainInfo*) ctrl->getParent();
01307         if (!panel) return;
01308         panel->childEnable("apply_btn");
01309 }
01310 
01311 // static
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 // static
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 // static
01352 void LLPanelRegionTerrainInfo::onClickBakeTerrain(void* data)
01353 {
01354         gViewerWindow->alertXml("ConfirmBakeTerrain", 
01355                                                          callbackBakeTerrain, data);
01356 }
01357 
01358 // static
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 // LLPanelEstateInfo
01372 //
01373 
01374 LLPanelEstateInfo::LLPanelEstateInfo() 
01375 :       LLPanelRegionInfo(),
01376         mEstateID(0)    // invalid
01377 {
01378 }
01379 
01380 // static
01381 void LLPanelEstateInfo::initDispatch(LLDispatcher& dispatch)
01382 {
01383         std::string name;
01384 
01385 //      name.assign("setowner");
01386 //      static LLDispatchSetEstateOwner set_owner;
01387 //      dispatch.addHandler(name, &set_owner);
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 // static
01401 // Disables the sun-hour slider and the use fixed time check if the use global time is check
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 // Enables the sun-hour slider if the fixed-sun checkbox is set
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 // Add/Remove estate access button callbacks
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 // static
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                 //args
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 // static
01463 void LLPanelEstateInfo::onClickRemoveAllowedAgent(void* user_data)
01464 {
01465         accessRemoveCore(ESTATE_ACCESS_ALLOWED_AGENT_REMOVE, "EstateAllowedAgentRemove", "allowed_avatar_name_list");
01466 }
01467 
01468 // static
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 // static
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 // static
01515 void LLPanelEstateInfo::onClickRemoveAllowedGroup(void* user_data)
01516 {
01517         accessRemoveCore(ESTATE_ACCESS_ALLOWED_GROUP_REMOVE, "EstateAllowedGroupRemove", "allowed_group_name_list");
01518 }
01519 
01520 // static
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 // static
01537 void LLPanelEstateInfo::onClickRemoveBannedAgent(void* user_data)
01538 {
01539         accessRemoveCore(ESTATE_ACCESS_BANNED_AGENT_REMOVE, "EstateBannedAgentRemove", "banned_avatar_name_list");
01540 }
01541 
01542 // static
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         {       // Tell user they can't add more managers
01550                 LLString::format_map_t args;
01551                 args["[MAX_MANAGER]"] = llformat("%d",ESTATE_MAX_MANAGERS);
01552                 gViewerWindow->alertXml("MaxManagersOnRegion", args);
01553         }
01554         else
01555         {       // Go pick managers to add
01556                 accessAddCore(ESTATE_ACCESS_MANAGER_ADD, "EstateManagerAdd");
01557         }
01558 }
01559 
01560 // static
01561 void LLPanelEstateInfo::onClickRemoveEstateManager(void* user_data)
01562 {
01563         accessRemoveCore(ESTATE_ACCESS_MANAGER_REMOVE, "EstateManagerRemove", "estate_manager_name_list");
01564 }
01565 
01566 //---------------------------------------------------------------------------
01567 // Kick from estate methods
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         // this depends on the grandparent view being a floater
01581         // in order to set up floater dependency
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         //check to make sure there is one valid user and id
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         //keep track of what user they want to kick and other misc info
01602         LLKickFromEstateInfo *kick_info = new LLKickFromEstateInfo();
01603         kick_info->mEstatePanelp = self;
01604         kick_info->mDialogName  = "EstateKickUser";
01605         kick_info->mAgentID     = ids[0];
01606 
01607         //Bring up a confirmation dialog
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         //extract the callback parameter
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];                /* Flawfinder: ignore*/
01623 
01624         switch(option)
01625         {
01626         case 0:
01627                 //Kick User
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 // Core Add/Remove estate access methods
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 // static
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;     // ESTATE_ACCESS_BANNED_AGENT_ADD, _REMOVE, etc.
01684         LLString mDialogName;
01685         AgentOrGroupIDsVector mAgentOrGroupIDs; // List of agent IDs to apply to this change
01686 };
01687 
01688 // Special case callback for groups, since it has different callback format than names
01689 // static
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 // static
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         // agent id filled in after avatar picker
01716 
01717         if (isLindenEstate())
01718         {
01719                 gViewerWindow->alertXml("ChangeLindenAccess", accessAddCore2, change_info);
01720         }
01721         else
01722         {
01723                 // same as clicking "OK"
01724                 accessAddCore2(0, change_info);
01725         }
01726 }
01727 
01728 // static
01729 void LLPanelEstateInfo::accessAddCore2(S32 option, void* data)
01730 {
01731         LLEstateAccessChangeInfo* change_info = (LLEstateAccessChangeInfo*)data;
01732         if (option != 0)
01733         {
01734                 // abort change
01735                 delete change_info;
01736                 change_info = NULL;
01737                 return;
01738         }
01739 
01740         // avatar picker yes multi-select, yes close-on-select
01741         LLFloaterAvatarPicker::show(accessAddCore3, (void*)change_info, TRUE, TRUE);
01742 }
01743 
01744 // static
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                 // User didn't select a name.
01752                 delete change_info;
01753                 change_info = NULL;
01754                 return;
01755         }
01756         // User did select a name.
01757         change_info->mAgentOrGroupIDs = ids;
01758         // Can't put estate owner on ban list
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                 // just apply to this estate
01800                 accessCoreConfirm(0, (void*)change_info);
01801         }
01802         else
01803         {
01804                 // ask if this estate or all estates with this owner
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 // static
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                 // warn on change linden estate
01838                 gViewerWindow->alertXml("ChangeLindenAccess", 
01839                                         accessRemoveCore2,
01840                                         (void*)change_info);
01841         }
01842         else
01843         {
01844                 // just proceed, as if clicking OK
01845                 accessRemoveCore2(0, (void*)change_info);
01846         }
01847 }
01848 
01849 // static
01850 void LLPanelEstateInfo::accessRemoveCore2(S32 option, void* data)
01851 {
01852         LLEstateAccessChangeInfo* change_info = (LLEstateAccessChangeInfo*)data;
01853         if (option != 0)
01854         {
01855                 // abort
01856                 delete change_info;
01857                 change_info = NULL;
01858                 return;
01859         }
01860 
01861         // If Linden estate, can only apply to "this" estate, not all estates
01862         // owned by NULL.
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 // Used for both access add and remove operations, depending on the mOperationFlag
01879 // passed in (ESTATE_ACCESS_BANNED_AGENT_ADD, ESTATE_ACCESS_ALLOWED_AGENT_REMOVE, etc.)
01880 // static
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                             // This estate
01908                             sendEstateAccessDelta(flags, id);
01909                             break;
01910                         case 1:
01911                         {
01912                                 // All estates, either than I own or manage for this owner.  
01913                                 // This will be verified on simulator. JC
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 // key = "estateaccessdelta"
01938 // str(estate_id) will be added to front of list by forward_EstateOwnerRequest_to_dataserver
01939 // str[0] = str(agent_id) requesting the change
01940 // str[1] = str(flags) (ESTATE_ACCESS_DELTA_*)
01941 // str[2] = str(agent_id) to add or remove
01942 // static
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); //not used
01951 
01952         msg->nextBlock("MethodData");
01953         msg->addString("Method", "estateaccessdelta");
01954         msg->addUUID("Invoice", LLFloaterRegionInfo::getLastInvoice());
01955 
01956         char buf[MAX_STRING];           /* Flawfinder: ignore*/
01957         gAgent.getID().toString(buf);
01958         msg->nextBlock("ParamList");
01959         msg->addString("Parameter", buf);
01960 
01961         snprintf(buf, MAX_STRING, "%u", flags);                 /* Flawfinder: ignore */
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         // estate managers can't add estate managers
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         // let the parent class handle the general data collection. 
02007         bool rv = LLPanelRegionInfo::refreshFromRegion(region);
02008 
02009         // We want estate info. To make sure it works across region
02010         // boundaries and multiple packets, we add a serial number to the
02011         // integers and track against that on update.
02012         strings_t strings;
02013         //integers_t integers;
02014         //LLFloaterRegionInfo::incrementSerial();
02015         LLFloaterRegionInfo::nextInvoice();
02016         LLUUID invoice(LLFloaterRegionInfo::getLastInvoice());
02017         //integers.push_back(LLFloaterRegionInfo::());::getPanelEstate();
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                 // do nothing
02036         }
02037         else if (checkSunHourSlider(child_ctrl))
02038         {
02039                 // do nothing
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         // set up the callbacks for the generic controls
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         // set up the use global time checkbox
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);    // Allow extras for dupe issue
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         // if this is set to false, then the limit fields are meaningless and should be turned off
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                 // trying to change reserved estate, warn
02154                 gViewerWindow->alertXml("ChangeLindenEstate",
02155                                                            callbackChangeLindenEstate,
02156                                                            this);
02157         }
02158         else
02159         {
02160                 // for normal estates, just make the change
02161                 callbackChangeLindenEstate(0, this);
02162         }
02163         return TRUE;
02164 }
02165 
02166 // static
02167 void LLPanelEstateInfo::callbackChangeLindenEstate(S32 option, void* data)
02168 {
02169         LLPanelEstateInfo* self = (LLPanelEstateInfo*)data;
02170         switch(option)
02171         {
02172         case 0:
02173                 // send the update
02174                 if (!self->commitEstateInfoCaps())
02175                 {
02176                         // the caps method failed, try the old way
02177                         LLFloaterRegionInfo::nextInvoice();
02178                         self->commitEstateInfoDataserver();
02179                 }
02180                 // we don't want to do this because we'll get it automatically from the sim
02181                 // after the spaceserver processes it
02182 //              else
02183 //              {
02184 //                      // caps method does not automatically send this info
02185 //                      LLFloaterRegionInfo::requestRegionInfo();
02186 //              }
02187                 break;
02188         case 1:
02189         default:
02190                 // do nothing
02191                 break;
02192         }
02193 }
02194 
02195 
02196 /*
02197 // Request = "getowner"
02198 // SParam[0] = "" (empty string)
02199 // IParam[0] = serial
02200 void LLPanelEstateInfo::getEstateOwner()
02201 {
02202         // TODO -- disable the panel
02203         // and call this function whenever we cross a region boundary
02204         // re-enable when owner matches, and get new estate info
02205         LLMessageSystem* msg = gMessageSystem;
02206         msg->newMessageFast(_PREHASH_EstateOwnerRequest);
02207         msg->nextBlockFast(_PREHASH_AgentData);
02208         msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
02209 
02210         msg->nextBlockFast(_PREHASH_RequestData);
02211         msg->addStringFast(_PREHASH_Request, "getowner");
02212 
02213         // we send an empty string so that the variable block is not empty
02214         msg->nextBlockFast(_PREHASH_StringData);
02215         msg->addStringFast(_PREHASH_SParam, "");
02216 
02217         msg->nextBlockFast(_PREHASH_IntegerData);
02218         msg->addS32Fast(_PREHASH_IParam, LLFloaterRegionInfo::getSerial());
02219 
02220         gAgent.sendMessage();
02221 }
02222 */
02223 
02224 class LLEstateChangeInfoResponder : public LLHTTPClient::Responder
02225 {
02226 public:
02227         LLEstateChangeInfoResponder(void* userdata) : mpPanel((LLPanelEstateInfo*)userdata) {};
02228         
02229         // if we get a normal response, handle it here
02230         virtual void result(const LLSD& content)
02231         {
02232             // refresh the panel from the database
02233                 mpPanel->refresh();
02234         }
02235         
02236         // if we get an error response
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 // tries to send estate info using a cap; returns true if it succeeded
02247 bool LLPanelEstateInfo::commitEstateInfoCaps()
02248 {
02249         std::string url = gAgent.getRegion()->getCapability("EstateChangeInfo");
02250         
02251         if (url.empty())
02252         {
02253                 // whoops, couldn't find the cap, so bail out
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         // block fly is in estate database but not in estate UI, so we're not supporting it
02269         //body["block_fly"            ] = childGetValue("").asBoolean();
02270 
02271         F32 sun_hour = getSunHour();
02272         if (childGetValue("use_global_time_check").asBoolean())
02273         {
02274                 sun_hour = 0.f;                 // 0 = global time
02275         }
02276         body["sun_hour"] = sun_hour;
02277 
02278         body["owner_abuse_email"] = childGetValue("abuse_email_address").asString();
02279 
02280         // we use a responder so that we can re-get the data after committing to the database
02281         LLHTTPClient::post(url, body, new LLEstateChangeInfoResponder((void*)this));
02282     return true;
02283 }
02284 
02285 /* This is the old way of doing things, is deprecated, and should be 
02286    deleted when the dataserver model can be removed */
02287 // key = "estatechangeinfo"
02288 // strings[0] = str(estate_id) (added by simulator before relay - not here)
02289 // strings[1] = estate_name
02290 // strings[2] = str(estate_flags)
02291 // strings[3] = str((S32)(sun_hour * 1024.f))
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); //not used
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];           /* Flawfinder: ignore*/
02309         snprintf(buf, MAX_STRING, "%u", computeEstateFlags());                  /* Flawfinder: ignore */
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; // 0 = global time
02317         }
02318 
02319         snprintf(buf, MAX_STRING, "%d", (S32)(sun_hour*1024.0f));       /* Flawfinder: ignore */
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         // Groups
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         // Ban
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         // Update removal buttons if needed
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 // static
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 // enables/disables the "remove" button for the various allow/ban lists
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                 //ONLY OWNER CAN ADD /DELET ESTATE MANAGER
02550                 LLViewerRegion* region = gAgent.getRegion();
02551                 if (region && (region->getOwner() == gAgent.getID()))
02552                 {
02553                         btn_name = "remove_estate_manager_btn";
02554                 }
02555         }
02556 
02557         // enable the remove button if something is selected
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 // static
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 // static
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         //integers_t integers;
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 // virtual 
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         // let the parent class handle the general data collection. 
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 // virtual 
02654 bool LLPanelEstateCovenant::estateUpdate(LLMessageSystem* msg)
02655 {
02656         llinfos << "LLPanelEstateCovenant::estateUpdate()" << llendl;
02657         return true;
02658 }
02659         
02660 // virtual 
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 // virtual 
02677 void LLPanelEstateCovenant::updateChild(LLUICtrl* child_ctrl)
02678 {
02679 }
02680 
02681 // virtual
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 // static 
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 // static
02734 void LLPanelEstateCovenant::resetCovenantID(void* userdata)
02735 {
02736         gViewerWindow->alertXml("EstateChangeCovenant",
02737                                                         LLPanelEstateCovenant::confirmResetCovenantCallback,
02738                                                         NULL);
02739 }
02740 
02741 // static
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 // static
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);            /* Flawfinder: ignore */
02807                         // put a EOS at the end
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                                 // Version 0 (just text, doesn't include version number)
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 // key = "estatechangecovenantid"
02855 // strings[0] = str(estate_id) (added by simulator before relay - not here)
02856 // strings[1] = str(covenant_id)
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); //not used
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 // virtual 
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 // static
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 // static
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 // static
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 // static
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 // key = "estateupdateinfo"
02953 // strings[0] = estate name
02954 // strings[1] = str(owner_id)
02955 // strings[2] = str(estate_id)
02956 // strings[3] = str(estate_flags)
02957 // strings[4] = str((S32)(sun_hour * 1024))
02958 // strings[5] = str(parent_estate_id)
02959 // strings[6] = str(covenant_id)
02960 // strings[7] = str(covenant_timestamp)
02961 // strings[8] = str(send_to_agent_only)
02962 // strings[9] = str(abuse_email_addr)
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         // NOTE: LLDispatcher extracts strings with an extra \0 at the
02973         // end.  If we pass the std::string direct to the UI/renderer
02974         // it draws with a weird character at the end of the string.
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         // Update estate owner name in UI
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         // If visible from mainland, disable the access allowed
03018         // UI, as anyone can teleport there.
03019         // However, gods need to be able to edit the access list for
03020         // linden estates, regardless of visibility, to allow object
03021         // and L$ transfers.
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 // key = "setaccess"
03032 // strings[0] = str(estate_id)
03033 // strings[1] = str(packed_access_lists)
03034 // strings[2] = str(num allowed agent ids)
03035 // strings[3] = str(num allowed group ids)
03036 // strings[4] = str(num banned agent ids)
03037 // strings[5] = str(num estate manager agent ids)
03038 // strings[6] = bin(uuid)
03039 // strings[7] = bin(uuid)
03040 // strings[8] = bin(uuid)
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;  // skip estate_id
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         // sanity ckecks
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         // grab the UUID's out of the string fields
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                         //allowed_agent_name_list->deleteAllItems();
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);          /* Flawfinder: ignore */
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);          /* Flawfinder: ignore */
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                         //banned_agent_name_list->deleteAllItems();
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);          /* Flawfinder: ignore */
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();             // Clear existing entries
03180 
03181                         // There should be only ESTATE_MAX_MANAGERS people in the list, but if the database gets more (SL-46107) don't 
03182                         // truncate the list unless it's really big.  Go ahead and show the extras so the user doesn't get confused, 
03183                         // and they can still remove them.
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);          /* Flawfinder: ignore */
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 }

Generated on Fri May 16 08:33:30 2008 for SecondLife by  doxygen 1.5.5