From 0f00eef21798520bcfe27ae03b3f1b2ae938ff13 Mon Sep 17 00:00:00 2001
From: Josh Bell <josh@lindenlab.com>
Date: Thu, 1 Nov 2007 23:10:05 +0000
Subject: svn merge -r 71509:72877
 svn+ssh://svn.lindenlab.com/svn/linden/branches/Branch_1-18-4-Viewer -->
 release

Backport patches and translations from RC branch
---
 indra/newview/English.lproj/InfoPlist.strings |  4 +-
 indra/newview/Info-SecondLife.plist           |  2 +-
 indra/newview/llagent.cpp                     |  5 +-
 indra/newview/llfloaterlandholdings.cpp       | 17 ++----
 indra/newview/llfloaterproperties.cpp         |  6 +-
 indra/newview/llfloaterregioninfo.cpp         |  3 +-
 indra/newview/llmaniprotate.cpp               | 17 +++---
 indra/newview/llmanipscale.cpp                | 45 ++++++++-------
 indra/newview/llmaniptranslate.cpp            | 21 ++++---
 indra/newview/llpanelclassified.cpp           | 14 +++--
 indra/newview/llpanelface.cpp                 |  2 +-
 indra/newview/llpanelgroup.cpp                |  6 ++
 indra/newview/llpanelgroupgeneral.cpp         |  4 +-
 indra/newview/llpanelgrouplandmoney.cpp       |  2 +-
 indra/newview/llpanelpermissions.cpp          |  2 +-
 indra/newview/llpanelplace.cpp                | 12 ++--
 indra/newview/llselectmgr.cpp                 | 48 ++++++++++------
 indra/newview/llselectmgr.h                   | 12 ++++
 indra/newview/llsrv.cpp                       | 17 +++++-
 indra/newview/lltooldraganddrop.cpp           | 83 +++++++++++++--------------
 indra/newview/llworldmapview.cpp              |  1 +
 21 files changed, 185 insertions(+), 138 deletions(-)

(limited to 'indra/newview')

diff --git a/indra/newview/English.lproj/InfoPlist.strings b/indra/newview/English.lproj/InfoPlist.strings
index 420236c7d6..94d1db1798 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.3.5";
-CFBundleGetInfoString = "Second Life version 1.18.3.5, Copyright 2004-2007 Linden Research, Inc.";
+CFBundleShortVersionString = "Second Life version 1.18.4.2";
+CFBundleGetInfoString = "Second Life version 1.18.4.2, Copyright 2004-2007 Linden Research, Inc.";
diff --git a/indra/newview/Info-SecondLife.plist b/indra/newview/Info-SecondLife.plist
index 263babe019..cee5a98bff 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.3.5</string>
+	<string>1.18.4.2</string>
 	<key>CSResourcesFileMapped</key>
 	<true/>
 </dict>
diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp
index fb411315ae..a19107dd9c 100644
--- a/indra/newview/llagent.cpp
+++ b/indra/newview/llagent.cpp
@@ -5130,6 +5130,8 @@ void update_group_floaters(const LLUUID& group_id)
 		// update the talk view
 		gIMMgr->refresh();
 	}
+
+	gAgent.fireEvent(new LLEvent(&gAgent, "new group"), "");
 }
 
 // static
@@ -5219,7 +5221,6 @@ void LLAgent::processAgentGroupDataUpdate(LLMessageSystem *msg, void **)
 		if (need_floater_update)
 		{
 			update_group_floaters(group.mID);
-			gAgent.fireEvent(new LLEvent(&gAgent, "new group"), "");
 		}
 	}
 
@@ -5321,8 +5322,6 @@ void LLAgent::processAgentDataUpdate(LLMessageSystem *msg, void **)
 	}		
 
 	update_group_floaters(active_id);
-
-	gAgent.fireEvent(new LLEvent(&gAgent, "new group"), "");
 }
 
 // static
diff --git a/indra/newview/llfloaterlandholdings.cpp b/indra/newview/llfloaterlandholdings.cpp
index 5aac949f20..bccabb356f 100644
--- a/indra/newview/llfloaterlandholdings.cpp
+++ b/indra/newview/llfloaterlandholdings.cpp
@@ -116,8 +116,10 @@ BOOL LLFloaterLandHoldings::postBuild()
 		element["columns"][0]["value"] = gAgent.mGroups.get(i).mName;
 		element["columns"][0]["font"] = "SANSSERIF";
 
+		LLUIString areastr = getUIString("area_string");
+		areastr.setArg("[AREA]", llformat("%d", gAgent.mGroups.get(i).mContribution));
 		element["columns"][1]["column"] = "area";
-		element["columns"][1]["value"] = llformat("%d sq. meters", gAgent.mGroups.get(i).mContribution);
+		element["columns"][1]["value"] = areastr;
 		element["columns"][1]["font"] = "SANSSERIF";
 
 		list->addElement(element, ADD_SORTED);
@@ -315,14 +317,7 @@ void LLFloaterLandHoldings::refreshAggregates()
 	S32 current_area = gStatusBar->getSquareMetersCommitted();
 	S32 available_area = gStatusBar->getSquareMetersLeft();
 
-	char buffer[MAX_STRING];		/* Flawfinder: ignore */
-
-	snprintf(buffer, MAX_STRING, "%d sq. meters", allowed_area);			/* Flawfinder: ignore */
-	childSetValue("allowed_text", LLSD(buffer));
-
-	snprintf(buffer, MAX_STRING, "%d sq. meters", current_area);			/* Flawfinder: ignore */
-	childSetValue("current_text", LLSD(buffer));
-
-	snprintf(buffer, MAX_STRING, "%d sq. meters", available_area);			/* Flawfinder: ignore */
-	childSetValue("available_text", LLSD(buffer));
+	childSetTextArg("allowed_text", "[AREA]", llformat("%d",allowed_area));
+	childSetTextArg("current_text", "[AREA]", llformat("%d",current_area));
+	childSetTextArg("available_text", "[AREA]", llformat("%d",available_area));
 }
diff --git a/indra/newview/llfloaterproperties.cpp b/indra/newview/llfloaterproperties.cpp
index af2a717ff7..538e8415a0 100644
--- a/indra/newview/llfloaterproperties.cpp
+++ b/indra/newview/llfloaterproperties.cpp
@@ -557,14 +557,14 @@ void LLFloaterProperties::refreshFromItem(LLInventoryItem* item)
 	if (is_for_sale)
 	{
 		radioSaleType->setSelectedIndex((S32)sale_info.getSaleType() - 1);
-		std::string numerical_price;
+		S32 numerical_price;
 		numerical_price = sale_info.getSalePrice();
-		childSetText("EditPrice",numerical_price);
+		childSetText("EditPrice",llformat("%d",numerical_price));
 	}
 	else
 	{
 		radioSaleType->setSelectedIndex(-1);
-		childSetText("EditPrice",LLString::null);
+		childSetText("EditPrice",llformat("%d",0));
 	}
 }
 
diff --git a/indra/newview/llfloaterregioninfo.cpp b/indra/newview/llfloaterregioninfo.cpp
index 5833c2f17d..20f3192939 100644
--- a/indra/newview/llfloaterregioninfo.cpp
+++ b/indra/newview/llfloaterregioninfo.cpp
@@ -716,10 +716,11 @@ BOOL LLPanelRegionGeneralInfo::sendUpdate()
 		body["allow_land_resell"] = childGetValue("allow_land_resell_check");
 		body["agent_limit"] = childGetValue("agent_limit_spin");
 		body["prim_bonus"] = childGetValue("object_bonus_spin");
-		body["sim_access"] = childGetValue("access_combo");
+		body["sim_access"] = LLViewerRegion::stringToAccess(childGetValue("access_combo").asString().c_str());
 		body["restrict_pushobject"] = childGetValue("restrict_pushobject");
 		body["allow_parcel_changes"] = childGetValue("allow_parcel_changes_check");
 		body["block_parcel_search"] = childGetValue("block_parcel_search_check");
+
 		LLHTTPClient::post(url, body, new LLHTTPClient::Responder());
 	}
 	else
diff --git a/indra/newview/llmaniprotate.cpp b/indra/newview/llmaniprotate.cpp
index 15559bc1db..fb3de3ab56 100644
--- a/indra/newview/llmaniprotate.cpp
+++ b/indra/newview/llmaniprotate.cpp
@@ -456,15 +456,18 @@ BOOL LLManipRotate::handleMouseUp(S32 x, S32 y, MASK mask)
 	// first, perform normal processing in case this was a quick-click
 	handleHover(x, y, mask);
 
-	mManipPart = LL_NO_PART;
+	if( hasMouseCapture() )
+	{
+		mManipPart = LL_NO_PART;
 
-	// Might have missed last update due to timing.
-	gSelectMgr->sendMultipleUpdate( UPD_ROTATION | UPD_POSITION );
-	gSelectMgr->enableSilhouette(TRUE);
-	//gAgent.setObjectTracking(gSavedSettings.getBOOL("TrackFocusObject"));
+		// Might have missed last update due to timing.
+		gSelectMgr->sendMultipleUpdate( UPD_ROTATION | UPD_POSITION );
+		gSelectMgr->enableSilhouette(TRUE);
+		//gAgent.setObjectTracking(gSavedSettings.getBOOL("TrackFocusObject"));
 
-	gSelectMgr->updateSelectionCenter();
-	gSelectMgr->saveSelectedObjectTransform(SELECT_ACTION_TYPE_PICK);
+		gSelectMgr->updateSelectionCenter();
+		gSelectMgr->saveSelectedObjectTransform(SELECT_ACTION_TYPE_PICK);
+	}
 
 	return LLManip::handleMouseUp(x, y, mask);
 }
diff --git a/indra/newview/llmanipscale.cpp b/indra/newview/llmanipscale.cpp
index 7df5311aa4..a67e3fcce6 100644
--- a/indra/newview/llmanipscale.cpp
+++ b/indra/newview/llmanipscale.cpp
@@ -374,29 +374,32 @@ BOOL LLManipScale::handleMouseUp(S32 x, S32 y, MASK mask)
 	// first, perform normal processing in case this was a quick-click
 	handleHover(x, y, mask);
 
-	if( (LL_FACE_MIN <= (S32)mManipPart) 
-		&& ((S32)mManipPart <= LL_FACE_MAX) )
-	{
-		sendUpdates(TRUE,TRUE,FALSE);
-	}
-	else
-	if( (LL_CORNER_MIN <= (S32)mManipPart) 
-		&& ((S32)mManipPart <= LL_CORNER_MAX) )
+	if( hasMouseCapture() )
 	{
-		sendUpdates(TRUE,TRUE,TRUE);
-	}
-	
-	//send texture update
-	gSelectMgr->adjustTexturesByScale(TRUE, getStretchTextures());
-	
-	gSelectMgr->enableSilhouette(TRUE);
-	mManipPart = LL_NO_PART;
+		if( (LL_FACE_MIN <= (S32)mManipPart) 
+			&& ((S32)mManipPart <= LL_FACE_MAX) )
+		{
+			sendUpdates(TRUE,TRUE,FALSE);
+		}
+		else
+		if( (LL_CORNER_MIN <= (S32)mManipPart) 
+			&& ((S32)mManipPart <= LL_CORNER_MAX) )
+		{
+			sendUpdates(TRUE,TRUE,TRUE);
+		}
+		
+		//send texture update
+		gSelectMgr->adjustTexturesByScale(TRUE, getStretchTextures());
+		
+		gSelectMgr->enableSilhouette(TRUE);
+		mManipPart = LL_NO_PART;
 
-	// Might have missed last update due to UPDATE_DELAY timing
-	gSelectMgr->sendMultipleUpdate( mLastUpdateFlags );
-	
-	//gAgent.setObjectTracking(gSavedSettings.getBOOL("TrackFocusObject"));
-	gSelectMgr->saveSelectedObjectTransform(SELECT_ACTION_TYPE_PICK);
+		// Might have missed last update due to UPDATE_DELAY timing
+		gSelectMgr->sendMultipleUpdate( mLastUpdateFlags );
+		
+		//gAgent.setObjectTracking(gSavedSettings.getBOOL("TrackFocusObject"));
+		gSelectMgr->saveSelectedObjectTransform(SELECT_ACTION_TYPE_PICK);
+	}
 	return LLManip::handleMouseUp(x, y, mask);
 }
 
diff --git a/indra/newview/llmaniptranslate.cpp b/indra/newview/llmaniptranslate.cpp
index 1f52f30c88..1963b1a8f5 100644
--- a/indra/newview/llmaniptranslate.cpp
+++ b/indra/newview/llmaniptranslate.cpp
@@ -1037,16 +1037,19 @@ BOOL LLManipTranslate::handleMouseUp(S32 x, S32 y, MASK mask)
 	// first, perform normal processing in case this was a quick-click
 	handleHover(x, y, mask);
 
-	// make sure arrow colors go back to normal
-	mManipPart = LL_NO_PART;
-	gSelectMgr->enableSilhouette(TRUE);
+	if(hasMouseCapture())
+	{
+		// make sure arrow colors go back to normal
+		mManipPart = LL_NO_PART;
+		gSelectMgr->enableSilhouette(TRUE);
 
-	// Might have missed last update due to UPDATE_DELAY timing.
-	gSelectMgr->sendMultipleUpdate( UPD_POSITION );
-	
-	mInSnapRegime = FALSE;
-	gSelectMgr->saveSelectedObjectTransform(SELECT_ACTION_TYPE_PICK);
-	//gAgent.setObjectTracking(gSavedSettings.getBOOL("TrackFocusObject"));
+		// Might have missed last update due to UPDATE_DELAY timing.
+		gSelectMgr->sendMultipleUpdate( UPD_POSITION );
+		
+		mInSnapRegime = FALSE;
+		gSelectMgr->saveSelectedObjectTransform(SELECT_ACTION_TYPE_PICK);
+		//gAgent.setObjectTracking(gSavedSettings.getBOOL("TrackFocusObject"));
+	}
 
 	return LLManip::handleMouseUp(x, y, mask);
 }
diff --git a/indra/newview/llpanelclassified.cpp b/indra/newview/llpanelclassified.cpp
index 13e6478dcb..cb75f1606e 100644
--- a/indra/newview/llpanelclassified.cpp
+++ b/indra/newview/llpanelclassified.cpp
@@ -701,9 +701,12 @@ void LLPanelClassified::refresh()
 		//mEnabledCheck->setEnabled(is_self);
 		mMatureCheck->setEnabled(is_self);
 
-		mAutoRenewCheck->setEnabled(is_self);
-		mAutoRenewCheck->setVisible(is_self);
-
+		if (mAutoRenewCheck)
+		{
+			mAutoRenewCheck->setEnabled(is_self);
+			mAutoRenewCheck->setVisible(is_self);
+		}
+		
 		mClickThroughText->setEnabled(is_self);
 		mClickThroughText->setVisible(is_self);
 
@@ -801,7 +804,10 @@ void LLPanelClassified::confirmPublish(S32 option)
 	mLocationChanged = false;
 	mCategoryCombo->resetDirty();
 	mMatureCheck->resetDirty();
-	mAutoRenewCheck->resetDirty();
+	if (mAutoRenewCheck)
+	{
+		mAutoRenewCheck->resetDirty();
+	}
 }
 
 // static
diff --git a/indra/newview/llpanelface.cpp b/indra/newview/llpanelface.cpp
index 63e25d9f2d..8dbe72fdfe 100644
--- a/indra/newview/llpanelface.cpp
+++ b/indra/newview/llpanelface.cpp
@@ -480,7 +480,7 @@ void LLPanelFace::getState()
 			{
 				F32 get(LLViewerObject* object, S32 face)
 				{
-					return object->getTE(face)->mScaleS;
+					return object->getTE(face)->mScaleT;
 				}
 			} func;
 			identical = gSelectMgr->getSelection()->getSelectedTEValue( &func, scale_t );
diff --git a/indra/newview/llpanelgroup.cpp b/indra/newview/llpanelgroup.cpp
index a96b66984b..99744c9653 100644
--- a/indra/newview/llpanelgroup.cpp
+++ b/indra/newview/llpanelgroup.cpp
@@ -614,6 +614,12 @@ void LLPanelGroup::draw()
 		mRefreshTimer.stop();
 		childEnable("btn_refresh");
 	}
+	if (mCurrentTab)
+	{
+		LLString mesg;
+		childSetEnabled("btn_apply", mCurrentTab->needsApply(mesg));
+	}
+
 }
 
 void LLPanelGroup::refreshData()
diff --git a/indra/newview/llpanelgroupgeneral.cpp b/indra/newview/llpanelgroupgeneral.cpp
index dfb9bbb175..3ad65b5e68 100644
--- a/indra/newview/llpanelgroupgeneral.cpp
+++ b/indra/newview/llpanelgroupgeneral.cpp
@@ -392,9 +392,7 @@ void LLPanelGroupGeneral::openProfile(void* data)
 
 bool LLPanelGroupGeneral::needsApply(LLString& mesg)
 { 
-	llinfos << "LLPanelGroupGeneral::needsApply(LLString& mesg)  " << mChanged << llendl;
-
-	mesg = "General group information has changed."; 
+	mesg = getUIString("group_info_unchanged");
 	return mChanged || mGroupID.isNull();
 }
 
diff --git a/indra/newview/llpanelgrouplandmoney.cpp b/indra/newview/llpanelgrouplandmoney.cpp
index a6ffe4f922..4c12aa2218 100644
--- a/indra/newview/llpanelgrouplandmoney.cpp
+++ b/indra/newview/llpanelgrouplandmoney.cpp
@@ -573,7 +573,7 @@ bool LLPanelGroupLandMoney::apply(LLString& mesg)
 {
 	if (!mImplementationp->applyContribution() )
 	{
-		mesg.assign("Unable to set your land contribution.");
+		mesg.assign(getUIString("land_contrib_error")); 
 		return false;
 	}
 
diff --git a/indra/newview/llpanelpermissions.cpp b/indra/newview/llpanelpermissions.cpp
index 3d5723ed7d..923f4b3115 100644
--- a/indra/newview/llpanelpermissions.cpp
+++ b/indra/newview/llpanelpermissions.cpp
@@ -756,7 +756,7 @@ void LLPanelPermissions::refresh()
 	BOOL all_volume = gSelectMgr->selectionAllPCode( LL_PCODE_VOLUME );
 	bool include_in_search;
 	bool all_include_in_search = gSelectMgr->selectionGetIncludeInSearch(&include_in_search);
-	childSetEnabled("search_check", is_perm_modify && all_volume);
+	childSetEnabled("search_check", has_change_sale_ability && all_volume);
 	childSetValue("search_check", include_in_search);
 	childSetTentative("search_check", ! all_include_in_search);
 
diff --git a/indra/newview/llpanelplace.cpp b/indra/newview/llpanelplace.cpp
index 48dcd69a4d..459e726f87 100644
--- a/indra/newview/llpanelplace.cpp
+++ b/indra/newview/llpanelplace.cpp
@@ -247,21 +247,21 @@ void LLPanelPlace::processParcelInfoReply(LLMessageSystem *msg, void **)
 			self->mDescEditor->setText(desc_str);
 
 		LLString info_text;
-		LLUIString traffic = self->childGetText("traffic_text");
+		LLUIString traffic = self->getUIString("traffic_text");
 		traffic.setArg("[TRAFFIC]", llformat("%d ", (int)dwell));
 		info_text = traffic;
-		LLUIString area = self->childGetText("area_text");
-		area.setArg("[AREA]", llformat("%d ", actual_area));
+		LLUIString area = self->getUIString("area_text");
+		area.setArg("[AREA]", llformat("%d", actual_area));
 		info_text += area;
 		if (flags & DFQ_FOR_SALE)
 		{
-			LLUIString forsale = self->childGetText("forsale_text");
-			forsale.setArg("[PRICE]", llformat("%d ", sale_price));
+			LLUIString forsale = self->getUIString("forsale_text");
+			forsale.setArg("[PRICE]", llformat("%d", sale_price));
 			info_text += forsale;
 		}
 		if (auction_id != 0)
 		{
-			LLUIString auction = self->childGetText("auction_text");
+			LLUIString auction = self->getUIString("auction_text");
 			auction.setArg("[ID]", llformat("%010d ", auction_id));
 			info_text += auction;
 		}
diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp
index d48fa405ba..3c29cfdbfc 100644
--- a/indra/newview/llselectmgr.cpp
+++ b/indra/newview/llselectmgr.cpp
@@ -2232,8 +2232,8 @@ BOOL LLSelectMgr::selectGetCreator(LLUUID& result_id, LLString& name)
 	BOOL identical = TRUE;
 	BOOL first = TRUE;
 	LLUUID first_id;
-	for (LLObjectSelection::root_iterator iter = getSelection()->root_begin();
-		 iter != getSelection()->root_end(); iter++ )
+	for (LLObjectSelection::root_object_iterator iter = getSelection()->root_object_begin();
+		 iter != getSelection()->root_object_end(); iter++ )
 	{
 		LLSelectNode* node = *iter;	
 		if (!node->mValid)
@@ -2255,7 +2255,11 @@ BOOL LLSelectMgr::selectGetCreator(LLUUID& result_id, LLString& name)
 			}
 		}
 	}
-
+	if (first_id.isNull())
+	{
+		return FALSE;
+	}
+	
 	result_id = first_id;
 	
 	if (identical)
@@ -2286,8 +2290,8 @@ BOOL LLSelectMgr::selectGetOwner(LLUUID& result_id, LLString& name)
 	BOOL first = TRUE;
 	BOOL first_group_owned = FALSE;
 	LLUUID first_id;
-	for (LLObjectSelection::root_iterator iter = getSelection()->root_begin();
-		 iter != getSelection()->root_end(); iter++ )
+	for (LLObjectSelection::root_object_iterator iter = getSelection()->root_object_begin();
+		 iter != getSelection()->root_object_end(); iter++ )
 	{
 		LLSelectNode* node = *iter;	
 		if (!node->mValid)
@@ -2312,6 +2316,10 @@ BOOL LLSelectMgr::selectGetOwner(LLUUID& result_id, LLString& name)
 			}
 		}
 	}
+	if (first_id.isNull())
+	{
+		return FALSE;
+	}
 
 	result_id = first_id;
 	
@@ -2354,8 +2362,8 @@ BOOL LLSelectMgr::selectGetLastOwner(LLUUID& result_id, LLString& name)
 	BOOL identical = TRUE;
 	BOOL first = TRUE;
 	LLUUID first_id;
-	for (LLObjectSelection::root_iterator iter = getSelection()->root_begin();
-		 iter != getSelection()->root_end(); iter++ )
+	for (LLObjectSelection::root_object_iterator iter = getSelection()->root_object_begin();
+		 iter != getSelection()->root_object_end(); iter++ )
 	{
 		LLSelectNode* node = *iter;	
 		if (!node->mValid)
@@ -2377,6 +2385,10 @@ BOOL LLSelectMgr::selectGetLastOwner(LLUUID& result_id, LLString& name)
 			}
 		}
 	}
+	if (first_id.isNull())
+	{
+		return FALSE;
+	}
 
 	result_id = first_id;
 	
@@ -2415,8 +2427,8 @@ BOOL LLSelectMgr::selectGetGroup(LLUUID& result_id)
 	BOOL identical = TRUE;
 	BOOL first = TRUE;
 	LLUUID first_id;
-	for (LLObjectSelection::root_iterator iter = getSelection()->root_begin();
-		 iter != getSelection()->root_end(); iter++ )
+	for (LLObjectSelection::root_object_iterator iter = getSelection()->root_object_begin();
+		 iter != getSelection()->root_object_end(); iter++ )
 	{
 		LLSelectNode* node = *iter;	
 		if (!node->mValid)
@@ -2438,6 +2450,10 @@ BOOL LLSelectMgr::selectGetGroup(LLUUID& result_id)
 			}
 		}
 	}
+	if (first_id.isNull())
+	{
+		return FALSE;
+	}
 	
 	result_id = first_id;
 
@@ -2452,8 +2468,8 @@ BOOL LLSelectMgr::selectGetGroup(LLUUID& result_id)
 BOOL LLSelectMgr::selectIsGroupOwned()
 {
 	BOOL found_one = FALSE;
-	for (LLObjectSelection::root_iterator iter = getSelection()->root_begin();
-		 iter != getSelection()->root_end(); iter++ )
+	for (LLObjectSelection::root_object_iterator iter = getSelection()->root_object_begin();
+		 iter != getSelection()->root_object_end(); iter++ )
 	{
 		LLSelectNode* node = *iter;	
 		if (!node->mValid)
@@ -3965,14 +3981,8 @@ void LLSelectMgr::sendListToRegions(const LLString& message_name,
 		push_editable(std::queue<LLSelectNode*>& n) : nodes_to_send(n) {}
 		virtual bool apply(LLSelectNode* node)
 		{
-			// look and see if this object is actually modifiable by the current agent, because if it's not, then there's little
-			// point in pushing it up to the server to be updated, since we couldn't change it anyway.
-			// That just results in errors on screen when this function gets called by other things, like pulling down a drop down menu
-			LLViewerObject* object = node->getObject();
-			if( object && (object->permModify() || gAgent.allowOperation(PERM_MODIFY, *node->mPermissions) || gAgent.allowOperation(PERM_MOVE, *node->mPermissions)))
-			{
-				nodes_to_send.push(node);
-			}
+
+			nodes_to_send.push(node);
 			return true;
 		}
 	};
diff --git a/indra/newview/llselectmgr.h b/indra/newview/llselectmgr.h
index 26b919ba28..071aa15236 100644
--- a/indra/newview/llselectmgr.h
+++ b/indra/newview/llselectmgr.h
@@ -254,6 +254,18 @@ public:
 	valid_root_iterator valid_root_begin() { return valid_root_iterator(mList.begin(), mList.end()); }
 	valid_root_iterator valid_root_end() { return valid_root_iterator(mList.end(), mList.end()); }
 	
+	struct is_root_object
+	{
+		bool operator()(LLSelectNode* node)
+		{
+			LLViewerObject* object = node->getObject();
+			return (object != NULL) && (object->isRootEdit() || object->isJointChild());
+		}
+	};
+	typedef boost::filter_iterator<is_root_object, list_t::iterator > root_object_iterator;
+	root_object_iterator root_object_begin() { return root_object_iterator(mList.begin(), mList.end()); }
+	root_object_iterator root_object_end() { return root_object_iterator(mList.end(), mList.end()); }
+	
 public:
 	LLObjectSelection();
 
diff --git a/indra/newview/llsrv.cpp b/indra/newview/llsrv.cpp
index 150fcb1583..7271513852 100644
--- a/indra/newview/llsrv.cpp
+++ b/indra/newview/llsrv.cpp
@@ -51,6 +51,19 @@ std::vector<std::string> LLSRV::rewriteURI(const std::string& uri)
 	LLPointer<Responder> resp = new Responder;
 
 	gAres->rewriteURI(uri, resp);
-	gAres->processAll();
-	return resp->mUris;
+ 	gAres->processAll();
+
+	// It's been observed in deployment that c-ares can return control
+	// to us without firing all of our callbacks, in which case the
+	// returned vector will be empty, instead of a singleton as we
+	// might wish.
+
+	if (!resp->mUris.empty())
+	{
+		return resp->mUris;
+	}
+
+	std::vector<std::string> uris;
+	uris.push_back(uri);
+	return uris;
 }
diff --git a/indra/newview/lltooldraganddrop.cpp b/indra/newview/lltooldraganddrop.cpp
index 0be4212399..1f607def58 100644
--- a/indra/newview/lltooldraganddrop.cpp
+++ b/indra/newview/lltooldraganddrop.cpp
@@ -1409,7 +1409,46 @@ void LLToolDragAndDrop::dropObject(LLViewerObject* raycast_target,
 	{
 		LLFirstUse::useSandbox();
 	}
+	// check if it cannot be copied, and mark as remove if it is -
+	// this will remove the object from inventory after rez. Only
+	// bother with this check if we would not normally remove from
+	// inventory.
+	if(!remove_from_inventory
+		&& !item->getPermissions().allowCopyBy(gAgent.getID()))
+	{
+		remove_from_inventory = TRUE;
+	}
+
+	// Limit raycast to a single object.  
+	// Speeds up server raycast + avoid problems with server ray
+	// hitting objects that were clipped by the near plane or culled
+	// on the viewer.
+	LLUUID ray_target_id;
+	if( raycast_target )
+	{
+		ray_target_id = raycast_target->getID();
+	}
+	else
+	{
+		ray_target_id.setNull();
+	}
 
+	// Check if it's in the trash.
+	bool is_in_trash = false;
+	LLUUID trash_id;
+	trash_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_TRASH);
+	if(gInventory.isObjectDescendentOf(item->getUUID(), trash_id))
+	{
+		is_in_trash = true;
+		remove_from_inventory = TRUE;
+	}
+
+	LLUUID source_id = from_task_inventory ? mSourceID : LLUUID::null;
+
+	// Select the object only if we're editing.
+	BOOL rez_selected = gToolMgr->inEdit();
+
+	// Message packing code should be it's own uninterrupted block
 	LLMessageSystem* msg = gMessageSystem;
 	if (mSource == SOURCE_NOTECARD)
 	{
@@ -1430,55 +1469,13 @@ void LLToolDragAndDrop::dropObject(LLViewerObject* raycast_target,
 	// *FIX: We can probably compress this to a single byte, since I
 	// think folderid == mSourceID. This will be a later
 	// optimization.
-	if(from_task_inventory)
-	{
-		msg->addUUIDFast(_PREHASH_FromTaskID, mSourceID);
-	}
-	else
-	{
-		msg->addUUIDFast(_PREHASH_FromTaskID, LLUUID::null);
-	}
+	msg->addUUIDFast(_PREHASH_FromTaskID, source_id);
 	msg->addU8Fast(_PREHASH_BypassRaycast, (U8) bypass_sim_raycast);
 	msg->addVector3Fast(_PREHASH_RayStart, regionp->getPosRegionFromGlobal(mLastCameraPos));
 	msg->addVector3Fast(_PREHASH_RayEnd, regionp->getPosRegionFromGlobal(mLastHitPos));
-	// Limit raycast to a single object.  
-	// Speeds up server raycast + avoid problems with server ray
-	// hitting objects that were clipped by the near plane or culled
-	// on the viewer.
-	LLUUID ray_target_id;
-	if( raycast_target )
-	{
-		ray_target_id = raycast_target->getID();
-	}
-	else
-	{
-		ray_target_id.setNull();
-	}
 	msg->addUUIDFast(_PREHASH_RayTargetID, ray_target_id );
 	msg->addBOOLFast(_PREHASH_RayEndIsIntersection, FALSE);
-	// Select the object only if we're editing.
-	BOOL rez_selected = gToolMgr->inEdit();
 	msg->addBOOLFast(_PREHASH_RezSelected, rez_selected);
-
-	// check if it cannot be copied, and mark as remove if it is -
-	// this will remove the object from inventory after rez. Only
-	// bother with this check if we would not normally remove from
-	// inventory.
-	if(!remove_from_inventory
-	   && !item->getPermissions().allowCopyBy(gAgent.getID()))
-	{
-		remove_from_inventory = TRUE;
-	}
-
-	// Check if it's in the trash.
-	bool is_in_trash = false;
-	LLUUID trash_id;
-	trash_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_TRASH);
-	if(gInventory.isObjectDescendentOf(item->getUUID(), trash_id))
-	{
-		is_in_trash = true;
-		remove_from_inventory = TRUE;
-	}
 	msg->addBOOLFast(_PREHASH_RemoveItem, remove_from_inventory);
 
 	// deal with permissions slam logic
diff --git a/indra/newview/llworldmapview.cpp b/indra/newview/llworldmapview.cpp
index 188591d1f9..dc689102f3 100644
--- a/indra/newview/llworldmapview.cpp
+++ b/indra/newview/llworldmapview.cpp
@@ -898,6 +898,7 @@ void LLWorldMapView::drawAgents()
 			{
 				const LLItemInfo& info = *iter;
 				S32 agent_count = info.mExtra;
+				sim_agent_count += info.mExtra;
 				// Here's how we'd choose the color if info.mID were available but it's not being sent:
 				//LLColor4 color = (agent_count == 1 && is_agent_friend(info.mID)) ? gFriendMapColor : gAvatarMapColor;
 				drawImageStack(info.mPosGlobal, sAvatarSmallImage, agent_count, 3.f, gAvatarMapColor);
-- 
cgit v1.2.3