diff options
151 files changed, 2086 insertions, 2021 deletions
| diff --git a/indra/llappearance/llavatarappearance.cpp b/indra/llappearance/llavatarappearance.cpp index 3bb759d458..ce2b51cea2 100644 --- a/indra/llappearance/llavatarappearance.cpp +++ b/indra/llappearance/llavatarappearance.cpp @@ -291,10 +291,6 @@ LLAvatarAppearance::~LLAvatarAppearance()  	clearSkeleton();  	deleteAndClearArray(mCollisionVolumes); -	deleteAndClear(mTexSkinColor); -	deleteAndClear(mTexHairColor); -	deleteAndClear(mTexEyeColor); -  	std::for_each(mPolyMeshes.begin(), mPolyMeshes.end(), DeletePairedPointer());  	mPolyMeshes.clear(); diff --git a/indra/llcommon/llavatarname.cpp b/indra/llcommon/llavatarname.cpp index 642bd82e90..d12f157910 100755 --- a/indra/llcommon/llavatarname.cpp +++ b/indra/llcommon/llavatarname.cpp @@ -44,6 +44,7 @@ static const std::string DISPLAY_NAME_EXPIRES("display_name_expires");  static const std::string DISPLAY_NAME_NEXT_UPDATE("display_name_next_update");  bool LLAvatarName::sUseDisplayNames = true; +bool LLAvatarName::sUseUsernames = true;  // Minimum time-to-live (in seconds) for a name entry.  // Avatar name should always guarantee to expire reasonably soon by default @@ -81,6 +82,16 @@ bool LLAvatarName::useDisplayNames()  	return sUseDisplayNames;   } +void LLAvatarName::setUseUsernames(bool use) +{ +	sUseUsernames = use; +} + +bool LLAvatarName::useUsernames() +{ +	return sUseUsernames; +} +  LLSD LLAvatarName::asLLSD() const  {  	LLSD sd; @@ -168,7 +179,11 @@ std::string LLAvatarName::getCompleteName() const  		}  		else  		{ -			name = mDisplayName + " (" + mUsername + ")"; +			name = mDisplayName; +			if(sUseUsernames) +			{ +				name += " (" + mUsername + ")"; +			}  		}  	}  	else diff --git a/indra/llcommon/llavatarname.h b/indra/llcommon/llavatarname.h index 5d2fccc5ba..1cb3ae421f 100755 --- a/indra/llcommon/llavatarname.h +++ b/indra/llcommon/llavatarname.h @@ -54,6 +54,9 @@ public:  	static void setUseDisplayNames(bool use);  	static bool useDisplayNames(); +	static void setUseUsernames(bool use); +	static bool useUsernames(); +  	// A name object is valid if not temporary and not yet expired (default is expiration not checked)  	bool isValidName(F64 max_unrefreshed = 0.0f) const { return !mIsTemporaryName && (mExpires >= max_unrefreshed); } @@ -128,6 +131,9 @@ private:  	// Global flag indicating if display name should be used or not  	// This will affect the output of the high level "get" methods  	static bool sUseDisplayNames; + +	// Flag indicating if username should be shown after display name or not +	static bool sUseUsernames;  };  #endif diff --git a/indra/llcommon/llinitparam.h b/indra/llcommon/llinitparam.h index 03ab0fb67f..4bad0062a7 100755 --- a/indra/llcommon/llinitparam.h +++ b/indra/llcommon/llinitparam.h @@ -497,25 +497,25 @@ namespace LLInitParam  		virtual ~Parser();  		template <typename T> bool readValue(T& param, typename boost::disable_if<boost::is_enum<T> >::type* dummy = 0) -			{ +		{  			parser_read_func_map_t::iterator found_it = mParserReadFuncs->find(&typeid(T));  			if (found_it != mParserReadFuncs->end()) -				{ +			{  				return found_it->second(*this, (void*)¶m); -				} -			 -				return false;  			} -			 + +			return false; +		} +  		template <typename T> bool readValue(T& param, typename boost::enable_if<boost::is_enum<T> >::type* dummy = 0) -			{ +		{  			parser_read_func_map_t::iterator found_it = mParserReadFuncs->find(&typeid(T));  			if (found_it != mParserReadFuncs->end()) -				{ +			{  				return found_it->second(*this, (void*)¶m); -				} +			}  			else -		{ +			{  				found_it = mParserReadFuncs->find(&typeid(S32));  				if (found_it != mParserReadFuncs->end())  				{ @@ -523,20 +523,20 @@ namespace LLInitParam  					bool parsed = found_it->second(*this, (void*)&int_value);  					param = (T)int_value;  					return parsed; -					}  				} -				return false;  			} +			return false; +		}  		template <typename T> bool writeValue(const T& param, name_stack_t& name_stack) -			{ +		{  			parser_write_func_map_t::iterator found_it = mParserWriteFuncs->find(&typeid(T));  			if (found_it != mParserWriteFuncs->end()) -				{ +			{  				return found_it->second(*this, (const void*)¶m, name_stack); -				} -				return false;  			} +			return false; +		}  		// dispatch inspection to registered inspection functions, for each parameter in a param block  		template <typename T> bool inspectValue(name_stack_t& name_stack, S32 min_count, S32 max_count, const possible_values_t* possible_values) diff --git a/indra/llmessage/llavatarnamecache.cpp b/indra/llmessage/llavatarnamecache.cpp index 9a68093427..31dd264021 100755 --- a/indra/llmessage/llavatarnamecache.cpp +++ b/indra/llmessage/llavatarnamecache.cpp @@ -680,6 +680,15 @@ void LLAvatarNameCache::setUseDisplayNames(bool use)  	}  } +void LLAvatarNameCache::setUseUsernames(bool use) +{ +	if (use != LLAvatarName::useUsernames()) +	{ +		LLAvatarName::setUseUsernames(use); +		mUseDisplayNamesSignal(); +	} +} +  void LLAvatarNameCache::erase(const LLUUID& agent_id)  {  	sCache.erase(agent_id); diff --git a/indra/llmessage/llavatarnamecache.h b/indra/llmessage/llavatarnamecache.h index 2a8eb46187..3a19cee3ed 100755 --- a/indra/llmessage/llavatarnamecache.h +++ b/indra/llmessage/llavatarnamecache.h @@ -80,6 +80,8 @@ namespace LLAvatarNameCache  	// Set display name: flips the switch and triggers the callbacks.  	void setUseDisplayNames(bool use); +	void setUseUsernames(bool use); +  	void insert(const LLUUID& agent_id, const LLAvatarName& av_name);  	void erase(const LLUUID& agent_id); diff --git a/indra/llmessage/llregionflags.h b/indra/llmessage/llregionflags.h index 1cf940918b..40d7b04a90 100755 --- a/indra/llmessage/llregionflags.h +++ b/indra/llmessage/llregionflags.h @@ -76,6 +76,8 @@ const U64 REGION_FLAGS_DENY_ANONYMOUS			= (1 << 23);  const U64 REGION_FLAGS_ALLOW_PARCEL_CHANGES		= (1 << 26); +const U64 REGION_FLAGS_BLOCK_FLYOVER = (1 << 27); +  const U64 REGION_FLAGS_ALLOW_VOICE = (1 << 28);  const U64 REGION_FLAGS_BLOCK_PARCEL_SEARCH = (1 << 29); diff --git a/indra/llmessage/lltemplatemessagereader.cpp b/indra/llmessage/lltemplatemessagereader.cpp index ab91f74abe..94bc7cb045 100755 --- a/indra/llmessage/lltemplatemessagereader.cpp +++ b/indra/llmessage/lltemplatemessagereader.cpp @@ -91,15 +91,17 @@ void LLTemplateMessageReader::getData(const char *blockname, const char *varname  	}  	LLMsgBlkData *msg_block_data = iter->second; -	LLMsgVarData& vardata = msg_block_data->mMemberVarData[vnamep]; +	LLMsgBlkData::msg_var_data_map_t &var_data_map = msg_block_data->mMemberVarData; -	if (!vardata.getName()) +	if (var_data_map.find(vnamep) == var_data_map.end())  	{  		llerrs << "Variable "<< vnamep << " not in message "  			<< mCurrentRMessageData->mName<< " block " << bnamep << llendl;  		return;  	} +	LLMsgVarData& vardata = msg_block_data->mMemberVarData[vnamep]; +  	if (size && size != vardata.getSize())  	{  		llerrs << "Msg " << mCurrentRMessageData->mName  diff --git a/indra/llmessage/message.cpp b/indra/llmessage/message.cpp index ae95087377..c3642ccbe8 100755 --- a/indra/llmessage/message.cpp +++ b/indra/llmessage/message.cpp @@ -3032,12 +3032,23 @@ void LLMessageSystem::setExceptionFunc(EMessageException e,  BOOL LLMessageSystem::callExceptionFunc(EMessageException exception)  {  	callbacks_t::iterator it = mExceptionCallbacks.find(exception); -	if(it != mExceptionCallbacks.end()) +	if(it == mExceptionCallbacks.end())  	{ -		((*it).second.first)(this, (*it).second.second,exception); -		return TRUE; +		return FALSE;  	} -	return FALSE; + +	exception_t& ex = it->second; +	msg_exception_callback ex_cb = ex.first; + +	if (!ex_cb) +	{ +		LL_WARNS("Messaging") << "LLMessageSystem::callExceptionFunc: bad message exception callback." << llendl; +		return FALSE; +	} + +	(ex_cb)(this, ex.second, exception); + +	return TRUE;  }  void LLMessageSystem::setTimingFunc(msg_timing_callback func, void* data) diff --git a/indra/llrender/llrender.cpp b/indra/llrender/llrender.cpp index 0ac30b4d63..b481cf7095 100755 --- a/indra/llrender/llrender.cpp +++ b/indra/llrender/llrender.cpp @@ -2196,7 +2196,15 @@ void LLRender::texCoord2fv(const GLfloat* tc)  void LLRender::color4ub(const GLubyte& r, const GLubyte& g, const GLubyte& b, const GLubyte& a)  { -	mColorsp[mCount] = LLColor4U(r,g,b,a); +	if (!LLGLSLShader::sCurBoundShaderPtr || +		LLGLSLShader::sCurBoundShaderPtr->mAttributeMask & LLVertexBuffer::MAP_COLOR) +	{ +		mColorsp[mCount] = LLColor4U(r,g,b,a); +	} +	else +	{ //not using shaders or shader reads color from a uniform +		diffuseColor4ub(r,g,b,a); +	}  }  void LLRender::color4ubv(const GLubyte* c)  { diff --git a/indra/llui/llfloater.cpp b/indra/llui/llfloater.cpp index 6e6bcd6ab5..acf38afe32 100755 --- a/indra/llui/llfloater.cpp +++ b/indra/llui/llfloater.cpp @@ -1951,6 +1951,7 @@ void	LLFloater::drawShadow(LLPanel* panel)  void LLFloater::updateTransparency(LLView* view, ETypeTransparency transparency_type)  { +	if (!view) return;  	child_list_t children = *view->getChildList();  	child_list_t::iterator it = children.begin(); @@ -2742,8 +2743,6 @@ void LLFloaterView::refresh()  	}  } -const S32 FLOATER_MIN_VISIBLE_PIXELS = 16; -  void LLFloaterView::adjustToFitScreen(LLFloater* floater, BOOL allow_partial_outside, BOOL snap_in_toolbars/* = false*/)  {  	if (floater->getParent() != this) @@ -2796,11 +2795,32 @@ void LLFloaterView::adjustToFitScreen(LLFloater* floater, BOOL allow_partial_out  		}  	} +	const LLRect& left_toolbar_rect = mToolbarRects[LLToolBarEnums::TOOLBAR_LEFT]; +	const LLRect& bottom_toolbar_rect = mToolbarRects[LLToolBarEnums::TOOLBAR_BOTTOM]; +	const LLRect& right_toolbar_rect = mToolbarRects[LLToolBarEnums::TOOLBAR_RIGHT]; +	const LLRect& floater_rect = floater->getRect(); + +	S32 delta_left = left_toolbar_rect.notEmpty() ? left_toolbar_rect.mRight - floater_rect.mRight : 0; +	S32 delta_bottom = bottom_toolbar_rect.notEmpty() ? bottom_toolbar_rect.mTop - floater_rect.mTop : 0; +	S32 delta_right = right_toolbar_rect.notEmpty() ? right_toolbar_rect.mLeft - floater_rect.mLeft : 0; +  	// move window fully onscreen  	if (floater->translateIntoRect( snap_in_toolbars ? getSnapRect() : gFloaterView->getRect(), allow_partial_outside ? FLOATER_MIN_VISIBLE_PIXELS : S32_MAX ))  	{  		floater->clearSnapTarget();  	} +	else if (delta_left > 0 && floater_rect.mTop < left_toolbar_rect.mTop && floater_rect.mBottom > left_toolbar_rect.mBottom) +	{ +		floater->translate(delta_left, 0); +	} +	else if (delta_bottom > 0 && floater_rect.mLeft > bottom_toolbar_rect.mLeft && floater_rect.mRight < bottom_toolbar_rect.mRight) +	{ +		floater->translate(0, delta_bottom); +	} +	else if (delta_right < 0 && floater_rect.mTop < right_toolbar_rect.mTop	&& floater_rect.mBottom > right_toolbar_rect.mBottom) +	{ +		floater->translate(delta_right, 0); +	}  }  void LLFloaterView::draw() @@ -3000,6 +3020,14 @@ void LLFloaterView::popVisibleAll(const skip_list_t& skip_list)  	LLFloaterReg::blockShowFloaters(false);  } +void LLFloaterView::setToolbarRect(LLToolBarEnums::EToolBarLocation tb, const LLRect& toolbar_rect) +{ +	if (tb < LLToolBarEnums::TOOLBAR_COUNT) +	{ +		mToolbarRects[tb] = toolbar_rect; +	} +} +  void LLFloater::setInstanceName(const std::string& name)  {  	if (name != mInstanceName) diff --git a/indra/llui/llfloater.h b/indra/llui/llfloater.h index 75715ef296..ccaae1d02b 100755 --- a/indra/llui/llfloater.h +++ b/indra/llui/llfloater.h @@ -32,6 +32,7 @@  #define LL_FLOATER_H  #include "llpanel.h" +#include "lltoolbar.h"  #include "lluuid.h"  //#include "llnotificationsutil.h"  #include <set> @@ -514,6 +515,8 @@ private:  // LLFloaterView  // Parent of all floating panels +const S32 FLOATER_MIN_VISIBLE_PIXELS = 16; +  class LLFloaterView : public LLUICtrl  {  public: @@ -572,10 +575,13 @@ public:  	void setFloaterSnapView(LLHandle<LLView> snap_view) {mSnapView = snap_view; }  	LLFloater* getFrontmostClosableFloater();  +	void setToolbarRect(LLToolBarEnums::EToolBarLocation tb, const LLRect& toolbar_rect); +  private:  	void hiddenFloaterClosed(LLFloater* floater);  	LLRect				mLastSnapRect; +	LLRect				mToolbarRects[LLToolBarEnums::TOOLBAR_COUNT];  	LLHandle<LLView>	mSnapView;  	BOOL			mFocusCycleMode;  	S32				mSnapOffsetBottom; diff --git a/indra/llui/llfolderview.cpp b/indra/llui/llfolderview.cpp index f32a52e6c6..13d231d712 100755 --- a/indra/llui/llfolderview.cpp +++ b/indra/llui/llfolderview.cpp @@ -629,6 +629,8 @@ bool LLFolderView::startDrag()  void LLFolderView::commitRename( const LLSD& data )  {  	finishRenamingItem(); +	arrange( NULL, NULL ); +  }  void LLFolderView::draw() @@ -1599,19 +1601,21 @@ void LLFolderView::update()  	// until that inventory is loaded up.  	LLFastTimer t2(FTM_INVENTORY); -	if (getFolderViewModel()->getFilter().isModified() && getFolderViewModel()->getFilter().isNotDefault()) +	LLFolderViewFilter& filter_object = getFolderViewModel()->getFilter(); + +	if (filter_object.isModified() && filter_object.isNotDefault())  	{  		mNeedsAutoSelect = TRUE;  	}  	// Filter to determine visibility before arranging -	filter(getFolderViewModel()->getFilter()); +	filter(filter_object);  	// Clear the modified setting on the filter only if the filter finished after running the filter process  	// Note: if the filter count has timed out, that means the filter halted before completing the entire set of items -    if (getFolderViewModel()->getFilter().isModified() && (!getFolderViewModel()->getFilter().isTimedOut())) +    if (filter_object.isModified() && (!filter_object.isTimedOut()))  	{ -		getFolderViewModel()->getFilter().clearModified(); +		filter_object.clearModified();  	}  	// automatically show matching items, and select first one if we had a selection @@ -1630,7 +1634,7 @@ void LLFolderView::update()  		// Open filtered folders for folder views with mAutoSelectOverride=TRUE.  		// Used by LLPlacesFolderView. -		if (getFolderViewModel()->getFilter().showAllResults()) +		if (filter_object.showAllResults())  		{  			// these are named variables to get around gcc not binding non-const references to rvalues  			// and functor application is inherently non-const to allow for stateful functors diff --git a/indra/llui/llfolderviewmodel.h b/indra/llui/llfolderviewmodel.h index b1bcc8bbb4..a909d13f97 100755 --- a/indra/llui/llfolderviewmodel.h +++ b/indra/llui/llfolderviewmodel.h @@ -386,27 +386,36 @@ template <typename SORT_TYPE, typename ITEM_TYPE, typename FOLDER_TYPE, typename  class LLFolderViewModel : public LLFolderViewModelCommon  {  public: -	LLFolderViewModel(){} -	virtual ~LLFolderViewModel() {} -  	typedef SORT_TYPE		SortType;  	typedef ITEM_TYPE		ItemType;  	typedef FOLDER_TYPE		FolderType;  	typedef FILTER_TYPE		FilterType; -	virtual SortType& getSorter()					 { return mSorter; } -	virtual const SortType& getSorter() const 		 { return mSorter; } -	virtual void setSorter(const SortType& sorter) 	 { mSorter = sorter; requestSortAll(); } +	LLFolderViewModel(SortType* sorter, FilterType* filter)  +	:	mSorter(sorter), +		mFilter(filter) +	{} -	virtual FilterType& getFilter() 				 { return mFilter; } -	virtual const FilterType& getFilter() const		 { return mFilter; } -	virtual void setFilter(const FilterType& filter) { mFilter = filter; } +	virtual ~LLFolderViewModel()  +	{ +		delete mSorter; +		mSorter = NULL; +		delete mFilter; +		mFilter = NULL; +	} + +	virtual SortType& getSorter()					 { return *mSorter; } +	virtual const SortType& getSorter() const 		 { return *mSorter; } +	virtual void setSorter(const SortType& sorter) 	 { mSorter = new SortType(sorter); requestSortAll(); } + +	virtual FilterType& getFilter() 				 { return *mFilter; } +	virtual const FilterType& getFilter() const		 { return *mFilter; } +	virtual void setFilter(const FilterType& filter) { mFilter = new FilterType(filter); }  	// By default, we assume the content is available. If a network fetch mechanism is implemented for the model,  	// this method needs to be overloaded and return the relevant fetch status.  	virtual bool contentsReady()					{ return true; } -  	struct ViewModelCompare  	{  		ViewModelCompare(const SortType& sorter) @@ -438,8 +447,8 @@ public:  	}  protected: -	SortType		mSorter; -	FilterType		mFilter; +	SortType*		mSorter; +	FilterType*		mFilter;  };  #endif // LLFOLDERVIEWMODEL_H diff --git a/indra/llui/llscrolllistctrl.cpp b/indra/llui/llscrolllistctrl.cpp index 6e03f604a2..594e1e150b 100755 --- a/indra/llui/llscrolllistctrl.cpp +++ b/indra/llui/llscrolllistctrl.cpp @@ -1855,7 +1855,7 @@ void LLScrollListCtrl::showNameDetails(std::string id, bool is_group)  	// open the resident's details or the group details  	std::string sltype = is_group ? "group" : "agent";  	std::string slurl = "secondlife:///app/" + sltype + "/" + id + "/about"; -	LLUrlAction::clickAction(slurl); +	LLUrlAction::clickAction(slurl, true);  }  void LLScrollListCtrl::copyNameToClipboard(std::string id, bool is_group) diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp index 5ec4cf4fe5..4144a42fd6 100755 --- a/indra/llui/lltextbase.cpp +++ b/indra/llui/lltextbase.cpp @@ -167,6 +167,7 @@ LLTextBase::Params::Params()  	max_text_length("max_length", 255),  	font_shadow("font_shadow"),  	wrap("wrap"), +	trusted_content("trusted_content", true),  	use_ellipses("use_ellipses", false),  	parse_urls("parse_urls", false),  	parse_highlights("parse_highlights", false) @@ -211,6 +212,7 @@ LLTextBase::LLTextBase(const LLTextBase::Params &p)  	mLineSpacingPixels(p.line_spacing.pixels),  	mClip(p.clip),  	mClipPartial(p.clip_partial && !p.allow_scroll), +	mTrustedContent(p.trusted_content),  	mTrackEnd( p.track_end ),  	mScrollIndex(-1),  	mSelectionStart( 0 ), @@ -3164,7 +3166,7 @@ BOOL LLNormalTextSegment::handleMouseUp(S32 x, S32 y, MASK mask)  		// Only process the click if it's actually in this segment, not to the right of the end-of-line.  		if(mEditor.getSegmentAtLocalPos(x, y, false) == this)  		{ -			LLUrlAction::clickAction(getStyle()->getLinkHREF()); +			LLUrlAction::clickAction(getStyle()->getLinkHREF(), mEditor.isContentTrusted());  			return TRUE;  		}  	} diff --git a/indra/llui/lltextbase.h b/indra/llui/lltextbase.h index a74e97cac8..3603f55c3f 100755 --- a/indra/llui/lltextbase.h +++ b/indra/llui/lltextbase.h @@ -291,7 +291,8 @@ public:  								parse_urls,  								parse_highlights,  								clip, -								clip_partial; +								clip_partial, +								trusted_content;  		Optional<S32>			v_pad,  								h_pad; @@ -361,6 +362,7 @@ public:  	bool					getWordWrap() { return mWordWrap; }  	bool					getUseEllipses() { return mUseEllipses; }  	bool					truncate(); // returns true of truncation occurred +	bool					isContentTrusted() {return mTrustedContent;}  	// TODO: move into LLTextSegment?  	void					createUrlContextMenu(S32 x, S32 y, const std::string &url); // create a popup context menu for the given Url @@ -634,6 +636,7 @@ protected:  	bool						mBGVisible;			// render background?  	bool						mClip;				// clip text to widget rect  	bool						mClipPartial;		// false if we show lines that are partially inside bounding rect +	bool						mTrustedContent;	// if false, does not allow to execute SURL links from this editor  	bool						mPlainText;			// didn't use Image or Icon segments  	bool						mAutoIndent;  	S32							mMaxTextByteLength;	// Maximum length mText is allowed to be in bytes diff --git a/indra/llui/lltexteditor.cpp b/indra/llui/lltexteditor.cpp index 62140dd9d6..81d9fd1ec9 100755 --- a/indra/llui/lltexteditor.cpp +++ b/indra/llui/lltexteditor.cpp @@ -1620,7 +1620,7 @@ BOOL LLTextEditor::handleControlKey(const KEY key, const MASK mask)  		}  	} -	if (handled) +	if (handled && !gFocusMgr.getMouseCapture())  	{  		updatePrimary();  	} diff --git a/indra/llui/lltoolbar.cpp b/indra/llui/lltoolbar.cpp index 6bfe113933..e692d9847a 100755 --- a/indra/llui/lltoolbar.cpp +++ b/indra/llui/lltoolbar.cpp @@ -118,7 +118,8 @@ LLToolBar::LLToolBar(const LLToolBar::Params& p)  	mButtonLeaveSignal(NULL),  	mButtonRemoveSignal(NULL),  	mDragAndDropTarget(false), -	mCaretIcon(NULL) +	mCaretIcon(NULL), +	mCenterPanel(NULL)  {  	mButtonParams[LLToolBarEnums::BTNTYPE_ICONS_WITH_TEXT] = p.button_icon_and_text;  	mButtonParams[LLToolBarEnums::BTNTYPE_ICONS_ONLY] = p.button_icon; @@ -200,14 +201,15 @@ void LLToolBar::initFromParams(const LLToolBar::Params& p)  	center_panel_p.auto_resize = false;  	center_panel_p.user_resize = false;  	center_panel_p.mouse_opaque = false; -	LLLayoutPanel* center_panel = LLUICtrlFactory::create<LLLayoutPanel>(center_panel_p); -	mCenteringStack->addChild(center_panel); +	mCenterPanel = LLUICtrlFactory::create<LLCenterLayoutPanel>(center_panel_p); +	mCenteringStack->addChild(mCenterPanel);  	LLPanel::Params button_panel_p(p.button_panel); -	button_panel_p.rect = center_panel->getLocalRect(); -		button_panel_p.follows.flags = FOLLOWS_BOTTOM|FOLLOWS_LEFT; +	button_panel_p.rect = mCenterPanel->getLocalRect(); +	button_panel_p.follows.flags = FOLLOWS_BOTTOM|FOLLOWS_LEFT;  	mButtonPanel = LLUICtrlFactory::create<LLPanel>(button_panel_p); -	center_panel->addChild(mButtonPanel); +	mCenterPanel->setButtonPanel(mButtonPanel); +	mCenterPanel->addChild(mButtonPanel);  	mCenteringStack->addChild(LLUICtrlFactory::create<LLLayoutPanel>(border_panel_p)); @@ -1244,3 +1246,15 @@ const std::string LLToolBarButton::getToolTip() const  	return tooltip;  } +void LLToolBar::LLCenterLayoutPanel::handleReshape(const LLRect& rect, bool by_user) +{ +	LLLayoutPanel::handleReshape(rect, by_user); + +	if (!mReshapeCallback.empty()) +	{ +		LLRect r; +		localRectToOtherView(mButtonPanel->getRect(), &r, gFloaterView); +		r.stretch(FLOATER_MIN_VISIBLE_PIXELS); +		mReshapeCallback(mLocationId, r); +	} +} diff --git a/indra/llui/lltoolbar.h b/indra/llui/lltoolbar.h index 743951a41f..9e17eaed8b 100755 --- a/indra/llui/lltoolbar.h +++ b/indra/llui/lltoolbar.h @@ -125,6 +125,19 @@ namespace LLToolBarEnums  		SIDE_TOP,  	}; +	enum EToolBarLocation +	{ +		TOOLBAR_NONE = 0, +		TOOLBAR_LEFT, +		TOOLBAR_RIGHT, +		TOOLBAR_BOTTOM, + +		TOOLBAR_COUNT, + +		TOOLBAR_FIRST = TOOLBAR_LEFT, +		TOOLBAR_LAST = TOOLBAR_BOTTOM, +	}; +  	LLLayoutStack::ELayoutOrientation getOrientation(SideType sideType);  } @@ -150,6 +163,30 @@ class LLToolBar  {  	friend class LLToolBarButton;  public: + +	class LLCenterLayoutPanel : public LLLayoutPanel +	{ +	public: +		typedef struct LLLayoutPanel::Params Params; +		typedef boost::function<void(LLToolBarEnums::EToolBarLocation tb, const LLRect& rect)> reshape_callback_t; + +		virtual ~LLCenterLayoutPanel() {} +		/*virtual*/ void handleReshape(const LLRect& rect, bool by_user); + +		void setLocationId(LLToolBarEnums::EToolBarLocation id) { mLocationId = id; } +		void setReshapeCallback(reshape_callback_t cb) { mReshapeCallback = cb; } +		void setButtonPanel(LLPanel * panel) { mButtonPanel = panel; } + +	protected: +		friend class LLUICtrlFactory; +		LLCenterLayoutPanel(const Params& params) : LLLayoutPanel(params), mButtonPanel(NULL) {} + +	private: +		reshape_callback_t					mReshapeCallback; +		LLToolBarEnums::EToolBarLocation	mLocationId; +		LLPanel *							mButtonPanel; +	}; +  	struct Params : public LLInitParam::Block<Params, LLUICtrl::Params>  	{  		Mandatory<LLToolBarEnums::ButtonType>	button_display_mode; @@ -198,6 +235,7 @@ public:  	void setHandleDragCallback(tool_handledrag_callback_t cb) { mHandleDragItemCallback = cb; }  	void setHandleDropCallback(tool_handledrop_callback_t cb) { mHandleDropCallback     = cb; }  	bool isReadOnly() const { return mReadOnly; } +	LLCenterLayoutPanel * getCenterLayoutPanel() const { return mCenterPanel; }   	LLToolBarButton* createButton(const LLCommandId& id); @@ -270,6 +308,7 @@ private:  	// related widgets  	LLLayoutStack*					mCenteringStack; +	LLCenterLayoutPanel*			mCenterPanel;  	LLPanel*						mButtonPanel;  	LLHandle<class LLContextMenu>	mPopupMenuHandle;  	LLHandle<class LLView>			mRemoveButtonHandle; diff --git a/indra/llui/llurlaction.cpp b/indra/llui/llurlaction.cpp index 23e574cb74..12537d9dd1 100755 --- a/indra/llui/llurlaction.cpp +++ b/indra/llui/llurlaction.cpp @@ -87,14 +87,14 @@ void LLUrlAction::executeSLURL(std::string url)  {  	if (sExecuteSLURLCallback)  	{ -		sExecuteSLURLCallback(url); +		sExecuteSLURLCallback(url ,true);  	}  } -void LLUrlAction::clickAction(std::string url) +void LLUrlAction::clickAction(std::string url, bool trusted_content)  {  	// Try to handle as SLURL first, then http Url -	if ( (sExecuteSLURLCallback) && !sExecuteSLURLCallback(url) ) +	if ( (sExecuteSLURLCallback) && !sExecuteSLURLCallback(url, trusted_content) )  	{  		if (sOpenURLCallback)  		{ diff --git a/indra/llui/llurlaction.h b/indra/llui/llurlaction.h index e731376b95..5f3626490c 100755 --- a/indra/llui/llurlaction.h +++ b/indra/llui/llurlaction.h @@ -66,7 +66,7 @@ public:  	static void showLocationOnMap(std::string url);  	/// perform the appropriate action for left-clicking on a Url -	static void clickAction(std::string url); +	static void clickAction(std::string url, bool trusted_content);  	/// copy the label for a Url to the clipboard  	static void copyLabelToClipboard(std::string url); @@ -86,7 +86,7 @@ public:  	/// specify the callbacks to enable this class's functionality  	typedef boost::function<void (const std::string&)> url_callback_t; -	typedef boost::function<bool(const std::string& url)> execute_url_callback_t; +	typedef boost::function<bool(const std::string& url, bool trusted_content)> execute_url_callback_t;  	static void	setOpenURLCallback(url_callback_t cb);  	static void	setOpenURLInternalCallback(url_callback_t cb); diff --git a/indra/llui/llurlentry.cpp b/indra/llui/llurlentry.cpp index b1cc502c4b..840f67968d 100755 --- a/indra/llui/llurlentry.cpp +++ b/indra/llui/llurlentry.cpp @@ -1067,7 +1067,8 @@ LLUrlEntrySLLabel::LLUrlEntrySLLabel()  std::string LLUrlEntrySLLabel::getLabel(const std::string &url, const LLUrlLabelCallback &cb)  { -	return getLabelFromWikiLink(url); +	std::string label = getLabelFromWikiLink(url); +	return (!LLUrlRegistry::instance().hasUrl(label)) ? label : getUrl(url);  }  std::string LLUrlEntrySLLabel::getUrl(const std::string &string) const diff --git a/indra/llui/llview.cpp b/indra/llui/llview.cpp index 20015dca1a..5ee2169b66 100755 --- a/indra/llui/llview.cpp +++ b/indra/llui/llview.cpp @@ -645,14 +645,18 @@ void LLView::setVisible(BOOL visible)  void LLView::handleVisibilityChange ( BOOL new_visibility )  {  	BOOL old_visibility; +	BOOL log_visibility_change = LLViewerEventRecorder::instance().getLoggingStatus();  	BOOST_FOREACH(LLView* viewp, mChildList)  	{  		// only views that are themselves visible will have their overall visibility affected by their ancestors  		old_visibility=viewp->getVisible(); -		if (old_visibility!=new_visibility) +		if(log_visibility_change)  		{ -			LLViewerEventRecorder::instance().logVisibilityChange( viewp->getPathname(), viewp->getName(), new_visibility,"widget"); +			if (old_visibility!=new_visibility) +			{ +				LLViewerEventRecorder::instance().logVisibilityChange( viewp->getPathname(), viewp->getName(), new_visibility,"widget"); +			}  		}  		if (old_visibility) @@ -660,11 +664,13 @@ void LLView::handleVisibilityChange ( BOOL new_visibility )  			viewp->handleVisibilityChange ( new_visibility );  		} -		// Consider changing returns to confirm success and know which widget grabbed it -		// For now assume success and log at highest xui possible  -		// NOTE we log actual state - which may differ if it somehow failed to set visibility -		lldebugs << "LLView::handleVisibilityChange	 - now: " << getVisible()  << " xui: " << viewp->getPathname() << " name: " << viewp->getName() << llendl; -		 +		if(log_visibility_change) +		{ +			// Consider changing returns to confirm success and know which widget grabbed it +			// For now assume success and log at highest xui possible +			// NOTE we log actual state - which may differ if it somehow failed to set visibility +			lldebugs << "LLView::handleVisibilityChange	 - now: " << getVisible()  << " xui: " << viewp->getPathname() << " name: " << viewp->getName() << llendl; +		}  	}  } @@ -1308,52 +1314,55 @@ void LLView::reshape(S32 width, S32 height, BOOL called_from_parent)  		// move child views according to reshape flags  		BOOST_FOREACH(LLView* viewp, mChildList)  		{ -			LLRect child_rect( viewp->mRect ); - -			if (viewp->followsRight() && viewp->followsLeft()) -			{ -				child_rect.mRight += delta_width; -			} -			else if (viewp->followsRight()) -			{ -				child_rect.mLeft += delta_width; -				child_rect.mRight += delta_width; -			} -			else if (viewp->followsLeft()) -			{ -				// left is 0, don't need to adjust coords -			} -			else +			if (viewp != NULL)  			{ -				// BUG what to do when we don't follow anyone? -				// for now, same as followsLeft -			} +				LLRect child_rect( viewp->mRect ); -			if (viewp->followsTop() && viewp->followsBottom()) -			{ -				child_rect.mTop += delta_height; -			} -			else if (viewp->followsTop()) -			{ -				child_rect.mTop += delta_height; -				child_rect.mBottom += delta_height; -			} -			else if (viewp->followsBottom()) -			{ -				// bottom is 0, so don't need to adjust coords -			} -			else -			{ -				// BUG what to do when we don't follow? -				// for now, same as bottom -			} +				if (viewp->followsRight() && viewp->followsLeft()) +				{ +					child_rect.mRight += delta_width; +				} +				else if (viewp->followsRight()) +				{ +					child_rect.mLeft += delta_width; +					child_rect.mRight += delta_width; +				} +				else if (viewp->followsLeft()) +				{ +					// left is 0, don't need to adjust coords +				} +				else +				{ +					// BUG what to do when we don't follow anyone? +					// for now, same as followsLeft +				} -			S32 delta_x = child_rect.mLeft - viewp->getRect().mLeft; -			S32 delta_y = child_rect.mBottom - viewp->getRect().mBottom; -			viewp->translate( delta_x, delta_y ); -			if (child_rect.getWidth() != viewp->getRect().getWidth() || child_rect.getHeight() != viewp->getRect().getHeight()) -			{ -				viewp->reshape(child_rect.getWidth(), child_rect.getHeight()); +				if (viewp->followsTop() && viewp->followsBottom()) +				{ +					child_rect.mTop += delta_height; +				} +				else if (viewp->followsTop()) +				{ +					child_rect.mTop += delta_height; +					child_rect.mBottom += delta_height; +				} +				else if (viewp->followsBottom()) +				{ +					// bottom is 0, so don't need to adjust coords +				} +				else +				{ +					// BUG what to do when we don't follow? +					// for now, same as bottom +				} + +				S32 delta_x = child_rect.mLeft - viewp->getRect().mLeft; +				S32 delta_y = child_rect.mBottom - viewp->getRect().mBottom; +				viewp->translate( delta_x, delta_y ); +				if (child_rect.getWidth() != viewp->getRect().getWidth() || child_rect.getHeight() != viewp->getRect().getHeight()) +				{ +					viewp->reshape(child_rect.getWidth(), child_rect.getHeight()); +				}  			}  		}  	} diff --git a/indra/llui/llviewereventrecorder.cpp b/indra/llui/llviewereventrecorder.cpp index a352f621eb..546a0f5866 100644 --- a/indra/llui/llviewereventrecorder.cpp +++ b/indra/llui/llviewereventrecorder.cpp @@ -31,7 +31,7 @@  LLViewerEventRecorder::LLViewerEventRecorder() {    clear(UNDEFINED); - +  logEvents = false;    // Remove any previous event log file    std::string old_log_ui_events_to_llsd_file = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, "SecondLife_Events_log.old");    LLFile::remove(old_log_ui_events_to_llsd_file); diff --git a/indra/llui/llviewereventrecorder.h b/indra/llui/llviewereventrecorder.h index 72ca643ced..375efcc3de 100644 --- a/indra/llui/llviewereventrecorder.h +++ b/indra/llui/llviewereventrecorder.h @@ -65,7 +65,7 @@ class LLViewerEventRecorder : public LLSingleton<LLViewerEventRecorder>    std::string get_xui();    void update_xui(std::string xui); -  bool getLoggingStatus(); +  bool getLoggingStatus(){return logEvents;};    void setEventLoggingOn();    void setEventLoggingOff(); diff --git a/indra/llvfs/lldiriterator.cpp b/indra/llvfs/lldiriterator.cpp index 460d2a8b4f..229608231c 100755 --- a/indra/llvfs/lldiriterator.cpp +++ b/indra/llvfs/lldiriterator.cpp @@ -119,16 +119,25 @@ bool LLDirIterator::Impl::next(std::string &fname)  	fs::directory_iterator end_itr; // default construction yields past-the-end  	bool found = false; -	while (mIter != end_itr && !found) + +	// Check if path is a directory. +	try  	{ -		boost::smatch match; -		std::string name = mIter->path().filename().string(); -		if (found = boost::regex_match(name, match, mFilterExp)) +		while (mIter != end_itr && !found)  		{ -			fname = name; +			boost::smatch match; +			std::string name = mIter->path().filename().string(); +			if (found = boost::regex_match(name, match, mFilterExp)) +			{ +				fname = name; +			} + +			++mIter;  		} - -		++mIter; +	} +	catch (const fs::filesystem_error& e) +	{ +		llwarns << e.what() << llendl;  	}  	return found; diff --git a/indra/llwindow/llopenglview-objc.h b/indra/llwindow/llopenglview-objc.h index 1e0e47cd02..f1fab3b2c6 100644 --- a/indra/llwindow/llopenglview-objc.h +++ b/indra/llwindow/llopenglview-objc.h @@ -42,6 +42,7 @@  	unsigned int mMarkedTextLength;      bool mMarkedTextAllowed;      bool mSimulatedRightClick; +    bool mOldResize;  }  - (id) initWithSamples:(NSUInteger)samples;  - (id) initWithSamples:(NSUInteger)samples andVsync:(BOOL)vsync; @@ -49,6 +50,8 @@  - (void)commitCurrentPreedit; +- (void) setOldResize:(bool)oldresize; +  // rebuildContext  // Destroys and recreates a context with the view's internal format set via setPixelFormat;  // Use this in event of needing to rebuild a context for whatever reason, without needing to assign a new pixel format. diff --git a/indra/llwindow/llopenglview-objc.mm b/indra/llwindow/llopenglview-objc.mm index 7415c9d8dc..82ee5ccce4 100644 --- a/indra/llwindow/llopenglview-objc.mm +++ b/indra/llwindow/llopenglview-objc.mm @@ -94,8 +94,11 @@ attributedStringInfo getSegments(NSAttributedString *str)  // Force a high quality update after live resizing  - (void) viewDidEndLiveResize  { -    NSSize size = [self frame].size; -    callResize(size.width, size.height); +    if (mOldResize)  //Maint-3135 +    { +        NSSize size = [self frame].size; +        callResize(size.width, size.height); +    }  }  - (unsigned long)getVramSize @@ -124,10 +127,18 @@ attributedStringInfo getSegments(NSAttributedString *str)  											   object:[self window]];  } +- (void)setOldResize:(bool)oldresize +{ +    mOldResize = oldresize; +} +  - (void)windowResized:(NSNotification *)notification;  { -	//NSSize size = [self frame].size; -	//callResize(size.width, size.height); +    if (!mOldResize)  //Maint-3288 +    { +        NSSize size = [self frame].size; +        callResize(size.width, size.height); +    }  }  - (void)dealloc @@ -204,6 +215,8 @@ attributedStringInfo getSegments(NSAttributedString *str)  		[glContext setValues:(const GLint*)0 forParameter:NSOpenGLCPSwapInterval];  	} +    mOldResize = false; +      	return self;  } diff --git a/indra/llwindow/llwindow.h b/indra/llwindow/llwindow.h index 78186004b8..50ea614634 100755 --- a/indra/llwindow/llwindow.h +++ b/indra/llwindow/llwindow.h @@ -123,7 +123,7 @@ public:  	virtual void swapBuffers() = 0;  	virtual void bringToFront() = 0;  	virtual void focusClient() { };		// this may not have meaning or be required on other platforms, therefore, it's not abstract -	 +	virtual void setOldResize(bool oldresize) { };  	// handy coordinate space conversion routines  	// NB: screen to window and vice verse won't work on width/height coordinate pairs,  	// as the conversion must take into account left AND right border widths, etc. diff --git a/indra/llwindow/llwindowmacosx-objc.h b/indra/llwindow/llwindowmacosx-objc.h index 81b25601a9..d64525fbdd 100755 --- a/indra/llwindow/llwindowmacosx-objc.h +++ b/indra/llwindow/llwindowmacosx-objc.h @@ -74,6 +74,7 @@ void showNSCursor();  void hideNSCursorTillMove(bool hide);  void requestUserAttention();  long showAlert(std::string title, std::string text, int type); +void setResizeMode(bool oldresize, void* glview);  NSWindowRef createNSWindow(int x, int y, int width, int height); diff --git a/indra/llwindow/llwindowmacosx-objc.mm b/indra/llwindow/llwindowmacosx-objc.mm index 0768d0352e..1a21bf8430 100755 --- a/indra/llwindow/llwindowmacosx-objc.mm +++ b/indra/llwindow/llwindowmacosx-objc.mm @@ -91,7 +91,7 @@ const unsigned short *copyFromPBoard()  		NSArray *objToPaste = [pboard readObjectsForClasses:classArray options:[NSDictionary dictionary]];  		str = [objToPaste objectAtIndex:0];  	} -	unichar* temp = (unichar*)calloc([str length], sizeof(unichar)); +	unichar* temp = (unichar*)calloc([str length]+1, sizeof(unichar));  	[str getCharacters:temp];  	[pool release];  	return temp; @@ -222,6 +222,11 @@ GLViewRef createOpenGLView(NSWindowRef window, unsigned int samples, bool vsync)  	return glview;  } +void setResizeMode(bool oldresize, void* glview) +{ +    [(LLOpenGLView *)glview setOldResize:oldresize]; +} +  void glSwapBuffers(void* context)  {  	[(NSOpenGLContext*)context flushBuffer]; diff --git a/indra/llwindow/llwindowmacosx.h b/indra/llwindow/llwindowmacosx.h index 6a6b39e674..825fd05c5f 100755 --- a/indra/llwindow/llwindowmacosx.h +++ b/indra/llwindow/llwindowmacosx.h @@ -152,7 +152,10 @@ protected:  	BOOL	resetDisplayResolution();  	BOOL	shouldPostQuit() { return mPostQuit; } - +     +    //Satisfy MAINT-3135 and MAINT-3288 with a flag. +    /*virtual */ void setOldResize(bool oldresize) {setResizeMode(oldresize, mGLView); } +   protected:  	// diff --git a/indra/lscript/lscript_compile/indra.l b/indra/lscript/lscript_compile/indra.l index 88dfc2e9f3..05db551227 100755 --- a/indra/lscript/lscript_compile/indra.l +++ b/indra/lscript/lscript_compile/indra.l @@ -648,7 +648,8 @@ int yyerror(const char *fmt, ...);  "REGION_FLAG_SANDBOX"		{ count(); yylval.ival = REGION_FLAGS_SANDBOX; return(INTEGER_CONSTANT); }  "REGION_FLAG_DISABLE_COLLISIONS"		{ count(); yylval.ival = REGION_FLAGS_SKIP_COLLISIONS; return(INTEGER_CONSTANT); }  "REGION_FLAG_DISABLE_PHYSICS"		{ count(); yylval.ival = REGION_FLAGS_SKIP_PHYSICS; return(INTEGER_CONSTANT); } -"REGION_FLAG_BLOCK_FLY"		{ count(); yylval.ival = REGION_FLAGS_BLOCK_FLY; return(INTEGER_CONSTANT); } +"REGION_FLAG_BLOCK_FLY"			{ count(); yylval.ival = REGION_FLAGS_BLOCK_FLY; return(INTEGER_CONSTANT); } +"REGION_FLAG_BLOCK_FLYOVER"		{ count(); yylval.ival = REGION_FLAGS_BLOCK_FLYOVER; return(INTEGER_CONSTANT); }  "REGION_FLAG_ALLOW_DIRECT_TELEPORT"		{ count(); yylval.ival = REGION_FLAGS_ALLOW_DIRECT_TELEPORT; return(INTEGER_CONSTANT); }  "REGION_FLAG_RESTRICT_PUSHOBJECT"		{ count(); yylval.ival = REGION_FLAGS_RESTRICT_PUSHOBJECT; return(INTEGER_CONSTANT); } diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index c5e1cde4e6..e044524131 100755 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -659,7 +659,6 @@ set(viewer_SOURCE_FILES      llwearablelist.cpp      llweb.cpp      llwebprofile.cpp -    llwebsharing.cpp      llwind.cpp      llwindowlistener.cpp      llwlanimator.cpp @@ -1238,7 +1237,6 @@ set(viewer_HEADER_FILES      llwearablelist.h      llweb.h      llwebprofile.h -    llwebsharing.h      llwind.h      llwindowlistener.h      llwlanimator.h diff --git a/indra/newview/app_settings/keywords.ini b/indra/newview/app_settings/keywords.ini index ad843bca14..17c70ef1c5 100755 --- a/indra/newview/app_settings/keywords.ini +++ b/indra/newview/app_settings/keywords.ini @@ -526,6 +526,7 @@ REGION_FLAG_SANDBOX					Used with llGetRegionFlags to find if a region is a sand  REGION_FLAG_DISABLE_COLLISIONS		Used with llGetRegionFlags to find if a region has disabled collisions  REGION_FLAG_DISABLE_PHYSICS			Used with llGetRegionFlags to find if a region has disabled physics  REGION_FLAG_BLOCK_FLY				Used with llGetRegionFlags to find if a region blocks flying +REGION_FLAG_BLOCK_FLYOVER			Used with llGetRegionFlags to find if a region enforces higher altitude parcel access rules  REGION_FLAG_ALLOW_DIRECT_TELEPORT	Used with llGetRegionFlags to find if a region allows direct teleports  REGION_FLAG_RESTRICT_PUSHOBJECT		Used with llGetRegionFlags to find if a region restricts llPushObject() calls diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index d9093c2a6d..a220e810c4 100755 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -1203,7 +1203,7 @@        <key>Type</key>        <string>Boolean</string>        <key>Value</key> -      <integer>0</integer> +      <integer>1</integer>      </map>      <key>BulkChangeShareWithGroup</key>      <map> @@ -3569,13 +3569,13 @@      <key>FPSLogFrequency</key>          <map>          <key>Comment</key> -            <string>Seconds between display of FPS in log (0 for never)</string> +        <string>Seconds between display of FPS in log (0 for never)</string>          <key>Persist</key> -            <integer>1</integer> +        <integer>1</integer>          <key>Type</key> -            <string>F32</string> +        <string>F32</string>          <key>Value</key> -            <real>10.0</real> +        <real>10.0</real>          </map>      <key>FilterItemsMaxTimePerFrameVisible</key>      <map> @@ -8696,7 +8696,7 @@    <key>RenderDepthOfField</key>    <map>      <key>Comment</key> -    <string>Whether to use depth of field effect when lighting and shadows are enabled</string> +    <string>Whether to use depth of field effect when Advanced Lighting Model is enabled</string>      <key>Persist</key>      <integer>1</integer>      <key>Type</key> @@ -9991,7 +9991,18 @@        <key>Value</key>        <integer>0</integer>      </map> -    <key>RevokePermsOnStopAnimation</key> +		<key>ReportBugURL</key> +		<map> +			<key>Comment</key> +			<string>URL used for filing bugs from viewer</string> +			<key>Persist</key> +			<integer>1</integer> +			<key>Type</key> +			<string>String</string> +			<key>Value</key> +			<string>https://jira.secondlife.com/secure/CreateIssueDetails!init.jspa?pid=10610&issuetype=1&environment=[ENVIRONMENT]&customfield_10253=[LOCATION]</string> +		</map> +	<key>RevokePermsOnStopAnimation</key>      <map>        <key>Comment</key>        <string>Clear animation permssions when choosing "Stop Animating Me"</string> @@ -11290,28 +11301,6 @@        <key>Value</key>        <integer>75</integer>      </map> -    <key>SnapshotSharingEnabled</key> -    <map> -      <key>Comment</key> -      <string>Enable uploading of snapshots to a web service.</string> -      <key>Persist</key> -      <integer>1</integer> -      <key>Type</key> -      <string>Boolean</string> -      <key>Value</key> -      <integer>0</integer> -    </map> -    <key>SnapshotConfigURL</key> -    <map> -      <key>Comment</key> -      <string>URL to fetch Snapshot Sharing configuration data from.</string> -      <key>Persist</key> -      <integer>1</integer> -      <key>Type</key> -      <string>String</string> -      <key>Value</key> -      <string>http://photos.apps.staging.avatarsunited.com/viewer_config</string> -    </map>      <key>SpeedTest</key>      <map>        <key>Comment</key> diff --git a/indra/newview/app_settings/shaders/class1/interface/benchmarkF.glsl b/indra/newview/app_settings/shaders/class1/interface/benchmarkF.glsl new file mode 100644 index 0000000000..1936e0dcaa --- /dev/null +++ b/indra/newview/app_settings/shaders/class1/interface/benchmarkF.glsl @@ -0,0 +1,39 @@ +/**  + * @file benchmarkF.glsl + * + * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2011, Linden Research, Inc. + *  + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + *  + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + * Lesser General Public License for more details. + *  + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA + *  + * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA + * $/LicenseInfo$ + */ + +#ifdef DEFINE_GL_FRAGCOLOR +out vec4 frag_color; +#else +#define frag_color gl_FragColor +#endif + +uniform sampler2D diffuseMap; + +VARYING vec2 tc0; + +void main()  +{ +	frag_color = texture2D(diffuseMap, tc0); +} diff --git a/indra/newview/app_settings/shaders/class1/interface/benchmarkV.glsl b/indra/newview/app_settings/shaders/class1/interface/benchmarkV.glsl new file mode 100644 index 0000000000..7beb20ede4 --- /dev/null +++ b/indra/newview/app_settings/shaders/class1/interface/benchmarkV.glsl @@ -0,0 +1,38 @@ +/**  + * @file benchmarkV.glsl + * + * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2011, Linden Research, Inc. + *  + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + *  + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + * Lesser General Public License for more details. + *  + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA + *  + * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA + * $/LicenseInfo$ + */ + +uniform mat4 modelview_projection_matrix; + +ATTRIBUTE vec3 position; + +VARYING vec2 tc0; + +void main() +{ +	gl_Position = vec4(position, 1.0);  +	 +	tc0 = (position.xy*0.5+0.5); +} + diff --git a/indra/newview/app_settings/shaders/class1/interface/solidcolorF.glsl b/indra/newview/app_settings/shaders/class1/interface/solidcolorF.glsl index 67dc500493..da02534dbb 100755 --- a/indra/newview/app_settings/shaders/class1/interface/solidcolorF.glsl +++ b/indra/newview/app_settings/shaders/class1/interface/solidcolorF.glsl @@ -31,12 +31,13 @@ out vec4 frag_color;  uniform sampler2D tex0; -VARYING vec4 vertex_color; +uniform vec4 color; +  VARYING vec2 vary_texcoord0;  void main()   { -	float alpha = texture2D(tex0, vary_texcoord0.xy).a * vertex_color.a; +	float alpha = texture2D(tex0, vary_texcoord0.xy).a * color.a; -	frag_color = vec4(vertex_color.rgb, alpha); +	frag_color = vec4(color.rgb, alpha);  } diff --git a/indra/newview/app_settings/shaders/class1/interface/solidcolorV.glsl b/indra/newview/app_settings/shaders/class1/interface/solidcolorV.glsl index c58f9dfdaf..f33115d78d 100755 --- a/indra/newview/app_settings/shaders/class1/interface/solidcolorV.glsl +++ b/indra/newview/app_settings/shaders/class1/interface/solidcolorV.glsl @@ -26,16 +26,13 @@  uniform mat4 modelview_projection_matrix;  ATTRIBUTE vec3 position; -ATTRIBUTE vec4 diffuse_color;  ATTRIBUTE vec2 texcoord0; -VARYING vec4 vertex_color;  VARYING vec2 vary_texcoord0;  void main()  {  	gl_Position = modelview_projection_matrix * vec4(position.xyz, 1.0); -	vertex_color = diffuse_color;  	vary_texcoord0 = texcoord0;  } diff --git a/indra/newview/llappdelegate-objc.mm b/indra/newview/llappdelegate-objc.mm index 91251ed7c0..988058aad3 100644 --- a/indra/newview/llappdelegate-objc.mm +++ b/indra/newview/llappdelegate-objc.mm @@ -40,6 +40,11 @@      [super dealloc];  } +- (void) applicationWillFinishLaunching:(NSNotification *)notification +{ +    [[NSAppleEventManager sharedAppleEventManager] setEventHandler:self andSelector:@selector(handleGetURLEvent:withReplyEvent:) forEventClass:kInternetEventClass andEventID:kAEGetURL]; +} +  - (void) applicationDidFinishLaunching:(NSNotification *)notification  {  	frameTimer = nil; @@ -55,7 +60,7 @@  	[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(languageUpdated) name:@"NSTextInputContextKeyboardSelectionDidChangeNotification" object:nil]; -    [[NSAppleEventManager sharedAppleEventManager] setEventHandler:self andSelector:@selector(handleGetURLEvent:withReplyEvent:) forEventClass:kInternetEventClass andEventID:kAEGetURL]; + //   [[NSAppleEventManager sharedAppleEventManager] setEventHandler:self andSelector:@selector(handleGetURLEvent:withReplyEvent:) forEventClass:kInternetEventClass andEventID:kAEGetURL];  }  - (void) handleGetURLEvent:(NSAppleEventDescriptor *)event withReplyEvent:(NSAppleEventDescriptor *)replyEvent { diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index 539d186441..b7a8194b4d 100755 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -40,6 +40,7 @@  #include "llagent.h"  #include "llagentcamera.h"  #include "llagentlanguage.h" +#include "llagentui.h"  #include "llagentwearables.h"  #include "llfloaterimcontainer.h"  #include "llwindow.h" @@ -60,6 +61,7 @@  #include "llcurl.h"  #include "llcalc.h"  #include "llconversationlog.h" +#include "lldxhardware.h"  #include "lltexturestats.h"  #include "lltexturestats.h"  #include "llviewerwindow.h" @@ -75,10 +77,10 @@  #include "lluicolortable.h"  #include "llurldispatcher.h"  #include "llurlhistory.h" -//#include "llfirstuse.h"  #include "llrender.h"  #include "llteleporthistory.h"  #include "lltoast.h" +#include "llsdutil_math.h"  #include "lllocationhistory.h"  #include "llfasttimerview.h"  #include "llvector4a.h" @@ -755,7 +757,7 @@ bool LLAppViewer::init()  	initLoggingAndGetLastDuration();  	processMarkerFiles(); - +	  	//  	// OK to write stuff to logs now, we've now crash reported if necessary  	// @@ -1230,8 +1232,8 @@ void LLAppViewer::checkMemory()  	}  	mMemCheckTimer.reset() ; -		//update the availability of memory -		LLMemory::updateMemoryInfo() ; +	//update the availability of memory +	LLMemory::updateMemoryInfo() ;  	bool is_low = LLMemory::isMemoryPoolLow() ; @@ -1761,7 +1763,7 @@ bool LLAppViewer::cleanup()  		gAudiop->setStreamingAudioImpl(NULL);  		// shut down the audio subsystem -			gAudiop->shutdown(); +        gAudiop->shutdown();  		delete gAudiop;  		gAudiop = NULL; @@ -2574,9 +2576,9 @@ bool LLAppViewer::initConfiguration()                  {  					llwarns << "Failed --set " << name << ": setting name unknown." << llendl;                  } +                }              }          } -    }      if  (clp.hasOption("logevents")) {  	LLViewerEventRecorder::instance().setEventLoggingOn(); @@ -2584,7 +2586,7 @@ bool LLAppViewer::initConfiguration()  	std::string CmdLineChannel(gSavedSettings.getString("CmdLineChannel"));  	if(! CmdLineChannel.empty()) -    { +	{  		LLVersionInfo::resetChannel(CmdLineChannel);  	} @@ -2596,16 +2598,16 @@ bool LLAppViewer::initConfiguration()  		LLFastTimer::sLog = TRUE;  		LLFastTimer::sLogName = std::string("performance");		  	} -	 +  	std::string test_name(gSavedSettings.getString("LogMetrics"));  	if (! test_name.empty()) - 	{ +	{   		LLFastTimer::sMetricLog = TRUE ;  		// '--logmetrics' is specified with a named test metric argument so the data gathering is done only on that test  		// In the absence of argument, every metric would be gathered (makes for a rather slow run and hard to decipher report...)  		llinfos << "'--logmetrics' argument : " << test_name << llendl;  			LLFastTimer::sLogName = test_name; -		} + 	}  	if (clp.hasOption("graphicslevel"))  	{ @@ -2614,14 +2616,14 @@ bool LLAppViewer::initConfiguration()  		// that value for validity.  		U32 graphicslevel = gSavedSettings.getU32("RenderQualityPerformance");  		if (LLFeatureManager::instance().isValidGraphicsLevel(graphicslevel)) -        { +		{  			// graphicslevel is valid: save it and engage it later. Capture  			// the requested value separately from the settings variable  			// because, if this is the first run, LLViewerWindow's constructor  			// will call LLFeatureManager::applyRecommendedSettings(), which  			// overwrites this settings variable!  			mForceGraphicsLevel = graphicslevel; -        } +		}  	}  	LLFastTimerView::sAnalyzePerformance = gSavedSettings.getBOOL("AnalyzePerformance"); @@ -2655,14 +2657,14 @@ bool LLAppViewer::initConfiguration()  	LLSLURL start_slurl;  	std::string CmdLineLoginLocation(gSavedSettings.getString("CmdLineLoginLocation"));  	if(! CmdLineLoginLocation.empty()) -    { +	{  		start_slurl = CmdLineLoginLocation;  		LLStartUp::setStartSLURL(start_slurl);  		if(start_slurl.getType() == LLSLURL::LOCATION)  -		{   +	{  			LLGridManager::getInstance()->setGridChoice(start_slurl.getGrid()); -    } -    } +		} +	}  	//RN: if we received a URL, hand it off to the existing instance.  	// don't call anotherInstanceRunning() when doing URL handoff, as @@ -2673,11 +2675,11 @@ bool LLAppViewer::initConfiguration()  		(gSavedSettings.getBOOL("SLURLPassToOtherInstance")))  	{  		if (sendURLToOtherInstance(start_slurl.getSLURLString())) -		{ +		{    			// successfully handed off URL to existing instance, exit  			return false;  		} -    } +	}  	const LLControlVariable* skinfolder = gSavedSettings.getControl("SkinCurrent");  	if(skinfolder && LLStringUtil::null != skinfolder->getValue().asString()) @@ -2994,26 +2996,26 @@ namespace {  		{  			LL_WARNS("UpdaterService") << "no info url supplied - defaulting to hard coded release notes pattern" << LL_ENDL; -		// truncate version at the rightmost '.'  -		std::string version_short(data["version"]); -		size_t short_length = version_short.rfind('.'); -		if (short_length != std::string::npos) -		{ -			version_short.resize(short_length); -		} +			// truncate version at the rightmost '.'  +			std::string version_short(data["version"]); +			size_t short_length = version_short.rfind('.'); +			if (short_length != std::string::npos) +			{ +				version_short.resize(short_length); +			} -		LLUIString relnotes_url("[RELEASE_NOTES_BASE_URL][CHANNEL_URL]/[VERSION_SHORT]"); -		relnotes_url.setArg("[VERSION_SHORT]", version_short); +			LLUIString relnotes_url("[RELEASE_NOTES_BASE_URL][CHANNEL_URL]/[VERSION_SHORT]"); +			relnotes_url.setArg("[VERSION_SHORT]", version_short); -		// *TODO thread the update service's response through to this point -		std::string const & channel = LLVersionInfo::getChannel(); -		boost::shared_ptr<char> channel_escaped(curl_escape(channel.c_str(), channel.size()), &curl_free); +			// *TODO thread the update service's response through to this point +			std::string const & channel = LLVersionInfo::getChannel(); +			boost::shared_ptr<char> channel_escaped(curl_escape(channel.c_str(), channel.size()), &curl_free); -		relnotes_url.setArg("[CHANNEL_URL]", channel_escaped.get()); -		relnotes_url.setArg("[RELEASE_NOTES_BASE_URL]", LLTrans::getString("RELEASE_NOTES_BASE_URL")); +			relnotes_url.setArg("[CHANNEL_URL]", channel_escaped.get()); +			relnotes_url.setArg("[RELEASE_NOTES_BASE_URL]", LLTrans::getString("RELEASE_NOTES_BASE_URL"));  			substitutions["INFO_URL"] = relnotes_url.getString();  		} - +		  		LLNotificationsUtil::add(notification_name, substitutions, LLSD(), apply_callback);  	} @@ -3188,6 +3190,13 @@ bool LLAppViewer::initWindow()  	LLNotificationsUI::LLNotificationManager::getInstance(); +     +#ifdef LL_DARWIN +    //Satisfy both MAINT-3135 (OSX 10.6 and earlier) MAINT-3288 (OSX 10.7 and later) +   if (getOSInfo().mMajorVer == 10 && getOSInfo().mMinorVer < 7) +       gViewerWindow->getWindow()->setOldResize(true); +#endif +      	if (gSavedSettings.getBOOL("WindowMaximized"))  	{  		gViewerWindow->getWindow()->maximize(); @@ -3202,7 +3211,7 @@ bool LLAppViewer::initWindow()  		LLFeatureManager::getInstance()->setGraphicsLevel(*mForceGraphicsLevel, false);  		gSavedSettings.setU32("RenderQualityPerformance", *mForceGraphicsLevel);  	} -			 +  	// Set this flag in case we crash while initializing GL  	gSavedSettings.setBOOL("RenderInitError", TRUE);  	gSavedSettings.saveToFile( gSavedSettings.getString("ClientSettingsFile"), TRUE ); @@ -3261,6 +3270,183 @@ void LLAppViewer::writeDebugInfo()  	out_file.close();  } +LLSD LLAppViewer::getViewerInfo() const +{ +	// The point of having one method build an LLSD info block and the other +	// construct the user-visible About string is to ensure that the same info +	// is available to a getInfo() caller as to the user opening +	// LLFloaterAbout. +	LLSD info; +	LLSD version; +	version.append(LLVersionInfo::getMajor()); +	version.append(LLVersionInfo::getMinor()); +	version.append(LLVersionInfo::getPatch()); +	version.append(LLVersionInfo::getBuild()); +	info["VIEWER_VERSION"] = version; +	info["VIEWER_VERSION_STR"] = LLVersionInfo::getVersion(); +	info["BUILD_DATE"] = __DATE__; +	info["BUILD_TIME"] = __TIME__; +	info["CHANNEL"] = LLVersionInfo::getChannel(); + +	// return a URL to the release notes for this viewer, such as: +	// http://wiki.secondlife.com/wiki/Release_Notes/Second Life Beta Viewer/2.1.0.123456 +	std::string url = LLTrans::getString("RELEASE_NOTES_BASE_URL"); +	if (! LLStringUtil::endsWith(url, "/")) +		url += "/"; +	url += LLURI::escape(LLVersionInfo::getChannel()) + "/"; +	url += LLURI::escape(LLVersionInfo::getVersion()); + +	info["VIEWER_RELEASE_NOTES_URL"] = url; + +#if LL_MSVC +	info["COMPILER"] = "MSVC"; +	info["COMPILER_VERSION"] = _MSC_VER; +#elif LL_GNUC +	info["COMPILER"] = "GCC"; +	info["COMPILER_VERSION"] = GCC_VERSION; +#endif + +	// Position +	LLViewerRegion* region = gAgent.getRegion(); +	if (region) +	{ +		LLVector3d pos = gAgent.getPositionGlobal(); +		info["POSITION"] = ll_sd_from_vector3d(pos); +		info["POSITION_LOCAL"] = ll_sd_from_vector3(gAgent.getPosAgentFromGlobal(pos)); +		info["REGION"] = gAgent.getRegion()->getName(); +		info["HOSTNAME"] = gAgent.getRegion()->getHost().getHostName(); +		info["HOSTIP"] = gAgent.getRegion()->getHost().getString(); +		info["SERVER_VERSION"] = gLastVersionChannel; +		LLSLURL slurl; +		LLAgentUI::buildSLURL(slurl); +		info["SLURL"] = slurl.getSLURLString(); +	} + +	// CPU +	info["CPU"] = gSysCPU.getCPUString(); +	info["MEMORY_MB"] = LLSD::Integer(gSysMemory.getPhysicalMemoryKB() / 1024); +	// Moved hack adjustment to Windows memory size into llsys.cpp +	info["OS_VERSION"] = LLAppViewer::instance()->getOSInfo().getOSString(); +	info["GRAPHICS_CARD_VENDOR"] = (const char*)(glGetString(GL_VENDOR)); +	info["GRAPHICS_CARD"] = (const char*)(glGetString(GL_RENDERER)); + +#if LL_WINDOWS +	LLSD driver_info = gDXHardware.getDisplayInfo(); +	if (driver_info.has("DriverVersion")) +	{ +		info["GRAPHICS_DRIVER_VERSION"] = driver_info["DriverVersion"]; +	} +#endif + +	info["OPENGL_VERSION"] = (const char*)(glGetString(GL_VERSION)); +	info["LIBCURL_VERSION"] = LLCurl::getVersionString(); +	info["J2C_VERSION"] = LLImageJ2C::getEngineInfo(); +	bool want_fullname = true; +	info["AUDIO_DRIVER_VERSION"] = gAudiop ? LLSD(gAudiop->getDriverName(want_fullname)) : LLSD(); +	if(LLVoiceClient::getInstance()->voiceEnabled()) +	{ +		LLVoiceVersionInfo version = LLVoiceClient::getInstance()->getVersion(); +		std::ostringstream version_string; +		version_string << version.serverType << " " << version.serverVersion << std::endl; +		info["VOICE_VERSION"] = version_string.str(); +	} +	else  +	{ +		info["VOICE_VERSION"] = LLTrans::getString("NotConnected"); +	} + +	// TODO: Implement media plugin version query +	info["QT_WEBKIT_VERSION"] = "4.7.1 (version number hard-coded)"; + +	if (gPacketsIn > 0) +	{ +		info["PACKETS_LOST"] = LLViewerStats::getInstance()->mPacketsLostStat.getCurrent(); +		info["PACKETS_IN"] = F32(gPacketsIn);   +		info["PACKETS_PCT"] = 100.f*info["PACKETS_LOST"].asReal() / info["PACKETS_IN"].asReal(); +	} + +	if (mServerReleaseNotesURL.empty()) +	{ +		if (gAgent.getRegion()) +		{ +			info["SERVER_RELEASE_NOTES_URL"] = LLTrans::getString("RetrievingData"); +		} +	} +	else if (LLStringUtil::startsWith(mServerReleaseNotesURL, "http")) // it's an URL +	{ +		info["SERVER_RELEASE_NOTES_URL"] = "[" + LLWeb::escapeURL(mServerReleaseNotesURL) + " " + LLTrans::getString("ReleaseNotes") + "]"; +	} +	else +	{ +		info["SERVER_RELEASE_NOTES_URL"] = mServerReleaseNotesURL; +	} + +	return info; +} + +std::string LLAppViewer::getViewerInfoString() const +{ +	std::ostringstream support; + +	LLSD info(getViewerInfo()); + +	// Render the LLSD from getInfo() as a format_map_t +	LLStringUtil::format_map_t args; + +	// allow the "Release Notes" URL label to be localized +	args["ReleaseNotes"] = LLTrans::getString("ReleaseNotes"); + +	for (LLSD::map_const_iterator ii(info.beginMap()), iend(info.endMap()); +		ii != iend; ++ii) +	{ +		if (! ii->second.isArray()) +		{ +			// Scalar value +			if (ii->second.isUndefined()) +			{ +				args[ii->first] = LLTrans::getString("none_text"); +			} +			else +			{ +				// don't forget to render value asString() +				args[ii->first] = ii->second.asString(); +			} +		} +		else +		{ +			// array value: build KEY_0, KEY_1 etc. entries +			for (LLSD::Integer n(0), size(ii->second.size()); n < size; ++n) +			{ +				args[STRINGIZE(ii->first << '_' << n)] = ii->second[n].asString(); +			} +		} +	} + +	// Now build the various pieces +	support << LLTrans::getString("AboutHeader", args); +	if (info.has("REGION")) +	{ +		support << "\n\n" << LLTrans::getString("AboutPosition", args); +	} +	support << "\n\n" << LLTrans::getString("AboutSystem", args); +	support << "\n"; +	if (info.has("GRAPHICS_DRIVER_VERSION")) +	{ +		support << "\n" << LLTrans::getString("AboutDriver", args); +	} +	support << "\n" << LLTrans::getString("AboutLibs", args); +	if (info.has("COMPILER")) +	{ +		support << "\n" << LLTrans::getString("AboutCompiler", args); +	} +	if (info.has("PACKETS_IN")) +	{ +		support << '\n' << LLTrans::getString("AboutTraffic", args); +	} +	return support.str(); +} + +  void LLAppViewer::cleanupSavedSettings()  {  	gSavedSettings.setBOOL("MouseSun", FALSE); @@ -3485,9 +3671,9 @@ void LLAppViewer::handleViewerCrash()  	if (gDirUtilp)  	{  		std::string crash_marker_file_name = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, -																			gLLErrorActivated -																			? LLERROR_MARKER_FILE_NAME -																			: ERROR_MARKER_FILE_NAME); +																	 gLLErrorActivated +																	 ? LLERROR_MARKER_FILE_NAME +																	 : ERROR_MARKER_FILE_NAME);  		LLAPRFile crash_marker_file ;  		crash_marker_file.open(crash_marker_file_name, LL_APR_WB);  		if (crash_marker_file.getFileHandle()) @@ -3498,7 +3684,7 @@ void LLAppViewer::handleViewerCrash()  		else  		{  			LL_WARNS("MarkerFile") << "Cannot create error marker file " << crash_marker_file_name << LL_ENDL; -		} +		}		  	}  	else  	{ @@ -3637,7 +3823,7 @@ void LLAppViewer::processMarkerFiles()  		}  		if (mSecondInstance) -		{ +	{  			LL_INFOS("MarkerFile") << "Exec marker '"<< mMarkerFileName << "' owned by another instance" << LL_ENDL;  		}  		else if (marker_is_same_version) @@ -3651,7 +3837,7 @@ void LLAppViewer::processMarkerFiles()  		{  			LL_INFOS("MarkerFile") << "Exec marker '"<< mMarkerFileName << "' found, but versions did not match" << LL_ENDL;  		} -	} +	}      	else // marker did not exist... last exec (if any) did not freeze  	{  		// Create the marker file for this execution & lock it; it will be deleted on a clean exit @@ -3705,12 +3891,12 @@ void LLAppViewer::processMarkerFiles()  			{  				gLastExecEvent = LAST_EXEC_LOGOUT_CRASH;  				LL_INFOS("MarkerFile") << "LLError marker '"<< llerror_marker_file << "' crashed, setting LastExecEvent to LOGOUT_CRASH" << LL_ENDL; -			} -			else -			{ +		} +		else +		{  				gLastExecEvent = LAST_EXEC_LLERROR_CRASH;  				LL_INFOS("MarkerFile") << "LLError marker '"<< llerror_marker_file << "' crashed, setting LastExecEvent to LLERROR_CRASH" << LL_ENDL; -			} +		}  		}  		else  		{ @@ -3723,20 +3909,20 @@ void LLAppViewer::processMarkerFiles()  	if(LLAPRFile::isExist(error_marker_file, NULL, LL_APR_RB))  	{  		if (markerIsSameVersion(error_marker_file)) -		{ +	{  			if (gLastExecEvent == LAST_EXEC_LOGOUT_FROZE) -			{ +		{  				gLastExecEvent = LAST_EXEC_LOGOUT_CRASH;  				LL_INFOS("MarkerFile") << "Error marker '"<< error_marker_file << "' crashed, setting LastExecEvent to LOGOUT_CRASH" << LL_ENDL; -			} -			else -			{ -				gLastExecEvent = LAST_EXEC_OTHER_CRASH; -				LL_INFOS("MarkerFile") << "Error marker '"<< error_marker_file << "' crashed, setting LastExecEvent to " << gLastExecEvent << LL_ENDL; -			}  		}  		else  		{ +				gLastExecEvent = LAST_EXEC_OTHER_CRASH; +				LL_INFOS("MarkerFile") << "Error marker '"<< error_marker_file << "' crashed, setting LastExecEvent to " << gLastExecEvent << LL_ENDL; +		} +	} +	else +	{  			LL_INFOS("MarkerFile") << "Error marker '"<< error_marker_file << "' marker found, but versions did not match" << LL_ENDL;  		}  		LLAPRFile::remove(error_marker_file); @@ -3748,29 +3934,29 @@ void LLAppViewer::removeMarkerFile(bool leave_logout_marker)  	if (!mSecondInstance)  	{		  		LL_DEBUGS("MarkerFile") << (leave_logout_marker?"leave":"remove") <<" logout" << LL_ENDL; -		if (mMarkerFile.getFileHandle()) -		{ +	if (mMarkerFile.getFileHandle()) +	{  			LL_DEBUGS("MarkerFile") << "removing exec marker '"<<mMarkerFileName<<"'"<< LL_ENDL;  			mMarkerFile.close() ; -			LLAPRFile::remove( mMarkerFileName ); -		} -		else -		{ +		LLAPRFile::remove( mMarkerFileName ); +	} +	else +	{  			LL_WARNS("MarkerFile") << "marker '"<<mMarkerFileName<<"' not open"<< LL_ENDL; -		} -		if (!leave_logout_marker) +	} +	if (!leave_logout_marker) +	{ +		if (mLogoutMarkerFile.getFileHandle())  		{ -			if (mLogoutMarkerFile.getFileHandle()) -			{  				LL_DEBUGS("MarkerFile") << "removing logout marker '"<<mLogoutMarkerFileName<<"'"<< LL_ENDL; -				mLogoutMarkerFile.close(); -			} -			else -			{ +			mLogoutMarkerFile.close(); +		} +		else +		{  				LL_WARNS("MarkerFile") << "logout marker '"<<mLogoutMarkerFileName<<"' not open"<< LL_ENDL; -			} -			LLAPRFile::remove( mLogoutMarkerFileName );  		} +		LLAPRFile::remove( mLogoutMarkerFileName ); +	}  	}  	else  	{ @@ -4713,7 +4899,7 @@ void LLAppViewer::idle()          if (!(logoutRequestSent() && hasSavedFinalSnapshot()))  		{ -			gObjectList.update(gAgent, *LLWorld::getInstance()); +			gObjectList.update(gAgent);  		}  	} @@ -5402,7 +5588,7 @@ void LLAppViewer::handleLoginComplete()  void LLAppViewer::launchUpdater()  { -		LLSD query_map = LLSD::emptyMap(); +	LLSD query_map = LLSD::emptyMap();  	query_map["os"] = gPlatform;  	// *TODO change userserver to be grid on both viewer and sim, since @@ -5599,7 +5785,7 @@ void LLAppViewer::metricsSend(bool enable_reporting)  			// Make a copy of the main stats to send into another thread.  			// Receiving thread takes ownership.  			LLViewerAssetStats * main_stats(new LLViewerAssetStats(*gViewerAssetStatsMain)); -			 +  			// Send a report request into 'thread1' to get the rest of the data  			// and provide some additional parameters while here.  			LLAppViewer::sTextureFetch->commandSendMetrics(caps_url, diff --git a/indra/newview/llappviewer.h b/indra/newview/llappviewer.h index 3ae8a78845..05326c2baf 100755 --- a/indra/newview/llappviewer.h +++ b/indra/newview/llappviewer.h @@ -86,6 +86,10 @@ public:  	const LLOSInfo& getOSInfo() const { return mSysOSInfo; } +	void setServerReleaseNotesURL(const std::string& url) { mServerReleaseNotesURL = url; } +	LLSD getViewerInfo() const; +	std::string getViewerInfoString() const; +  	// Report true if under the control of a debugger. A null-op default.  	virtual bool beingDebugged() { return false; }  @@ -246,6 +250,8 @@ private:  	LLOSInfo mSysOSInfo;   	bool mReportedCrash; +	std::string mServerReleaseNotesURL; +  	// Thread objects.  	static LLTextureCache* sTextureCache;   	static LLImageDecodeThread* sImageDecodeThread;  diff --git a/indra/newview/llavatarrenderinfoaccountant.cpp b/indra/newview/llavatarrenderinfoaccountant.cpp index 77d734cbfe..d6a72b0c05 100644 --- a/indra/newview/llavatarrenderinfoaccountant.cpp +++ b/indra/newview/llavatarrenderinfoaccountant.cpp @@ -256,7 +256,7 @@ void LLAvatarRenderInfoAccountant::sendRenderInfoToRegion(LLViewerRegion * regio  					{  						llinfos << "LRI: Sending avatar render info for " << avatar->getID()  							<< ": " << info << llendl; -						llinfos << "LRI: geometry " << avatar->getAttachmentGeometryBytes() +						llinfos << "LRI: other info geometry " << avatar->getAttachmentGeometryBytes()  							<< ", area " << avatar->getAttachmentSurfaceArea()  							<< llendl;  					} diff --git a/indra/newview/llchathistory.cpp b/indra/newview/llchathistory.cpp index 2eb4074c97..abeaf958eb 100755 --- a/indra/newview/llchathistory.cpp +++ b/indra/newview/llchathistory.cpp @@ -187,6 +187,10 @@ public:  		{  			LLAvatarActions::offerTeleport(getAvatarId());  		} +		else if (level == "request_teleport") +		{ +			LLAvatarActions::teleportRequest(getAvatarId()); +		}  		else if (level == "voice_call")  		{  			LLAvatarActions::startCall(getAvatarId()); @@ -547,7 +551,9 @@ protected:  				menu->setItemEnabled("Send IM", false);  				menu->setItemEnabled("Remove Friend", false);  				menu->setItemEnabled("Offer Teleport",false); +				menu->setItemEnabled("Request Teleport",false);  				menu->setItemEnabled("Voice Call", false); +				menu->setItemEnabled("Chat History", false);  				menu->setItemEnabled("Invite Group", false);  				menu->setItemEnabled("Zoom In", false);  				menu->setItemEnabled("Share", false); @@ -563,6 +569,7 @@ protected:  				menu->setItemVisible("Send IM", false);  			}  				menu->setItemEnabled("Offer Teleport", LLAvatarActions::canOfferTeleport(mAvatarID)); +				menu->setItemEnabled("Request Teleport", LLAvatarActions::canOfferTeleport(mAvatarID));  				menu->setItemEnabled("Voice Call", LLAvatarActions::canCall());  				// We should only show 'Zoom in' item in a nearby chat @@ -570,9 +577,9 @@ protected:  				menu->setItemVisible("Zoom In", should_show_zoom && gObjectList.findObject(mAvatarID));	  				menu->setItemEnabled("Block Unblock", LLAvatarActions::canBlock(mAvatarID));  				menu->setItemEnabled("Mute Text", LLAvatarActions::canBlock(mAvatarID)); +				menu->setItemEnabled("Chat History", LLLogChat::isTranscriptExist(mAvatarID));  			} -			menu->setItemEnabled("Chat History", LLLogChat::isTranscriptExist(mAvatarID));  			menu->setItemEnabled("Map", (LLAvatarTracker::instance().isBuddyOnline(mAvatarID) && is_agent_mappable(mAvatarID)) || gAgent.isGodlike() );  			menu->buildDrawLabels();  			menu->updateParent(LLMenuGL::sMenuContainer); @@ -724,6 +731,7 @@ LLChatHistory::LLChatHistory(const LLChatHistory::Params& p)  	editor_params.follows.flags = FOLLOWS_ALL;  	editor_params.enabled = false; // read only  	editor_params.show_context_menu = "true"; +	editor_params.trusted_content = false;  	mEditor = LLUICtrlFactory::create<LLTextEditor>(editor_params, this);  	mEditor->setIsFriendCallback(LLAvatarActions::isFriend);  } diff --git a/indra/newview/llconversationmodel.h b/indra/newview/llconversationmodel.h index d8cdcdfc97..dc74506c53 100644 --- a/indra/newview/llconversationmodel.h +++ b/indra/newview/llconversationmodel.h @@ -291,6 +291,9 @@ class LLConversationViewModel  {  public:  	typedef LLFolderViewModel<LLConversationSort, LLConversationItem, LLConversationItem, LLConversationFilter> base_t; +	LLConversationViewModel()  +	:	base_t(new LLConversationSort(), new LLConversationFilter()) +	{}  	void sort(LLFolderViewFolder* folder);  	bool contentsReady() { return true; }	// *TODO : we need to check that participants names are available somewhat diff --git a/indra/newview/llconversationview.cpp b/indra/newview/llconversationview.cpp index 82d3fe74c0..90800fee58 100644 --- a/indra/newview/llconversationview.cpp +++ b/indra/newview/llconversationview.cpp @@ -267,7 +267,6 @@ BOOL LLConversationViewSession::handleMouseDown( S32 x, S32 y, MASK mask )      //This node (conversation) was selected and a child (participant) was not      if(result && getRoot())      { -  		if(getRoot()->getCurSelectedItem() == this)  		{  			LLConversationItem* item = dynamic_cast<LLConversationItem *>(getViewModelItem()); @@ -282,7 +281,6 @@ BOOL LLConversationViewSession::handleMouseDown( S32 x, S32 y, MASK mask )  			{  				im_container->collapseMessagesPane(false);  			} -  		}  		selectConversationItem();      } diff --git a/indra/newview/lldrawpoolsimple.cpp b/indra/newview/lldrawpoolsimple.cpp index 8926f64c64..0bc7ae766c 100755 --- a/indra/newview/lldrawpoolsimple.cpp +++ b/indra/newview/lldrawpoolsimple.cpp @@ -37,8 +37,6 @@  #include "llviewershadermgr.h"  #include "llrender.h" -#define GE_FORCE_WORKAROUND LL_DARWIN -  static LLGLSLShader* simple_shader = NULL;  static LLGLSLShader* fullbright_shader = NULL; @@ -660,14 +658,6 @@ void LLDrawPoolFullbrightAlphaMask::beginPostDeferredPass(S32 pass)  	}   	else   	{	 - -// Work-around until we can figure out why the right shader causes -// the GeForce driver to go tango uniform on OS X 10.6.8 only -// -#if GE_FORCE_WORKAROUND -		gObjectFullbrightAlphaMaskProgram.bind(); -		gObjectFullbrightAlphaMaskProgram.uniform1f(LLShaderMgr::TEXTURE_GAMMA, 2.2f); -#else  		if (LLPipeline::sUnderWaterRender)  		{  			gDeferredFullbrightAlphaMaskWaterProgram.bind(); @@ -678,9 +668,7 @@ void LLDrawPoolFullbrightAlphaMask::beginPostDeferredPass(S32 pass)  			gDeferredFullbrightAlphaMaskProgram.bind();  			gDeferredFullbrightAlphaMaskProgram.uniform1f(LLShaderMgr::TEXTURE_GAMMA, 2.2f);  		} -#endif  	} -  }  void LLDrawPoolFullbrightAlphaMask::renderPostDeferred(S32 pass) @@ -699,13 +687,6 @@ void LLDrawPoolFullbrightAlphaMask::endPostDeferredPass(S32 pass)  	}  	else  	{ - -// Work-around until we can figure out why the right shader causes -// the GeForce driver to go tango uniform on OS X 10.6.8 only -// -#if GE_FORCE_WORKAROUND		 -		gObjectFullbrightAlphaMaskProgram.unbind(); -#else  		if (LLPipeline::sUnderWaterRender)  		{  			gDeferredFullbrightAlphaMaskWaterProgram.unbind(); @@ -714,8 +695,6 @@ void LLDrawPoolFullbrightAlphaMask::endPostDeferredPass(S32 pass)  		{  			gDeferredFullbrightAlphaMaskProgram.unbind();  		} -#endif -  	}  	LLRenderPass::endRenderPass(pass);  } diff --git a/indra/newview/llfilepicker.cpp b/indra/newview/llfilepicker.cpp index 16eacc9392..7fa3e176b0 100755 --- a/indra/newview/llfilepicker.cpp +++ b/indra/newview/llfilepicker.cpp @@ -779,7 +779,7 @@ BOOL LLFilePicker::getOpenFile(ELoadFilter filter, bool blocking)  	if(filter == FFLOAD_ALL)	// allow application bundles etc. to be traversed; important for DEV-16869, but generally useful  	{ -        mPickOptions &= F_NAV_SUPPORT; +        mPickOptions |= F_NAV_SUPPORT;  	}  	if (blocking) diff --git a/indra/newview/llfloaterabout.cpp b/indra/newview/llfloaterabout.cpp index fea8e34729..4331a63346 100755 --- a/indra/newview/llfloaterabout.cpp +++ b/indra/newview/llfloaterabout.cpp @@ -70,8 +70,6 @@  extern LLMemoryInfo gSysMemory;  extern U32 gPacketsIn; -static std::string get_viewer_release_notes_url(); -  ///----------------------------------------------------------------------------  /// Class LLServerReleaseNotesURLFetcher  ///---------------------------------------------------------------------------- @@ -108,8 +106,6 @@ public:  	static LLSD getInfo();  	void onClickCopyToClipboard(); -	void updateServerReleaseNotesURL(const std::string& url); -  private:  	void setSupportText(const std::string& server_release_notes_url);  }; @@ -219,107 +215,9 @@ BOOL LLFloaterAbout::postBuild()  	return TRUE;  } -// static  LLSD LLFloaterAbout::getInfo()  { -	// The point of having one method build an LLSD info block and the other -	// construct the user-visible About string is to ensure that the same info -	// is available to a getInfo() caller as to the user opening -	// LLFloaterAbout. -	LLSD info; -	LLSD version; -	version.append(LLVersionInfo::getMajor()); -	version.append(LLVersionInfo::getMinor()); -	version.append(LLVersionInfo::getPatch()); -	version.append(LLVersionInfo::getBuild()); -	info["VIEWER_VERSION"] = version; -	info["VIEWER_VERSION_STR"] = LLVersionInfo::getVersion(); -	info["BUILD_DATE"] = __DATE__; -	info["BUILD_TIME"] = __TIME__; -	info["CHANNEL"] = LLVersionInfo::getChannel(); - -	info["VIEWER_RELEASE_NOTES_URL"] = get_viewer_release_notes_url(); - -#if LL_MSVC -	info["COMPILER"] = "MSVC"; -	info["COMPILER_VERSION"] = _MSC_VER; -#elif LL_GNUC -	info["COMPILER"] = "GCC"; -	info["COMPILER_VERSION"] = GCC_VERSION; -#endif - -	// Position -	LLViewerRegion* region = gAgent.getRegion(); -	if (region) -	{ -		LLVector3d pos = gAgent.getPositionGlobal(); -		info["POSITION"] = ll_sd_from_vector3d(pos); -		info["POSITION_LOCAL"] = ll_sd_from_vector3(gAgent.getPosAgentFromGlobal(pos)); -		info["REGION"] = gAgent.getRegion()->getName(); -		info["HOSTNAME"] = gAgent.getRegion()->getHost().getHostName(); -		info["HOSTIP"] = gAgent.getRegion()->getHost().getString(); -		info["SERVER_VERSION"] = gLastVersionChannel; -		LLSLURL slurl; -		LLAgentUI::buildSLURL(slurl); -		info["SLURL"] = slurl.getSLURLString(); -	} - -	// CPU -	info["CPU"] = gSysCPU.getCPUString(); -	info["MEMORY_MB"] = LLSD::Integer(gSysMemory.getPhysicalMemoryKB() / 1024); -	// Moved hack adjustment to Windows memory size into llsys.cpp -	info["OS_VERSION"] = LLAppViewer::instance()->getOSInfo().getOSString(); -	info["GRAPHICS_CARD_VENDOR"] = (const char*)(glGetString(GL_VENDOR)); -	info["GRAPHICS_CARD"] = (const char*)(glGetString(GL_RENDERER)); - -#if LL_WINDOWS -    LLSD driver_info = gDXHardware.getDisplayInfo(); -    if (driver_info.has("DriverVersion")) -    { -        info["GRAPHICS_DRIVER_VERSION"] = driver_info["DriverVersion"]; -    } -#endif - -	info["OPENGL_VERSION"] = (const char*)(glGetString(GL_VERSION)); -	info["LIBCURL_VERSION"] = LLCurl::getVersionString(); -	info["J2C_VERSION"] = LLImageJ2C::getEngineInfo(); -	bool want_fullname = true; -	info["AUDIO_DRIVER_VERSION"] = gAudiop ? LLSD(gAudiop->getDriverName(want_fullname)) : LLSD(); -	if(LLVoiceClient::getInstance()->voiceEnabled()) -	{ -		LLVoiceVersionInfo version = LLVoiceClient::getInstance()->getVersion(); -		std::ostringstream version_string; -		version_string << version.serverType << " " << version.serverVersion << std::endl; -		info["VOICE_VERSION"] = version_string.str(); -	} -	else  -	{ -		info["VOICE_VERSION"] = LLTrans::getString("NotConnected"); -	} -	 -	// TODO: Implement media plugin version query -	info["QT_WEBKIT_VERSION"] = "4.7.1 (version number hard-coded)"; - -	if (gPacketsIn > 0) -	{ -		info["PACKETS_LOST"] = LLViewerStats::getInstance()->mPacketsLostStat.getCurrent(); -		info["PACKETS_IN"] = F32(gPacketsIn); -		info["PACKETS_PCT"] = 100.f*info["PACKETS_LOST"].asReal() / info["PACKETS_IN"].asReal(); -	} - -    return info; -} - -static std::string get_viewer_release_notes_url() -{ -	// return a URL to the release notes for this viewer, such as: -	// http://wiki.secondlife.com/wiki/Release_Notes/Second Life Beta Viewer/2.1.0.123456 -	std::string url = LLTrans::getString("RELEASE_NOTES_BASE_URL"); -	if (! LLStringUtil::endsWith(url, "/")) -		url += "/"; -	url += LLVersionInfo::getChannel() + "/"; -	url += LLVersionInfo::getVersion(); -	return LLWeb::escapeURL(url); +	return LLAppViewer::instance()->getViewerInfo();  }  class LLFloaterAboutListener: public LLEventAPI @@ -356,93 +254,22 @@ void LLFloaterAbout::onClickCopyToClipboard()  	support_widget->deselect();  } -void LLFloaterAbout::updateServerReleaseNotesURL(const std::string& url) -{ -	setSupportText(url); -} -  void LLFloaterAbout::setSupportText(const std::string& server_release_notes_url)  {  #if LL_WINDOWS  	getWindow()->incBusyCount();  	getWindow()->setCursor(UI_CURSOR_ARROW);  #endif -	LLSD info(getInfo());  #if LL_WINDOWS  	getWindow()->decBusyCount();  	getWindow()->setCursor(UI_CURSOR_ARROW);  #endif -	if (LLStringUtil::startsWith(server_release_notes_url, "http")) // it's an URL -	{ -		info["SERVER_RELEASE_NOTES_URL"] = "[" + LLWeb::escapeURL(server_release_notes_url) + " " + LLTrans::getString("ReleaseNotes") + "]"; -	} -	else -	{ -		info["SERVER_RELEASE_NOTES_URL"] = server_release_notes_url; -	} -  	LLViewerTextEditor *support_widget =  		getChild<LLViewerTextEditor>("support_editor", true); -	std::ostringstream support; - -	// Render the LLSD from getInfo() as a format_map_t -	LLStringUtil::format_map_t args; - -	// allow the "Release Notes" URL label to be localized -	args["ReleaseNotes"] = LLTrans::getString("ReleaseNotes"); - -	for (LLSD::map_const_iterator ii(info.beginMap()), iend(info.endMap()); -		 ii != iend; ++ii) -	{ -		if (! ii->second.isArray()) -		{ -			// Scalar value -			if (ii->second.isUndefined()) -			{ -				args[ii->first] = getString("none"); -			} -			else -			{ -				// don't forget to render value asString() -				args[ii->first] = ii->second.asString(); -			} -		} -		else -		{ -			// array value: build KEY_0, KEY_1 etc. entries -			for (LLSD::Integer n(0), size(ii->second.size()); n < size; ++n) -			{ -				args[STRINGIZE(ii->first << '_' << n)] = ii->second[n].asString(); -			} -		} -	} - -	// Now build the various pieces -	support << getString("AboutHeader", args); -	if (info.has("REGION")) -	{ -		support << "\n\n" << getString("AboutPosition", args); -	} -	support << "\n\n" << getString("AboutSystem", args); -	support << "\n"; -	if (info.has("GRAPHICS_DRIVER_VERSION")) -	{ -		support << "\n" << getString("AboutDriver", args); -	} -	support << "\n" << getString("AboutLibs", args); -	if (info.has("COMPILER")) -	{ -		support << "\n" << getString("AboutCompiler", args); -	} -	if (info.has("PACKETS_IN")) -	{ -		support << '\n' << getString("AboutTraffic", args); -	} -  	support_widget->clear(); -	support_widget->appendText(support.str(), +	support_widget->appendText(LLAppViewer::instance()->getViewerInfoString(),  								FALSE,  								LLStyle::Params()  									.color(LLUIColorTable::instance().getColor("TextFgReadOnlyColor"))); @@ -489,9 +316,9 @@ void LLServerReleaseNotesURLFetcher::completedHeader(U32 status, const std::stri  		std::string location = content["location"].asString();  		if (location.empty())  		{ -			location = floater_about->getString("ErrorFetchingServerReleaseNotesURL"); +			location = LLTrans::getString("ErrorFetchingServerReleaseNotesURL");  		} -		floater_about->updateServerReleaseNotesURL(location); +		LLAppViewer::instance()->setServerReleaseNotesURL(location);  	}  } diff --git a/indra/newview/llfloaterbulkpermission.cpp b/indra/newview/llfloaterbulkpermission.cpp index 76f62a7880..07bd262c00 100755 --- a/indra/newview/llfloaterbulkpermission.cpp +++ b/indra/newview/llfloaterbulkpermission.cpp @@ -82,6 +82,11 @@ BOOL LLFloaterBulkPermission::postBuild()  	mBulkChangeNextOwnerCopy = gSavedSettings.getBOOL("BulkChangeNextOwnerCopy");  	mBulkChangeNextOwnerTransfer = gSavedSettings.getBOOL("BulkChangeNextOwnerTransfer"); +	// fix invalid permissions case (in case initial settings were generated by a viewer affected by MAINT-3339) +	if( !mBulkChangeNextOwnerTransfer && !mBulkChangeEveryoneCopy) +	{ +		mBulkChangeNextOwnerTransfer = true; +	}  	return TRUE;  } diff --git a/indra/newview/llfloaterconversationpreview.cpp b/indra/newview/llfloaterconversationpreview.cpp index a303c2c6b3..a358b7c10b 100755 --- a/indra/newview/llfloaterconversationpreview.cpp +++ b/indra/newview/llfloaterconversationpreview.cpp @@ -32,6 +32,7 @@  #include "llfloaterimnearbychat.h"  #include "llspinctrl.h"  #include "lltrans.h" +#include "llnotificationsutil.h"  const std::string LL_FCP_COMPLETE_NAME("complete_name");  const std::string LL_FCP_ACCOUNT_NAME("user_name"); @@ -45,14 +46,20 @@ LLFloaterConversationPreview::LLFloaterConversationPreview(const LLSD& session_i  	mAccountName(session_id[LL_FCP_ACCOUNT_NAME]),  	mCompleteName(session_id[LL_FCP_COMPLETE_NAME]),  	mMutex(NULL), -	mShowHistory(false) +	mShowHistory(false), +	mMessages(NULL), +	mHistoryThreadsBusy(false), +	mOpened(false) +{ +} + +LLFloaterConversationPreview::~LLFloaterConversationPreview()  {  }  BOOL LLFloaterConversationPreview::postBuild()  {  	mChatHistory = getChild<LLChatHistory>("chat_history"); -	LLLoadHistoryThread::setLoadEndSignal(boost::bind(&LLFloaterConversationPreview::setPages, this, _1, _2));  	const LLConversation* conv = LLConversationLog::instance().getConversation(mSessionID);  	std::string name; @@ -79,31 +86,21 @@ BOOL LLFloaterConversationPreview::postBuild()  	std::string title = getString("Title", args);  	setTitle(title); -	LLSD load_params; -	load_params["load_all_history"] = true; -	load_params["cut_off_todays_date"] = false; - - -	LLSD loading; -	loading[LL_IM_TEXT] = LLTrans::getString("loading_chat_logs"); -	mMessages.push_back(loading); -	mPageSpinner = getChild<LLSpinCtrl>("history_page_spin"); -	mPageSpinner->setCommitCallback(boost::bind(&LLFloaterConversationPreview::onMoreHistoryBtnClick, this)); -	mPageSpinner->setMinValue(1); -	mPageSpinner->set(1); -	mPageSpinner->setEnabled(false); -	LLLogChat::startChatHistoryThread(file, load_params);  	return LLFloater::postBuild();  } -void LLFloaterConversationPreview::setPages(std::list<LLSD>& messages,const std::string& file_name) +void LLFloaterConversationPreview::setPages(std::list<LLSD>* messages, const std::string& file_name)  { -	if(file_name == mChatHistoryFileName) +	if(file_name == mChatHistoryFileName && messages)  	{  		// additional protection to avoid changes of mMessages in setPages()  		LLMutexLock lock(&mMutex); +		if (mMessages) +		{ +			delete mMessages; // Clean up temporary message list with "Loading..." text +		}  		mMessages = messages; -		mCurrentPage = (mMessages.size() ? (mMessages.size() - 1) / mPageSize : 0); +		mCurrentPage = (mMessages->size() ? (mMessages->size() - 1) / mPageSize : 0);  		mPageSpinner->setEnabled(true);  		mPageSpinner->setMaxValue(mCurrentPage+1); @@ -113,6 +110,11 @@ void LLFloaterConversationPreview::setPages(std::list<LLSD>& messages,const std:  		getChild<LLTextBox>("page_num_label")->setValue(total_page_num);  		mShowHistory = true;  	} +	LLLoadHistoryThread* loadThread = LLLogChat::getLoadHistoryThread(mSessionID); +	if (loadThread) +	{ +		loadThread->removeLoadEndSignal(boost::bind(&LLFloaterConversationPreview::setPages, this, _1, _2)); +	}  }  void LLFloaterConversationPreview::draw() @@ -127,24 +129,82 @@ void LLFloaterConversationPreview::draw()  void LLFloaterConversationPreview::onOpen(const LLSD& key)  { +	if (mOpened) +	{ +		return; +	} +	mOpened = true; +	if (!LLLogChat::historyThreadsFinished(mSessionID)) +	{ +		LLNotificationsUtil::add("ChatHistoryIsBusyAlert"); +		mHistoryThreadsBusy = true; +		closeFloater(); +		return; +	} +	LLSD load_params; +	load_params["load_all_history"] = true; +	load_params["cut_off_todays_date"] = false; + +	// The temporary message list with "Loading..." text +	// Will be deleted upon loading completion in setPages() method +	mMessages = new std::list<LLSD>(); + + +	LLSD loading; +	loading[LL_IM_TEXT] = LLTrans::getString("loading_chat_logs"); +	mMessages->push_back(loading); +	mPageSpinner = getChild<LLSpinCtrl>("history_page_spin"); +	mPageSpinner->setCommitCallback(boost::bind(&LLFloaterConversationPreview::onMoreHistoryBtnClick, this)); +	mPageSpinner->setMinValue(1); +	mPageSpinner->set(1); +	mPageSpinner->setEnabled(false); + +	// The actual message list to load from file +	// Will be deleted in a separate thread LLDeleteHistoryThread not to freeze UI +	// LLDeleteHistoryThread is started in destructor +	std::list<LLSD>* messages = new std::list<LLSD>(); + +	LLLogChat::cleanupHistoryThreads(); +	 +	LLLoadHistoryThread* loadThread = new LLLoadHistoryThread(mChatHistoryFileName, messages, load_params); +	loadThread->setLoadEndSignal(boost::bind(&LLFloaterConversationPreview::setPages, this, _1, _2)); +	loadThread->start(); +	LLLogChat::addLoadHistoryThread(mSessionID, loadThread); + +	LLDeleteHistoryThread* deleteThread = new LLDeleteHistoryThread(messages, loadThread); +	LLLogChat::addDeleteHistoryThread(mSessionID, deleteThread); +  	mShowHistory = true;  } +void LLFloaterConversationPreview::onClose(bool app_quitting) +{ +	mOpened = false; +	if (!mHistoryThreadsBusy) +	{ +		LLDeleteHistoryThread* deleteThread = LLLogChat::getDeleteHistoryThread(mSessionID); +		if (deleteThread) +		{ +			deleteThread->start(); +		} +	} +} +  void LLFloaterConversationPreview::showHistory()  {  	// additional protection to avoid changes of mMessages in setPages  	LLMutexLock lock(&mMutex); -	if (!mMessages.size() || mCurrentPage * mPageSize >= mMessages.size()) +	if(mMessages == NULL || !mMessages->size() || mCurrentPage * mPageSize >= mMessages->size())  	{  		return;  	}  	mChatHistory->clear();  	std::ostringstream message; -	std::list<LLSD>::const_iterator iter = mMessages.begin(); +	std::list<LLSD>::const_iterator iter = mMessages->begin();  	std::advance(iter, mCurrentPage * mPageSize); -	for (int msg_num = 0; iter != mMessages.end() && msg_num < mPageSize; ++iter, ++msg_num) +	for (int msg_num = 0; iter != mMessages->end() && msg_num < mPageSize; ++iter, ++msg_num)  	{  		LLSD msg = *iter; diff --git a/indra/newview/llfloaterconversationpreview.h b/indra/newview/llfloaterconversationpreview.h index b0488f4ff1..a8dbbc9ffe 100755 --- a/indra/newview/llfloaterconversationpreview.h +++ b/indra/newview/llfloaterconversationpreview.h @@ -39,13 +39,14 @@ class LLFloaterConversationPreview : public LLFloater  public:  	LLFloaterConversationPreview(const LLSD& session_id); -	virtual ~LLFloaterConversationPreview(){}; +	virtual ~LLFloaterConversationPreview();  	virtual BOOL postBuild(); -	void setPages(std::list<LLSD>& messages,const std::string& file_name); +	void setPages(std::list<LLSD>* messages,const std::string& file_name);  	virtual void draw();  	virtual void onOpen(const LLSD& key); +	virtual void onClose(bool app_quitting);  private:  	void onMoreHistoryBtnClick(); @@ -58,11 +59,13 @@ private:  	int				mCurrentPage;  	int				mPageSize; -	std::list<LLSD> mMessages; +	std::list<LLSD>*	mMessages;  	std::string		mAccountName;  	std::string		mCompleteName; -	std::string     mChatHistoryFileName; +	std::string		mChatHistoryFileName;  	bool			mShowHistory; +	bool			mHistoryThreadsBusy; +	bool			mOpened;  };  #endif /* LLFLOATERCONVERSATIONPREVIEW_H_ */ diff --git a/indra/newview/llfloaterimsession.cpp b/indra/newview/llfloaterimsession.cpp index 14e1a486d3..9a21c59c9d 100755 --- a/indra/newview/llfloaterimsession.cpp +++ b/indra/newview/llfloaterimsession.cpp @@ -690,7 +690,7 @@ void LLFloaterIMSession::setVisible(BOOL visible)  	if (visible && isInVisibleChain())  	{  		sIMFloaterShowedSignal(mSessionID); -         +        updateMessages();  	}  } diff --git a/indra/newview/llfloaterimsessiontab.cpp b/indra/newview/llfloaterimsessiontab.cpp index 0ccfdb9a7b..29511f56ff 100755 --- a/indra/newview/llfloaterimsessiontab.cpp +++ b/indra/newview/llfloaterimsessiontab.cpp @@ -825,6 +825,7 @@ void LLFloaterIMSessionTab::updateCallBtnState(bool callIsActive)  void LLFloaterIMSessionTab::onSlide(LLFloaterIMSessionTab* self)  {  	LLFloaterIMContainer* host_floater = dynamic_cast<LLFloaterIMContainer*>(self->getHost()); +	bool should_be_expanded = false;  	if (host_floater)  	{  		// Hide the messages pane if a floater is hosted in the Conversations @@ -835,7 +836,7 @@ void LLFloaterIMSessionTab::onSlide(LLFloaterIMSessionTab* self)  		if (!self->mIsP2PChat)  		{              // The state must toggle the collapsed state of the panel -            bool should_be_expanded = self->mParticipantListPanel->isCollapsed(); +           should_be_expanded = self->mParticipantListPanel->isCollapsed();  			// Update the expand/collapse flag of the participant list panel and save it              gSavedSettings.setBOOL("IMShowControlPanel", should_be_expanded); @@ -847,6 +848,10 @@ void LLFloaterIMSessionTab::onSlide(LLFloaterIMSessionTab* self)  	}  	self->assignResizeLimits(); +	if (should_be_expanded) +	{ +		self->forceReshape(); +	}  }  void LLFloaterIMSessionTab::onCollapseToLine(LLFloaterIMSessionTab* self) diff --git a/indra/newview/llfloaterland.cpp b/indra/newview/llfloaterland.cpp index 6c8e81e563..9250ae9ae9 100755 --- a/indra/newview/llfloaterland.cpp +++ b/indra/newview/llfloaterland.cpp @@ -2331,7 +2331,7 @@ BOOL LLPanelLandAccess::postBuild()  	childSetCommitCallback("public_access", onCommitPublicAccess, this);  	childSetCommitCallback("limit_payment", onCommitAny, this);  	childSetCommitCallback("limit_age_verified", onCommitAny, this); -	childSetCommitCallback("GroupCheck", onCommitAny, this); +	childSetCommitCallback("GroupCheck", onCommitGroupCheck, this);  	childSetCommitCallback("PassCheck", onCommitAny, this);  	childSetCommitCallback("pass_combo", onCommitAny, this);  	childSetCommitCallback("PriceSpin", onCommitAny, this); @@ -2496,11 +2496,11 @@ void LLPanelLandAccess::refresh()  		}  		BOOL use_pass = parcel->getParcelFlag(PF_USE_PASS_LIST); -		getChild<LLUICtrl>("PassCheck")->setValue(use_pass ); +		getChild<LLUICtrl>("PassCheck")->setValue(use_pass);  		LLCtrlSelectionInterface* passcombo = childGetSelectionInterface("pass_combo");  		if (passcombo)  		{ -			if (public_access || !use_pass || !use_group) +			if (public_access || !use_pass)  			{  				passcombo->selectByValue("anyone");  			} @@ -2593,12 +2593,11 @@ void LLPanelLandAccess::refresh_ui()  			getChildView("limit_age_verified")->setEnabled(FALSE); -			BOOL group_access = getChild<LLUICtrl>("GroupCheck")->getValue().asBoolean();  			BOOL sell_passes = getChild<LLUICtrl>("PassCheck")->getValue().asBoolean();  			getChildView("PassCheck")->setEnabled(can_manage_allowed);  			if (sell_passes)  			{ -				getChildView("pass_combo")->setEnabled(group_access && can_manage_allowed); +				getChildView("pass_combo")->setEnabled(can_manage_allowed);  				getChildView("PriceSpin")->setEnabled(can_manage_allowed);  				getChildView("HoursSpin")->setEnabled(can_manage_allowed);  			} @@ -2657,6 +2656,32 @@ void LLPanelLandAccess::onCommitPublicAccess(LLUICtrl *ctrl, void *userdata)  	onCommitAny(ctrl, userdata);  } +void LLPanelLandAccess::onCommitGroupCheck(LLUICtrl *ctrl, void *userdata) +{ +	LLPanelLandAccess *self = (LLPanelLandAccess *)userdata; +	LLParcel* parcel = self->mParcel->getParcel(); +	if (!parcel) +	{ +		return; +	} + +	BOOL use_pass_list = !self->getChild<LLUICtrl>("public_access")->getValue().asBoolean(); +	BOOL use_access_group = self->getChild<LLUICtrl>("GroupCheck")->getValue().asBoolean(); +	LLCtrlSelectionInterface* passcombo = self->childGetSelectionInterface("pass_combo"); +	if (passcombo) +	{ +		if (use_access_group && use_pass_list) +		{ +			if (passcombo->getSelectedValue().asString() == "group") +			{ +				passcombo->selectByValue("anyone"); +			} +		} +	} + +	onCommitAny(ctrl, userdata); +} +  // static  void LLPanelLandAccess::onCommitAny(LLUICtrl *ctrl, void *userdata)  { @@ -2694,14 +2719,14 @@ void LLPanelLandAccess::onCommitAny(LLUICtrl *ctrl, void *userdata)  	{  		use_access_list = TRUE;  		use_pass_list = self->getChild<LLUICtrl>("PassCheck")->getValue().asBoolean(); -		if (use_access_group && use_pass_list) +		LLCtrlSelectionInterface* passcombo = self->childGetSelectionInterface("pass_combo"); +		if (passcombo)  		{ -			LLCtrlSelectionInterface* passcombo = self->childGetSelectionInterface("pass_combo"); -			if (passcombo) +			if (use_access_group && use_pass_list)  			{  				if (passcombo->getSelectedValue().asString() == "group")  				{ -					use_access_list = FALSE; +					use_access_group = FALSE;  				}  			}  		} diff --git a/indra/newview/llfloaterland.h b/indra/newview/llfloaterland.h index 4f1c10274a..95612fcb4a 100755 --- a/indra/newview/llfloaterland.h +++ b/indra/newview/llfloaterland.h @@ -366,6 +366,7 @@ public:  	static void onCommitPublicAccess(LLUICtrl* ctrl, void *userdata);  	static void onCommitAny(LLUICtrl* ctrl, void *userdata); +	static void onCommitGroupCheck(LLUICtrl* ctrl, void *userdata);  	static void onClickRemoveAccess(void*);  	static void onClickRemoveBanned(void*); diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp index 87ae36716d..c339ee3beb 100755 --- a/indra/newview/llfloaterpreference.cpp +++ b/indra/newview/llfloaterpreference.cpp @@ -238,6 +238,7 @@ bool callback_clear_browser_cache(const LLSD& notification, const LLSD& response  void handleNameTagOptionChanged(const LLSD& newvalue)  { +	LLAvatarNameCache::setUseUsernames(gSavedSettings.getBOOL("NameTagShowUsernames"));  	LLVOAvatar::invalidateNameTags();  } diff --git a/indra/newview/llfloaterregioninfo.cpp b/indra/newview/llfloaterregioninfo.cpp index 66bf49331b..98ec0d489a 100755 --- a/indra/newview/llfloaterregioninfo.cpp +++ b/indra/newview/llfloaterregioninfo.cpp @@ -365,6 +365,7 @@ void LLFloaterRegionInfo::processRegionInfo(LLMessageSystem* msg)  	panel->getChild<LLUICtrl>("block_terraform_check")->setValue((region_flags & REGION_FLAGS_BLOCK_TERRAFORM) ? TRUE : FALSE );  	panel->getChild<LLUICtrl>("block_fly_check")->setValue((region_flags & REGION_FLAGS_BLOCK_FLY) ? TRUE : FALSE ); +	panel->getChild<LLUICtrl>("block_fly_over_check")->setValue((region_flags & REGION_FLAGS_BLOCK_FLYOVER) ? TRUE : FALSE );  	panel->getChild<LLUICtrl>("allow_damage_check")->setValue((region_flags & REGION_FLAGS_ALLOW_DAMAGE) ? TRUE : FALSE );  	panel->getChild<LLUICtrl>("restrict_pushobject")->setValue((region_flags & REGION_FLAGS_RESTRICT_PUSHOBJECT) ? TRUE : FALSE );  	panel->getChild<LLUICtrl>("allow_land_resell_check")->setValue((region_flags & REGION_FLAGS_BLOCK_LAND_RESELL) ? FALSE : TRUE ); @@ -634,6 +635,7 @@ BOOL LLPanelRegionGeneralInfo::postBuild()  	// Enable the "Apply" button if something is changed. JC  	initCtrl("block_terraform_check");  	initCtrl("block_fly_check"); +	initCtrl("block_fly_over_check");  	initCtrl("allow_damage_check");  	initCtrl("allow_land_resell_check");  	initCtrl("allow_parcel_changes_check"); @@ -815,6 +817,7 @@ BOOL LLPanelRegionGeneralInfo::sendUpdate()  	{  		body["block_terraform"] = getChild<LLUICtrl>("block_terraform_check")->getValue();  		body["block_fly"] = getChild<LLUICtrl>("block_fly_check")->getValue(); +		body["block_fly_over"] = getChild<LLUICtrl>("block_fly_over_check")->getValue();  		body["allow_damage"] = getChild<LLUICtrl>("allow_damage_check")->getValue();  		body["allow_land_resell"] = getChild<LLUICtrl>("allow_land_resell_check")->getValue();  		body["agent_limit"] = getChild<LLUICtrl>("agent_limit_spin")->getValue(); @@ -890,6 +893,7 @@ BOOL LLPanelRegionDebugInfo::postBuild()  	childSetAction("top_scripts_btn", onClickTopScripts, this);  	childSetAction("restart_btn", onClickRestart, this);  	childSetAction("cancel_restart_btn", onClickCancelRestart, this); +	childSetAction("region_debug_console_btn", onClickDebugConsole, this);  	return TRUE;  } @@ -911,6 +915,7 @@ bool LLPanelRegionDebugInfo::refreshFromRegion(LLViewerRegion* region)  	getChildView("top_scripts_btn")->setEnabled(allow_modify);  	getChildView("restart_btn")->setEnabled(allow_modify);  	getChildView("cancel_restart_btn")->setEnabled(allow_modify); +	getChildView("region_debug_console_btn")->setEnabled(allow_modify);  	return LLPanelRegionInfo::refreshFromRegion(region);  } @@ -1073,6 +1078,11 @@ void LLPanelRegionDebugInfo::onClickCancelRestart(void* data)  	self->sendEstateOwnerMessage(gMessageSystem, "restart", invoice, strings);  } +// static +void LLPanelRegionDebugInfo::onClickDebugConsole(void* data) +{ +	LLFloaterReg::showInstance("region_debug_console"); +}  BOOL LLPanelRegionTerrainInfo::validateTextureSizes()  { diff --git a/indra/newview/llfloaterregioninfo.h b/indra/newview/llfloaterregioninfo.h index f0499f1903..bf174f3700 100755 --- a/indra/newview/llfloaterregioninfo.h +++ b/indra/newview/llfloaterregioninfo.h @@ -209,6 +209,7 @@ protected:  	static void onClickRestart(void* data);  	bool callbackRestart(const LLSD& notification, const LLSD& response);  	static void onClickCancelRestart(void* data); +	static void onClickDebugConsole(void* data);  private:  	LLUUID mTargetAvatar; diff --git a/indra/newview/llfloatersnapshot.cpp b/indra/newview/llfloatersnapshot.cpp index ea385d7baf..a416765157 100755 --- a/indra/newview/llfloatersnapshot.cpp +++ b/indra/newview/llfloatersnapshot.cpp @@ -44,7 +44,6 @@  #include "lltoolfocus.h"  #include "lltoolmgr.h"  #include "llwebprofile.h" -#include "llwebsharing.h"  ///----------------------------------------------------------------------------  /// Local function declarations, constants, enums, and typedefs @@ -360,10 +359,6 @@ void LLFloaterSnapshot::Impl::updateControls(LLFloaterSnapshot* floater)  	ESnapshotFormat shot_format = (ESnapshotFormat)gSavedSettings.getS32("SnapshotFormat");  	LLViewerWindow::ESnapshotType layer_type = getLayerType(floater); -#if 0 -	floater->getChildView("share_to_web")->setVisible( gSavedSettings.getBOOL("SnapshotSharingEnabled")); -#endif -  	floater->getChild<LLComboBox>("local_format_combo")->selectNthItem(gSavedSettings.getS32("SnapshotFormat"));  	enableAspectRatioCheckbox(floater, !floater->impl.mAspectRatioCheckOff);  	setAspectRatioCheckboxValue(floater, gSavedSettings.getBOOL("KeepAspectForSnapshot")); @@ -1032,12 +1027,6 @@ LLFloaterSnapshot::~LLFloaterSnapshot()  BOOL LLFloaterSnapshot::postBuild()  { -	// Kick start Web Sharing, to fetch its config data if it needs to. -	if (gSavedSettings.getBOOL("SnapshotSharingEnabled")) -	{ -		LLWebSharing::instance().init(); -	} -  	mRefreshBtn = getChild<LLUICtrl>("new_snapshot_btn");  	childSetAction("new_snapshot_btn", Impl::onClickNewSnapshot, this);  	mRefreshLabel = getChild<LLUICtrl>("refresh_lbl"); diff --git a/indra/newview/llfloatertoybox.cpp b/indra/newview/llfloatertoybox.cpp index 324afe661f..a025a859e7 100755 --- a/indra/newview/llfloatertoybox.cpp +++ b/indra/newview/llfloatertoybox.cpp @@ -107,7 +107,7 @@ void LLFloaterToybox::draw()  	{  		const LLCommandId& id = *it; -		const bool command_not_present = (gToolBarView->hasCommand(id) == LLToolBarView::TOOLBAR_NONE); +		const bool command_not_present = (gToolBarView->hasCommand(id) == LLToolBarEnums::TOOLBAR_NONE);  		mToolBar->enableCommand(id, command_not_present);  	} @@ -175,9 +175,9 @@ void LLFloaterToybox::onToolBarButtonEnter(LLView* button)  		switch(command_loc)  		{ -		case LLToolBarView::TOOLBAR_BOTTOM:	suffix = LLTrans::getString("Toolbar_Bottom_Tooltip");	break; -		case LLToolBarView::TOOLBAR_LEFT:	suffix = LLTrans::getString("Toolbar_Left_Tooltip");	break; -		case LLToolBarView::TOOLBAR_RIGHT:	suffix = LLTrans::getString("Toolbar_Right_Tooltip");	break; +		case LLToolBarEnums::TOOLBAR_BOTTOM:	suffix = LLTrans::getString("Toolbar_Bottom_Tooltip");	break; +		case LLToolBarEnums::TOOLBAR_LEFT:	suffix = LLTrans::getString("Toolbar_Left_Tooltip");	break; +		case LLToolBarEnums::TOOLBAR_RIGHT:	suffix = LLTrans::getString("Toolbar_Right_Tooltip");	break;  		default:  			break; diff --git a/indra/newview/llfolderviewmodelinventory.h b/indra/newview/llfolderviewmodelinventory.h index 9dcfdfa185..8772185ad0 100755 --- a/indra/newview/llfolderviewmodelinventory.h +++ b/indra/newview/llfolderviewmodelinventory.h @@ -105,6 +105,10 @@ class LLFolderViewModelInventory  public:  	typedef LLFolderViewModel<LLInventorySort,   LLFolderViewModelItemInventory, LLFolderViewModelItemInventory,   LLInventoryFilter> base_t; +	LLFolderViewModelInventory(const std::string& name) +	:	base_t(new LLInventorySort(), new LLInventoryFilter(LLInventoryFilter::Params().name(name))) +	{} +  	void setTaskID(const LLUUID& id) {mTaskID = id;}  	void sort(LLFolderViewFolder* folder); diff --git a/indra/newview/llgiveinventory.cpp b/indra/newview/llgiveinventory.cpp index 72bea8db10..0dd84b6073 100755 --- a/indra/newview/llgiveinventory.cpp +++ b/indra/newview/llgiveinventory.cpp @@ -139,7 +139,7 @@ bool LLGiveInventory::isInventoryGiveAcceptable(const LLInventoryItem* item)  			BOOL copyable = false;  			if (item->getPermissions().allowCopyBy(gAgentID)) copyable = true; -			if (!copyable && get_is_item_worn(item->getUUID())) +			if (!copyable || get_is_item_worn(item->getUUID()))  			{  				acceptable = false;  			} diff --git a/indra/newview/llglsandbox.cpp b/indra/newview/llglsandbox.cpp index 60fa53f491..cf550e5eff 100755 --- a/indra/newview/llglsandbox.cpp +++ b/indra/newview/llglsandbox.cpp @@ -62,6 +62,7 @@  #include "llresmgr.h"  #include "pipeline.h"  #include "llspatialpartition.h" +#include "llviewershadermgr.h"  // Height of the yellow selection highlight posts for land  const F32 PARCEL_POST_HEIGHT = 0.666f; @@ -623,7 +624,8 @@ void LLViewerParcelMgr::renderCollisionSegments(U8* segments, BOOL use_pass, LLV  	LLGLDepthTest gls_depth(GL_TRUE, GL_FALSE);  	LLGLDisable cull(GL_CULL_FACE); -	if (mCollisionBanned == BA_BANNED) +	if (mCollisionBanned == BA_BANNED || +		regionp->getRegionFlag(REGION_FLAGS_BLOCK_FLYOVER))  	{  		collision_height = BAN_HEIGHT;  	} @@ -767,7 +769,6 @@ void draw_line_cube(F32 width, const LLVector3& center)  	gGL.vertex3f(center.mV[VX] + width ,center.mV[VY] - width,center.mV[VZ] - width);  } -  void LLViewerObjectList::renderObjectBeacons()  {  	if (mDebugBeacons.empty()) @@ -878,3 +879,134 @@ void LLViewerObjectList::renderObjectBeacons()  } +void gpu_benchmark() +{ +	if (!LLGLSLShader::sNoFixedFunction) +	{ //don't bother benchmarking the fixed function +		return; +	} + +	//measure memory bandwidth by: +	// - allocating a batch of textures and render targets +	// - rendering those textures to those render targets +	// - recording time taken +	// - taking the median time for a given number of samples +	 +	//resolution of textures/render targets +	const U32 res = 1024; +	 +	//number of textures +	const U32 count = 32; + +	//number of samples to take +	const S32 samples = 64; + +	LLGLSLShader::initProfile(); + +	LLRenderTarget dest[count]; +	U32 source[count]; +	LLImageGL::generateTextures(count, source); +	std::vector<F32> results; + +	//build a random texture +	U8 pixels[res*res*4]; + +	for (U32 i = 0; i < res*res*4; ++i) +	{ +		pixels[i] = (U8) ll_rand(255); +	} +	 + +	gGL.setColorMask(true, true); +	LLGLDepthTest depth(GL_FALSE); + +	for (U32 i = 0; i < count; ++i) +	{ //allocate render targets and textures +		dest[i].allocate(res,res,GL_RGBA,false, false, LLTexUnit::TT_TEXTURE, true); +		dest[i].bindTarget(); +		dest[i].clear(); +		dest[i].flush(); + +		gGL.getTexUnit(0)->bindManual(LLTexUnit::TT_TEXTURE, source[i]); +		LLImageGL::setManualImage(GL_TEXTURE_2D, 0, GL_RGBA, res,res,GL_RGBA, GL_UNSIGNED_BYTE, pixels); +	} + +	//make a dummy triangle to draw with +	LLPointer<LLVertexBuffer> buff = new LLVertexBuffer(LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0, GL_STATIC_DRAW_ARB); +	buff->allocateBuffer(3, 0, true); + +	LLStrider<LLVector3> v; +	LLStrider<LLVector2> tc; + +	buff->getVertexStrider(v); +	 +	v[0].set(-1,1,0); +	v[1].set(-1,-3,0); +	v[2].set(3,1,0); +	buff->flush(); + +	gBenchmarkProgram.bind(); +	buff->setBuffer(LLVertexBuffer::MAP_VERTEX); + +	//wait for any previoius GL commands to finish +	glFinish(); +	 +	for (S32 c = -1; c < samples; ++c) +	{ +		LLTimer timer; +		timer.start(); + +		for (U32 i = 0; i < count; ++i) +		{ +			dest[i].bindTarget(); +			gGL.getTexUnit(0)->bindManual(LLTexUnit::TT_TEXTURE, source[i]); +			buff->drawArrays(LLRender::TRIANGLES, 0, 3); +			dest[i].flush(); +		} +		 +		//wait for current batch of copies to finish +		glFinish(); + +		F32 time = timer.getElapsedTimeF32(); + +		if (c >= 0) // <-- ignore the first sample as it tends to be artificially slow +		{  +			//store result in gigabytes per second +			F32 gb = (F32) ((F64) (res*res*8*count))/(1000000000); + +			F32 gbps = gb/time; + +			results.push_back(gbps); +		} +	} + +	gBenchmarkProgram.unbind(); + +	LLGLSLShader::finishProfile(); +	 +	LLImageGL::deleteTextures(count, source); + + +	std::sort(results.begin(), results.end()); + +	F32 gbps = results[results.size()/2]; + +	llinfos << "Memory bandwidth is " << llformat("%.3f", gbps) << "GB/sec according to CPU timers" << llendl; +	 +	F32 ms = gBenchmarkProgram.mTimeElapsed/1000000.f; +	F32 seconds = ms/1000.f; + +	F64 samples_drawn = res*res*count*samples; +	F32 samples_sec = (samples_drawn/1000000000.0)/seconds; +	gbps = samples_sec*8; + +	if (gGLManager.mHasTimerQuery) +	{ +		llinfos << "Memory bandwidth is " << llformat("%.3f", gbps) << "GB/sec according to ARB_timer_query" << llendl; +	} +	else +	{ +		llinfos << "ARB_timer_query unavailable." << llendl; +	} +} + diff --git a/indra/newview/llgroupmgr.cpp b/indra/newview/llgroupmgr.cpp index cbd844cdac..3dcf7cd8aa 100755 --- a/indra/newview/llgroupmgr.cpp +++ b/indra/newview/llgroupmgr.cpp @@ -608,6 +608,11 @@ void LLGroupMgrGroupData::recalcAgentPowers(const LLUUID& agent_id)  	}  } +bool LLGroupMgrGroupData::isSingleMemberNotOwner() +{ +	return mMembers.size() == 1 && !mMembers.begin()->second->isOwner(); +} +  bool packRoleUpdateMessageBlock(LLMessageSystem* msg,   								const LLUUID& group_id,  								const LLUUID& role_id,  diff --git a/indra/newview/llgroupmgr.h b/indra/newview/llgroupmgr.h index d8c1ab7ef5..1750551395 100755 --- a/indra/newview/llgroupmgr.h +++ b/indra/newview/llgroupmgr.h @@ -232,6 +232,8 @@ public:  	BOOL isRoleDataComplete() { return mRoleDataComplete; }  	BOOL isRoleMemberDataComplete() { return mRoleMemberDataComplete; }  	BOOL isGroupPropertiesDataComplete() { return mGroupPropertiesDataComplete; } +	 +	bool isSingleMemberNotOwner();  	F32 getAccessTime() const { return mAccessTime; }  	void setAccessed(); diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp index 9ffbd1a675..70ffdc14ff 100755 --- a/indra/newview/llimview.cpp +++ b/indra/newview/llimview.cpp @@ -1959,11 +1959,11 @@ LLDockControl::DocAt LLCallDialog::getDockControlPos(const std::string& toolbarB  	switch (toolbar_loc)  	{ -		case LLToolBarView::TOOLBAR_LEFT: +		case LLToolBarEnums::TOOLBAR_LEFT:  			doc_at = LLDockControl::RIGHT;  			break; -		case LLToolBarView::TOOLBAR_RIGHT: +		case LLToolBarEnums::TOOLBAR_RIGHT:  			doc_at = LLDockControl::LEFT;  			break;  	} diff --git a/indra/newview/llinventoryfilter.cpp b/indra/newview/llinventoryfilter.cpp index 3c6974cf6d..15463e0d33 100755 --- a/indra/newview/llinventoryfilter.cpp +++ b/indra/newview/llinventoryfilter.cpp @@ -139,7 +139,14 @@ bool LLInventoryFilter::checkFolder(const LLUUID& folder_id) const  	{  		return passed_clipboard;  	} -	 + +	// show folder links +	LLViewerInventoryItem* item = gInventory.getItem(folder_id); +	if (item && item->getActualType() == LLAssetType::AT_LINK_FOLDER) +	{ +		return passed_clipboard; +	} +  	if (mFilterOps.mFilterTypes & FILTERTYPE_CATEGORY)  	{  		// Can only filter categories for items in your inventory diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp index e5b9e11d48..d27f7d2527 100755 --- a/indra/newview/llinventorypanel.cpp +++ b/indra/newview/llinventorypanel.cpp @@ -146,7 +146,8 @@ LLInventoryPanel::LLInventoryPanel(const LLInventoryPanel::Params& p) :  	mShowItemLinkOverlays(p.show_item_link_overlays),  	mShowEmptyMessage(p.show_empty_message),  	mViewsInitialized(false), -	mInvFVBridgeBuilder(NULL) +	mInvFVBridgeBuilder(NULL), +	mInventoryViewModel(p.name)  {  	mInvFVBridgeBuilder = &INVENTORY_BRIDGE_BUILDER; diff --git a/indra/newview/lllogchat.cpp b/indra/newview/lllogchat.cpp index 90b169ecd3..d0ecf80706 100755 --- a/indra/newview/lllogchat.cpp +++ b/indra/newview/lllogchat.cpp @@ -206,7 +206,11 @@ private:  };  LLLogChat::save_history_signal_t * LLLogChat::sSaveHistorySignal = NULL; -LLLoadHistoryThread::load_end_signal_t * LLLoadHistoryThread::mLoadEndSignal = NULL; + +std::map<LLUUID,LLLoadHistoryThread *> LLLogChat::sLoadHistoryThreads; +std::map<LLUUID,LLDeleteHistoryThread *> LLLogChat::sDeleteHistoryThreads; +LLMutex* LLLogChat::sHistoryThreadsMutex = NULL; +  //static  std::string LLLogChat::makeLogFileName(std::string filename) @@ -337,83 +341,179 @@ void LLLogChat::saveHistory(const std::string& filename,  void LLLogChat::loadChatHistory(const std::string& file_name, std::list<LLSD>& messages, const LLSD& load_params)  {  	if (file_name.empty()) -				{ -					LL_WARNS("LLLogChat::loadChatHistory") << "Session name is Empty!" << LL_ENDL; -					return ; -				} +	{ +		LL_WARNS("LLLogChat::loadChatHistory") << "Session name is Empty!" << LL_ENDL; +		return ; +	} -				bool load_all_history = load_params.has("load_all_history") ? load_params["load_all_history"].asBoolean() : false; +	bool load_all_history = load_params.has("load_all_history") ? load_params["load_all_history"].asBoolean() : false; -				LLFILE* fptr = LLFile::fopen(LLLogChat::makeLogFileName(file_name), "r");/*Flawfinder: ignore*/ -				if (!fptr) -				{ -					fptr = LLFile::fopen(LLLogChat::oldLogFileName(file_name), "r");/*Flawfinder: ignore*/ -					if (!fptr) -					{ -						return;						//No previous conversation with this name. -					} -				} +	LLFILE* fptr = LLFile::fopen(LLLogChat::makeLogFileName(file_name), "r");/*Flawfinder: ignore*/ +	if (!fptr) +	{ +		fptr = LLFile::fopen(LLLogChat::oldLogFileName(file_name), "r");/*Flawfinder: ignore*/ +		if (!fptr) +		{ +			return;						//No previous conversation with this name. +		} +	} -				char buffer[LOG_RECALL_SIZE];		/*Flawfinder: ignore*/ -				char *bptr; -				S32 len; -				bool firstline = TRUE; - -				if (load_all_history || fseek(fptr, (LOG_RECALL_SIZE - 1) * -1  , SEEK_END)) -				{	//We need to load the whole historyFile or it's smaller than recall size, so get it all. -					firstline = FALSE; -					if (fseek(fptr, 0, SEEK_SET)) -					{ -						fclose(fptr); -						return; -					} -				} -			while (fgets(buffer, LOG_RECALL_SIZE, fptr)  && !feof(fptr)) -				{ -					len = strlen(buffer) - 1;		/*Flawfinder: ignore*/ -					for (bptr = (buffer + len); (*bptr == '\n' || *bptr == '\r') && bptr>buffer; bptr--)	*bptr='\0'; - -					if (firstline) -					{ -						firstline = FALSE; -						continue; -					} - -					std::string line(buffer); - -					//updated 1.23 plain text log format requires a space added before subsequent lines in a multilined message -					if (' ' == line[0]) -					{ -						line.erase(0, MULTI_LINE_PREFIX.length()); -						append_to_last_message(messages, '\n' + line); -					} -					else if (0 == len && ('\n' == line[0] || '\r' == line[0])) -					{ -						//to support old format's multilined messages with new lines used to divide paragraphs -						append_to_last_message(messages, line); -					} -					else -					{ -						LLSD item; -						if (!LLChatLogParser::parse(line, item, load_params)) -						{ -							item[LL_IM_TEXT] = line; -						} -						messages.push_back(item); -					} -				} -				fclose(fptr); +	char buffer[LOG_RECALL_SIZE];		/*Flawfinder: ignore*/ +	char *bptr; +	S32 len; +	bool firstline = TRUE; + +	if (load_all_history || fseek(fptr, (LOG_RECALL_SIZE - 1) * -1  , SEEK_END)) +	{	//We need to load the whole historyFile or it's smaller than recall size, so get it all. +		firstline = FALSE; +		if (fseek(fptr, 0, SEEK_SET)) +		{ +			fclose(fptr); +			return; +		} +	} +	while (fgets(buffer, LOG_RECALL_SIZE, fptr)  && !feof(fptr)) +	{ +		len = strlen(buffer) - 1;		/*Flawfinder: ignore*/ +		for (bptr = (buffer + len); (*bptr == '\n' || *bptr == '\r') && bptr>buffer; bptr--)	*bptr='\0'; + +		if (firstline) +		{ +			firstline = FALSE; +			continue; +		} +		std::string line(buffer); +		//updated 1.23 plain text log format requires a space added before subsequent lines in a multilined message +		if (' ' == line[0]) +		{ +			line.erase(0, MULTI_LINE_PREFIX.length()); +			append_to_last_message(messages, '\n' + line); +		} +		else if (0 == len && ('\n' == line[0] || '\r' == line[0])) +		{ +			//to support old format's multilined messages with new lines used to divide paragraphs +			append_to_last_message(messages, line); +		} +		else +		{ +			LLSD item; +			if (!LLChatLogParser::parse(line, item, load_params)) +			{ +				item[LL_IM_TEXT] = line; +			} +			messages.push_back(item); +		} +	} +	fclose(fptr);  } -void LLLogChat::startChatHistoryThread(const std::string& file_name, const LLSD& load_params) +// static +bool LLLogChat::historyThreadsFinished(LLUUID session_id)  { +	LLMutexLock lock(historyThreadsMutex()); +	bool finished = true; +	std::map<LLUUID,LLLoadHistoryThread *>::iterator it = sLoadHistoryThreads.find(session_id); +	if (it != sLoadHistoryThreads.end()) +	{ +		finished = it->second->isFinished(); +	} +	if (!finished) +	{ +		return false; +	} +	std::map<LLUUID,LLDeleteHistoryThread *>::iterator dit = sDeleteHistoryThreads.find(session_id); +	if (dit != sDeleteHistoryThreads.end()) +	{ +		finished = finished && dit->second->isFinished(); +	} +	return finished; +} -	LLLoadHistoryThread* mThread = new LLLoadHistoryThread(); -	mThread->start(); -	mThread->setHistoryParams(file_name, load_params); +// static +LLLoadHistoryThread* LLLogChat::getLoadHistoryThread(LLUUID session_id) +{ +	LLMutexLock lock(historyThreadsMutex()); +	std::map<LLUUID,LLLoadHistoryThread *>::iterator it = sLoadHistoryThreads.find(session_id); +	if (it != sLoadHistoryThreads.end()) +	{ +		return it->second; +	} +	return NULL; +} + +// static +LLDeleteHistoryThread* LLLogChat::getDeleteHistoryThread(LLUUID session_id) +{ +	LLMutexLock lock(historyThreadsMutex()); +	std::map<LLUUID,LLDeleteHistoryThread *>::iterator it = sDeleteHistoryThreads.find(session_id); +	if (it != sDeleteHistoryThreads.end()) +	{ +		return it->second; +	} +	return NULL; +} + +// static +bool LLLogChat::addLoadHistoryThread(LLUUID& session_id, LLLoadHistoryThread* lthread) +{ +	LLMutexLock lock(historyThreadsMutex()); +	std::map<LLUUID,LLLoadHistoryThread *>::const_iterator it = sLoadHistoryThreads.find(session_id); +	if (it != sLoadHistoryThreads.end()) +	{ +		return false; +	} +	sLoadHistoryThreads[session_id] = lthread; +	return true;  } + +// static +bool LLLogChat::addDeleteHistoryThread(LLUUID& session_id, LLDeleteHistoryThread* dthread) +{ +	LLMutexLock lock(historyThreadsMutex()); +	std::map<LLUUID,LLDeleteHistoryThread *>::const_iterator it = sDeleteHistoryThreads.find(session_id); +	if (it != sDeleteHistoryThreads.end()) +	{ +		return false; +	} +	sDeleteHistoryThreads[session_id] = dthread; +	return true; +} + +// static +void LLLogChat::cleanupHistoryThreads() +{ +	LLMutexLock lock(historyThreadsMutex()); +	std::vector<LLUUID> uuids; +	std::map<LLUUID,LLLoadHistoryThread *>::iterator lit = sLoadHistoryThreads.begin(); +	for (; lit != sLoadHistoryThreads.end(); lit++) +	{ +		if (lit->second->isFinished() && sDeleteHistoryThreads[lit->first]->isFinished()) +		{ +			delete lit->second; +			delete sDeleteHistoryThreads[lit->first]; +			uuids.push_back(lit->first); +		} +	} +	std::vector<LLUUID>::iterator uuid_it = uuids.begin(); +	for ( ;uuid_it != uuids.end(); uuid_it++) +	{ +		sLoadHistoryThreads.erase(*uuid_it); +		sDeleteHistoryThreads.erase(*uuid_it); +	} +} + +//static +LLMutex* LLLogChat::historyThreadsMutex() +{ +	if (sHistoryThreadsMutex == NULL) +	{ +		sHistoryThreadsMutex = new LLMutex(NULL); +	} +	return sHistoryThreadsMutex; +} +  // static  std::string LLLogChat::oldLogFileName(std::string filename)  { @@ -475,7 +575,7 @@ void LLLogChat::findTranscriptFiles(std::string pattern, std::vector<std::string  				//Add Nearby chat history to the list of transcriptions  				list_of_transcriptions.push_back(gDirUtilp->add(dirname, filename));  				LLFile::close(filep); -				return; +				continue;  			}  			char buffer[LOG_RECALL_SIZE]; @@ -845,115 +945,188 @@ bool LLChatLogParser::parse(std::string& raw, LLSD& im, const LLSD& parse_params  	return true;  //parsed name and message text, maybe have a timestamp too  } +LLDeleteHistoryThread::LLDeleteHistoryThread(std::list<LLSD>* messages, LLLoadHistoryThread* loadThread) +	: LLActionThread("delete chat history"), +	mMessages(messages), +	mLoadThread(loadThread) +{ +} +LLDeleteHistoryThread::~LLDeleteHistoryThread() +{ +} -	LLLoadHistoryThread::LLLoadHistoryThread() : LLThread("load chat history") - 	{ -		mNewLoad = false; +void LLDeleteHistoryThread::run() +{ +	if (mLoadThread != NULL) +	{ +		mLoadThread->waitFinished();  	} - -	void LLLoadHistoryThread::run() +	if (NULL != mMessages)  	{ -		while (!LLApp::isQuitting()) -			{ -			    if(mNewLoad) -				{ -					loadHistory(mFileName,mMessages,mLoadParams); -					shutdown(); -				} -			} +		delete mMessages;  	} -	void LLLoadHistoryThread::setHistoryParams(const std::string& file_name, const LLSD& load_params) +	mMessages = NULL; +	setFinished(); +} + +LLActionThread::LLActionThread(const std::string& name) +	: LLThread(name), +	mMutex(NULL), +	mRunCondition(NULL), +	mFinished(false) +{ +} + +LLActionThread::~LLActionThread() +{ +} + +void LLActionThread::waitFinished() +{ +	mMutex.lock(); +	if (!mFinished)  	{ -		mFileName = file_name; -		mLoadParams = load_params; -		mNewLoad = true; +		mMutex.unlock(); +		mRunCondition.wait();  	} -	void LLLoadHistoryThread::loadHistory(const std::string& file_name, std::list<LLSD>& messages, const LLSD& load_params) +	else  	{ +		mMutex.unlock();	 +	} +} -		if (file_name.empty()) -			{ -			LL_WARNS("LLLogChat::loadHistory") << "Session name is Empty!" << LL_ENDL; -				return ; -			} +void LLActionThread::setFinished() +{ +	mMutex.lock(); +	mFinished = true; +	mMutex.unlock(); +	mRunCondition.signal(); +} -			bool load_all_history = load_params.has("load_all_history") ? load_params["load_all_history"].asBoolean() : false; +LLLoadHistoryThread::LLLoadHistoryThread(const std::string& file_name, std::list<LLSD>* messages, const LLSD& load_params) +	: LLActionThread("load chat history"), +	mMessages(messages), +	mFileName(file_name), +	mLoadParams(load_params), +	mNewLoad(true), +	mLoadEndSignal(NULL) +{ +} -			LLFILE* fptr = LLFile::fopen(LLLogChat::makeLogFileName(file_name), "r");/*Flawfinder: ignore*/ -			if (!fptr) -			{ -				fptr = LLFile::fopen(LLLogChat::oldLogFileName(file_name), "r");/*Flawfinder: ignore*/ -				if (!fptr) -				{ -					mNewLoad = false; -					(*mLoadEndSignal)(messages, file_name); -					return;						//No previous conversation with this name. -				} -			} +LLLoadHistoryThread::~LLLoadHistoryThread() +{ +} -			char buffer[LOG_RECALL_SIZE];		/*Flawfinder: ignore*/ -			char *bptr; -			S32 len; -			bool firstline = TRUE; +void LLLoadHistoryThread::run() +{ +	if(mNewLoad) +	{ +		loadHistory(mFileName, mMessages, mLoadParams); +		int count = mMessages->size(); +		llinfos << "mMessages->size(): " << count << llendl; +		setFinished(); +	} +} -			if (load_all_history || fseek(fptr, (LOG_RECALL_SIZE - 1) * -1  , SEEK_END)) -			{	//We need to load the whole historyFile or it's smaller than recall size, so get it all. -				firstline = FALSE; -				if (fseek(fptr, 0, SEEK_SET)) -				{ -					fclose(fptr); -					mNewLoad = false; -					(*mLoadEndSignal)(messages, file_name); -					return; -				} -			} -		while (fgets(buffer, LOG_RECALL_SIZE, fptr)  && !feof(fptr)) -			{ -				len = strlen(buffer) - 1;		/*Flawfinder: ignore*/ -				for (bptr = (buffer + len); (*bptr == '\n' || *bptr == '\r') && bptr>buffer; bptr--)	*bptr='\0'; +void LLLoadHistoryThread::loadHistory(const std::string& file_name, std::list<LLSD>* messages, const LLSD& load_params) +{ +	if (file_name.empty()) +	{ +		LL_WARNS("LLLogChat::loadHistory") << "Session name is Empty!" << LL_ENDL; +		return ; +	} -				if (firstline) -				{ -					firstline = FALSE; -					continue; -				} +	bool load_all_history = load_params.has("load_all_history") ? load_params["load_all_history"].asBoolean() : false; +	LLFILE* fptr = LLFile::fopen(LLLogChat::makeLogFileName(file_name), "r");/*Flawfinder: ignore*/ -				std::string line(buffer); +	if (!fptr) +	{ +		fptr = LLFile::fopen(LLLogChat::oldLogFileName(file_name), "r");/*Flawfinder: ignore*/ +		if (!fptr) +		{ +			mNewLoad = false; +			(*mLoadEndSignal)(messages, file_name); +			return;						//No previous conversation with this name. +		} +	} -				//updated 1.23 plaint text log format requires a space added before subsequent lines in a multilined message -				if (' ' == line[0]) -				{ -					line.erase(0, MULTI_LINE_PREFIX.length()); -					append_to_last_message(messages, '\n' + line); -				} -				else if (0 == len && ('\n' == line[0] || '\r' == line[0])) -				{ -					//to support old format's multilined messages with new lines used to divide paragraphs -					append_to_last_message(messages, line); -				} -				else -				{ -					LLSD item; -					if (!LLChatLogParser::parse(line, item, load_params)) -					{ -						item[LL_IM_TEXT] = line; -					} -					messages.push_back(item); -				} -			} +	char buffer[LOG_RECALL_SIZE];		/*Flawfinder: ignore*/ + +	char *bptr; +	S32 len; +	bool firstline = TRUE; + +	if (load_all_history || fseek(fptr, (LOG_RECALL_SIZE - 1) * -1  , SEEK_END)) +	{	//We need to load the whole historyFile or it's smaller than recall size, so get it all. +		firstline = FALSE; +		if (fseek(fptr, 0, SEEK_SET)) +		{  			fclose(fptr);  			mNewLoad = false;  			(*mLoadEndSignal)(messages, file_name); +			return; +		}  	} -	//static -	boost::signals2::connection LLLoadHistoryThread::setLoadEndSignal(const load_end_signal_t::slot_type& cb) + +	while (fgets(buffer, LOG_RECALL_SIZE, fptr)  && !feof(fptr))  	{ -		if (NULL == mLoadEndSignal) +		len = strlen(buffer) - 1;		/*Flawfinder: ignore*/ + +		for (bptr = (buffer + len); (*bptr == '\n' || *bptr == '\r') && bptr>buffer; bptr--)	*bptr='\0'; + + +		if (firstline)  		{ -			mLoadEndSignal = new load_end_signal_t(); +			firstline = FALSE; +			continue;  		} +		std::string line(buffer); -		return mLoadEndSignal->connect(cb); +		//updated 1.23 plaint text log format requires a space added before subsequent lines in a multilined message +		if (' ' == line[0]) +		{ +			line.erase(0, MULTI_LINE_PREFIX.length()); +			append_to_last_message(*messages, '\n' + line); +		} +		else if (0 == len && ('\n' == line[0] || '\r' == line[0])) +		{ +			//to support old format's multilined messages with new lines used to divide paragraphs +			append_to_last_message(*messages, line); +		} +		else +		{ +			LLSD item; +			if (!LLChatLogParser::parse(line, item, load_params)) +			{ +				item[LL_IM_TEXT] = line; +			} +			messages->push_back(item); +		}  	} + +	fclose(fptr); +	mNewLoad = false; +	(*mLoadEndSignal)(messages, file_name); +} +	 +boost::signals2::connection LLLoadHistoryThread::setLoadEndSignal(const load_end_signal_t::slot_type& cb) +{ +	if (NULL == mLoadEndSignal) +	{ +		mLoadEndSignal = new load_end_signal_t(); +	} + +	return mLoadEndSignal->connect(cb); +} + +void LLLoadHistoryThread::removeLoadEndSignal(const load_end_signal_t::slot_type& cb) +{ +	if (NULL != mLoadEndSignal) +	{ +		mLoadEndSignal->disconnect_all_slots(); +		delete mLoadEndSignal; +	} +	mLoadEndSignal = NULL; +} diff --git a/indra/newview/lllogchat.h b/indra/newview/lllogchat.h index acee99afa2..81f75ef626 100755 --- a/indra/newview/lllogchat.h +++ b/indra/newview/lllogchat.h @@ -28,23 +28,54 @@  #define LL_LLLOGCHAT_H  class LLChat; -class LLLoadHistoryThread : public LLThread + +class LLActionThread : public LLThread  { +public: +	LLActionThread(const std::string& name); +	~LLActionThread(); + +	void waitFinished(); +	bool isFinished() { return mFinished; } +protected: +	void setFinished();  private: -	std::string mFileName; -	std::list<LLSD> mMessages; +	bool mFinished; +	LLMutex	mMutex; +	LLCondition mRunCondition; +}; + +class LLLoadHistoryThread : public LLActionThread +{ +private: +	const std::string& mFileName; +	std::list<LLSD>* mMessages;  	LLSD mLoadParams;  	bool mNewLoad;  public: -	LLLoadHistoryThread(); - -	void setHistoryParams(const std::string& file_name, const LLSD& load_params); -	virtual void loadHistory(const std::string& file_name, std::list<LLSD>& messages, const LLSD& load_params); +	LLLoadHistoryThread(const std::string& file_name, std::list<LLSD>* messages, const LLSD& load_params); +	~LLLoadHistoryThread(); +	//void setHistoryParams(const std::string& file_name, const LLSD& load_params); +	virtual void loadHistory(const std::string& file_name, std::list<LLSD>* messages, const LLSD& load_params);      virtual void run(); -   typedef boost::signals2::signal<void (std::list<LLSD>& messages,const std::string& file_name)> load_end_signal_t; -   static load_end_signal_t * mLoadEndSignal; -   static boost::signals2::connection setLoadEndSignal(const load_end_signal_t::slot_type& cb); +	typedef boost::signals2::signal<void (std::list<LLSD>* messages,const std::string& file_name)> load_end_signal_t; +	load_end_signal_t * mLoadEndSignal; +	boost::signals2::connection setLoadEndSignal(const load_end_signal_t::slot_type& cb); +	void removeLoadEndSignal(const load_end_signal_t::slot_type& cb); +}; + +class LLDeleteHistoryThread : public LLActionThread +{ +private: +	std::list<LLSD>* mMessages; +	LLLoadHistoryThread* mLoadThread; +public: +	LLDeleteHistoryThread(std::list<LLSD>* messages, LLLoadHistoryThread* loadThread); +	~LLDeleteHistoryThread(); + +	virtual void run(); +	static void deleteHistory();  };  class LLLogChat @@ -73,7 +104,6 @@ public:  	static void getListOfTranscriptBackupFiles(std::vector<std::string>& list_of_transcriptions);  	static void loadChatHistory(const std::string& file_name, std::list<LLSD>& messages, const LLSD& load_params = LLSD()); -	static void startChatHistoryThread(const std::string& file_name, const LLSD& load_params);  	typedef boost::signals2::signal<void ()> save_history_signal_t;  	static boost::signals2::connection setSaveHistorySignal(const save_history_signal_t::slot_type& cb); @@ -90,9 +120,21 @@ public:  	static bool isTranscriptExist(const LLUUID& avatar_id, bool is_group=false);  	static bool isNearbyTranscriptExist(); +	static bool historyThreadsFinished(LLUUID session_id); +	static LLLoadHistoryThread* getLoadHistoryThread(LLUUID session_id); +	static LLDeleteHistoryThread* getDeleteHistoryThread(LLUUID session_id); +	static bool addLoadHistoryThread(LLUUID& session_id, LLLoadHistoryThread* lthread); +	static bool addDeleteHistoryThread(LLUUID& session_id, LLDeleteHistoryThread* dthread); +	static void cleanupHistoryThreads(); +  private:  	static std::string cleanFileName(std::string filename);  	static save_history_signal_t * sSaveHistorySignal; + +	static std::map<LLUUID,LLLoadHistoryThread *> sLoadHistoryThreads; +	static std::map<LLUUID,LLDeleteHistoryThread *> sDeleteHistoryThreads; +	static LLMutex* sHistoryThreadsMutex; +	static LLMutex* historyThreadsMutex();  };  /** diff --git a/indra/newview/llmoveview.cpp b/indra/newview/llmoveview.cpp index eb6591eb39..055ec241c5 100755 --- a/indra/newview/llmoveview.cpp +++ b/indra/newview/llmoveview.cpp @@ -698,14 +698,14 @@ void LLPanelStandStopFlying::updatePosition()  	S32 y_pos = 0;  	S32 bottom_tb_center = 0; -	if (LLToolBar* toolbar_bottom = gToolBarView->getToolbar(LLToolBarView::TOOLBAR_BOTTOM)) +	if (LLToolBar* toolbar_bottom = gToolBarView->getToolbar(LLToolBarEnums::TOOLBAR_BOTTOM))  	{  		y_pos = toolbar_bottom->getRect().getHeight();  		bottom_tb_center = toolbar_bottom->getRect().getCenterX();  	}  	S32 left_tb_width = 0; -	if (LLToolBar* toolbar_left = gToolBarView->getToolbar(LLToolBarView::TOOLBAR_LEFT)) +	if (LLToolBar* toolbar_left = gToolBarView->getToolbar(LLToolBarEnums::TOOLBAR_LEFT))  	{  		left_tb_width = toolbar_left->getRect().getWidth();  	} diff --git a/indra/newview/llpanelgroup.cpp b/indra/newview/llpanelgroup.cpp index ae217958f0..a0ca82da46 100755 --- a/indra/newview/llpanelgroup.cpp +++ b/indra/newview/llpanelgroup.cpp @@ -49,6 +49,7 @@  #include "llpanelgroupnotices.h"  #include "llpanelgroupgeneral.h" +#include "llpanelgrouproles.h"  #include "llaccordionctrltab.h"  #include "llaccordionctrl.h" @@ -275,6 +276,7 @@ void LLPanelGroup::onBtnApply(void* user_data)  {  	LLPanelGroup* self = static_cast<LLPanelGroup*>(user_data);  	self->apply(); +	self->refreshData();  }  void LLPanelGroup::onBtnGroupCallClicked(void* user_data) @@ -495,6 +497,22 @@ bool LLPanelGroup::apply(LLPanelGroupTab* tab)  	{  		//we skip refreshing group after ew manually apply changes since its very annoying  		//for those who are editing group + +		LLPanelGroupRoles * roles_tab = dynamic_cast<LLPanelGroupRoles*>(tab); +		if (roles_tab) +		{ +			LLGroupMgr* gmgrp = LLGroupMgr::getInstance(); +			LLGroupMgrGroupData* gdatap = gmgrp->getGroupData(roles_tab->getGroupID()); + +			// allow refresh only for one specific case: +			// there is only one member in group and it is not owner +			// it's a wrong situation and need refresh panels from server +			if (gdatap && gdatap->isSingleMemberNotOwner()) +			{ +				return true; +			} +		} +  		mSkipRefresh = TRUE;  		return true;  	} diff --git a/indra/newview/llpanelmaininventory.cpp b/indra/newview/llpanelmaininventory.cpp index 1ff0bfd091..bd173fadc7 100755 --- a/indra/newview/llpanelmaininventory.cpp +++ b/indra/newview/llpanelmaininventory.cpp @@ -574,13 +574,16 @@ void LLPanelMainInventory::draw()  void LLPanelMainInventory::updateItemcountText()  { -	// *TODO: Calling setlocale() on each frame may be inefficient. -	//LLLocale locale(LLStringUtil::getLocale()); -	std::string item_count_string; -	LLResMgr::getInstance()->getIntegerString(item_count_string, gInventory.getItemCount()); +	if(mItemCount != gInventory.getItemCount()) +	{ +		mItemCount = gInventory.getItemCount(); +		mItemCountString = ""; +		LLLocale locale(LLLocale::USER_LOCALE); +		LLResMgr::getInstance()->getIntegerString(mItemCountString, mItemCount); +	}  	LLStringUtil::format_map_t string_args; -	string_args["[ITEM_COUNT]"] = item_count_string; +	string_args["[ITEM_COUNT]"] = mItemCountString;  	string_args["[FILTER]"] = getFilterText();  	std::string text = ""; diff --git a/indra/newview/llpanelmaininventory.h b/indra/newview/llpanelmaininventory.h index fc8cc67c33..21f0ca0cae 100755 --- a/indra/newview/llpanelmaininventory.h +++ b/indra/newview/llpanelmaininventory.h @@ -131,6 +131,8 @@ private:  	LLSaveFolderState*			mSavedFolderState;  	std::string					mFilterText;  	std::string					mFilterSubString; +	S32							mItemCount; +	std::string 				mItemCountString;  	////////////////////////////////////////////////////////////////////////////////// diff --git a/indra/newview/llpanelobjectinventory.cpp b/indra/newview/llpanelobjectinventory.cpp index d7130820ab..bb063f48a5 100755 --- a/indra/newview/llpanelobjectinventory.cpp +++ b/indra/newview/llpanelobjectinventory.cpp @@ -1491,7 +1491,8 @@ LLPanelObjectInventory::LLPanelObjectInventory(const LLPanelObjectInventory::Par  	mFolders(NULL),  	mHaveInventory(FALSE),  	mIsInventoryEmpty(TRUE), -	mInventoryNeedsUpdate(FALSE) +	mInventoryNeedsUpdate(FALSE), +	mInventoryViewModel(p.name)  {  	// Setup context menu callbacks  	mCommitCallbackRegistrar.add("Inventory.DoToSelected", boost::bind(&LLPanelObjectInventory::doToSelected, this, _2)); diff --git a/indra/newview/llpreviewscript.cpp b/indra/newview/llpreviewscript.cpp index e533be7f24..f6f9dc90a9 100755 --- a/indra/newview/llpreviewscript.cpp +++ b/indra/newview/llpreviewscript.cpp @@ -518,6 +518,10 @@ void LLScriptEdCore::initMenu()  	menuItem->setClickCallback(boost::bind(&LLTextEditor::selectAll, mEditor));  	menuItem->setEnableCallback(boost::bind(&LLTextEditor::canSelectAll, mEditor)); +	menuItem = getChild<LLMenuItemCallGL>("Deselect"); +	menuItem->setClickCallback(boost::bind(&LLTextEditor::deselect, mEditor)); +	menuItem->setEnableCallback(boost::bind(&LLTextEditor::canDeselect, mEditor)); +  	menuItem = getChild<LLMenuItemCallGL>("Search / Replace...");  	menuItem->setClickCallback(boost::bind(&LLFloaterScriptSearch::show, this)); diff --git a/indra/newview/llpreviewtexture.cpp b/indra/newview/llpreviewtexture.cpp index 1ed48a978f..5c41c5ad97 100755 --- a/indra/newview/llpreviewtexture.cpp +++ b/indra/newview/llpreviewtexture.cpp @@ -127,9 +127,28 @@ BOOL LLPreviewTexture::postBuild()  			getChild<LLLineEditor>("desc")->setPrevalidate(&LLTextValidate::validateASCIIPrintableNoPipe);  		}  	} + +	// Fill in ratios list with common aspect ratio values +	mRatiosList.clear(); +	mRatiosList.push_back(LLTrans::getString("Unconstrained")); +	mRatiosList.push_back("1:1"); +	mRatiosList.push_back("4:3"); +	mRatiosList.push_back("10:7"); +	mRatiosList.push_back("3:2"); +	mRatiosList.push_back("16:10"); +	mRatiosList.push_back("16:9"); +	mRatiosList.push_back("2:1"); -	childSetCommitCallback("combo_aspect_ratio", onAspectRatioCommit, this); +	// Now fill combo box with provided list  	LLComboBox* combo = getChild<LLComboBox>("combo_aspect_ratio"); +	combo->removeall(); + +	for (std::vector<std::string>::const_iterator it = mRatiosList.begin(); it != mRatiosList.end(); ++it) +	{ +		combo->add(*it); +	} + +	childSetCommitCallback("combo_aspect_ratio", onAspectRatioCommit, this);  	combo->setCurrentByIndex(0);  	return LLPreview::postBuild(); @@ -414,6 +433,13 @@ void LLPreviewTexture::updateDimensions()  	{  		return;  	} + +	if (mAssetStatus != PREVIEW_ASSET_LOADED) +	{ +		mAssetStatus = PREVIEW_ASSET_LOADED; +		// Asset has been fully loaded, adjust aspect ratio +		adjustAspectRatio(); +	}  	// Update the width/height display every time  	getChild<LLUICtrl>("dimensions")->setTextArg("[WIDTH]",  llformat("%d", mImage->getFullWidth())); @@ -501,6 +527,46 @@ LLPreview::EAssetStatus LLPreviewTexture::getAssetStatus()  	return mAssetStatus;  } +void LLPreviewTexture::adjustAspectRatio() +{ +	S32 w = mImage->getFullWidth(); +    S32 h = mImage->getFullHeight(); + +	// Determine aspect ratio of the image +	S32 tmp; +    while (h != 0) +    { +        tmp = w % h; +        w = h; +        h = tmp; +    } +	S32 divisor = w; +	S32 num = mImage->getFullWidth() / divisor; +	S32 denom = mImage->getFullHeight() / divisor; + +	if (setAspectRatio(num, denom)) +	{ +		// Select corresponding ratio entry in the combo list +		LLComboBox* combo = getChild<LLComboBox>("combo_aspect_ratio"); +		if (combo) +		{ +			std::ostringstream ratio; +			ratio << num << ":" << denom; +			std::vector<std::string>::const_iterator found = std::find(mRatiosList.begin(), mRatiosList.end(), ratio.str()); +			if (found == mRatiosList.end()) +			{ +				combo->setCurrentByIndex(0); +			} +			else +			{ +				combo->setCurrentByIndex(found - mRatiosList.begin()); +			} +		} +	} + +	mUpdateDimensions = TRUE; +} +  void LLPreviewTexture::updateImageID()  {  	const LLViewerInventoryItem *item = static_cast<const LLViewerInventoryItem*>(getItem()); diff --git a/indra/newview/llpreviewtexture.h b/indra/newview/llpreviewtexture.h index cd16bacde2..97e74706cc 100755 --- a/indra/newview/llpreviewtexture.h +++ b/indra/newview/llpreviewtexture.h @@ -70,6 +70,7 @@ protected:  	/* virtual */ BOOL	postBuild();  	bool				setAspectRatio(const F32 width, const F32 height);  	static void			onAspectRatioCommit(LLUICtrl*,void* userdata); +	void				adjustAspectRatio();  private:  	void				updateImageID(); // set what image is being uploaded. @@ -95,5 +96,6 @@ private:  	F32 mAspectRatio;	  	LLLoadedCallbackEntry::source_callback_list_t mCallbackTextureList ;  +	std::vector<std::string>		mRatiosList;  };  #endif  // LL_LLPREVIEWTEXTURE_H diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp index 7b397d46f3..c83b459279 100755 --- a/indra/newview/llselectmgr.cpp +++ b/indra/newview/llselectmgr.cpp @@ -6187,8 +6187,8 @@ void LLSelectNode::renderOneSilhouette(const LLColor4 &color)  	LLGLSLShader* shader = LLGLSLShader::sCurBoundShaderPtr;  	if (shader) -	{ //switch to "solid color" program for SH-2690 -- works around driver bug causing bad triangles when rendering silhouettes -		gSolidColorProgram.bind(); +	{ //use UI program for selection highlights (texture color modulated by vertex color) +		gUIProgram.bind();  	}  	gGL.matrixMode(LLRender::MM_MODELVIEW); @@ -6243,10 +6243,11 @@ void LLSelectNode::renderOneSilhouette(const LLColor4 &color)  			gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT);  			gGL.begin(LLRender::LINES);  			{ +				gGL.color4f(color.mV[VRED], color.mV[VGREEN], color.mV[VBLUE], 0.4f); +  				for(S32 i = 0; i < mSilhouetteVertices.size(); i += 2)  				{  					u_coord += u_divisor * LLSelectMgr::sHighlightUScale; -					gGL.color4f(color.mV[VRED], color.mV[VGREEN], color.mV[VBLUE], 0.4f);  					gGL.texCoord2f( u_coord, v_coord );  					gGL.vertex3fv( mSilhouetteVertices[i].mV);  					u_coord += u_divisor * LLSelectMgr::sHighlightUScale; diff --git a/indra/newview/llsnapshotlivepreview.cpp b/indra/newview/llsnapshotlivepreview.cpp index 7532ebfc57..ea8225a3ac 100644 --- a/indra/newview/llsnapshotlivepreview.cpp +++ b/indra/newview/llsnapshotlivepreview.cpp @@ -50,7 +50,6 @@  #include "llviewerstats.h"  #include "llvfile.h"  #include "llvfs.h" -#include "llwebsharing.h"  #include "llwindow.h"  #include "llworld.h" @@ -845,30 +844,3 @@ BOOL LLSnapshotLivePreview::saveLocal()  	}  	return success;  } - -void LLSnapshotLivePreview::saveWeb() -{ -	// *FIX: Will break if the window closes because of CloseSnapshotOnKeep! -	// Needs to pass on ownership of the image. -	LLImageJPEG* jpg = dynamic_cast<LLImageJPEG*>(mFormattedImage.get()); -	if(!jpg) -	{ -		llwarns << "Formatted image not a JPEG" << llendl; -		return; -	} - -	LLSD metadata; -	metadata["description"] = getChild<LLLineEditor>("description")->getText(); - -	LLLandmarkActions::getRegionNameAndCoordsFromPosGlobal(gAgentCamera.getCameraPositionGlobal(), -		boost::bind(&LLSnapshotLivePreview::regionNameCallback, this, jpg, metadata, _1, _2, _3, _4)); - -	gViewerWindow->playSnapshotAnimAndSound(); -} - -void LLSnapshotLivePreview::regionNameCallback(LLImageJPEG* snapshot, LLSD& metadata, const std::string& name, S32 x, S32 y, S32 z) -{ -	metadata["slurl"] = LLSLURL(name, LLVector3d(x, y, z)).getSLURLString(); - -	LLWebSharing::instance().shareSnapshot(snapshot, metadata); -} diff --git a/indra/newview/llsnapshotlivepreview.h b/indra/newview/llsnapshotlivepreview.h index fe3d257b02..0f09ef214a 100644 --- a/indra/newview/llsnapshotlivepreview.h +++ b/indra/newview/llsnapshotlivepreview.h @@ -96,7 +96,6 @@ public:  	void setSnapshotQuality(S32 quality);  	void setSnapshotBufferType(LLViewerWindow::ESnapshotType type) { mSnapshotBufferType = type; }  	void updateSnapshot(BOOL new_snapshot, BOOL new_thumbnail = FALSE, F32 delay = 0.f); -	void saveWeb();  	void saveTexture();  	BOOL saveLocal(); @@ -113,9 +112,6 @@ public:  	// Returns TRUE when snapshot generated, FALSE otherwise.  	static BOOL onIdle( void* snapshot_preview ); -	// callback for region name resolve -	void regionNameCallback(LLImageJPEG* snapshot, LLSD& metadata, const std::string& name, S32 x, S32 y, S32 z); -  private:  	LLColor4					mColor;  	LLPointer<LLViewerTexture>	mViewerImage[2]; //used to represent the scene when the frame is frozen. diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp index 67a76460a7..d5f8a1e46e 100755 --- a/indra/newview/llstartup.cpp +++ b/indra/newview/llstartup.cpp @@ -786,14 +786,18 @@ bool idle_startup()  			display_startup();  			LLPanelLogin::giveFocus(); -			if (gSavedSettings.getBOOL("FirstLoginThisInstall")) +			// MAINT-3231 Show first run dialog only for Desura viewer +			if (gSavedSettings.getString("sourceid") == "1208_desura")  			{ -				LL_INFOS("AppInit") << "FirstLoginThisInstall, calling show_first_run_dialog()" << LL_ENDL; -				show_first_run_dialog(); -			} -			else -			{ -				LL_DEBUGS("AppInit") << "FirstLoginThisInstall off" << LL_ENDL; +				if (gSavedSettings.getBOOL("FirstLoginThisInstall")) +				{ +					LL_INFOS("AppInit") << "FirstLoginThisInstall, calling show_first_run_dialog()" << LL_ENDL; +					show_first_run_dialog(); +				} +				else +				{ +					LL_DEBUGS("AppInit") << "FirstLoginThisInstall off" << LL_ENDL; +				}  			}  			LLStartUp::setStartupState( STATE_LOGIN_WAIT );		// Wait for user input diff --git a/indra/newview/lltexturectrl.cpp b/indra/newview/lltexturectrl.cpp index 4300cafb6b..ea837c9127 100755 --- a/indra/newview/lltexturectrl.cpp +++ b/indra/newview/lltexturectrl.cpp @@ -820,7 +820,7 @@ void LLFloaterTexturePicker::onSelectionChange(const std::deque<LLFolderViewItem  			{  				mNoCopyTextureSelected = TRUE;  			} -			mImageAssetID = itemp->getAssetUUID(); +			setImageID(itemp->getAssetUUID());  			mViewModel->setDirty(); // *TODO: shouldn't we be using setValue() here?  			if (user_action && mCanPreview)  			{ diff --git a/indra/newview/lltoastnotifypanel.cpp b/indra/newview/lltoastnotifypanel.cpp index 3a41bf28b4..7d48634381 100755 --- a/indra/newview/lltoastnotifypanel.cpp +++ b/indra/newview/lltoastnotifypanel.cpp @@ -41,6 +41,7 @@  #include "llnotificationsutil.h"  #include "llviewermessage.h"  #include "llfloaterimsession.h" +#include "llavataractions.h"  const S32 BOTTOM_PAD = VPAD * 3;  const S32 IGNORE_BTN_TOP_DELTA = 3*VPAD;//additional ignore_btn padding @@ -313,6 +314,7 @@ void LLToastNotifyPanel::init( LLRect rect, bool show_images )      mTextBox->setVisible(TRUE);      mTextBox->setPlainText(!show_images);      mTextBox->setValue(mNotification->getMessage()); +	mTextBox->setIsFriendCallback(LLAvatarActions::isFriend);      // add buttons for a script notification      if (mIsTip) diff --git a/indra/newview/lltoolbarview.cpp b/indra/newview/lltoolbarview.cpp index 78a555d67d..36d4654393 100755 --- a/indra/newview/lltoolbarview.cpp +++ b/indra/newview/lltoolbarview.cpp @@ -77,7 +77,7 @@ LLToolBarView::LLToolBarView(const LLToolBarView::Params& p)  	mToolbarsLoaded(false),  	mBottomToolbarPanel(NULL)  { -	for (S32 i = 0; i < TOOLBAR_COUNT; i++) +	for (S32 i = 0; i < LLToolBarEnums::TOOLBAR_COUNT; i++)  	{  		mToolbars[i] = NULL;  	} @@ -96,12 +96,18 @@ LLToolBarView::~LLToolBarView()  BOOL LLToolBarView::postBuild()  { -	mToolbars[TOOLBAR_LEFT]   = getChild<LLToolBar>("toolbar_left"); -	mToolbars[TOOLBAR_RIGHT]  = getChild<LLToolBar>("toolbar_right"); -	mToolbars[TOOLBAR_BOTTOM] = getChild<LLToolBar>("toolbar_bottom"); +	mToolbars[LLToolBarEnums::TOOLBAR_LEFT] = getChild<LLToolBar>("toolbar_left"); +	mToolbars[LLToolBarEnums::TOOLBAR_LEFT]->getCenterLayoutPanel()->setLocationId(LLToolBarEnums::TOOLBAR_LEFT); + +	mToolbars[LLToolBarEnums::TOOLBAR_RIGHT] = getChild<LLToolBar>("toolbar_right"); +	mToolbars[LLToolBarEnums::TOOLBAR_RIGHT]->getCenterLayoutPanel()->setLocationId(LLToolBarEnums::TOOLBAR_RIGHT); + +	mToolbars[LLToolBarEnums::TOOLBAR_BOTTOM] = getChild<LLToolBar>("toolbar_bottom"); +	mToolbars[LLToolBarEnums::TOOLBAR_BOTTOM]->getCenterLayoutPanel()->setLocationId(LLToolBarEnums::TOOLBAR_BOTTOM); +  	mBottomToolbarPanel = getChild<LLView>("bottom_toolbar_panel"); -	for (int i = TOOLBAR_FIRST; i <= TOOLBAR_LAST; i++) +	for (int i = LLToolBarEnums::TOOLBAR_FIRST; i <= LLToolBarEnums::TOOLBAR_LAST; i++)  	{  		mToolbars[i]->setStartDragCallback(boost::bind(LLToolBarView::startDragTool,_1,_2,_3));  		mToolbars[i]->setHandleDragCallback(boost::bind(LLToolBarView::handleDragTool,_1,_2,_3,_4)); @@ -115,9 +121,9 @@ BOOL LLToolBarView::postBuild()  S32 LLToolBarView::hasCommand(const LLCommandId& commandId) const  { -	S32 command_location = TOOLBAR_NONE; +	S32 command_location = LLToolBarEnums::TOOLBAR_NONE; -	for (S32 loc = TOOLBAR_FIRST; loc <= TOOLBAR_LAST; loc++) +	for (S32 loc = LLToolBarEnums::TOOLBAR_FIRST; loc <= LLToolBarEnums::TOOLBAR_LAST; loc++)  	{  		if (mToolbars[loc]->hasCommand(commandId))  		{ @@ -129,7 +135,7 @@ S32 LLToolBarView::hasCommand(const LLCommandId& commandId) const  	return command_location;  } -S32 LLToolBarView::addCommand(const LLCommandId& commandId, EToolBarLocation toolbar, int rank) +S32 LLToolBarView::addCommand(const LLCommandId& commandId, LLToolBarEnums::EToolBarLocation toolbar, int rank)  {  	int old_rank;  	removeCommand(commandId, old_rank); @@ -144,7 +150,7 @@ S32 LLToolBarView::removeCommand(const LLCommandId& commandId, int& rank)  	S32 command_location = hasCommand(commandId);  	rank = LLToolBar::RANK_NONE; -	if (command_location != TOOLBAR_NONE) +	if (command_location != LLToolBarEnums::TOOLBAR_NONE)  	{  		rank = mToolbars[command_location]->removeCommand(commandId);  	} @@ -156,7 +162,7 @@ S32 LLToolBarView::enableCommand(const LLCommandId& commandId, bool enabled)  {  	S32 command_location = hasCommand(commandId); -	if (command_location != TOOLBAR_NONE) +	if (command_location != LLToolBarEnums::TOOLBAR_NONE)  	{  		mToolbars[command_location]->enableCommand(commandId, enabled);  	} @@ -168,7 +174,7 @@ S32 LLToolBarView::stopCommandInProgress(const LLCommandId& commandId)  {  	S32 command_location = hasCommand(commandId); -	if (command_location != TOOLBAR_NONE) +	if (command_location != LLToolBarEnums::TOOLBAR_NONE)  	{  		mToolbars[command_location]->stopCommandInProgress(commandId);  	} @@ -180,7 +186,7 @@ S32 LLToolBarView::flashCommand(const LLCommandId& commandId, bool flash, bool f  {  	S32 command_location = hasCommand(commandId); -	if (command_location != TOOLBAR_NONE) +	if (command_location != LLToolBarEnums::TOOLBAR_NONE)  	{  		mToolbars[command_location]->flashCommand(commandId, flash, force_flashing);  	} @@ -259,7 +265,7 @@ bool LLToolBarView::loadToolbars(bool force_default)  	}  	// Clear the toolbars now before adding the loaded commands and settings -	for (S32 i = TOOLBAR_FIRST; i <= TOOLBAR_LAST; i++) +	for (S32 i = LLToolBarEnums::TOOLBAR_FIRST; i <= LLToolBarEnums::TOOLBAR_LAST; i++)  	{  		if (mToolbars[i])  		{ @@ -268,46 +274,46 @@ bool LLToolBarView::loadToolbars(bool force_default)  	}  	// Add commands to each toolbar -	if (toolbar_set.left_toolbar.isProvided() && mToolbars[TOOLBAR_LEFT]) +	if (toolbar_set.left_toolbar.isProvided() && mToolbars[LLToolBarEnums::TOOLBAR_LEFT])  	{  		if (toolbar_set.left_toolbar.button_display_mode.isProvided())  		{  			LLToolBarEnums::ButtonType button_type = toolbar_set.left_toolbar.button_display_mode; -			mToolbars[TOOLBAR_LEFT]->setButtonType(button_type); +			mToolbars[LLToolBarEnums::TOOLBAR_LEFT]->setButtonType(button_type);  		}  		BOOST_FOREACH(const LLCommandId::Params& command_params, toolbar_set.left_toolbar.commands)  		{ -			if (addCommandInternal(LLCommandId(command_params), mToolbars[TOOLBAR_LEFT])) +			if (addCommandInternal(LLCommandId(command_params), mToolbars[LLToolBarEnums::TOOLBAR_LEFT]))  			{  				llwarns << "Error adding command '" << command_params.name() << "' to left toolbar." << llendl;  			}  		}  	} -	if (toolbar_set.right_toolbar.isProvided() && mToolbars[TOOLBAR_RIGHT]) +	if (toolbar_set.right_toolbar.isProvided() && mToolbars[LLToolBarEnums::TOOLBAR_RIGHT])  	{  		if (toolbar_set.right_toolbar.button_display_mode.isProvided())  		{  			LLToolBarEnums::ButtonType button_type = toolbar_set.right_toolbar.button_display_mode; -			mToolbars[TOOLBAR_RIGHT]->setButtonType(button_type); +			mToolbars[LLToolBarEnums::TOOLBAR_RIGHT]->setButtonType(button_type);  		}  		BOOST_FOREACH(const LLCommandId::Params& command_params, toolbar_set.right_toolbar.commands)  		{ -			if (addCommandInternal(LLCommandId(command_params), mToolbars[TOOLBAR_RIGHT])) +			if (addCommandInternal(LLCommandId(command_params), mToolbars[LLToolBarEnums::TOOLBAR_RIGHT]))  			{  				llwarns << "Error adding command '" << command_params.name() << "' to right toolbar." << llendl;  			}  		}  	} -	if (toolbar_set.bottom_toolbar.isProvided() && mToolbars[TOOLBAR_BOTTOM]) +	if (toolbar_set.bottom_toolbar.isProvided() && mToolbars[LLToolBarEnums::TOOLBAR_BOTTOM])  	{  		if (toolbar_set.bottom_toolbar.button_display_mode.isProvided())  		{  			LLToolBarEnums::ButtonType button_type = toolbar_set.bottom_toolbar.button_display_mode; -			mToolbars[TOOLBAR_BOTTOM]->setButtonType(button_type); +			mToolbars[LLToolBarEnums::TOOLBAR_BOTTOM]->setButtonType(button_type);  		}  		BOOST_FOREACH(const LLCommandId::Params& command_params, toolbar_set.bottom_toolbar.commands)  		{ -			if (addCommandInternal(LLCommandId(command_params), mToolbars[TOOLBAR_BOTTOM])) +			if (addCommandInternal(LLCommandId(command_params), mToolbars[LLToolBarEnums::TOOLBAR_BOTTOM]))  			{  				llwarns << "Error adding command '" << command_params.name() << "' to bottom toolbar." << llendl;  			} @@ -319,7 +325,7 @@ bool LLToolBarView::loadToolbars(bool force_default)  bool LLToolBarView::clearToolbars()  { -	for (S32 i = TOOLBAR_FIRST; i <= TOOLBAR_LAST; i++) +	for (S32 i = LLToolBarEnums::TOOLBAR_FIRST; i <= LLToolBarEnums::TOOLBAR_LAST; i++)  	{  		if (mToolbars[i])  		{ @@ -371,20 +377,20 @@ void LLToolBarView::saveToolbars() const  	// Build the parameter tree from the toolbar data  	LLToolBarView::ToolbarSet toolbar_set; -	if (mToolbars[TOOLBAR_LEFT]) +	if (mToolbars[LLToolBarEnums::TOOLBAR_LEFT])  	{ -		toolbar_set.left_toolbar.button_display_mode = mToolbars[TOOLBAR_LEFT]->getButtonType(); -		addToToolset(mToolbars[TOOLBAR_LEFT]->getCommandsList(), toolbar_set.left_toolbar); +		toolbar_set.left_toolbar.button_display_mode = mToolbars[LLToolBarEnums::TOOLBAR_LEFT]->getButtonType(); +		addToToolset(mToolbars[LLToolBarEnums::TOOLBAR_LEFT]->getCommandsList(), toolbar_set.left_toolbar);  	} -	if (mToolbars[TOOLBAR_RIGHT]) +	if (mToolbars[LLToolBarEnums::TOOLBAR_RIGHT])  	{ -		toolbar_set.right_toolbar.button_display_mode = mToolbars[TOOLBAR_RIGHT]->getButtonType(); -		addToToolset(mToolbars[TOOLBAR_RIGHT]->getCommandsList(), toolbar_set.right_toolbar); +		toolbar_set.right_toolbar.button_display_mode = mToolbars[LLToolBarEnums::TOOLBAR_RIGHT]->getButtonType(); +		addToToolset(mToolbars[LLToolBarEnums::TOOLBAR_RIGHT]->getCommandsList(), toolbar_set.right_toolbar);  	} -	if (mToolbars[TOOLBAR_BOTTOM]) +	if (mToolbars[LLToolBarEnums::TOOLBAR_BOTTOM])  	{ -		toolbar_set.bottom_toolbar.button_display_mode = mToolbars[TOOLBAR_BOTTOM]->getButtonType(); -		addToToolset(mToolbars[TOOLBAR_BOTTOM]->getCommandsList(), toolbar_set.bottom_toolbar); +		toolbar_set.bottom_toolbar.button_display_mode = mToolbars[LLToolBarEnums::TOOLBAR_BOTTOM]->getButtonType(); +		addToToolset(mToolbars[LLToolBarEnums::TOOLBAR_BOTTOM]->getCommandsList(), toolbar_set.bottom_toolbar);  	}  	// Serialize the parameter tree @@ -511,9 +517,9 @@ void LLToolBarView::onToolBarButtonRemoved(LLView* button)  void LLToolBarView::draw()  { -	LLRect toolbar_rects[TOOLBAR_COUNT]; +	LLRect toolbar_rects[LLToolBarEnums::TOOLBAR_COUNT]; -	for (S32 i = TOOLBAR_FIRST; i <= TOOLBAR_LAST; i++) +	for (S32 i = LLToolBarEnums::TOOLBAR_FIRST; i <= LLToolBarEnums::TOOLBAR_LAST; i++)  	{  		if (mToolbars[i])  		{ @@ -532,7 +538,7 @@ void LLToolBarView::draw()  		}  	} -	for (S32 i = TOOLBAR_FIRST; i <= TOOLBAR_LAST; i++) +	for (S32 i = LLToolBarEnums::TOOLBAR_FIRST; i <= LLToolBarEnums::TOOLBAR_LAST; i++)  	{  		mToolbars[i]->getParent()->setVisible(mShowToolbars   											&& (mToolbars[i]->hasButtons()  @@ -544,7 +550,7 @@ void LLToolBarView::draw()  	{  		LLColor4 drop_color = LLUIColorTable::instance().getColor( "ToolbarDropZoneColor" ); -		for (S32 i = TOOLBAR_FIRST; i <= TOOLBAR_LAST; i++) +		for (S32 i = LLToolBarEnums::TOOLBAR_FIRST; i <= LLToolBarEnums::TOOLBAR_LAST; i++)  		{  			gl_rect_2d(toolbar_rects[i], drop_color, TRUE);  		} @@ -620,7 +626,7 @@ BOOL LLToolBarView::handleDropTool( void* cargo_data, S32 x, S32 y, LLToolBar* t  			S32 old_toolbar_loc = gToolBarView->hasCommand(command_id);  			LLToolBar* old_toolbar = NULL; -			if (old_toolbar_loc != TOOLBAR_NONE) +			if (old_toolbar_loc != LLToolBarEnums::TOOLBAR_NONE)  			{  				llassert(gToolBarView->mDragToolbarButton);  				old_toolbar = gToolBarView->mDragToolbarButton->getParentByType<LLToolBar>(); @@ -683,7 +689,7 @@ bool LLToolBarView::isModified() const  {  	bool modified = false; -	for (S32 i = TOOLBAR_FIRST; i <= TOOLBAR_LAST; i++) +	for (S32 i = LLToolBarEnums::TOOLBAR_FIRST; i <= LLToolBarEnums::TOOLBAR_LAST; i++)  	{  		modified |= mToolbars[i]->isModified();  	} diff --git a/indra/newview/lltoolbarview.h b/indra/newview/lltoolbarview.h index dcc3862074..a230c2fdee 100755 --- a/indra/newview/lltoolbarview.h +++ b/indra/newview/lltoolbarview.h @@ -40,19 +40,6 @@ class LLUICtrlFactory;  class LLToolBarView : public LLUICtrl  {  public: -	typedef enum -	{ -		TOOLBAR_NONE = 0, -		TOOLBAR_LEFT, -		TOOLBAR_RIGHT, -		TOOLBAR_BOTTOM, - -		TOOLBAR_COUNT, - -		TOOLBAR_FIRST = TOOLBAR_LEFT, -		TOOLBAR_LAST = TOOLBAR_BOTTOM, -	} EToolBarLocation; -  	// Xui structure of the toolbar panel  	struct Params : public LLInitParam::Block<Params, LLUICtrl::Params> {}; @@ -84,9 +71,9 @@ public:  	virtual void draw();  	// Toolbar view interface with the rest of the world -	// Checks if the commandId is being used somewhere in one of the toolbars, returns EToolBarLocation +	// Checks if the commandId is being used somewhere in one of the toolbars, returns LLToolBarEnums::EToolBarLocation  	S32 hasCommand(const LLCommandId& commandId) const; -	S32 addCommand(const LLCommandId& commandId, EToolBarLocation toolbar, int rank = LLToolBar::RANK_NONE); +	S32 addCommand(const LLCommandId& commandId, LLToolBarEnums::EToolBarLocation toolbar, int rank = LLToolBar::RANK_NONE);  	S32 removeCommand(const LLCommandId& commandId, int& rank);	// Sets the rank the removed command was at, RANK_NONE if not found  	S32 enableCommand(const LLCommandId& commandId, bool enabled);  	S32 stopCommandInProgress(const LLCommandId& commandId); @@ -109,7 +96,7 @@ public:  	static void resetDragTool(LLToolBarButton* toolbarButton);  	LLInventoryObject* getDragItem();  	LLView* getBottomToolbar() { return mBottomToolbarPanel; } -	LLToolBar* getToolbar(EToolBarLocation toolbar) { return mToolbars[toolbar]; } +	LLToolBar* getToolbar(LLToolBarEnums::EToolBarLocation toolbar) { return mToolbars[toolbar]; }  	bool isModified() const;  protected: @@ -127,7 +114,7 @@ private:  	static void onToolBarButtonRemoved(LLView* button);  	// Pointers to the toolbars handled by the toolbar view -	LLToolBar*  mToolbars[TOOLBAR_COUNT]; +	LLToolBar*  mToolbars[LLToolBarEnums::TOOLBAR_COUNT];  	bool		mToolbarsLoaded;  	bool				mDragStarted; diff --git a/indra/newview/lltooldraganddrop.cpp b/indra/newview/lltooldraganddrop.cpp index 1a137f7129..7314ab60c1 100755 --- a/indra/newview/lltooldraganddrop.cpp +++ b/indra/newview/lltooldraganddrop.cpp @@ -1611,16 +1611,19 @@ static void show_item_sharing_confirmation(const std::string name,  		llassert(NULL != inv_item);  		return;  	} - -	LLSD substitutions; -	substitutions["RESIDENTS"] = name; -	substitutions["ITEMS"] = inv_item->getName(); -	LLSD payload; -	payload["agent_id"] = dest_agent; -	payload["item_id"] = inv_item->getUUID(); -	payload["session_id"] = session_id; -	payload["d&d_dest"] = dest.asString(); -	LLNotificationsUtil::add("ShareItemsConfirmation", substitutions, payload, &give_inventory_cb); +	if(gInventory.getItem(inv_item->getUUID()) +		&& LLGiveInventory::isInventoryGiveAcceptable(inv_item)) +	{ +		LLSD substitutions; +		substitutions["RESIDENTS"] = name; +		substitutions["ITEMS"] = inv_item->getName(); +		LLSD payload; +		payload["agent_id"] = dest_agent; +		payload["item_id"] = inv_item->getUUID(); +		payload["session_id"] = session_id; +		payload["d&d_dest"] = dest.asString(); +		LLNotificationsUtil::add("ShareItemsConfirmation", substitutions, payload, &give_inventory_cb); +	}  }  static void get_name_cb(const LLUUID& id, diff --git a/indra/newview/llurldispatcher.cpp b/indra/newview/llurldispatcher.cpp index 00b15a5f26..0c34db39b5 100755 --- a/indra/newview/llurldispatcher.cpp +++ b/indra/newview/llurldispatcher.cpp @@ -307,7 +307,7 @@ bool LLURLDispatcher::dispatchRightClick(const std::string& slurl)  }  // static -bool LLURLDispatcher::dispatchFromTextEditor(const std::string& slurl) +bool LLURLDispatcher::dispatchFromTextEditor(const std::string& slurl, bool trusted_content)  {  	// *NOTE: Text editors are considered sources of trusted URLs  	// in order to make avatar profile links in chat history work. @@ -315,9 +315,9 @@ bool LLURLDispatcher::dispatchFromTextEditor(const std::string& slurl)  	// receiving resident will see it and must affirmatively  	// click on it.  	// *TODO: Make this trust model more refined.  JC -	const bool trusted_browser = true; +  	LLMediaCtrl* web = NULL; -	return LLURLDispatcherImpl::dispatch(LLSLURL(slurl), "clicked", web, trusted_browser); +	return LLURLDispatcherImpl::dispatch(LLSLURL(slurl), "clicked", web, trusted_content);  } diff --git a/indra/newview/llurldispatcher.h b/indra/newview/llurldispatcher.h index 6309a97af5..9b05260af1 100755 --- a/indra/newview/llurldispatcher.h +++ b/indra/newview/llurldispatcher.h @@ -53,7 +53,7 @@ public:  	static bool dispatchRightClick(const std::string& slurl); -	static bool dispatchFromTextEditor(const std::string& slurl); +	static bool dispatchFromTextEditor(const std::string& slurl, bool trusted_content);  };  #endif diff --git a/indra/newview/llurldispatcherlistener.cpp b/indra/newview/llurldispatcherlistener.cpp index c7b9afafef..7545f3a9b3 100755 --- a/indra/newview/llurldispatcherlistener.cpp +++ b/indra/newview/llurldispatcherlistener.cpp @@ -71,5 +71,5 @@ void LLURLDispatcherListener::dispatchRightClick(const LLSD& params) const  void LLURLDispatcherListener::dispatchFromTextEditor(const LLSD& params) const  { -    LLURLDispatcher::dispatchFromTextEditor(params["url"]); +	LLURLDispatcher::dispatchFromTextEditor(params["url"], false);  } diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp index 21fb8d519b..2c132740fe 100755 --- a/indra/newview/llviewermedia.cpp +++ b/indra/newview/llviewermedia.cpp @@ -67,7 +67,6 @@  #include "llvoavatarself.h"  #include "llvovolume.h"  #include "llwebprofile.h" -#include "llwebsharing.h"	// For LLWebSharing::setOpenIDCookie(), *TODO: find a better way to do this!  #include "llwindow.h"  #include "llvieweraudio.h" @@ -1426,9 +1425,6 @@ void LLViewerMedia::setOpenIDCookie()  		getCookieStore()->setCookiesFromHost(sOpenIDCookie, authority.substr(host_start, host_end - host_start)); -		// *HACK: Doing this here is nasty, find a better way. -		LLWebSharing::instance().setOpenIDCookie(sOpenIDCookie); -  		// Do a web profile get so we can store the cookie   		LLSD headers = LLSD::emptyMap();  		headers["Accept"] = "*/*"; diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index ac2940fcfc..8a238379f6 100755 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -7193,6 +7193,17 @@ class LLAdvancedClickRenderProfile: public view_listener_t  	}  }; +void gpu_benchmark(); + +class LLAdvancedClickRenderBenchmark: public view_listener_t +{ +	bool handleEvent(const LLSD& userdata) +	{ +		gpu_benchmark(); +		return true; +	} +}; +  void menu_toggle_attached_lights(void* user_data)  {  	LLPipeline::sRenderAttachedLights = gSavedSettings.getBOOL("RenderAttachedLights"); @@ -7802,6 +7813,22 @@ void handle_show_url(const LLSD& param)  } +void handle_report_bug(const LLSD& param) +{ +	LLUIString url(param.asString()); +	 +	LLStringUtil::format_map_t replace; +	replace["[ENVIRONMENT]"] = LLURI::escape(LLAppViewer::instance()->getViewerInfoString()); +	LLSLURL location_url; +	LLAgentUI::buildSLURL(location_url); +	replace["[LOCATION]"] = location_url.getSLURLString(); + +	LLUIString file_bug_url = gSavedSettings.getString("ReportBugURL"); +	file_bug_url.setArgs(replace); + +	LLWeb::loadURLExternal(file_bug_url.getString()); +} +  void handle_buy_currency_test(void*)  {  	std::string url = @@ -8633,6 +8660,7 @@ void initialize_menus()  	view_listener_t::addMenu(new LLAdvancedCheckRenderShadowOption(), "Advanced.CheckRenderShadowOption");  	view_listener_t::addMenu(new LLAdvancedClickRenderShadowOption(), "Advanced.ClickRenderShadowOption");  	view_listener_t::addMenu(new LLAdvancedClickRenderProfile(), "Advanced.ClickRenderProfile"); +	view_listener_t::addMenu(new LLAdvancedClickRenderBenchmark(), "Advanced.ClickRenderBenchmark");  	#ifdef TOGGLE_HACKED_GODLIKE_VIEWER  	view_listener_t::addMenu(new LLAdvancedHandleToggleHackedGodmode(), "Advanced.HandleToggleHackedGodmode"); @@ -8648,6 +8676,7 @@ void initialize_menus()  	commit.add("Advanced.WebBrowserTest", boost::bind(&handle_web_browser_test,	_2));	// sigh! this one opens the MEDIA browser  	commit.add("Advanced.WebContentTest", boost::bind(&handle_web_content_test, _2));	// this one opens the Web Content floater  	commit.add("Advanced.ShowURL", boost::bind(&handle_show_url, _2)); +	commit.add("Advanced.ReportBug", boost::bind(&handle_report_bug, _2));  	view_listener_t::addMenu(new LLAdvancedBuyCurrencyTest(), "Advanced.BuyCurrencyTest");  	view_listener_t::addMenu(new LLAdvancedDumpSelectMgr(), "Advanced.DumpSelectMgr");  	view_listener_t::addMenu(new LLAdvancedDumpInventory(), "Advanced.DumpInventory"); diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index 3574d37adf..dd744be4eb 100755 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -2408,14 +2408,10 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)  					&& from_id.notNull() //not a system message  					&& to_id.notNull()) //not global message  		{ -			// return a standard "do not disturb" message, but only do it to online IM  +			// return a standard "do not disturb" message, but only do it to online IM  			// (i.e. not other auto responses and not store-and-forward IM) -			if (!gIMMgr->hasSession(session_id)) -			{ -				// if there is not a panel for this conversation (i.e. it is a new IM conversation -				// initiated by the other party) then... -				send_do_not_disturb_message(msg, from_id, session_id); -			} + +			send_do_not_disturb_message(msg, from_id, session_id);  			// now store incoming IM in chat history diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp index 1544e66431..e62998db70 100755 --- a/indra/newview/llviewerobject.cpp +++ b/indra/newview/llviewerobject.cpp @@ -236,7 +236,6 @@ LLViewerObject::LLViewerObject(const LLUUID &id, const LLPCode pcode, LLViewerRe  	mOnMap(FALSE),  	mStatic(FALSE),  	mNumFaces(0), -	mTimeDilation(1.f),  	mRotTime(0.f),  	mAngularVelocityRot(),  	mPreviousRotation(), @@ -943,7 +942,6 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys,  	U16 time_dilation16;  	mesgsys->getU16Fast(_PREHASH_RegionData, _PREHASH_TimeDilation, time_dilation16);  	F32 time_dilation = ((F32) time_dilation16) / 65535.f; -	mTimeDilation = time_dilation;  	mRegionp->setTimeDilation(time_dilation);  	// this will be used to determine if we've really changed position @@ -1986,7 +1984,7 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys,  		LLCircuitData *cdp = gMessageSystem->mCircuitInfo.findCircuit(mesgsys->getSender());  		if (cdp)  		{ -			F32 ping_delay = 0.5f * mTimeDilation * ( ((F32)cdp->getPingDelay()) * 0.001f + gFrameDTClamped); +			F32 ping_delay = 0.5f * time_dilation * ( ((F32)cdp->getPingDelay()) * 0.001f + gFrameDTClamped);  			LLVector3 diff = getVelocity() * ping_delay;   			new_pos_parent += diff;  		} @@ -2185,35 +2183,33 @@ BOOL LLViewerObject::isActive() const -void LLViewerObject::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time) +void LLViewerObject::idleUpdate(LLAgent &agent, const F64 &time)  {  	//static LLFastTimer::DeclareTimer ftm("Viewer Object");  	//LLFastTimer t(ftm);  	if (!mDead)  	{ -	// CRO - don't velocity interp linked objects! -	// Leviathan - but DO velocity interp joints -	if (!mStatic && sVelocityInterpolate && !isSelected()) -	{ -		// calculate dt from last update -		F32 dt_raw = (F32)(time - mLastInterpUpdateSecs); -		F32 dt = mTimeDilation * dt_raw; +		if (!mStatic && sVelocityInterpolate && !isSelected()) +		{ +			// calculate dt from last update +			F32 time_dilation = mRegionp ? mRegionp->getTimeDilation() : 1.0f; +			F32 dt = time_dilation * (F32)(time - mLastInterpUpdateSecs);  			applyAngularVelocity(dt);  			if (isAttachment()) -				{ -					mLastInterpUpdateSecs = time; +			{ +				mLastInterpUpdateSecs = time;  				return; +			} +			else +			{	// Move object based on it's velocity and rotation +				interpolateLinearMotion(time, dt); +			}  		} -		else -		{	// Move object based on it's velocity and rotation -			interpolateLinearMotion(time, dt); -		} -	} -	updateDrawable(FALSE); +		updateDrawable(FALSE);  	}  } @@ -4063,7 +4059,7 @@ void LLViewerObject::setTE(const U8 te, const LLTextureEntry &texture_entry)  {  	LLPrimitive::setTE(te, texture_entry); -	const LLUUID& image_id = getTE(te)->getID(); +		const LLUUID& image_id = getTE(te)->getID();  		mTEImages[te] = LLViewerTextureManager::getFetchedTexture(image_id, FTT_DEFAULT, TRUE, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE);  	if (getTE(te)->getMaterialParams().notNull()) diff --git a/indra/newview/llviewerobject.h b/indra/newview/llviewerobject.h index 80bdd628a1..c34d4493d5 100755 --- a/indra/newview/llviewerobject.h +++ b/indra/newview/llviewerobject.h @@ -143,7 +143,7 @@ public:  	LLNameValue*	getNVPair(const std::string& name) const;			// null if no name value pair by that name  	// Object create and update functions -	virtual void	idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time); +	virtual void	idleUpdate(LLAgent &agent, const F64 &time);  	// Types of media we can associate  	enum { MEDIA_NONE = 0, MEDIA_SET = 1 }; @@ -305,7 +305,7 @@ public:  	/*virtual*/ S32		setTETexture(const U8 te, const LLUUID &uuid);  	/*virtual*/ S32		setTENormalMap(const U8 te, const LLUUID &uuid);  	/*virtual*/ S32		setTESpecularMap(const U8 te, const LLUUID &uuid); -	S32 setTETextureCore(const U8 te, LLViewerTexture *image); +	S32 				setTETextureCore(const U8 te, LLViewerTexture *image);  	S32 setTENormalMapCore(const U8 te, LLViewerTexture *image);  	S32 setTESpecularMapCore(const U8 te, LLViewerTexture *image);  	/*virtual*/ S32		setTEColor(const U8 te, const LLColor3 &color); @@ -743,7 +743,6 @@ protected:  	BOOL			mStatic;					// Object doesn't move.  	S32				mNumFaces; -	F32				mTimeDilation;				// Time dilation sent with the object.  	F32				mRotTime;					// Amount (in seconds) that object has rotated according to angular velocity (llSetTargetOmega)  	LLQuaternion	mAngularVelocityRot;		// accumulated rotation from the angular velocity computations  	LLQuaternion	mPreviousRotation; diff --git a/indra/newview/llviewerobjectlist.cpp b/indra/newview/llviewerobjectlist.cpp index b4e287c446..f667c2bf33 100755 --- a/indra/newview/llviewerobjectlist.cpp +++ b/indra/newview/llviewerobjectlist.cpp @@ -399,10 +399,10 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys,  			if (update_type != OUT_TERSE_IMPROVED) // OUT_FULL_COMPRESSED only?  			{ -				compressed_dp.unpackUUID(fullid, "ID"); -				compressed_dp.unpackU32(local_id, "LocalID"); -				compressed_dp.unpackU8(pcode, "PCode"); -			} +					compressed_dp.unpackUUID(fullid, "ID"); +					compressed_dp.unpackU32(local_id, "LocalID"); +					compressed_dp.unpackU8(pcode, "PCode"); +				}  			else  			{  				compressed_dp.unpackU32(local_id, "LocalID"); @@ -561,7 +561,7 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys,  			processUpdateCore(objectp, user_data, i, update_type, NULL, justCreated);  		}  		recorder.objectUpdateEvent(local_id, update_type, objectp, msg_size); -		objectp->setLastUpdateType(update_type); +		objectp->setLastUpdateType(update_type);		  		objectp->setLastUpdateCached(bCached);  	} @@ -852,7 +852,7 @@ private:  	LLSD mObjectIDs;  }; -void LLViewerObjectList::update(LLAgent &agent, LLWorld &world) +void LLViewerObjectList::update(LLAgent &agent)  {  	// Update globals  	LLViewerObject::setVelocityInterpolate( gSavedSettings.getBOOL("VelocityInterpolate") ); @@ -942,7 +942,7 @@ void LLViewerObjectList::update(LLAgent &agent, LLWorld &world)  			objectp = *iter;  			if (objectp->isAvatar())  			{ -				objectp->idleUpdate(agent, world, frame_time); +				objectp->idleUpdate(agent, frame_time);  			}  		}  	} @@ -953,7 +953,7 @@ void LLViewerObjectList::update(LLAgent &agent, LLWorld &world)  		{  			objectp = *idle_iter;  			llassert(objectp->isActive()); -			objectp->idleUpdate(agent, world, frame_time); +			objectp->idleUpdate(agent, frame_time);  		}  		//update flexible objects diff --git a/indra/newview/llviewerobjectlist.h b/indra/newview/llviewerobjectlist.h index 6518c25d09..98b50fa789 100755 --- a/indra/newview/llviewerobjectlist.h +++ b/indra/newview/llviewerobjectlist.h @@ -83,7 +83,7 @@ public:  	void processCompressedObjectUpdate(LLMessageSystem *mesgsys, void **user_data, EObjectUpdateType update_type);  	void processCachedObjectUpdate(LLMessageSystem *mesgsys, void **user_data, EObjectUpdateType update_type);  	void updateApparentAngles(LLAgent &agent); -	void update(LLAgent &agent, LLWorld &world); +	void update(LLAgent &agent);  	void fetchObjectCosts();  	void fetchPhysicsFlags(); diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp index 6018c2d250..c10782bb0f 100755 --- a/indra/newview/llviewerregion.cpp +++ b/indra/newview/llviewerregion.cpp @@ -302,9 +302,14 @@ public:  		if ( regionp->getRegionImpl()->mCapabilities.size() != regionp->getRegionImpl()->mSecondCapabilitiesTracker.size() )  		{ -			llinfos<<"BaseCapabilitiesCompleteTracker "<<"Sim sent duplicate seed caps that differs in size - most likely content."<<llendl;			 +			llinfos << "BaseCapabilitiesCompleteTracker " << "sim " << regionp->getName() +				<< " sent duplicate seed caps that differs in size - most likely content. "  +				<< (S32) regionp->getRegionImpl()->mCapabilities.size() << " vs " << regionp->getRegionImpl()->mSecondCapabilitiesTracker.size() +				<< llendl;			 +			  			//todo#add cap debug versus original check? -			/*CapabilityMap::const_iterator iter = regionp->getRegionImpl()->mCapabilities.begin(); +			/* +			CapabilityMap::const_iterator iter = regionp->getRegionImpl()->mCapabilities.begin();  			while (iter!=regionp->getRegionImpl()->mCapabilities.end() )  			{  				llinfos << "BaseCapabilitiesCompleteTracker Original " << iter->first << " " << iter->second<<llendl; @@ -395,6 +400,9 @@ LLViewerRegion::LLViewerRegion(const U64 &handle,  	mImpl->mObjectPartition.push_back(new LLBridgePartition());	//PARTITION_BRIDGE  	mImpl->mObjectPartition.push_back(new LLHUDParticlePartition());//PARTITION_HUD_PARTICLE  	mImpl->mObjectPartition.push_back(NULL);						//PARTITION_NONE + +	mRenderInfoRequestTimer.resetWithExpiry(0.f);		// Set timer to be expired +	setCapabilitiesReceivedCallback(boost::bind(&LLAvatarRenderInfoAccountant::expireRenderInfoReportTimer, _1));  } @@ -1579,6 +1587,7 @@ void LLViewerRegionImpl::buildCapabilityNames(LLSD& capabilityNames)  	capabilityNames.append("AgentState");  	capabilityNames.append("AttachmentResources");  	capabilityNames.append("AvatarPickerSearch"); +	capabilityNames.append("AvatarRenderInfo");  	capabilityNames.append("CharacterProperties");  	capabilityNames.append("ChatSessionRequest");  	capabilityNames.append("CopyInventoryFromNotecard"); diff --git a/indra/newview/llviewerregion.h b/indra/newview/llviewerregion.h index 8f8bfa23c1..a8716985cb 100755 --- a/indra/newview/llviewerregion.h +++ b/indra/newview/llviewerregion.h @@ -115,7 +115,7 @@ public:  	void setAllowSetHome(BOOL b) { setRegionFlag(REGION_FLAGS_ALLOW_SET_HOME, b); }  	void setResetHomeOnTeleport(BOOL b) { setRegionFlag(REGION_FLAGS_RESET_HOME_ON_TELEPORT, b); }  	void setSunFixed(BOOL b) { setRegionFlag(REGION_FLAGS_SUN_FIXED, b); } -	void setBlockFly(BOOL b) { setRegionFlag(REGION_FLAGS_BLOCK_FLY, b); } +	//void setBlockFly(BOOL b) { setRegionFlag(REGION_FLAGS_BLOCK_FLY, b); }		Never used  	void setAllowDirectTeleport(BOOL b) { setRegionFlag(REGION_FLAGS_ALLOW_DIRECT_TELEPORT, b); } diff --git a/indra/newview/llviewershadermgr.cpp b/indra/newview/llviewershadermgr.cpp index 553f6a2d59..e88b22b461 100755 --- a/indra/newview/llviewershadermgr.cpp +++ b/indra/newview/llviewershadermgr.cpp @@ -87,6 +87,8 @@ LLGLSLShader	gClipProgram;  LLGLSLShader	gDownsampleDepthProgram;  LLGLSLShader	gDownsampleDepthRectProgram;  LLGLSLShader	gAlphaMaskProgram; +LLGLSLShader	gBenchmarkProgram; +  //object shaders  LLGLSLShader		gObjectSimpleProgram; @@ -681,6 +683,7 @@ void LLViewerShaderMgr::unloadShaders()  	gClipProgram.unload();  	gDownsampleDepthProgram.unload();  	gDownsampleDepthRectProgram.unload(); +	gBenchmarkProgram.unload();  	gAlphaMaskProgram.unload();  	gUIProgram.unload();  	gPathfindingProgram.unload(); @@ -3190,6 +3193,26 @@ BOOL LLViewerShaderMgr::loadShadersInterface()  	if (success)  	{ +		gBenchmarkProgram.mName = "Benchmark Shader"; +		gBenchmarkProgram.mShaderFiles.clear(); +		gBenchmarkProgram.mShaderFiles.push_back(make_pair("interface/benchmarkV.glsl", GL_VERTEX_SHADER_ARB)); +		gBenchmarkProgram.mShaderFiles.push_back(make_pair("interface/benchmarkF.glsl", GL_FRAGMENT_SHADER_ARB)); +		gBenchmarkProgram.mShaderLevel = mVertexShaderLevel[SHADER_INTERFACE]; +		success = gBenchmarkProgram.createShader(NULL, NULL); +	} + +	if (success) +	{ +		gDownsampleDepthRectProgram.mName = "DownsampleDepthRect Shader"; +		gDownsampleDepthRectProgram.mShaderFiles.clear(); +		gDownsampleDepthRectProgram.mShaderFiles.push_back(make_pair("interface/downsampleDepthV.glsl", GL_VERTEX_SHADER_ARB)); +		gDownsampleDepthRectProgram.mShaderFiles.push_back(make_pair("interface/downsampleDepthRectF.glsl", GL_FRAGMENT_SHADER_ARB)); +		gDownsampleDepthRectProgram.mShaderLevel = mVertexShaderLevel[SHADER_INTERFACE]; +		success = gDownsampleDepthRectProgram.createShader(NULL, NULL); +	} + +	if (success) +	{  		gDownsampleDepthRectProgram.mName = "DownsampleDepthRect Shader";  		gDownsampleDepthRectProgram.mShaderFiles.clear();  		gDownsampleDepthRectProgram.mShaderFiles.push_back(make_pair("interface/downsampleDepthV.glsl", GL_VERTEX_SHADER_ARB)); diff --git a/indra/newview/llviewershadermgr.h b/indra/newview/llviewershadermgr.h index 3d89f8d20a..53569ca7ab 100755 --- a/indra/newview/llviewershadermgr.h +++ b/indra/newview/llviewershadermgr.h @@ -183,6 +183,7 @@ extern LLGLSLShader			gDebugProgram;  extern LLGLSLShader			gClipProgram;  extern LLGLSLShader			gDownsampleDepthProgram;  extern LLGLSLShader			gDownsampleDepthRectProgram; +extern LLGLSLShader			gBenchmarkProgram;  //output tex0[tc0] + tex1[tc1]  extern LLGLSLShader			gTwoTextureAddProgram; diff --git a/indra/newview/llviewertexteditor.cpp b/indra/newview/llviewertexteditor.cpp index 8036a4e258..e51f7b2c71 100755 --- a/indra/newview/llviewertexteditor.cpp +++ b/indra/newview/llviewertexteditor.cpp @@ -689,6 +689,11 @@ void LLViewerTextEditor::makePristine()  	LLTextEditor::makePristine();  } +void LLViewerTextEditor::handleVisibilityChange( BOOL new_visibility ) +{ +	LLUICtrl::handleVisibilityChange(new_visibility); +} +  BOOL LLViewerTextEditor::handleMouseDown(S32 x, S32 y, MASK mask)  {  	BOOL	handled = FALSE; diff --git a/indra/newview/llviewertexteditor.h b/indra/newview/llviewertexteditor.h index fb428d0dc1..33b78a5964 100755 --- a/indra/newview/llviewertexteditor.h +++ b/indra/newview/llviewertexteditor.h @@ -46,6 +46,8 @@ public:  	virtual ~LLViewerTextEditor();  	virtual void makePristine(); + +	/*virtual*/ void handleVisibilityChange( BOOL new_visibility );  	// mousehandler overrides  	virtual BOOL	handleMouseDown(S32 x, S32 y, MASK mask); diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp index 693eca8a06..3da6d33d72 100755 --- a/indra/newview/llviewertexture.cpp +++ b/indra/newview/llviewertexture.cpp @@ -422,7 +422,9 @@ void LLViewerTextureManager::cleanup()  	LLViewerFetchedTexture::sDefaultImagep = NULL;	  	LLViewerFetchedTexture::sSmokeImagep = NULL;  	LLViewerFetchedTexture::sMissingAssetImagep = NULL; +	LLTexUnit::sWhiteTexture = 0;  	LLViewerFetchedTexture::sWhiteImagep = NULL; +	  	LLViewerFetchedTexture::sFlatNormalImagep = NULL;  	LLViewerMediaTexture::cleanUpClass() ;	 diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index cb7536edce..3193a2955b 100755 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -1860,6 +1860,14 @@ void LLViewerWindow::initBase()  	// Constrain floaters to inside the menu and status bar regions.  	gFloaterView = main_view->getChild<LLFloaterView>("Floater View"); +	for (S32 i = 0; i < LLToolBarEnums::TOOLBAR_COUNT; ++i) +	{ +		LLToolBar * toolbarp = gToolBarView->getToolbar((LLToolBarEnums::EToolBarLocation)i); +		if (toolbarp) +		{ +			toolbarp->getCenterLayoutPanel()->setReshapeCallback(boost::bind(&LLFloaterView::setToolbarRect, gFloaterView, _1, _2)); +		} +	}  	gFloaterView->setFloaterSnapView(main_view->getChild<LLView>("floater_snap_region")->getHandle());  	gSnapshotFloaterView = main_view->getChild<LLSnapshotFloaterView>("Snapshot Floater View"); @@ -3236,8 +3244,6 @@ void LLViewerWindow::updateUI()  	updateLayout(); -	mLastMousePoint = mCurrentMousePoint; -  	// cleanup unused selections when no modal dialogs are open  	if (LLModalDialog::activeCount() == 0)  	{ @@ -3475,6 +3481,9 @@ void LLViewerWindow::saveLastMouse(const LLCoordGL &point)  {  	// Store last mouse location.  	// If mouse leaves window, pretend last point was on edge of window + +	mLastMousePoint = mCurrentMousePoint; +  	if (point.mX < 0)  	{  		mCurrentMousePoint.mX = 0; diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index c3c1edb0a3..ca3c0b1099 100755 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -116,16 +116,16 @@ using namespace LLAvatarAppearanceDefines;  //-----------------------------------------------------------------------------  // Global constants  //----------------------------------------------------------------------------- -const LLUUID ANIM_AGENT_BODY_NOISE = LLUUID("9aa8b0a6-0c6f-9518-c7c3-4f41f2c001ad"); //"body_noise" -const LLUUID ANIM_AGENT_BREATHE_ROT	= LLUUID("4c5a103e-b830-2f1c-16bc-224aa0ad5bc8");  //"breathe_rot" -const LLUUID ANIM_AGENT_EDITING	= LLUUID("2a8eba1d-a7f8-5596-d44a-b4977bf8c8bb");  //"editing" -const LLUUID ANIM_AGENT_EYE	= LLUUID("5c780ea8-1cd1-c463-a128-48c023f6fbea");  //"eye" -const LLUUID ANIM_AGENT_FLY_ADJUST = LLUUID("db95561f-f1b0-9f9a-7224-b12f71af126e");  //"fly_adjust" -const LLUUID ANIM_AGENT_HAND_MOTION	= LLUUID("ce986325-0ba7-6e6e-cc24-b17c4b795578");  //"hand_motion" -const LLUUID ANIM_AGENT_HEAD_ROT = LLUUID("e6e8d1dd-e643-fff7-b238-c6b4b056a68d");  //"head_rot" -const LLUUID ANIM_AGENT_PELVIS_FIX = LLUUID("0c5dd2a2-514d-8893-d44d-05beffad208b");  //"pelvis_fix" -const LLUUID ANIM_AGENT_TARGET = LLUUID("0e4896cb-fba4-926c-f355-8720189d5b55");  //"target" -const LLUUID ANIM_AGENT_WALK_ADJUST	= LLUUID("829bc85b-02fc-ec41-be2e-74cc6dd7215d");  //"walk_adjust" +const LLUUID ANIM_AGENT_BODY_NOISE     = LLUUID("9aa8b0a6-0c6f-9518-c7c3-4f41f2c001ad"); //"body_noise" +const LLUUID ANIM_AGENT_BREATHE_ROT	   = LLUUID("4c5a103e-b830-2f1c-16bc-224aa0ad5bc8");  //"breathe_rot" +const LLUUID ANIM_AGENT_EDITING	       = LLUUID("2a8eba1d-a7f8-5596-d44a-b4977bf8c8bb");  //"editing" +const LLUUID ANIM_AGENT_EYE	           = LLUUID("5c780ea8-1cd1-c463-a128-48c023f6fbea");  //"eye" +const LLUUID ANIM_AGENT_FLY_ADJUST     = LLUUID("db95561f-f1b0-9f9a-7224-b12f71af126e");  //"fly_adjust" +const LLUUID ANIM_AGENT_HAND_MOTION	   = LLUUID("ce986325-0ba7-6e6e-cc24-b17c4b795578");  //"hand_motion" +const LLUUID ANIM_AGENT_HEAD_ROT       = LLUUID("e6e8d1dd-e643-fff7-b238-c6b4b056a68d");  //"head_rot" +const LLUUID ANIM_AGENT_PELVIS_FIX     = LLUUID("0c5dd2a2-514d-8893-d44d-05beffad208b");  //"pelvis_fix" +const LLUUID ANIM_AGENT_TARGET         = LLUUID("0e4896cb-fba4-926c-f355-8720189d5b55");  //"target" +const LLUUID ANIM_AGENT_WALK_ADJUST	   = LLUUID("829bc85b-02fc-ec41-be2e-74cc6dd7215d");  //"walk_adjust"  const LLUUID ANIM_AGENT_PHYSICS_MOTION = LLUUID("7360e029-3cb8-ebc4-863e-212df440d987");  //"physics_motion" @@ -253,7 +253,7 @@ struct LLAppearanceMessageContents  };  struct LLVOAvatarChildJoint : public LLInitParam::ChoiceBlock<LLVOAvatarChildJoint> -	{ +{  	Alternative<Lazy<struct LLVOAvatarBoneInfo, IS_A_BLOCK> >	bone;  	Alternative<LLVOAvatarCollisionVolumeInfo>		collision_volume; @@ -813,17 +813,17 @@ void LLVOAvatar::debugAvatarRezTime(std::string notification_name, std::string c  //------------------------------------------------------------------------  LLVOAvatar::~LLVOAvatar()  { -		if (!mFullyLoaded) -		{ +	if (!mFullyLoaded) +	{  		debugAvatarRezTime("AvatarRezLeftCloudNotification","left after ruth seconds as cloud"); -		} -		else -		{ +	} +	else +	{  		debugAvatarRezTime("AvatarRezLeftNotification","left sometime after declouding"); -		} +	}  	logPendingPhases(); - +	  	lldebugs << "LLVOAvatar Destructor (0x" << this << ") id:" << mID << llendl;  	std::for_each(mAttachmentPoints.begin(), mAttachmentPoints.end(), DeletePairedPointer()); @@ -1207,7 +1207,7 @@ void LLVOAvatar::initInstance(void)  		registerMotion( ANIM_AGENT_TARGET,					LLTargetingMotion::create );  		registerMotion( ANIM_AGENT_WALK_ADJUST,				LLWalkAdjustMotion::create );  	} -	 +  	LLAvatarAppearance::initInstance();  	// preload specific motions here @@ -1554,7 +1554,7 @@ LLViewerObject* LLVOAvatar::lineSegmentIntersectRiggedAttachments(const LLVector  	return hit;  } - +	  LLVOAvatar* LLVOAvatar::asAvatar()  {  	return this; @@ -1889,22 +1889,22 @@ LLViewerFetchedTexture *LLVOAvatar::getBakedTextureImage(const U8 te, const LLUU  	}  	if (!result) -{ +	{  		const std::string url = getImageURL(te,uuid);  		if (!url.empty()) -	{ +		{  			LL_DEBUGS("Avatar") << avString() << "from URL " << url << llendl;  			result = LLViewerTextureManager::getFetchedTextureFromUrl(  				url, FTT_SERVER_BAKE, TRUE, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE, 0, 0, uuid); -	} -	else -	{ +		} +		else +		{  			LL_DEBUGS("Avatar") << avString() << "from host " << uuid << llendl;  			LLHost host = getObjectHost();  			result = LLViewerTextureManager::getFetchedTexture(  				uuid, FTT_HOST_BAKE, TRUE, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE, 0, 0, host); +		}  	} -}  	return result;  } @@ -1955,7 +1955,7 @@ void LLVOAvatar::dumpAnimationState()  //------------------------------------------------------------------------  // idleUpdate()  //------------------------------------------------------------------------ -void LLVOAvatar::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time) +void LLVOAvatar::idleUpdate(LLAgent &agent, const F64 &time)  {  	LLFastTimer t(FTM_AVATAR_UPDATE); @@ -2010,7 +2010,7 @@ void LLVOAvatar::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time)  	if (isSelf())  	{ -		LLViewerObject::idleUpdate(agent, world, time); +		LLViewerObject::idleUpdate(agent, time);  		// trigger fidget anims  		if (isAnyAnimationSignaled(AGENT_STAND_ANIMS, NUM_AGENT_STAND_ANIMS)) @@ -2022,7 +2022,7 @@ void LLVOAvatar::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time)  	{  		// Should override the idleUpdate stuff and leave out the angular update part.  		LLQuaternion rotation = getRotation(); -		LLViewerObject::idleUpdate(agent, world, time); +		LLViewerObject::idleUpdate(agent, time);  		setRotation(rotation);  	} @@ -4072,7 +4072,7 @@ U32 LLVOAvatar::renderTransparent(BOOL first_pass)  		{  			LLViewerJoint* hair_mesh = getViewerJoint(MESH_ID_HAIR);  			if (hair_mesh) -		{ +			{  				num_indices += hair_mesh->render(mAdjustedPixelArea, first_pass, mIsDummy);  			}  			first_pass = FALSE; @@ -4082,7 +4082,7 @@ U32 LLVOAvatar::renderTransparent(BOOL first_pass)  			gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT);  		}  	} -	 +  	return num_indices;  } @@ -5147,7 +5147,7 @@ void LLVOAvatar::getGround(const LLVector3 &in_pos_agent, LLVector3 &out_pos_age  //-----------------------------------------------------------------------------  F32 LLVOAvatar::getTimeDilation()  { -	return mTimeDilation; +	return mRegionp ? mRegionp->getTimeDilation() : 1.f;  } @@ -5199,9 +5199,9 @@ BOOL LLVOAvatar::loadSkeletonNode ()  {  	if (!LLAvatarAppearance::loadSkeletonNode())  	{ -				return FALSE; -			} -	 +		return FALSE; +	} +  	// ATTACHMENTS  	{  		LLAvatarXmlInfo::attachment_info_list_t::iterator iter; @@ -5744,7 +5744,8 @@ void LLVOAvatar::cleanupAttachedMesh( LLViewerObject* pVO )  					}  				}  			}				 -		} +} +  //-----------------------------------------------------------------------------  // detachObject()  //----------------------------------------------------------------------------- @@ -5957,18 +5958,18 @@ BOOL LLVOAvatar::isWearingWearableType(LLWearableType::EType type) const  	{  		const LLAvatarAppearanceDictionary::TextureEntry *texture_dict = tex_iter->second;  		if (texture_dict->mWearableType == type) -	{ +		{  			// Thus, you must check to see if the corresponding baked texture is defined.  			// NOTE: this is a poor substitute if you actually want to know about individual pieces of clothing  			// this works for detecting a skirt (most important), but is ineffective at any piece of clothing that  			// gets baked into a texture that always exists (upper or lower).  			if (texture_dict->mIsUsedByBakedTexture) -	{ +			{  				const EBakedTextureIndex baked_index = texture_dict->mBakedTextureIndex;  				return isTextureDefined(LLAvatarAppearanceDictionary::getInstance()->getBakedTexture(baked_index)->mTextureIndex); -	} +			}  			return FALSE; -	} +		}  	}  	return FALSE;  } @@ -6033,7 +6034,7 @@ void LLVOAvatar::onGlobalColorChanged(const LLTexGlobalColor* global_color, BOOL  			{  				LLAvatarJointMesh* mesh = (*iter);  				if (mesh) -			{ +				{  					mesh->setColor( color );  				}  			} @@ -6101,9 +6102,9 @@ void LLVOAvatar::updateRezzedStatusTimers()  		{  			// load level has decreased. start phase timers for higher load levels.  			for (S32 i = rez_status+1; i <= mLastRezzedStatus; i++) -		{ +			{  				startPhase("load_" + LLVOAvatar::rezStatusToString(i)); -		} +			}  		}  		else if (rez_status > mLastRezzedStatus)  		{ @@ -6112,16 +6113,16 @@ void LLVOAvatar::updateRezzedStatusTimers()  			{  				stopPhase("load_" + LLVOAvatar::rezStatusToString(i));  				stopPhase("first_load_" + LLVOAvatar::rezStatusToString(i), false); -		} +			}  			if (rez_status == 3) -		{ +			{  				// "fully loaded", mark any pending appearance change complete.  				selfStopPhase("update_appearance_from_cof");  				selfStopPhase("wear_inventory_category", false);  				selfStopPhase("process_initial_wearables_update", false);  			}  		} -		 +  		mLastRezzedStatus = rez_status;  	}  } @@ -6148,7 +6149,7 @@ void LLVOAvatar::startPhase(const std::string& phase_name)  }  void LLVOAvatar::stopPhase(const std::string& phase_name, bool err_check) -		{ +{  	F32 elapsed;  	bool completed;  	if (getPhases().getPhaseValues(phase_name, elapsed, completed)) @@ -6180,7 +6181,7 @@ void LLVOAvatar::stopPhase(const std::string& phase_name, bool err_check)  void LLVOAvatar::logPendingPhases()  {  	if (!isAgentAvatarValid()) -		{ +	{  		return;  	} @@ -6196,14 +6197,14 @@ void LLVOAvatar::logPendingPhases()  			if (!completed)  			{  				logMetricsTimerRecord(phase_name, elapsed, completed); -		} +			}  		}  	} -		} +}  //static  void LLVOAvatar::logPendingPhasesAllAvatars() -		{ +{  	for (std::vector<LLCharacter*>::iterator iter = LLCharacter::sInstances.begin();  		 iter != LLCharacter::sInstances.end(); ++iter)  	{ @@ -6214,14 +6215,14 @@ void LLVOAvatar::logPendingPhasesAllAvatars()  		}  		inst->logPendingPhases();  	} -		} +}  void LLVOAvatar::logMetricsTimerRecord(const std::string& phase_name, F32 elapsed, bool completed) -		{ +{  	if (!isAgentAvatarValid()) -		{ +	{  		return; -		} +	}  	LLSD record;  	record["timer_name"] = phase_name; @@ -6230,15 +6231,15 @@ void LLVOAvatar::logMetricsTimerRecord(const std::string& phase_name, F32 elapse  	record["completed"] = completed;  	U32 grid_x(0), grid_y(0);  	if (getRegion()) -		{ +	{  		record["central_bake_version"] = LLSD::Integer(getRegion()->getCentralBakeVersion());  		grid_from_region_handle(getRegion()->getHandle(), &grid_x, &grid_y); -		} +	}  	record["grid_x"] = LLSD::Integer(grid_x);  	record["grid_y"] = LLSD::Integer(grid_y);  	record["is_using_server_bakes"] = ((bool) isUsingServerBakes());  	record["is_self"] = isSelf(); -		 +	  	if (isAgentAvatarValid())  	{  		gAgentAvatarp->addMetricsTimerRecord(record); @@ -6446,28 +6447,28 @@ void LLVOAvatar::updateMeshTextures()  										   use_lkg_baked_layer[i],  										   last_id_string.c_str());  	} - +	  	for (U32 i=0; i < mBakedTextureDatas.size(); i++)  	{  		debugColorizeSubMeshes(i, LLColor4::white);  		LLViewerTexLayerSet* layerset = getTexLayerSet(i);  		if (use_lkg_baked_layer[i] && !isUsingLocalAppearance() ) -	{ +		{  			LLViewerFetchedTexture* baked_img = LLViewerTextureManager::getFetchedTexture(mBakedTextureDatas[i].mLastTextureID);  			mBakedTextureDatas[i].mIsUsed = TRUE;  			debugColorizeSubMeshes(i,LLColor4::red); -	 +  			avatar_joint_mesh_list_t::iterator iter = mBakedTextureDatas[i].mJointMeshes.begin();  			avatar_joint_mesh_list_t::iterator end  = mBakedTextureDatas[i].mJointMeshes.end();  			for (; iter != end; ++iter) -	{ +			{  				LLAvatarJointMesh* mesh = (*iter);  				if (mesh) -		{ +				{  					mesh->setTexture( baked_img ); -			} +				}  			}  		}  		else if (!isUsingLocalAppearance() && is_layer_baked[i]) @@ -6511,7 +6512,7 @@ void LLVOAvatar::updateMeshTextures()  				if (mesh)  				{  					mesh->setLayerSet( layerset ); -			} +				}  			}  		}  		else @@ -6533,7 +6534,7 @@ void LLVOAvatar::updateMeshTextures()  		{  			LLAvatarJointMesh* mesh = (*iter);  			if (mesh) -		{ +			{  				mesh->setColor( color );  				mesh->setTexture( hair_img );  			} @@ -6561,7 +6562,15 @@ void LLVOAvatar::updateMeshTextures()  			}  		}  	} -	removeMissingBakedTextures(); + +	// removeMissingBakedTextures() will call back into this rountine if something is removed, and can blow up the stack +	static bool call_remove_missing = true;	 +	if (call_remove_missing) +	{ +		call_remove_missing = false; +		removeMissingBakedTextures();	// May call back into this function if anything is removed +		call_remove_missing = true; +	}  }  // virtual @@ -6621,13 +6630,13 @@ void LLVOAvatar::applyMorphMask(U8* tex_data, S32 width, S32 height, S32 num_com  	for (morph_list_t::const_iterator iter = mBakedTextureDatas[index].mMaskedMorphs.begin();  		 iter != mBakedTextureDatas[index].mMaskedMorphs.end(); ++iter) -{ +	{  		const LLMaskedMorph* maskedMorph = (*iter);  		LLPolyMorphTarget* morph_target = dynamic_cast<LLPolyMorphTarget*>(maskedMorph->mMorphTarget);  		if (morph_target) -	{ +		{  			morph_target->applyMask(tex_data, width, height, num_components, maskedMorph->mInvert); -} +		}  	}  } @@ -6910,8 +6919,8 @@ void dump_visual_param(apr_file_t* file, LLVisualParam* viewer_param, F32 value)  					LLWearableType::getTypeName(LLWearableType::EType(wtype)).c_str()  //					param_location_name(vparam->getParamLocation()).c_str()  		); -	} -	 +} +  void LLVOAvatar::dumpAppearanceMsgParams( const std::string& dump_prefix,  	const LLAppearanceMessageContents& contents) @@ -6925,9 +6934,9 @@ void LLVOAvatar::dumpAppearanceMsgParams( const std::string& dump_prefix,  	outfile.open(fullpath, LL_APR_WB );  	apr_file_t* file = outfile.getFileHandle();  	if (!file) -		{ -			return; -		} +	{ +		return; +	}  	else  	{  		LL_DEBUGS("Avatar") << "dumping appearance message to " << fullpath << llendl; @@ -6961,7 +6970,7 @@ void LLVOAvatar::dumpAppearanceMsgParams( const std::string& dump_prefix,  		apr_file_printf( file, "\t\t<texture te=\"%i\" uuid=\"%s\"/>\n", i, uuid_str.c_str());  	}  	apr_file_printf(file, "</textures>\n"); -	} +}  void LLVOAvatar::parseAppearanceMessage(LLMessageSystem* mesgsys, LLAppearanceMessageContents& contents)  { @@ -6978,7 +6987,7 @@ void LLVOAvatar::parseAppearanceMessage(LLMessageSystem* mesgsys, LLAppearanceMe  		// For future use:  		//mesgsys->getU32Fast(_PREHASH_AppearanceData, _PREHASH_Flags, appearance_flags, 0);  	} -	 +  	// Parse visual params, if any.  	S32 num_blocks = mesgsys->getNumberOfBlocksFast(_PREHASH_VisualParam);  	bool drop_visual_params_debug = gSavedSettings.getBOOL("BlockSomeAvatarAppearanceVisualParams") && (ll_rand(2) == 0); // pretend that ~12% of AvatarAppearance messages arrived without a VisualParam block, for testing @@ -7206,19 +7215,19 @@ void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys )  			LLVisualParam* param = contents.mParams[i];  			F32 newWeight = contents.mParamWeights[i]; -				if (is_first_appearance_message || (param->getWeight() != newWeight)) +			if (is_first_appearance_message || (param->getWeight() != newWeight)) +			{ +				params_changed = TRUE; +				if(is_first_appearance_message)  				{ -					params_changed = TRUE; -					if(is_first_appearance_message) -					{ -						param->setWeight(newWeight, FALSE); -					} -					else -					{ -						interp_params = TRUE; -						param->setAnimationTarget(newWeight, FALSE); -					} +					param->setWeight(newWeight, FALSE);  				} +				else +				{ +					interp_params = TRUE; +					param->setAnimationTarget(newWeight, FALSE); +				} +			}  		}  		const S32 expected_tweakable_count = getVisualParamCountInGroup(VISUAL_PARAM_GROUP_TWEAKABLE); // don't worry about VISUAL_PARAM_GROUP_TWEAKABLE_NO_TRANSMIT  		if (num_params != expected_tweakable_count) @@ -7474,12 +7483,12 @@ void LLVOAvatar::useBakedTexture( const LLUUID& id )  				avatar_joint_mesh_list_t::iterator iter = mBakedTextureDatas[i].mJointMeshes.begin();  				avatar_joint_mesh_list_t::iterator end  = mBakedTextureDatas[i].mJointMeshes.end();  				for (; iter != end; ++iter) -			{ +				{  					LLAvatarJointMesh* mesh = (*iter);  					if (mesh) -			{ +					{  						mesh->setTexture( image_baked ); -			} +					}  				}  			} @@ -7503,7 +7512,7 @@ void LLVOAvatar::useBakedTexture( const LLUUID& id )  				{  					LLAvatarJointMesh* mesh = (*iter);  					if (mesh) -				{ +					{  						mesh->setColor( LLColor4::white );  					}  				} @@ -7522,7 +7531,7 @@ std::string get_sequential_numbered_file_name(const std::string& prefix,  	file_num_type::iterator it = file_nums.find(prefix);  	S32 num = 0;  	if (it != file_nums.end()) -{ +	{  		num = it->second;  	}  	file_nums[prefix] = num+1; @@ -7539,7 +7548,7 @@ void LLVOAvatar::dumpArchetypeXML(const std::string& prefix, bool group_by_weara  		outprefix = getFullname() + (isSelf()?"_s":"_o");  	}  	if (outprefix.empty()) -{ +	{  		outprefix = getFullname() + (isSelf()?"_s":"_o");  	}  	if (outprefix.empty()) @@ -7568,36 +7577,36 @@ void LLVOAvatar::dumpArchetypeXML(const std::string& prefix, bool group_by_weara  	if (group_by_wearables)  	{  		for (S32 type = LLWearableType::WT_SHAPE; type < LLWearableType::WT_COUNT; type++) -	{ -		const std::string& wearable_name = LLWearableType::getTypeName((LLWearableType::EType)type); -		apr_file_printf( file, "\n\t\t<!-- wearable: %s -->\n", wearable_name.c_str() ); +		{ +			const std::string& wearable_name = LLWearableType::getTypeName((LLWearableType::EType)type); +			apr_file_printf( file, "\n\t\t<!-- wearable: %s -->\n", wearable_name.c_str() );  			for (LLVisualParam* param = getFirstVisualParam(); param; param = getNextVisualParam()) -		{ -			LLViewerVisualParam* viewer_param = (LLViewerVisualParam*)param; -			if( (viewer_param->getWearableType() == type) &&  -				(viewer_param->isTweakable() ) )  			{ +				LLViewerVisualParam* viewer_param = (LLViewerVisualParam*)param; +				if( (viewer_param->getWearableType() == type) &&  +					(viewer_param->isTweakable() ) ) +				{  					dump_visual_param(file, viewer_param, viewer_param->getWeight()); +				}  			} -		} -		for (U8 te = 0; te < TEX_NUM_INDICES; te++) -		{ -				if (LLAvatarAppearanceDictionary::getTEWearableType((ETextureIndex)te) == type) +			for (U8 te = 0; te < TEX_NUM_INDICES; te++)  			{ -				// MULTIPLE_WEARABLES: extend to multiple wearables? -					LLViewerTexture* te_image = getImage((ETextureIndex)te, 0); -				if( te_image ) +				if (LLAvatarAppearanceDictionary::getTEWearableType((ETextureIndex)te) == type)  				{ -					std::string uuid_str; -					te_image->getID().toString( uuid_str ); -					apr_file_printf( file, "\t\t<texture te=\"%i\" uuid=\"%s\"/>\n", te, uuid_str.c_str()); +					// MULTIPLE_WEARABLES: extend to multiple wearables? +					LLViewerTexture* te_image = getImage((ETextureIndex)te, 0); +					if( te_image ) +					{ +						std::string uuid_str; +						te_image->getID().toString( uuid_str ); +						apr_file_printf( file, "\t\t<texture te=\"%i\" uuid=\"%s\"/>\n", te, uuid_str.c_str()); +					}  				}  			}  		}  	} -		}  	else   	{  		// Just dump all params sequentially. @@ -7743,12 +7752,12 @@ void LLVOAvatar::startAppearanceAnimation()  // virtual  void LLVOAvatar::bodySizeChanged() -{	 +{  	if (isSelf() && !LLAppearanceMgr::instance().isInUpdateAppearanceFromCOF())  	{	// notify simulator of change in size  		// but not if we are in the middle of updating appearance  		gAgent.sendAgentSetAppearance(); -} +	}  }  BOOL LLVOAvatar::isUsingServerBakes() const @@ -7760,25 +7769,25 @@ BOOL LLVOAvatar::isUsingServerBakes() const  	F32 wt = appearance_version_param->getWeight();  	F32 expect_wt = mUseServerBakes ? 1.0 : 0.0;  	if (!is_approx_equal(wt,expect_wt)) -{ +	{  		llwarns << "wt " << wt << " differs from expected " << expect_wt << llendl;  	}  #endif  	return mUseServerBakes; -		} -		 +} +  void LLVOAvatar::setIsUsingServerBakes(BOOL newval) -		{ +{  	mUseServerBakes = newval;  	LLVisualParam* appearance_version_param = getVisualParam(11000);  	llassert(appearance_version_param);  	appearance_version_param->setWeight(newval ? 1.0 : 0.0, false); -		} +}  // virtual  void LLVOAvatar::removeMissingBakedTextures() -			{ +{	  }  //virtual diff --git a/indra/newview/llvoavatar.h b/indra/newview/llvoavatar.h index 9d45a74ecc..4ca75b0c55 100755 --- a/indra/newview/llvoavatar.h +++ b/indra/newview/llvoavatar.h @@ -129,28 +129,28 @@ public:  	/*virtual*/ void			updateGL();  	/*virtual*/ LLVOAvatar*		asAvatar();  	virtual U32    	 	 	processUpdateMessage(LLMessageSystem *mesgsys, -													 void **user_data, -													 U32 block_num, -													 const EObjectUpdateType update_type, -													 LLDataPacker *dp); -	virtual void   	 	 	idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time); +												void **user_data, +												U32 block_num, +												const EObjectUpdateType update_type, +												LLDataPacker *dp); +	virtual void   	 	 	idleUpdate(LLAgent &agent, const F64 &time);  	/*virtual*/ BOOL   	 	 	updateLOD();  	BOOL  	 	 	 	 	updateJointLODs();  	void					updateLODRiggedAttachments( void );  	/*virtual*/ BOOL   	 	 	isActive() const; // Whether this object needs to do an idleUpdate.  	S32 						totalTextureMemForUUIDS(std::set<LLUUID>& ids); -	bool 						allTexturesCompletelyDownloaded(std::set<LLUUID>& ids) const; -	bool 						allLocalTexturesCompletelyDownloaded() const; -	bool 						allBakedTexturesCompletelyDownloaded() const; -	void 						bakedTextureOriginCounts(S32 &sb_count, S32 &host_count, -														 S32 &both_count, S32 &neither_count); -	std::string 				bakedTextureOriginInfo(); -	void 						collectLocalTextureUUIDs(std::set<LLUUID>& ids) const; -	void 						collectBakedTextureUUIDs(std::set<LLUUID>& ids) const; -	void 						collectTextureUUIDs(std::set<LLUUID>& ids); -	void						releaseOldTextures(); +	bool 					allTexturesCompletelyDownloaded(std::set<LLUUID>& ids) const; +	bool 					allLocalTexturesCompletelyDownloaded() const; +	bool 					allBakedTexturesCompletelyDownloaded() const; +	void 					bakedTextureOriginCounts(S32 &sb_count, S32 &host_count, +													 S32 &both_count, S32 &neither_count); +	std::string 			bakedTextureOriginInfo(); +	void 					collectLocalTextureUUIDs(std::set<LLUUID>& ids) const; +	void 					collectBakedTextureUUIDs(std::set<LLUUID>& ids) const; +	void 					collectTextureUUIDs(std::set<LLUUID>& ids); +	void					releaseOldTextures();  	/*virtual*/ void   	 	 	updateTextures(); -	LLViewerFetchedTexture*		getBakedTextureImage(const U8 te, const LLUUID& uuid); +	LLViewerFetchedTexture*	getBakedTextureImage(const U8 te, const LLUUID& uuid);  	/*virtual*/ S32    	 	 	setTETexture(const U8 te, const LLUUID& uuid); // If setting a baked texture, need to request it from a non-local sim.  	/*virtual*/ void   	 	 	onShift(const LLVector4a& shift_vector);  	/*virtual*/ U32    	 	 	getPartitionType() const; diff --git a/indra/newview/llvoavatarself.cpp b/indra/newview/llvoavatarself.cpp index 9ce99444d9..082a85e217 100755 --- a/indra/newview/llvoavatarself.cpp +++ b/indra/newview/llvoavatarself.cpp @@ -625,11 +625,11 @@ BOOL LLVOAvatarSelf::isValid() const  }  // virtual -void LLVOAvatarSelf::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time) +void LLVOAvatarSelf::idleUpdate(LLAgent &agent, const F64 &time)  {  	if (isValid())  	{ -		LLVOAvatar::idleUpdate(agent, world, time); +		LLVOAvatar::idleUpdate(agent, time);  		idleUpdateTractorBeam();  	}  } @@ -847,7 +847,7 @@ void LLVOAvatarSelf::removeMissingBakedTextures()  		if (!tex || tex->isMissingAsset())  		{  			LLViewerTexture *imagep = LLViewerTextureManager::getFetchedTexture(IMG_DEFAULT_AVATAR); -			if (imagep) +			if (imagep && imagep != tex)  			{  				setTEImage(te, imagep);  				removed = TRUE; @@ -863,13 +863,13 @@ void LLVOAvatarSelf::removeMissingBakedTextures()  			layerset->setUpdatesEnabled(TRUE);  			invalidateComposite(layerset, FALSE);  		} -		updateMeshTextures(); +		updateMeshTextures();	// may call back into this function  		if (getRegion() && !getRegion()->getCentralBakeVersion())  		{ -		requestLayerSetUploads(); +			requestLayerSetUploads(); +		}  	}  } -}  //virtual  void LLVOAvatarSelf::updateRegion(LLViewerRegion *regionp) @@ -1310,7 +1310,7 @@ void LLVOAvatarSelf::localTextureLoaded(BOOL success, LLViewerFetchedTexture *sr  			discard_level < local_tex_obj->getDiscard())  		{  			local_tex_obj->setDiscard(discard_level); -				requestLayerSetUpdate(index); +			requestLayerSetUpdate(index);  			if (isEditingAppearance())  			{  				LLVisualParamHint::requestHintUpdates(); @@ -1799,11 +1799,11 @@ void LLVOAvatarSelf::setLocalTexture(ETextureIndex type, LLViewerTexture* src_te  					{  						requestLayerSetUpdate(type);  						if (isEditingAppearance()) -					{ -						LLVisualParamHint::requestHintUpdates(); +						{ +							LLVisualParamHint::requestHintUpdates(); +						}  					}  				} -				}  				else  				{					  					tex->setLoadedCallback(onLocalTextureLoaded, desired_discard, TRUE, FALSE, new LLAvatarTexData(getID(), type), NULL); @@ -2580,25 +2580,25 @@ void LLVOAvatarSelf::addLocalTextureStats( ETextureIndex type, LLViewerFetchedTe  	//if (!covered_by_baked)  	{  		if (imagep->getID() != IMG_DEFAULT_AVATAR) -	{ +		{  			imagep->setNoDelete();  			if (imagep->getDiscardLevel() != 0) -		{ -			F32 desired_pixels; -			desired_pixels = llmin(mPixelArea, (F32)getTexImageArea()); - -			imagep->setBoostLevel(getAvatarBoostLevel()); -				imagep->setAdditionalDecodePriority(SELF_ADDITIONAL_PRI) ; -			imagep->resetTextureStats(); -			imagep->setMaxVirtualSizeResetInterval(MAX_TEXTURE_VIRTURE_SIZE_RESET_INTERVAL); -			imagep->addTextureStats( desired_pixels / texel_area_ratio ); -			imagep->forceUpdateBindStats() ; -			if (imagep->getDiscardLevel() < 0)  			{ -				mHasGrey = TRUE; // for statistics gathering +				F32 desired_pixels; +				desired_pixels = llmin(mPixelArea, (F32)getTexImageArea()); +				 +				imagep->setBoostLevel(getAvatarBoostLevel()); +				imagep->setAdditionalDecodePriority(SELF_ADDITIONAL_PRI) ; +				imagep->resetTextureStats(); +				imagep->setMaxVirtualSizeResetInterval(MAX_TEXTURE_VIRTURE_SIZE_RESET_INTERVAL); +				imagep->addTextureStats( desired_pixels / texel_area_ratio ); +				imagep->forceUpdateBindStats() ; +				if (imagep->getDiscardLevel() < 0) +				{ +					mHasGrey = TRUE; // for statistics gathering +				}  			}  		} -		}  		else  		{  			// texture asset is missing @@ -2921,17 +2921,17 @@ void LLVOAvatarSelf::requestLayerSetUpdate(ETextureIndex index )  LLViewerTexLayerSet* LLVOAvatarSelf::getLayerSet(ETextureIndex index) const  { -	/* switch(index) -		case TEX_HEAD_BAKED: -		case TEX_HEAD_BODYPAINT: -			return mHeadLayerSet; */ +       /* switch(index) +               case TEX_HEAD_BAKED: +               case TEX_HEAD_BODYPAINT: +                       return mHeadLayerSet; */         const LLAvatarAppearanceDictionary::TextureEntry *texture_dict = LLAvatarAppearanceDictionary::getInstance()->getTexture(index); -	if (texture_dict->mIsUsedByBakedTexture) -	{ -		const EBakedTextureIndex baked_index = texture_dict->mBakedTextureIndex; +       if (texture_dict->mIsUsedByBakedTexture) +       { +               const EBakedTextureIndex baked_index = texture_dict->mBakedTextureIndex;                 return getLayerSet(baked_index); -	} -	return NULL; +       } +       return NULL;  }  LLViewerTexLayerSet* LLVOAvatarSelf::getLayerSet(EBakedTextureIndex baked_index) const @@ -2959,7 +2959,7 @@ void LLVOAvatarSelf::onCustomizeStart(bool disable_camera_switch)  		gAgentAvatarp->mUseLocalAppearance = true;  		if (gSavedSettings.getBOOL("AppearanceCameraMovement") && !disable_camera_switch) -{ +		{  			gAgentCamera.changeCameraToCustomizeAvatar();  		} diff --git a/indra/newview/llvoavatarself.h b/indra/newview/llvoavatarself.h index 3b7b6bac64..521c86e1c3 100755 --- a/indra/newview/llvoavatarself.h +++ b/indra/newview/llvoavatarself.h @@ -84,7 +84,7 @@ protected:  	//--------------------------------------------------------------------  public:  	/*virtual*/ void 		updateRegion(LLViewerRegion *regionp); -	/*virtual*/ void   	 	idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time); +	/*virtual*/ void   	 	idleUpdate(LLAgent &agent, const F64 &time);  	//--------------------------------------------------------------------  	// LLCharacter interface and related diff --git a/indra/newview/llvograss.cpp b/indra/newview/llvograss.cpp index 591d5cae0b..485b0dc8ad 100755 --- a/indra/newview/llvograss.cpp +++ b/indra/newview/llvograss.cpp @@ -277,7 +277,7 @@ BOOL LLVOGrass::isActive() const  	return TRUE;  } -void LLVOGrass::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time) +void LLVOGrass::idleUpdate(LLAgent &agent, const F64 &time)  {   	if (mDead || !(gPipeline.hasRenderType(LLPipeline::RENDER_TYPE_GRASS)))  	{ diff --git a/indra/newview/llvograss.h b/indra/newview/llvograss.h index e54de85412..ff4fa6b00d 100755 --- a/indra/newview/llvograss.h +++ b/indra/newview/llvograss.h @@ -74,7 +74,7 @@ public:  	void plantBlades();  	/*virtual*/ BOOL    isActive() const; // Whether this object needs to do an idleUpdate. -	/*virtual*/ void idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time); +	/*virtual*/ void idleUpdate(LLAgent &agent, const F64 &time);  	/*virtual*/ BOOL lineSegmentIntersect(const LLVector4a& start, const LLVector4a& end,   										  S32 face = -1,                        // which face to check, -1 = ALL_SIDES diff --git a/indra/newview/llvoground.cpp b/indra/newview/llvoground.cpp index 97b7418b40..c1273e684c 100755 --- a/indra/newview/llvoground.cpp +++ b/indra/newview/llvoground.cpp @@ -49,7 +49,7 @@ LLVOGround::~LLVOGround()  {  } -void LLVOGround::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time) +void LLVOGround::idleUpdate(LLAgent &agent, const F64 &time)  {  } diff --git a/indra/newview/llvoground.h b/indra/newview/llvoground.h index 290579b4da..a53f309e46 100755 --- a/indra/newview/llvoground.h +++ b/indra/newview/llvoground.h @@ -41,7 +41,7 @@ protected:  public:  	LLVOGround(const LLUUID &id, const LLPCode pcode, LLViewerRegion *regionp); -	/*virtual*/ void idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time); +	/*virtual*/ void idleUpdate(LLAgent &agent, const F64 &time);  	// Graphical stuff for objects - maybe broken out into render class  	// later? diff --git a/indra/newview/llvoicechannel.cpp b/indra/newview/llvoicechannel.cpp index ac2a34ba1e..665892a615 100755 --- a/indra/newview/llvoicechannel.cpp +++ b/indra/newview/llvoicechannel.cpp @@ -790,6 +790,7 @@ void LLVoiceChannelP2P::handleStatusChange(EStatusType type)  			{  				// other user declined call  				LLNotificationsUtil::add("P2PCallDeclined", mNotifyArgs); +				setState(STATE_ERROR);  			}  			else  			{ diff --git a/indra/newview/llvoicevivox.cpp b/indra/newview/llvoicevivox.cpp index 9497041482..050d9dd785 100755 --- a/indra/newview/llvoicevivox.cpp +++ b/indra/newview/llvoicevivox.cpp @@ -261,6 +261,7 @@ LLVivoxVoiceClient::LLVivoxVoiceClient() :  	mSessionTerminateRequested(false),  	mRelogRequested(false),  	mConnected(false), +	mTerminateDaemon(false),  	mPump(NULL),  	mSpatialJoiningNum(0), @@ -695,7 +696,7 @@ void LLVivoxVoiceClient::stateMachine()  		setVoiceEnabled(false);  	} -	if(mVoiceEnabled || !mIsInitialized) +	if(mVoiceEnabled || (!mIsInitialized &&!mTerminateDaemon) )  	{  		updatePosition();  	} @@ -708,11 +709,12 @@ void LLVivoxVoiceClient::stateMachine()  		if((getState() != stateDisabled) && (getState() != stateDisableCleanup))  		{  			// User turned off voice support.  Send the cleanup messages, close the socket, and reset. -			if(!mConnected) +			if(!mConnected || mTerminateDaemon)  			{  				// if voice was turned off after the daemon was launched but before we could connect to it, we may need to issue a kill.  				LL_INFOS("Voice") << "Disabling voice before connection to daemon, terminating." << LL_ENDL;  				killGateway(); +				mTerminateDaemon = false;  			}  			logout(); @@ -753,7 +755,7 @@ void LLVivoxVoiceClient::stateMachine()  				// Voice is locked out, we must not launch the vivox daemon.  				setState(stateJail);  			} -			else if(!isGatewayRunning()) +			else if(!isGatewayRunning() && gSavedSettings.getBOOL("EnableVoiceChat"))  			{  				if (true)           // production build, not test  				{ @@ -1136,6 +1138,7 @@ void LLVivoxVoiceClient::stateMachine()  				std::stringstream errs;  				errs << mVoiceAccountServerURI << "\n:UDP: 3478, 3479, 5060, 5062, 12000-17000";  				args["HOSTID"] = errs.str(); +				mTerminateDaemon = true;  				if (LLGridManager::getInstance()->isSystemGrid())  				{  					LLNotificationsUtil::add("NoVoiceConnect", args);	 @@ -2618,6 +2621,7 @@ void LLVivoxVoiceClient::connectorCreateResponse(int statusCode, std::string &st  		std::stringstream errs;  		errs << mVoiceAccountServerURI << "\n:UDP: 3478, 3479, 5060, 5062, 12000-17000";  		args["HOSTID"] = errs.str(); +		mTerminateDaemon = true;  		if (LLGridManager::getInstance()->isSystemGrid())  		{  			LLNotificationsUtil::add("NoVoiceConnect", args);	 @@ -2633,6 +2637,7 @@ void LLVivoxVoiceClient::connectorCreateResponse(int statusCode, std::string &st  		LL_INFOS("Voice") << "Connector.Create succeeded, Vivox SDK version is " << versionID << LL_ENDL;  		mVoiceVersion.serverVersion = versionID;  		mConnectorHandle = connectorHandle; +		mTerminateDaemon = false;  		if(getState() == stateConnectorStarting)  		{  			setState(stateConnectorStarted); diff --git a/indra/newview/llvoicevivox.h b/indra/newview/llvoicevivox.h index e2d1585c15..c325d72ba6 100755 --- a/indra/newview/llvoicevivox.h +++ b/indra/newview/llvoicevivox.h @@ -659,6 +659,8 @@ private:  	LLSocket::ptr_t mSocket;  	bool mConnected; +	// We should kill the voice daemon in case of connection alert  +	bool mTerminateDaemon;  	LLPumpIO *mPump;  	friend class LLVivoxProtocolParser; diff --git a/indra/newview/llvopartgroup.cpp b/indra/newview/llvopartgroup.cpp index 9f4f11b317..54e27ff4c6 100755 --- a/indra/newview/llvopartgroup.cpp +++ b/indra/newview/llvopartgroup.cpp @@ -200,7 +200,7 @@ void LLVOPartGroup::updateSpatialExtents(LLVector4a& newMin, LLVector4a& newMax)  	mDrawable->setPositionGroup(p);  } -void LLVOPartGroup::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time) +void LLVOPartGroup::idleUpdate(LLAgent &agent, const F64 &time)  {  } diff --git a/indra/newview/llvopartgroup.h b/indra/newview/llvopartgroup.h index 724e915d02..a94a2291ed 100755 --- a/indra/newview/llvopartgroup.h +++ b/indra/newview/llvopartgroup.h @@ -63,7 +63,7 @@ public:  	LLVOPartGroup(const LLUUID &id, const LLPCode pcode, LLViewerRegion *regionp);  	/*virtual*/ BOOL    isActive() const; // Whether this object needs to do an idleUpdate. -	void idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time); +	void idleUpdate(LLAgent &agent, const F64 &time);  	virtual F32 getBinRadius();  	virtual void updateSpatialExtents(LLVector4a& newMin, LLVector4a& newMax); diff --git a/indra/newview/llvosky.cpp b/indra/newview/llvosky.cpp index 36793017ed..93f0e50336 100755 --- a/indra/newview/llvosky.cpp +++ b/indra/newview/llvosky.cpp @@ -1052,7 +1052,7 @@ void LLVOSky::calcAtmospherics(void)  	mFadeColor.setAlpha(0);  } -void LLVOSky::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time) +void LLVOSky::idleUpdate(LLAgent &agent, const F64 &time)  {  } diff --git a/indra/newview/llvosky.h b/indra/newview/llvosky.h index 2a150eccb9..ee8e91fb71 100755 --- a/indra/newview/llvosky.h +++ b/indra/newview/llvosky.h @@ -461,7 +461,7 @@ public:  	void cleanupGL();  	void restoreGL(); -	/*virtual*/ void idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time); +	/*virtual*/ void idleUpdate(LLAgent &agent, const F64 &time);  	BOOL updateSky();  	// Graphical stuff for objects - maybe broken out into render class diff --git a/indra/newview/llvotree.cpp b/indra/newview/llvotree.cpp index cd12cd9552..6a89100bf5 100755 --- a/indra/newview/llvotree.cpp +++ b/indra/newview/llvotree.cpp @@ -339,7 +339,7 @@ U32 LLVOTree::processUpdateMessage(LLMessageSystem *mesgsys,  	return retval;  } -void LLVOTree::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time) +void LLVOTree::idleUpdate(LLAgent &agent, const F64 &time)  {   	if (mDead || !(gPipeline.hasRenderType(LLPipeline::RENDER_TYPE_TREE)))  	{ diff --git a/indra/newview/llvotree.h b/indra/newview/llvotree.h index 2ecb0303a1..6137ae412d 100755 --- a/indra/newview/llvotree.h +++ b/indra/newview/llvotree.h @@ -59,7 +59,7 @@ public:  											void **user_data,  											U32 block_num, const EObjectUpdateType update_type,  											LLDataPacker *dp); -	/*virtual*/ void idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time); +	/*virtual*/ void idleUpdate(LLAgent &agent, const F64 &time);  	// Graphical stuff for objects - maybe broken out into render class later?  	/*virtual*/ void render(LLAgent &agent); diff --git a/indra/newview/llvowater.cpp b/indra/newview/llvowater.cpp index e8a1c3d1d6..21595ee0bc 100755 --- a/indra/newview/llvowater.cpp +++ b/indra/newview/llvowater.cpp @@ -100,7 +100,7 @@ void LLVOWater::updateTextures()  }  // Never gets called -void  LLVOWater::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time) +void  LLVOWater::idleUpdate(LLAgent &agent, const F64 &time)  {  } diff --git a/indra/newview/llvowater.h b/indra/newview/llvowater.h index cf9323ef2e..7a8d819215 100755 --- a/indra/newview/llvowater.h +++ b/indra/newview/llvowater.h @@ -58,7 +58,7 @@ public:  	static void initClass();  	static void cleanupClass(); -	/*virtual*/ void idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time); +	/*virtual*/ void idleUpdate(LLAgent &agent, const F64 &time);  	/*virtual*/ LLDrawable* createDrawable(LLPipeline *pipeline);  	/*virtual*/ BOOL        updateGeometry(LLDrawable *drawable);  	/*virtual*/ void		updateSpatialExtents(LLVector4a& newMin, LLVector4a& newMax); diff --git a/indra/newview/llvowlsky.cpp b/indra/newview/llvowlsky.cpp index 4e26587184..e7435b6860 100755 --- a/indra/newview/llvowlsky.cpp +++ b/indra/newview/llvowlsky.cpp @@ -92,7 +92,7 @@ void LLVOWLSky::initSunDirection(LLVector3 const & sun_direction,  {  } -void LLVOWLSky::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time) +void LLVOWLSky::idleUpdate(LLAgent &agent, const F64 &time)  {  } diff --git a/indra/newview/llvowlsky.h b/indra/newview/llvowlsky.h index 729dced15e..1d419b5fea 100755 --- a/indra/newview/llvowlsky.h +++ b/indra/newview/llvowlsky.h @@ -53,7 +53,7 @@ public:  	void initSunDirection(LLVector3 const & sun_direction,  		LLVector3 const & sun_angular_velocity); -	/*virtual*/ void		 idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time); +	/*virtual*/ void		 idleUpdate(LLAgent &agent, const F64 &time);  	/*virtual*/ BOOL		 isActive(void) const;  	/*virtual*/ LLDrawable * createDrawable(LLPipeline *pipeline);  	/*virtual*/ BOOL		 updateGeometry(LLDrawable *drawable); diff --git a/indra/newview/llwebsharing.cpp b/indra/newview/llwebsharing.cpp deleted file mode 100755 index 3a80051b9b..0000000000 --- a/indra/newview/llwebsharing.cpp +++ /dev/null @@ -1,603 +0,0 @@ -/**  - * @file llwebsharing.cpp - * @author Aimee - * @brief Web Snapshot Sharing - * - * $LicenseInfo:firstyear=2010&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2010, Linden Research, Inc. - *  - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; - * version 2.1 of the License only. - *  - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU - * Lesser General Public License for more details. - *  - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA - *  - * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA - * $/LicenseInfo$ - */ - -#include "llviewerprecompiledheaders.h" - -#include "llwebsharing.h" - -#include "llagentui.h" -#include "llbufferstream.h" -#include "llhttpclient.h" -#include "llhttpstatuscodes.h" -#include "llsdserialize.h" -#include "llsdutil.h" -#include "llurl.h" -#include "llviewercontrol.h" - -#include <boost/regex.hpp> -#include <boost/algorithm/string/replace.hpp> - - - -/////////////////////////////////////////////////////////////////////////////// -// -class LLWebSharingConfigResponder : public LLHTTPClient::Responder -{ -	LOG_CLASS(LLWebSharingConfigResponder); -public: -	/// Overrides the default LLSD parsing behaviour, to allow parsing a JSON response. -	virtual void completedRaw(U32 status, const std::string& reason, -							  const LLChannelDescriptors& channels, -							  const LLIOPipe::buffer_ptr_t& buffer) -	{ -		LLSD content; -		LLBufferStream istr(channels, buffer.get()); -		LLPointer<LLSDParser> parser = new LLSDNotationParser(); - -		if (parser->parse(istr, content, LLSDSerialize::SIZE_UNLIMITED) == LLSDParser::PARSE_FAILURE) -		{ -			LL_WARNS("WebSharing") << "Failed to deserialize LLSD from JSON response. " << " [" << status << "]: " << reason << LL_ENDL; -		} -		else -		{ -			completed(status, reason, content); -		} -	} - -	virtual void errorWithContent(U32 status, const std::string& reason, const LLSD& content) -	{ -		LL_WARNS("WebSharing") << "Error [status:" << status << "]: " << content << LL_ENDL; -	} - -	virtual void result(const LLSD& content) -	{ -		LLWebSharing::instance().receiveConfig(content); -	} -}; - - - -/////////////////////////////////////////////////////////////////////////////// -// -class LLWebSharingOpenIDAuthResponder : public LLHTTPClient::Responder -{ -	LOG_CLASS(LLWebSharingOpenIDAuthResponder); -public: -	/* virtual */ void completedHeader(U32 status, const std::string& reason, const LLSD& content) -	{ -		completed(status, reason, content); -	} - -	/* virtual */ void completedRaw(U32 status, const std::string& reason, -									const LLChannelDescriptors& channels, -									const LLIOPipe::buffer_ptr_t& buffer) -	{ -		/// Left empty to override the default LLSD parsing behaviour. -	} - -	virtual void errorWithContent(U32 status, const std::string& reason, const LLSD& content) -	{ -		if (HTTP_UNAUTHORIZED == status) -		{ -			LL_WARNS("WebSharing") << "AU account not authenticated." << LL_ENDL; -			// *TODO: No account found on AU, so start the account creation process here. -		} -		else -		{ -			LL_WARNS("WebSharing") << "Error [status:" << status << "]: " << content << LL_ENDL; -			LLWebSharing::instance().retryOpenIDAuth(); -		} - -	} - -	virtual void result(const LLSD& content) -	{ -		if (content.has("set-cookie")) -		{ -			// OpenID request succeeded and returned a session cookie. -			LLWebSharing::instance().receiveSessionCookie(content["set-cookie"].asString()); -		} -	} -}; - - - -/////////////////////////////////////////////////////////////////////////////// -// -class LLWebSharingSecurityTokenResponder : public LLHTTPClient::Responder -{ -	LOG_CLASS(LLWebSharingSecurityTokenResponder); -public: -	/// Overrides the default LLSD parsing behaviour, to allow parsing a JSON response. -	virtual void completedRaw(U32 status, const std::string& reason, -							  const LLChannelDescriptors& channels, -							  const LLIOPipe::buffer_ptr_t& buffer) -	{ -		LLSD content; -		LLBufferStream istr(channels, buffer.get()); -		LLPointer<LLSDParser> parser = new LLSDNotationParser(); - -		if (parser->parse(istr, content, LLSDSerialize::SIZE_UNLIMITED) == LLSDParser::PARSE_FAILURE) -		{ -			LL_WARNS("WebSharing") << "Failed to deserialize LLSD from JSON response. " << " [" << status << "]: " << reason << LL_ENDL; -			LLWebSharing::instance().retryOpenIDAuth(); -		} -		else -		{ -			completed(status, reason, content); -		} -	} - -	virtual void errorWithContent(U32 status, const std::string& reason, const LLSD& content) -	{ -		LL_WARNS("WebSharing") << "Error [status:" << status << "]: " << content << LL_ENDL; -		LLWebSharing::instance().retryOpenIDAuth(); -	} - -	virtual void result(const LLSD& content) -	{ -		if (content[0].has("st") && content[0].has("expires")) -		{ -			const std::string& token   = content[0]["st"].asString(); -			const std::string& expires = content[0]["expires"].asString(); -			if (LLWebSharing::instance().receiveSecurityToken(token, expires)) -			{ -				// Sucessfully received a valid security token. -				return; -			} -		} -		else -		{ -			LL_WARNS("WebSharing") << "No security token received." << LL_ENDL; -		} - -		LLWebSharing::instance().retryOpenIDAuth(); -	} -}; - - - -/////////////////////////////////////////////////////////////////////////////// -// -class LLWebSharingUploadResponder : public LLHTTPClient::Responder -{ -	LOG_CLASS(LLWebSharingUploadResponder); -public: -	/// Overrides the default LLSD parsing behaviour, to allow parsing a JSON response. -	virtual void completedRaw(U32 status, const std::string& reason, -							  const LLChannelDescriptors& channels, -							  const LLIOPipe::buffer_ptr_t& buffer) -	{ -/* -		 // Dump the body, for debugging. - -		 LLBufferStream istr1(channels, buffer.get()); -		 std::ostringstream ostr; -		 std::string body; - -		 while (istr1.good()) -		 { -			char buf[1024]; -			istr1.read(buf, sizeof(buf)); -			body.append(buf, istr1.gcount()); -		 } -		 LL_DEBUGS("WebSharing") << body << LL_ENDL; -*/ -		LLSD content; -		LLBufferStream istr(channels, buffer.get()); -		LLPointer<LLSDParser> parser = new LLSDNotationParser(); - -		if (parser->parse(istr, content, LLSDSerialize::SIZE_UNLIMITED) == LLSDParser::PARSE_FAILURE) -		{ -			LL_WARNS("WebSharing") << "Failed to deserialize LLSD from JSON response. " << " [" << status << "]: " << reason << LL_ENDL; -		} -		else -		{ -			completed(status, reason, content); -		} -	} - -	virtual void errorWithContent(U32 status, const std::string& reason, const LLSD& content) -	{ -		LL_WARNS("WebSharing") << "Error [status:" << status << "]: " << content << LL_ENDL; -	} - -	virtual void result(const LLSD& content) -	{ -		if (content[0].has("result") && content[0].has("id") && -			content[0]["id"].asString() == "newMediaItem") -		{ -			// *TODO: Upload successful, continue from here to post metadata and create AU activity. -		} -		else -		{ -			LL_WARNS("WebSharing") << "Error [" << content[0]["code"].asString() -								   << "]: " << content[0]["message"].asString() << LL_ENDL; -		} -	} -}; - - - -/////////////////////////////////////////////////////////////////////////////// -// -LLWebSharing::LLWebSharing() -:	mConfig(), -	mSecurityToken(LLSD::emptyMap()), -	mEnabled(false), -	mRetries(0), -	mImage(NULL), -	mMetadata(LLSD::emptyMap()) -{ -} - -void LLWebSharing::init() -{ -	if (!mEnabled) -	{ -		sendConfigRequest(); -	} -} - -bool LLWebSharing::shareSnapshot(LLImageJPEG* snapshot, LLSD& metadata) -{ -	LL_INFOS("WebSharing") << metadata << LL_ENDL; - -	if (mImage) -	{ -		// *TODO: Handle this possibility properly, queue them up? -		LL_WARNS("WebSharing") << "Snapshot upload already in progress." << LL_ENDL; -		return false; -	} - -	mImage = snapshot; -	mMetadata = metadata; - -	// *TODO: Check whether we have a valid security token already and re-use it. -	sendOpenIDAuthRequest(); -	return true; -} - -bool LLWebSharing::setOpenIDCookie(const std::string& cookie) -{ -	LL_DEBUGS("WebSharing") << "Setting OpenID cookie " << cookie << LL_ENDL; -	mOpenIDCookie = cookie; -	return validateConfig(); -} - -bool LLWebSharing::receiveConfig(const LLSD& config) -{ -	LL_DEBUGS("WebSharing") << "Received config data: " << config << LL_ENDL; -	mConfig = config; -	return validateConfig(); -} - -bool LLWebSharing::receiveSessionCookie(const std::string& cookie) -{ -	LL_DEBUGS("WebSharing") << "Received AU session cookie: " << cookie << LL_ENDL; -	mSessionCookie = cookie; - -	// Fetch a security token using the new session cookie. -	LLWebSharing::instance().sendSecurityTokenRequest(); - -	return (!mSessionCookie.empty()); -} - -bool LLWebSharing::receiveSecurityToken(const std::string& token, const std::string& expires) -{ -	mSecurityToken["st"] = token; -	mSecurityToken["expires"] = LLDate(expires); - -	if (!securityTokenIsValid(mSecurityToken)) -	{ -		LL_WARNS("WebSharing") << "Invalid security token received: \"" << token << "\" Expires: " << expires << LL_ENDL; -		return false; -	} - -	LL_DEBUGS("WebSharing") << "Received security token: \"" << token << "\" Expires: " << expires << LL_ENDL; -	mRetries = 0; - -	// Continue the upload process now that we have a security token. -	sendUploadRequest(); - -	return true; -} - -void LLWebSharing::sendConfigRequest() -{ -	std::string config_url = gSavedSettings.getString("SnapshotConfigURL"); -	LL_DEBUGS("WebSharing") << "Requesting Snapshot Sharing config data from: " << config_url << LL_ENDL; - -	LLSD headers = LLSD::emptyMap(); -	headers["Accept"] = "application/json"; - -	LLHTTPClient::get(config_url, new LLWebSharingConfigResponder(), headers); -} - -void LLWebSharing::sendOpenIDAuthRequest() -{ -	std::string auth_url = mConfig["openIdAuthUrl"]; -	LL_DEBUGS("WebSharing") << "Starting OpenID Auth: " << auth_url << LL_ENDL; - -	LLSD headers = LLSD::emptyMap(); -	headers["Cookie"] = mOpenIDCookie; -	headers["Accept"] = "*/*"; - -	// Send request, successful login will trigger fetching a security token. -	LLHTTPClient::get(auth_url, new LLWebSharingOpenIDAuthResponder(), headers); -} - -bool LLWebSharing::retryOpenIDAuth() -{ -	if (mRetries++ >= MAX_AUTH_RETRIES) -	{ -		LL_WARNS("WebSharing") << "Exceeded maximum number of authorization attempts, aborting." << LL_ENDL; -		mRetries = 0; -		return false; -	} - -	LL_WARNS("WebSharing") << "Authorization failed, retrying (" << mRetries << "/" << MAX_AUTH_RETRIES << ")" << LL_ENDL; -	sendOpenIDAuthRequest(); -	return true; -} - -void LLWebSharing::sendSecurityTokenRequest() -{ -	std::string token_url = mConfig["securityTokenUrl"]; -	LL_DEBUGS("WebSharing") << "Fetching security token from: " << token_url << LL_ENDL; - -	LLSD headers = LLSD::emptyMap(); -	headers["Cookie"] = mSessionCookie; - -	headers["Accept"] = "application/json"; -	headers["Content-Type"] = "application/json"; - -	std::ostringstream body; -	body << "{ \"gadgets\": [{ \"url\":\"" -		 << mConfig["gadgetSpecUrl"].asString() -		 << "\" }] }"; - -	// postRaw() takes ownership of the buffer and releases it later. -	size_t size = body.str().size(); -	U8 *data = new U8[size]; -	memcpy(data, body.str().data(), size); - -	// Send request, receiving a valid token will trigger snapshot upload. -	LLHTTPClient::postRaw(token_url, data, size, new LLWebSharingSecurityTokenResponder(), headers); -} - -void LLWebSharing::sendUploadRequest() -{ -	LLUriTemplate upload_template(mConfig["openSocialRpcUrlTemplate"].asString()); -	std::string upload_url(upload_template.buildURI(mSecurityToken)); - -	LL_DEBUGS("WebSharing") << "Posting upload to: " << upload_url << LL_ENDL; - -	static const std::string BOUNDARY("------------abcdef012345xyZ"); - -	LLSD headers = LLSD::emptyMap(); -	headers["Cookie"] = mSessionCookie; - -	headers["Accept"] = "application/json"; -	headers["Content-Type"] = "multipart/form-data; boundary=" + BOUNDARY; - -	std::ostringstream body; -	body << "--" << BOUNDARY << "\r\n" -		 << "Content-Disposition: form-data; name=\"request\"\r\n\r\n" -		 << "[{" -		 <<	  "\"method\":\"mediaItems.create\"," -		 <<	  "\"params\": {" -		 <<	    "\"userId\":[\"@me\"]," -		 <<	    "\"groupId\":\"@self\"," -		 <<	    "\"mediaItem\": {" -		 <<	      "\"mimeType\":\"image/jpeg\"," -		 <<	      "\"type\":\"image\"," -		 <<       "\"url\":\"@field:image1\"" -		 <<	    "}" -		 <<	  "}," -		 <<	  "\"id\":\"newMediaItem\"" -		 <<	"}]" -		 <<	"--" << BOUNDARY << "\r\n" -		 <<	"Content-Disposition: form-data; name=\"image1\"\r\n\r\n"; - -	// Insert the image data. -	// *FIX: Treating this as a string will probably screw it up ... -	U8* image_data = mImage->getData(); -	for (S32 i = 0; i < mImage->getDataSize(); ++i) -	{ -		body << image_data[i]; -	} - -	body <<	"\r\n--" << BOUNDARY << "--\r\n"; - -	// postRaw() takes ownership of the buffer and releases it later. -	size_t size = body.str().size(); -	U8 *data = new U8[size]; -	memcpy(data, body.str().data(), size); - -	// Send request, successful upload will trigger posting metadata. -	LLHTTPClient::postRaw(upload_url, data, size, new LLWebSharingUploadResponder(), headers); -} - -bool LLWebSharing::validateConfig() -{ -	// Check the OpenID Cookie has been set. -	if (mOpenIDCookie.empty()) -	{ -		mEnabled = false; -		return mEnabled; -	} - -	if (!mConfig.isMap()) -	{ -		mEnabled = false; -		return mEnabled; -	} - -	// Template to match the received config against. -	LLSD required(LLSD::emptyMap()); -	required["gadgetSpecUrl"] = ""; -	required["loginTokenUrl"] = ""; -	required["openIdAuthUrl"] = ""; -	required["photoPageUrlTemplate"] = ""; -	required["openSocialRpcUrlTemplate"] = ""; -	required["securityTokenUrl"] = ""; -	required["tokenBasedLoginUrlTemplate"] = ""; -	required["viewerIdUrl"] = ""; - -	std::string mismatch(llsd_matches(required, mConfig)); -	if (!mismatch.empty()) -	{ -		LL_WARNS("WebSharing") << "Malformed config data response: " << mismatch << LL_ENDL; -		mEnabled = false; -		return mEnabled; -	} - -	mEnabled = true; -	return mEnabled; -} - -// static -bool LLWebSharing::securityTokenIsValid(LLSD& token) -{ -	return (token.has("st") && -			token.has("expires") && -			(token["st"].asString() != "") && -			(token["expires"].asDate() > LLDate::now())); -} - - - -/////////////////////////////////////////////////////////////////////////////// -// -LLUriTemplate::LLUriTemplate(const std::string& uri_template) -	: -	mTemplate(uri_template) -{ -} - -std::string LLUriTemplate::buildURI(const LLSD& vars) -{ -	// *TODO: Separate parsing the template from building the URI. -	// Parsing only needs to happen on construction/assignnment. - -	static const std::string VAR_NAME_REGEX("[[:alpha:]][[:alnum:]\\._-]*"); -	// Capture var name with and without surrounding {} -	static const std::string VAR_REGEX("\\{(" + VAR_NAME_REGEX + ")\\}"); -	// Capture delimiter and comma separated list of var names. -	static const std::string JOIN_REGEX("\\{-join\\|(&)\\|(" + VAR_NAME_REGEX + "(?:," + VAR_NAME_REGEX + ")*)\\}"); - -	std::string uri = mTemplate; -	boost::smatch results; - -	// Validate and expand join operators : {-join|&|var1,var2,...} - -	boost::regex join_regex(JOIN_REGEX); - -	while (boost::regex_search(uri, results, join_regex)) -	{ -		// Extract the list of var names from the results. -		std::string delim = results[1].str(); -		std::string var_list = results[2].str(); - -		// Expand the list of vars into a query string with their values -		std::string query = expandJoin(delim, var_list, vars); - -		// Substitute the query string into the template. -		uri = boost::regex_replace(uri, join_regex, query, boost::format_first_only); -	} - -	// Expand vars : {var1} - -	boost::regex var_regex(VAR_REGEX); - -	std::set<std::string> var_names; -	std::string::const_iterator start = uri.begin(); -	std::string::const_iterator end = uri.end(); - -	// Extract the var names used. -	while (boost::regex_search(start, end, results, var_regex)) -	{ -		var_names.insert(results[1].str()); -		start = results[0].second; -	} - -	// Replace each var with its value. -	for (std::set<std::string>::const_iterator it = var_names.begin(); it != var_names.end(); ++it) -	{ -		std::string var = *it; -		if (vars.has(var)) -		{ -			boost::replace_all(uri, "{" + var + "}", vars[var].asString()); -		} -	} - -	return uri; -} - -std::string LLUriTemplate::expandJoin(const std::string& delim, const std::string& var_list, const LLSD& vars) -{ -	std::ostringstream query; - -	typedef boost::tokenizer<boost::char_separator<char> > tokenizer; -	boost::char_separator<char> sep(","); -	tokenizer var_names(var_list, sep); -	tokenizer::const_iterator it = var_names.begin(); - -	// First var does not need a delimiter -	if (it != var_names.end()) -	{ -		const std::string& name = *it; -		if (vars.has(name)) -		{ -			// URL encode the value before appending the name=value pair. -			query << name << "=" << escapeURL(vars[name].asString()); -		} -	} - -	for (++it; it != var_names.end(); ++it) -	{ -		const std::string& name = *it; -		if (vars.has(name)) -		{ -			// URL encode the value before appending the name=value pair. -			query << delim << name << "=" << escapeURL(vars[name].asString()); -		} -	} - -	return query.str(); -} - -// static -std::string LLUriTemplate::escapeURL(const std::string& unescaped) -{ -	char* escaped = curl_escape(unescaped.c_str(), unescaped.size()); -	std::string result = escaped; -	curl_free(escaped); -	return result; -} - diff --git a/indra/newview/llwebsharing.h b/indra/newview/llwebsharing.h deleted file mode 100755 index ad9c99c224..0000000000 --- a/indra/newview/llwebsharing.h +++ /dev/null @@ -1,224 +0,0 @@ -/**  - * @file llwebsharing.h - * @author Aimee - * @brief Web Snapshot Sharing - * - * $LicenseInfo:firstyear=2010&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2010, Linden Research, Inc. - *  - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; - * version 2.1 of the License only. - *  - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU - * Lesser General Public License for more details. - *  - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA - *  - * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA - * $/LicenseInfo$ - */ - -#ifndef LL_LLWEBSHARING_H -#define LL_LLWEBSHARING_H - -#include "llimagejpeg.h" -#include "llsingleton.h" - - - -/** - * @class LLWebSharing - * - * Manages authentication to, and interaction with, a web service allowing the - * upload of snapshot images taken within the viewer, using OpenID and the - * OpenSocial APIs. - * http://www.opensocial.org/Technical-Resources/opensocial-spec-v09/RPC-Protocol.html - */ -class LLWebSharing : public LLSingleton<LLWebSharing> -{ -	LOG_CLASS(LLWebSharing); -public: -	/* -	 * Performs initial setup, by requesting config data from the web service if -	 * it has not already been received. -	 */ -	void init(); - -	/* -	 * @return true if both the OpenID cookie and config data have been received. -	 */ -	bool enabled() const { return mEnabled; }; - -	/* -	 * Sets the OpenID cookie to use for login to the web service. -	 * -	 * @param cookie a string containing the OpenID cookie. -	 * -	 * @return true if both the OpenID cookie and config data have been received. -	 */ -	bool setOpenIDCookie(const std::string& cookie); - -	/* -	 * Receive config data used to connect to the web service. -	 * -	 * @param config an LLSD map of URL templates for the web service end-points. -	 * -	 * @return true if both the OpenID cookie and config data have been received. -	 * -	 * @see sendConfigRequest() -	 */ -	bool receiveConfig(const LLSD& config); - -	/* -	 * Receive the session cookie from the web service, which is the result of -	 * the OpenID login process. -	 * -	 * @see sendOpenIDAuthRequest() -	 */ -	bool receiveSessionCookie(const std::string& cookie); - -	/* -	 * Receive a security token for the upload service. -	 * -	 * @see sendSecurityTokenRequest() -	 */ -	bool receiveSecurityToken(const std::string& token, const std::string& expires); - -	/* -	 * Restarts the authentication process if the maximum number of retries has -	 * not been exceeded. -	 * -	 * @return true if retrying, false if LLWebSharing::MAX_AUTH_RETRIES has been exceeded. -	 */ -	bool retryOpenIDAuth(); - -	/* -	 * Post a snapshot to the upload service. -	 * -	 * @return true if accepted for upload, false if already uploading another image. -	 */ -	bool shareSnapshot(LLImageJPEG* snapshot, LLSD& metadata); - -private: -	static const S32 MAX_AUTH_RETRIES = 4; - -	friend class LLSingleton<LLWebSharing>; - -	LLWebSharing(); -	~LLWebSharing() {}; - -	/* -	 * Request a map of URLs and URL templates to the web service end-points. -	 * -	 * @see receiveConfig() -	 */ -	void sendConfigRequest(); - -	/* -	 * Initiate the OpenID login process. -	 * -	 * @see receiveSessionCookie() -	 */ -	void sendOpenIDAuthRequest(); - -	/* -	 * Request a security token for the upload service. -	 * -	 * @see receiveSecurityToken() -	 */ -	void sendSecurityTokenRequest(); - -	/* -	 * Request a security token for the upload service. -	 * -	 * @see receiveSecurityToken() -	 */ -	void sendUploadRequest(); - -	/* -	 * Checks all necessary config information has been received, and sets mEnabled. -	 * -	 * @return true if both the OpenID cookie and config data have been received. -	 */ -	bool validateConfig(); - -	/* -	 * Checks the security token is present and has not expired. -	 * -	 * @param token an LLSD map containing the token string and the time it expires. -	 * -	 * @return true if the token is not empty and has not expired. -	 */ -	static bool securityTokenIsValid(LLSD& token); - -	std::string mOpenIDCookie; -	std::string mSessionCookie; -	LLSD mSecurityToken; - -	LLSD mConfig; -	bool mEnabled; - -	LLPointer<LLImageJPEG> mImage; -	LLSD mMetadata; - -	S32 mRetries; -}; - -/** - * @class LLUriTemplate - * - * @brief Builds complete URIs, given URI template and a map of keys and values - *        to use for substition. - *        Note: This is only a partial implementation of a draft standard required - *        by the web API used by LLWebSharing. - *        See: http://tools.ietf.org/html/draft-gregorio-uritemplate-03 - * - * @see LLWebSharing - */ -class LLUriTemplate -{ -	LOG_CLASS(LLUriTemplate); -public: -	LLUriTemplate(const std::string& uri_template); -	~LLUriTemplate() {}; - -	/* -	 * Builds a complete URI from the template. -	 * -	 * @param vars an LLSD map of keys and values for substitution. -	 * -	 * @return a string containing the complete URI. -	 */ -	std::string buildURI(const LLSD& vars); - -private: -	/* -	 * Builds a URL query string. -	 * -	 * @param delim    a string containing the separator to use between name=value pairs. -	 * @param var_list a string containing a comma separated list of variable names. -	 * @param vars     an LLSD map of keys and values for substitution. -	 * -	 * @return a URL query string. -	 */ -	std::string expandJoin(const std::string& delim, const std::string& var_list, const LLSD& vars); - -	/* -	 * URL escape the given string. -	 * LLWeb::escapeURL() only does a partial escape, so this uses curl_escape() instead. -	 */ -	static std::string escapeURL(const std::string& unescaped); - -	std::string mTemplate; -}; - - - -#endif // LL_LLWEBSHARING_H diff --git a/indra/newview/llworldmapview.cpp b/indra/newview/llworldmapview.cpp index ae334d4bd2..786e4f2de6 100755 --- a/indra/newview/llworldmapview.cpp +++ b/indra/newview/llworldmapview.cpp @@ -1595,14 +1595,6 @@ void LLWorldMapView::handleClick(S32 x, S32 y, MASK mask,  } -BOOL outside_slop(S32 x, S32 y, S32 start_x, S32 start_y) -{ -	S32 dx = x - start_x; -	S32 dy = y - start_y; - -	return (dx <= -2 || 2 <= dx || dy <= -2 || 2 <= dy); -} -  BOOL LLWorldMapView::handleMouseDown( S32 x, S32 y, MASK mask )  {  	gFocusMgr.setMouseCapture( this ); @@ -1685,7 +1677,7 @@ BOOL LLWorldMapView::handleHover( S32 x, S32 y, MASK mask )  {  	if (hasMouseCapture())  	{ -		if (mPanning || outside_slop(x, y, mMouseDownX, mMouseDownY)) +		if (mPanning || llabs(x - mMouseDownX) > 1 || llabs(y - mMouseDownY) > 1)  		{  			// just started panning, so hide cursor  			if (!mPanning) @@ -1702,8 +1694,6 @@ BOOL LLWorldMapView::handleHover( S32 x, S32 y, MASK mask )  			sPanY += delta_y;  			sTargetPanX = sPanX;  			sTargetPanY = sPanY; - -			gViewerWindow->moveCursorToCenter();  		}  		// doesn't matter, cursor should be hidden diff --git a/indra/newview/skins/default/xui/da/strings.xml b/indra/newview/skins/default/xui/da/strings.xml index 11d100eeff..74d160dfae 100755 --- a/indra/newview/skins/default/xui/da/strings.xml +++ b/indra/newview/skins/default/xui/da/strings.xml @@ -1172,7 +1172,8 @@ Prøv venligst om lidt igen.  	<string name="InventoryNoTexture">  		Du har ikke en kopi af denne tekstur i din beholdning  	</string> -	<string name="no_transfer" value=" (ikke overdragbar)"/> +  <string name="Unconstrained">Ikke låst</string> +  <string name="no_transfer" value=" (ikke overdragbar)"/>  	<string name="no_modify" value=" (ikke redigere)"/>  	<string name="no_copy" value=" (ikke kopiere)"/>  	<string name="worn" value=" (båret)"/> diff --git a/indra/newview/skins/default/xui/de/strings.xml b/indra/newview/skins/default/xui/de/strings.xml index 4268b95370..082febd709 100755 --- a/indra/newview/skins/default/xui/de/strings.xml +++ b/indra/newview/skins/default/xui/de/strings.xml @@ -1267,7 +1267,8 @@ Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden.  	<string name="InventoryNoTexture">  		Sie haben keine Kopie dieser Textur in Ihrem Inventar.  	</string> -	<string name="InventoryInboxNoItems"> +  <string name="Unconstrained">keines</string> +  <string name="InventoryInboxNoItems">  		Einkäufe aus dem Marktplatz erscheinen hier. Sie können diese dann zur Verwendung in Ihr Inventar ziehen.  	</string>  	<string name="MarketplaceURL"> diff --git a/indra/newview/skins/default/xui/en/floater_about.xml b/indra/newview/skins/default/xui/en/floater_about.xml index 703015af20..9668cfa526 100755 --- a/indra/newview/skins/default/xui/en/floater_about.xml +++ b/indra/newview/skins/default/xui/en/floater_about.xml @@ -9,63 +9,7 @@   save_rect="true"   title="ABOUT [CAPITALIZED_APP_NAME]"   width="470"> -  <floater.string -     name="AboutHeader"> -[APP_NAME] [VIEWER_VERSION_0].[VIEWER_VERSION_1].[VIEWER_VERSION_2] ([VIEWER_VERSION_3]) [BUILD_DATE] [BUILD_TIME] ([CHANNEL]) -[[VIEWER_RELEASE_NOTES_URL] [ReleaseNotes]] - -</floater.string> -  <floater.string -     name="AboutCompiler"> -Built with [COMPILER] version [COMPILER_VERSION] - -</floater.string> -  <floater.string -     name="AboutPosition"> -You are at [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1] in [REGION] located at <nolink>[HOSTNAME]</nolink> ([HOSTIP]) -SLURL: <nolink>[SLURL]</nolink> -(global coordinates [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1]) -[SERVER_VERSION] -[SERVER_RELEASE_NOTES_URL] - -</floater.string> -  <!-- *NOTE: Do not translate text like GPU, Graphics Card, etc - -       Most PC users who know what these mean will be used to the English versions, -       and this info sometimes gets sent to support. --> -  <floater.string -     name="AboutSystem"> -CPU: [CPU] -Memory: [MEMORY_MB] MB -OS Version: [OS_VERSION] -Graphics Card Vendor: [GRAPHICS_CARD_VENDOR] -Graphics Card: [GRAPHICS_CARD] -</floater.string> -  <floater.string -     name="AboutDriver"> -Windows Graphics Driver Version: [GRAPHICS_DRIVER_VERSION] -</floater.string> -  <floater.string -     name="AboutLibs"> -OpenGL Version: [OPENGL_VERSION] - -libcurl Version: [LIBCURL_VERSION] -J2C Decoder Version: [J2C_VERSION] -Audio Driver Version: [AUDIO_DRIVER_VERSION] -Qt Webkit Version: [QT_WEBKIT_VERSION] -Voice Server Version: [VOICE_VERSION] -</floater.string> -  <floater.string -     name="none"> -      (none) -  </floater.string> -  <floater.string -     name="AboutTraffic"> -Packets Lost: [PACKETS_LOST,number,0]/[PACKETS_IN,number,0] ([PACKETS_PCT,number,1]%) -</floater.string> -<floater.string -     name="ErrorFetchingServerReleaseNotesURL"> -Error fetching server release notes URL. -</floater.string> +      <tab_container      follows="all"       top="25" diff --git a/indra/newview/skins/default/xui/en/floater_preview_texture.xml b/indra/newview/skins/default/xui/en/floater_preview_texture.xml index 137e278ddc..e1e7e1c8c8 100755 --- a/indra/newview/skins/default/xui/en/floater_preview_texture.xml +++ b/indra/newview/skins/default/xui/en/floater_preview_texture.xml @@ -79,30 +79,6 @@       width="108"       name="combo_aspect_ratio"       tool_tip="Preview at a fixed aspect ratio"> -    	<combo_item name="Unconstrained" value="Unconstrained"> -    		Unconstrained -    	</combo_item> -   	<combo_item name="1:1" value="1:1" tool_tip="Group insignia or Real World profile"> -		1:1 -	</combo_item> -	<combo_item name="4:3" value="4:3" tool_tip="[SECOND_LIFE] profile"> -		4:3 -	</combo_item> -	<combo_item name="10:7" value="10:7" tool_tip="Classifieds and search listings, landmarks"> -		10:7 -	</combo_item> -	<combo_item name="3:2" value="3:2" tool_tip="About land"> -		3:2 -	</combo_item> -	<combo_item name="16:10" value="16:10"> -		16:10 -	</combo_item> -	<combo_item name="16:9" value="16:9" tool_tip="Profile picks"> -		16:9 -	</combo_item> -	<combo_item name="2:1" value="2:1"> -		2:1 -	</combo_item>  	</combo_box>      <button       follows="right|bottom" diff --git a/indra/newview/skins/default/xui/en/floater_region_debug_console.xml b/indra/newview/skins/default/xui/en/floater_region_debug_console.xml index 7c7ee2df4c..99b812a880 100755 --- a/indra/newview/skins/default/xui/en/floater_region_debug_console.xml +++ b/indra/newview/skins/default/xui/en/floater_region_debug_console.xml @@ -10,33 +10,34 @@    width="600"    default_tab_group="1">    <text_editor -  left="10" -   type="string" -   length="1" -   follows="left|right|bottom" -   font="Monospace" -   height="366" -   width="576" -   ignore_tab="false" -   layout="topleft" -   max_length="65536" -   name="region_debug_console_output" -   show_line_numbers="false"  -   word_wrap="true" -   track_end="true" -   read_only="true"> +    left="10" +    type="string" +    length="1" +    follows="all" +    font="Monospace" +    height="366" +    width="576" +    ignore_tab="false" +    layout="topleft" +    max_length="65536" +    name="region_debug_console_output" +    show_line_numbers="false"  +    word_wrap="true" +    track_end="true" +    read_only="true">    </text_editor>    <line_editor -   border_style="line" -   border_thickness="1" -   tab_group="1"  -   follows="left|top|right" -   font="SansSerif" -   height="19" -   layout="topleft" -   bottom_delta="20" -   max_length="127" -   name="region_debug_console_input" -   top_delta="0" -   width="576" /> +    border_style="line" +    border_thickness="1" +    tab_group="1" +    follows="left|right|bottom" +    font="SansSerif" +    height="19" +    layout="topleft" +    bottom_delta="20" +    max_length="127" +    name="region_debug_console_input" +    top_delta="0" +    width="576"> +  </line_editor>  </floater> diff --git a/indra/newview/skins/default/xui/en/menu_avatar_icon.xml b/indra/newview/skins/default/xui/en/menu_avatar_icon.xml index 77b9095f7c..410caa7290 100755 --- a/indra/newview/skins/default/xui/en/menu_avatar_icon.xml +++ b/indra/newview/skins/default/xui/en/menu_avatar_icon.xml @@ -31,6 +31,12 @@          <on_click function="AvatarIcon.Action" parameter="teleport"/>      </menu_item_call>      <menu_item_call +     label="Request Teleport" +     layout="topleft" +     name="Request Teleport"> +        <on_click function="AvatarIcon.Action" parameter="request_teleport"/>       +    </menu_item_call> +    <menu_item_call       label="Voice call"       layout="topleft"       name="Voice Call"> diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml index e5e2bd4c11..2aa6206a13 100755 --- a/indra/newview/skins/default/xui/en/menu_viewer.xml +++ b/indra/newview/skins/default/xui/en/menu_viewer.xml @@ -1381,8 +1381,7 @@               label="Report Bug"               name="Report Bug">                  <menu_item_call.on_click -                 function="ShowHelp" -                 parameter="report_bug" /> +                 function="Advanced.ReportBug"/>              </menu_item_call>          <menu_item_separator/> @@ -2397,6 +2396,12 @@              <menu_item_call.on_click               function="Advanced.ClickRenderProfile" />            </menu_item_call> +            <menu_item_call +             label="Benchmark" +             name="Benchmark"> +              <menu_item_call.on_click +               function="Advanced.ClickRenderBenchmark" /> +          </menu_item_call>          </menu>        <menu          create_jump_keys="true" @@ -3121,18 +3126,6 @@                  <menu_item_call.on_click                   function="Advanced.PrintAgentInfo" />              </menu_item_call> -            <menu_item_check -             label="Region Debug Console" -             name="Region Debug Console" -             shortcut="control|shift|`" -             use_mac_ctrl="true"> -                <menu_item_check.on_check -                 function="Floater.Visible" -                 parameter="region_debug_console" /> -                <menu_item_check.on_click -                 function="Floater.Toggle" -                 parameter="region_debug_console" /> -            </menu_item_check>              <menu_item_separator />              <menu_item_check diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index 35f2e7b31e..0ffce9380e 100755 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -4758,6 +4758,14 @@ Problems adding a new estate manager.  One or more estates may have a full manag    <notification     icon="alertmodal.tga" +   name="ProblemAddingEstateBanManager" +   type="alertmodal"> +Unable to add estate owner or manager to ban list. +    <tag>fail</tag> +  </notification> + +  <notification +   icon="alertmodal.tga"     name="ProblemAddingEstateGeneric"     type="alertmodal">  Problems adding to this estate list.  One or more estates may have a full list. @@ -7626,7 +7634,7 @@ Are you sure you want to share the following items:  With the following Residents: -[RESIDENTS] +<nolink>[RESIDENTS]</nolink>    <tag>confirm</tag>  	<usetemplate       name="okcancelbuttons" @@ -7646,7 +7654,7 @@ Are you sure you want to share the following items:  With the following Residents: -[RESIDENTS] +<nolink>[RESIDENTS]</nolink>    <tag>confirm</tag>  	<usetemplate       name="okcancelbuttons" @@ -9293,8 +9301,17 @@ Object uses too many physics resources -- its dynamics have been disabled.    <notification     icon="alertmodal.tga" +   name="EstateManagerFailedllTeleportHome" +   persist="false" +   type="notify"> +    <tag>fail</tag> +The object '[OBJECT_NAME]' at [OBJECT_POS] cannot teleport estate managers home. +  </notification> + +  <notification +   icon="alertmodal.tga"     name="TeleportedHomeByObjectOnParcel" -   persist="true" +   persist="false"     type="notify">     <tag>fail</tag>  You have been teleported home by the object '[OBJECT_NAME]' on the parcel '[PARCEL_NAME]' @@ -9303,7 +9320,7 @@ You have been teleported home by the object '[OBJECT_NAME]' on the parcel '[PARC    <notification     icon="alertmodal.tga"     name="TeleportedHomeByObject" -   persist="true" +   persist="false"     type="notify">     <tag>fail</tag>  You have been teleported home by the object '[OBJECT_NAME]' @@ -9747,15 +9764,7 @@ Only the first 10 selected objects have been disabled. Refresh and make addition     type="notify">     <tag>fail</tag>  You need to update your viewer to buy this parcel. -  </notification> - -  <notification -   icon="alertmodal.tga" -   name="LandBuyAccessBlocked" -   type="notify"> -   <tag>fail</tag> -You can't buy this land due to your maturity Rating. You may need to validate your age and/or install the latest Viewer. Please go to the Knowledge Base for details on accessing areas with this maturity Rating. -  </notification> +  </notification>      <notification     icon="alertmodal.tga" @@ -9818,7 +9827,9 @@ Not enough leased parcels in selection to join.     name="CantDivideLandMultipleParcelsSelected"     type="notify">     <tag>fail</tag> -Can't divide land.\nThere is more than one parcel selected.\nTry selecting a smaller piece of land. +Can't divide land. +There is more than one parcel selected. +Try selecting a smaller piece of land.    </notification>    <notification @@ -9826,7 +9837,9 @@ Can't divide land.\nThere is more than one parcel selected.\nTry selecting a sma     name="CantDivideLandCantFindParcel"     type="notify">     <tag>fail</tag> -Can't divide land.\nCan't find the parcel.\nPlease report with Help -> Reprt Bug... +Can't divide land. +Can't find the parcel. +Please report with Help -> Report Bug...    </notification>    <notification @@ -9834,7 +9847,8 @@ Can't divide land.\nCan't find the parcel.\nPlease report with Help -> Reprt Bug     name="CantDivideLandWholeParcelSelected"     type="notify">     <tag>fail</tag> -Can't divide land. Whole parcel is selected.\nTry selecting a smaller piece of land. +Can't divide land. Whole parcel is selected. +Try selecting a smaller piece of land.    </notification>    <notification @@ -10210,4 +10224,14 @@ Cannot create large prims that intersect other players.  Please re-try when othe       yestext="OK"/>    </notification> +  <notification +   icon="alert.tga" +   name="ChatHistoryIsBusyAlert" +   type="alertmodal"> +   Chat history file is busy with previous operation. Please try again in a few minutes or choose chat with another person. +    <usetemplate +     name="okbutton" +     yestext="OK"/> +  </notification> +    </notifications> diff --git a/indra/newview/skins/default/xui/en/panel_region_debug.xml b/indra/newview/skins/default/xui/en/panel_region_debug.xml index 81b2281adb..fea5f1b19f 100755 --- a/indra/newview/skins/default/xui/en/panel_region_debug.xml +++ b/indra/newview/skins/default/xui/en/panel_region_debug.xml @@ -201,4 +201,14 @@       tool_tip="Cancel region restart"       top_delta="0"       width="150" /> +    <button +     follows="left|top" +     height="20" +     label="Region Debug Console" +     layout="topleft" +     left="10" +     name="region_debug_console_btn" +     tool_tip="Open Region Debug Console" +     top_pad="5" +     width="150" />  </panel> diff --git a/indra/newview/skins/default/xui/en/panel_region_general.xml b/indra/newview/skins/default/xui/en/panel_region_general.xml index 44c84e69a1..489d286e67 100755 --- a/indra/newview/skins/default/xui/en/panel_region_general.xml +++ b/indra/newview/skins/default/xui/en/panel_region_general.xml @@ -94,11 +94,20 @@       width="80" />      <check_box       height="20" +     label="Block Parcel Fly Over" +     layout="topleft" +     left="10" +     name="block_fly_over_check" +     tool_tip="Extend access checks upwards to prevent flying over a parcel" +     top="110" +     width="90" /> +  <check_box +     height="20"       label="Allow Damage"       layout="topleft"       left="10"       name="allow_damage_check" -     top="110" +     top="130"       width="80" />      <check_box       height="20" @@ -106,7 +115,7 @@       layout="topleft"       left="10"       name="restrict_pushobject" -     top="130" +     top="150"       width="80" />      <check_box       height="20" @@ -114,7 +123,7 @@       layout="topleft"       left="10"       name="allow_land_resell_check" -     top="150" +     top="170"       width="80" />      <check_box       height="20" @@ -122,7 +131,7 @@       layout="topleft"       left="10"       name="allow_parcel_changes_check" -     top="170" +     top="190"       width="80" />      <check_box       height="20" @@ -131,7 +140,7 @@       left="10"       name="block_parcel_search_check"       tool_tip="Let people see this region and its parcels in search results" -     top="190" +     top="210"       width="80" />  	<spinner       decimal_digits="0" @@ -145,7 +154,7 @@       max_val="100"       min_val="1"       name="agent_limit_spin" -     top="240" +     top="260"       width="170" />      <spinner       follows="left|top" @@ -158,7 +167,7 @@       max_val="10"       min_val="1"       name="object_bonus_spin" -     top="260" +     top="280"       width="170" />      <text       follows="left|top" @@ -167,7 +176,7 @@       layout="topleft"       left="10"       name="access_text" -     top="290" +     top="310"       width="100">          Rating:      </text> @@ -224,7 +233,7 @@       layout="topleft"       left="108"       name="apply_btn" -     top="320" +     top="340"       width="100"/>       <button       follows="left|top" diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml index 7e79d297ef..f0ff6d5b88 100755 --- a/indra/newview/skins/default/xui/en/strings.xml +++ b/indra/newview/skins/default/xui/en/strings.xml @@ -20,6 +20,42 @@  	<string name="StartupInitializingVFS">Initializing VFS...</string>  	<string name="StartupRequireDriverUpdate">Graphics initialization failed. Please update your graphics driver!</string> +	<!-- about dialog/support string--> +	<string name="AboutHeader"> +[APP_NAME] [VIEWER_VERSION_0].[VIEWER_VERSION_1].[VIEWER_VERSION_2] ([VIEWER_VERSION_3]) [BUILD_DATE] [BUILD_TIME] ([CHANNEL]) +[[VIEWER_RELEASE_NOTES_URL] [ReleaseNotes]] +	</string> +	<string name="AboutCompiler">Built with [COMPILER] version [COMPILER_VERSION]</string> +	<string name="AboutPosition"> +You are at [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1] in [REGION] located at <nolink>[HOSTNAME]</nolink> ([HOSTIP]) +SLURL: <nolink>[SLURL]</nolink> +(global coordinates [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1]) +[SERVER_VERSION] +[SERVER_RELEASE_NOTES_URL] +	</string> +	<!-- *NOTE: Do not translate text like GPU, Graphics Card, etc - +       Most PC users who know what these mean will be used to the English versions, +       and this info sometimes gets sent to support. --> +	<string name="AboutSystem"> +CPU: [CPU] +Memory: [MEMORY_MB] MB +OS Version: [OS_VERSION] +Graphics Card Vendor: [GRAPHICS_CARD_VENDOR] +Graphics Card: [GRAPHICS_CARD] +	</string> +	<string name="AboutDriver">Windows Graphics Driver Version: [GRAPHICS_DRIVER_VERSION]</string> +	<string name="AboutLibs"> +OpenGL Version: [OPENGL_VERSION] + +libcurl Version: [LIBCURL_VERSION] +J2C Decoder Version: [J2C_VERSION] +Audio Driver Version: [AUDIO_DRIVER_VERSION] +Qt Webkit Version: [QT_WEBKIT_VERSION] +Voice Server Version: [VOICE_VERSION] +	</string> +	<string name="AboutTraffic">Packets Lost: [PACKETS_LOST,number,0]/[PACKETS_IN,number,0] ([PACKETS_PCT,number,1]%)</string> +	<string name="ErrorFetchingServerReleaseNotesURL">Error fetching server release notes URL.</string> +	  	<!--  progress -->  	<string name="ProgressRestoring">Restoring...</string>  	<string name="ProgressChangingResolution">Changing resolution...</string> @@ -2221,6 +2257,7 @@ Drag folders to this area and click "Send to Marketplace" to list them for sale  	<string name="Marketplace Error Internal Import">Error: There was a problem with this item.  Try again later.</string>  	<string name="Open landmarks">Open landmarks</string> +  <string name="Unconstrained">Unconstrained</string>  	<!-- use value="" because they have preceding spaces -->  	<string name="no_transfer" value=" (no transfer)" /> @@ -2303,8 +2340,7 @@ Drag folders to this area and click "Send to Marketplace" to list them for sale  	<string name="InvFolder Merchant Outbox">Merchant Outbox</string>    <!-- are used for Friends and Friends/All folders in Inventory "Calling cards" folder. See EXT-694--> -	<string name="InvFolder Friends">Friends</string> -	<string name="InvFolder Received Items">Received Items</string> +	<string name="InvFolder Friends">Friends</string>	  	<string name="InvFolder All">All</string>  	<string name="no_attachments">No attachments worn</string> diff --git a/indra/newview/skins/default/xui/es/strings.xml b/indra/newview/skins/default/xui/es/strings.xml index 484511a08b..2b91c542ad 100755 --- a/indra/newview/skins/default/xui/es/strings.xml +++ b/indra/newview/skins/default/xui/es/strings.xml @@ -1252,7 +1252,8 @@ Intenta iniciar sesión de nuevo en unos instantes.  	<string name="InventoryInboxNoItems">  		Aquí aparecerán algunos de los objetos que recibas, como los regalos Premium. Después puedes arrastrarlos a tu inventario.  	</string> -	<string name="MarketplaceURL"> +  <string name="Unconstrained">Sin restricciones</string> +  <string name="MarketplaceURL">  		https://marketplace.[MARKETPLACE_DOMAIN_NAME]/  	</string>  	<string name="MarketplaceURL_CreateStore"> diff --git a/indra/newview/skins/default/xui/fr/strings.xml b/indra/newview/skins/default/xui/fr/strings.xml index 78d846ff4f..b8721420cb 100755 --- a/indra/newview/skins/default/xui/fr/strings.xml +++ b/indra/newview/skins/default/xui/fr/strings.xml @@ -1270,7 +1270,8 @@ Veuillez réessayer de vous connecter dans une minute.  	<string name="InventoryInboxNoItems">  		Les achats que vous avez effectués sur la Place du marché s'affichent ici. Vous pouvez alors les faire glisser vers votre inventaire afin de les utiliser.  	</string> -	<string name="MarketplaceURL"> +  <string name="Unconstrained">Sans contraintes</string> +  <string name="MarketplaceURL">  		https://marketplace.[MARKETPLACE_DOMAIN_NAME]/  	</string>  	<string name="MarketplaceURL_CreateStore"> diff --git a/indra/newview/skins/default/xui/it/strings.xml b/indra/newview/skins/default/xui/it/strings.xml index 60ed2b0929..86d7f75b83 100755 --- a/indra/newview/skins/default/xui/it/strings.xml +++ b/indra/newview/skins/default/xui/it/strings.xml @@ -1261,7 +1261,8 @@ Prova ad accedere nuovamente tra un minuto.  	<string name="InventoryInboxNoItems">  		Gli acquissti dal mercato verranno mostrati qui. Potrai quindi trascinarli nel tuo inventario per usarli.  	</string> -	<string name="MarketplaceURL"> +  <string name="Unconstrained">Libero</string> +  <string name="MarketplaceURL">  		https://marketplace.[MARKETPLACE_DOMAIN_NAME]/  	</string>  	<string name="MarketplaceURL_CreateStore"> diff --git a/indra/newview/skins/default/xui/ja/strings.xml b/indra/newview/skins/default/xui/ja/strings.xml index a0f45e5a55..36966d6825 100755 --- a/indra/newview/skins/default/xui/ja/strings.xml +++ b/indra/newview/skins/default/xui/ja/strings.xml @@ -1270,7 +1270,8 @@ support@secondlife.com にお問い合わせください。  	<string name="InventoryInboxNoItems">  		マーケットプレイスで購入した商品はここに表示されます。その後、アイテムをインベントリにドラッグすれば、それらのアイテムを使用できます。  	</string> -	<string name="MarketplaceURL"> +  <string name="Unconstrained">非拘束</string> +  <string name="MarketplaceURL">  		https://marketplace.[MARKETPLACE_DOMAIN_NAME]/  	</string>  	<string name="MarketplaceURL_CreateStore"> diff --git a/indra/newview/skins/default/xui/pl/strings.xml b/indra/newview/skins/default/xui/pl/strings.xml index f6dec8536b..f86e393646 100755 --- a/indra/newview/skins/default/xui/pl/strings.xml +++ b/indra/newview/skins/default/xui/pl/strings.xml @@ -1035,6 +1035,7 @@  	<string name="InventoryNoTexture">  		Nie posiadasz kopii tej tekstury w Twojej Szafie.  	</string> +  <string name="Unconstrained">Swobodny</string>  	<string name="no_transfer" value=" (brak oddawania)"/>  	<string name="no_modify" value=" (brak modyfikowania)"/>  	<string name="no_copy" value=" (brak kopiowania)"/> diff --git a/indra/newview/skins/default/xui/pt/strings.xml b/indra/newview/skins/default/xui/pt/strings.xml index 2eb4c0a02e..8436452228 100755 --- a/indra/newview/skins/default/xui/pt/strings.xml +++ b/indra/newview/skins/default/xui/pt/strings.xml @@ -1216,7 +1216,8 @@ Pessoas com contas gratuitas não poderão acessar o Second Life no momento para  	<string name="InventoryInboxNoItems">  		Suas compras do Marketplace aparecerão aqui. Depois, você poderá arrastá-las para seu inventário para usá-las.  	</string> -	<string name="MarketplaceURL"> +  <string name="Unconstrained">Sem limites</string> +  <string name="MarketplaceURL">  		https://marketplace.[MARKETPLACE_DOMAIN_NAME]/  	</string>  	<string name="MarketplaceURL_CreateStore"> diff --git a/indra/newview/skins/default/xui/ru/strings.xml b/indra/newview/skins/default/xui/ru/strings.xml index 0f71edcee0..8faf834f8f 100755 --- a/indra/newview/skins/default/xui/ru/strings.xml +++ b/indra/newview/skins/default/xui/ru/strings.xml @@ -1267,7 +1267,8 @@ support@secondlife.com.  	<string name="InventoryInboxNoItems">  		Здесь будут показаны ваши покупки из торгового центра. Их можно будет перетащить в ваш инвентарь для использования.  	</string> -	<string name="MarketplaceURL"> +  <string name="Unconstrained">Без ограничения</string> +  <string name="MarketplaceURL">  		https://marketplace.[MARKETPLACE_DOMAIN_NAME]/  	</string>  	<string name="MarketplaceURL_CreateStore"> diff --git a/indra/newview/skins/default/xui/tr/strings.xml b/indra/newview/skins/default/xui/tr/strings.xml index c4b1530b2b..31c5d2d310 100755 --- a/indra/newview/skins/default/xui/tr/strings.xml +++ b/indra/newview/skins/default/xui/tr/strings.xml @@ -1267,7 +1267,8 @@ Lütfen bir dakika içerisinde tekrar oturum açmayı deneyin.  	<string name="InventoryInboxNoItems">  		Pazaryerinda satın aldıklarınız burada görünecektir. Bunları kullanmak için envanterinize sürükleyebilirsiniz.  	</string> -	<string name="MarketplaceURL"> +  <string name="Unconstrained">Kısıtsız</string> +  <string name="MarketplaceURL">  		https://marketplace.[MARKETPLACE_DOMAIN_NAME]/  	</string>  	<string name="MarketplaceURL_CreateStore"> | 
