diff options
74 files changed, 1354 insertions, 1040 deletions
@@ -497,3 +497,4 @@ bcc2770e21c125e0bab59141c51db9145aec068d 3.7.17-release  bc61801f614022c920cb5c3df1d7d67a9561ce1f 3.7.22-release  3be800e1afad9615442159e388d6d137be7b951e 3.7.23-release  d3d0101e980ec95043e0af9b7903045d3bc447e4 3.7.24-release +9978a8c3a2ffce4a5e1c186256581c2ac139c9dc 3.7.25-release diff --git a/autobuild.xml b/autobuild.xml index c123abf9cf..e74825f945 100755 --- a/autobuild.xml +++ b/autobuild.xml @@ -2203,6 +2203,60 @@          <key>version</key>          <string>2008.11.30</string>        </map> +      <key>uriparser</key> +      <map> +        <key>copyright</key> +        <string>Copyright (C) 2007, Weijia Song <songweijia@gmail.com>, Sebastian Pipping <webmaster@hartwork.org></string> +        <key>description</key> +        <string>uriparser is a strictly RFC 3986 compliant URI parsing and handling library written in C. uriparser is cross-platform, fast, supports Unicode and is licensed under the New BSD license.</string> +        <key>license</key> +        <string>New BSD license</string> +        <key>license_file</key> +        <string>LICENSES/uriparser.txt</string> +        <key>name</key> +        <string>uriparser</string> +        <key>platforms</key> +        <map> +          <key>darwin</key> +          <map> +            <key>archive</key> +            <map> +              <key>hash</key> +              <string>22608adaf54e8ddc9182a719ba6e2b32</string> +              <key>url</key> +              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/uriparser_3p-update-uriparser/rev/299435/arch/Darwin/installer/uriparser-0.8.0.1-darwin-299435.tar.bz2</string> +            </map> +            <key>name</key> +            <string>darwin</string> +          </map> +          <key>linux</key> +          <map> +            <key>archive</key> +            <map> +              <key>hash</key> +              <string>dddfc8dea540801f93ba0382cb1e3685</string> +              <key>url</key> +              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/uriparser_3p-update-uriparser/rev/299435/arch/Linux/installer/uriparser-0.8.0.1-linux-299435.tar.bz2</string> +            </map> +            <key>name</key> +            <string>linux</string> +          </map> +          <key>windows</key> +          <map> +            <key>archive</key> +            <map> +              <key>hash</key> +              <string>e4520158dda88453e46942eab6f9c0a8</string> +              <key>url</key> +              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/uriparser_3p-update-uriparser/rev/299435/arch/CYGWIN/installer/uriparser-0.8.0.1-windows-299435.tar.bz2</string> +            </map> +            <key>name</key> +            <string>windows</string> +          </map> +        </map> +        <key>version</key> +        <string>0.8.0.1</string> +      </map>        <key>xmlrpc-epi</key>        <map>          <key>copyright</key> diff --git a/doc/contributions.txt b/doc/contributions.txt index 7e1e6fdbf2..55b5070242 100755 --- a/doc/contributions.txt +++ b/doc/contributions.txt @@ -359,6 +359,7 @@ Decro Schmooz  Denim Kamachi  DiJodi Dubratt  Dil Spitz +	MAINT-4455  Dimitrio Lewis  Dirk  Draconis Neurocam @@ -1232,6 +1233,7 @@ Sovereign Engineer      STORM-1972      OPEN-195      OPEN-217 +    OPEN-295  SpacedOut Frye  	VWR-34  	VWR-45 @@ -1273,6 +1275,7 @@ TankMaster Finesmith  	OPEN-140  	OPEN-142  	OPEN-154 +	OPEN-295  	STORM-1100  	STORM-1258  	STORM-1602 diff --git a/indra/cmake/CMakeLists.txt b/indra/cmake/CMakeLists.txt index 5bf3bbc61d..2f09f3742f 100755 --- a/indra/cmake/CMakeLists.txt +++ b/indra/cmake/CMakeLists.txt @@ -37,6 +37,7 @@ set(cmake_SOURCE_FILES      FindNDOF.cmake      FindOpenJPEG.cmake      FindSCP.cmake +    FindURIPARSER.cmake      FindXmlRpcEpi.cmake      FindZLIB.cmake      FMODEX.cmake @@ -96,6 +97,7 @@ set(cmake_SOURCE_FILES      Tut.cmake      UI.cmake      UnixInstall.cmake +    URIPARSER.cmake      Variables.cmake      ViewerMiscLibs.cmake      VisualLeakDetector.cmake diff --git a/indra/cmake/FindURIPARSER.cmake b/indra/cmake/FindURIPARSER.cmake new file mode 100644 index 0000000000..8ab9f0f4ed --- /dev/null +++ b/indra/cmake/FindURIPARSER.cmake @@ -0,0 +1,46 @@ +# -*- cmake -*- + +# - Find uriparser +# Find the URIPARSER includes and library +# This module defines +#  URIPARSER_INCLUDE_DIRS, where to find uriparser.h, etc. +#  URIPARSER_LIBRARIES, the libraries needed to use uriparser. +#  URIPARSER_FOUND, If false, do not try to use uriparser. +# +# This FindURIPARSER is about 43 times as fast the one provided with cmake (2.8.x), +# because it doesn't look up the version of uriparser, resulting in a dramatic +# speed up for configure (from 4 minutes 22 seconds to 6 seconds). +# +# Note: Since this file is only used for standalone, the windows +# specific parts were left out. + +FIND_PATH(URIPARSER_INCLUDE_DIR uriparser/uri.h +  NO_SYSTEM_ENVIRONMENT_PATH +  ) + +FIND_LIBRARY(URIPARSER_LIBRARY uriparser) + +if (URIPARSER_LIBRARY AND URIPARSER_INCLUDE_DIR) +  SET(URIPARSER_INCLUDE_DIRS ${URIPARSER_INCLUDE_DIR}) +  SET(URIPARSER_LIBRARIES ${URIPARSER_LIBRARY}) +  SET(URIPARSER_FOUND "YES") +else (URIPARSER_LIBRARY AND URIPARSER_INCLUDE_DIR) +  SET(URIPARSER_FOUND "NO") +endif (URIPARSER_LIBRARY AND URIPARSER_INCLUDE_DIR) + +if (URIPARSER_FOUND) +  if (NOT URIPARSER_FIND_QUIETLY) +    message(STATUS "Found URIPARSER: ${URIPARSER_LIBRARIES}") +    SET(URIPARSER_FIND_QUIETLY TRUE) +  endif (NOT URIPARSER_FIND_QUIETLY) +else (URIPARSER_FOUND) +  if (URIPARSER_FIND_REQUIRED) +    message(FATAL_ERROR "Could not find URIPARSER library") +  endif (URIPARSER_FIND_REQUIRED) +endif (URIPARSER_FOUND) + +mark_as_advanced( +  URIPARSER_LIBRARY +  URIPARSER_INCLUDE_DIR +  ) + diff --git a/indra/cmake/URIPARSER.cmake b/indra/cmake/URIPARSER.cmake new file mode 100644 index 0000000000..de146885a0 --- /dev/null +++ b/indra/cmake/URIPARSER.cmake @@ -0,0 +1,35 @@ +# -*- cmake -*- + +set(URIPARSER_FIND_QUIETLY ON) +set(URIPARSER_FIND_REQUIRED ON) + +include(Prebuilt) + +if (USESYSTEMLIBS) +  include(FindURIPARSER) +else (USESYSTEMLIBS) +  use_prebuilt_binary(uriparser) +  if (WINDOWS) +    set(URIPARSER_LIBRARIES +      debug uriparserd +      optimized uriparser) +  elseif (LINUX) +    # +    # When we have updated static libraries in competition with older +    # shared libraries and we want the former to win, we need to do some +    # extra work.  The *_PRELOAD_ARCHIVES settings are invoked early +    # and will pull in the entire archive to the binary giving it. +    # priority in symbol resolution.  Beware of cmake moving the +    # achive load itself to another place on the link command line.  If +    # that happens, you can try something like -Wl,-luriparser here to hide +    # the archive.  Also be aware that the linker will not tolerate a +    # second whole-archive load of the archive.  See viewer's +    # CMakeLists.txt for more information. +    # +    set(URIPARSER_PRELOAD_ARCHIVES -Wl,--whole-archive uriparser -Wl,--no-whole-archive) +    set(URIPARSER_LIBRARIES uriparser) +  elseif (DARWIN) +    set(URIPARSER_LIBRARIES uriparser) +  endif (WINDOWS) +  set(URIPARSER_INCLUDE_DIRS ${LIBS_PREBUILT_DIR}/include/uriparser) +endif (USESYSTEMLIBS) diff --git a/indra/llcommon/CMakeLists.txt b/indra/llcommon/CMakeLists.txt index 63d25225c9..1459b9ada2 100755 --- a/indra/llcommon/CMakeLists.txt +++ b/indra/llcommon/CMakeLists.txt @@ -12,12 +12,14 @@ include(GoogleBreakpad)  include(GooglePerfTools)  include(Copy3rdPartyLibs)  include(ZLIB) +include(URIPARSER)  include_directories(      ${EXPAT_INCLUDE_DIRS}      ${LLCOMMON_INCLUDE_DIRS}      ${ZLIB_INCLUDE_DIRS}      ${BREAKPAD_INCLUDE_DIRECTORIES} +    ${URIPARSER_INCLUDE_DIRS}      )  # add_executable(lltreeiterators lltreeiterators.cpp) @@ -103,6 +105,7 @@ set(llcommon_SOURCE_FILES      lltracerecording.cpp      lltracethreadrecorder.cpp      lluri.cpp +    lluriparser.cpp      lluuid.cpp      llworkerthread.cpp      timing.cpp @@ -217,6 +220,7 @@ set(llcommon_HEADER_FILES      llunits.h      llunittype.h      lluri.h +    lluriparser.h      lluuid.h      llwin32headers.h      llwin32headerslean.h @@ -261,6 +265,7 @@ target_link_libraries(      ${BOOST_PROGRAM_OPTIONS_LIBRARY}      ${BOOST_REGEX_LIBRARY}      ${GOOGLE_PERFTOOLS_LIBRARIES} +    ${URIPARSER_LIBRARIES}      )  if (DARWIN) diff --git a/indra/llcommon/lluriparser.cpp b/indra/llcommon/lluriparser.cpp new file mode 100644 index 0000000000..ef4481d32f --- /dev/null +++ b/indra/llcommon/lluriparser.cpp @@ -0,0 +1,228 @@ +/**  + * @file lluriparser.cpp + * @author Protey + * @date 2014-10-07 + * @brief Implementation of the LLUriParser class. + * + * $LicenseInfo:firstyear=2014&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2014, 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 "linden_common.h" +#include "lluriparser.h" + +LLUriParser::LLUriParser(const std::string& u) : mTmpScheme(false), mRes(0) +{ +	mState.uri = &mUri; + +	if (u.find("://") == std::string::npos) +	{ +		mNormalizedUri = "http://"; +		mTmpScheme = true; +	} + +	mNormalizedUri += u.c_str(); + +	mRes = parse(); +} + +LLUriParser::~LLUriParser() +{ +	uriFreeUriMembersA(&mUri); +} + +S32 LLUriParser::parse() +{ +	mRes = uriParseUriA(&mState, mNormalizedUri.c_str()); +	return mRes; +} + +const char * LLUriParser::scheme() const +{ +	return mScheme.c_str(); +} + +void LLUriParser::sheme(const std::string& s) +{ +	mTmpScheme = !s.size(); +	mScheme = s; +} + +const char * LLUriParser::port() const +{ +	return mPort.c_str(); +} + +void LLUriParser::port(const std::string& s) +{ +	mPort = s; +} + +const char * LLUriParser::host() const +{ +	return mHost.c_str(); +} + +void LLUriParser::host(const std::string& s) +{ +	mHost = s; +} + +const char * LLUriParser::path() const +{ +	return mPath.c_str(); +} + +void LLUriParser::path(const std::string& s) +{ +	mPath = s; +} + +const char * LLUriParser::query() const +{ +	return mQuery.c_str(); +} + +void LLUriParser::query(const std::string& s) +{ +	mQuery = s; +} + +const char * LLUriParser::fragment() const +{ +	return mFragment.c_str(); +} + +void LLUriParser::fragment(const std::string& s) +{ +	mFragment = s; +} + +void LLUriParser::textRangeToString(UriTextRangeA& textRange, std::string& str) +{ +	S32 len = textRange.afterLast - textRange.first; +	if (len) +	{ +		str = textRange.first; +		str = str.substr(0, len); +	} +} + +void LLUriParser::extractParts() +{ +	if (mTmpScheme) +	{ +		mScheme.clear(); +	} +	else +	{ +		textRangeToString(mUri.scheme, mScheme); +	} +	 +	textRangeToString(mUri.hostText, mHost); +	textRangeToString(mUri.portText, mPort); +	textRangeToString(mUri.query, mQuery); +	textRangeToString(mUri.fragment, mFragment); + +	UriPathSegmentA * pathHead = mUri.pathHead; +	while (pathHead) +	{ +		std::string partOfPath; +		textRangeToString(pathHead->text, partOfPath); + +		mPath += '/'; +		mPath += partOfPath; + +		pathHead = pathHead->next; +	} +} + +S32 LLUriParser::normalize() +{ +	if (!mRes) +	{ +		mRes = uriNormalizeSyntaxExA(&mUri, URI_NORMALIZE_SCHEME | URI_NORMALIZE_HOST); + +		if (!mRes) +		{ +			S32 chars_required; +			mRes = uriToStringCharsRequiredA(&mUri, &chars_required); + +			if (!mRes) +			{ +				chars_required++; +				std::vector<char> label_buf(chars_required); +				mRes = uriToStringA(&label_buf[0], &mUri, chars_required, NULL); + +				if (!mRes) +				{ +					mNormalizedUri = &label_buf[mTmpScheme ? 7 : 0]; +				} +			} +		} +	} + +	return mRes; +} + +void LLUriParser::glue(std::string& uri) const +{ +	if (mScheme.size()) +	{ +		uri = mScheme; +		uri += "://"; +	} + +	uri += mHost; + +	if (mPort.size()) +	{ +		uri += ':'; +		uri += mPort; +	} + +	uri += mPath; + +	if (mQuery.size()) +	{ +		uri += '?'; +		uri += mQuery; + +		if (mFragment.size()) +		{ +			uri += '#'; +			uri += mFragment; +		} +	} +} + +bool LLUriParser::test() const +{ +	std::string uri; +	glue(uri); + +	return uri == mNormalizedUri; +} + +const char * LLUriParser::normalizedUri() const +{ +	return mNormalizedUri.c_str(); +} diff --git a/indra/llcommon/lluriparser.h b/indra/llcommon/lluriparser.h new file mode 100644 index 0000000000..719f916837 --- /dev/null +++ b/indra/llcommon/lluriparser.h @@ -0,0 +1,84 @@ +/**  + * @file lluriparser.h + * @author Protey + * @date 20146-10-07 + * @brief Declaration of the UriParser class. + * + * $LicenseInfo:firstyear=2014&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2014, 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_LLURIPARSER_H +#define LL_LLURIPARSER_H + +#include <string> +#include "uriparser/Uri.h" + +class LL_COMMON_API LLUriParser +{ +public: +	LLUriParser(const std::string& u); +	virtual ~LLUriParser(); + +	const char * scheme() const; +	void sheme (const std::string& s); + +	const char * port() const; +	void port (const std::string& s); + +	const char * host() const; +	void host (const std::string& s); + +	const char * path() const; +	void path (const std::string& s); + +	const char * query() const; +	void query (const std::string& s); + +	const char * fragment() const; +	void fragment (const std::string& s); + +	const char * normalizedUri() const; + +	void extractParts(); +	void glue(std::string& uri) const; +	bool test() const; +	S32 normalize(); + +private: +	S32 parse(); +	void textRangeToString(UriTextRangeA& textRange, std::string& str); +	std::string mScheme; +	std::string mHost; +	std::string mPort; +	std::string mPath; +	std::string mQuery; +	std::string mFragment; +	std::string mNormalizedUri; + +	UriParserStateA mState; +	UriUriA mUri; + +	S32 mRes; +	bool mTmpScheme; +}; + +#endif // LL_LLURIPARSER_H diff --git a/indra/llimage/llimagepng.cpp b/indra/llimage/llimagepng.cpp index 294f68b122..7735dc1379 100755 --- a/indra/llimage/llimagepng.cpp +++ b/indra/llimage/llimagepng.cpp @@ -67,7 +67,7 @@ BOOL LLImagePNG::updateData()  	}  	LLPngWrapper::ImageInfo infop; -	if (! pngWrapper.readPng(getData(), NULL, &infop)) +	if (! pngWrapper.readPng(getData(), getDataSize(), NULL, &infop))  	{  		setLastError(pngWrapper.getErrorMessage());  		return FALSE; @@ -102,7 +102,7 @@ BOOL LLImagePNG::decode(LLImageRaw* raw_image, F32 decode_time)  		return FALSE;  	} -	if (! pngWrapper.readPng(getData(), raw_image)) +	if (! pngWrapper.readPng(getData(), getDataSize(), raw_image))  	{  		setLastError(pngWrapper.getErrorMessage());  		return FALSE; diff --git a/indra/llimage/llpngwrapper.cpp b/indra/llimage/llpngwrapper.cpp index 2cc7d3c460..aad139f570 100755 --- a/indra/llimage/llpngwrapper.cpp +++ b/indra/llimage/llpngwrapper.cpp @@ -87,6 +87,12 @@ void LLPngWrapper::errorHandler(png_structp png_ptr, png_const_charp msg)  void LLPngWrapper::readDataCallback(png_structp png_ptr, png_bytep dest, png_size_t length)  {  	PngDataInfo *dataInfo = (PngDataInfo *) png_get_io_ptr(png_ptr); +	if(dataInfo->mOffset + length > dataInfo->mDataSize) +	{ +		png_error(png_ptr, "Data read error. Requested data size exceeds available data size."); +		return; +	} +  	U8 *src = &dataInfo->mData[dataInfo->mOffset];  	memcpy(dest, src, length);  	dataInfo->mOffset += static_cast<U32>(length); @@ -114,7 +120,7 @@ void LLPngWrapper::writeFlush(png_structp png_ptr)  // The scanline also begins at the bottom of  // the image (per SecondLife conventions) instead of at the top, so we  // must assign row-pointers in "reverse" order. -BOOL LLPngWrapper::readPng(U8* src, LLImageRaw* rawImage, ImageInfo *infop) +BOOL LLPngWrapper::readPng(U8* src, S32 dataSize, LLImageRaw* rawImage, ImageInfo *infop)  {  	try  	{ @@ -133,6 +139,7 @@ BOOL LLPngWrapper::readPng(U8* src, LLImageRaw* rawImage, ImageInfo *infop)  		PngDataInfo dataPtr;  		dataPtr.mData = src;  		dataPtr.mOffset = 0; +		dataPtr.mDataSize = dataSize;  		png_set_read_fn(mReadPngPtr, &dataPtr, &readDataCallback);  		png_set_sig_bytes(mReadPngPtr, 0); diff --git a/indra/llimage/llpngwrapper.h b/indra/llimage/llpngwrapper.h index 739f435996..27d7df3bef 100755 --- a/indra/llimage/llpngwrapper.h +++ b/indra/llimage/llpngwrapper.h @@ -44,7 +44,7 @@ public:  	};  	BOOL isValidPng(U8* src); -	BOOL readPng(U8* src, LLImageRaw* rawImage, ImageInfo *infop = NULL); +	BOOL readPng(U8* src, S32 dataSize, LLImageRaw* rawImage, ImageInfo *infop = NULL);  	BOOL writePng(const LLImageRaw* rawImage, U8* dst);  	U32  getFinalSize();  	const std::string& getErrorMessage(); @@ -61,6 +61,7 @@ private:  	{  		U8 *mData;  		U32 mOffset; +		S32 mDataSize;  	};  	static void writeFlush(png_structp png_ptr); diff --git a/indra/llui/llcombobox.cpp b/indra/llui/llcombobox.cpp index 56be52f69a..b32aea5ffa 100755 --- a/indra/llui/llcombobox.cpp +++ b/indra/llui/llcombobox.cpp @@ -788,6 +788,11 @@ BOOL LLComboBox::handleKeyHere(KEY key, MASK mask)  		// since the dropdown button eats the key  		if (key == KEY_RETURN)  		{ +			if (mask == MASK_NONE) +			{ +				mOnReturnSignal(this, getValue()); +			} +  			// don't show list and don't eat key input when committing  			// free-form text entry with RETURN since user already knows              // what they are trying to select diff --git a/indra/llui/llcombobox.h b/indra/llui/llcombobox.h index 67393504e7..c9b1212b70 100755 --- a/indra/llui/llcombobox.h +++ b/indra/llui/llcombobox.h @@ -199,6 +199,11 @@ public:  	void			setTextEntryCallback( commit_callback_t cb ) { mTextEntryCallback = cb; }  	void			setTextChangedCallback( commit_callback_t cb ) { mTextChangedCallback = cb; } +	/** +	* Connects callback to signal called when Return key is pressed. +	*/ +	boost::signals2::connection setReturnCallback( const commit_signal_t::slot_type& cb ) { return mOnReturnSignal.connect(cb); } +  	void			setButtonVisible(BOOL visible);  	void			onButtonMouseDown(); @@ -231,6 +236,7 @@ private:  	commit_callback_t	mTextChangedCallback;  	commit_callback_t	mSelectionCallback;  	boost::signals2::connection mTopLostSignalConnection; +	commit_signal_t		mOnReturnSignal;  	S32                 mLastSelectedIndex;  }; diff --git a/indra/llui/lllineeditor.cpp b/indra/llui/lllineeditor.cpp index ae94a021d1..a08cf91a69 100755 --- a/indra/llui/lllineeditor.cpp +++ b/indra/llui/lllineeditor.cpp @@ -88,6 +88,7 @@ LLLineEditor::Params::Params()  	background_image("background_image"),  	background_image_disabled("background_image_disabled"),  	background_image_focused("background_image_focused"), +	bg_image_always_focused("bg_image_always_focused", false),  	select_on_focus("select_on_focus", false),  	revert_on_esc("revert_on_esc", true),  	spellcheck("spellcheck", false), @@ -147,6 +148,7 @@ LLLineEditor::LLLineEditor(const LLLineEditor::Params& p)  	mBgImage( p.background_image ),  	mBgImageDisabled( p.background_image_disabled ),  	mBgImageFocused( p.background_image_focused ), +	mShowImageFocused( p.bg_image_always_focused ),  	mHaveHistory(FALSE),  	mReplaceNewlinesWithSpaces( TRUE ),  	mLabel(p.label), @@ -1675,7 +1677,7 @@ void LLLineEditor::drawBackground()  	{  		image = mBgImageDisabled;  	} -	else if ( has_focus ) +	else if ( has_focus || mShowImageFocused)  	{  		image = mBgImageFocused;  	} diff --git a/indra/llui/lllineeditor.h b/indra/llui/lllineeditor.h index 40f931ecc1..c6d472f59b 100755 --- a/indra/llui/lllineeditor.h +++ b/indra/llui/lllineeditor.h @@ -90,6 +90,7 @@ public:  										spellcheck,  										commit_on_focus_lost,  										ignore_tab, +										bg_image_always_focused,  										is_password;  		// colors @@ -375,6 +376,8 @@ protected:  	BOOL		mReadOnly; +	BOOL 		mShowImageFocused; +  	LLWString	mPreeditWString;  	LLWString	mPreeditOverwrittenWString;  	std::vector<S32> mPreeditPositions; diff --git a/indra/llui/llmenugl.cpp b/indra/llui/llmenugl.cpp index e5081ee1d5..f290edb5ff 100755 --- a/indra/llui/llmenugl.cpp +++ b/indra/llui/llmenugl.cpp @@ -60,6 +60,7 @@  #include "v2math.h"  #include <set>  #include <boost/tokenizer.hpp> +#include <boost/foreach.hpp>  // static  LLMenuHolderGL *LLMenuGL::sMenuContainer = NULL; @@ -2031,15 +2032,7 @@ void LLMenuGL::arrange( void )  		// torn off menus are not constrained to the size of the screen  		U32 max_width = getTornOff() ? U32_MAX : menu_region_rect.getWidth(); -		U32 max_height = U32_MAX; -		if (!getTornOff()) -		{ -			max_height = getRect().mTop - menu_region_rect.mBottom; -			if (menu_region_rect.mTop - getRect().mTop > (S32)max_height) -			{ -				max_height = menu_region_rect.mTop - getRect().mTop; -			} -		} +		U32 max_height = getTornOff() ? U32_MAX: menu_region_rect.getHeight();  		// *FIX: create the item first and then ask for its dimensions?  		S32 spillover_item_width = PLAIN_PAD_PIXELS + LLFontGL::getFontSansSerif()->getWidth( std::string("More") ); // *TODO: Translate @@ -2097,13 +2090,15 @@ void LLMenuGL::arrange( void )  		}  		else  		{ +			BOOST_FOREACH(LLMenuItemGL* itemp, mItems) +			{ +				// do first so LLMenuGLItemCall can call on_visible to determine if visible +				itemp->buildDrawLabel(); +			}  			item_list_t::iterator item_iter;  			for (item_iter = mItems.begin(); item_iter != mItems.end(); ++item_iter)  			{ -				// do first so LLMenuGLItemCall can call on_visible to determine if visible -				(*item_iter)->buildDrawLabel(); -		  				if ((*item_iter)->getVisible())  				{  					if (!getTornOff()  @@ -2111,34 +2106,43 @@ void LLMenuGL::arrange( void )  						&& *item_iter != mSpilloverBranch  						&& height + (*item_iter)->getNominalHeight() > max_height - spillover_item_height)  					{ -						// no room for any more items -						createSpilloverBranch(); - -						std::vector<LLMenuItemGL*> items_to_remove; -						std::copy(item_iter, mItems.end(), std::back_inserter(items_to_remove)); -						std::vector<LLMenuItemGL*>::iterator spillover_iter; -						for (spillover_iter= items_to_remove.begin(); spillover_iter != items_to_remove.end(); ++spillover_iter) +						// don't show only one item +						int visible_items = 0; +						item_list_t::iterator count_iter; +						for (count_iter = item_iter; count_iter != mItems.end(); ++count_iter)  						{ -							LLMenuItemGL* itemp = (*spillover_iter); -							removeChild(itemp); -							mSpilloverMenu->addChild(itemp); +							if((*count_iter)->getVisible()) +								visible_items++;  						} +						if (visible_items>1) +						{ +							// no room for any more items +							createSpilloverBranch(); +							std::vector<LLMenuItemGL*> items_to_remove; +							std::copy(item_iter, mItems.end(), std::back_inserter(items_to_remove)); +							std::vector<LLMenuItemGL*>::iterator spillover_iter; +							for (spillover_iter= items_to_remove.begin(); spillover_iter != items_to_remove.end(); ++spillover_iter) +							{ +								LLMenuItemGL* itemp = (*spillover_iter); +								removeChild(itemp); +								mSpilloverMenu->addChild(itemp); +							} -						addChild(mSpilloverBranch); -						height += mSpilloverBranch->getNominalHeight(); -						width = llmax( width, mSpilloverBranch->getNominalWidth() ); +							addChild(mSpilloverBranch); -						break; -					} -					else -					{ -						// track our rect -						height += (*item_iter)->getNominalHeight(); -						width = llmax( width, (*item_iter)->getNominalWidth() ); +							height += mSpilloverBranch->getNominalHeight(); +							width = llmax( width, mSpilloverBranch->getNominalWidth() ); + +							break; +						}  					} +					// track our rect +					height += (*item_iter)->getNominalHeight(); +					width = llmax( width, (*item_iter)->getNominalWidth() ); +  					if (mScrollable)  					{  						// Determining visible items boundaries @@ -2362,7 +2366,9 @@ void LLMenuGL::createSpilloverBranch()  		branch_params.label = label;  		branch_params.branch = mSpilloverMenu;  		branch_params.font.style = "italic"; - +		branch_params.highlight_bg_color=LLUIColorTable::instance().getColor("MenuItemHighlightBgColor"); +		branch_params.highlight_fg_color=LLUIColorTable::instance().getColor("MenuItemHighlightFgColor"); +		branch_params.enabled_color=LLUIColorTable::instance().getColor("MenuItemEnabledColor");  		mSpilloverBranch = LLUICtrlFactory::create<LLMenuItemBranchGL>(branch_params);  	} diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp index 367bc9a084..43e048d216 100755 --- a/indra/llui/lltextbase.cpp +++ b/indra/llui/lltextbase.cpp @@ -38,6 +38,7 @@  #include "lltextutil.h"  #include "lltooltip.h"  #include "lluictrl.h" +#include "lluriparser.h"  #include "llurlaction.h"  #include "llurlregistry.h"  #include "llview.h" @@ -2019,6 +2020,8 @@ static LLUIImagePtr image_from_icon_name(const std::string& icon_name)  static LLTrace::BlockTimerStatHandle FTM_PARSE_HTML("Parse HTML"); + +  void LLTextBase::appendTextImpl(const std::string &new_text, const LLStyle::Params& input_params)  {  	LLStyle::Params style_params(input_params); @@ -2055,7 +2058,12 @@ void LLTextBase::appendTextImpl(const std::string &new_text, const LLStyle::Para  				std::string subtext=text.substr(0,start);  				appendAndHighlightText(subtext, part, style_params);   			} + +			// add icon before url if need +			LLTextUtil::processUrlMatch(&match, this, isContentTrusted() || match.isTrusted()); +  			// output the styled Url +			//appendAndHighlightTextImpl(label, part, link_params, match.underlineOnHoverOnly());  			appendAndHighlightTextImpl(match.getLabel(), part, link_params, match.underlineOnHoverOnly());  			// set the tooltip for the Url label @@ -2063,14 +2071,12 @@ void LLTextBase::appendTextImpl(const std::string &new_text, const LLStyle::Para  			{  				segment_set_t::iterator it = getSegIterContaining(getLength()-1);  				if (it != mSegments.end()) -					{ -						LLTextSegmentPtr segment = *it; -						segment->setToolTip(match.getTooltip()); -					} +				{ +					LLTextSegmentPtr segment = *it; +					segment->setToolTip(match.getTooltip()); +				}  			} -			LLTextUtil::processUrlMatch(&match,this,isContentTrusted()); -  			// move on to the rest of the text after the Url  			if (end < (S32)text.length())   			{ diff --git a/indra/llui/lltextbase.h b/indra/llui/lltextbase.h index 738b4d5b8e..dfc10923f3 100755 --- a/indra/llui/lltextbase.h +++ b/indra/llui/lltextbase.h @@ -590,6 +590,7 @@ protected:  	void							appendTextImpl(const std::string &new_text, const LLStyle::Params& input_params = LLStyle::Params());  	void							appendAndHighlightTextImpl(const std::string &new_text, S32 highlight_part, const LLStyle::Params& style_params, bool underline_on_hover_only = false); +	S32 normalizeUri(std::string& uri);  protected: diff --git a/indra/llui/lltextutil.h b/indra/llui/lltextutil.h index 798f14d086..1be81ffd62 100755 --- a/indra/llui/lltextutil.h +++ b/indra/llui/lltextutil.h @@ -64,7 +64,15 @@ namespace LLTextUtil  	 */  	const std::string& formatPhoneNumber(const std::string& phone_str); -	bool processUrlMatch(LLUrlMatch* match,LLTextBase* text_base, bool is_content_trusted); +	/** +	 * Adds icon before url if need. +	 * +	 * @param[in] match an object with results of matching +	 * @param[in] text_base pointer to UI text object +	 * @param[in] is_content_trusted true if context is trusted +	 * @return reference to string with formatted phone number +	 */ +	bool processUrlMatch(LLUrlMatch* match, LLTextBase* text_base, bool is_content_trusted);  	class TextHelpers  	{ diff --git a/indra/llui/llurlentry.cpp b/indra/llui/llurlentry.cpp index c058ad6f7d..7e4104c49b 100755 --- a/indra/llui/llurlentry.cpp +++ b/indra/llui/llurlentry.cpp @@ -31,6 +31,7 @@  #include "lluri.h"  #include "llurlmatch.h"  #include "llurlregistry.h" +#include "lluriparser.h"  #include "llavatarnamecache.h"  #include "llcachename.h" @@ -38,6 +39,8 @@  #include "lluicolortable.h"  #include "message.h" +#include "uriparser/Uri.h" +  #define APP_HEADER_REGEX "((x-grid-location-info://[-\\w\\.]+/app)|(secondlife:///app))"  // Utility functions @@ -342,6 +345,30 @@ std::string LLUrlEntrySLURL::getLocation(const std::string &url) const  }  // +// LLUrlEntrySeconlifeURLs Describes *secondlife.com and *lindenlab.com urls to substitute icon 'hand.png' before link +// +LLUrlEntrySeconlifeURL::LLUrlEntrySeconlifeURL() +{  +	mPattern = boost::regex("\\b(https?://)?([-\\w\\.]*\\.)?(secondlife|lindenlab)\\.com(:\\d{1,5})?(/\\S*)?\\b", +		boost::regex::perl|boost::regex::icase); +	 +	mIcon = "Hand"; +	mMenuName = "menu_url_http.xml"; +} + +std::string LLUrlEntrySeconlifeURL::getLabel(const std::string &url, const LLUrlLabelCallback &cb) +{ +	LLUriParser up(url); +	up.extractParts(); +	return up.host(); +} + +std::string LLUrlEntrySeconlifeURL::getTooltip(const std::string &url) const +{ +	return url; +} + +//  // LLUrlEntryAgent Describes a Second Life agent Url, e.g.,  // secondlife:///app/agent/0e346d8b-4433-4d66-a6b0-fd37083abc4c/about  // x-grid-location-info://lincoln.lindenlab.com/app/agent/0e346d8b-4433-4d66-a6b0-fd37083abc4c/about diff --git a/indra/llui/llurlentry.h b/indra/llui/llurlentry.h index ffcd45dfde..1cb11cdb1c 100755 --- a/indra/llui/llurlentry.h +++ b/indra/llui/llurlentry.h @@ -96,6 +96,8 @@ public:  	/// Should this link text be underlined only when mouse is hovered over it?  	virtual bool underlineOnHoverOnly(const std::string &string) const { return false; } +	virtual bool isTrusted() const { return false; } +  	virtual LLUUID	getID(const std::string &string) const { return LLUUID::null; }  	bool isLinkDisabled() const; @@ -168,6 +170,21 @@ public:  };  /// +/// LLUrlEntrySeconlifeURLs Describes *secondlife.com and *lindenlab.com Urls +/// +class LLUrlEntrySeconlifeURL : public LLUrlEntryBase +{ +public: +	LLUrlEntrySeconlifeURL(); +	bool isTrusted() const { return true; } +	/*virtual*/ std::string getLabel(const std::string &url, const LLUrlLabelCallback &cb); +	/*virtual*/ std::string getTooltip(const std::string &url) const; + +private: +	std::string mLabel; +}; + +///  /// LLUrlEntryAgent Describes a Second Life agent Url, e.g.,  /// secondlife:///app/agent/0e346d8b-4433-4d66-a6b0-fd37083abc4c/about  class LLUrlEntryAgent : public LLUrlEntryBase diff --git a/indra/llui/llurlmatch.cpp b/indra/llui/llurlmatch.cpp index c1f1382a9f..016d1ca92d 100755 --- a/indra/llui/llurlmatch.cpp +++ b/indra/llui/llurlmatch.cpp @@ -37,7 +37,8 @@ LLUrlMatch::LLUrlMatch() :  	mIcon(""),  	mMenuName(""),  	mLocation(""), -	mUnderlineOnHoverOnly(false) +	mUnderlineOnHoverOnly(false), +	mTrusted(false)  {  } @@ -45,7 +46,7 @@ void LLUrlMatch::setValues(U32 start, U32 end, const std::string &url,  						   const std::string &label, const std::string &tooltip,  						   const std::string &icon, const LLStyle::Params& style,  						   const std::string &menu, const std::string &location, -						   const LLUUID& id, bool underline_on_hover_only) +						   const LLUUID& id, bool underline_on_hover_only, bool trusted)  {  	mStart = start;  	mEnd = end; @@ -59,4 +60,5 @@ void LLUrlMatch::setValues(U32 start, U32 end, const std::string &url,  	mLocation = location;  	mID = id;  	mUnderlineOnHoverOnly = underline_on_hover_only; +	mTrusted = trusted;  } diff --git a/indra/llui/llurlmatch.h b/indra/llui/llurlmatch.h index 2818f45207..9f8960b32f 100755 --- a/indra/llui/llurlmatch.h +++ b/indra/llui/llurlmatch.h @@ -80,12 +80,15 @@ public:  	/// Should this link text be underlined only when mouse is hovered over it?  	bool underlineOnHoverOnly() const { return mUnderlineOnHoverOnly; } +	/// Return true if Url is trusted. +	bool isTrusted() const { return mTrusted; } +  	/// Change the contents of this match object (used by LLUrlRegistry)  	void setValues(U32 start, U32 end, const std::string &url, const std::string &label,  	               const std::string &tooltip, const std::string &icon,  				   const LLStyle::Params& style, const std::string &menu,   				   const std::string &location, const LLUUID& id, -				   bool underline_on_hover_only = false ); +				   bool underline_on_hover_only = false, bool trusted = false );  	const LLUUID& getID() const { return mID; }  private: @@ -100,6 +103,7 @@ private:  	LLUUID		mID;  	LLStyle::Params mStyle;  	bool		mUnderlineOnHoverOnly; +	bool		mTrusted;  };  #endif diff --git a/indra/llui/llurlregistry.cpp b/indra/llui/llurlregistry.cpp index ef0789e0e4..9e8d8d01f1 100755 --- a/indra/llui/llurlregistry.cpp +++ b/indra/llui/llurlregistry.cpp @@ -27,6 +27,7 @@  #include "linden_common.h"  #include "llurlregistry.h" +#include "lluriparser.h"  #include <boost/regex.hpp> @@ -44,6 +45,10 @@ LLUrlRegistry::LLUrlRegistry()  	mUrlEntryIcon = new LLUrlEntryIcon();  	registerUrl(mUrlEntryIcon);  	registerUrl(new LLUrlEntrySLURL()); + +	// decorated links for host names like: secondlife.com and lindenlab.com +	registerUrl(new LLUrlEntrySeconlifeURL()); +  	registerUrl(new LLUrlEntryHTTP());  	mUrlEntryHTTPLabel = new LLUrlEntryHTTPLabel();  	registerUrl(mUrlEntryHTTPLabel); @@ -203,6 +208,11 @@ bool LLUrlRegistry::findUrl(const std::string &text, LLUrlMatch &match, const LL  	{  		// fill in the LLUrlMatch object and return it  		std::string url = text.substr(match_start, match_end - match_start + 1); + +		LLUriParser up(url); +		up.normalize(); +		url = up.normalizedUri(); +  		match.setValues(match_start, match_end,  						match_entry->getUrl(url),  						match_entry->getLabel(url, cb), @@ -212,7 +222,8 @@ bool LLUrlRegistry::findUrl(const std::string &text, LLUrlMatch &match, const LL  						match_entry->getMenuName(),  						match_entry->getLocation(url),  						match_entry->getID(url), -						match_entry->underlineOnHoverOnly(url)); +						match_entry->underlineOnHoverOnly(url), +						match_entry->isTrusted());  		return true;  	} diff --git a/indra/llwindow/llopenglview-objc.mm b/indra/llwindow/llopenglview-objc.mm index 959dbc1040..1c9160a42d 100644 --- a/indra/llwindow/llopenglview-objc.mm +++ b/indra/llwindow/llopenglview-objc.mm @@ -133,6 +133,10 @@ attributedStringInfo getSegments(NSAttributedString *str)      [[NSNotificationCenter defaultCenter] addObserver:self  											 selector:@selector(windowDidDeminiaturize:) name:NSWindowDidDeminiaturizeNotification  											   object:[self window]]; +     +    [[NSNotificationCenter defaultCenter] addObserver:self +											 selector:@selector(windowDidBecomeKey:) name:NSWindowDidBecomeKeyNotification +											   object:[self window]];  }  - (void)setOldResize:(bool)oldresize @@ -159,6 +163,11 @@ attributedStringInfo getSegments(NSAttributedString *str)      callWindowUnhide();  } +- (void)windowDidBecomeKey:(NSNotification *)notification; +{ +    mModifiers = [NSEvent modifierFlags]; +} +  - (void)dealloc  {  	[[NSNotificationCenter defaultCenter] removeObserver:self]; diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 422a75f3f1..4c195f3ea7 100755 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -50,6 +50,7 @@ include(UnixInstall)  include(ViewerMiscLibs)  include(VisualLeakDetector)  include(ZLIB) +include(URIPARSER)  if (NOT HAVOK_TPV)     # When using HAVOK_TPV, the library is precompiled, so no need for this @@ -1932,6 +1933,7 @@ endif (WINDOWS)  target_link_libraries(${VIEWER_BINARY_NAME}      ${PNG_PRELOAD_ARCHIVES}      ${ZLIB_PRELOAD_ARCHIVES} +    ${URIPARSER_PRELOAD_ARCHIVES}      ${UPDATER_LIBRARIES}      ${GOOGLE_PERFTOOLS_LIBRARIES}      ${LLAUDIO_LIBRARIES} diff --git a/indra/newview/VIEWER_VERSION.txt b/indra/newview/VIEWER_VERSION.txt index c282746153..e5403775b2 100644 --- a/indra/newview/VIEWER_VERSION.txt +++ b/indra/newview/VIEWER_VERSION.txt @@ -1 +1 @@ -3.7.25 +3.7.26 diff --git a/indra/newview/app_settings/keywords_lsl_default.xml b/indra/newview/app_settings/keywords_lsl_default.xml index 37dd2db93f..cea7a58949 100755 --- a/indra/newview/app_settings/keywords_lsl_default.xml +++ b/indra/newview/app_settings/keywords_lsl_default.xml @@ -10980,7 +10980,7 @@                 </map>              </array>              <key>tooltip</key> -            <string>Rez directly off of a UUID if owner has dog-bit set.</string> +            <string>Rez directly off of a UUID if owner has god-bit set.</string>           </map>           <key>llGround</key>           <map> diff --git a/indra/newview/installers/windows/installer_template.nsi b/indra/newview/installers/windows/installer_template.nsi index 65581a6781..8c8b4971cf 100755 --- a/indra/newview/installers/windows/installer_template.nsi +++ b/indra/newview/installers/windows/installer_template.nsi @@ -1,6 +1,6 @@  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 -;; secondlife setup.nsi
 -;; Copyright 2004-2011, Linden Research, Inc.
 +;; Second Life setup.nsi
 +;; Copyright 2004-2015, 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
 @@ -18,26 +18,27 @@  ;;
  ;; Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
  ;;
 -;; NSIS Unicode 2.38.1 or higher required
 +;; NSIS Unicode 2.46.5 or higher required
  ;; http://www.scratchpaper.com/
  ;;
 -;; Author: James Cook, Don Kjer, Callum Prentice
 +;; Author: James Cook, TankMaster Finesmith, Don Kjer, Callum Prentice
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  ;; Compiler flags
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 -SetOverwrite on				; overwrite files
 -SetCompress auto			; compress iff saves space
 -SetCompressor /solid lzma	; compress whole installer as one block
 -SetDatablockOptimize off	; only saves us 0.1%, not worth it
 -XPStyle on                  ; add an XP manifest to the installer
 -RequestExecutionLevel admin	; on Vista we must be admin because we write to Program Files
 +SetOverwrite on				# Overwrite files
 +SetCompress auto			# Compress if saves space
 +SetCompressor /solid lzma	# Compress whole installer as one block
 +SetDatablockOptimize off	# Only saves us 0.1%, not worth it
 +XPStyle on                  # Add an XP manifest to the installer
 +RequestExecutionLevel admin	# For when we write to Program Files
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 -;;; Project flags
 +;; Project flags
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 +# This placeholder is replaced by viewer_manifest.py
  %%VERSION%%
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 @@ -72,140 +73,317 @@ LangString LanguageCode ${LANG_RUSSIAN}  "ru"  LangString LanguageCode ${LANG_TURKISH}  "tr"
  LangString LanguageCode ${LANG_TRADCHINESE}  "zh"
 -;; this placeholder is replaced by viewer_manifest.py
 +# This placeholder is replaced by viewer_manifest.py
  %%INST_VARS%%
  Name ${INSTNAME}
 -SubCaption 0 $(LicenseSubTitleSetup)	; override "license agreement" text
 +SubCaption 0 $(LicenseSubTitleSetup)	# Override "license agreement" text
 -BrandingText " "						; bottom of window text
 +BrandingText " "						# Bottom of window text
  Icon          %%SOURCE%%\installers\windows\install_icon.ico
  UninstallIcon %%SOURCE%%\installers\windows\uninstall_icon.ico
 -WindowIcon on							; show our icon in left corner
 -BGGradient off							; no big background window
 -CRCCheck on								; make sure CRC is OK
 -InstProgressFlags smooth colored		; new colored smooth look
 -ShowInstDetails nevershow				; no details, no "show" button
 -SetOverwrite on							; stomp files by default
 -AutoCloseWindow true					; after all files install, close window
 +WindowIcon on							# Show our icon in left corner
 +BGGradient off							# No big background window
 +CRCCheck on								# Make sure CRC is OK
 +InstProgressFlags smooth colored		# New colored smooth look
 +SetOverwrite on							# Overwrite files by default
 +AutoCloseWindow true					# After all files install, close window
  InstallDir "$PROGRAMFILES\${INSTNAME}"
  InstallDirRegKey HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\${INSTNAME}" ""
 +UninstallText $(UninstallTextMsg)
  DirText $(DirectoryChooseTitle) $(DirectoryChooseSetup)
  Page directory dirPre
  Page instfiles
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 -;;; Variables
 +;; Variables
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  Var INSTPROG
  Var INSTEXE
  Var INSTSHORTCUT
 -Var COMMANDLINE         ; command line passed to this installer, set in .onInit
 -Var SHORTCUT_LANG_PARAM ; "--set InstallLanguage de", passes language to viewer
 -Var SKIP_DIALOGS        ; set from command line in  .onInit. autoinstall 
 -                        ; GUI and the defaults.
 -Var SKIP_AUTORUN		; skip automatic launch of viewer after install
 -Var DO_UNINSTALL_V2     ; If non-null, path to a previous Viewer 2 installation that will be uninstalled.
 -
 -;;; Function definitions should go before file includes, because calls to
 -;;; DLLs like LangDLL trigger an implicit file include, so if that call is at
 -;;; the end of this script NSIS has to decompress the whole installer before 
 -;;; it can call the DLL function. JC
 -
 -!include "FileFunc.nsh"     ; For GetParameters, GetOptions
 +Var COMMANDLINE         # Command line passed to this installer, set in .onInit
 +Var SHORTCUT_LANG_PARAM # "--set InstallLanguage de", Passes language to viewer
 +Var SKIP_DIALOGS        # Set from command line in  .onInit. autoinstall GUI and the defaults.
 +Var SKIP_AUTORUN		# Skip automatic launch of the viewer after install
 +Var DO_UNINSTALL_V2     # If non-null, path to a previous Viewer 2 installation that will be uninstalled.
 +
 +# Function definitions should go before file includes, because calls to
 +# DLLs like LangDLL trigger an implicit file include, so if that call is at
 +# the end of this script NSIS has to decompress the whole installer before 
 +# it can call the DLL function. JC
 +
 +!include "FileFunc.nsh"     # For GetParameters, GetOptions
  !insertmacro GetParameters
  !insertmacro GetOptions
 -!include WinVer.nsh			; For OS and SP detection
 -!include x64.nsh			; For 64bit OS detection
 +!include WinVer.nsh			# For OS and SP detection
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 -;;; After install completes, launch app
 -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 -Function .onInstSuccess
 -Call CheckWindowsServPack				; Warn if not on the latest SP before asking to launch.
 -    Push $R0	# Option value, unused
 -	StrCmp $SKIP_AUTORUN "true" +2;
 -	# Assumes SetOutPath $INSTDIR
 -	Exec '"$INSTDIR\$INSTEXE" $SHORTCUT_LANG_PARAM'
 -	Pop $R0
 -FunctionEnd
 -
 -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 -;;; Pre-directory page callback
 +;; Pre-directory page callback
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  Function dirPre
      StrCmp $SKIP_DIALOGS "true" 0 +2
  	Abort
 +
  FunctionEnd    
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 -; Make sure this computer meets the minimum system requirements.
 -; Currently: Windows 32bit XP SP3, 64bit XP SP2 and Server 2003 SP2
 +;; Prep Installer Section
 +;;
 +;; Note: to add new languages, add a language file include to the list 
 +;; at the top of this file, add an entry to the menu and then add an 
 +;; entry to the language ID selector below
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 -Function CheckWindowsVersion
 -  ${If} ${AtMostWin2000}
 -    MessageBox MB_OK $(CheckWindowsVersionMB)
 +Function .onInit
 +Call CheckCPUFlags							# Make sure we have SSE2 support
 +Call CheckWindowsVersion					# Don't install On unsupported systems
 +    Push $0
 +    ${GetParameters} $COMMANDLINE			# Get our command line
 +
 +    ${GetOptions} $COMMANDLINE "/SKIP_DIALOGS" $0   
 +    IfErrors +2 0	# If error jump past setting SKIP_DIALOGS
 +        StrCpy $SKIP_DIALOGS "true"
 +
 +	${GetOptions} $COMMANDLINE "/SKIP_AUTORUN" $0
 +	IfErrors +2 0 ; If error jump past setting SKIP_AUTORUN
 +		StrCpy $SKIP_AUTORUN "true"
 +
 +    ${GetOptions} $COMMANDLINE "/LANGID=" $0	# /LANGID=1033 implies US English
 +
 +# If no language (error), then proceed
 +    IfErrors lbl_configure_default_lang
 +# No error means we got a language, so use it
 +    StrCpy $LANGUAGE $0
 +    Goto lbl_return
 +
 +lbl_configure_default_lang:
 +# If we currently have a version of SL installed, default to the language of that install
 +# Otherwise don't change $LANGUAGE and it will default to the OS UI language.
 +    ReadRegStr $0 HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\${INSTNAME}" "InstallerLanguage"
 +    IfErrors +2 0	# If error skip the copy instruction 
 +	StrCpy $LANGUAGE $0
 +
 +# For silent installs, no language prompt, use default
 +    IfSilent lbl_return
 +    StrCmp $SKIP_DIALOGS "true" lbl_return
 +  
 +lbl_build_menu:
 +	Push ""
 +# Use separate file so labels can be UTF-16 but we can still merge changes into this ASCII file. JC
 +    !include "%%SOURCE%%\installers\windows\language_menu.nsi"
 +    
 +	Push A	# A means auto count languages for the auto count to work the first empty push (Push "") must remain
 +	LangDLL::LangDialog $(InstallerLanguageTitle) $(SelectInstallerLanguage)
 +	Pop $0
 +	StrCmp $0 "cancel" 0 +2
 +		Abort
 +    StrCpy $LANGUAGE $0
 +
 +# Save language in registry		
 +	WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\${INSTNAME}" "InstallerLanguage" $LANGUAGE
 +lbl_return:
 +    Pop $0
 +    Return
 +
 +FunctionEnd
 +
 +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 +;; Prep Uninstaller Section
 +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 +Function un.onInit
 +# Read language from registry and set for uninstaller. Key will be removed on successful uninstall
 +	ReadRegStr $0 HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\${INSTNAME}" "InstallerLanguage"
 +    IfErrors lbl_end
 +	StrCpy $LANGUAGE $0
 +lbl_end:
 +    Return
 +
 +FunctionEnd
 +
 +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 +;; Checks for CPU valid (must have SSE2 support)
 +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 +Function CheckCPUFlags
 +    Push $1
 +    System::Call 'kernel32::IsProcessorFeaturePresent(i) i(10) .r1'
 +    IntCmp $1 1 OK_SSE2
 +    MessageBox MB_OKCANCEL $(MissingSSE2) /SD IDOK IDOK OK_SSE2
      Quit
 -  ${EndIf}
 -  ${If} ${IsWinXP}
 -  ${AndIfNot} ${RunningX64}
 -  ${AndIfNot} ${IsServicePack} 3
 +  OK_SSE2:
 +    Pop $1
 +    Return
 +
 +FunctionEnd
 +
 +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 +;; Make sure this computer meets the minimum system requirements.
 +;; Currently: Windows Vista SP2
 +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 +Function CheckWindowsVersion
 +  ${If} ${AtMostWin2003}
      MessageBox MB_OK $(CheckWindowsVersionMB)
      Quit
    ${EndIf}
 -  ${If} ${IsWinXP}
 -  ${AndIf} ${RunningX64}
 +  ${If} ${IsWinVista}
    ${AndIfNot} ${IsServicePack} 2
      MessageBox MB_OK $(CheckWindowsVersionMB)
      Quit
    ${EndIf}
 -  ${If} ${IsWin2003}
 +  ${If} ${IsWin2008}
    ${AndIfNot} ${IsServicePack} 2
      MessageBox MB_OK $(CheckWindowsVersionMB)
      Quit
    ${EndIf}
 +
  FunctionEnd
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 -;Recommend Upgrading Service Pack
 +;; Install Section
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 -Function CheckWindowsServPack
 -  ${If} ${IsWinVista}
 -  ${AndIfNot} ${IsServicePack} 2
 -    MessageBox MB_OK $(CheckWindowsServPackMB)
 -    DetailPrint $(UseLatestServPackDP)
 -    Return
 -  ${EndIf}
 +Section ""
 -  ${If} ${IsWin2008}
 -  ${AndIfNot} ${IsServicePack} 2
 -    MessageBox MB_OK $(CheckWindowsServPackMB)
 -    DetailPrint $(UseLatestServPackDP)
 -    Return
 -  ${EndIf}
 +SetShellVarContext all			# Install for all users (if you change this, change it in the uninstall as well)
 -  ${If} ${IsWin7}
 -  ${AndIfNot} ${IsServicePack} 1
 -    MessageBox MB_OK $(CheckWindowsServPackMB)
 -    DetailPrint $(UseLatestServPackDP)
 -    Return
 -  ${EndIf}
 +# Start with some default values.
 +StrCpy $INSTPROG "${INSTNAME}"
 +StrCpy $INSTEXE "${INSTEXE}"
 +StrCpy $INSTSHORTCUT "${SHORTCUT}"
 -  ${If} ${IsWin2008R2}
 -  ${AndIfNot} ${IsServicePack} 1
 -    MessageBox MB_OK $(CheckWindowsServPackMB)
 -    DetailPrint $(UseLatestServPackDP)
 -    Return
 -  ${EndIf}
 -FunctionEnd
 +Call CheckIfAdministrator		# Make sure the user can install/uninstall
 +Call CheckIfAlreadyCurrent		# Make sure this version is not already installed
 +Call CloseSecondLife			# Make sure Second Life not currently running
 +Call CheckNetworkConnection		# Ping secondlife.com
 +Call CheckWillUninstallV2		# Check if Second Life is already installed
 +
 +StrCmp $DO_UNINSTALL_V2 "" PRESERVE_DONE
 +PRESERVE_DONE:
 +
 +Call RemoveProgFilesOnInst		# Remove existing files to prevent certain errors when running the new version of the viewer
 +
 +# This placeholder is replaced by the complete list of all the files in the installer, by viewer_manifest.py
 +%%INSTALL_FILES%%
 +
 +# Pass the installer's language to the client to use as a default
 +StrCpy $SHORTCUT_LANG_PARAM "--set InstallLanguage $(LanguageCode)"
 +
 +# Shortcuts in start menu
 +CreateDirectory	"$SMPROGRAMS\$INSTSHORTCUT"
 +SetOutPath "$INSTDIR"
 +CreateShortCut	"$SMPROGRAMS\$INSTSHORTCUT\$INSTSHORTCUT.lnk" \
 +				"$INSTDIR\$INSTEXE" "$SHORTCUT_LANG_PARAM"
 +
 +
 +WriteINIStr		"$SMPROGRAMS\$INSTSHORTCUT\SL Create Account.url" \
 +				"InternetShortcut" "URL" \
 +				"http://join.secondlife.com/"
 +WriteINIStr		"$SMPROGRAMS\$INSTSHORTCUT\SL Your Account.url" \
 +				"InternetShortcut" "URL" \
 +				"http://www.secondlife.com/account/"
 +WriteINIStr		"$SMPROGRAMS\$INSTSHORTCUT\SL Scripting Language Help.url" \
 +				"InternetShortcut" "URL" \
 +                "http://wiki.secondlife.com/wiki/LSL_Portal"
 +CreateShortCut	"$SMPROGRAMS\$INSTSHORTCUT\Uninstall $INSTSHORTCUT.lnk" \
 +				'"$INSTDIR\uninst.exe"' ''
 +
 +# Other shortcuts
 +SetOutPath "$INSTDIR"
 +CreateShortCut "$DESKTOP\$INSTSHORTCUT.lnk" \
 +        "$INSTDIR\$INSTEXE" "$SHORTCUT_LANG_PARAM"
 +CreateShortCut "$INSTDIR\$INSTSHORTCUT.lnk" \
 +        "$INSTDIR\$INSTEXE" "$SHORTCUT_LANG_PARAM"
 +CreateShortCut "$INSTDIR\Uninstall $INSTSHORTCUT.lnk" \
 +				'"$INSTDIR\uninst.exe"' ''
 +
 +# Write registry
 +WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\$INSTPROG" "" "$INSTDIR"
 +WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\$INSTPROG" "Version" "${VERSION_LONG}"
 +WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\$INSTPROG" "Shortcut" "$INSTSHORTCUT"
 +WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\$INSTPROG" "Exe" "$INSTEXE"
 +WriteRegStr HKEY_LOCAL_MACHINE "Software\Microsoft\Windows\CurrentVersion\Uninstall\$INSTPROG" "Publisher" "Linden Research, Inc."
 +WriteRegStr HKEY_LOCAL_MACHINE "Software\Microsoft\Windows\CurrentVersion\Uninstall\$INSTPROG" "URLInfoAbout" "http://secondlife.com/whatis/"
 +WriteRegStr HKEY_LOCAL_MACHINE "Software\Microsoft\Windows\CurrentVersion\Uninstall\$INSTPROG" "URLUpdateInfo" "http://secondlife.com/support/downloads/"
 +WriteRegStr HKEY_LOCAL_MACHINE "Software\Microsoft\Windows\CurrentVersion\Uninstall\$INSTPROG" "HelpLink" "https://support.secondlife.com/contact-support/"
 +WriteRegStr HKEY_LOCAL_MACHINE "Software\Microsoft\Windows\CurrentVersion\Uninstall\$INSTPROG" "DisplayName" "$INSTPROG"
 +WriteRegStr HKEY_LOCAL_MACHINE "Software\Microsoft\Windows\CurrentVersion\Uninstall\$INSTPROG" "UninstallString" '"$INSTDIR\uninst.exe"'
 +WriteRegStr HKEY_LOCAL_MACHINE "Software\Microsoft\Windows\CurrentVersion\Uninstall\$INSTPROG" "DisplayVersion" "${VERSION_LONG}"
 +WriteRegDWORD HKEY_LOCAL_MACHINE "Software\Microsoft\Windows\CurrentVersion\Uninstall\$INSTPROG" "EstimatedSize" "0x0001D500"		# ~117 MB
 +# BUG-2707 Disable SEHOP for installed viewer.
 +WriteRegDWORD HKEY_LOCAL_MACHINE "Software\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\$INSTEXE" "DisableExceptionChainValidation" 1
 +
 +# Write URL registry info
 +WriteRegStr HKEY_CLASSES_ROOT "${URLNAME}" "(default)" "URL:Second Life"
 +WriteRegStr HKEY_CLASSES_ROOT "${URLNAME}" "URL Protocol" ""
 +WriteRegStr HKEY_CLASSES_ROOT "${URLNAME}\DefaultIcon" "" '"$INSTDIR\$INSTEXE"'
 +
 +# URL param must be last item passed to viewer, it ignores subsequent params to avoid parameter injection attacks.
 +WriteRegExpandStr HKEY_CLASSES_ROOT "${URLNAME}\shell\open\command" "" '"$INSTDIR\$INSTEXE" -url "%1"'
 +WriteRegStr HKEY_CLASSES_ROOT "x-grid-location-info"(default)" "URL:Second Life"
 +WriteRegStr HKEY_CLASSES_ROOT "x-grid-location-info" "URL Protocol" ""
 +WriteRegStr HKEY_CLASSES_ROOT "x-grid-location-info\DefaultIcon" "" '"$INSTDIR\$INSTEXE"'
 +
 +# URL param must be last item passed to viewer, it ignores subsequent params to avoid parameter injection attacks.
 +WriteRegExpandStr HKEY_CLASSES_ROOT "x-grid-location-info\shell\open\command" "" '"$INSTDIR\$INSTEXE" -url "%1"'
 +
 +# Write out uninstaller
 +WriteUninstaller "$INSTDIR\uninst.exe"
 +
 +# Uninstall existing "Second Life Viewer 2" install if needed.
 +StrCmp $DO_UNINSTALL_V2 "" REMOVE_SLV2_DONE
 +  ExecWait '"$PROGRAMFILES\SecondLifeViewer2\uninst.exe" /S _?=$PROGRAMFILES\SecondLifeViewer2'
 +  Delete "$PROGRAMFILES\SecondLifeViewer2\uninst.exe"	# With _? option above, uninst.exe will be left behind.
 +  RMDir "$PROGRAMFILES\SecondLifeViewer2"	# Will remove only if empty.
 +
 +REMOVE_SLV2_DONE:
 +
 +SectionEnd
 +
 +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 +;; Uninstall Section
 +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 +Section Uninstall
 +
 +# Start with some default values.
 +StrCpy $INSTPROG "${INSTNAME}"
 +StrCpy $INSTEXE "${INSTEXE}"
 +StrCpy $INSTSHORTCUT "${SHORTCUT}"
 +
 +# Make sure the user can install/uninstall
 +Call un.CheckIfAdministrator
 +
 +# Uninstall for all users (if you change this, change it in the install as well)
 +SetShellVarContext all			
 +
 +# Make sure we're not running
 +Call un.CloseSecondLife
 +
 +# Clean up registry keys and subkeys (these should all be !defines somewhere)
 +DeleteRegKey HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\$INSTPROG"
 +DeleteRegKey HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$INSTPROG"
 +# BUG-2707 Remove entry that disabled SEHOP
 +DeleteRegKey HKEY_LOCAL_MACHINE "Software\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\$INSTEXE"
 +
 +# Clean up shortcuts
 +Delete "$SMPROGRAMS\$INSTSHORTCUT\*.*"
 +RMDir  "$SMPROGRAMS\$INSTSHORTCUT"
 +
 +Delete "$DESKTOP\$INSTSHORTCUT.lnk"
 +Delete "$INSTDIR\$INSTSHORTCUT.lnk"
 +Delete "$INSTDIR\Uninstall $INSTSHORTCUT.lnk"
 +
 +# Remove the main installation directory
 +Call un.ProgramFiles
 +
 +# Clean up cache and log files, but leave them in-place for non AGNI installs.
 +Call un.UserSettingsFiles
 +
 +SectionEnd
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 -; Make sure the user can install/uninstall
 +;; Make sure the user can install
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  Function CheckIfAdministrator
      DetailPrint $(CheckAdministratorInstDP)
 @@ -216,10 +394,11 @@ Function CheckIfAdministrator          Quit
  lbl_is_admin:
      Return
 +
  FunctionEnd
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 -;;
 +;; Make sure the user can uninstall
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  Function un.CheckIfAdministrator
      DetailPrint $(CheckAdministratorUnInstDP)
 @@ -230,11 +409,12 @@ Function un.CheckIfAdministrator          Quit
  lbl_is_admin:
      Return
 +
  FunctionEnd
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 -; Checks to see if the current version has already been installed (according to the registry).
 -; If it has, allow user to bail out of install process.
 +;; Checks to see if the current version has already been installed (according to the registry).
 +;; If it has, allow user to bail out of install process.
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  Function CheckIfAlreadyCurrent
      Push $0
 @@ -246,26 +426,34 @@ Function CheckIfAlreadyCurrent  continue_install:
      Pop $0
      Return
 +
  FunctionEnd
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 -; Checks for CPU valid (must have SSE2 support)
 +;; Function CheckWillUninstallV2               
 +;;
 +;; If called through auto-update, need to uninstall any existing V2 installation.
 +;; Don't want to end up with SecondLifeViewer2 and SecondLifeViewer installations
 +;;  existing side by side with no indication on which to use.
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 -Function CheckCPUFlags
 -    Push $1
 -    System::Call 'kernel32::IsProcessorFeaturePresent(i) i(10) .r1'
 -    IntCmp $1 1 OK_SSE2
 -    MessageBox MB_OKCANCEL $(MissingSSE2) /SD IDOK IDOK OK_SSE2
 -    Quit
 +Function CheckWillUninstallV2
 +
 +  StrCpy $DO_UNINSTALL_V2 ""
 +
 +  StrCmp $SKIP_DIALOGS "true" 0 CHECKV2_DONE
 +  StrCmp $INSTDIR "$PROGRAMFILES\SecondLifeViewer2" CHECKV2_DONE	# Don't uninstall our own install dir.
 +  IfFileExists "$PROGRAMFILES\SecondLifeViewer2\uninst.exe" CHECKV2_FOUND CHECKV2_DONE
 +
 +CHECKV2_FOUND:
 +  StrCpy $DO_UNINSTALL_V2 "true"
 +
 +CHECKV2_DONE:
 -  OK_SSE2:
 -    Pop $1
 -    Return
  FunctionEnd
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 -; Close the program, if running. Modifies no variables.
 -; Allows user to bail out of install process.
 +;; Close the program, if running. Modifies no variables.
 +;; Allows user to bail out of install process.
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  Function CloseSecondLife
    Push $0
 @@ -291,334 +479,134 @@ Function CloseSecondLife    DONE:
      Pop $0
      Return
 +
 +FunctionEnd
 +
 +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 +;; Close the program, if running. Modifies no variables.
 +;; Allows user to bail out of uninstall process.
 +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 +Function un.CloseSecondLife
 +  Push $0
 +  FindWindow $0 "Second Life" ""
 +  IntCmp $0 0 DONE
 +  MessageBox MB_OKCANCEL $(CloseSecondLifeUnInstMB) IDOK CLOSE IDCANCEL CANCEL_UNINSTALL
 +
 +  CANCEL_UNINSTALL:
 +    Quit
 +
 +  CLOSE:
 +    DetailPrint $(CloseSecondLifeUnInstDP)
 +    SendMessage $0 16 0 0
 +
 +  LOOP:
 +	  FindWindow $0 "Second Life" ""
 +	  IntCmp $0 0 DONE
 +	  Sleep 500
 +	  Goto LOOP
 +
 +  DONE:
 +    Pop $0
 +    Return
 +
  FunctionEnd
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 -; Test our connection to secondlife.com
 -; Also allows us to count attempted installs by examining web logs.
 -; *TODO: Return current SL version info and have installer check
 -; if it is up to date.
 +;; Test our connection to secondlife.com
 +;; Also allows us to count attempted installs by examining web logs.
 +;; *TODO: Return current SL version info and have installer check
 +;; if it is up to date.
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  Function CheckNetworkConnection
      Push $0
      Push $1
      Push $2	# Option value for GetOptions
      DetailPrint $(CheckNetworkConnectionDP)
 -    ; Look for a tag value from the stub installer, used for statistics
 -    ; to correlate installs.  Default to "" if not found on command line.
 +# Look for a tag value from the stub installer, used for statistics to correlate installs.
 +# Default to "" if not found on command line.
      StrCpy $2 ""
      ${GetOptions} $COMMANDLINE "/STUBTAG=" $2
      GetTempFileName $0
 -    !define HTTP_TIMEOUT 5000 ; milliseconds
 -    ; Don't show secondary progress bar, this will be quick.
 +    !define HTTP_TIMEOUT 5000		# Milliseconds
 +# Don't show secondary progress bar, this will be quick.
      NSISdl::download_quiet \
          /TIMEOUT=${HTTP_TIMEOUT} \
          "http://install.secondlife.com/check/?stubtag=$2&version=${VERSION_LONG}" \
          $0
 -    Pop $1 ; Return value, either "success", "cancel" or an error message
 +    Pop $1		# Return value, either "success", "cancel" or an error message
      ; MessageBox MB_OK "Download result: $1"
      ; Result ignored for now
  	; StrCmp $1 "success" +2
  	;	DetailPrint "Connection failed: $1"
 -    Delete $0 ; temporary file
 +    Delete $0	# Temporary file
      Pop $2
      Pop $1
      Pop $0
      Return
 -FunctionEnd
 -
 -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 -; Function CheckOldExeName
 -; Viewer versions < 3.6.12 used the name 'SecondLife.exe'
 -; If that name is found in the install folder, delete it to invalidate any
 -; old shortcuts to it that may be in non-standard locations, so that the user
 -; does not end up running the old version (potentially getting caught in an 
 -; infinite update loop). See MAINT-3575
 -; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 -
 -Function CheckOldExeName
 -  IfFileExists "$INSTDIR\SecondLife.exe" CHECKOLDEXE_FOUND CHECKOLDEXE_DONE
 -
 -CHECKOLDEXE_FOUND:
 -  Delete "$INSTDIR\SecondLife.exe"
 -CHECKOLDEXE_DONE:
 -FunctionEnd
 -
 -
 -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 -; Function CheckWillUninstallV2               
 -;
 -; If we are being called through auto-update, we need to uninstall any
 -; existing V2 installation. Otherwise, we wind up with
 -; SecondLifeViewer2 and SecondLifeViewer installations existing side
 -; by side no indication which to use.
 -; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 -Function CheckWillUninstallV2
 -
 -  StrCpy $DO_UNINSTALL_V2 ""
 -
 -  StrCmp $SKIP_DIALOGS "true" 0 CHECKV2_DONE
 -  StrCmp $INSTDIR "$PROGRAMFILES\SecondLifeViewer2" CHECKV2_DONE ; don't uninstall our own install dir.
 -  IfFileExists "$PROGRAMFILES\SecondLifeViewer2\uninst.exe" CHECKV2_FOUND CHECKV2_DONE
 -
 -CHECKV2_FOUND:
 -  StrCpy $DO_UNINSTALL_V2 "true"
 -
 -CHECKV2_DONE:
 -
 -FunctionEnd
 -
 -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 -; Save user files to temp location
 -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 -Function PreserveUserFiles
 -
 -Push $0
 -Push $1
 -Push $2
 -
 -    RMDir /r "$TEMP\SecondLifeSettingsBackup"
 -    CreateDirectory "$TEMP\SecondLifeSettingsBackup"
 -    StrCpy $0 0 ; Index number used to iterate via EnumRegKey
 -
 -  LOOP:
 -    EnumRegKey $1 HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList" $0
 -    StrCmp $1 "" DONE               ; no more users
 -
 -    ReadRegStr $2 HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\$1" "ProfileImagePath" 
 -    StrCmp $2 "" CONTINUE 0         ; "ProfileImagePath" value is missing
 -
 -    ; Required since ProfileImagePath is of type REG_EXPAND_SZ
 -    ExpandEnvStrings $2 $2
 -
 -    CreateDirectory "$TEMP\SecondLifeSettingsBackup\$0"
 -    CopyFiles /SILENT "$2\Application Data\SecondLife\*" "$TEMP\SecondLifeSettingsBackup\$0"
 -
 -  CONTINUE:
 -    IntOp $0 $0 + 1
 -    Goto LOOP
 -  DONE:
 -
 -Pop $2
 -Pop $1
 -Pop $0
 -
 -; Copy files in Documents and Settings\All Users\SecondLife
 -Push $0
 -    ReadRegStr $0 HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" "Common AppData"
 -    StrCmp $0 "" +2
 -    CreateDirectory "$TEMP\SecondLifeSettingsBackup\AllUsers\"
 -    CopyFiles /SILENT "$2\Application Data\SecondLife\*" "$TEMP\SecondLifeSettingsBackup\AllUsers\"
 -Pop $0
 -
 -FunctionEnd
 -
 -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 -; Restore user files from temp location
 -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 -Function RestoreUserFiles
 -
 -Push $0
 -Push $1
 -Push $2
 -
 -    StrCpy $0 0 ; Index number used to iterate via EnumRegKey
 -
 -  LOOP:
 -    EnumRegKey $1 HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList" $0
 -    StrCmp $1 "" DONE               ; no more users
 -
 -    ReadRegStr $2 HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\$1" "ProfileImagePath" 
 -    StrCmp $2 "" CONTINUE 0         ; "ProfileImagePath" value is missing
 -
 -    ; Required since ProfileImagePath is of type REG_EXPAND_SZ
 -    ExpandEnvStrings $2 $2
 -
 -    CreateDirectory "$2\Application Data\SecondLife\"
 -    CopyFiles /SILENT "$TEMP\SecondLifeSettingsBackup\$0\*" "$2\Application Data\SecondLife\" 
 -
 -  CONTINUE:
 -    IntOp $0 $0 + 1
 -    Goto LOOP
 -  DONE:
 -
 -Pop $2
 -Pop $1
 -Pop $0
 -
 -; Copy files in Documents and Settings\All Users\SecondLife
 -Push $0
 -    ReadRegStr $0 HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" "Common AppData"
 -    StrCmp $0 "" +2
 -    CreateDirectory "$2\Application Data\SecondLife\"
 -    CopyFiles /SILENT "$TEMP\SecondLifeSettingsBackup\AllUsers\*" "$2\Application Data\SecondLife\" 
 -Pop $0
  FunctionEnd
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 -; Remove temp dirs
 +;; Delete files on install if previous install exists to prevent undesired behavior
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 -Function RemoveTempUserFiles
 -
 -Push $0
 -Push $1
 -Push $2
 +Function RemoveProgFilesOnInst
 -    StrCpy $0 0 ; Index number used to iterate via EnumRegKey
 -
 -  LOOP:
 -    EnumRegKey $1 HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList" $0
 -    StrCmp $1 "" DONE               ; no more users
 -
 -    ReadRegStr $2 HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\$1" "ProfileImagePath" 
 -    StrCmp $2 "" CONTINUE 0         ; "ProfileImagePath" value is missing
 -
 -    ; Required since ProfileImagePath is of type REG_EXPAND_SZ
 -    ExpandEnvStrings $2 $2
 -
 -    RMDir /r "$TEMP\SecondLifeSettingsBackup\$0\*"
 -
 -  CONTINUE:
 -    IntOp $0 $0 + 1
 -    Goto LOOP
 -  DONE:
 -
 -Pop $2
 -Pop $1
 -Pop $0
 -
 -; Copy files in Documents and Settings\All Users\SecondLife
 -Push $0
 -    ReadRegStr $0 HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" "Common AppData"
 -    StrCmp $0 "" +2
 -    RMDir /r "$TEMP\SecondLifeSettingsBackup\AllUsers\*"
 -Pop $0
 -
 -FunctionEnd
 -
 -
 -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 -; Clobber user files - TEST ONLY
 -; This is here for testing, generally not desirable to call it.
 -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 -;Function ClobberUserFilesTESTONLY
 -
 -;Push $0
 -;Push $1
 -;Push $2
 -;
 -;    StrCpy $0 0 ; Index number used to iterate via EnumRegKey
 -;
 -;  LOOP:
 -;    EnumRegKey $1 HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList" $0
 -;    StrCmp $1 "" DONE               ; no more users
 -;
 -;    ReadRegStr $2 HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\$1" "ProfileImagePath" 
 -;    StrCmp $2 "" CONTINUE 0         ; "ProfileImagePath" value is missing
 -;
 -;    ; Required since ProfileImagePath is of type REG_EXPAND_SZ
 -;    ExpandEnvStrings $2 $2
 -;
 -;    RMDir /r "$2\Application Data\SecondLife\"
 -;
 -;  CONTINUE:
 -;    IntOp $0 $0 + 1
 -;    Goto LOOP
 -;  DONE:
 -;
 -;Pop $2
 -;Pop $1
 -;Pop $0
 -;
 -;; Copy files in Documents and Settings\All Users\SecondLife
 -;Push $0
 -;    ReadRegStr $0 HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" "Common AppData"
 -;    StrCmp $0 "" +2
 -;    RMDir /r "$2\Application Data\SecondLife\"
 -;Pop $0
 -;
 -;FunctionEnd
 -
 -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 -;;; Delete the installed shader files
 -;;; Since shaders are in active development, we'll likely need to shuffle them
 -;;; around a bit from build to build.  This ensures that shaders that we move
 -;;; or rename in the dev tree don't get left behind in the install.
 -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 -Function RemoveOldShaders
 -
 -;; Remove old shader files first so fallbacks will work. see DEV-5663
 -RMDir /r "$INSTDIR\app_settings\shaders\*"
 -
 -FunctionEnd
 -
 -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 -;;; Delete the installed XUI files
 -;;; We've changed the directory hierarchy for skins, putting all XUI and texture
 -;;; files under a specific skin directory, i.e. skins/default/xui/en-us as opposed
 -;;; to skins/xui/en-us.  Need to clean up the old path when upgrading
 -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 -Function RemoveOldXUI
 +# Remove old SecondLife.exe to invalidate any old shortcuts to it that may be in non-standard locations. See MAINT-3575
 +Delete "$INSTDIR\SecondLife.exe"
 -;; remove old XUI and texture files
 -RmDir /r "$INSTDIR\skins\html"
 -RmDir /r "$INSTDIR\skins\xui"
 -RmDir /r "$INSTDIR\skins\textures"
 -Delete "$INSTDIR\skins\*.txt"
 +# Remove old shader files first so fallbacks will work. See DEV-5663
 +RMDir /r "$INSTDIR\app_settings\shaders"
 -FunctionEnd
 -
 -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 -;;; Remove any releasenotes files.
 -;;; We are no longer including release notes with the viewer. This will delete
 -;;; any that were left behind by an older installer. Delete will not fail if
 -;;; the files do not exist
 -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 -Function RemoveOldReleaseNotes
 +# Remove skins folder to clean up files removed during development
 +RMDir /r "$INSTDIR\skins"
 -;; remove releasenotes.txt file from application directory, and the shortcut
 -;; from the start menu.
 +# We are no longer including release notes with the viewer, so remove them.
  Delete "$SMPROGRAMS\$INSTSHORTCUT\SL Release Notes.lnk"
  Delete "$INSTDIR\releasenotes.txt"
  FunctionEnd
 -
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 -; Delete files in Documents and Settings\<user>\SecondLife
 -; Delete files in Documents and Settings\All Users\SecondLife
 +;; Delete files in \Users\<User>\AppData\
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 -Function un.DocumentsAndSettingsFolder
 +Function un.UserSettingsFiles
 +
 +StrCmp $DO_UNINSTALL_V2 "true" Keep			# Don't remove user's settings files on auto upgrade
 -; Delete files in Documents and Settings\<user>\SecondLife
 +# Ask if user wants to keep data files or not
 +MessageBox MB_YESNO|MB_ICONQUESTION $(RemoveDataFilesMB) IDYES Remove IDNO Keep
 +
 +Remove:
  Push $0
  Push $1
  Push $2
 -  DetailPrint "Deleting files in Documents and Settings folder"
 +  DetailPrint "Deleting Second Life data files"
 -  StrCpy $0 0 ; Index number used to iterate via EnumRegKey
 +  StrCpy $0 0	# Index number used to iterate via EnumRegKey
    LOOP:
      EnumRegKey $1 HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList" $0
 -    StrCmp $1 "" DONE               ; no more users
 +    StrCmp $1 "" DONE               # No more users
      ReadRegStr $2 HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\$1" "ProfileImagePath" 
 -    StrCmp $2 "" CONTINUE 0         ; "ProfileImagePath" value is missing
 +    StrCmp $2 "" CONTINUE 0         # "ProfileImagePath" value is missing
 -    ; Required since ProfileImagePath is of type REG_EXPAND_SZ
 +# Required since ProfileImagePath is of type REG_EXPAND_SZ
      ExpandEnvStrings $2 $2
 -        ; Remove all cache and settings files but leave any other .txt files to preserve the chat logs
 -;    RMDir /r "$2\Application Data\SecondLife\logs"
 -    RMDir /r "$2\Application Data\SecondLife\browser_profile"
 -    RMDir /r "$2\Application Data\SecondLife\user_settings"
 -    Delete  "$2\Application Data\SecondLife\*.xml"
 -    Delete  "$2\Application Data\SecondLife\*.bmp"
 -    Delete  "$2\Application Data\SecondLife\search_history.txt"
 -    Delete  "$2\Application Data\SecondLife\plugin_cookies.txt"
 -    Delete  "$2\Application Data\SecondLife\typed_locations.txt"
 +# Delete files in \Users\<User>\AppData\Roaming\SecondLife
 +# Remove all settings files but leave any other .txt files to preserve the chat logs
 +;    RMDir /r "$2\AppData\Roaming\SecondLife\logs"
 +    RMDir /r "$2\AppData\Roaming\SecondLife\browser_profile"
 +    RMDir /r "$2\AppData\Roaming\SecondLife\user_settings"
 +    Delete  "$2\AppData\Roaming\SecondLife\*.xml"
 +    Delete  "$2\AppData\Roaming\SecondLife\*.bmp"
 +    Delete  "$2\AppData\Roaming\SecondLife\search_history.txt"
 +    Delete  "$2\AppData\Roaming\SecondLife\plugin_cookies.txt"
 +    Delete  "$2\AppData\Roaming\SecondLife\typed_locations.txt"
 +# Delete files in \Users\<User>\AppData\Local\SecondLife
 +    RmDir /r  "$2\AppData\Local\SecondLife"							#Delete the cache folder
    CONTINUE:
      IntOp $0 $0 + 1
 @@ -629,82 +617,30 @@ Pop $2  Pop $1
  Pop $0
 -; Delete files in Documents and Settings\All Users\SecondLife
 +# Delete files in ProgramData\Secondlife
  Push $0
    ReadRegStr $0 HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" "Common AppData"
    StrCmp $0 "" +2
    RMDir /r "$0\SecondLife"
  Pop $0
 -; Delete files in C:\Windows\Application Data\SecondLife
 -; If the user is running on a pre-NT system, Application Data lives here instead of
 -; in Documents and Settings.
 -RMDir /r "$WINDIR\Application Data\SecondLife"
 -
 -FunctionEnd
 -
 -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 -; Close the program, if running. Modifies no variables.
 -; Allows user to bail out of uninstall process.
 -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 -Function un.CloseSecondLife
 -  Push $0
 -  FindWindow $0 "Second Life" ""
 -  IntCmp $0 0 DONE
 -  MessageBox MB_OKCANCEL $(CloseSecondLifeUnInstMB) IDOK CLOSE IDCANCEL CANCEL_UNINSTALL
 -
 -  CANCEL_UNINSTALL:
 -    Quit
 -
 -  CLOSE:
 -    DetailPrint $(CloseSecondLifeUnInstDP)
 -    SendMessage $0 16 0 0
 -
 -  LOOP:
 -	  FindWindow $0 "Second Life" ""
 -	  IntCmp $0 0 DONE
 -	  Sleep 500
 -	  Goto LOOP
 -
 -  DONE:
 -    Pop $0
 -    Return
 -FunctionEnd
 -
 -
 -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 -;
 -;   Delete the stored password for the current Windows user
 -;   DEV-10821 -- Unauthorised user can gain access to an SL account after a real user has uninstalled
 -;
 -Function un.RemovePassword
 -
 -DetailPrint "Removing Second Life password"
 -
 -SetShellVarContext current
 -Delete "$APPDATA\SecondLife\user_settings\password.dat"
 -SetShellVarContext all
 +Keep:
  FunctionEnd
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 -;;; Delete the installed files
 -;;; This deletes the uninstall executable, but it works 
 -;;; because it is copied to temp directory before running
 -;;;
 -;;; Note:  You must list all files here, because we only
 -;;; want to delete our files, not things users left in the
 -;;; application directories.
 +;; Delete the installed files
 +;; This deletes the uninstall executable, but it works because it is copied to temp directory before running
 +;;
 +;; Note:  You must list all files here, because we only want to delete our files,
 +;; not things users left in the program directory.
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  Function un.ProgramFiles
 -;; Remove mozilla file first so recursive directory deletion doesn't get hung up
 -Delete "$INSTDIR\app_settings\mozilla\components"
 -
 -;; This placeholder is replaced by the complete list of files to uninstall by viewer_manifest.py
 +# This placeholder is replaced by the complete list of files to uninstall by viewer_manifest.py
  %%DELETE_FILES%%
 -;; Optional/obsolete files.  Delete won't fail if they don't exist.
 +# Optional/obsolete files.  Delete won't fail if they don't exist.
  Delete "$INSTDIR\dronesettings.ini"
  Delete "$INSTDIR\message_template.msg"
  Delete "$INSTDIR\newview.pdb"
 @@ -717,19 +653,12 @@ Delete "$INSTDIR\motions\*.lla"  Delete "$INSTDIR\trial\*.html"
  Delete "$INSTDIR\newview.exe"
  Delete "$INSTDIR\SecondLife.exe"
 -;; MAINT-3099 workaround - prevent these log files, if present, from causing a user alert
 +
 +# MAINT-3099 workaround - prevent these log files, if present, from causing a user alert
  Delete "$INSTDIR\VivoxVoiceService-*.log"
 -;; Remove entire help directory
 -Delete "$INSTDIR\help\Advanced\*"
 -RMDir  "$INSTDIR\help\Advanced"
 -Delete "$INSTDIR\help\basics\*"
 -RMDir  "$INSTDIR\help\basics"
 -Delete "$INSTDIR\help\Concepts\*"
 -RMDir  "$INSTDIR\help\Concepts"
 -Delete "$INSTDIR\help\welcome\*"
 -RMDir  "$INSTDIR\help\welcome"
 -Delete "$INSTDIR\help\*"
 -RMDir  "$INSTDIR\help"
 +
 +# Remove entire help directory
 +RMDir /r  "$INSTDIR\help"
  Delete "$INSTDIR\uninst.exe"
  RMDir "$INSTDIR"
 @@ -737,7 +666,7 @@ RMDir "$INSTDIR"  IfFileExists "$INSTDIR" FOLDERFOUND NOFOLDER
  FOLDERFOUND:
 -  ; Silent uninstall always removes all files (/SD IDYES)
 +# Silent uninstall always removes all files (/SD IDYES)
    MessageBox MB_YESNO $(DeleteProgramFilesMB) /SD IDYES IDNO NOFOLDER
    RMDir /r "$INSTDIR"
 @@ -746,240 +675,78 @@ NOFOLDER:  FunctionEnd
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 -;;; Uninstall settings
 -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 -UninstallText $(UninstallTextMsg)
 -ShowUninstDetails show
 -
 -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 -;;; Uninstall section
 +;; After install completes, launch app
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 -Section Uninstall
 -
 -; Start with some default values.
 -StrCpy $INSTPROG "${INSTNAME}"
 -StrCpy $INSTEXE "${INSTEXE}"
 -StrCpy $INSTSHORTCUT "${SHORTCUT}"
 -Call un.CheckIfAdministrator		; Make sure the user can install/uninstall
 -
 -; uninstall for all users (if you change this, change it in the install as well)
 -SetShellVarContext all			
 -
 -; Make sure we're not running
 -Call un.CloseSecondLife
 -
 -; Clean up registry keys and subkeys (these should all be !defines somewhere)
 -DeleteRegKey HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\$INSTPROG"
 -DeleteRegKey HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$INSTPROG"
 -
 -; Clean up shortcuts
 -Delete "$SMPROGRAMS\$INSTSHORTCUT\*.*"
 -RMDir  "$SMPROGRAMS\$INSTSHORTCUT"
 -
 -Delete "$DESKTOP\$INSTSHORTCUT.lnk"
 -Delete "$INSTDIR\$INSTSHORTCUT.lnk"
 -Delete "$INSTDIR\Uninstall $INSTSHORTCUT.lnk"
 -
 -; Clean up cache and log files.
 -; Leave them in-place for non AGNI installs.
 -
 -!ifdef UNINSTALL_SETTINGS
 -Call un.DocumentsAndSettingsFolder
 -!endif
 -
 -; remove stored password on uninstall
 -Call un.RemovePassword
 -
 -Call un.ProgramFiles
 +Function .onInstSuccess
 +Call CheckWindowsServPack		# Warn if not on the latest SP before asking to launch.
 +	Push $R0					# Option value, unused
 +	StrCmp $SKIP_AUTORUN "true" +2;
 +# Assumes SetOutPath $INSTDIR
 +	Exec '"$WINDIR\explorer.exe" "$INSTDIR\$INSTEXE"'
 +	Pop $R0
 -SectionEnd 				; end of uninstall section
 +FunctionEnd
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 -;;  Note: to add new languages, add a language file include to the list 
 -;;  at the top of this file, add an entry to the menu and then add an 
 -;;  entry to the language ID selector below
 +;; Recommend Upgrading to Service Pack 1 for Windows 7, if not present
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 -Function .onInit
 -Call CheckWindowsVersion		; Don't install On unsupported systems
 -    Push $0
 -    ${GetParameters} $COMMANDLINE              ; get our command line
 -
 -    ${GetOptions} $COMMANDLINE "/SKIP_DIALOGS" $0   
 -    IfErrors +2 0 ; If error jump past setting SKIP_DIALOGS
 -        StrCpy $SKIP_DIALOGS "true"
 -
 -	${GetOptions} $COMMANDLINE "/SKIP_AUTORUN" $0
 -    IfErrors +2 0 ; If error jump past setting SKIP_AUTORUN
 -		StrCpy $SKIP_AUTORUN "true"
 -
 -    ${GetOptions} $COMMANDLINE "/LANGID=" $0   ; /LANGID=1033 implies US English
 -
 -    ; If no language (error), then proceed
 -    IfErrors lbl_configure_default_lang
 -    ; No error means we got a language, so use it
 -    StrCpy $LANGUAGE $0
 -    Goto lbl_return
 -
 -lbl_configure_default_lang:
 -    ; If we currently have a version of SL installed, default to the language of that install
 -    ; Otherwise don't change $LANGUAGE and it will default to the OS UI language.
 -    ReadRegStr $0 HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\${INSTNAME}" "InstallerLanguage"
 -    IfErrors +2 0 ; If error skip the copy instruction 
 -	StrCpy $LANGUAGE $0
 -
 -    ; For silent installs, no language prompt, use default
 -    IfSilent lbl_return
 -    StrCmp $SKIP_DIALOGS "true" lbl_return
 -  
 -lbl_build_menu:
 -	Push ""
 -    # Use separate file so labels can be UTF-16 but we can still merge changes
 -    # into this ASCII file. JC
 -    !include "%%SOURCE%%\installers\windows\language_menu.nsi"
 -    
 -	Push A ; A means auto count languages for the auto count to work the first empty push (Push "") must remain
 -	LangDLL::LangDialog $(InstallerLanguageTitle) $(SelectInstallerLanguage)
 -	Pop $0
 -	StrCmp $0 "cancel" 0 +2
 -		Abort
 -    StrCpy $LANGUAGE $0
 -
 -	; save language in registry		
 -	WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\${INSTNAME}" "InstallerLanguage" $LANGUAGE
 -lbl_return:
 -    Pop $0
 +Function CheckWindowsServPack
 +  ${If} ${IsWin7}
 +  ${AndIfNot} ${IsServicePack} 1
 +    MessageBox MB_OK $(CheckWindowsServPackMB)
 +    DetailPrint $(UseLatestServPackDP)
      Return
 -FunctionEnd
 +  ${EndIf}
 -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 -Function un.onInit
 -	; read language from registry and set for uninstaller
 -    ; Key will be removed on successful uninstall
 -	ReadRegStr $0 HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\${INSTNAME}" "InstallerLanguage"
 -    IfErrors lbl_end
 -	StrCpy $LANGUAGE $0
 -lbl_end:
 +  ${If} ${IsWin2008R2}
 +  ${AndIfNot} ${IsServicePack} 1
 +    MessageBox MB_OK $(CheckWindowsServPackMB)
 +    DetailPrint $(UseLatestServPackDP)
      Return
 -FunctionEnd
 -
 -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 -;;; MAIN SECTION
 -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 -Section ""						; (default section)
 -
 -SetShellVarContext all			; install for all users (if you change this, change it in the uninstall as well)
 -
 -; Start with some default values.
 -StrCpy $INSTPROG "${INSTNAME}"
 -StrCpy $INSTEXE "${INSTEXE}"
 -StrCpy $INSTSHORTCUT "${SHORTCUT}"
 -
 -Call CheckCPUFlags				; Make sure we have SSE2 support
 -Call CheckIfAdministrator		; Make sure the user can install/uninstall
 -Call CheckIfAlreadyCurrent		; Make sure that we haven't already installed this version
 -Call CloseSecondLife			; Make sure we're not running
 -Call CheckNetworkConnection		; ping secondlife.com
 -Call CheckWillUninstallV2		; See if a V2 install exists and will be removed.
 -Call CheckOldExeName                    ; Clean up a previous version of the exe
 -
 -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 -StrCmp $DO_UNINSTALL_V2 "" PRESERVE_DONE
 -  Call PreserveUserFiles
 -PRESERVE_DONE:
 -
 -;;; Don't remove cache files during a regular install, removing the inventory cache on upgrades results in lots of damage to the servers.
 -;Call RemoveCacheFiles			; Installing over removes potentially corrupted
 -								; VFS and cache files.
 -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 -;;; Need to clean out shader files from previous installs to fix DEV-5663
 -Call RemoveOldShaders
 -
 -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 -;;; Need to clean out old XUI files that predate skinning
 -Call RemoveOldXUI
 -
 -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 -;;; Clear out old releasenotes.txt files. These are now on the public wiki.
 -Call RemoveOldReleaseNotes
 -
 -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 -;;; Files
 -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 -;; This placeholder is replaced by the complete list of all the files in the installer, by viewer_manifest.py
 -%%INSTALL_FILES%%
 -
 -# Pass the installer's language to the client to use as a default
 -StrCpy $SHORTCUT_LANG_PARAM "--set InstallLanguage $(LanguageCode)"
 -
 -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 -; Shortcuts in start menu
 -CreateDirectory	"$SMPROGRAMS\$INSTSHORTCUT"
 -SetOutPath "$INSTDIR"
 -CreateShortCut	"$SMPROGRAMS\$INSTSHORTCUT\$INSTSHORTCUT.lnk" \
 -				"$INSTDIR\$INSTEXE" "$SHORTCUT_LANG_PARAM"
 -
 -
 -WriteINIStr		"$SMPROGRAMS\$INSTSHORTCUT\SL Create Account.url" \
 -				"InternetShortcut" "URL" \
 -				"http://join.secondlife.com/"
 -WriteINIStr		"$SMPROGRAMS\$INSTSHORTCUT\SL Your Account.url" \
 -				"InternetShortcut" "URL" \
 -				"http://www.secondlife.com/account/"
 -WriteINIStr		"$SMPROGRAMS\$INSTSHORTCUT\SL Scripting Language Help.url" \
 -				"InternetShortcut" "URL" \
 -                "http://wiki.secondlife.com/wiki/LSL_Portal"
 -CreateShortCut	"$SMPROGRAMS\$INSTSHORTCUT\Uninstall $INSTSHORTCUT.lnk" \
 -				'"$INSTDIR\uninst.exe"' ''
 -
 -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 -; Other shortcuts
 -SetOutPath "$INSTDIR"
 -CreateShortCut "$DESKTOP\$INSTSHORTCUT.lnk" \
 -        "$INSTDIR\$INSTEXE" "$SHORTCUT_LANG_PARAM"
 -CreateShortCut "$INSTDIR\$INSTSHORTCUT.lnk" \
 -        "$INSTDIR\$INSTEXE" "$SHORTCUT_LANG_PARAM"
 -CreateShortCut "$INSTDIR\Uninstall $INSTSHORTCUT.lnk" \
 -				'"$INSTDIR\uninst.exe"' ''
 +  ${EndIf}
 +FunctionEnd
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 -; Write registry
 -WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\$INSTPROG" "" "$INSTDIR"
 -WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\$INSTPROG" "Version" "${VERSION_LONG}"
 -WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\$INSTPROG" "Shortcut" "$INSTSHORTCUT"
 -WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\$INSTPROG" "Exe" "$INSTEXE"
 -WriteRegStr HKEY_LOCAL_MACHINE "Software\Microsoft\Windows\CurrentVersion\Uninstall\$INSTPROG" "DisplayName" "$INSTPROG (remove only)"
 -WriteRegStr HKEY_LOCAL_MACHINE "Software\Microsoft\Windows\CurrentVersion\Uninstall\$INSTPROG" "UninstallString" '"$INSTDIR\uninst.exe"'
 -
 +;; Clobber user files - TEST ONLY
 +;; This is here for testing, DO NOT USE UNLESS YOU KNOW WHAT YOU ARE TESTING FOR!
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 -; Write URL registry info
 -WriteRegStr HKEY_CLASSES_ROOT "${URLNAME}" "(default)" "URL:Second Life"
 -WriteRegStr HKEY_CLASSES_ROOT "${URLNAME}" "URL Protocol" ""
 -WriteRegStr HKEY_CLASSES_ROOT "${URLNAME}\DefaultIcon" "" '"$INSTDIR\$INSTEXE"'
 -;; URL param must be last item passed to viewer, it ignores subsequent params
 -;; to avoid parameter injection attacks.
 -WriteRegExpandStr HKEY_CLASSES_ROOT "${URLNAME}\shell\open\command" "" '"$INSTDIR\$INSTEXE" -url "%1"'
 -WriteRegStr HKEY_CLASSES_ROOT "x-grid-location-info"(default)" "URL:Second Life"
 -WriteRegStr HKEY_CLASSES_ROOT "x-grid-location-info" "URL Protocol" ""
 -WriteRegStr HKEY_CLASSES_ROOT "x-grid-location-info\DefaultIcon" "" '"$INSTDIR\$INSTEXE"'
 -;; URL param must be last item passed to viewer, it ignores subsequent params
 -;; to avoid parameter injection attacks.
 -WriteRegExpandStr HKEY_CLASSES_ROOT "x-grid-location-info\shell\open\command" "" '"$INSTDIR\$INSTEXE" -url "%1"'
 -
 -; write out uninstaller
 -WriteUninstaller "$INSTDIR\uninst.exe"
 -
 -; Uninstall existing "Second Life Viewer 2" install if needed.
 -StrCmp $DO_UNINSTALL_V2 "" REMOVE_SLV2_DONE
 -  ExecWait '"$PROGRAMFILES\SecondLifeViewer2\uninst.exe" /S _?=$PROGRAMFILES\SecondLifeViewer2'
 -  Delete "$PROGRAMFILES\SecondLifeViewer2\uninst.exe" ; with _? option above, uninst.exe will be left behind.
 -  RMDir "$PROGRAMFILES\SecondLifeViewer2" ; will remove only if empty.
 -
 -  Call RestoreUserFiles
 -  Call RemoveTempUserFiles
 -REMOVE_SLV2_DONE:
 +;Function ClobberUserFilesTESTONLY
 -; end of default section
 -SectionEnd
 +;Push $0
 +;Push $1
 +;Push $2
 +;
 +;    StrCpy $0 0	# Index number used to iterate via EnumRegKey
 +;
 +;  LOOP:
 +;    EnumRegKey $1 HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList" $0
 +;    StrCmp $1 "" DONE               # no more users
 +;
 +;    ReadRegStr $2 HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\$1" "ProfileImagePath"
 +;    StrCmp $2 "" CONTINUE 0         # "ProfileImagePath" value is missing
 +;
 +;# Required since ProfileImagePath is of type REG_EXPAND_SZ
 +;    ExpandEnvStrings $2 $2
 +;
 +;    RMDir /r "$2\Application Data\SecondLife\"
 +;
 +;  CONTINUE:
 +;    IntOp $0 $0 + 1
 +;    Goto LOOP
 +;  DONE:
 +;
 +;Pop $2
 +;Pop $1
 +;Pop $0
 +;
 +;# Copy files in Documents and Settings\All Users\SecondLife
 +;Push $0
 +;    ReadRegStr $0 HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" "Common AppData"
 +;    StrCmp $0 "" +2
 +;    RMDir /r "$2\Application Data\SecondLife\"
 +;Pop $0
 +;
 +;FunctionEnd
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; EOF  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 diff --git a/indra/newview/installers/windows/lang_da.nsi b/indra/newview/installers/windows/lang_da.nsi Binary files differindex 2352649b4b..83e1a3ea94 100755 --- a/indra/newview/installers/windows/lang_da.nsi +++ b/indra/newview/installers/windows/lang_da.nsi diff --git a/indra/newview/installers/windows/lang_de.nsi b/indra/newview/installers/windows/lang_de.nsi Binary files differindex 397262afe1..866accae99 100755 --- a/indra/newview/installers/windows/lang_de.nsi +++ b/indra/newview/installers/windows/lang_de.nsi diff --git a/indra/newview/installers/windows/lang_en-us.nsi b/indra/newview/installers/windows/lang_en-us.nsi Binary files differindex df0d55d9e0..343c312ddc 100755 --- a/indra/newview/installers/windows/lang_en-us.nsi +++ b/indra/newview/installers/windows/lang_en-us.nsi diff --git a/indra/newview/installers/windows/lang_es.nsi b/indra/newview/installers/windows/lang_es.nsi Binary files differindex 32967a0dfa..f4f0786332 100755 --- a/indra/newview/installers/windows/lang_es.nsi +++ b/indra/newview/installers/windows/lang_es.nsi diff --git a/indra/newview/installers/windows/lang_fr.nsi b/indra/newview/installers/windows/lang_fr.nsi Binary files differindex 7c75e25360..1b5dbfc975 100755 --- a/indra/newview/installers/windows/lang_fr.nsi +++ b/indra/newview/installers/windows/lang_fr.nsi diff --git a/indra/newview/installers/windows/lang_it.nsi b/indra/newview/installers/windows/lang_it.nsi Binary files differindex ce66b61f9f..a456e6e417 100755 --- a/indra/newview/installers/windows/lang_it.nsi +++ b/indra/newview/installers/windows/lang_it.nsi diff --git a/indra/newview/installers/windows/lang_ja.nsi b/indra/newview/installers/windows/lang_ja.nsi Binary files differindex e68830123a..5b1c5f4ce9 100755 --- a/indra/newview/installers/windows/lang_ja.nsi +++ b/indra/newview/installers/windows/lang_ja.nsi diff --git a/indra/newview/installers/windows/lang_pl.nsi b/indra/newview/installers/windows/lang_pl.nsi Binary files differindex 7883819190..a172f0cdeb 100755 --- a/indra/newview/installers/windows/lang_pl.nsi +++ b/indra/newview/installers/windows/lang_pl.nsi diff --git a/indra/newview/installers/windows/lang_pt-br.nsi b/indra/newview/installers/windows/lang_pt-br.nsi Binary files differindex eb3fb2386c..9ef252d232 100755 --- a/indra/newview/installers/windows/lang_pt-br.nsi +++ b/indra/newview/installers/windows/lang_pt-br.nsi diff --git a/indra/newview/installers/windows/lang_ru.nsi b/indra/newview/installers/windows/lang_ru.nsi Binary files differindex 3b0042fbf5..d7c728d3e2 100755 --- a/indra/newview/installers/windows/lang_ru.nsi +++ b/indra/newview/installers/windows/lang_ru.nsi diff --git a/indra/newview/installers/windows/lang_tr.nsi b/indra/newview/installers/windows/lang_tr.nsi Binary files differindex b9be1eab08..97c602f4fc 100755 --- a/indra/newview/installers/windows/lang_tr.nsi +++ b/indra/newview/installers/windows/lang_tr.nsi diff --git a/indra/newview/installers/windows/lang_zh.nsi b/indra/newview/installers/windows/lang_zh.nsi Binary files differindex 3c6f6fd289..39c005a683 100755 --- a/indra/newview/installers/windows/lang_zh.nsi +++ b/indra/newview/installers/windows/lang_zh.nsi diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp index 2047171e25..4ccb8f23cd 100755 --- a/indra/newview/llfloaterpreference.cpp +++ b/indra/newview/llfloaterpreference.cpp @@ -697,13 +697,13 @@ void LLFloaterPreference::onOpen(const LLSD& key)  				maturity_list->deleteItems(LLSD(SIM_ACCESS_ADULT));  			}  		} -		getChildView("maturity_desired_combobox")->setVisible( true); +		getChildView("maturity_desired_combobox")->setEnabled( true);  		getChildView("maturity_desired_textbox")->setVisible( false);  	}  	else  	{  		getChild<LLUICtrl>("maturity_desired_textbox")->setValue(maturity_combo->getSelectedItemLabel()); -		getChildView("maturity_desired_combobox")->setVisible( false); +		getChildView("maturity_desired_combobox")->setEnabled( false);  	}  	// Forget previous language changes. @@ -2007,6 +2007,12 @@ void LLPanelPreference::cancel()  	{  		LLControlVariable* control = iter->first;  		LLSD ctrl_value = iter->second; + +		if((control->getName() == "InstantMessageLogPath") && (ctrl_value.asString() == "")) +		{ +			continue; +		} +  		control->set(ctrl_value);  	} diff --git a/indra/newview/llfloatersnapshot.cpp b/indra/newview/llfloatersnapshot.cpp index 971da74158..dbc643881e 100755 --- a/indra/newview/llfloatersnapshot.cpp +++ b/indra/newview/llfloatersnapshot.cpp @@ -383,12 +383,20 @@ void LLFloaterSnapshot::Impl::updateControls(LLFloaterSnapshot* floater)  			S32 w = gViewerWindow->getWindowWidthRaw();  			LL_DEBUGS() << "Initializing width spinner (" << width_ctrl->getName() << "): " << w << LL_ENDL;  			width_ctrl->setValue(w); +			if(getActiveSnapshotType(floater) == LLSnapshotLivePreview::SNAPSHOT_TEXTURE) +			{ +				width_ctrl->setIncrement(w >> 1); +			}  		}  		if (height_ctrl->getValue().asInteger() == 0)  		{  			S32 h = gViewerWindow->getWindowHeightRaw();  			LL_DEBUGS() << "Initializing height spinner (" << height_ctrl->getName() << "): " << h << LL_ENDL;  			height_ctrl->setValue(h); +			if(getActiveSnapshotType(floater) == LLSnapshotLivePreview::SNAPSHOT_TEXTURE) +			{ +				height_ctrl->setIncrement(h >> 1); +			}  		}  		// Clamp snapshot resolution to window size when showing UI or HUD in snapshot. @@ -823,6 +831,11 @@ void LLFloaterSnapshot::Impl::updateResolution(LLUICtrl* ctrl, void* data, BOOL  		{  			getWidthSpinner(view)->setValue(width);  			getHeightSpinner(view)->setValue(height); +			if (getActiveSnapshotType(view) == LLSnapshotLivePreview::SNAPSHOT_TEXTURE) +			{ +				getWidthSpinner(view)->setIncrement(width >> 1); +				getHeightSpinner(view)->setIncrement(height >> 1); +			}  		}  		if(original_width != width || original_height != height) @@ -942,6 +955,11 @@ void LLFloaterSnapshot::Impl::setImageSizeSpinnersValues(LLFloaterSnapshot *view  {  	getWidthSpinner(view)->forceSetValue(width);  	getHeightSpinner(view)->forceSetValue(height); +	if (getActiveSnapshotType(view) == LLSnapshotLivePreview::SNAPSHOT_TEXTURE) +	{ +		getWidthSpinner(view)->setIncrement(width >> 1); +		getHeightSpinner(view)->setIncrement(height >> 1); +	}  }  // static diff --git a/indra/newview/llhudeffectlookat.cpp b/indra/newview/llhudeffectlookat.cpp index f3a48625a4..73120a0242 100755 --- a/indra/newview/llhudeffectlookat.cpp +++ b/indra/newview/llhudeffectlookat.cpp @@ -39,8 +39,6 @@  #include "llrendersphere.h"  #include "llselectmgr.h"  #include "llglheaders.h" - -  #include "llxmltree.h" diff --git a/indra/newview/llmanipscale.cpp b/indra/newview/llmanipscale.cpp index ed833cba53..407613d32c 100755 --- a/indra/newview/llmanipscale.cpp +++ b/indra/newview/llmanipscale.cpp @@ -85,7 +85,6 @@ const LLManip::EManipPart MANIPULATOR_IDS[LLManipScale::NUM_MANIPULATORS] =  	LLManip::LL_FACE_NEGZ  }; -  F32 get_default_max_prim_scale(bool is_flora)  {  	// a bit of a hack, but if it's foilage, we don't want to use the @@ -290,10 +289,6 @@ void LLManipScale::render()  				LLGLEnable poly_offset(GL_POLYGON_OFFSET_FILL);  				glPolygonOffset( -2.f, -2.f); -				// JC - Band-aid until edge stretch working similar to side stretch -				// in non-uniform. -				// renderEdges( bbox ); -  				renderCorners( bbox );  				renderFaces( bbox ); @@ -350,6 +345,10 @@ BOOL LLManipScale::handleMouseDownOnPart( S32 x, S32 y, MASK mask )  	updateSnapGuides(bbox); +	mFirstClickX = x; +	mFirstClickY = y; +	mIsFirstClick = true; +  	mDragStartPointGlobal = gAgent.getPosGlobalFromAgent(box_corner_agent);  	mDragStartCenterGlobal = gAgent.getPosGlobalFromAgent(box_center_agent);  	LLVector3 far_corner_agent = bbox.localToAgent( unitVectorToLocalBBoxExtent( -1.f * partToUnitVector( mManipPart ), bbox ) ); @@ -413,7 +412,15 @@ BOOL LLManipScale::handleHover(S32 x, S32 y, MASK mask)  		}  		else  		{ -			drag( x, y ); +			if((mFirstClickX != x) || (mFirstClickY != y)) +			{ +				mIsFirstClick = false; +			} + +			if(!mIsFirstClick) +			{ +				drag( x, y ); +			}  		}  		LL_DEBUGS("UserInput") << "hover handled by LLManipScale (active)" << LL_ENDL;		  	} @@ -679,63 +686,38 @@ void LLManipScale::renderFaces( const LLBBox& bbox )  			{  			  case 0:  				conditionalHighlight( LL_FACE_POSZ, &z_highlight_color, &z_normal_color ); -				renderAxisHandle( LL_FACE_POSZ, ctr, LLVector3( ctr.mV[VX], ctr.mV[VY], max.mV[VZ] ) ); +				renderAxisHandle( 8, ctr, LLVector3( ctr.mV[VX], ctr.mV[VY], max.mV[VZ] ) );  				break;  			  case 1:  				conditionalHighlight( LL_FACE_POSX, &x_highlight_color, &x_normal_color ); -				renderAxisHandle( LL_FACE_POSX, ctr, LLVector3( max.mV[VX], ctr.mV[VY], ctr.mV[VZ] ) ); +				renderAxisHandle( 9, ctr, LLVector3( max.mV[VX], ctr.mV[VY], ctr.mV[VZ] ) );  				break;  			  case 2:  				conditionalHighlight( LL_FACE_POSY, &y_highlight_color, &y_normal_color ); -				renderAxisHandle( LL_FACE_POSY, ctr, LLVector3( ctr.mV[VX], max.mV[VY], ctr.mV[VZ] ) ); +				renderAxisHandle( 10, ctr, LLVector3( ctr.mV[VX], max.mV[VY], ctr.mV[VZ] ) );  				break;  			  case 3:  				conditionalHighlight( LL_FACE_NEGX, &x_highlight_color, &x_normal_color ); -				renderAxisHandle( LL_FACE_NEGX, ctr, LLVector3( min.mV[VX], ctr.mV[VY], ctr.mV[VZ] ) ); +				renderAxisHandle( 11, ctr, LLVector3( min.mV[VX], ctr.mV[VY], ctr.mV[VZ] ) );  				break;  			  case 4:  				conditionalHighlight( LL_FACE_NEGY, &y_highlight_color, &y_normal_color ); -				renderAxisHandle( LL_FACE_NEGY, ctr, LLVector3( ctr.mV[VX], min.mV[VY], ctr.mV[VZ] ) ); +				renderAxisHandle( 12, ctr, LLVector3( ctr.mV[VX], min.mV[VY], ctr.mV[VZ] ) );  				break;  			  case 5:  				conditionalHighlight( LL_FACE_NEGZ, &z_highlight_color, &z_normal_color ); -				renderAxisHandle( LL_FACE_NEGZ, ctr, LLVector3( ctr.mV[VX], ctr.mV[VY], min.mV[VZ] ) ); +				renderAxisHandle( 13, ctr, LLVector3( ctr.mV[VX], ctr.mV[VY], min.mV[VZ] ) );  				break;  			}  		}  	}  } -void LLManipScale::renderEdges( const LLBBox& bbox ) -{ -	LLVector3 extent = bbox.getExtentLocal(); - -	for( U32 part = LL_EDGE_MIN; part <= LL_EDGE_MAX; part++ ) -	{ -		F32 edge_width = mBoxHandleSize[part] * .6f; -		LLVector3 direction = edgeToUnitVector( part ); -		LLVector3 center_to_edge = unitVectorToLocalBBoxExtent( direction, bbox ); - -		gGL.pushMatrix(); -		{ -			gGL.translatef( center_to_edge.mV[0], center_to_edge.mV[1], center_to_edge.mV[2] ); -			conditionalHighlight( part ); -			gGL.scalef( -				direction.mV[0] ? edge_width : extent.mV[VX], -				direction.mV[1] ? edge_width : extent.mV[VY], -				direction.mV[2] ? edge_width : extent.mV[VZ] ); -			gBox.render(); -		} -		gGL.popMatrix(); -	} -} - -  void LLManipScale::renderCorners( const LLBBox& bbox )  {  	U32 part = LL_CORNER_NNN; @@ -778,14 +760,14 @@ void LLManipScale::renderBoxHandle( F32 x, F32 y, F32 z )  } -void LLManipScale::renderAxisHandle( U32 part, const LLVector3& start, const LLVector3& end ) +void LLManipScale::renderAxisHandle( U32 handle_index, const LLVector3& start, const LLVector3& end )  {  	if( getShowAxes() )  	{  		// Draws a single "jacks" style handle: a long, retangular box from start to end.  		LLVector3 offset_start = end - start;  		offset_start.normalize(); -		offset_start = start + mBoxHandleSize[part] * offset_start; +		offset_start = start + mBoxHandleSize[handle_index] * offset_start;  		LLVector3 delta = end - offset_start;  		LLVector3 pos = offset_start + 0.5f * delta; @@ -794,9 +776,9 @@ void LLManipScale::renderAxisHandle( U32 part, const LLVector3& start, const LLV  		{  			gGL.translatef( pos.mV[VX], pos.mV[VY], pos.mV[VZ] );  			gGL.scalef( -				mBoxHandleSize[part] + llabs(delta.mV[VX]), -				mBoxHandleSize[part] + llabs(delta.mV[VY]), -				mBoxHandleSize[part] + llabs(delta.mV[VZ])); +				mBoxHandleSize[handle_index] + llabs(delta.mV[VX]), +				mBoxHandleSize[handle_index] + llabs(delta.mV[VY]), +				mBoxHandleSize[handle_index] + llabs(delta.mV[VZ]));  			gBox.render();  		}  		gGL.popMatrix(); diff --git a/indra/newview/llmanipscale.h b/indra/newview/llmanipscale.h index 7cc3c99810..11ade9b7d0 100755 --- a/indra/newview/llmanipscale.h +++ b/indra/newview/llmanipscale.h @@ -96,7 +96,6 @@ public:  private:  	void			renderCorners( const LLBBox& local_bbox );  	void			renderFaces( const LLBBox& local_bbox ); -	void			renderEdges( const LLBBox& local_bbox );  	void			renderBoxHandle( F32 x, F32 y, F32 z );  	void			renderAxisHandle( U32 part, const LLVector3& start, const LLVector3& end );  	void			renderGuidelinesPart( const LLBBox& local_bbox ); @@ -172,6 +171,9 @@ private:  	ESnapRegimes	mSnapRegime; //<! Which, if any, snap regime the cursor is currently residing in.  	F32				mManipulatorScales[NUM_MANIPULATORS];  	F32				mBoxHandleSize[NUM_MANIPULATORS];		// The size of the handles at the corners of the bounding box +	S32				mFirstClickX; +	S32				mFirstClickY; +	bool			mIsFirstClick;  };  #endif  // LL_MANIPSCALE_H diff --git a/indra/newview/llpanelgrouplandmoney.cpp b/indra/newview/llpanelgrouplandmoney.cpp index 7f82eecdb0..a2e136bd5a 100755 --- a/indra/newview/llpanelgrouplandmoney.cpp +++ b/indra/newview/llpanelgrouplandmoney.cpp @@ -421,20 +421,51 @@ void LLPanelGroupLandMoney::impl::processGroupLand(LLMessageSystem* msg)  		msg->getUUID("QueryData", "OwnerID", owner_id, 0);  		msg->getUUID("TransactionData", "TransactionID", trans_id); -		S32 total_contribution = 0;  		if(owner_id.isNull())  		{  			// special block which has total contribution  			++first_block; +			S32 committed = 0; +			S32 billable_area = 0; + +			if(count == 1) +			{ +				msg->getS32("QueryData", "BillableArea", committed, 0); +			} +			else +			{ +				for(S32 i = first_block; i < count; ++i) +				{ +					msg->getS32("QueryData", "BillableArea", billable_area, i); +					committed+=billable_area; +				} +			} + +			S32 total_contribution;  			msg->getS32("QueryData", "ActualArea", total_contribution, 0);  			mPanel.getChild<LLUICtrl>("total_contributed_land_value")->setTextArg("[AREA]", llformat("%d", total_contribution)); + +			mPanel.getChild<LLUICtrl>("total_land_in_use_value")->setTextArg("[AREA]", llformat("%d", committed)); +			S32 available = total_contribution - committed; +			mPanel.getChild<LLUICtrl>("land_available_value")->setTextArg("[AREA]", llformat("%d", available)); + + +			if ( mGroupOverLimitTextp && mGroupOverLimitIconp ) + +			{ +				mGroupOverLimitIconp->setVisible(available < 0); +				mGroupOverLimitTextp->setVisible(available < 0); +			} +  		}  		if ( trans_id != mTransID ) return; +  		// This power was removed to make group roles simpler  		//if ( !gAgent.hasPowerInGroup(mGroupID, GP_LAND_VIEW_OWNED) ) return;  		if (!gAgent.isInGroup(mPanel.mGroupID)) return; +  		mGroupParcelsp->setCommentText(mEmptyParcelsText);  		std::string name; @@ -447,7 +478,6 @@ void LLPanelGroupLandMoney::impl::processGroupLand(LLMessageSystem* msg)  		std::string sim_name;  		std::string land_sku;  		std::string land_type; -		S32 committed = 0;  		for(S32 i = first_block; i < count; ++i)  		{ @@ -477,7 +507,6 @@ void LLPanelGroupLandMoney::impl::processGroupLand(LLMessageSystem* msg)  			S32 region_y = ll_round(global_y) % REGION_WIDTH_UNITS;  			std::string location = sim_name + llformat(" (%d, %d)", region_x, region_y);  			std::string area; -			committed+=billable_area;  			if(billable_area == actual_area) @@ -516,16 +545,6 @@ void LLPanelGroupLandMoney::impl::processGroupLand(LLMessageSystem* msg)  			mGroupParcelsp->addElement(row);  		} - -		mPanel.getChild<LLUICtrl>("total_land_in_use_value")->setTextArg("[AREA]", llformat("%d", committed)); - -		S32 available = total_contribution - committed; -		mPanel.getChild<LLUICtrl>("land_available_value")->setTextArg("[AREA]", llformat("%d", available)); -		if ( mGroupOverLimitTextp && mGroupOverLimitIconp ) -		{ -			mGroupOverLimitIconp->setVisible(available < 0); -			mGroupOverLimitTextp->setVisible(available < 0); -		}  	}  } diff --git a/indra/newview/llpanellogin.cpp b/indra/newview/llpanellogin.cpp index dd61929f35..89c898001f 100755 --- a/indra/newview/llpanellogin.cpp +++ b/indra/newview/llpanellogin.cpp @@ -172,7 +172,6 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect,  	mUsernameLength(0),  	mPasswordLength(0),  	mLocationLength(0), -	mFavoriteSelected(false),  	mShowFavorites(false)  {  	setBackgroundVisible(FALSE); @@ -193,7 +192,7 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect,  	}  	else  	{ -	buildFromFile( "panel_login.xml"); +		buildFromFile( "panel_login.xml");  	}  	reshape(rect.getWidth(), rect.getHeight()); @@ -201,22 +200,18 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect,  	LLLineEditor* password_edit(getChild<LLLineEditor>("password_edit"));  	password_edit->setKeystrokeCallback(onPassKey, this);  	// STEAM-14: When user presses Enter with this field in focus, initiate login -	password_edit->setCommitCallback(boost::bind(&LLPanelLogin::onClickConnectLast, this)); +	password_edit->setCommitCallback(boost::bind(&LLPanelLogin::onClickConnect, this));  	// change z sort of clickable text to be behind buttons  	sendChildToBack(getChildView("forgot_password_text"));  	LLComboBox* favorites_combo = getChild<LLComboBox>("start_location_combo");  	updateLocationSelectorsVisibility(); // separate so that it can be called from preferences +	favorites_combo->setReturnCallback(boost::bind(&LLPanelLogin::onClickConnect, this));  	favorites_combo->setFocusLostCallback(boost::bind(&LLPanelLogin::onLocationSLURL, this)); -	favorites_combo->setCommitCallback(boost::bind(&LLPanelLogin::onSelectFavorite, this));  	LLComboBox* server_choice_combo = getChild<LLComboBox>("server_combo");  	server_choice_combo->setCommitCallback(boost::bind(&LLPanelLogin::onSelectServer, this)); - -	LLLineEditor* location_edit = sInstance->getChild<LLLineEditor>("location_edit"); -	location_edit->setKeystrokeCallback(boost::bind(&LLPanelLogin::onLocationEditChanged, this, _1), NULL); -	location_edit->setCommitCallback(boost::bind(&LLPanelLogin::onClickConnectLocation, this));  	// Load all of the grids, sorted, and then add a bar and the current grid at the top  	server_choice_combo->removeall(); @@ -264,9 +259,7 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect,  		LLPanelLogin::onUpdateStartSLURL(start_slurl); // updates grid if needed  	} -	childSetAction("connect_btn", onClickConnectLast, this); -	childSetAction("connect_favorite_btn", onClickConnectFavorite, this); -	childSetAction("connect_location_btn", onClickConnectLocation, this); +	childSetAction("connect_btn", onClickConnect, this);  	LLButton* def_btn = getChild<LLButton>("connect_btn");  	setDefaultBtn(def_btn); @@ -288,45 +281,19 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect,  	loadLoginPage(); -	// Show last logged in user favorites in "Start at" combo. -	addUsersWithFavoritesToUsername();  	LLComboBox* username_combo(getChild<LLComboBox>("username_combo"));  	username_combo->setTextChangedCallback(boost::bind(&LLPanelLogin::addFavoritesToStartLocation, this));  	// STEAM-14: When user presses Enter with this field in focus, initiate login  	username_combo->setCommitCallback(boost::bind(&LLPanelLogin::onClickConnect, this));  } -void LLPanelLogin::addUsersWithFavoritesToUsername() -{ -	LLComboBox* combo = getChild<LLComboBox>("username_combo"); -	if (!combo) return; -	std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "stored_favorites_" + LLGridManager::getInstance()->getGrid() + ".xml"); -	std::string old_filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "stored_favorites.xml"); -	LLSD fav_llsd; -	llifstream file; -	file.open(filename); -	if (!file.is_open()) -	{ -		file.open(old_filename); -		if (!file.is_open()) return; -	} -	LLSDSerialize::fromXML(fav_llsd, file); -	for (LLSD::map_const_iterator iter = fav_llsd.beginMap(); -		iter != fav_llsd.endMap(); ++iter) -	{ -		combo->add(iter->first); -		mUsernameLength = iter->first.length(); -		updateLoginButtons(); -	} -} -  void LLPanelLogin::addFavoritesToStartLocation()  {  	// Clear the combo.  	LLComboBox* combo = getChild<LLComboBox>("start_location_combo");  	if (!combo) return;  	int num_items = combo->getItemCount(); -	for (int i = num_items - 1; i > 0; i--) +	for (int i = num_items - 1; i > 1; i--)  	{  		combo->remove(i);  	} @@ -374,6 +341,10 @@ void LLPanelLogin::addFavoritesToStartLocation()  			{  				mShowFavorites = true;  				combo->add(label, value); +				if ( LLStartUp::getStartSLURL().getSLURLString() == value) +				{ +					combo->selectByValue(value); +				}  			}  		}  		break; @@ -688,7 +659,6 @@ void LLPanelLogin::onUpdateStartSLURL(const LLSLURL& new_start_slurl)  	LL_DEBUGS("AppInit")<<new_start_slurl.asString()<<LL_ENDL;  	LLComboBox* location_combo = sInstance->getChild<LLComboBox>("start_location_combo"); -	LLLineEditor* location_edit = sInstance->getChild<LLLineEditor>("location_edit");  	/*  	 * Determine whether or not the new_start_slurl modifies the grid.  	 * @@ -720,7 +690,10 @@ void LLPanelLogin::onUpdateStartSLURL(const LLSLURL& new_start_slurl)  			}  			if ( new_start_slurl.getLocationString().length() )  			{ -				location_edit->setValue(new_start_slurl.getLocationString()); +				if (location_combo->getCurrentIndex() == -1) +				{ +					location_combo->setLabel(new_start_slurl.getLocationString()); +				}  				sInstance->mLocationLength = new_start_slurl.getLocationString().length();  				sInstance->updateLoginButtons();  			} @@ -859,33 +832,6 @@ void LLPanelLogin::handleMediaEvent(LLPluginClassMedia* /*self*/, EMediaEvent ev  // Protected methods  //---------------------------------------------------------------------------  // static -void LLPanelLogin::onClickConnectLast(void *) -{ -	std::string location = LLSLURL::SIM_LOCATION_LAST; -	LLStartUp::setStartSLURL(location); - -	void* unused_parameter = 0; -	LLPanelLogin::sInstance->onClickConnect(unused_parameter); -} - -void LLPanelLogin::onClickConnectFavorite(void *) -{ -	LLPanelLogin::sInstance->onLocationSLURL(); - -	void* unused_parameter = 0; -	LLPanelLogin::sInstance->onClickConnect(unused_parameter); -} - -void LLPanelLogin::onClickConnectLocation(void *) -{ -	std::string location = sInstance->getChild<LLUICtrl>("location_edit")->getValue().asString(); -	LLStartUp::setStartSLURL(location); - -	void* unused_parameter = 0; -	LLPanelLogin::sInstance->onClickConnect(unused_parameter); -} - -// static  void LLPanelLogin::onClickConnect(void *)  {  	if (sInstance && sInstance->mCallback) @@ -1033,60 +979,9 @@ void LLPanelLogin::updateServer()  void LLPanelLogin::updateLoginButtons()  { -	LLButton* last_login_btn = getChild<LLButton>("connect_btn"); -	LLButton* loc_btn = getChild<LLButton>("connect_location_btn"); -	LLButton* fav_btn = getChild<LLButton>("connect_favorite_btn"); - -	// no username or no password - turn all buttons off -	if ( mUsernameLength == 0 || mPasswordLength == 0 ) -	{ -		last_login_btn->setEnabled(false); -		loc_btn->setEnabled(false); -		fav_btn->setEnabled(false); -	}; - -	// we have a username and a password -	if ( mUsernameLength != 0 && mPasswordLength != 0 ) -	{ -		// last login button always enabled for this case -		last_login_btn->setEnabled(true); - -		// double check status of favorites combo (must be items there and one must be selected to enable button) -		LLComboBox* favorites_combo = getChild<LLComboBox>("start_location_combo"); -		int num_items = favorites_combo->getItemCount(); -		int selected_index = favorites_combo->getCurrentIndex(); -		if ( num_items > 0 && selected_index >=0 ) -			mFavoriteSelected = true; -		else -			mFavoriteSelected = false; +	LLButton* login_btn = getChild<LLButton>("connect_btn"); -		// only turn on favorites login button if one is selected -		fav_btn->setEnabled( mFavoriteSelected ); - -		// only enable location login if there is content there -		if ( mLocationLength > 0 ) -			loc_btn->setEnabled(true); -		else -			loc_btn->setEnabled(false); -	} -} - -void LLPanelLogin::onLocationEditChanged(LLUICtrl* ctrl) -{ -	LLLineEditor* self = (LLLineEditor*)ctrl; -	if (self ) -	{ -		mLocationLength = self->getText().length(); -		updateLoginButtons(); -	} -} - -void LLPanelLogin::onSelectFavorite() -{ -	// no way to unselect a favorite once it's selected (i think) -	mFavoriteSelected = true; - -	updateLoginButtons(); +	login_btn->setEnabled(mUsernameLength != 0 && mPasswordLength != 0);  }  void LLPanelLogin::onSelectServer() @@ -1131,7 +1026,6 @@ void LLPanelLogin::onSelectServer()  				// the grid specified by the location is not this one, so clear the combo  				location_combo->setCurrentByIndex(0); // last location on the new grid  				location_combo->setTextEntry(LLStringUtil::null); -				mFavoriteSelected = true;  			}  		}			  		break; diff --git a/indra/newview/llpanellogin.h b/indra/newview/llpanellogin.h index aa63ffabfc..869f2f8d39 100755 --- a/indra/newview/llpanellogin.h +++ b/indra/newview/llpanellogin.h @@ -90,14 +90,9 @@ private:  	friend class LLPanelLoginListener;  	void addFavoritesToStartLocation();  	void addUsersWithFavoritesToUsername(); -	void onLocationEditChanged(LLUICtrl* ctrl); -	void onSelectFavorite();  	void onSelectServer();  	void onLocationSLURL(); -	static void onClickConnectLast(void*); -	static void onClickConnectFavorite(void*); -	static void onClickConnectLocation(void*);  	static void onClickConnect(void*);  	static void onClickNewAccount(void*);  	static void onClickVersion(void*); @@ -120,7 +115,7 @@ private:  	static LLPanelLogin* sInstance;  	static BOOL		sCapslockDidNotification;  	bool			mFirstLoginThisInstall; -	bool mFavoriteSelected; +  	unsigned int mUsernameLength;  	unsigned int mPasswordLength;  	unsigned int mLocationLength; diff --git a/indra/newview/llpanelobject.cpp b/indra/newview/llpanelobject.cpp index ba23e7013d..dcd0aab3ab 100755 --- a/indra/newview/llpanelobject.cpp +++ b/indra/newview/llpanelobject.cpp @@ -285,7 +285,8 @@ LLPanelObject::LLPanelObject()  	mIsPhantom(FALSE),  	mSelectedType(MI_BOX),  	mSculptTextureRevert(LLUUID::null), -	mSculptTypeRevert(0) +	mSculptTypeRevert(0), +	mSizeChanged(FALSE)  {  } @@ -1620,9 +1621,10 @@ void LLPanelObject::sendScale(BOOL btn_down)  	LLVector3 newscale(mCtrlScaleX->get(), mCtrlScaleY->get(), mCtrlScaleZ->get());  	LLVector3 delta = newscale - mObject->getScale(); -	if (delta.magVec() >= 0.0005f) +	if (delta.magVec() >= 0.0005f || (mSizeChanged && !btn_down))  	{  		// scale changed by more than 1/2 millimeter +		mSizeChanged = btn_down;  		// check to see if we aren't scaling the textures  		// (in which case the tex coord's need to be recomputed) diff --git a/indra/newview/llpanelobject.h b/indra/newview/llpanelobject.h index c4cf27ab1a..8829f493fa 100755 --- a/indra/newview/llpanelobject.h +++ b/indra/newview/llpanelobject.h @@ -140,6 +140,7 @@ protected:  	LLSpinCtrl*		mCtrlScaleX;  	LLSpinCtrl*		mCtrlScaleY;  	LLSpinCtrl*		mCtrlScaleZ; +	BOOL			mSizeChanged;  	LLTextBox*		mLabelRotation;  	LLSpinCtrl*		mCtrlRotX; diff --git a/indra/newview/llpanelsnapshot.cpp b/indra/newview/llpanelsnapshot.cpp index 56569e3207..106fb4997e 100755 --- a/indra/newview/llpanelsnapshot.cpp +++ b/indra/newview/llpanelsnapshot.cpp @@ -37,6 +37,19 @@  #include "llsidetraypanelcontainer.h"  #include "llviewercontrol.h" // gSavedSettings +const S32 MAX_TEXTURE_SIZE = 512 ; //max upload texture size 512 * 512 + +S32 power_of_two(S32 sz, S32 upper) +{ +	S32 res = upper; +	while( upper >= sz) +	{ +		res = upper; +		upper >>= 1; +	} +	return res; +} +  // virtual  BOOL LLPanelSnapshot::postBuild()  { @@ -164,8 +177,26 @@ void LLPanelSnapshot::cancel()  void LLPanelSnapshot::onCustomResolutionCommit()  {  	LLSD info; -	info["w"] = getChild<LLUICtrl>(getWidthSpinnerName())->getValue().asInteger(); -	info["h"] = getChild<LLUICtrl>(getHeightSpinnerName())->getValue().asInteger(); +	LLSpinCtrl *widthSpinner = getChild<LLSpinCtrl>(getWidthSpinnerName()); +	LLSpinCtrl *heightSpinner = getChild<LLSpinCtrl>(getHeightSpinnerName()); +	if (getName() == "panel_snapshot_inventory") +	{ +		S32 width = widthSpinner->getValue().asInteger(); +		width = power_of_two(width, MAX_TEXTURE_SIZE); +		info["w"] = width; +		widthSpinner->setIncrement(width >> 1); +		widthSpinner->forceSetValue(width); +		S32 height =  heightSpinner->getValue().asInteger(); +		height = power_of_two(height, MAX_TEXTURE_SIZE); +		heightSpinner->setIncrement(height >> 1); +		heightSpinner->forceSetValue(height); +		info["h"] = height; +	} +	else +	{ +		info["w"] = widthSpinner->getValue().asInteger(); +		info["h"] = heightSpinner->getValue().asInteger(); +	}  	LLFloaterSnapshot::getInstance()->notify(LLSD().with("custom-res-change", info));  } diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp index a1451d770a..c758bbcc9e 100755 --- a/indra/newview/llviewermedia.cpp +++ b/indra/newview/llviewermedia.cpp @@ -2703,7 +2703,7 @@ bool LLViewerMediaImpl::handleKeyHere(KEY key, MASK mask)  	{  		// FIXME: THIS IS SO WRONG.  		// Menu keys should be handled by the menu system and not passed to UI elements, but this is how LLTextEditor and LLLineEditor do it... -		if( MASK_CONTROL & mask ) +		if( MASK_CONTROL & mask && key != KEY_LEFT && key != KEY_RIGHT && key != KEY_HOME && key != KEY_END)  		{  			result = true;  		} diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index 3abeba4b43..be9b4439a8 100755 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -3590,7 +3590,7 @@ class LLSelfSitDown : public view_listener_t  bool enable_sitdown_self()  { -    return isAgentAvatarValid() && !gAgentAvatarp->isSitting() && !gAgent.getFlying(); +    return isAgentAvatarValid() && !gAgentAvatarp->isSitting() && !gAgentAvatarp->isEditingAppearance() && !gAgent.getFlying();  }  class LLCheckPanelPeopleTab : public view_listener_t @@ -7021,10 +7021,6 @@ void handle_selected_texture_info(void*)     		std::string msg;     		msg.assign("Texture info for: ");     		msg.append(node->mName); - -		LLSD args; -		args["MESSAGE"] = msg; -		LLNotificationsUtil::add("SystemMessage", args);     		U8 te_count = node->getObject()->getNumTEs();     		// map from texture ID to list of faces using it @@ -7048,10 +7044,10 @@ void handle_selected_texture_info(void*)     			S32 height = img->getHeight();     			S32 width = img->getWidth();     			S32 components = img->getComponents(); -   			msg = llformat("%dx%d %s on face ", +   			msg.append(llformat("\n%dx%d %s on face ",     								width,     								height, -   								(components == 4 ? "alpha" : "opaque")); +   								(components == 4 ? "alpha" : "opaque")));     			for (U8 i = 0; i < it->second.size(); ++i)     			{     				msg.append( llformat("%d ", (S32)(it->second[i]))); diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp index 820249e181..74b8e693c4 100755 --- a/indra/newview/llviewerobject.cpp +++ b/indra/newview/llviewerobject.cpp @@ -5205,7 +5205,6 @@ void LLViewerObject::setAttachedSound(const LLUUID &audio_uuid, const LLUUID& ow  {  	if (!gAudiop)  	{ -		LL_WARNS("AudioEngine") << "LLAudioEngine instance doesn't exist!" << LL_ENDL;  		return;  	} diff --git a/indra/newview/llviewerparcelmgr.cpp b/indra/newview/llviewerparcelmgr.cpp index e85d8198aa..991f1c77a5 100755 --- a/indra/newview/llviewerparcelmgr.cpp +++ b/indra/newview/llviewerparcelmgr.cpp @@ -1562,6 +1562,7 @@ void LLViewerParcelMgr::processParcelProperties(LLMessageSystem *msg, void **use  		if (parcel == parcel_mgr.mAgentParcel)  		{ +			// new agent parcel  			S32 bitmap_size =	parcel_mgr.mParcelsPerEdge  								* parcel_mgr.mParcelsPerEdge  								/ 8; @@ -1591,6 +1592,11 @@ void LLViewerParcelMgr::processParcelProperties(LLMessageSystem *msg, void **use  				}  			}  		} +		else if (local_id == parcel_mgr.mAgentParcel->getLocalID()) +		{ +			// updated agent parcel +			parcel_mgr.mAgentParcel->unpackMessage(msg); +		}  	}  	// Handle updating selections, if necessary. diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp index c0c9855903..c46b6789f6 100755 --- a/indra/newview/llviewerregion.cpp +++ b/indra/newview/llviewerregion.cpp @@ -66,6 +66,7 @@  #include "llviewerstatsrecorder.h"  #include "llvlmanager.h"  #include "llvlcomposition.h" +#include "llvoavatarself.h"  #include "llvocache.h"  #include "llworld.h"  #include "llspatialpartition.h" @@ -1483,16 +1484,27 @@ void LLViewerRegion::killObject(LLVOCacheEntry* entry, std::vector<LLDrawable*>&  	if(drawablep && !drawablep->getParent())  	{ -		LLViewerObject::const_child_list_t& child_list = drawablep->getVObj()->getChildren(); +		LLViewerObject* v_obj = drawablep->getVObj(); +		if (v_obj->isSelected() +			|| (v_obj->flagAnimSource() && isAgentAvatarValid() && gAgentAvatarp->hasMotionFromSource(v_obj->getID()))) +		{ +			// do not remove objects user is interacting with +			((LLViewerOctreeEntryData*)drawablep)->setVisible(); +			return; +		} +		LLViewerObject::const_child_list_t& child_list = v_obj->getChildren();  		for (LLViewerObject::child_list_t::const_iterator iter = child_list.begin();  			iter != child_list.end(); iter++)  		{  			LLViewerObject* child = *iter;  			if(child->mDrawable)  			{ -				if(!child->mDrawable->getEntry() || !child->mDrawable->getEntry()->hasVOCacheEntry()) +				if( !child->mDrawable->getEntry() +					|| !child->mDrawable->getEntry()->hasVOCacheEntry() +					|| child->isSelected() +					|| (child->flagAnimSource() && isAgentAvatarValid() && gAgentAvatarp->hasMotionFromSource(child->getID())))  				{ -					//do not remove parent if any of its children non-cacheable +					//do not remove parent if any of its children non-cacheable, animating or selected  					//especially for the case that an avatar sits on a cache-able object  					((LLViewerOctreeEntryData*)drawablep)->setVisible();  					return; diff --git a/indra/newview/llviewerregion.h b/indra/newview/llviewerregion.h index 1e225553b8..d01e746936 100755 --- a/indra/newview/llviewerregion.h +++ b/indra/newview/llviewerregion.h @@ -385,7 +385,7 @@ public:  private:  	void addToVOCacheTree(LLVOCacheEntry* entry);  	LLViewerObject* addNewObject(LLVOCacheEntry* entry); -	void killObject(LLVOCacheEntry* entry, std::vector<LLDrawable*>& delete_list);	 +	void killObject(LLVOCacheEntry* entry, std::vector<LLDrawable*>& delete_list); //adds entry into list if it is safe to move into cache  	void removeFromVOCacheTree(LLVOCacheEntry* entry);  	void killCacheEntry(LLVOCacheEntry* entry, bool for_rendering = false); //physically delete the cache entry	  	void killInvisibleObjects(F32 max_time); diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index 6bfa522822..3f5b194c3d 100755 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -4977,6 +4977,15 @@ BOOL LLVOAvatar::stopMotion(const LLUUID& id, BOOL stop_immediate)  }  //----------------------------------------------------------------------------- +// hasMotionFromSource() +//----------------------------------------------------------------------------- +// virtual +bool LLVOAvatar::hasMotionFromSource(const LLUUID& source_id) +{ +	return false; +} + +//-----------------------------------------------------------------------------  // stopMotionFromSource()  //-----------------------------------------------------------------------------  // virtual diff --git a/indra/newview/llvoavatar.h b/indra/newview/llvoavatar.h index 9a2aaf8aa3..2223acc893 100755 --- a/indra/newview/llvoavatar.h +++ b/indra/newview/llvoavatar.h @@ -191,6 +191,7 @@ public:  	/*virtual*/ LLUUID			remapMotionID(const LLUUID& id);  	/*virtual*/ BOOL			startMotion(const LLUUID& id, F32 time_offset = 0.f);  	/*virtual*/ BOOL			stopMotion(const LLUUID& id, BOOL stop_immediate = FALSE); +	virtual bool			hasMotionFromSource(const LLUUID& source_id);  	virtual void			stopMotionFromSource(const LLUUID& source_id);  	virtual void			requestStopMotion(LLMotion* motion);  	LLMotion*				findMotion(const LLUUID& id) const; diff --git a/indra/newview/llvoavatarself.cpp b/indra/newview/llvoavatarself.cpp index 170a8c41f4..aa440c06a6 100755 --- a/indra/newview/llvoavatarself.cpp +++ b/indra/newview/llvoavatarself.cpp @@ -754,6 +754,13 @@ void LLVOAvatarSelf::requestStopMotion(LLMotion* motion)  }  // virtual +bool LLVOAvatarSelf::hasMotionFromSource(const LLUUID& source_id) +{ +	AnimSourceIterator motion_it = mAnimationSources.find(source_id); +	return motion_it != mAnimationSources.end(); +} + +// virtual  void LLVOAvatarSelf::stopMotionFromSource(const LLUUID& source_id)  {  	for (AnimSourceIterator motion_it = mAnimationSources.find(source_id); motion_it != mAnimationSources.end(); ) @@ -762,6 +769,7 @@ void LLVOAvatarSelf::stopMotionFromSource(const LLUUID& source_id)  		mAnimationSources.erase(motion_it++);  	} +  	LLViewerObject* object = gObjectList.findObject(source_id);  	if (object)  	{ diff --git a/indra/newview/llvoavatarself.h b/indra/newview/llvoavatarself.h index 7f641b6242..444524d6cc 100755 --- a/indra/newview/llvoavatarself.h +++ b/indra/newview/llvoavatarself.h @@ -82,6 +82,7 @@ public:  	// LLCharacter interface and related  	//--------------------------------------------------------------------  public: +	/*virtual*/ bool 		hasMotionFromSource(const LLUUID& source_id);  	/*virtual*/ void 		stopMotionFromSource(const LLUUID& source_id);  	/*virtual*/ void 		requestStopMotion(LLMotion* motion);  	/*virtual*/ LLJoint*	getJoint(const std::string &name); diff --git a/indra/newview/llweb.cpp b/indra/newview/llweb.cpp index 0312972a22..0f0d9ce703 100755 --- a/indra/newview/llweb.cpp +++ b/indra/newview/llweb.cpp @@ -50,6 +50,8 @@  #include "llviewerwindow.h"  #include "llnotificationsutil.h" +#include "uriparser/Uri.h" +  #include <boost/regex.hpp>  bool on_load_url_external_response(const LLSD& notification, const LLSD& response, bool async ); @@ -238,9 +240,23 @@ bool LLWeb::useExternalBrowser(const std::string &url)  	}  	else if (gSavedSettings.getU32("PreferredBrowserBehavior") == BROWSER_INT_LL_EXT_OTHERS)  	{ -		boost::regex pattern = boost::regex("\\b(lindenlab.com|secondlife.com)\\b", boost::regex::perl|boost::regex::icase); +		UriParserStateA state; +		UriUriA uri; +		state.uri = &uri; + +		std::string uri_string = url; +		uriParseUriA(&state, uri_string.c_str()); +		if (uri.hostText.first) +		{ +			S32 length = uri.hostText.afterLast - uri.hostText.first; +			std::string buf = uri.hostText.first; +			uri_string = buf.substr(0,length); +		} +		uriFreeUriMembersA(&uri); + +		boost::regex pattern = boost::regex("\\b(lindenlab.com|secondlife.com)$", boost::regex::perl|boost::regex::icase);  		boost::match_results<std::string::const_iterator> matches; -		return !(boost::regex_search(url, matches, pattern));	 +		return !(boost::regex_search(uri_string, matches, pattern));  	}  	return false;  } diff --git a/indra/newview/skins/default/textures/icons/hand.png b/indra/newview/skins/default/textures/icons/hand.png Binary files differnew file mode 100644 index 0000000000..41b9600da6 --- /dev/null +++ b/indra/newview/skins/default/textures/icons/hand.png diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml index 1f10d966d5..9c2d55e7b4 100755 --- a/indra/newview/skins/default/textures/textures.xml +++ b/indra/newview/skins/default/textures/textures.xml @@ -229,6 +229,8 @@ with the same filename but different name    <texture name="Generic_Person" file_name="icons/Generic_Person.png" preload="false" />    <texture name="Generic_Person_Large" file_name="icons/Generic_Person_Large.png" preload="false" /> +  <texture name="Hand" file_name="icons/hand.png" preload="false" /> +      <texture name="Help_Press" file_name="navbar/Help_Press.png" preload="false" />    <texture name="Hierarchy_View_Disabled" file_name="icons/Hierarchy_View_Disabled.png" preload="false" /> diff --git a/indra/newview/skins/default/xui/de/floater_stats.xml b/indra/newview/skins/default/xui/de/floater_stats.xml index 993316134a..4e6f56cd94 100755 --- a/indra/newview/skins/default/xui/de/floater_stats.xml +++ b/indra/newview/skins/default/xui/de/floater_stats.xml @@ -1,7 +1,7 @@  <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Statistics" title="STATISTIKEN" width="280"> -	<scroll_container name="statistics_scroll" width="280"> -		<container_view name="statistics_view" width="280"> +<floater name="Statistics" title="STATISTIKEN"> +	<scroll_container name="statistics_scroll"> +		<container_view name="statistics_view">  			<stat_view label="Basic" name="basic">  				<stat_bar label="FPS" name="fps"/>  				<stat_bar label="Empfangene UDP-Daten" name="bandwidth"/> diff --git a/indra/newview/skins/default/xui/en/floater_stats.xml b/indra/newview/skins/default/xui/en/floater_stats.xml index fbf262441f..2aa582beea 100755 --- a/indra/newview/skins/default/xui/en/floater_stats.xml +++ b/indra/newview/skins/default/xui/en/floater_stats.xml @@ -37,6 +37,7 @@         <stat_bar name="bandwidth"                    label="UDP Data Received"                    stat="activemessagedatareceived" +                  decimal_digits="0"                    show_bar="true"/>          <stat_bar name="packet_loss"                    label="Packet Loss" diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index ea1bc66236..b4d8046d18 100755 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -34,6 +34,12 @@      </form>    </template> +  <template name="notifyignore"> +    <form> +      <ignore text="$ignoretext"/> +    </form> +  </template> +    <template name="okcancelbuttons">      <form>        <button @@ -9490,6 +9496,9 @@ You have been teleported home by the object '[OBJECT_NAME]'     type="notify">     <tag>fail</tag>  You have been teleported by an attachment on [ITEM_ID] +   <usetemplate +    ignoretext="Teleport: You have been teleported by an attachment" +    name="notifyignore"/>    </notification>    <notification @@ -9498,6 +9507,9 @@ You have been teleported by an attachment on [ITEM_ID]     type="notify">     <tag>fail</tag>  You have been teleported by the object '[OBJECT_NAME]' on the parcel '[PARCEL_NAME]' +   <usetemplate +    ignoretext="Teleport: You have been teleported by an object on a parcel" +    name="notifyignore"/>    </notification>    <notification diff --git a/indra/newview/skins/default/xui/en/panel_login.xml b/indra/newview/skins/default/xui/en/panel_login.xml index a258a874b0..183ae2e824 100755 --- a/indra/newview/skins/default/xui/en/panel_login.xml +++ b/indra/newview/skins/default/xui/en/panel_login.xml @@ -19,7 +19,7 @@    left="0"    name="ui_stack"    orientation="horizontal" -  top="0" +  top="10"    width="1024">      <layout_panel        height="172" @@ -30,7 +30,7 @@        auto_resize="false"        follows="left|right|top"        name="ui_container" -      width="960" +      width="1000"        left="0"        top="0"        height="172"> @@ -56,7 +56,8 @@      name="username_combo"      width="232">      <combo_box.combo_editor -      text_pad_left="8" /> +      text_pad_left="8"  +      bg_image_always_focused="true"/>      <combo_box.combo_button        visible="false" />      <combo_box.drop_down_button @@ -65,79 +66,42 @@    <line_editor      follows="left|top"      height="32" -    left_pad="0" +    left_pad="-11"      max_length_bytes="16"      text_pad_left="8"      name="password_edit"      label="Password" +  	bg_image_always_focused="true"      font="SansSerifLarge"      is_password="true"      select_on_focus="true"      commit_on_focus_lost="false"      bottom_delta="0" -    width="200" /> -  <check_box -    control_name="RememberPassword" -    follows="left|top" -    font="SansSerifMedium" -    left_pad="20" -    bottom_delta="-14" -    height="24" -    label="Remember me" -    check_button.bottom="3" -    name="remember_check" -    width="145" /> -  <text -    follows="left|top" -    font="SansSerifMedium" -    text_color="EmphasisColor" -    height="16" -    name="forgot_password_text" -    left_delta="0" -    bottom_delta="16" -    width="200"> -    Forgotten password -  </text> -  <button -    follows="left|top" -    image_unselected="PushButton_Login" -    image_pressed="PushButton_Login_Pressed" -    image_hover="PushButton_Login_Over" -    label="Log In" -    label_color="White" -    font="SansSerifMedium" -    name="connect_btn" -    enabled="true" -    left="0" -    width="80" -    height="26" -    bottom_delta="44" /> -  <text -    follows="left|top" -    font="SansSerifLarge" -    height="24" -    name="At_My_Last_Location_Label" -    left_pad="8" -    bottom_delta="1" -    width="120"> -    at last location -  </text> +    width="165" />    <combo_box -    control_name="NextLoginLocation" +    allow_text_entry="true" +    control_name="NextLoginLocation"          follows="left|top"      label="My favorite places" -    height="26" +    height="32"      max_chars="128" -    combo_editor.font="SansSerifMedium" -    left_pad="20" +    combo_editor.font="SansSerifLarge" +    left_pad="15"      bottom_delta="0"      name="start_location_combo"      width="175"      combo_button.scale_image="true"> +    <combo_box.combo_editor +      bg_image_always_focused="true" +      text_pad_left="8"/> +    <combo_box.item +      label="My last location" +      name="MyLastLocation" +      value="last" />      <combo_box.item        label="My home"        name="MyHome" -      value="home" /> +      value="home" />         </combo_box>    <button      follows="left|top" @@ -147,53 +111,48 @@      label="Log In"      label_color="White"      font="SansSerifMedium" -    name="connect_favorite_btn" -    left_pad="8" -    width="80" -    enabled="false" -    height="26" -    bottom_delta="0" /> -  <line_editor +    name="connect_btn" +    enabled="true"     +    width="120" +    height="32" +  	left_pad="15" +    bottom_delta="0" />   +  <check_box +    control_name="RememberPassword"      follows="left|top" -    width="170" -    height="26" -    left_pad="40" -    text_pad_left="8" -    name="location_edit" -    label="Type a location"      font="SansSerifMedium" -    select_on_focus="true" -    commit_on_focus_lost="false" -    bottom_delta="0" /> -  <button +    left="185" +    bottom_delta="21"  	 +    height="24" +    label="Remember me" +    check_button.bottom="3" +    name="remember_check" +    width="145" /> +  <text      follows="left|top" -    image_unselected="PushButton_Login" -    image_pressed="PushButton_Login_Pressed" -    image_hover="PushButton_Login_Over" -    label="Log In" -    enabled="false" -    label_color="White"      font="SansSerifMedium" -    name="connect_location_btn" -    left_pad="8" -    width="80" -    height="26" -    bottom_delta="0" /> +    text_color="EmphasisColor" +    height="16" +    name="forgot_password_text" +    left="408"     +    bottom_delta="0" +    width="200"> +    Forgotten password +  </text>     <combo_box      allow_text_entry="false"      font="SansSerifTiny"      follows="left|top"      height="26" +  	left="588" +  	bottom_delta="10"      max_chars="128" -    label="Select grid" -    left_pad="40" -    bottom_delta="0" +    label="Select grid"          layout="topleft" -    top_pad="2"      name="server_combo" -    width="128" /> -    </layout_panel> -    <layout_panel +    width="149" />	 +  </layout_panel> +  <layout_panel        height="172"        auto_resize="true"        name="ui_elastic_pad_right" diff --git a/indra/newview/skins/default/xui/en/panel_preferences_general.xml b/indra/newview/skins/default/xui/en/panel_preferences_general.xml index 9da044ab64..f6665a1d5d 100755 --- a/indra/newview/skins/default/xui/en/panel_preferences_general.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_general.xml @@ -39,12 +39,7 @@           enabled="true"           label="English"           name="English" -         value="en" /> -        <combo_box.item -         enabled="true" -         label="Dansk (Danish) - Beta" -         name="Danish" -         value="da" /> +         value="en" />                  <combo_box.item           enabled="true"           label="Deutsch (German) - Beta" @@ -64,12 +59,7 @@           enabled="true"           label="Italiano (Italian) - Beta"           name="Italian" -         value="it" /> -        <combo_box.item -         enabled="true" -         label="Polski (Polish) - Beta" -         name="Polish" -         value="pl" /> +         value="it" />                  <combo_box.item           enabled="true"           label="Português (Portuguese) - Beta" diff --git a/indra/newview/skins/default/xui/en/panel_preferences_sound.xml b/indra/newview/skins/default/xui/en/panel_preferences_sound.xml index b71586aab1..615abbaa89 100755 --- a/indra/newview/skins/default/xui/en/panel_preferences_sound.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_sound.xml @@ -398,7 +398,7 @@       follows="left|top"       layout="topleft"       left_delta="-168" -     width="221" +     width="360"       height="20"       name="ear_location">      <radio_item diff --git a/indra/newview/skins/default/xui/en/panel_status_bar.xml b/indra/newview/skins/default/xui/en/panel_status_bar.xml index 064ece6e4b..dbf7bc031f 100755 --- a/indra/newview/skins/default/xui/en/panel_status_bar.xml +++ b/indra/newview/skins/default/xui/en/panel_status_bar.xml @@ -51,7 +51,7 @@       v_pad="4"       top="0"       wrap="false"  -     value="L$20"  +     value="L$??"        width="40" />      <button       halign="center" diff --git a/indra/newview/skins/default/xui/ru/menu_viewer.xml b/indra/newview/skins/default/xui/ru/menu_viewer.xml index fad1ea51e0..26e3d37918 100755 --- a/indra/newview/skins/default/xui/ru/menu_viewer.xml +++ b/indra/newview/skins/default/xui/ru/menu_viewer.xml @@ -165,6 +165,12 @@  	</menu>  	<menu label="Справка" name="Help">  		<menu_item_call label="Инструкции..." name="How To"/> +		<menu_item_call label="База знаний" name="Knowledge Base"/> +		<menu_item_call label="Wiki" name="Wiki"/> +		<menu_item_call label="Форумы сообщества" name="Community Forums"/> +		<menu_item_call label="Портал поддержки" name="Support portal"/> +		<menu_item_call label="Новости [SECOND_LIFE]" name="Second Life News"/> +		<menu_item_call label="Блоги [SECOND_LIFE]" name="Second Life Blogs"/>  		<menu_item_call label="Жалоба" name="Report Abuse"/>  		<menu_item_call label="Сообщить об ошибке" name="Report Bug"/>  		<menu_item_call label="О [APP_NAME]" name="About Second Life"/> @@ -396,6 +402,12 @@  				<menu_item_call label="Проверка женщины" name="Test Female"/>  				<menu_item_check label="Разрешить выбор аватара" name="Allow Select Avatar"/>  			</menu> +			<menu label="Скорость анимации" name="Animation Speed"> +				<menu_item_call label="Ускорить все анимации на 10%" name="All Animations 10 Faster"/> +				<menu_item_call label="Замедлить все анимации на 10%" name="All Animations 10 Slower"/> +				<menu_item_call label="Восстановить скорость анимаций" name="Reset All Animation Speed"/> +				<menu_item_check label="Анимация медленных движений" name="Slow Motion Animations"/> +			</menu>  			<menu_item_call label="Скинуть параметры" name="Force Params to Default"/>  			<menu_item_check label="Данные об анимации" name="Animation Info"/>  			<menu_item_check label="Показать взгляд" name="Show Look At"/>  | 
