diff options
24 files changed, 226 insertions, 72 deletions
| diff --git a/doc/contributions.txt b/doc/contributions.txt index 2d3fa99c8b..897977cb9a 100644 --- a/doc/contributions.txt +++ b/doc/contributions.txt @@ -31,6 +31,9 @@ Alissa Sabre  	VWR-1353  	VWR-1410  	VWR-2116 +	VWR-2826 +Angus Boyd +	VWR-592  Argent Stonecutter  	VWR-68  Benja Kepler @@ -149,6 +152,8 @@ Matthew Dowd  	VWR-1761  McCabe Maxsted  	VWR-1318 +Michelle2 Zenovka +	VWR-2834  Mr Greggan  	VWR-445  Nicholaz Beresford diff --git a/indra/llcommon/llversionviewer.h b/indra/llcommon/llversionviewer.h index 71b7347c4a..e3a4df190e 100644 --- a/indra/llcommon/llversionviewer.h +++ b/indra/llcommon/llversionviewer.h @@ -34,8 +34,8 @@  const S32 LL_VERSION_MAJOR = 1;  const S32 LL_VERSION_MINOR = 18; -const S32 LL_VERSION_PATCH = 4; -const S32 LL_VERSION_BUILD = 3; +const S32 LL_VERSION_PATCH = 5; +const S32 LL_VERSION_BUILD = 1;  const char * const LL_CHANNEL = "Second Life Release"; diff --git a/indra/llui/lllineeditor.cpp b/indra/llui/lllineeditor.cpp index 0a63ebbe74..420970a38a 100644 --- a/indra/llui/lllineeditor.cpp +++ b/indra/llui/lllineeditor.cpp @@ -1637,6 +1637,9 @@ void LLLineEditor::draw()  				S32 pixels_after_scroll = findPixelNearestPos();	// RCalculcate for IME position  				LLRect screen_pos = getScreenRect();  				LLCoordGL ime_pos( screen_pos.mLeft + pixels_after_scroll, screen_pos.mTop - UI_LINEEDITOR_V_PAD ); + +				ime_pos.mX = (S32) (ime_pos.mX * LLUI::sGLScaleFactor.mV[VX]); +				ime_pos.mY = (S32) (ime_pos.mY * LLUI::sGLScaleFactor.mV[VY]);  				getWindow()->setLanguageTextInput( ime_pos );  			}  		} diff --git a/indra/llui/llmenugl.cpp b/indra/llui/llmenugl.cpp index 8ec5656e18..d150f8954e 100644 --- a/indra/llui/llmenugl.cpp +++ b/indra/llui/llmenugl.cpp @@ -1421,6 +1421,7 @@ void LLMenuItemBranchGL::onVisibilityChange( BOOL new_visibility )  	{  		mBranch->setVisible(FALSE);  	} +	LLMenuItemGL::onVisibilityChange(new_visibility);  }  BOOL LLMenuItemBranchGL::handleKeyHere( KEY key, MASK mask, BOOL called_from_parent ) diff --git a/indra/llui/lltexteditor.cpp b/indra/llui/lltexteditor.cpp index af1813a429..fa1181a866 100644 --- a/indra/llui/lltexteditor.cpp +++ b/indra/llui/lltexteditor.cpp @@ -2816,6 +2816,9 @@ void LLTextEditor::drawCursor()  				// Make sure the IME is in the right place  				LLRect screen_pos = getScreenRect();  				LLCoordGL ime_pos( screen_pos.mLeft + llfloor(cursor_left), screen_pos.mBottom + llfloor(cursor_top) ); + +				ime_pos.mX = (S32) (ime_pos.mX * LLUI::sGLScaleFactor.mV[VX]); +				ime_pos.mY = (S32) (ime_pos.mY * LLUI::sGLScaleFactor.mV[VY]);  				getWindow()->setLanguageTextInput( ime_pos );  			}  		} diff --git a/indra/llui/llview.cpp b/indra/llui/llview.cpp index 4d3bdaed98..a047f9912e 100644 --- a/indra/llui/llview.cpp +++ b/indra/llui/llview.cpp @@ -797,6 +797,7 @@ BOOL LLView::setLabelArg(const LLString& key, const LLStringExplicit& text)  	return FALSE;  } +// virtual  void LLView::onVisibilityChange ( BOOL new_visibility )  {  	for ( child_list_iter_t child_it = mChildList.begin(); child_it != mChildList.end(); ++child_it) diff --git a/indra/llwindow/llwindowwin32.cpp b/indra/llwindow/llwindowwin32.cpp index 0286623662..e5fd0f7360 100644 --- a/indra/llwindow/llwindowwin32.cpp +++ b/indra/llwindow/llwindowwin32.cpp @@ -89,6 +89,7 @@ void show_window_creation_error(const char* title)  BOOL LLWindowWin32::sIsClassRegistered = FALSE;  BOOL	LLWindowWin32::sLanguageTextInputAllowed = TRUE; +BOOL	LLWindowWin32::sWinIMEOpened = FALSE;  HKL		LLWindowWin32::sWinInputLocale = 0;  DWORD	LLWindowWin32::sWinIMEConversionMode = IME_CMODE_NATIVE;  DWORD	LLWindowWin32::sWinIMESentenceMode = IME_SMODE_AUTOMATIC; @@ -3325,7 +3326,7 @@ void LLWindowWin32::focusClient()  void LLWindowWin32::allowLanguageTextInput(BOOL b)  { -	if ( !LLWinImm::isAvailable() ) +	if (b == sLanguageTextInputAllowed || !LLWinImm::isAvailable())  	{  		return;  	} @@ -3336,14 +3337,13 @@ void LLWindowWin32::allowLanguageTextInput(BOOL b)  		// Allowing: Restore the previous IME status, so that the user has a feeling that the previous   		// text input continues naturally.  Be careful, however, the IME status is meaningful only during the user keeps   		// using same Input Locale (aka Keyboard Layout). -		HIMC himc = LLWinImm::getContext(mWindowHandle); -		LLWinImm::setOpenStatus(himc, TRUE); -		if (GetKeyboardLayout(0) == sWinInputLocale && sWinIMEConversionMode != IME_CMODE_RESERVED) +		if (sWinIMEOpened && GetKeyboardLayout(0) == sWinInputLocale)  		{ +			HIMC himc = LLWinImm::getContext(mWindowHandle); +			LLWinImm::setOpenStatus(himc, TRUE);  			LLWinImm::setConversionStatus(himc, sWinIMEConversionMode, sWinIMESentenceMode); -			sWinIMEConversionMode = IME_CMODE_RESERVED;		// Set saved state so we won't do this repeatedly +			LLWinImm::releaseContext(mWindowHandle, himc);  		} -		LLWinImm::releaseContext(mWindowHandle, himc);  	}  	else  	{ @@ -3351,10 +3351,12 @@ void LLWindowWin32::allowLanguageTextInput(BOOL b)  		// However, do it after saving the current IME  status.  We need to restore the status when  		//   allowing language text input again.  		sWinInputLocale = GetKeyboardLayout(0); -		if ( LLWinImm::isIME(sWinInputLocale) ) +		sWinIMEOpened = LLWinImm::isIME(sWinInputLocale); +		if (sWinIMEOpened)  		{  			HIMC himc = LLWinImm::getContext(mWindowHandle); -			if ( LLWinImm::getOpenStatus(himc) ) +			sWinIMEOpened = LLWinImm::getOpenStatus(himc); +			if (sWinIMEOpened)  			{  				LLWinImm::getConversionStatus(himc, &sWinIMEConversionMode, &sWinIMESentenceMode); diff --git a/indra/llwindow/llwindowwin32.h b/indra/llwindow/llwindowwin32.h index 62b1f73ced..602e06600f 100644 --- a/indra/llwindow/llwindowwin32.h +++ b/indra/llwindow/llwindowwin32.h @@ -184,6 +184,7 @@ protected:  	// They are all static, since one context is shared by all LLWindowWin32  	// instances.  	static BOOL		sLanguageTextInputAllowed; +	static BOOL		sWinIMEOpened;  	static HKL		sWinInputLocale;  	static DWORD	sWinIMEConversionMode;  	static DWORD	sWinIMESentenceMode; diff --git a/indra/newview/English.lproj/InfoPlist.strings b/indra/newview/English.lproj/InfoPlist.strings index 8929cb4226..a25f97768a 100644 --- a/indra/newview/English.lproj/InfoPlist.strings +++ b/indra/newview/English.lproj/InfoPlist.strings @@ -1,5 +1,5 @@  /* Localized versions of Info.plist keys */  CFBundleName = "Second Life"; -CFBundleShortVersionString = "Second Life version 1.18.4.3"; -CFBundleGetInfoString = "Second Life version 1.18.4.3, Copyright 2004-2007 Linden Research, Inc."; +CFBundleShortVersionString = "Second Life version 1.18.5.1"; +CFBundleGetInfoString = "Second Life version 1.18.5.1, Copyright 2004-2007 Linden Research, Inc."; diff --git a/indra/newview/Info-SecondLife.plist b/indra/newview/Info-SecondLife.plist index 0778494394..2c9f58a0c0 100644 --- a/indra/newview/Info-SecondLife.plist +++ b/indra/newview/Info-SecondLife.plist @@ -32,7 +32,7 @@  		</dict>  	</array>  	<key>CFBundleVersion</key> -	<string>1.18.4.3</string> +	<string>1.18.5.1</string>  	<key>CSResourcesFileMapped</key>  	<true/>  </dict> diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp index d7e316438c..39d4a3fc15 100644 --- a/indra/newview/llagent.cpp +++ b/indra/newview/llagent.cpp @@ -2954,6 +2954,7 @@ void LLAgent::endAnimationUpdateUI()  	// Don't let this be called more than once if the camera  	// mode hasn't changed.  --JC  	mLastCameraMode = mCameraMode; +  } @@ -4214,15 +4215,22 @@ void LLAgent::changeCameraToCustomizeAvatar(BOOL animate)  	if (animate && !mAvatarObject.isNull())  	{  		sendAnimationRequest(ANIM_AGENT_CUSTOMIZE, ANIM_REQUEST_START); +		mAvatarObject->startMotion(ANIM_AGENT_CUSTOMIZE);  		LLMotion* turn_motion = mAvatarObject->findMotion(ANIM_AGENT_CUSTOMIZE); +  		if (turn_motion)  		{  			mAnimationDuration = turn_motion->getDuration() + CUSTOMIZE_AVATAR_CAMERA_ANIM_SLOP; +  		}  		else  		{  			mAnimationDuration = gSavedSettings.getF32("ZoomTime");  		} + + + +  		gAgent.setFocusGlobal(LLVector3d::zero);  	}  	else diff --git a/indra/newview/llclassifiedstatsresponder.cpp b/indra/newview/llclassifiedstatsresponder.cpp index 3a31074ed0..7a575ca5fd 100644 --- a/indra/newview/llclassifiedstatsresponder.cpp +++ b/indra/newview/llclassifiedstatsresponder.cpp @@ -19,14 +19,14 @@  #include "llview.h"  #include "message.h" -LLClassifiedStatsResponder::LLClassifiedStatsResponder(LLViewHandle classified_panel_handle) -: mClassifiedPanelHandle(classified_panel_handle) +LLClassifiedStatsResponder::LLClassifiedStatsResponder(LLViewHandle classified_panel_handle, LLUUID classified_id) +: mClassifiedPanelHandle(classified_panel_handle), +mClassifiedID(classified_id)  {  }  /*virtual*/  void LLClassifiedStatsResponder::result(const LLSD& content)  { -	LLUUID classified_id = content["classified_id"];  	S32 teleport = content["teleport_clicks"].asInteger();  	S32 map = content["map_clicks"].asInteger();  	S32 profile = content["profile_clicks"].asInteger(); @@ -34,16 +34,15 @@ void LLClassifiedStatsResponder::result(const LLSD& content)  	S32 search_map = content["search_map_clicks"].asInteger();  	S32 search_profile = content["search_profile_clicks"].asInteger(); -	std::string msg = llformat("Clicks: %d teleport, %d map, %d profile", -									teleport + search_teleport, -									map + search_map, -									profile + search_profile); -  	LLPanelClassified* classified_panelp = (LLPanelClassified*)LLPanel::getPanelByHandle(mClassifiedPanelHandle);  	if(classified_panelp)  	{ -		classified_panelp->setClickThroughText(msg); +		classified_panelp->setClickThrough(mClassifiedID,  +											teleport + search_teleport,  +											map + search_map, +											profile + search_profile, +											true);  	}  } @@ -55,3 +54,4 @@ void LLClassifiedStatsResponder::error(U32 status, const std::string& reason)  		<< status << ": " << reason << ")" << llendl;  } + diff --git a/indra/newview/llclassifiedstatsresponder.h b/indra/newview/llclassifiedstatsresponder.h index 25ae67141c..ed19311a9a 100644 --- a/indra/newview/llclassifiedstatsresponder.h +++ b/indra/newview/llclassifiedstatsresponder.h @@ -11,11 +11,12 @@  #include "llhttpclient.h"  #include "llview.h" +#include "lluuid.h"  class LLClassifiedStatsResponder : public LLHTTPClient::Responder  {  public: -	LLClassifiedStatsResponder(LLViewHandle classified_panel_handle); +	LLClassifiedStatsResponder(LLViewHandle classified_panel_handle, LLUUID classified_id);  	//If we get back a normal response, handle it here  	virtual void result(const LLSD& content);  	//If we get back an error (not found, etc...), handle it here @@ -23,6 +24,7 @@ public:  protected:  	LLViewHandle mClassifiedPanelHandle; +	LLUUID mClassifiedID;  };  #endif // LL_LLCLASSIFIEDSTATSRESPONDER_H diff --git a/indra/newview/llfloaterchat.cpp b/indra/newview/llfloaterchat.cpp index b435ada463..5fdbf7d408 100644 --- a/indra/newview/llfloaterchat.cpp +++ b/indra/newview/llfloaterchat.cpp @@ -164,6 +164,7 @@ void LLFloaterChat::onVisibilityChange(BOOL new_visibility)  {  	// Hide the chat overlay when our history is visible.  	gConsole->setVisible( !new_visibility ); +	LLFloater::onVisibilityChange(new_visibility);  } diff --git a/indra/newview/llpanelclassified.cpp b/indra/newview/llpanelclassified.cpp index 821eaf1a72..04fb54b0a7 100644 --- a/indra/newview/llpanelclassified.cpp +++ b/indra/newview/llpanelclassified.cpp @@ -91,7 +91,8 @@ public:  		S32 profile_clicks = atoi(strings[3].c_str());  		LLPanelClassified::setClickThrough(classified_id, teleport_clicks,  										   map_clicks, -										   profile_clicks); +										   profile_clicks, +										   false);  		return true;  	}  }; @@ -127,7 +128,14 @@ LLPanelClassified::LLPanelClassified(BOOL in_finder, bool from_search)  	mProfileBtn(NULL),  	mInfoText(NULL),  	mSetBtn(NULL), -	mClickThroughText(NULL) +	mClickThroughText(NULL), +	mTeleportClicksOld(0), +	mMapClicksOld(0), +	mProfileClicksOld(0), +	mTeleportClicksNew(0), +	mMapClicksNew(0), +	mProfileClicksNew(0) +  {      sAllPanels.push_back(this); @@ -368,16 +376,12 @@ void LLPanelClassified::setClassifiedID(const LLUUID& id)  	mClassifiedID = id;  } -void LLPanelClassified::setClickThroughText(const std::string& text) -{ -	if(mClickThroughText) -		this->mClickThroughText->setText(text); -}  //static  void LLPanelClassified::setClickThrough(const LLUUID& classified_id,  										S32 teleport,  										S32 map, -										S32 profile) +										S32 profile, +										bool from_new_table)  {  	for (panel_list_t::iterator iter = sAllPanels.begin(); iter != sAllPanels.end(); ++iter)  	{ @@ -388,22 +392,29 @@ void LLPanelClassified::setClickThrough(const LLUUID& classified_id,  			continue;  		} -		// We need to see if we should use the new stat table or the old.   -		// If the SearchStatRequest capability exists, then the data will come -		// from the new table. -		std::string url = gAgent.getRegion()->getCapability("SearchStatRequest"); +		// We need to check to see if the data came from the new stat_table  +		// or the old classified table. We also need to cache the data from  +		// the two separate sources so as to display the aggregate totals. -		if (!url.empty()) +		if (from_new_table)  		{ -			return; +			self->mTeleportClicksNew = teleport; +			self->mMapClicksNew = map; +			self->mProfileClicksNew = profile; +		} +		else +		{ +			self->mTeleportClicksOld = teleport; +			self->mMapClicksOld = map; +			self->mProfileClicksOld = profile;  		}  		if (self->mClickThroughText)  		{  			std::string msg = llformat("Clicks: %d teleport, %d map, %d profile", -									teleport, -									map, -									profile); +									self->mTeleportClicksNew + self->mTeleportClicksOld, +									self->mMapClicksNew + self->mMapClicksOld, +									self->mProfileClicksNew + self->mProfileClicksOld);  			self->mClickThroughText->setText(msg);  		}  	} @@ -449,7 +460,7 @@ void LLPanelClassified::sendClassifiedInfoRequest()  		if (!url.empty())  		{  			llinfos << "Classified stat request via capability" << llendl; -			LLHTTPClient::post(url, body, new LLClassifiedStatsResponder(this->getHandle())); +			LLHTTPClient::post(url, body, new LLClassifiedStatsResponder(this->getHandle(), mClassifiedID));  		}  	}  } @@ -929,7 +940,6 @@ void LLPanelClassified::sendClassifiedClickMessage(const char* type)  	strings.push_back(mClassifiedID.asString());  	strings.push_back(type);  	LLUUID no_invoice; -	send_generic_message("classifiedclick", strings, no_invoice);  	// New classified click-through handling  	LLSD body; @@ -938,11 +948,16 @@ void LLPanelClassified::sendClassifiedClickMessage(const char* type)  	body["classified_id"] = mClassifiedID;  	std::string url = gAgent.getRegion()->getCapability("SearchStatTracking"); +	// If the capability exists send to the new database, otherwise send to the old one.  	if (!url.empty())  	{  		llinfos << "LLPanelClassified::sendClassifiedClickMessage via capability" << llendl;  		LLHTTPClient::post(url, body, new LLHTTPClient::Responder());  	} +	else +	{ +		send_generic_message("classifiedclick", strings, no_invoice); +	}  }  //////////////////////////////////////////////////////////////////////////////////////////// diff --git a/indra/newview/llpanelclassified.h b/indra/newview/llpanelclassified.h index 6ebac4c98a..a2bb29b224 100644 --- a/indra/newview/llpanelclassified.h +++ b/indra/newview/llpanelclassified.h @@ -81,7 +81,7 @@ public:  	void setClassifiedID(const LLUUID& id);  	void setClickThroughText(const std::string& text);  	static void setClickThrough(const LLUUID& classified_id, -								S32 teleport, S32 map, S32 profile); +								S32 teleport, S32 map, S32 profile, bool from_new_table);  	// check that the title is valid (E.G. starts with a number or letter)  	BOOL titleIsValid(); @@ -129,6 +129,14 @@ protected:  	LLUUID mParcelID;  	S32 mPriceForListing; +	// Needed for stat tracking +	S32 mTeleportClicksOld; +	S32 mMapClicksOld; +	S32 mProfileClicksOld; +	S32 mTeleportClicksNew; +	S32 mMapClicksNew; +	S32 mProfileClicksNew; +  	// Data will be requested on first draw  	BOOL mDataRequested; diff --git a/indra/newview/llpanelpermissions.cpp b/indra/newview/llpanelpermissions.cpp index 923f4b3115..7beba92ebb 100644 --- a/indra/newview/llpanelpermissions.cpp +++ b/indra/newview/llpanelpermissions.cpp @@ -741,17 +741,17 @@ void LLPanelPermissions::refresh()  		}  	} -	if (is_for_sale) +	childSetValue("checkbox for sale", is_for_sale); + +	// HACK: There are some old objects in world that are set for sale, +	// but are no-transfer.  We need to let users turn for-sale off, but only +	// if for-sale is set. +	bool cannot_actually_sell = !can_transfer || (!can_copy && sale_type == LLSaleInfo::FS_COPY); +	if (is_for_sale && has_change_sale_ability && cannot_actually_sell)  	{ -		childSetValue("checkbox for sale",TRUE); -		childSetTentative("checkbox for sale",!can_transfer || (!can_copy && sale_type == LLSaleInfo::FS_COPY)); +		childSetEnabled("checkbox for sale", true);  	} -	else -	{ -		childSetValue("checkbox for sale",FALSE); -		childSetTentative("checkbox for sale",false); -	} - +		  	// Check search status of objects  	BOOL all_volume = gSelectMgr->selectionAllPCode( LL_PCODE_VOLUME );  	bool include_in_search; diff --git a/indra/newview/llpanelplace.cpp b/indra/newview/llpanelplace.cpp index 459e726f87..8825ce71fc 100644 --- a/indra/newview/llpanelplace.cpp +++ b/indra/newview/llpanelplace.cpp @@ -89,6 +89,9 @@ BOOL LLPanelPlace::postBuild()  	mSnapshotCtrl->setEnabled(FALSE);      mNameEditor = LLViewerUICtrlFactory::getTextBoxByName(this, "name_editor"); +	// Text boxes appear to have a " " in them by default.  This breaks the +	// emptiness test for filling in data from the network.  Slam to empty. +	mNameEditor->setText( LLString::null );      mDescEditor = LLUICtrlFactory::getTextEditorByName(this, "desc_editor"); @@ -127,6 +130,26 @@ void LLPanelPlace::displayItemInfo(const LLInventoryItem* pItem)  	mDescEditor->setText(pItem->getDescription());  } +// Use this for search directory clicks, because we are totally +// recycling the panel and don't need to use what's there. +// +// For SLURL clicks, don't call this, because we need to cache +// the location info from the user. +void LLPanelPlace::resetLocation() +{ +	mParcelID.setNull(); +	mRequestedID.setNull(); +	mRegionID.setNull(); +	mLandmarkAssetID.setNull(); +	mPosGlobal.clearVec(); +	mPosRegion.clearVec(); +	mAuctionID = 0; +	mNameEditor->setText( LLString::null ); +	mDescEditor->setText( LLString::null ); +	mInfoEditor->setText( LLString::null ); +	mLocationEditor->setText( LLString::null ); +} +  void LLPanelPlace::setParcelID(const LLUUID& parcel_id)  {  	mParcelID = parcel_id; @@ -138,10 +161,6 @@ void LLPanelPlace::setSnapshot(const LLUUID& snapshot_id)  	mSnapshotCtrl->setImageAssetID(snapshot_id);  } -void LLPanelPlace::setName(const std::string& name) -{ -	mNameEditor->setText(name); -}  void LLPanelPlace::setLocationString(const std::string& location)  { @@ -240,11 +259,17 @@ void LLPanelPlace::processParcelInfoReply(LLMessageSystem *msg, void **)  		std::string name_str(name);  		std::string desc_str(desc); -		if(! name_str.empty() && ! self->mNameEditor->getText().empty()) +		if( !name_str.empty() +			&& self->mNameEditor->getText().empty()) +		{  			self->mNameEditor->setText(name_str); +		} -		if(! desc_str.empty() && ! self->mDescEditor->getText().empty()) +		if( !desc_str.empty() +			&& self->mDescEditor->getText().empty()) +		{  			self->mDescEditor->setText(desc_str); +		}  		LLString info_text;  		LLUIString traffic = self->getUIString("traffic_text"); @@ -280,6 +305,19 @@ void LLPanelPlace::processParcelInfoReply(LLMessageSystem *msg, void **)  		S32 region_y = llround(self->mPosRegion.mV[1]);  		S32 region_z = llround(self->mPosRegion.mV[2]); +		// If the region position is zero, grab position from the global +		if(self->mPosRegion.isExactlyZero()) +		{ +			region_x = llround(global_x) % REGION_WIDTH_UNITS; +			region_y = llround(global_y) % REGION_WIDTH_UNITS; +			region_z = llround(global_z); +		} + +		if(self->mPosGlobal.isExactlyZero()) +		{ +			self->mPosGlobal.setVec(global_x, global_y, global_z); +		} +  		LLString location = llformat("%s %d, %d, %d (%s)",  			sim_name, region_x, region_y, region_z, rating);  		self->mLocationEditor->setText(location); diff --git a/indra/newview/llpanelplace.h b/indra/newview/llpanelplace.h index 8f56eda729..c473900693 100644 --- a/indra/newview/llpanelplace.h +++ b/indra/newview/llpanelplace.h @@ -53,11 +53,17 @@ public:  	/*virtual*/ BOOL postBuild(); -	void displayItemInfo(const LLInventoryItem* pItem); +	void resetLocation(); +		// Ignore all old location information, useful if you are  +		// recycling an existing dialog and need to clear it. +  	void setParcelID(const LLUUID& parcel_id); +		// Sends a request for data about the given parcel, which will +		// only update the location if there is none already available. + +	void displayItemInfo(const LLInventoryItem* pItem);  	void setRegionID(const LLUUID& region_id) { mRegionID = region_id; }  	void setSnapshot(const LLUUID& snapshot_id); -	void setName(const std::string& name);  	void setLocationString(const std::string& location);  	void setErrorStatus(U32 status, const std::string& reason); diff --git a/indra/newview/llurldispatcher.cpp b/indra/newview/llurldispatcher.cpp index c6d9b2fbe2..51b9505980 100644 --- a/indra/newview/llurldispatcher.cpp +++ b/indra/newview/llurldispatcher.cpp @@ -154,7 +154,9 @@ bool LLURLDispatcherImpl::dispatchHelp(const std::string& url, BOOL right_mouse)  {  	if (matchPrefix(url, SLURL_SL_HELP_PREFIX))  	{ +#if LL_LIBXUL_ENABLED  		gViewerHtmlHelp.show(); +#endif // LL_LIBXUL_ENABLED  		return true;  	}  	return false; diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index 688b2889c8..a6fb7fa0b7 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -5573,7 +5573,7 @@ class LLShowAgentProfile : public view_listener_t  		LLVOAvatar* avatar = find_avatar_from_object(agent_id);  		if (avatar)  		{ -			LLFloaterAvatarInfo::show(agent_id); +			LLFloaterAvatarInfo::show( avatar->getID() );  		}  		return true;  	} diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index 2fdc040684..2011275bdb 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -132,6 +132,7 @@  #include "llappviewer.h"  #include "llfloaterworldmap.h"  #include "llviewerdisplay.h" +#include "llkeythrottle.h"  #include <boost/tokenizer.hpp> @@ -145,6 +146,12 @@  const F32 BIRD_AUDIBLE_RADIUS = 32.0f;  const F32 SIT_DISTANCE_FROM_TARGET = 0.25f;  static const F32 LOGOUT_REPLY_TIME = 3.f;	// Wait this long after LogoutReply before quitting. + +// Determine how quickly residents' scripts can issue question dialogs +// Allow bursts of up to 5 dialogs in 10 seconds. 10*2=20 seconds recovery if throttle kicks in +static const U32 LLREQUEST_PERMISSION_THROTTLE_LIMIT	= 5;     // requests +static const F32 LLREQUEST_PERMISSION_THROTTLE_INTERVAL	= 10.0f; // seconds +  extern BOOL gDebugClicks;  // function prototypes @@ -4457,6 +4464,27 @@ void process_script_question(LLMessageSystem *msg, void **user_data)  	// don't display permission requests if this object is muted - JS.  	if (gMuteListp->isMuted(taskid)) return; +	// throttle excessive requests from any specific user's scripts +	LLString throttle_owner_name = owner_name; +	typedef LLKeyThrottle<LLString> LLStringThrottle; +	static LLStringThrottle question_throttle( LLREQUEST_PERMISSION_THROTTLE_LIMIT, LLREQUEST_PERMISSION_THROTTLE_INTERVAL ); + +	switch (question_throttle.noteAction(throttle_owner_name)) +	{ +		case LLStringThrottle::THROTTLE_NEWLY_BLOCKED: +			llinfos << "process_script_question throttled" +					<< " owner_name:" << owner_name +					<< llendl; +			// Fall through + +		case LLStringThrottle::THROTTLE_BLOCKED: +			// Escape altogether until we recover +			return; + +		case LLStringThrottle::THROTTLE_OK: +			break; +	} +  	LLString script_question;  	if (questions)  	{ diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp index 5bfe023168..0022212399 100644 --- a/indra/newview/llviewerregion.cpp +++ b/indra/newview/llviewerregion.cpp @@ -870,7 +870,7 @@ public:  		for(int i=0;   			locs_it != locs.endArray();  -			i++, locs_it++, agents_it++) +			i++, locs_it++)  		{  			U8   				x = locs_it->get("X").asInteger(), @@ -903,6 +903,10 @@ public:  					avatar_ids->put(agent_id);  				}  			} +			if (has_agent_data) +			{ +				agents_it++; +			}  		}  	}  }; diff --git a/scripts/update_version_files.py b/scripts/update_version_files.py index 8c500e4e08..d06e475341 100755 --- a/scripts/update_version_files.py +++ b/scripts/update_version_files.py @@ -18,6 +18,11 @@ def usage():  Options:    --version     Specify the version string to replace current version. +  --skip-on-branch +   Specify a regular expression against which the current branch +   is matched. If it matches, then leave version strings alone. +   Use this to avoid changing version strings on release candidate +   builds.    --server     Update llversionserver.h only with new version    --viewer @@ -34,6 +39,9 @@ Common Uses:     # Update server and viewer build numbers to the current SVN revision:     update_version_files.py +   # Update build numbers unless we are on a release branch: +   update_version_files.py --skip-on-branch='^Branch_' +     # Update server and viewer version numbers explicitly:     update_version_files.py --version=1.18.1.6      @@ -109,8 +117,9 @@ re_map['indra/newview/English.lproj/InfoPlist.strings'] = \        'CFBundleGetInfoString = "Second Life version %(VER_MAJOR)s.%(VER_MINOR)s.%(VER_PATCH)s.%(VER_BUILD)s')) -version_re = re.compile('(\d+).(\d+).(\d+).(\d+)') -svn_re = re.compile('Last Changed Rev: (\d+)') +version_re      = re.compile('(\d+).(\d+).(\d+).(\d+)') +svn_branch_re   = re.compile('^URL:\s+\S+/([^/\s]+)$', re.MULTILINE) +svn_revision_re = re.compile('^Last Changed Rev: (\d+)$', re.MULTILINE)  def main():      script_path = os.path.dirname(__file__) @@ -119,15 +128,25 @@ def main():      opts, args = getopt.getopt(sys.argv[1:],                                 "", -                               ['version=', 'channel=', 'server_channel=', 'verbose', 'server', 'viewer', 'help']) +                               ['version=', +                                'channel=', +                                'server_channel=', +                                'skip-on-branch=', +                                'verbose', +                                'server', +                                'viewer', +                                'help'])      update_server = False      update_viewer = False      new_version = None      new_viewer_channel = None      new_server_channel = None +    skip_on_branch_re = None      for o,a in opts:          if o in ('--version'):              new_version = a +        if o in ('--skip-on-branch'): +            skip_on_branch_re = re.compile(a)          if o in ('--channel'):              new_viewer_channel = a          if o in ('--server_channel'): @@ -193,16 +212,23 @@ def main():          # Assume we're updating just the build number          cl = 'svn info "%s"' % src_root          status, output = _getstatusoutput(cl) -        #print -        #print "svn info output:" -        #print "----------------" -        #print output -        m = svn_re.search(output) -        if not m: +        if verbose: +            print +            print "svn info output:" +            print "----------------" +            print output + +        branch_match = svn_branch_re.search(output) +        revision_match = svn_revision_re.search(output) +        if not branch_match or not revision_match:              print "Failed to execute svn info, output follows:"              print output              return -1 -        revision = m.group(1) +        branch = branch_match.group(1) +        revision = revision_match.group(1) +        if skip_on_branch_re and skip_on_branch_re.match(branch): +            print "Release Candidate Build, leaving version files untouched." +            return 0          if update_viewer:              m = version_re.match(viewer_version)              viewer_version = m.group(1)+"."+m.group(2)+"."+m.group(3)+"."+revision | 
