diff options
157 files changed, 1902 insertions, 834 deletions
| @@ -529,3 +529,4 @@ cea1632c002c065985ebea15eeeb4aac90f50545 5.0.2-release  b4d76b5590fdf8bab72c64442353753a527cbc44 5.0.5-release  3e5035dfd8af49bd4c0009f0a76ef46a15991a45 5.0.6-release  abcab37e1b29414ab8c03af9ca2ab489d809788a 5.0.7-release +505a492f30bd925bb48e2e093ae77c3c2b4c740f 5.0.8-release diff --git a/autobuild.xml b/autobuild.xml index 4930e5e70a..f8daa6a418 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -374,9 +374,9 @@              <key>archive</key>              <map>                <key>hash</key> -              <string>f426c56252c70fe38fcb2251f7c1d762</string> +              <string>99fbc15f514be77c36280f300d257d5a</string>                <key>url</key> -              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/9265/41615/curl-7.54.1.509254-darwin64-509254.tar.bz2</string> +              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/1077/2495/curl-7.47.0.501064-darwin64-501064.tar.bz2</string>              </map>              <key>name</key>              <string>darwin64</string> @@ -398,9 +398,9 @@              <key>archive</key>              <map>                <key>hash</key> -              <string>630a2ddf43bba6e5b6e171dc68921dcb</string> +              <string>e5d1b0439235f5f3829662a45e566743</string>                <key>url</key> -              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/8663/36142/curl-7.54.1.508652-linux64-508652.tar.bz2</string> +              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/1075/2484/curl-7.47.0.501064-linux64-501064.tar.bz2</string>              </map>              <key>name</key>              <string>linux64</string> @@ -410,11 +410,11 @@              <key>archive</key>              <map>                <key>hash</key> -              <string>4c7a960e1ee518acceac6a0c65495800</string> +              <string>bda9f237d3e8238440bc5bedc2657547</string>                <key>hash_algorithm</key>                <string>md5</string>                <key>url</key> -              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/9268/41606/curl-7.54.1.509254-windows-509254.tar.bz2</string> +              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/1078/2487/curl-7.47.0.501064-windows-501064.tar.bz2</string>              </map>              <key>name</key>              <string>windows</string> @@ -424,16 +424,16 @@              <key>archive</key>              <map>                <key>hash</key> -              <string>32df7cce1658ccec893fb46cd476c024</string> +              <string>f7fa42c7157cd5007283ae7a5d97393d</string>                <key>url</key> -              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/9267/41607/curl-7.54.1.509254-windows64-509254.tar.bz2</string> +              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/1079/2490/curl-7.47.0.501064-windows64-501064.tar.bz2</string>              </map>              <key>name</key>              <string>windows64</string>            </map>          </map>          <key>version</key> -        <string>7.54.1.509254</string> +        <string>7.47.0.501064</string>        </map>        <key>db</key>        <map> @@ -2343,87 +2343,6 @@          <key>version</key>          <string>7.11.1.297294</string>        </map> -      <key>nghttp2</key> -      <map> -        <key>copyright</key> -        <string>Copyright (c) 2012, 2014, 2015, 2016 Tatsuhiro Tsujikawa -Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string> -        <key>description</key> -        <string>Library providing HTTP 2 support for libcurl</string> -        <key>license</key> -        <string>MIT</string> -        <key>license_file</key> -        <string>LICENSES/nghttp2.txt</string> -        <key>name</key> -        <string>nghttp2</string> -        <key>platforms</key> -        <map> -          <key>darwin64</key> -          <map> -            <key>archive</key> -            <map> -              <key>hash</key> -              <string>f51bcd9245ed4e4ca1fa250ba9b112ce</string> -              <key>url</key> -              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/9259/41575/nghttp2-1.25.0.509246-darwin64-509246.tar.bz2</string> -            </map> -            <key>name</key> -            <string>darwin64</string> -          </map> -          <key>linux</key> -          <map> -            <key>archive</key> -            <map> -              <key>hash</key> -              <string>079c1a1bdb3ce1cda8ce3d7f75eeced3</string> -              <key>url</key> -              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/9258/41585/nghttp2-1.25.0.509246-linux-509246.tar.bz2</string> -            </map> -            <key>name</key> -            <string>linux</string> -          </map> -          <key>linux64</key> -          <map> -            <key>archive</key> -            <map> -              <key>hash</key> -              <string>c3c5ff7d2f7ac1143ef8d888192d4a53</string> -              <key>url</key> -              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/9257/41579/nghttp2-1.25.0.509246-linux64-509246.tar.bz2</string> -            </map> -            <key>name</key> -            <string>linux64</string> -          </map> -          <key>windows</key> -          <map> -            <key>archive</key> -            <map> -              <key>hash</key> -              <string>8367d6743356ad637e61335ee319f7a7</string> -              <key>url</key> -              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/9261/41597/nghttp2-1.25.0.509246-windows-509246.tar.bz2</string> -            </map> -            <key>name</key> -            <string>windows</string> -          </map> -          <key>windows64</key> -          <map> -            <key>archive</key> -            <map> -              <key>hash</key> -              <string>3267acca5dbfe6b8770deeebd548ee6a</string> -              <key>url</key> -              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/9260/41591/nghttp2-1.25.0.509246-windows64-509246.tar.bz2</string> -            </map> -            <key>name</key> -            <string>windows64</string> -          </map> -        </map> -        <key>source_type</key> -        <string>hg</string> -        <key>version</key> -        <string>1.25.0.509246</string> -      </map>        <key>nvapi</key>        <map>          <key>copyright</key> @@ -2777,9 +2696,9 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>              <key>archive</key>              <map>                <key>hash</key> -              <string>6c28cce95e3576daf66252b07d9d151f</string> +              <string>7011482b07b32b375ecc3e891c37f469</string>                <key>url</key> -              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/8340/33489/openssl-1.0.2l.508328-darwin64-508328.tar.bz2</string> +              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/1063/2462/openssl-1.0.1u.501051-darwin64-501051.tar.bz2</string>              </map>              <key>name</key>              <string>darwin64</string> @@ -2801,9 +2720,9 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>              <key>archive</key>              <map>                <key>hash</key> -              <string>d50ccfbf0c1d249392919e2c46ad8d5c</string> +              <string>50bb9aca605a599cb1a46da3c45f78ac</string>                <key>url</key> -              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/8339/33495/openssl-1.0.2l.508328-linux64-508328.tar.bz2</string> +              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/1062/2473/openssl-1.0.1u.501051-linux64-501051.tar.bz2</string>              </map>              <key>name</key>              <string>linux64</string> @@ -2813,9 +2732,9 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>              <key>archive</key>              <map>                <key>hash</key> -              <string>ffdb11a4c7aff72086c01555f931c918</string> +              <string>7d9801f9ce049ffd30fbe06b6bac4c91</string>                <key>url</key> -              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/8341/33481/openssl-1.0.2l.508328-windows-508328.tar.bz2</string> +              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/1064/2465/openssl-1.0.1u.501051-windows-501051.tar.bz2</string>              </map>              <key>name</key>              <string>windows</string> @@ -2825,16 +2744,16 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>              <key>archive</key>              <map>                <key>hash</key> -              <string>d875fc7d1f3a7bd9f85cfde05d9ae3dc</string> +              <string>c3e404a9cc51d64c71ec13dbd44b8409</string>                <key>url</key> -              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/8342/33480/openssl-1.0.2l.508328-windows64-508328.tar.bz2</string> +              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/1065/2468/openssl-1.0.1u.501051-windows64-501051.tar.bz2</string>              </map>              <key>name</key>              <string>windows64</string>            </map>          </map>          <key>version</key> -        <string>1.0.2l.508328</string> +        <string>1.0.1u.501051</string>        </map>        <key>pcre</key>        <map> @@ -3231,9 +3150,9 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>              <key>archive</key>              <map>                <key>hash</key> -              <string>0d65bb763808feffb6308914aa53272b</string> +              <string>804779ac7a80500a7634f05f906cf7a7</string>                <key>url</key> -              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/8942/38652/viewer_manager-1.0.508931-darwin64-508931.tar.bz2</string> +              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/9534/44332/viewer_manager-1.0.509523-darwin64-509523.tar.bz2</string>              </map>              <key>name</key>              <string>darwin64</string> @@ -3255,9 +3174,9 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>              <key>archive</key>              <map>                <key>hash</key> -              <string>c235c6ef33f52b0130808fe57710fe35</string> +              <string>4ef7c2406fb3ec167e8422b1e1c5b540</string>                <key>url</key> -              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/8943/38658/viewer_manager-1.0.508931-windows-508931.tar.bz2</string> +              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/9535/44338/viewer_manager-1.0.509523-windows-509523.tar.bz2</string>              </map>              <key>name</key>              <string>windows</string> @@ -3268,7 +3187,7 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>          <key>source_type</key>          <string>hg</string>          <key>version</key> -        <string>1.0.508931</string> +        <string>1.0.509523</string>        </map>        <key>vlc-bin</key>        <map> diff --git a/doc/contributions.txt b/doc/contributions.txt index f14769610f..0b6fcc1626 100755 --- a/doc/contributions.txt +++ b/doc/contributions.txt @@ -1040,9 +1040,9 @@ Nicholaz Beresford  	VWR-2682  	VWR-2684  Nick Rhodes -NickyD -	MAINT-873  Nicky Dasmijn +	MAINT-873 +	MAINT-7541  	VWR-29228  	MAINT-1392  	MAINT-873 diff --git a/indra/lib/python/indra/util/llmanifest.py b/indra/lib/python/indra/util/llmanifest.py index d4e61aedd1..7050ce43b7 100755 --- a/indra/lib/python/indra/util/llmanifest.py +++ b/indra/lib/python/indra/util/llmanifest.py @@ -376,12 +376,30 @@ class LLManifest(object):          self.excludes.append(glob)      def prefix(self, src='', build=None, dst=None): -        """ Pushes a prefix onto the stack.  Until end_prefix is -        called, all relevant method calls (esp. to path()) will prefix -        paths with the entire prefix stack.  Source and destination -        prefixes can be different, though if only one is provided they -        are both equal.  To specify a no-op, use an empty string, not -        None.""" +        """ +        Usage: + +        with self.prefix(...args as described...): +            self.path(...) + +        For the duration of the 'with' block, pushes a prefix onto the stack. +        Within that block, all relevant method calls (esp. to path()) will +        prefix paths with the entire prefix stack. Source and destination +        prefixes can be different, though if only one is provided they are +        both equal. To specify a no-op, use an empty string, not None. + +        Also supports the older (pre-Python-2.5) syntax: + +        if self.prefix(...args as described...): +            self.path(...) +            self.end_prefix(...) + +        Before the arrival of the 'with' statement, one was required to code +        self.prefix() and self.end_prefix() in matching pairs to push and to +        pop the prefix stacks, respectively. The older prefix() method +        returned True specifically so that the caller could indent the +        relevant block of code with 'if', just for aesthetic purposes. +        """          if dst is None:              dst = src          if build is None: @@ -390,7 +408,57 @@ class LLManifest(object):          self.artwork_prefix.append(src)          self.build_prefix.append(build)          self.dst_prefix.append(dst) -        return True  # so that you can wrap it in an if to get indentation + +        # The above code is unchanged from the original implementation. What's +        # new is the return value. We're going to return an instance of +        # PrefixManager that binds this LLManifest instance and Does The Right +        # Thing on exit. +        return self.PrefixManager(self) + +    class PrefixManager(object): +        def __init__(self, manifest): +            self.manifest = manifest +            # stack attributes we manage in this LLManifest (sub)class +            # instance +            stacks = ("src_prefix", "artwork_prefix", "build_prefix", "dst_prefix") +            # If the caller wrote: +            # with self.prefix(...): +            # as intended, then bind the state of each prefix stack as it was +            # just BEFORE the call to prefix(). Since prefix() appended an +            # entry to each prefix stack, capture len()-1. +            self.prevlen = { stack: len(getattr(self.manifest, stack)) - 1 +                             for stack in stacks } + +        def __nonzero__(self): +            # If the caller wrote: +            # if self.prefix(...): +            # then a value of this class had better evaluate as 'True'. +            return True + +        def __enter__(self): +            # nobody uses 'with self.prefix(...) as variable:' +            return None + +        def __exit__(self, type, value, traceback): +            # First, if the 'with' block raised an exception, just propagate. +            # Do NOT swallow it. +            if type is not None: +                return False + +            # Okay, 'with' block completed successfully. Restore previous +            # state of each of the prefix stacks in self.stacks. +            # Note that we do NOT simply call pop() on them as end_prefix() +            # does. This is to cope with the possibility that the coder +            # changed 'if self.prefix(...):' to 'with self.prefix(...):' yet +            # forgot to remove the self.end_prefix(...) call at the bottom of +            # the block. In that case, calling pop() again would be Bad! But +            # if we restore the length of each stack to what it was before the +            # current prefix() block, it doesn't matter whether end_prefix() +            # was called or not. +            for stack, prevlen in self.prevlen.items(): +                # find the attribute in 'self.manifest' named by 'stack', and +                # truncate that list back to 'prevlen' +                del getattr(self.manifest, stack)[prevlen:]      def end_prefix(self, descr=None):          """Pops a prefix off the stack.  If given an argument, checks diff --git a/indra/llcharacter/llmotioncontroller.cpp b/indra/llcharacter/llmotioncontroller.cpp index d8185aa693..35e76f1d9d 100644 --- a/indra/llcharacter/llmotioncontroller.cpp +++ b/indra/llcharacter/llmotioncontroller.cpp @@ -139,7 +139,8 @@ LLMotionController::LLMotionController()  	  mTimeStep(0.f),  	  mTimeStepCount(0),  	  mLastInterp(0.f), -	  mIsSelf(FALSE) +	  mIsSelf(FALSE), +	  mLastCountAfterPurge(0)  {  } @@ -238,10 +239,12 @@ void LLMotionController::purgeExcessMotions()  		}  	} -	if (mLoadedMotions.size() > 2*MAX_MOTION_INSTANCES) +	U32 loaded_count = mLoadedMotions.size(); +	if (loaded_count > (2 * MAX_MOTION_INSTANCES) && loaded_count > mLastCountAfterPurge)  	{ -		LL_WARNS_ONCE("Animation") << "> " << 2*MAX_MOTION_INSTANCES << " Loaded Motions" << LL_ENDL; +		LL_WARNS_ONCE("Animation") << loaded_count << " Loaded Motions. Amount of motions is over limit." << LL_ENDL;  	} +	mLastCountAfterPurge = loaded_count;  }  //----------------------------------------------------------------------------- diff --git a/indra/llcharacter/llmotioncontroller.h b/indra/llcharacter/llmotioncontroller.h index 72de331694..9d9c64f4f0 100644 --- a/indra/llcharacter/llmotioncontroller.h +++ b/indra/llcharacter/llmotioncontroller.h @@ -224,6 +224,8 @@ protected:  	F32					mLastInterp;  	U8					mJointSignature[2][LL_CHARACTER_MAX_ANIMATED_JOINTS]; +private: +	U32					mLastCountAfterPurge; //for logging and debugging purposes  };  //----------------------------------------------------------------------------- diff --git a/indra/llcommon/llapp.cpp b/indra/llcommon/llapp.cpp index 2c76f29020..6cc9e804d4 100644 --- a/indra/llcommon/llapp.cpp +++ b/indra/llcommon/llapp.cpp @@ -256,6 +256,70 @@ bool LLApp::parseCommandOptions(int argc, char** argv)  	return true;  } +bool LLApp::parseCommandOptions(int argc, wchar_t** wargv) +{ +	LLSD commands; +	std::string name; +	std::string value; +	for(int ii = 1; ii < argc; ++ii) +	{ +		if(wargv[ii][0] != '-') +		{ +			LL_INFOS() << "Did not find option identifier while parsing token: " +				<< wargv[ii] << LL_ENDL; +			return false; +		} +		int offset = 1; +		if(wargv[ii][1] == '-') ++offset; + +#if LL_WINDOWS +	name.assign(utf16str_to_utf8str(&wargv[ii][offset])); +#else +	name.assign(wstring_to_utf8str(&wargv[ii][offset])); +#endif +		if(((ii+1) >= argc) || (wargv[ii+1][0] == '-')) +		{ +			// we found another option after this one or we have +			// reached the end. simply record that this option was +			// found and continue. +			int flag = name.compare("logfile"); +			if (0 == flag) +			{ +				commands[name] = "log"; +			} +			else +			{ +				commands[name] = true; +			} +			 +			continue; +		} +		++ii; + +#if LL_WINDOWS +	value.assign(utf16str_to_utf8str((wargv[ii]))); +#else +	value.assign(wstring_to_utf8str((wargv[ii]))); +#endif + +#if LL_WINDOWS +		//Windows changed command line parsing.  Deal with it. +		S32 slen = value.length() - 1; +		S32 start = 0; +		S32 end = slen; +		if (wargv[ii][start]=='"')start++; +		if (wargv[ii][end]=='"')end--; +		if (start!=0 || end!=slen)  +		{ +			value = value.substr (start,end); +		} +#endif + +		commands[name] = value; +	} +	setOptionData(PRIORITY_COMMAND_LINE, commands); +	return true; +}  void LLApp::manageLiveFile(LLLiveFile* livefile)  { @@ -354,7 +418,7 @@ void LLApp::setupErrorHandling(bool second_instance)  			std::wstring wpipe_name;  			wpipe_name =  mCrashReportPipeStr + wstringize(getPid()); -			const std::wstring wdump_path(wstringize(mDumpPath)); +			const std::wstring wdump_path(utf8str_to_utf16str(mDumpPath));  			int retries = 30;  			for (; retries > 0; --retries) @@ -515,9 +579,9 @@ void LLApp::setMiniDumpDir(const std::string &path)  	if(mExceptionHandler == 0) return;  #ifdef LL_WINDOWS -	wchar_t buffer[MAX_MINDUMP_PATH_LENGTH]; -	mbstowcs(buffer, mDumpPath.c_str(), MAX_MINDUMP_PATH_LENGTH); -	mExceptionHandler->set_dump_path(std::wstring(buffer)); +	std::wstring buffer(utf8str_to_utf16str(mDumpPath)); +	if (buffer.size() > MAX_MINDUMP_PATH_LENGTH) buffer.resize(MAX_MINDUMP_PATH_LENGTH); +	mExceptionHandler->set_dump_path(buffer);  #elif LL_LINUX          //google_breakpad::MinidumpDescriptor desc("/tmp");	//path works in debug fails in production inside breakpad lib so linux gets a little less stack reporting until it is patched.          google_breakpad::MinidumpDescriptor desc(mDumpPath);	//path works in debug fails in production inside breakpad lib so linux gets a little less stack reporting until it is patched. diff --git a/indra/llcommon/llapp.h b/indra/llcommon/llapp.h index ff9a92b45f..acd829d864 100644 --- a/indra/llcommon/llapp.h +++ b/indra/llcommon/llapp.h @@ -106,7 +106,7 @@ public:  	LLSD getOption(const std::string& name) const;  	/**  -	 * @brief Parse command line options and insert them into +	 * @brief Parse ASCII command line options and insert them into  	 * application command line options.  	 *  	 * The name inserted into the option will have leading option @@ -119,6 +119,20 @@ public:  	 */  	bool parseCommandOptions(int argc, char** argv); +	/**  +	 * @brief Parse Unicode command line options and insert them into +	 * application command line options. +	 * +	 * The name inserted into the option will have leading option +	 * identifiers (a minus or double minus) stripped. All options +	 * with values will be stored as a string, while all options +	 * without values will be stored as true. +	 * @param argc The argc passed into main(). +	 * @param wargv The wargv passed into main(). +	 * @return Returns true if the parse succeeded. +	 */ +	bool parseCommandOptions(int argc, wchar_t** wargv); +  	/**  	 * @brief Keep track of live files automatically.  	 * diff --git a/indra/llcommon/llevents.cpp b/indra/llcommon/llevents.cpp index a3856e4fc4..dce97b5411 100644 --- a/indra/llcommon/llevents.cpp +++ b/indra/llcommon/llevents.cpp @@ -322,6 +322,13 @@ LLBoundListener LLEventPump::listen_impl(const std::string& name, const LLEventL                                           const NameList& after,                                           const NameList& before)  { +    if (!mSignal) +    { +        LL_WARNS() << "Can't connect listener" << LL_ENDL; +        // connect will fail, return dummy +        return LLBoundListener(); +    } +      float nodePosition = 1.0;      // if the supplied name is empty we are not interested in the ordering mechanism  diff --git a/indra/llcommon/llinitparam.cpp b/indra/llcommon/llinitparam.cpp index 1d104cf55d..aa2f4eb289 100644 --- a/indra/llcommon/llinitparam.cpp +++ b/indra/llcommon/llinitparam.cpp @@ -193,12 +193,7 @@ namespace LLInitParam  		{  			if (!silent)  			{ -				std::string file_name = p.getCurrentFileName(); -				if(!file_name.empty()) -				{ -					file_name = "in file: " + file_name; -				} -				p.parserWarning(llformat("Failed to parse parameter \"%s\" %s", p.getCurrentElementName().c_str(), file_name.c_str())); +				p.parserWarning(llformat("Failed to parse parameter \"%s\"", p.getCurrentElementName().c_str()));  			}  			return false;  		} diff --git a/indra/llcommon/llmetricperformancetester.cpp b/indra/llcommon/llmetricperformancetester.cpp index 16fc365da1..f8a93baf45 100644 --- a/indra/llcommon/llmetricperformancetester.cpp +++ b/indra/llcommon/llmetricperformancetester.cpp @@ -132,8 +132,8 @@ void LLMetricPerformanceTesterBasic::doAnalysisMetrics(std::string baseline, std  	}  	// Open baseline and current target, exit if one is inexistent -	std::ifstream base_is(baseline.c_str()); -	std::ifstream target_is(target.c_str()); +	llifstream base_is(baseline.c_str()); +	llifstream target_is(target.c_str());  	if (!base_is.is_open() || !target_is.is_open())  	{  		LL_WARNS() << "'-analyzeperformance' error : baseline or current target file inexistent" << LL_ENDL; @@ -151,7 +151,7 @@ void LLMetricPerformanceTesterBasic::doAnalysisMetrics(std::string baseline, std  	target_is.close();  	//output comparision -	std::ofstream os(output.c_str()); +	llofstream os(output.c_str());  	os << "Label, Metric, Base(B), Target(T), Diff(T-B), Percentage(100*T/B)\n";   	for(LLMetricPerformanceTesterBasic::name_tester_map_t::iterator iter = LLMetricPerformanceTesterBasic::sTesterMap.begin() ;  @@ -212,7 +212,7 @@ void LLMetricPerformanceTesterBasic::addMetric(std::string str)  }  /*virtual*/  -void LLMetricPerformanceTesterBasic::analyzePerformance(std::ofstream* os, LLSD* base, LLSD* current)  +void LLMetricPerformanceTesterBasic::analyzePerformance(llofstream* os, LLSD* base, LLSD* current)   {  	resetCurrentCount() ; @@ -254,14 +254,14 @@ void LLMetricPerformanceTesterBasic::analyzePerformance(std::ofstream* os, LLSD*  }  /*virtual*/  -void LLMetricPerformanceTesterBasic::compareTestResults(std::ofstream* os, std::string metric_string, S32 v_base, S32 v_current)  +void LLMetricPerformanceTesterBasic::compareTestResults(llofstream* os, std::string metric_string, S32 v_base, S32 v_current)   {  	*os << llformat(" ,%s, %d, %d, %d, %.4f\n", metric_string.c_str(), v_base, v_current,   						v_current - v_base, (v_base != 0) ? 100.f * v_current / v_base : 0) ;  }  /*virtual*/  -void LLMetricPerformanceTesterBasic::compareTestResults(std::ofstream* os, std::string metric_string, F32 v_base, F32 v_current)  +void LLMetricPerformanceTesterBasic::compareTestResults(llofstream* os, std::string metric_string, F32 v_base, F32 v_current)   {  	*os << llformat(" ,%s, %.4f, %.4f, %.4f, %.4f\n", metric_string.c_str(), v_base, v_current,						  						v_current - v_base, (fabs(v_base) > 0.0001f) ? 100.f * v_current / v_base : 0.f ) ; @@ -293,7 +293,7 @@ LLMetricPerformanceTesterWithSession::~LLMetricPerformanceTesterWithSession()  }  /*virtual*/  -void LLMetricPerformanceTesterWithSession::analyzePerformance(std::ofstream* os, LLSD* base, LLSD* current)  +void LLMetricPerformanceTesterWithSession::analyzePerformance(llofstream* os, LLSD* base, LLSD* current)   {  	// Load the base session  	resetCurrentCount() ; diff --git a/indra/llcommon/llmetricperformancetester.h b/indra/llcommon/llmetricperformancetester.h index e6b46be1cf..2e99ed979d 100644 --- a/indra/llcommon/llmetricperformancetester.h +++ b/indra/llcommon/llmetricperformancetester.h @@ -60,7 +60,7 @@ public:  	 * By default, compares the test results against the baseline one by one, item by item,   	 * in the increasing order of the LLSD record counter, starting from the first one.  	 */ -	virtual void analyzePerformance(std::ofstream* os, LLSD* base, LLSD* current) ; +	virtual void analyzePerformance(llofstream* os, LLSD* base, LLSD* current) ;  	static void doAnalysisMetrics(std::string baseline, std::string target, std::string output) ; @@ -93,8 +93,8 @@ protected:  	 * @param[in] v_base - Base value of the metric.  	 * @param[in] v_current - Current value of the metric.  	 */ -	virtual void compareTestResults(std::ofstream* os, std::string metric_string, S32 v_base, S32 v_current) ; -	virtual void compareTestResults(std::ofstream* os, std::string metric_string, F32 v_base, F32 v_current) ; +	virtual void compareTestResults(llofstream* os, std::string metric_string, S32 v_base, S32 v_current) ; +	virtual void compareTestResults(llofstream* os, std::string metric_string, F32 v_base, F32 v_current) ;  	/**  	 * @brief Reset internal record count. Count starts with 1. @@ -181,7 +181,7 @@ public:  	 * This will be loading the base and current sessions and compare them using the virtual   	 * abstract methods loadTestSession() and compareTestSessions()  	 */ -	virtual void analyzePerformance(std::ofstream* os, LLSD* base, LLSD* current) ; +	virtual void analyzePerformance(llofstream* os, LLSD* base, LLSD* current) ;  protected:  	/** @@ -205,7 +205,7 @@ protected:  	 * @brief Compare the base session and the target session. Assumes base and current sessions have been loaded.  	 * @param[out] os - The comparison result as a standard stream  	 */ -	virtual void compareTestSessions(std::ofstream* os) = 0; +	virtual void compareTestSessions(llofstream* os) = 0;  	LLTestSession* mBaseSessionp;  	LLTestSession* mCurrentSessionp; diff --git a/indra/llcommon/llsys.h b/indra/llcommon/llsys.h index 95ef4cf065..5ab97939b9 100644 --- a/indra/llcommon/llsys.h +++ b/indra/llcommon/llsys.h @@ -37,13 +37,14 @@  //  #include "llsd.h" +#include "llsingleton.h"  #include <iosfwd>  #include <string> -class LL_COMMON_API LLOSInfo +class LL_COMMON_API LLOSInfo : public LLSingleton<LLOSInfo>  { +	LLSINGLETON(LLOSInfo);  public: -	LLOSInfo();  	void stream(std::ostream& s) const;  	const std::string& getOSString() const; diff --git a/indra/llcorehttp/_httpinternal.h b/indra/llcorehttp/_httpinternal.h index 79c89d6c92..690ebbecd8 100644 --- a/indra/llcorehttp/_httpinternal.h +++ b/indra/llcorehttp/_httpinternal.h @@ -127,9 +127,12 @@ const int HTTP_TRACE_MAX = HTTP_TRACE_CURL_BODIES;  // We want to span a few windows to allow transport to slow  // after onset of the throttles and then recover without a final  // failure.  Other systems may need other constants. -const int HTTP_RETRY_COUNT_DEFAULT = 8; +const int HTTP_RETRY_COUNT_DEFAULT = 5;  const int HTTP_RETRY_COUNT_MIN = 0;  const int HTTP_RETRY_COUNT_MAX = 100; +const HttpTime HTTP_RETRY_BACKOFF_MIN_DEFAULT = 1E6L; // 1 sec +const HttpTime HTTP_RETRY_BACKOFF_MAX_DEFAULT = 5E6L; // 5 sec +const HttpTime HTTP_RETRY_BACKOFF_MAX = 20E6L; // 20 sec  const int HTTP_REDIRECTS_DEFAULT = 10; diff --git a/indra/llcorehttp/_httpoprequest.cpp b/indra/llcorehttp/_httpoprequest.cpp index 1049c9da96..1ef7730c8e 100644 --- a/indra/llcorehttp/_httpoprequest.cpp +++ b/indra/llcorehttp/_httpoprequest.cpp @@ -151,6 +151,8 @@ HttpOpRequest::HttpOpRequest()  	  mPolicy503Retries(0),  	  mPolicyRetryAt(HttpTime(0)),  	  mPolicyRetryLimit(HTTP_RETRY_COUNT_DEFAULT), +	  mPolicyMinRetryBackoff(HttpTime(HTTP_RETRY_BACKOFF_MIN_DEFAULT)), +	  mPolicyMaxRetryBackoff(HttpTime(HTTP_RETRY_BACKOFF_MAX_DEFAULT)),  	  mCallbackSSLVerify(NULL)  {  	// *NOTE:  As members are added, retry initialization/cleanup @@ -447,6 +449,9 @@ void HttpOpRequest::setupCommon(HttpRequest::policy_t policy_id,  		mPolicyRetryLimit = options->getRetries();  		mPolicyRetryLimit = llclamp(mPolicyRetryLimit, HTTP_RETRY_COUNT_MIN, HTTP_RETRY_COUNT_MAX);  		mTracing = (std::max)(mTracing, llclamp(options->getTrace(), HTTP_TRACE_MIN, HTTP_TRACE_MAX)); + +		mPolicyMinRetryBackoff = llclamp(options->getMinBackoff(), HttpTime(0), HTTP_RETRY_BACKOFF_MAX); +		mPolicyMaxRetryBackoff = llclamp(options->getMaxBackoff(), mPolicyMinRetryBackoff, HTTP_RETRY_BACKOFF_MAX);  	}  } diff --git a/indra/llcorehttp/_httpoprequest.h b/indra/llcorehttp/_httpoprequest.h index 201c37d5c3..cdbe350785 100644 --- a/indra/llcorehttp/_httpoprequest.h +++ b/indra/llcorehttp/_httpoprequest.h @@ -233,6 +233,8 @@ public:  	int					mPolicy503Retries;  	HttpTime			mPolicyRetryAt;  	int					mPolicyRetryLimit; +	HttpTime			mPolicyMinRetryBackoff; // initial delay between retries (mcs) +	HttpTime			mPolicyMaxRetryBackoff;  };  // end class HttpOpRequest diff --git a/indra/llcorehttp/_httppolicy.cpp b/indra/llcorehttp/_httppolicy.cpp index a302db8b46..885f0ed61d 100644 --- a/indra/llcorehttp/_httppolicy.cpp +++ b/indra/llcorehttp/_httppolicy.cpp @@ -152,20 +152,16 @@ void HttpPolicy::addOp(const HttpOpRequest::ptr_t &op)  void HttpPolicy::retryOp(const HttpOpRequest::ptr_t &op)  { -	static const HttpTime retry_deltas[] = -		{ -			 250000,			// 1st retry in 0.25 S, etc... -			 500000, -			1000000, -			2000000, -			5000000				// ... to every 5.0 S. -		}; -	static const int delta_max(int(LL_ARRAY_SIZE(retry_deltas)) - 1);  	static const HttpStatus error_503(503);  	const HttpTime now(totalTime());  	const int policy_class(op->mReqPolicy); -	HttpTime delta(retry_deltas[llclamp(op->mPolicyRetries, 0, delta_max)]); + +	HttpTime delta_min = op->mPolicyMinRetryBackoff; +	HttpTime delta_max = op->mPolicyMaxRetryBackoff; +	// mPolicyRetries limited to 100 +	U32 delta_factor = op->mPolicyRetries <= 10 ? 1 << op->mPolicyRetries : 1024; +	HttpTime delta = llmin(delta_min * delta_factor, delta_max);  	bool external_delta(false);  	if (op->mReplyRetryAfter > 0 && op->mReplyRetryAfter < 30) diff --git a/indra/llcorehttp/httpoptions.cpp b/indra/llcorehttp/httpoptions.cpp index aab447f2dd..df5aa52fa9 100644 --- a/indra/llcorehttp/httpoptions.cpp +++ b/indra/llcorehttp/httpoptions.cpp @@ -39,6 +39,8 @@ HttpOptions::HttpOptions() :      mTimeout(HTTP_REQUEST_TIMEOUT_DEFAULT),      mTransferTimeout(HTTP_REQUEST_XFER_TIMEOUT_DEFAULT),      mRetries(HTTP_RETRY_COUNT_DEFAULT), +    mMinRetryBackoff(HTTP_RETRY_BACKOFF_MIN_DEFAULT), +    mMaxRetryBackoff(HTTP_RETRY_BACKOFF_MAX_DEFAULT),      mUseRetryAfter(HTTP_USE_RETRY_AFTER_DEFAULT),      mFollowRedirects(true),      mVerifyPeer(false), @@ -81,6 +83,16 @@ void HttpOptions::setRetries(unsigned int retries)  	mRetries = retries;  } +void HttpOptions::setMinBackoff(HttpTime delay) +{ +	mMinRetryBackoff = delay; +} + +void HttpOptions::setMaxBackoff(HttpTime delay) +{ +	mMaxRetryBackoff = delay; +} +  void HttpOptions::setUseRetryAfter(bool use_retry)  {  	mUseRetryAfter = use_retry; diff --git a/indra/llcorehttp/httpoptions.h b/indra/llcorehttp/httpoptions.h index 510eaa45bb..8a6de61b04 100644 --- a/indra/llcorehttp/httpoptions.h +++ b/indra/llcorehttp/httpoptions.h @@ -101,13 +101,31 @@ public:      /// Sets the number of retries on an LLCore::HTTPRequest before the       /// request fails. -	// Default:  8 +	// Default:  5  	void				setRetries(unsigned int retries);  	unsigned int		getRetries() const  	{  		return mRetries;  	} +	/// Sets minimal delay before request retries. In microseconds. +	/// HttpPolicy will increase delay from min to max with each retry +	// Default: 1 000 000 mcs +	void				setMinBackoff(HttpTime delay); +	HttpTime			getMinBackoff() const +	{ +		return mMinRetryBackoff; +	} + +	/// Sets maximum delay before request retries. In microseconds. +	/// HttpPolicy will increase delay from min to max with each retry +	// Default:  5 000 000 mcs +	void				setMaxBackoff(HttpTime delay); +	HttpTime			getMaxBackoff() const +	{ +		return mMaxRetryBackoff; +	} +  	// Default:  true  	void				setUseRetryAfter(bool use_retry);  	bool				getUseRetryAfter() const @@ -166,6 +184,8 @@ protected:  	unsigned int		mTimeout;  	unsigned int		mTransferTimeout;  	unsigned int		mRetries; +	HttpTime			mMinRetryBackoff; +	HttpTime			mMaxRetryBackoff;  	bool				mUseRetryAfter;  	bool				mFollowRedirects;  	bool				mVerifyPeer; diff --git a/indra/llcrashlogger/llcrashlock.cpp b/indra/llcrashlogger/llcrashlock.cpp index 7dde1fcd69..77abfbcf0f 100644 --- a/indra/llcrashlogger/llcrashlock.cpp +++ b/indra/llcrashlogger/llcrashlock.cpp @@ -188,12 +188,22 @@ LLSD LLCrashLock::getProcessList()  //static  bool LLCrashLock::fileExists(std::string filename)  { -	return boost::filesystem::exists(filename.c_str()); +#ifdef LL_WINDOWS // or BOOST_WINDOWS_API +	boost::filesystem::path file_path(utf8str_to_utf16str(filename)); +#else +	boost::filesystem::path file_path(filename); +#endif +	return boost::filesystem::exists(file_path);  }  void LLCrashLock::cleanupProcess(std::string proc_dir)  { -    boost::filesystem::remove_all(proc_dir); +#ifdef LL_WINDOWS // or BOOST_WINDOWS_API +	boost::filesystem::path dir_path(utf8str_to_utf16str(proc_dir)); +#else +	boost::filesystem::path dir_path(proc_dir); +#endif +	boost::filesystem::remove_all(dir_path);  }  bool LLCrashLock::putProcessList(const LLSD& proc_sd) diff --git a/indra/llcrashlogger/llcrashlogger.cpp b/indra/llcrashlogger/llcrashlogger.cpp index dca49be051..1d58dba9ab 100644 --- a/indra/llcrashlogger/llcrashlogger.cpp +++ b/indra/llcrashlogger/llcrashlogger.cpp @@ -155,9 +155,9 @@ std::string getStartupStateFromLog(std::string& sllog)  bool LLCrashLogger::readFromXML(LLSD& dest, const std::string& filename )  { -    std::string db_file_name = gDirUtilp->getExpandedFilename(LL_PATH_DUMP,filename); -    std::ifstream log_file(db_file_name.c_str()); -     +	std::string db_file_name = gDirUtilp->getExpandedFilename(LL_PATH_DUMP,filename); +	llifstream log_file(db_file_name.c_str()); +  	// Look for it in the given file  	if (log_file.is_open())  	{ @@ -186,7 +186,7 @@ bool LLCrashLogger::readMinidump(std::string minidump_path)  {  	size_t length=0; -	std::ifstream minidump_stream(minidump_path.c_str(), std::ios_base::in | std::ios_base::binary); +	llifstream minidump_stream(minidump_path.c_str(), std::ios_base::in | std::ios_base::binary);  	if(minidump_stream.is_open())  	{  		minidump_stream.seekg(0, std::ios::end); @@ -287,7 +287,7 @@ void LLCrashLogger::gatherFiles()          if (!file.empty())          {              LL_DEBUGS("CRASHREPORT") << "trying to read " << itr->first << ": " << file << LL_ENDL; -            std::ifstream f(file.c_str()); +            llifstream f(file.c_str());              if(f.is_open())              {                  std::stringstream s; @@ -342,7 +342,7 @@ void LLCrashLogger::gatherFiles()              if ( ( iter->length() > 30 ) && (iter->rfind(".dmp") == (iter->length()-4) ) )              {                  std::string fullname = pathname + *iter; -                std::ifstream fdat( fullname.c_str(), std::ifstream::binary); +                llifstream fdat(fullname.c_str(), std::ifstream::binary);                  if (fdat)                  {                      char buf[5]; @@ -462,7 +462,7 @@ bool LLCrashLogger::sendCrashLog(std::string dump_dir)  	updateApplication("Sending reports..."); -	std::ofstream out_file(report_file.c_str()); +	llofstream out_file(report_file.c_str());  	LLSDSerialize::toPrettyXML(post_data, out_file);      out_file.flush();  	out_file.close(); diff --git a/indra/llimage/llimage.cpp b/indra/llimage/llimage.cpp index fe49e8e011..bb345e282a 100644 --- a/indra/llimage/llimage.cpp +++ b/indra/llimage/llimage.cpp @@ -1437,7 +1437,7 @@ void LLImageRaw::copyScaled( LLImageRaw* src )  bool LLImageRaw::scale( S32 new_width, S32 new_height, bool scale_image_data )  {      S32 components = getComponents(); -	if (! ((1 == components) || (3 == components) || (4 == components) )) +    if (components != 1 && components != 3 && components != 4)      {          LL_WARNS() << "Invalid getComponents value (" << components << ")" << LL_ENDL;          return false; @@ -1513,6 +1513,55 @@ bool LLImageRaw::scale( S32 new_width, S32 new_height, bool scale_image_data )  	return true ;  } +LLPointer<LLImageRaw> LLImageRaw::scaled(S32 new_width, S32 new_height) +{ +    LLPointer<LLImageRaw> result; + +    S32 components = getComponents(); +    if (components != 1 && components != 3 && components != 4) +    { +        LL_WARNS() << "Invalid getComponents value (" << components << ")" << LL_ENDL; +        return result; +    } + +    if (isBufferInvalid()) +    { +        LL_WARNS() << "Invalid image buffer" << LL_ENDL; +        return result; +    } + +    S32 old_width = getWidth(); +    S32 old_height = getHeight(); + +    if ((old_width == new_width) && (old_height == new_height)) +    { +        result = new LLImageRaw(old_width, old_height, components); +        if (!result) +        { +            LL_WARNS() << "Failed to allocate new image" << LL_ENDL; +            return result; +        } +        memcpy(result->getData(), getData(), getDataSize()); +    } +    else +    { +        S32 new_data_size = new_width * new_height * components; + +        if (new_data_size > 0) +        { +            result = new LLImageRaw(new_width, new_height, components); +            if (!result) +            { +                LL_WARNS() << "Failed to allocate new image" << LL_ENDL; +                return result; +            } +            bilinear_scale(getData(), old_width, old_height, components, old_width*components, result->getData(), new_width, new_height, components, new_width*components); +        } +    } + +    return result; +} +  void LLImageRaw::copyLineScaled( U8* in, U8* out, S32 in_pixel_len, S32 out_pixel_len, S32 in_pixel_step, S32 out_pixel_step )  {  	const S32 components = getComponents(); @@ -1786,10 +1835,13 @@ static std::string find_file(std::string &name, S8 *codec)  #endif  EImageCodec LLImageBase::getCodecFromExtension(const std::string& exten)  { -	for (int i=0; i<(int)(NUM_FILE_EXTENSIONS); i++) +	if (!exten.empty())  	{ -		if (exten == file_extensions[i].exten) -			return file_extensions[i].codec; +		for (int i = 0; i < (int)(NUM_FILE_EXTENSIONS); i++) +		{ +			if (exten == file_extensions[i].exten) +				return file_extensions[i].codec; +		}  	}  	return IMG_CODEC_INVALID;  } diff --git a/indra/llimage/llimage.h b/indra/llimage/llimage.h index d0bd4a2aef..958c9fad3d 100644 --- a/indra/llimage/llimage.h +++ b/indra/llimage/llimage.h @@ -215,7 +215,8 @@ public:  	void expandToPowerOfTwo(S32 max_dim = MAX_IMAGE_SIZE, bool scale_image = true);  	void contractToPowerOfTwo(S32 max_dim = MAX_IMAGE_SIZE, bool scale_image = true);  	void biasedScaleToPowerOfTwo(S32 max_dim = MAX_IMAGE_SIZE); -	bool scale( S32 new_width, S32 new_height, bool scale_image = true ); +	bool scale(S32 new_width, S32 new_height, bool scale_image = true); +    LLPointer<LLImageRaw> scaled(S32 new_width, S32 new_height);  	// Fill the buffer with a constant color  	void fill( const LLColor4U& color ); diff --git a/indra/llmath/llvolume.cpp b/indra/llmath/llvolume.cpp index 274ec50f20..44a33d9bc3 100644 --- a/indra/llmath/llvolume.cpp +++ b/indra/llmath/llvolume.cpp @@ -5311,19 +5311,31 @@ void LLVolumeFace::cacheOptimize()  	S32 num_verts = mNumVertices;  	S32 size = ((num_verts*sizeof(LLVector2)) + 0xF) & ~0xF;  	LLVector4a* pos = (LLVector4a*) ll_aligned_malloc<64>(sizeof(LLVector4a)*2*num_verts+size); +	if (pos == NULL) +	{ +		LL_ERRS("LLVOLUME") << "Allocation of positions vector[" << sizeof(LLVector4a) * 2 * num_verts + size  << "] failed. " << LL_ENDL; +	}  	LLVector4a* norm = pos + num_verts;  	LLVector2* tc = (LLVector2*) (norm + num_verts);  	LLVector4a* wght = NULL;  	if (mWeights)  	{ -		wght = (LLVector4a*) ll_aligned_malloc_16(sizeof(LLVector4a)*num_verts); +		wght = (LLVector4a*)ll_aligned_malloc_16(sizeof(LLVector4a)*num_verts); +		if (wght == NULL) +		{ +			LL_ERRS("LLVOLUME") << "Allocation of weights[" << sizeof(LLVector4a) * num_verts << "] failed" << LL_ENDL; +		}  	}  	LLVector4a* binorm = NULL;  	if (mTangents)  	{  		binorm = (LLVector4a*) ll_aligned_malloc_16(sizeof(LLVector4a)*num_verts); +		if (binorm == NULL) +		{ +			LL_ERRS("LLVOLUME") << "Allocation of binormals[" << sizeof(LLVector4a)*num_verts << "] failed" << LL_ENDL; +		}  	}  	//allocate mapping of old indices to new indices diff --git a/indra/llrender/llgl.cpp b/indra/llrender/llgl.cpp index 18063e9700..155c2402bd 100644 --- a/indra/llrender/llgl.cpp +++ b/indra/llrender/llgl.cpp @@ -64,7 +64,7 @@ static const std::string HEADLESS_VENDOR_STRING("Linden Lab");  static const std::string HEADLESS_RENDERER_STRING("Headless");  static const std::string HEADLESS_VERSION_STRING("1.0"); -std::ofstream gFailLog; +llofstream gFailLog;  #if GL_ARB_debug_output diff --git a/indra/llrender/llgl.h b/indra/llrender/llgl.h index 75e5fe86ec..aa98b3f6bc 100644 --- a/indra/llrender/llgl.h +++ b/indra/llrender/llgl.h @@ -47,7 +47,7 @@  extern BOOL gDebugGL;  extern BOOL gDebugSession; -extern std::ofstream gFailLog; +extern llofstream gFailLog;  #define LL_GL_ERRS LL_ERRS("RenderState") diff --git a/indra/llui/llfolderviewmodel.h b/indra/llui/llfolderviewmodel.h index 641241a88c..f71a88c56e 100644 --- a/indra/llui/llfolderviewmodel.h +++ b/indra/llui/llfolderviewmodel.h @@ -147,6 +147,10 @@ public:  	virtual const std::string& getDisplayName() const = 0;  	virtual const std::string& getSearchableName() const = 0; +	virtual std::string getSearchableDescription() const = 0; +	virtual std::string getSearchableCreatorName()const = 0; +	virtual std::string getSearchableUUIDString() const = 0; +  	virtual LLPointer<LLUIImage> getIcon() const = 0;  	virtual LLPointer<LLUIImage> getIconOpen() const { return getIcon(); }  	virtual LLPointer<LLUIImage> getIconOverlay() const { return NULL; } diff --git a/indra/llui/llscrollcontainer.cpp b/indra/llui/llscrollcontainer.cpp index f70eebc594..6135cc56ad 100644 --- a/indra/llui/llscrollcontainer.cpp +++ b/indra/llui/llscrollcontainer.cpp @@ -72,6 +72,7 @@ LLScrollContainer::Params::Params()  	hide_scrollbar("hide_scrollbar"),  	min_auto_scroll_rate("min_auto_scroll_rate", 100),  	max_auto_scroll_rate("max_auto_scroll_rate", 1000), +	max_auto_scroll_zone("max_auto_scroll_zone", 16),  	reserve_scroll_corner("reserve_scroll_corner", false),  	size("size", -1)  {} @@ -88,6 +89,7 @@ LLScrollContainer::LLScrollContainer(const LLScrollContainer::Params& p)  	mReserveScrollCorner(p.reserve_scroll_corner),  	mMinAutoScrollRate(p.min_auto_scroll_rate),  	mMaxAutoScrollRate(p.max_auto_scroll_rate), +	mMaxAutoScrollZone(p.max_auto_scroll_zone),  	mScrolledView(NULL),  	mSize(p.size)  { @@ -290,8 +292,22 @@ BOOL LLScrollContainer::handleDragAndDrop(S32 x, S32 y, MASK mask,  	return TRUE;  } +bool LLScrollContainer::canAutoScroll(S32 x, S32 y) +{ +	if (mAutoScrolling) +	{ +		return true; // already scrolling +	} +	return autoScroll(x, y, false); +} +  bool LLScrollContainer::autoScroll(S32 x, S32 y)  { +	return autoScroll(x, y, true); +} + +bool LLScrollContainer::autoScroll(S32 x, S32 y, bool do_scroll) +{  	static LLUICachedControl<S32> scrollbar_size_control ("UIScrollbarSize", 0);  	S32 scrollbar_size = (mSize == -1 ? scrollbar_size_control : mSize); @@ -302,6 +318,8 @@ bool LLScrollContainer::autoScroll(S32 x, S32 y)  		screenRectToLocal(getRootView()->getLocalRect(), &screen_local_extents);  		LLRect inner_rect_local( 0, mInnerRect.getHeight(), mInnerRect.getWidth(), 0 ); +		// Note: Will also include scrollers as scroll zones, so opposite +		// scroll zones might have different size due to visible scrollers  		if(	mScrollbar[HORIZONTAL]->getVisible() )  		{  			inner_rect_local.mBottom += scrollbar_size; @@ -316,8 +334,8 @@ bool LLScrollContainer::autoScroll(S32 x, S32 y)  		S32 auto_scroll_speed = ll_round(mAutoScrollRate * LLFrameTimer::getFrameDeltaTimeF32());  		// autoscroll region should take up no more than one third of visible scroller area -		S32 auto_scroll_region_width = llmin(inner_rect_local.getWidth() / 3, 10);  -		S32 auto_scroll_region_height = llmin(inner_rect_local.getHeight() / 3, 10);  +		S32 auto_scroll_region_width = llmin(inner_rect_local.getWidth() / 3, (S32)mMaxAutoScrollZone);  +		S32 auto_scroll_region_height = llmin(inner_rect_local.getHeight() / 3, (S32)mMaxAutoScrollZone);   		if(	mScrollbar[HORIZONTAL]->getVisible() )  		{ @@ -325,8 +343,11 @@ bool LLScrollContainer::autoScroll(S32 x, S32 y)  			left_scroll_rect.mRight = inner_rect_local.mLeft + auto_scroll_region_width;  			if( left_scroll_rect.pointInRect( x, y ) && (mScrollbar[HORIZONTAL]->getDocPos() > 0) )  			{ -				mScrollbar[HORIZONTAL]->setDocPos( mScrollbar[HORIZONTAL]->getDocPos() - auto_scroll_speed ); -				mAutoScrolling = TRUE; +				if (do_scroll) +				{ +					mScrollbar[HORIZONTAL]->setDocPos(mScrollbar[HORIZONTAL]->getDocPos() - auto_scroll_speed); +					mAutoScrolling = TRUE; +				}  				scrolling = true;  			} @@ -334,8 +355,11 @@ bool LLScrollContainer::autoScroll(S32 x, S32 y)  			right_scroll_rect.mLeft = inner_rect_local.mRight - auto_scroll_region_width;  			if( right_scroll_rect.pointInRect( x, y ) && (mScrollbar[HORIZONTAL]->getDocPos() < mScrollbar[HORIZONTAL]->getDocPosMax()) )  			{ -				mScrollbar[HORIZONTAL]->setDocPos( mScrollbar[HORIZONTAL]->getDocPos() + auto_scroll_speed ); -				mAutoScrolling = TRUE; +				if (do_scroll) +				{ +					mScrollbar[HORIZONTAL]->setDocPos(mScrollbar[HORIZONTAL]->getDocPos() + auto_scroll_speed); +					mAutoScrolling = TRUE; +				}  				scrolling = true;  			}  		} @@ -345,8 +369,11 @@ bool LLScrollContainer::autoScroll(S32 x, S32 y)  			bottom_scroll_rect.mTop = inner_rect_local.mBottom + auto_scroll_region_height;  			if( bottom_scroll_rect.pointInRect( x, y ) && (mScrollbar[VERTICAL]->getDocPos() < mScrollbar[VERTICAL]->getDocPosMax()) )  			{ -				mScrollbar[VERTICAL]->setDocPos( mScrollbar[VERTICAL]->getDocPos() + auto_scroll_speed ); -				mAutoScrolling = TRUE; +				if (do_scroll) +				{ +					mScrollbar[VERTICAL]->setDocPos(mScrollbar[VERTICAL]->getDocPos() + auto_scroll_speed); +					mAutoScrolling = TRUE; +				}  				scrolling = true;  			} @@ -354,8 +381,11 @@ bool LLScrollContainer::autoScroll(S32 x, S32 y)  			top_scroll_rect.mBottom = inner_rect_local.mTop - auto_scroll_region_height;  			if( top_scroll_rect.pointInRect( x, y ) && (mScrollbar[VERTICAL]->getDocPos() > 0) )  			{ -				mScrollbar[VERTICAL]->setDocPos( mScrollbar[VERTICAL]->getDocPos() - auto_scroll_speed ); -				mAutoScrolling = TRUE; +				if (do_scroll) +				{ +					mScrollbar[VERTICAL]->setDocPos(mScrollbar[VERTICAL]->getDocPos() - auto_scroll_speed); +					mAutoScrolling = TRUE; +				}  				scrolling = true;  			}  		} diff --git a/indra/llui/llscrollcontainer.h b/indra/llui/llscrollcontainer.h index c4c4d0a136..e6c7891397 100644 --- a/indra/llui/llscrollcontainer.h +++ b/indra/llui/llscrollcontainer.h @@ -66,6 +66,7 @@ public:  							hide_scrollbar;  		Optional<F32>		min_auto_scroll_rate,  							max_auto_scroll_rate; +		Optional<U32>		max_auto_scroll_zone;  		Optional<LLUIColor>	bg_color;  		Optional<LLScrollbar::callback_t> scroll_callback;  		Optional<S32>		size; @@ -114,7 +115,8 @@ public:  	virtual void	draw();  	virtual bool	addChild(LLView* view, S32 tab_group = 0); -	 + +	bool canAutoScroll(S32 x, S32 y);  	bool autoScroll(S32 x, S32 y);  	S32 getSize() const { return mSize; } @@ -128,6 +130,7 @@ private:  	virtual void scrollHorizontal( S32 new_pos );  	virtual void scrollVertical( S32 new_pos );  	void updateScroll(); +	bool autoScroll(S32 x, S32 y, bool do_scroll);  	void calcVisibleSize( S32 *visible_width, S32 *visible_height, BOOL* show_h_scrollbar, BOOL* show_v_scrollbar ) const;  	LLScrollbar* mScrollbar[ORIENTATION_COUNT]; @@ -141,6 +144,7 @@ private:  	F32			mAutoScrollRate;  	F32			mMinAutoScrollRate;  	F32			mMaxAutoScrollRate; +	U32			mMaxAutoScrollZone;  	bool		mHideScrollbar;  }; diff --git a/indra/llui/llxuiparser.cpp b/indra/llui/llxuiparser.cpp index 99a0869ce3..138ba8bf02 100644 --- a/indra/llui/llxuiparser.cpp +++ b/indra/llui/llxuiparser.cpp @@ -58,10 +58,6 @@ static 	LLInitParam::Parser::parser_inspect_func_map_t sSimpleXUIInspectFuncs;  const char* NO_VALUE_MARKER = "no_value"; -#ifdef LL_WINDOWS -const S32 LINE_NUMBER_HERE = 0; -#endif -  struct MaxOccursValues : public LLInitParam::TypeValuesHelper<U32, MaxOccursValues>  {  	static void declareValues() @@ -1313,22 +1309,14 @@ bool LLXUIParser::writeSDValue(Parser& parser, const void* val_ptr, name_stack_t  void LLXUIParser::parserWarning(const std::string& message)  { -#ifdef LL_WINDOWS -	// use Visual Studio friendly formatting of output message for easy access to originating xml -	LL_INFOS() << llformat("%s(%d):\t%s", mCurFileName.c_str(), mCurReadNode->getLineNumber(), message.c_str()) << LL_ENDL; -#else -	Parser::parserWarning(message); -#endif +	std::string warning_msg = llformat("%s:\t%s(%d)", message.c_str(), mCurFileName.c_str(), mCurReadNode->getLineNumber()); +	Parser::parserWarning(warning_msg);  }  void LLXUIParser::parserError(const std::string& message)  { -#ifdef LL_WINDOWS -    // use Visual Studio friendly formatting of output message for easy access to originating xml -	LL_INFOS() << llformat("%s(%d):\t%s", mCurFileName.c_str(), mCurReadNode->getLineNumber(), message.c_str()) << LL_ENDL; -#else -	Parser::parserError(message); -#endif +	std::string error_msg = llformat("%s:\t%s(%d)", message.c_str(), mCurFileName.c_str(), mCurReadNode->getLineNumber()); +	Parser::parserError(error_msg);  } @@ -1641,22 +1629,14 @@ bool LLSimpleXUIParser::processText()  void LLSimpleXUIParser::parserWarning(const std::string& message)  { -#ifdef LL_WINDOWS -	// use Visual Studio friendly formatting of output message for easy access to originating xml -	LL_INFOS() << llformat("%s(%d):\t%s", mCurFileName.c_str(), LINE_NUMBER_HERE, message.c_str()) << LL_ENDL; -#else -	Parser::parserWarning(message); -#endif +	std::string warning_msg = llformat("%s:\t%s",  message.c_str(), mCurFileName.c_str()); +	Parser::parserWarning(warning_msg);  }  void LLSimpleXUIParser::parserError(const std::string& message)  { -#ifdef LL_WINDOWS -        // use Visual Studio friendly formatting of output message for easy access to originating xml -	LL_INFOS() << llformat("%s(%d):\t%s", mCurFileName.c_str(), LINE_NUMBER_HERE, message.c_str()) << LL_ENDL; -#else -	Parser::parserError(message); -#endif +	std::string error_msg = llformat("%s:\t%s",  message.c_str(), mCurFileName.c_str()); +	Parser::parserError(error_msg);  }  bool LLSimpleXUIParser::readFlag(Parser& parser, void* val_ptr) diff --git a/indra/llvfs/lldir.cpp b/indra/llvfs/lldir.cpp index 924e1166ee..b845de71fa 100644 --- a/indra/llvfs/lldir.cpp +++ b/indra/llvfs/lldir.cpp @@ -104,8 +104,13 @@ LLDir::~LLDir()  std::vector<std::string> LLDir::getFilesInDir(const std::string &dirname)  {      //Returns a vector of fullpath filenames. -     -    boost::filesystem::path p (dirname); + +#ifdef LL_WINDOWS // or BOOST_WINDOWS_API +    boost::filesystem::path p(utf8str_to_utf16str(dirname)); +#else +    boost::filesystem::path p(dirname); +#endif +      std::vector<std::string> v;      if (exists(p)) @@ -193,7 +198,12 @@ U32 LLDir::deleteDirAndContents(const std::string& dir_name)  	try  	{ -	   boost::filesystem::path dir_path(dir_name); +#ifdef LL_WINDOWS // or BOOST_WINDOWS_API +		boost::filesystem::path dir_path(utf8str_to_utf16str(dir_name)); +#else +		boost::filesystem::path dir_path(dir_name); +#endif +  	   if (boost::filesystem::exists (dir_path))  	   {  	      if (!boost::filesystem::is_empty (dir_path)) diff --git a/indra/media_plugins/cef/media_plugin_cef.cpp b/indra/media_plugins/cef/media_plugin_cef.cpp index 74a0febe3c..f3d7762a08 100644 --- a/indra/media_plugins/cef/media_plugin_cef.cpp +++ b/indra/media_plugins/cef/media_plugin_cef.cpp @@ -388,6 +388,7 @@ void MediaPluginCEF::receiveMessage(const char* message_string)  			}  			else if (message_name == "cleanup")  			{ +				mVolumeCatcher.setVolume(0);  				mCEFLib->requestExit();  			}  			else if (message_name == "shm_added") diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index cb4be8d9fc..c0e963c228 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -812,6 +812,17 @@        <key>Value</key>        <integer>0</integer>      </map> +    <key>FramePerSecondLimit</key> +    <map> +      <key>Comment</key> +      <string>Controls upper limit of frames per second</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>U32</string> +      <key>Value</key> +      <integer>120</integer> +    </map>      <key>BackgroundYieldTime</key>      <map>        <key>Comment</key> @@ -1382,7 +1393,7 @@        <key>Type</key>        <string>U32</string>        <key>Value</key> -      <integer>512</integer> +      <integer>1024</integer>      </map>      <key>CacheValidateCounter</key>      <map> @@ -4534,7 +4545,7 @@        <key>Type</key>        <string>String</string>        <key>Value</key> -      <string>http://search.secondlife.com/viewer/[CATEGORY]/?q=[QUERY]&p=[AUTH_TOKEN]&r=[MATURITY]&lang=[LANGUAGE]&g=[GODLIKE]&sid=[SESSION_ID]&rid=[REGION_ID]&pid=[PARCEL_ID]&channel=[CHANNEL]&version=[VERSION]&major=[VERSION_MAJOR]&minor=[VERSION_MINOR]&patch=[VERSION_PATCH]&build=[VERSION_BUILD]</string> +      <string>https://search.[GRID]/viewer/[CATEGORY]/?q=[QUERY]&p=[AUTH_TOKEN]&r=[MATURITY]&lang=[LANGUAGE]&g=[GODLIKE]&sid=[SESSION_ID]&rid=[REGION_ID]&pid=[PARCEL_ID]&channel=[CHANNEL]&version=[VERSION]&major=[VERSION_MAJOR]&minor=[VERSION_MINOR]&patch=[VERSION_PATCH]&build=[VERSION_BUILD]</string>      </map>      <key>HighResSnapshot</key>      <map> @@ -5581,12 +5592,12 @@      <key>Type</key>      <string>F32</string>      <key>Value</key> -    <real>10.0</real> +    <real>40.0</real>    </map>    <key>LoginSRVPump</key>    <map>      <key>Comment</key> -    <string>Name of the message pump that handles SRV request</string> +    <string>Name of the message pump that handles SRV request (deprecated)</string>      <key>Persist</key>      <integer>0</integer>      <key>Type</key> diff --git a/indra/newview/installers/windows/installer_template.nsi b/indra/newview/installers/windows/installer_template.nsi index ade808e3e2..cd867d79b3 100644 --- a/indra/newview/installers/windows/installer_template.nsi +++ b/indra/newview/installers/windows/installer_template.nsi @@ -324,11 +324,6 @@ CreateShortCut "$INSTDIR\$INSTSHORTCUT.lnk" \  CreateShortCut "$INSTDIR\Uninstall $INSTSHORTCUT.lnk" \
  				'"$INSTDIR\uninst.exe"' ''
 -# Create *.bat file to specify lang params on first run from installer - see MAINT-5259S
 -FileOpen $9 "$INSTDIR\autorun.bat" w
 -FileWrite $9 'start "$INSTDIR\$INSTEXE" /d "$INSTDIR" "$INSTDIR\$INSTEXE" $SHORTCUT_LANG_PARAM$\r$\n'
 -FileClose $9
 -
  # Write registry
  WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\$INSTPROG" "" "$INSTDIR"
  WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\$INSTPROG" "Version" "${VERSION_LONG}"
 @@ -724,7 +719,7 @@ Call CheckWindowsServPack		# Warn if not on the latest SP before asking to launc          Push $R0					# Option value, unused# 
          StrCmp $SKIP_AUTORUN "true" +2;
  # Assumes SetOutPath $INSTDIR
 -        Exec '"$WINDIR\explorer.exe" "$INSTDIR\autorun.bat"'
 +	Exec '"$WINDIR\explorer.exe" "$INSTDIR\$INSTSHORTCUT.lnk"'
          Pop $R0
  # 
  FunctionEnd
 diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp index c928cf0601..0fb811a386 100644 --- a/indra/newview/llappearancemgr.cpp +++ b/indra/newview/llappearancemgr.cpp @@ -1321,6 +1321,8 @@ static void removeDuplicateItems(LLInventoryModel::item_array_t& items)  //========================================================================= +const std::string LLAppearanceMgr::sExpectedTextureName = "OutfitPreview"; +  const LLUUID LLAppearanceMgr::getCOF() const  {  	return gInventory.findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT); @@ -1571,7 +1573,14 @@ void LLAppearanceMgr::removeOutfitPhoto(const LLUUID& outfit_id)      BOOST_FOREACH(LLViewerInventoryItem* outfit_item, outfit_item_array)      {          LLViewerInventoryItem* linked_item = outfit_item->getLinkedItem(); -        if (linked_item != NULL && linked_item->getActualType() == LLAssetType::AT_TEXTURE) +        if (linked_item != NULL) +        { +            if (linked_item->getActualType() == LLAssetType::AT_TEXTURE) +            { +                gInventory.removeItem(outfit_item->getUUID()); +            } +        } +        else if (outfit_item->getActualType() == LLAssetType::AT_TEXTURE)          {              gInventory.removeItem(outfit_item->getUUID());          } @@ -3209,6 +3218,7 @@ void appearance_mgr_update_dirty_state()  void update_base_outfit_after_ordering()  {  	LLAppearanceMgr& app_mgr = LLAppearanceMgr::instance(); +	app_mgr.setOutfitImage(LLUUID());  	LLInventoryModel::cat_array_t sub_cat_array;  	LLInventoryModel::item_array_t outfit_item_array;  	gInventory.collectDescendents(app_mgr.getBaseOutfitUUID(), @@ -3218,9 +3228,26 @@ void update_base_outfit_after_ordering()  	BOOST_FOREACH(LLViewerInventoryItem* outfit_item, outfit_item_array)  	{  		LLViewerInventoryItem* linked_item = outfit_item->getLinkedItem(); -		if (linked_item != NULL && linked_item->getActualType() == LLAssetType::AT_TEXTURE) +		if (linked_item != NULL) +		{ +			if (linked_item->getActualType() == LLAssetType::AT_TEXTURE) +			{ +				app_mgr.setOutfitImage(linked_item->getLinkedUUID()); +				if (linked_item->getName() == LLAppearanceMgr::sExpectedTextureName) +				{ +					// Images with "appropriate" name take priority +					break; +				} +			} +		} +		else if (outfit_item->getActualType() == LLAssetType::AT_TEXTURE)  		{ -			app_mgr.setOutfitImage(linked_item->getLinkedUUID()); +			app_mgr.setOutfitImage(outfit_item->getUUID()); +			if (outfit_item->getName() == LLAppearanceMgr::sExpectedTextureName) +			{ +				// Images with "appropriate" name take priority +				break; +			}  		}  	} diff --git a/indra/newview/llappearancemgr.h b/indra/newview/llappearancemgr.h index 166c663feb..c274a8b049 100644 --- a/indra/newview/llappearancemgr.h +++ b/indra/newview/llappearancemgr.h @@ -291,6 +291,9 @@ public:  	BOOL getIsInCOF(const LLUUID& obj_id) const;  	// Is this in the COF and can the user delete it from the COF?  	BOOL getIsProtectedCOFItem(const LLUUID& obj_id) const; + +	// Outfits will prioritize textures with such name to use for preview in gallery +	static const std::string sExpectedTextureName;  };  class LLUpdateAppearanceOnDestroy: public LLInventoryCallback diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index 9bab572b68..c320c9c0be 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -309,8 +309,6 @@ F32SecondsImplicit gFrameIntervalSeconds = 0.f;  F32 gFPSClamped = 10.f;						// Pretend we start at target rate.  F32 gFrameDTClamped = 0.f;					// Time between adjacent checks to network for packets  U64MicrosecondsImplicit	gStartTime = 0; // gStartTime is "private", used only to calculate gFrameTimeSeconds -U32 gFrameStalls = 0; -const F64 FRAME_STALL_THRESHOLD = 1.0;  LLTimer gRenderStartTime;  LLFrameTimer gForegroundTime; @@ -633,7 +631,7 @@ public:  	void run()  	{ -		std::ofstream os(mFile.c_str()); +		llofstream os(mFile.c_str());  		while (!LLAppViewer::instance()->isQuitting())  		{ @@ -696,7 +694,8 @@ LLAppViewer::LLAppViewer()  	mPeriodicSlowFrame(LLCachedControl<bool>(gSavedSettings,"Periodic Slow Frame", FALSE)),  	mFastTimerLogThread(NULL),  	mSettingsLocationList(NULL), -	mIsFirstRun(false) +	mIsFirstRun(false), +	mMinMicroSecPerFrame(0.f)  {  	if(NULL != sInstance)  	{ @@ -724,7 +723,7 @@ LLAppViewer::LLAppViewer()  	// OK to write stuff to logs now, we've now crash reported if necessary  	// -	LLLoginInstance::instance().setPlatformInfo(gPlatform, getOSInfo().getOSVersionString(), getOSInfo().getOSStringSimple()); +	LLLoginInstance::instance().setPlatformInfo(gPlatform, LLOSInfo::instance().getOSVersionString(), LLOSInfo::instance().getOSStringSimple());  }  LLAppViewer::~LLAppViewer() @@ -1241,6 +1240,9 @@ bool LLAppViewer::init()  	joystick->setNeedsReset(true);  	/*----------------------------------------------------------------------*/ +	gSavedSettings.getControl("FramePerSecondLimit")->getSignal()->connect(boost::bind(&LLAppViewer::onChangeFrameLimit, this, _2)); +	onChangeFrameLimit(gSavedSettings.getLLSD("FramePerSecondLimit")); +  	return true;  } @@ -1320,9 +1322,6 @@ bool LLAppViewer::frame()  	LLEventPump& mainloop(LLEventPumps::instance().obtain("mainloop"));  	LLSD newFrame; -	LLTimer frameTimer,idleTimer; -	LLTimer debugTime; -  	//LLPrivateMemoryPoolTester::getInstance()->run(false) ;  	//LLPrivateMemoryPoolTester::getInstance()->run(true) ;  	//LLPrivateMemoryPoolTester::destroy() ; @@ -1363,14 +1362,6 @@ bool LLAppViewer::frame()  			gViewerWindow->getWindow()->gatherInput();  		} -#if 1 && !LL_RELEASE_FOR_DOWNLOAD -		// once per second debug info -		if (debugTime.getElapsedTimeF32() > 1.f) -		{ -			debugTime.reset(); -		} -		 -#endif  		//memory leaking simulation  		LLFloaterMemLeak* mem_leak_instance =  			LLFloaterReg::findTypedInstance<LLFloaterMemLeak>("mem_leaking"); @@ -1424,7 +1415,24 @@ bool LLAppViewer::frame()  			{  				pingMainloopTimeout("Main:Display");  				gGLActive = TRUE; + +				static U64 last_call = 0; +				if (!gTeleportDisplay) +				{ +					// Frame/draw throttling +					U64 elapsed_time = LLTimer::getTotalTime() - last_call; +					if (elapsed_time < mMinMicroSecPerFrame) +					{ +						LL_RECORD_BLOCK_TIME(FTM_SLEEP); +						// llclamp for when time function gets funky +						U64 sleep_time = llclamp(mMinMicroSecPerFrame - elapsed_time, (U64)1, (U64)1e6); +						micro_sleep(sleep_time, 0); +					} +				} +				last_call = LLTimer::getTotalTime(); +  				display(); +  				pingMainloopTimeout("Main:Snapshot");  				LLFloaterSnapshot::update(); // take snapshots  					LLFloaterOutfitSnapshot::update(); @@ -1452,7 +1460,8 @@ bool LLAppViewer::frame()  					|| !gFocusMgr.getAppHasFocus())  			{  				// Sleep if we're not rendering, or the window is minimized. -				S32 milliseconds_to_sleep = llclamp(gSavedSettings.getS32("BackgroundYieldTime"), 0, 1000); +				static LLCachedControl<S32> s_bacground_yeild_time(gSavedSettings, "BackgroundYieldTime", 40); +				S32 milliseconds_to_sleep = llclamp((S32)s_bacground_yeild_time, 0, 1000);  				// don't sleep when BackgroundYieldTime set to 0, since this will still yield to other threads  				// of equal priority on Windows  				if (milliseconds_to_sleep > 0) @@ -1476,7 +1485,6 @@ bool LLAppViewer::frame()  				ms_sleep(500);  			} -			idleTimer.reset();  			S32 total_work_pending = 0;  			S32 total_io_pending = 0;	  			{ @@ -1529,13 +1537,6 @@ bool LLAppViewer::frame()  				}  			} -			if ((LLStartUp::getStartupState() >= STATE_CLEANUP) && -				(frameTimer.getElapsedTimeF64() > FRAME_STALL_THRESHOLD)) -			{ -				gFrameStalls++; -			} -			frameTimer.reset(); -  			resumeMainloopTimeout();  			pingMainloopTimeout("Main:End"); @@ -2960,10 +2961,13 @@ bool LLAppViewer::initWindow()  #ifdef LL_DARWIN -    //Satisfy both MAINT-3135 (OSX 10.6 and earlier) MAINT-3288 (OSX 10.7 and later) -   if (getOSInfo().mMajorVer == 10 && getOSInfo().mMinorVer < 7) -		if ( getOSInfo().mMinorVer == 6 && getOSInfo().mBuild < 8 ) -       		gViewerWindow->getWindow()->setOldResize(true); +	//Satisfy both MAINT-3135 (OSX 10.6 and earlier) MAINT-3288 (OSX 10.7 and later) +	LLOSInfo& os_info = LLOSInfo::instance(); +	if (os_info.mMajorVer == 10 && os_info.mMinorVer < 7) +	{ +		if ( os_info.mMinorVer == 6 && os_info.mBuild < 8 ) +			gViewerWindow->getWindow()->setOldResize(true); +	}  #endif  	if (gSavedSettings.getBOOL("WindowMaximized")) @@ -3106,7 +3110,7 @@ LLSD LLAppViewer::getViewerInfo() const  	info["CPU"] = gSysCPU.getCPUString();  	info["MEMORY_MB"] = LLSD::Integer(gSysMemory.getPhysicalMemoryKB().valueInUnits<LLUnits::Megabytes>());  	// Moved hack adjustment to Windows memory size into llsys.cpp -	info["OS_VERSION"] = LLAppViewer::instance()->getOSInfo().getOSString(); +	info["OS_VERSION"] = LLOSInfo::instance().getOSString();  	info["GRAPHICS_CARD_VENDOR"] = (const char*)(glGetString(GL_VENDOR));  	info["GRAPHICS_CARD"] = (const char*)(glGetString(GL_RENDERER)); @@ -3151,7 +3155,7 @@ LLSD LLAppViewer::getViewerInfo() const  	info["J2C_VERSION"] = LLImageJ2C::getEngineInfo();  	bool want_fullname = true; -	info["AUDIO_DRIVER_VERSION"] = gAudiop ? LLSD(gAudiop->getDriverName(want_fullname)) : LLSD(); +	info["AUDIO_DRIVER_VERSION"] = gAudiop ? LLSD(gAudiop->getDriverName(want_fullname)) : "Undefined";  	if(LLVoiceClient::getInstance()->voiceEnabled())  	{  		LLVoiceVersionInfo version = LLVoiceClient::getInstance()->getVersion(); @@ -3301,6 +3305,70 @@ std::string LLAppViewer::getViewerInfoString() const  	return support.str();  } +std::string LLAppViewer::getShortViewerInfoString() const +{ +	std::ostringstream support; +	LLSD info(getViewerInfo()); + +	support << LLTrans::getString("APP_NAME") << " " << info["VIEWER_VERSION_STR"].asString(); +	support << " (" << info["CHANNEL"].asString() << ")"; +	if (info.has("BUILD_CONFIG")) +	{ +		support << "\n" << "Build Configuration " << info["BUILD_CONFIG"].asString(); +	} +	if (info.has("REGION")) +	{ +		support << "\n\n" << "You are at " << ll_vector3_from_sd(info["POSITION_LOCAL"]) << " in " << info["REGION"].asString(); +		support << " located at " << info["HOSTNAME"].asString() << " (" << info["HOSTIP"].asString() << ")"; +		support << "\n" << "SLURL: " << info["SLURL"].asString(); +		support << "\n" << "(Global coordinates " << ll_vector3_from_sd(info["POSITION"]) << ")"; +		support << "\n" << info["SERVER_VERSION"].asString(); +	} + +	support << "\n\n" << "CPU: " << info["CPU"].asString(); +	support << "\n" << "Memory: " << info["MEMORY_MB"].asString() << " MB"; +	support << "\n" << "OS: " << info["OS_VERSION"].asString(); +	support << "\n" << "Graphics Card: " << info["GRAPHICS_CARD"].asString() << " (" <<  info["GRAPHICS_CARD_VENDOR"].asString() << ")"; + +	if (info.has("GRAPHICS_DRIVER_VERSION")) +	{ +		support << "\n" << "Windows Graphics Driver Version: " << info["GRAPHICS_DRIVER_VERSION"].asString(); +	} + +	support << "\n" << "OpenGL Version: " << info["OPENGL_VERSION"].asString(); + +	support << "\n\n" << "Window size:" << info["WINDOW_WIDTH"].asString() << "x" << info["WINDOW_HEIGHT"].asString(); +	support << "\n" << "Language: " << LLUI::getLanguage(); +	support << "\n" << "Font Size Adjustment: " << info["FONT_SIZE_ADJUSTMENT"].asString() << "pt"; +	support << "\n" << "UI Scaling: " << info["UI_SCALE"].asString(); +	support << "\n" << "Draw distance: " << info["DRAW_DISTANCE"].asString(); +	support << "\n" << "Bandwidth: " << info["NET_BANDWITH"].asString() << "kbit/s"; +	support << "\n" << "LOD factor: " << info["LOD_FACTOR"].asString(); +	support << "\n" << "Render quality: " << info["RENDER_QUALITY"].asString() << " / 7"; +	support << "\n" << "ALM: " << info["GPU_SHADERS"].asString(); +	support << "\n" << "Texture memory: " << info["TEXTURE_MEMORY"].asString() << "MB"; +	support << "\n" << "VFS (cache) creation time: " << info["VFS_TIME"].asString(); + +	support << "\n\n" << "J2C Decoder: " << info["J2C_VERSION"].asString(); +	support << "\n" << "Audio Driver: " << info["AUDIO_DRIVER_VERSION"].asString(); +	support << "\n" << "LLCEFLib/CEF: " << info["LLCEFLIB_VERSION"].asString(); +	support << "\n" << "LibVLC: " << info["LIBVLC_VERSION"].asString(); +	support << "\n" << "Voice Server: " << info["VOICE_VERSION"].asString(); + +	if (info.has("PACKETS_IN")) +	{ +		support << "\n" << "Packets Lost: " << info["PACKETS_LOST"].asInteger() << "/" << info["PACKETS_IN"].asInteger(); +		F32 packets_pct = info["PACKETS_PCT"].asReal(); +		support << " (" << ll_round(packets_pct, 0.001f) << "%)"; +	} + +	LLSD substitution; +	substitution["datetime"] = (S32)time(NULL); +	support << "\n" << LLTrans::getString("AboutTime", substitution); + +	return support.str(); +} +  void LLAppViewer::cleanupSavedSettings()  {  	gSavedSettings.setBOOL("MouseSun", FALSE); @@ -3378,7 +3446,7 @@ void LLAppViewer::writeSystemInfo()  	gDebugInfo["RAMInfo"]["Physical"] = (LLSD::Integer)(gSysMemory.getPhysicalMemoryKB().value());  	gDebugInfo["RAMInfo"]["Allocated"] = (LLSD::Integer)(gMemoryAllocated.valueInUnits<LLUnits::Kilobytes>()); -	gDebugInfo["OSInfo"] = getOSInfo().getOSStringSimple(); +	gDebugInfo["OSInfo"] = LLOSInfo::instance().getOSStringSimple();  	// The user is not logged on yet, but record the current grid choice login url  	// which may have been the intended grid.  @@ -3420,8 +3488,8 @@ void LLAppViewer::writeSystemInfo()  	// query some system information  	LL_INFOS("SystemInfo") << "CPU info:\n" << gSysCPU << LL_ENDL;  	LL_INFOS("SystemInfo") << "Memory info:\n" << gSysMemory << LL_ENDL; -	LL_INFOS("SystemInfo") << "OS: " << getOSInfo().getOSStringSimple() << LL_ENDL; -	LL_INFOS("SystemInfo") << "OS info: " << getOSInfo() << LL_ENDL; +	LL_INFOS("SystemInfo") << "OS: " << LLOSInfo::instance().getOSStringSimple() << LL_ENDL; +	LL_INFOS("SystemInfo") << "OS info: " << LLOSInfo::instance() << LL_ENDL;      gDebugInfo["SettingsFilename"] = gSavedSettings.getString("ClientSettingsFile");  	gDebugInfo["ViewerExePath"] = gDirUtilp->getExecutablePathAndName(); @@ -3453,7 +3521,7 @@ void getFileList()  		if ( ( iter->length() > 30 ) && (iter->rfind(".dmp") == (iter->length()-4) ) )  		{  			std::string fullname = pathname + *iter; -			std::ifstream fdat( fullname.c_str(), std::ifstream::binary); +			llifstream fdat( fullname.c_str(), std::ifstream::binary);  			if (fdat)  			{  				char buf[5]; @@ -4140,6 +4208,7 @@ bool LLAppViewer::initCache()  		if (gSavedSettings.getBOOL("PurgeCacheOnStartup") ||  			gSavedSettings.getBOOL("PurgeCacheOnNextStartup"))  		{ +			LL_INFOS("AppCache") << "Startup cache purge requested: " << (gSavedSettings.getBOOL("PurgeCacheOnStartup") ? "ALWAYS" : "ONCE") << LL_ENDL;  			gSavedSettings.setBOOL("PurgeCacheOnNextStartup", false);  			mPurgeCache = true;  			// STORM-1141 force purgeAllTextures to get called to prevent a crash here. -brad @@ -4154,6 +4223,7 @@ bool LLAppViewer::initCache()  		std::string new_cache_location = gSavedSettings.getString("NewCacheLocation");  		if (new_cache_location != cache_location)  		{ +			LL_INFOS("AppCache") << "Cache location changed, cache needs purging" << LL_ENDL;  			gDirUtilp->setCacheDir(gSavedSettings.getString("CacheLocation"));  			purgeCache(); // purge old cache  			gSavedSettings.setString("CacheLocation", new_cache_location); @@ -4179,23 +4249,15 @@ bool LLAppViewer::initCache()  	// Init the texture cache  	// Allocate 80% of the cache size for textures	  	const S32 MB = 1024 * 1024; -	const S64 MIN_CACHE_SIZE = 64 * MB; +	const S64 MIN_CACHE_SIZE = 256 * MB;  	const S64 MAX_CACHE_SIZE = 9984ll * MB;  	const S64 MAX_VFS_SIZE = 1024 * MB; // 1 GB  	S64 cache_size = (S64)(gSavedSettings.getU32("CacheSize")) * MB;  	cache_size = llclamp(cache_size, MIN_CACHE_SIZE, MAX_CACHE_SIZE); -	S64 texture_cache_size = ((cache_size * 8) / 10); -	S64 vfs_size = cache_size - texture_cache_size; - -	if (vfs_size > MAX_VFS_SIZE) -	{ -		// Give the texture cache more space, since the VFS can't be bigger than 1GB. -		// This happens when the user's CacheSize setting is greater than 5GB. -		vfs_size = MAX_VFS_SIZE; -		texture_cache_size = cache_size - MAX_VFS_SIZE; -	} +	S64 vfs_size = llmin((S64)((cache_size * 2) / 10), MAX_VFS_SIZE); +	S64 texture_cache_size = cache_size - vfs_size;  	S64 extra = LLAppViewer::getTextureCache()->initCache(LL_PATH_CACHE, texture_cache_size, texture_cache_mismatch);  	texture_cache_size -= extra; @@ -5368,6 +5430,19 @@ void LLAppViewer::disconnectViewer()  	LLUrlEntryParcel::setDisconnected(gDisconnected);  } +bool LLAppViewer::onChangeFrameLimit(LLSD const & evt) +{ +	if (evt.asInteger() > 0) +	{ +		mMinMicroSecPerFrame = 1000000 / evt.asInteger(); +	} +	else +	{ +		mMinMicroSecPerFrame = 0; +	} +	return false; +} +  void LLAppViewer::forceErrorLLError()  {     	LL_ERRS() << "This is a deliberate llerror" << LL_ENDL; diff --git a/indra/newview/llappviewer.h b/indra/newview/llappviewer.h index c4782ed216..75ce1b5524 100644 --- a/indra/newview/llappviewer.h +++ b/indra/newview/llappviewer.h @@ -97,11 +97,10 @@ public:  	void writeDebugInfo(bool isStatic=true); -	const LLOSInfo& getOSInfo() const { return mSysOSInfo; } -  	void setServerReleaseNotesURL(const std::string& url) { mServerReleaseNotesURL = url; }  	LLSD getViewerInfo() const;  	std::string getViewerInfoString() const; +	std::string getShortViewerInfoString() const;  	// Report true if under the control of a debugger. A null-op default.  	virtual bool beingDebugged() { return false; }  @@ -253,6 +252,8 @@ private:      void sendLogoutRequest();      void disconnectViewer(); +	bool onChangeFrameLimit(LLSD const & evt); +  	// *FIX: the app viewer class should be some sort of singleton, no?  	// Perhaps its child class is the singleton and this should be an abstract base.  	static LLAppViewer* sInstance;  @@ -265,8 +266,6 @@ private:  	std::string mLogoutMarkerFileName;  	LLAPRFile mLogoutMarkerFile; // A file created to indicate the app is running. -	 -	LLOSInfo mSysOSInfo;   	bool mReportedCrash;  	std::string mServerReleaseNotesURL; @@ -312,6 +311,8 @@ private:  	LLAppCoreHttp mAppCoreHttp;          bool mIsFirstRun; +	U64 mMinMicroSecPerFrame; // frame throttling +  }; @@ -353,7 +354,6 @@ extern F32SecondsImplicit		gFrameTimeSeconds;			// Loses msec precision after ~4  extern F32SecondsImplicit		gFrameIntervalSeconds;		// Elapsed time between current and previous gFrameTimeSeconds  extern F32		gFPSClamped;				// Frames per second, smoothed, weighted toward last frame  extern F32		gFrameDTClamped; -extern U32 		gFrameStalls;  extern LLTimer gRenderStartTime;  extern LLFrameTimer gForegroundTime; diff --git a/indra/newview/llappviewerwin32.cpp b/indra/newview/llappviewerwin32.cpp index d0093e6951..48b3a1c485 100644 --- a/indra/newview/llappviewerwin32.cpp +++ b/indra/newview/llappviewerwin32.cpp @@ -680,10 +680,10 @@ void LLAppViewerWin32::initCrashReporting(bool reportFreeze)  	PROCESS_INFORMATION processInfo;  	std::wstring exe_wstr; -	exe_wstr=wstringize(exe_path); +	exe_wstr = utf8str_to_utf16str(exe_path);  	std::wstring arg_wstr; -	arg_wstr=wstringize(arg_str); +	arg_wstr = utf8str_to_utf16str(arg_str);  	LL_INFOS("CrashReport") << "Creating crash reporter process " << exe_path << " with params: " << arg_str << LL_ENDL;      if(CreateProcess(exe_wstr.c_str(),      diff --git a/indra/newview/llconversationmodel.h b/indra/newview/llconversationmodel.h index af7b50802c..3868bafae4 100644 --- a/indra/newview/llconversationmodel.h +++ b/indra/newview/llconversationmodel.h @@ -70,6 +70,9 @@ public:  	virtual const std::string& getName() const { return mName; }  	virtual const std::string& getDisplayName() const { return mName; }  	virtual const std::string& getSearchableName() const { return mName; } +	virtual std::string getSearchableDescription() const { return LLStringUtil::null; } +	virtual std::string getSearchableCreatorName() const { return LLStringUtil::null; } +	virtual std::string getSearchableUUIDString() const {return LLStringUtil::null;}  	virtual const LLUUID& getUUID() const { return mUUID; }  	virtual time_t getCreationDate() const { return 0; }  	virtual LLPointer<LLUIImage> getIcon() const { return NULL; } diff --git a/indra/newview/llestateinfomodel.cpp b/indra/newview/llestateinfomodel.cpp index e422581129..e56a67f8d1 100644 --- a/indra/newview/llestateinfomodel.cpp +++ b/indra/newview/llestateinfomodel.cpp @@ -116,7 +116,7 @@ void LLEstateInfoModel::notifyCommit()  // tries to send estate info using a cap; returns true if it succeeded  bool LLEstateInfoModel::commitEstateInfoCaps()  { -	std::string url = gAgent.getRegion()->getCapability("EstateChangeInfo"); +	std::string url = gAgent.getRegionCapability("EstateChangeInfo");  	if (url.empty())  	{ diff --git a/indra/newview/llfasttimerview.cpp b/indra/newview/llfasttimerview.cpp index 91501ccb1f..9219dd0279 100644 --- a/indra/newview/llfasttimerview.cpp +++ b/indra/newview/llfasttimerview.cpp @@ -463,7 +463,7 @@ void LLFastTimerView::exportCharts(const std::string& base, const std::string& t  	{ //read base log into memory  		S32 i = 0; -		std::ifstream is(base.c_str()); +		llifstream is(base.c_str());  		while (!is.eof() && LLSDParser::PARSE_FAILURE != LLSDSerialize::fromXML(cur, is))  		{  			base_data[i++] = cur; @@ -476,7 +476,7 @@ void LLFastTimerView::exportCharts(const std::string& base, const std::string& t  	{ //read current log into memory  		S32 i = 0; -		std::ifstream is(target.c_str()); +		llifstream is(target.c_str());  		while (!is.eof() && LLSDParser::PARSE_FAILURE != LLSDSerialize::fromXML(cur, is))  		{  			cur_data[i++] = cur; @@ -821,8 +821,8 @@ LLSD LLFastTimerView::analyzePerformanceLogDefault(std::istream& is)  void LLFastTimerView::doAnalysisDefault(std::string baseline, std::string target, std::string output)  {  	// Open baseline and current target, exit if one is inexistent -	std::ifstream base_is(baseline.c_str()); -	std::ifstream target_is(target.c_str()); +	llifstream base_is(baseline.c_str()); +	llifstream target_is(target.c_str());  	if (!base_is.is_open() || !target_is.is_open())  	{  		LL_WARNS() << "'-analyzeperformance' error : baseline or current target file inexistent" << LL_ENDL; @@ -840,7 +840,7 @@ void LLFastTimerView::doAnalysisDefault(std::string baseline, std::string target  	target_is.close();  	//output comparison -	std::ofstream os(output.c_str()); +	llofstream os(output.c_str());  	LLSD::Real session_time = current["SessionTime"].asReal();  	os << diff --git a/indra/newview/llfeaturemanager.cpp b/indra/newview/llfeaturemanager.cpp index 3c50810129..ce949fa1bf 100644 --- a/indra/newview/llfeaturemanager.cpp +++ b/indra/newview/llfeaturemanager.cpp @@ -496,7 +496,7 @@ void LLFeatureManager::fetchFeatureTableCoro(std::string tableName)  #if LL_WINDOWS -    std::string os_string = LLAppViewer::instance()->getOSInfo().getOSStringSimple(); +    std::string os_string = LLOSInfo::instance().getOSStringSimple();      std::string filename;      if (os_string.find("Microsoft Windows XP") == 0) @@ -777,7 +777,7 @@ void LLFeatureManager::applyBaseMasks()  	}  #if LL_DARWIN -	const LLOSInfo& osInfo = LLAppViewer::instance()->getOSInfo(); +	const LLOSInfo& osInfo = LLOSInfo::instance();  	if (osInfo.mMajorVer == 10 && osInfo.mMinorVer < 7)  	{  		maskFeatures("OSX_10_6_8"); diff --git a/indra/newview/llflexibleobject.cpp b/indra/newview/llflexibleobject.cpp index b6e61f83b1..e075a311c2 100644 --- a/indra/newview/llflexibleobject.cpp +++ b/indra/newview/llflexibleobject.cpp @@ -43,9 +43,9 @@  #include "llworld.h"  #include "llvoavatar.h" +static const F32 SEC_PER_FLEXI_FRAME = 1.f / 60.f; // 60 flexi updates per second  /*static*/ F32 LLVolumeImplFlexible::sUpdateFactor = 1.0f;  std::vector<LLVolumeImplFlexible*> LLVolumeImplFlexible::sInstanceList; -std::vector<S32> LLVolumeImplFlexible::sUpdateDelay;  static LLTrace::BlockTimerStatHandle FTM_FLEXIBLE_REBUILD("Rebuild");  static LLTrace::BlockTimerStatHandle FTM_DO_FLEXIBLE_UPDATE("Flexible Update"); @@ -56,7 +56,10 @@ static LLTrace::BlockTimerStatHandle FTM_DO_FLEXIBLE_UPDATE("Flexible Update");  // constructor  //-----------------------------------------------  LLVolumeImplFlexible::LLVolumeImplFlexible(LLViewerObject* vo, LLFlexibleObjectData* attributes) : -		mVO(vo), mAttributes(attributes) +		mVO(vo), +		mAttributes(attributes), +		mLastFrameNum(0), +		mLastUpdatePeriod(0)  {  	static U32 seed = 0;  	mID = seed++; @@ -64,7 +67,6 @@ LLVolumeImplFlexible::LLVolumeImplFlexible(LLViewerObject* vo, LLFlexibleObjectD  	mUpdated = FALSE;  	mInitializedRes = -1;  	mSimulateRes = 0; -	mFrameNum = 0;  	mCollisionSphereRadius = 0.f;  	mRenderRes = -1; @@ -75,7 +77,6 @@ LLVolumeImplFlexible::LLVolumeImplFlexible(LLViewerObject* vo, LLFlexibleObjectD  	mInstanceIndex = sInstanceList.size();  	sInstanceList.push_back(this); -	sUpdateDelay.push_back(0);  }//-----------------------------------------------  LLVolumeImplFlexible::~LLVolumeImplFlexible() @@ -86,28 +87,28 @@ LLVolumeImplFlexible::~LLVolumeImplFlexible()  	{  		sInstanceList[mInstanceIndex] = sInstanceList[end_idx];  		sInstanceList[mInstanceIndex]->mInstanceIndex = mInstanceIndex; -		sUpdateDelay[mInstanceIndex] = sUpdateDelay[end_idx];  	}  	sInstanceList.pop_back(); -	sUpdateDelay.pop_back();  }  //static  void LLVolumeImplFlexible::updateClass()  { -	std::vector<S32>::iterator delay_iter = sUpdateDelay.begin(); +	LL_RECORD_BLOCK_TIME(FTM_DO_FLEXIBLE_UPDATE); +	U64 virtual_frame_num = LLTimer::getElapsedSeconds() / SEC_PER_FLEXI_FRAME;  	for (std::vector<LLVolumeImplFlexible*>::iterator iter = sInstanceList.begin();  			iter != sInstanceList.end();  			++iter)  	{ -		--(*delay_iter); -		if (*delay_iter <= 0) +		// Note: by now update period might have changed +		if ((*iter)->mRenderRes == -1 +			|| (*iter)->mLastFrameNum + (*iter)->mLastUpdatePeriod <= virtual_frame_num +			|| (*iter)->mLastFrameNum > virtual_frame_num) //time issues, overflow  		{  			(*iter)->doIdleUpdate();  		} -		++delay_iter;  	}  } @@ -334,15 +335,12 @@ void LLVolumeImplFlexible::updateRenderRes()  // updated every time step. In the future, perhaps there could be an   // optimization similar to what Havok does for objects that are stationary.   //--------------------------------------------------------------------------------- -static LLTrace::BlockTimerStatHandle FTM_FLEXIBLE_UPDATE("Update Flexies");  void LLVolumeImplFlexible::doIdleUpdate()  {  	LLDrawable* drawablep = mVO->mDrawable;  	if (drawablep)  	{ -		//LL_RECORD_BLOCK_TIME(FTM_FLEXIBLE_UPDATE); -  		//ensure drawable is active  		drawablep->makeActive(); @@ -354,15 +352,20 @@ void LLVolumeImplFlexible::doIdleUpdate()  			{  				updateRenderRes();  				gPipeline.markRebuild(drawablep, LLDrawable::REBUILD_POSITION, FALSE); -				sUpdateDelay[mInstanceIndex] = 0;  			}  			else  			{  				F32 pixel_area = mVO->getPixelArea(); +				// Note: Flexies afar will be rarely updated, closer ones will be updated more frequently. +				// But frequency differences are extremely noticeable, so consider modifying update factor, +				// or at least clamping value a bit more from both sides.  				U32 update_period = (U32) (llmax((S32) (LLViewerCamera::getInstance()->getScreenPixelArea()*0.01f/(pixel_area*(sUpdateFactor+1.f))),0)+1);  				// MAINT-1890 Clamp the update period to ensure that the update_period is no greater than 32 frames -				update_period = llclamp(update_period, 0U, 32U); +				update_period = llclamp(update_period, 1U, 32U); + +				// We control how fast flexies update, buy splitting updates among frames +				U64 virtual_frame_num = LLTimer::getElapsedSeconds() / SEC_PER_FLEXI_FRAME;  				if	(visible)  				{ @@ -370,42 +373,44 @@ void LLVolumeImplFlexible::doIdleUpdate()  						pixel_area > 256.f)  					{  						U32 id; -				  						if (mVO->isRootEdit())  						{  							id = mID;  						}  						else  						{ -							LLVOVolume* parent = (LLVOVolume*) mVO->getParent(); +							LLVOVolume* parent = (LLVOVolume*)mVO->getParent();  							id = parent->getVolumeInterfaceID();  						} -				if (mVO->isRootEdit()) -				{ -					id = mID; -				} -				else -				{ -					LLVOVolume* parent = (LLVOVolume*) mVO->getParent(); -					id = parent->getVolumeInterfaceID(); -				} -				if ((LLDrawable::getCurrentFrame()+id)%update_period == 0) -				{ -							sUpdateDelay[mInstanceIndex] = (S32) update_period-1; +						// Throttle flexies and spread load by preventing flexies from updating in same frame +						// Shows how many frames we need to wait before next update +						U64 throttling_delay = (virtual_frame_num + id) % update_period; -					updateRenderRes(); +						if ((throttling_delay == 0 && mLastFrameNum < virtual_frame_num) //one or more virtual frames per frame +							|| (mLastFrameNum + update_period < virtual_frame_num)) // missed virtual frame +						{ +							// We need mLastFrameNum to compensate for 'unreliable time' and to filter 'duplicate' frames +							// If happened too late, subtract throttling_delay (it is zero otherwise) +							mLastFrameNum = virtual_frame_num - throttling_delay; + +							// Store update period for updateClass() +							// Note: Consider substituting update_period with mLastUpdatePeriod everywhere. +							mLastUpdatePeriod = update_period; + +							updateRenderRes(); -					gPipeline.markRebuild(drawablep, LLDrawable::REBUILD_POSITION, FALSE); +							gPipeline.markRebuild(drawablep, LLDrawable::REBUILD_POSITION, FALSE); +						} +					}  				} -			} -		}  				else  				{ -					sUpdateDelay[mInstanceIndex] = (S32) update_period; -	} -} +					mLastFrameNum = virtual_frame_num; +					mLastUpdatePeriod = update_period; +				} +			}  		}  	} diff --git a/indra/newview/llflexibleobject.h b/indra/newview/llflexibleobject.h index a00551df8e..9383ab03ae 100644 --- a/indra/newview/llflexibleobject.h +++ b/indra/newview/llflexibleobject.h @@ -72,7 +72,6 @@ class LLVolumeImplFlexible : public LLVolumeInterface  {  private:  	static std::vector<LLVolumeImplFlexible*> sInstanceList; -	static std::vector<S32> sUpdateDelay;  	S32 mInstanceIndex;  	public: @@ -133,7 +132,8 @@ private:  		S32							mInitializedRes;  		S32							mSimulateRes;  		S32							mRenderRes; -		U32							mFrameNum; +		U64							mLastFrameNum; +		U32							mLastUpdatePeriod;  		LLVector3					mCollisionSpherePosition;  		F32							mCollisionSphereRadius;  		U32							mID; diff --git a/indra/newview/llfloateravatarpicker.cpp b/indra/newview/llfloateravatarpicker.cpp index c394eb815b..c5561fe011 100644 --- a/indra/newview/llfloateravatarpicker.cpp +++ b/indra/newview/llfloateravatarpicker.cpp @@ -496,6 +496,18 @@ void LLFloaterAvatarPicker::find()  	std::string text = getChild<LLUICtrl>("Edit")->getValue().asString(); +	size_t separator_index = text.find_first_of(" ._"); +	if (separator_index != text.npos) +	{ +		std::string first = text.substr(0, separator_index); +		std::string last = text.substr(separator_index+1, text.npos); +		LLStringUtil::trim(last); +		if("Resident" == last) +		{ +			text = first; +		} +	} +  	mQueryID.generate();  	std::string url; @@ -739,12 +751,13 @@ void LLFloaterAvatarPicker::processResponse(const LLUUID& query_id, const LLSD&  		if (search_results->isEmpty())  		{ -			LLStringUtil::format_map_t map; -			map["[TEXT]"] = getChild<LLUICtrl>("Edit")->getValue().asString(); +			std::string name = "'" + getChild<LLUICtrl>("Edit")->getValue().asString() + "'";  			LLSD item;  			item["id"] = LLUUID::null;  			item["columns"][0]["column"] = "name"; -			item["columns"][0]["value"] = getString("not_found", map); +			item["columns"][0]["value"] = name; +			item["columns"][1]["column"] = "username"; +			item["columns"][1]["value"] = getString("not_found_text");  			search_results->addElement(item);  			search_results->setEnabled(false);  			getChildView("ok_btn")->setEnabled(false); diff --git a/indra/newview/llfloateravatarrendersettings.cpp b/indra/newview/llfloateravatarrendersettings.cpp index 2bae7d63aa..8bdb70a20d 100644 --- a/indra/newview/llfloateravatarrendersettings.cpp +++ b/indra/newview/llfloateravatarrendersettings.cpp @@ -27,11 +27,13 @@  #include "llfloateravatarrendersettings.h" +#include "llagent.h"  #include "llavatarnamecache.h"  #include "llfloateravatarpicker.h"  #include "llfiltereditor.h"  #include "llfloaterreg.h"  #include "llnamelistctrl.h" +#include "llnotificationsutil.h"  #include "llmenugl.h"  #include "lltrans.h"  #include "llviewerobjectlist.h" @@ -268,6 +270,11 @@ void LLFloaterAvatarRenderSettings::onClickAdd(const LLSD& userdata)  void LLFloaterAvatarRenderSettings::callbackAvatarPicked(const uuid_vec_t& ids, S32 visual_setting)  {      if (ids.empty()) return; +    if(ids[0] == gAgentID) +    { +        LLNotificationsUtil::add("AddSelfRenderExceptions"); +        return; +    }      setAvatarRenderSetting(ids[0], visual_setting);  } diff --git a/indra/newview/llfloaterland.cpp b/indra/newview/llfloaterland.cpp index 4352909706..88b3fb7b96 100644 --- a/indra/newview/llfloaterland.cpp +++ b/indra/newview/llfloaterland.cpp @@ -503,7 +503,7 @@ BOOL LLPanelLandGeneral::postBuild()  	// note: on region change this will not be re checked, should not matter on Agni as  	// 99% of the time all regions will return the same caps. In case of an erroneous setting  	// to enabled the floater will just throw an error when trying to get it's cap -	std::string url = gAgent.getRegion()->getCapability("LandResources"); +	std::string url = gAgent.getRegionCapability("LandResources");  	if (!url.empty())  	{  		if(mBtnScriptLimits) @@ -2181,17 +2181,8 @@ void LLPanelLandOptions::refreshSearch()  			&& region  			&& !(region->getRegionFlag(REGION_FLAGS_BLOCK_PARCEL_SEARCH)); -	// There is a bug with this panel whereby the Show Directory bit can be  -	// slammed off by the Region based on an override.  Since this data is cached -	// locally the change will not reflect in the panel, which could cause confusion -	// A workaround for this is to flip the bit off in the locally cached version -	// when we detect a mismatch case. -	if(!can_change && parcel->getParcelFlag(PF_SHOW_DIRECTORY)) -	{ -		parcel->setParcelFlag(PF_SHOW_DIRECTORY, FALSE); -	}  	BOOL show_directory = parcel->getParcelFlag(PF_SHOW_DIRECTORY); -	mCheckShowDirectory	->set(show_directory); +	mCheckShowDirectory->set(show_directory);  	// Set by string in case the order in UI doesn't match the order by index.  	LLParcel::ECategory cat = parcel->getCategory(); diff --git a/indra/newview/llfloatermodeluploadbase.cpp b/indra/newview/llfloatermodeluploadbase.cpp index 7cdfd56d9a..4427e913e3 100644 --- a/indra/newview/llfloatermodeluploadbase.cpp +++ b/indra/newview/llfloatermodeluploadbase.cpp @@ -41,7 +41,7 @@ LLFloaterModelUploadBase::LLFloaterModelUploadBase(const LLSD& key)  void LLFloaterModelUploadBase::requestAgentUploadPermissions()  {  	std::string capability = "MeshUploadFlag"; -	std::string url = gAgent.getRegion()->getCapability(capability); +	std::string url = gAgent.getRegionCapability(capability);  	if (!url.empty())  	{ diff --git a/indra/newview/llfloaterregiondebugconsole.cpp b/indra/newview/llfloaterregiondebugconsole.cpp index 271fb2f9a3..e817589622 100644 --- a/indra/newview/llfloaterregiondebugconsole.cpp +++ b/indra/newview/llfloaterregiondebugconsole.cpp @@ -116,11 +116,11 @@ BOOL LLFloaterRegionDebugConsole::postBuild()  	mOutput = getChild<LLTextEditor>("region_debug_console_output"); -	std::string url = gAgent.getRegion()->getCapability("SimConsoleAsync"); +	std::string url = gAgent.getRegionCapability("SimConsoleAsync");  	if (url.empty())  	{  		// Fall back to see if the old API is supported. -		url = gAgent.getRegion()->getCapability("SimConsole"); +		url = gAgent.getRegionCapability("SimConsole");  		if (url.empty())  		{  			mOutput->appendText( @@ -139,11 +139,11 @@ void LLFloaterRegionDebugConsole::onInput(LLUICtrl* ctrl, const LLSD& param)  	LLLineEditor* input = static_cast<LLLineEditor*>(ctrl);  	std::string text = input->getText() + "\n"; -	std::string url = gAgent.getRegion()->getCapability("SimConsoleAsync"); +	std::string url = gAgent.getRegionCapability("SimConsoleAsync");  	if (url.empty())  	{  		// Fall back to the old API -		url = gAgent.getRegion()->getCapability("SimConsole"); +		url = gAgent.getRegionCapability("SimConsole");  		if (url.empty())  		{  			text += CONSOLE_UNAVAILABLE + PROMPT; diff --git a/indra/newview/llfloaterregioninfo.cpp b/indra/newview/llfloaterregioninfo.cpp index c330c2ae47..af68a2aae1 100644 --- a/indra/newview/llfloaterregioninfo.cpp +++ b/indra/newview/llfloaterregioninfo.cpp @@ -238,7 +238,7 @@ BOOL LLFloaterRegionInfo::postBuild()  		return TRUE;  	} -	if(!gAgent.getRegion()->getCapability("RegionExperiences").empty()) +	if(!gAgent.getRegionCapability("RegionExperiences").empty())  	{  		panel = new LLPanelRegionExperiences;  		mInfoPanels.push_back(panel); @@ -879,7 +879,7 @@ bool LLPanelRegionGeneralInfo::onMessageCommit(const LLSD& notification, const L  void LLFloaterRegionInfo::requestMeshRezInfo()  { -	std::string sim_console_url = gAgent.getRegion()->getCapability("SimConsoleAsync"); +	std::string sim_console_url = gAgent.getRegionCapability("SimConsoleAsync");  	if (!sim_console_url.empty())  	{ @@ -907,7 +907,7 @@ BOOL LLPanelRegionGeneralInfo::sendUpdate()  	// First try using a Cap.  If that fails use the old method.  	LLSD body; -	std::string url = gAgent.getRegion()->getCapability("DispatchRegionInfo"); +	std::string url = gAgent.getRegionCapability("DispatchRegionInfo");  	if (!url.empty())  	{  		body["block_terraform"] = getChild<LLUICtrl>("block_terraform_check")->getValue(); diff --git a/indra/newview/llfloaterreporter.cpp b/indra/newview/llfloaterreporter.cpp index 515c2b0c4b..c0f5e63623 100644 --- a/indra/newview/llfloaterreporter.cpp +++ b/indra/newview/llfloaterreporter.cpp @@ -438,8 +438,8 @@ void LLFloaterReporter::onClickSend(void *userdata)  		LLUploadDialog::modalUploadDialog(LLTrans::getString("uploading_abuse_report"));  		// *TODO don't upload image if checkbox isn't checked -		std::string url = gAgent.getRegion()->getCapability("SendUserReport"); -		std::string sshot_url = gAgent.getRegion()->getCapability("SendUserReportWithScreenshot"); +		std::string url = gAgent.getRegionCapability("SendUserReport"); +		std::string sshot_url = gAgent.getRegionCapability("SendUserReportWithScreenshot");  		if(!url.empty() || !sshot_url.empty())  		{  			self->sendReportViaCaps(url, sshot_url, self->gatherReport()); diff --git a/indra/newview/llfloaterscriptlimits.cpp b/indra/newview/llfloaterscriptlimits.cpp index 5f0587a286..21df769d0c 100644 --- a/indra/newview/llfloaterscriptlimits.cpp +++ b/indra/newview/llfloaterscriptlimits.cpp @@ -112,24 +112,16 @@ BOOL LLFloaterScriptLimits::postBuild()  	}  	// contruct the panels -	std::string land_url = gAgent.getRegion()->getCapability("LandResources"); -	if (!land_url.empty()) -	{ -		LLPanelScriptLimitsRegionMemory* panel_memory; -		panel_memory = new LLPanelScriptLimitsRegionMemory; -		mInfoPanels.push_back(panel_memory); -		panel_memory->buildFromFile( "panel_script_limits_region_memory.xml"); -		mTab->addTabPanel(panel_memory); -	} -	 -	std::string attachment_url = gAgent.getRegion()->getCapability("AttachmentResources"); -	if (!attachment_url.empty()) -	{ -		LLPanelScriptLimitsAttachment* panel_attachments = new LLPanelScriptLimitsAttachment; -		mInfoPanels.push_back(panel_attachments); -		panel_attachments->buildFromFile("panel_script_limits_my_avatar.xml"); -		mTab->addTabPanel(panel_attachments); -	} +	LLPanelScriptLimitsRegionMemory* panel_memory = new LLPanelScriptLimitsRegionMemory; +	mInfoPanels.push_back(panel_memory); +	panel_memory->buildFromFile( "panel_script_limits_region_memory.xml"); +	mTab->addTabPanel(panel_memory); + +	LLPanelScriptLimitsAttachment* panel_attachments = new LLPanelScriptLimitsAttachment; +	mInfoPanels.push_back(panel_attachments); +	panel_attachments->buildFromFile("panel_script_limits_my_avatar.xml"); +	mTab->addTabPanel(panel_attachments); +  	if(mInfoPanels.size() > 0)  	{ @@ -195,6 +187,8 @@ LLPanelScriptLimitsRegionMemory::~LLPanelScriptLimitsRegionMemory()  BOOL LLPanelScriptLimitsRegionMemory::getLandScriptResources()  { +	if (!gAgent.getRegion()) return FALSE; +  	LLSD body;  	std::string url = gAgent.getRegion()->getCapability("LandResources");  	if (!url.empty()) @@ -718,10 +712,9 @@ BOOL LLPanelScriptLimitsRegionMemory::StartRequestChain()  	LLParcel* parcel = instance->getCurrentSelectedParcel();  	LLViewerRegion* region = LLViewerParcelMgr::getInstance()->getSelectionRegion(); -	LLUUID current_region_id = gAgent.getRegion()->getRegionID(); -  	if ((region) && (parcel))  	{ +		LLUUID current_region_id = gAgent.getRegion()->getRegionID();  		LLVector3 parcel_center = parcel->getCenterpoint();  		region_id = region->getRegionID(); @@ -982,6 +975,8 @@ void LLPanelScriptLimitsRegionMemory::onClickReturn(void* userdata)  BOOL LLPanelScriptLimitsAttachment::requestAttachmentDetails()  { +	if (!gAgent.getRegion()) return FALSE; +  	LLSD body;  	std::string url = gAgent.getRegion()->getCapability("AttachmentResources");  	if (!url.empty()) diff --git a/indra/newview/llfloatersidepanelcontainer.cpp b/indra/newview/llfloatersidepanelcontainer.cpp index 8b3cfa7fd5..64ddeff1b0 100644 --- a/indra/newview/llfloatersidepanelcontainer.cpp +++ b/indra/newview/llfloatersidepanelcontainer.cpp @@ -74,7 +74,10 @@ void LLFloaterSidePanelContainer::closeFloater(bool app_quitting)  				{  					edit_wearable_ptr->onClose();  				} -				panel_appearance->showOutfitsInventoryPanel(); +				if(!app_quitting) +				{ +					panel_appearance->showOutfitsInventoryPanel(); +				}  			}  		}  	} diff --git a/indra/newview/llfloatersnapshot.cpp b/indra/newview/llfloatersnapshot.cpp index ba3106913c..2d0002dcd8 100644 --- a/indra/newview/llfloatersnapshot.cpp +++ b/indra/newview/llfloatersnapshot.cpp @@ -314,8 +314,8 @@ void LLFloaterSnapshot::Impl::updateControls(LLFloaterSnapshotBase* floater)  		}  		else  		{ -			width_ctrl->setMaxValue(6016); -			height_ctrl->setMaxValue(6016); +			width_ctrl->setMaxValue(MAX_SNAPSHOT_IMAGE_SIZE); +			height_ctrl->setMaxValue(MAX_SNAPSHOT_IMAGE_SIZE);  		}  	} diff --git a/indra/newview/llfolderviewmodelinventory.cpp b/indra/newview/llfolderviewmodelinventory.cpp index e9f80b795a..d53cf2a9a3 100644 --- a/indra/newview/llfolderviewmodelinventory.cpp +++ b/indra/newview/llfolderviewmodelinventory.cpp @@ -258,6 +258,15 @@ bool LLFolderViewModelItemInventory::filter( LLFolderViewFilter& filter)  	{          // This is where filter check on the item done (CHUI-849)  		const bool passed_filter = filter.check(this); +		if (passed_filter && mChildren.empty()) // Update the latest filter generation for empty folders +		{ +			LLFolderViewModelItemInventory* view_model = this; +			while (view_model && view_model->mMostFilteredDescendantGeneration < filter_generation) +			{ +				view_model->mMostFilteredDescendantGeneration = filter_generation; +				view_model = static_cast<LLFolderViewModelItemInventory*>(view_model->mParent); +			} +		}  		setPassedFilter(passed_filter, filter_generation, filter.getStringMatchOffset(this), filter.getFilterStringSize());          continue_filtering = !filter.isTimedOut();  	} diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp index feef726630..d62b6300cb 100644 --- a/indra/newview/llimview.cpp +++ b/indra/newview/llimview.cpp @@ -3671,8 +3671,7 @@ public:  			}  			//K now we want to accept the invitation -			std::string url = gAgent.getRegion()->getCapability( -				"ChatSessionRequest"); +			std::string url = gAgent.getRegionCapability("ChatSessionRequest");  			if ( url != "" )  			{ diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp index 2751631a59..3f18039376 100644 --- a/indra/newview/llinventorybridge.cpp +++ b/indra/newview/llinventorybridge.cpp @@ -204,6 +204,58 @@ const std::string& LLInvFVBridge::getDisplayName() const  	return mDisplayName;  } +std::string LLInvFVBridge::getSearchableDescription() const +{ +	const LLInventoryModel* model = getInventoryModel(); +	if (model) +	{ +		const LLInventoryItem *item = model->getItem(mUUID); +		if(item) +		{ +			std::string desc = item->getDescription(); +			LLStringUtil::toUpper(desc); +			return desc; +		} +	} +	return LLStringUtil::null; +} + +std::string LLInvFVBridge::getSearchableCreatorName() const +{ +	const LLInventoryModel* model = getInventoryModel(); +	if (model) +	{ +		const LLInventoryItem *item = model->getItem(mUUID); +		if(item) +		{ +			LLAvatarName av_name; +			if (LLAvatarNameCache::get(item->getCreatorUUID(), &av_name)) +			{ +				std::string username = av_name.getUserName(); +				LLStringUtil::toUpper(username); +				return username; +			} +		} +	} +	return LLStringUtil::null; +} + +std::string LLInvFVBridge::getSearchableUUIDString() const +{ +	const LLInventoryModel* model = getInventoryModel(); +	if (model) +	{ +		const LLViewerInventoryItem *item = model->getItem(mUUID); +		if(item && (item->getIsFullPerm() || gAgent.isGodlikeWithoutAdminMenuFakery())) +		{ +			std::string uuid = item->getAssetUUID().asString(); +			LLStringUtil::toUpper(uuid); +			return uuid; +		} +	} +	return LLStringUtil::null; +} +  // Folders have full perms  PermissionMask LLInvFVBridge::getPermissionMask() const  { @@ -828,6 +880,12 @@ void LLInvFVBridge::getClipboardEntries(bool show_asset_id,  	{  		disabled_items.push_back(std::string("Properties"));  	} + +	LLInventoryPanel *active_panel = LLInventoryPanel::getActiveInventoryPanel(FALSE); +	if (active_panel && (active_panel->getName() != "All Items")) +	{ +		items.push_back(std::string("Show in Main Panel")); +	}  }  void LLInvFVBridge::buildContextMenu(LLMenuGL& menu, U32 flags) @@ -1593,6 +1651,11 @@ void LLItemBridge::performAction(LLInventoryModel* model, std::string action)  		gViewerWindow->getWindow()->copyTextToClipboard(utf8str_to_wstring(buffer));  		return;  	} +	else if ("show_in_main_panel" == action) +	{ +		LLInventoryPanel::openInventoryPanelAndSetSelection(TRUE, mUUID, TRUE); +		return; +	}  	else if ("cut" == action)  	{  		cutToClipboard(); @@ -1813,13 +1876,19 @@ void LLItemBridge::buildDisplayName() const  	{  		mDisplayName.assign(LLStringUtil::null);  	} -	 +	S32 old_length = mSearchableName.length(); +	S32 new_length = mDisplayName.length() + getLabelSuffix().length(); +  	mSearchableName.assign(mDisplayName);  	mSearchableName.append(getLabelSuffix());  	LLStringUtil::toUpper(mSearchableName); -    //Name set, so trigger a sort -    if(mParent) +	if ((old_length > new_length) && getInventoryFilter()) +	{ +		getInventoryFilter()->setModified(LLFolderViewFilter::FILTER_MORE_RESTRICTIVE); +	} +	//Name set, so trigger a sort +	if(mParent)  	{  		mParent->requestSort();  	} @@ -3087,6 +3156,11 @@ void LLFolderBridge::performAction(LLInventoryModel* model, std::string action)  		modifyOutfit(TRUE);  		return;  	} +	else if ("show_in_main_panel" == action) +	{ +		LLInventoryPanel::openInventoryPanelAndSetSelection(TRUE, mUUID, TRUE); +		return; +	}  	else if ("cut" == action)  	{  		cutToClipboard(); diff --git a/indra/newview/llinventorybridge.h b/indra/newview/llinventorybridge.h index e6fcb6be96..fd532c609c 100644 --- a/indra/newview/llinventorybridge.h +++ b/indra/newview/llinventorybridge.h @@ -94,6 +94,10 @@ public:  	virtual const std::string& getDisplayName() const;  	const std::string& getSearchableName() const { return mSearchableName; } +	std::string getSearchableDescription() const; +	std::string getSearchableCreatorName() const; +	std::string getSearchableUUIDString() const; +  	virtual PermissionMask getPermissionMask() const;  	virtual LLFolderType::EType getPreferredType() const;  	virtual time_t getCreationDate() const; diff --git a/indra/newview/llinventoryfilter.cpp b/indra/newview/llinventoryfilter.cpp index 1433ea36bf..9193613e9f 100644 --- a/indra/newview/llinventoryfilter.cpp +++ b/indra/newview/llinventoryfilter.cpp @@ -29,6 +29,7 @@  #include "llinventoryfilter.h"  // viewer includes +#include "llagent.h"  #include "llfolderviewmodel.h"  #include "llfolderviewitem.h"  #include "llinventorymodel.h" @@ -76,10 +77,14 @@ LLInventoryFilter::LLInventoryFilter(const Params& p)  	mFilterSubString(p.substring),  	mCurrentGeneration(0),  	mFirstRequiredGeneration(0), -	mFirstSuccessGeneration(0) +	mFirstSuccessGeneration(0), +	mSearchType(SEARCHTYPE_NAME), +	mFilterCreatorType(FILTERCREATOR_ALL)  {  	// copy mFilterOps into mDefaultFilterOps  	markDefault(); +	mUsername = gAgentUsername; +	LLStringUtil::toUpper(mUsername);  }  bool LLInventoryFilter::check(const LLFolderViewModelItem* item)  @@ -93,10 +98,29 @@ bool LLInventoryFilter::check(const LLFolderViewModelItem* item)  		return true;  	} -	bool passed = (mFilterSubString.size() ? listener->getSearchableName().find(mFilterSubString) != std::string::npos : true); +	std::string desc = listener->getSearchableCreatorName(); +	switch(mSearchType) +	{ +		case SEARCHTYPE_CREATOR: +			desc = listener->getSearchableCreatorName(); +			break; +		case SEARCHTYPE_DESCRIPTION: +			desc = listener->getSearchableDescription(); +			break; +		case SEARCHTYPE_UUID: +			desc = listener->getSearchableUUIDString(); +			break; +		case SEARCHTYPE_NAME: +		default: +			desc = listener->getSearchableName(); +			break; +	} + +	bool passed = (mFilterSubString.size() ? desc.find(mFilterSubString) != std::string::npos : true);  	passed = passed && checkAgainstFilterType(listener);  	passed = passed && checkAgainstPermissions(listener);  	passed = passed && checkAgainstFilterLinks(listener); +	passed = passed && checkAgainstCreator(listener);  	return passed;  } @@ -245,6 +269,14 @@ bool LLInventoryFilter::checkAgainstFilterType(const LLFolderViewModelItemInvent  		}  	} +	if(filterTypes & FILTERTYPE_WORN) +	{ +		if (!get_is_item_worn(object_id)) +		{ +			return FALSE; +		} +	} +  	////////////////////////////////////////////////////////////////////////////////  	// FILTERTYPE_UUID  	// Pass if this item is the target UUID or if it links to the target UUID @@ -453,6 +485,24 @@ bool LLInventoryFilter::checkAgainstFilterLinks(const LLFolderViewModelItemInven  	return TRUE;  } +bool LLInventoryFilter::checkAgainstCreator(const LLFolderViewModelItemInventory* listener) const +{ +	if (!listener) return TRUE; +	const BOOL is_folder = listener->getInventoryType() == LLInventoryType::IT_CATEGORY; +	switch(mFilterCreatorType) +	{ +		case FILTERCREATOR_SELF: +			if(is_folder) return FALSE; +			return (listener->getSearchableCreatorName() == mUsername); +		case FILTERCREATOR_OTHERS: +			if(is_folder) return FALSE; +			return (listener->getSearchableCreatorName() != mUsername); +		case FILTERCREATOR_ALL: +		default: +			return TRUE; +	} +} +  const std::string& LLInventoryFilter::getFilterSubString(BOOL trim) const  {  	return mFilterSubString; @@ -460,7 +510,14 @@ const std::string& LLInventoryFilter::getFilterSubString(BOOL trim) const  std::string::size_type LLInventoryFilter::getStringMatchOffset(LLFolderViewModelItem* item) const  { -	return mFilterSubString.size() ? item->getSearchableName().find(mFilterSubString) : std::string::npos; +	if (mSearchType == SEARCHTYPE_NAME) +	{ +		return mFilterSubString.size() ? item->getSearchableName().find(mFilterSubString) : std::string::npos; +	} +	else +	{ +		return std::string::npos; +	}  }  bool LLInventoryFilter::isDefault() const @@ -533,6 +590,24 @@ void LLInventoryFilter::updateFilterTypes(U64 types, U64& current_types)  	}  } +void LLInventoryFilter::setSearchType(ESearchType type) +{ +	if(mSearchType != type) +	{ +		mSearchType = type; +		setModified(); +	} +} + +void LLInventoryFilter::setFilterCreator(EFilterCreatorType type) +{ +	if(mFilterCreatorType != type) +	{ +		mFilterCreatorType = type; +		setModified(); +	} +} +  void LLInventoryFilter::setFilterObjectTypes(U64 types)  {  	updateFilterTypes(types, mFilterOps.mFilterObjectTypes); @@ -556,6 +631,11 @@ void LLInventoryFilter::setFilterEmptySystemFolders()  	mFilterOps.mFilterTypes |= FILTERTYPE_EMPTYFOLDERS;  } +void LLInventoryFilter::setFilterWorn() +{ +    mFilterOps.mFilterTypes |= FILTERTYPE_WORN; +} +  void LLInventoryFilter::setFilterMarketplaceActiveFolders()  {  	mFilterOps.mFilterTypes |= FILTERTYPE_MARKETPLACE_ACTIVE; diff --git a/indra/newview/llinventoryfilter.h b/indra/newview/llinventoryfilter.h index eee36b7e40..01754ed023 100644 --- a/indra/newview/llinventoryfilter.h +++ b/indra/newview/llinventoryfilter.h @@ -57,7 +57,8 @@ public:          FILTERTYPE_MARKETPLACE_INACTIVE = 0x1 << 7,		// pass if folder is a marketplace inactive folder          FILTERTYPE_MARKETPLACE_UNASSOCIATED = 0x1 << 8,	// pass if folder is a marketplace non associated (no market ID) folder          FILTERTYPE_MARKETPLACE_LISTING_FOLDER = 0x1 << 9,	// pass iff folder is a listing folder -        FILTERTYPE_NO_MARKETPLACE_ITEMS = 0x1 << 10         // pass iff folder is not under the marketplace +        FILTERTYPE_NO_MARKETPLACE_ITEMS = 0x1 << 10,         // pass iff folder is not under the marketplace +        FILTERTYPE_WORN = 0x1 << 11,     // pass if item is worn  	};  	enum EFilterDateDirection @@ -82,6 +83,21 @@ public:  		SO_FOLDERS_BY_WEIGHT = 0x1 << 3,    // Force folder sort by weight, usually, amount of some elements in their descendents  	}; +	enum ESearchType +	{ +		SEARCHTYPE_NAME, +		SEARCHTYPE_DESCRIPTION, +		SEARCHTYPE_CREATOR, +		SEARCHTYPE_UUID +	}; + +	enum EFilterCreatorType +	{ +		FILTERCREATOR_ALL, +		FILTERCREATOR_SELF, +		FILTERCREATOR_OTHERS +	}; +  	struct FilterOps  	{  		struct DateRange : public LLInitParam::Block<DateRange> @@ -176,12 +192,17 @@ public:  	void 				setFilterUUID(const LLUUID &object_id);  	void				setFilterWearableTypes(U64 types);  	void				setFilterEmptySystemFolders(); +	void				setFilterWorn();  	void				setFilterMarketplaceActiveFolders();  	void				setFilterMarketplaceInactiveFolders();  	void				setFilterMarketplaceUnassociatedFolders();      void                setFilterMarketplaceListingFolders(bool select_only_listing_folders);      void                setFilterNoMarketplaceFolder();  	void				updateFilterTypes(U64 types, U64& current_types); +	void 				setSearchType(ESearchType type); +	ESearchType			getSearchType() { return mSearchType; } +	void 				setFilterCreator(EFilterCreatorType type); +	EFilterCreatorType		getFilterCreator() { return mFilterCreatorType; }  	void 				setFilterSubString(const std::string& string);  	const std::string& 	getFilterSubString(BOOL trim = FALSE) const; @@ -277,6 +298,7 @@ private:  	bool 				checkAgainstPermissions(const class LLFolderViewModelItemInventory* listener) const;  	bool 				checkAgainstPermissions(const LLInventoryItem* item) const;  	bool 				checkAgainstFilterLinks(const class LLFolderViewModelItemInventory* listener) const; +	bool 				checkAgainstCreator(const class LLFolderViewModelItemInventory* listener) const;  	bool				checkAgainstClipboard(const LLUUID& object_id) const;  	FilterOps				mFilterOps; @@ -285,6 +307,7 @@ private:  	std::string				mFilterSubString;  	std::string				mFilterSubStringOrig; +	std::string				mUsername;  	const std::string		mName;  	S32						mCurrentGeneration; @@ -299,6 +322,9 @@ private:  	std::string 			mFilterText;  	std::string 			mEmptyLookupMessage; + +	ESearchType 			mSearchType; +	EFilterCreatorType		mFilterCreatorType;  };  #endif diff --git a/indra/newview/llinventoryfunctions.cpp b/indra/newview/llinventoryfunctions.cpp index d282240bfb..67ddd79230 100644 --- a/indra/newview/llinventoryfunctions.cpp +++ b/indra/newview/llinventoryfunctions.cpp @@ -2296,7 +2296,8 @@ void LLInventoryAction::doToSelected(LLInventoryModel* model, LLFolderView* root  	if ("delete" == action)  	{  		static bool sDisplayedAtSession = false; -		 +		const LLUUID &marketplacelistings_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS, false); +		bool marketplacelistings_item = false;  		LLAllDescendentsPassedFilter f;  		for (std::set<LLFolderViewItem*>::iterator it = selected_items.begin(); (it != selected_items.end()) && (f.allDescendentsPassedFilter()); ++it)  		{ @@ -2304,9 +2305,15 @@ void LLInventoryAction::doToSelected(LLInventoryModel* model, LLFolderView* root  			{  				folder->applyFunctorRecursively(f);  			} +			LLFolderViewModelItemInventory * viewModel = dynamic_cast<LLFolderViewModelItemInventory *>((*it)->getViewModelItem()); +			if (viewModel && gInventory.isObjectDescendentOf(viewModel->getUUID(), marketplacelistings_id)) +			{ +				marketplacelistings_item = true; +				break; +			}  		}  		// Fall through to the generic confirmation if the user choose to ignore the specialized one -		if ( (!f.allDescendentsPassedFilter()) && (!LLNotifications::instance().getIgnored("DeleteFilteredItems")) ) +		if ( (!f.allDescendentsPassedFilter()) && !marketplacelistings_item && (!LLNotifications::instance().getIgnored("DeleteFilteredItems")) )  		{  			LLNotificationsUtil::add("DeleteFilteredItems", LLSD(), LLSD(), boost::bind(&LLInventoryAction::onItemsRemovalConfirmation, _1, _2, root->getHandle()));  		} diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp index f9c91312ee..8f93796ec7 100644 --- a/indra/newview/llinventorypanel.cpp +++ b/indra/newview/llinventorypanel.cpp @@ -351,6 +351,11 @@ void LLInventoryPanel::setFilterTypes(U64 types, LLInventoryFilter::EFilterType  		getFilter().setFilterCategoryTypes(types);  } +void LLInventoryPanel::setFilterWorn() +{ +    getFilter().setFilterWorn(); +} +  U32 LLInventoryPanel::getFilterObjectTypes() const   {   	return getFilter().getFilterObjectTypes(); @@ -420,6 +425,16 @@ void LLInventoryPanel::setFilterLinks(U64 filter_links)  	getFilter().setFilterLinks(filter_links);  } +void LLInventoryPanel::setSearchType(LLInventoryFilter::ESearchType type) +{ +	getFilter().setSearchType(type); +} + +LLInventoryFilter::ESearchType LLInventoryPanel::getSearchType() +{ +	return getFilter().getSearchType(); +} +  void LLInventoryPanel::setShowFolderState(LLInventoryFilter::EFolderShow show)  {  	getFilter().setShowFolderState(show); @@ -1344,9 +1359,14 @@ LLInventoryPanel* LLInventoryPanel::getActiveInventoryPanel(BOOL auto_open)  }  //static -void LLInventoryPanel::openInventoryPanelAndSetSelection(BOOL auto_open, const LLUUID& obj_id) +void LLInventoryPanel::openInventoryPanelAndSetSelection(BOOL auto_open, const LLUUID& obj_id, BOOL main_panel)  { -	LLInventoryPanel *active_panel = LLInventoryPanel::getActiveInventoryPanel(auto_open); +	LLInventoryPanel *active_panel; +	if (main_panel) +	{ +		LLFloaterSidePanelContainer::getPanel<LLSidepanelInventory>("inventory")->selectAllItemsPanel(); +	} +	active_panel = LLInventoryPanel::getActiveInventoryPanel(auto_open);  	if (active_panel)  	{ diff --git a/indra/newview/llinventorypanel.h b/indra/newview/llinventorypanel.h index 5ee58707b0..d849647bb6 100644 --- a/indra/newview/llinventorypanel.h +++ b/indra/newview/llinventorypanel.h @@ -172,6 +172,7 @@ public:  	LLInventoryFilter& getFilter();  	const LLInventoryFilter& getFilter() const;  	void setFilterTypes(U64 filter, LLInventoryFilter::EFilterType = LLInventoryFilter::FILTERTYPE_OBJECT); +	void setFilterWorn();  	U32 getFilterObjectTypes() const;  	void setFilterPermMask(PermissionMask filter_perm_mask);  	U32 getFilterPermMask() const; @@ -183,6 +184,8 @@ public:  	void setDateSearchDirection(U32 direction);  	BOOL getSinceLogoff();  	void setFilterLinks(U64 filter_links); +	void setSearchType(LLInventoryFilter::ESearchType type); +	LLInventoryFilter::ESearchType getSearchType();  	void setShowFolderState(LLInventoryFilter::EFolderShow show);  	LLInventoryFilter::EFolderShow getShowFolderState(); @@ -218,7 +221,7 @@ public:  	// "Auto_open" determines if we open an inventory panel if none are open.  	static LLInventoryPanel *getActiveInventoryPanel(BOOL auto_open = TRUE); -	static void openInventoryPanelAndSetSelection(BOOL auto_open, const LLUUID& obj_id); +	static void openInventoryPanelAndSetSelection(BOOL auto_open, const LLUUID& obj_id, BOOL main_panel = FALSE);  	void addItemID(const LLUUID& id, LLFolderViewItem* itemp);  	void removeItemID(const LLUUID& id); diff --git a/indra/newview/lllogininstance.cpp b/indra/newview/lllogininstance.cpp index 242a845abe..8d361d3161 100644 --- a/indra/newview/lllogininstance.cpp +++ b/indra/newview/lllogininstance.cpp @@ -57,10 +57,13 @@  #include "llmachineid.h"  #include "llevents.h"  #include "llappviewer.h" +#include "llsdserialize.h"  #include <boost/scoped_ptr.hpp>  #include <sstream> +const S32 LOGIN_MAX_RETRIES = 3; +  class LLLoginInstance::Disposable {  public:  	virtual ~Disposable() {} @@ -207,8 +210,8 @@ void LLLoginInstance::constructAuthParams(LLPointer<LLCredential> user_credentia  	request_params["version"] = LLVersionInfo::getVersion();  	request_params["channel"] = LLVersionInfo::getChannel();  	request_params["platform"] = mPlatform; -	request_params["platform_version"] = mPlatformVersion;  	request_params["address_size"] = ADDRESS_SIZE; +	request_params["platform_version"] = mPlatformVersion;  	request_params["platform_string"] = mPlatformVersionName;  	request_params["id0"] = mSerialNumber;  	request_params["host_id"] = gSavedSettings.getString("HostID"); @@ -227,13 +230,16 @@ void LLLoginInstance::constructAuthParams(LLPointer<LLCredential> user_credentia          request_params[it->first] = it->second;      } +	// Specify desired timeout/retry options +	LLSD http_params; +	http_params["timeout"] = gSavedSettings.getF32("LoginSRVTimeout"); +	http_params["retries"] = LOGIN_MAX_RETRIES; +  	mRequestData.clear();  	mRequestData["method"] = "login_to_simulator";  	mRequestData["params"] = request_params;  	mRequestData["options"] = requested_options; - -	mRequestData["cfg_srv_timeout"] = gSavedSettings.getF32("LoginSRVTimeout"); -	mRequestData["cfg_srv_pump"] = gSavedSettings.getString("LoginSRVPump"); +	mRequestData["http_params"] = http_params;  }  bool LLLoginInstance::handleLoginEvent(const LLSD& event) diff --git a/indra/newview/llmachineid.cpp b/indra/newview/llmachineid.cpp index b5fd3df0f3..b0ee8e7fcb 100644 --- a/indra/newview/llmachineid.cpp +++ b/indra/newview/llmachineid.cpp @@ -37,6 +37,28 @@ using namespace std;  unsigned char static_unique_id[] =  {0,0,0,0,0,0};  bool static has_static_unique_id = false; +#if	LL_WINDOWS + +class LLComInitialize +{ +    HRESULT mHR; +public: +    LLComInitialize() +    { +        mHR = CoInitializeEx(0, COINIT_MULTITHREADED); +        if (FAILED(mHR)) +            LL_DEBUGS("AppInit") << "Failed to initialize COM library. Error code = 0x" << hex << mHR << LL_ENDL; +    } + +    ~LLComInitialize() +    { +        if (SUCCEEDED(mHR)) +            CoUninitialize(); +    } +}; + +#endif //LL_WINDOWS +  // get an unique machine id.  // NOT THREAD SAFE - do before setting up threads.  // MAC Address doesn't work for Windows 7 since the first returned hardware MAC address changes with each reboot,  Go figure?? @@ -59,12 +81,7 @@ S32 LLMachineID::init()          // Step 1: --------------------------------------------------          // Initialize COM. ------------------------------------------ -        hres =  CoInitializeEx(0, COINIT_MULTITHREADED);  -        if (FAILED(hres)) -        { -            LL_DEBUGS("AppInit") << "Failed to initialize COM library. Error code = 0x"   << hex << hres << LL_ENDL; -            return 1;                  // Program has failed. -        } +        LLComInitialize comInit;          // Step 2: --------------------------------------------------          // Set general COM security levels -------------------------- @@ -89,7 +106,6 @@ S32 LLMachineID::init()          if (FAILED(hres))          {              LL_WARNS("AppInit") << "Failed to initialize security. Error code = 0x"  << hex << hres << LL_ENDL; -            CoUninitialize();              return 1;                    // Program has failed.          } @@ -107,7 +123,6 @@ S32 LLMachineID::init()          if (FAILED(hres))          {              LL_WARNS("AppInit") << "Failed to create IWbemLocator object." << " Err code = 0x" << hex << hres << LL_ENDL; -            CoUninitialize();              return 1;                 // Program has failed.          } @@ -134,7 +149,6 @@ S32 LLMachineID::init()          {              LL_WARNS("AppInit") << "Could not connect. Error code = 0x"  << hex << hres << LL_ENDL;              pLoc->Release();      -            CoUninitialize();              return 1;                // Program has failed.          } @@ -160,7 +174,6 @@ S32 LLMachineID::init()              LL_WARNS("AppInit") << "Could not set proxy blanket. Error code = 0x"   << hex << hres << LL_ENDL;              pSvc->Release();              pLoc->Release();      -            CoUninitialize();              return 1;               // Program has failed.          } @@ -181,7 +194,6 @@ S32 LLMachineID::init()              LL_WARNS("AppInit") << "Query for operating system name failed." << " Error code = 0x"  << hex << hres << LL_ENDL;              pSvc->Release();              pLoc->Release(); -            CoUninitialize();              return 1;               // Program has failed.          } @@ -236,7 +248,6 @@ S32 LLMachineID::init()              pLoc->Release();          if (pEnumerator)              pEnumerator->Release(); -        CoUninitialize();          ret_code=0;  #else          unsigned char * staticPtr = (unsigned char *)(&static_unique_id[0]); diff --git a/indra/newview/llmediactrl.h b/indra/newview/llmediactrl.h index 291d87073e..125a67e23e 100644 --- a/indra/newview/llmediactrl.h +++ b/indra/newview/llmediactrl.h @@ -176,6 +176,8 @@ public:          virtual bool    wantsKeyUpKeyDown() const;          virtual bool    wantsReturnKey() const; +        virtual BOOL	acceptsTextInput() const {return TRUE;} +  	protected:  		void convertInputCoords(S32& x, S32& y); diff --git a/indra/newview/llmeshrepository.cpp b/indra/newview/llmeshrepository.cpp index c2a0393170..df708013fc 100644 --- a/indra/newview/llmeshrepository.cpp +++ b/indra/newview/llmeshrepository.cpp @@ -1892,7 +1892,7 @@ LLMeshUploadThread::LLMeshUploadThread(LLMeshUploadThread::instance_list& data,  	mOrigin = gAgent.getPositionAgent();  	mHost = gAgent.getRegionHost(); -	mWholeModelFeeCapability = gAgent.getRegion()->getCapability("NewFileAgentInventory"); +	mWholeModelFeeCapability = gAgent.getRegionCapability("NewFileAgentInventory");  	mOrigin += gAgent.getAtAxis() * scale.magVec(); @@ -1980,14 +1980,14 @@ void dump_llsd_to_file(const LLSD& content, std::string filename)  {  	if (gSavedSettings.getBOOL("MeshUploadLogXML"))  	{ -		std::ofstream of(filename.c_str()); +		llofstream of(filename.c_str());  		LLSDSerialize::toPrettyXML(content,of);  	}  }  LLSD llsd_from_file(std::string filename)  { -	std::ifstream ifs(filename.c_str()); +	llifstream ifs(filename.c_str());  	LLSD result;  	LLSDSerialize::fromXML(result,ifs);  	return result; diff --git a/indra/newview/lloutfitgallery.cpp b/indra/newview/lloutfitgallery.cpp index 5518656f3f..cca65f2ce1 100644 --- a/indra/newview/lloutfitgallery.cpp +++ b/indra/newview/lloutfitgallery.cpp @@ -699,13 +699,24 @@ void LLOutfitGalleryItem::draw()      const F32 alpha = getTransparencyType() == TT_ACTIVE ? 1.0f : getCurrentTransparency();      if (mTexturep)      { -        LLRect interior = border; -        interior.stretch(-1); +        if (mImageUpdatePending && mTexturep->getDiscardLevel() >= 0) +        { +            mImageUpdatePending = false; +            if (mTexturep->getOriginalWidth() > MAX_OUTFIT_PHOTO_WIDTH || mTexturep->getOriginalHeight() > MAX_OUTFIT_PHOTO_HEIGHT) +            { +                setDefaultImage(); +            } +        } +        else +        { +            LLRect interior = border; +            interior.stretch(-1); -        gl_draw_scaled_image(interior.mLeft - 1, interior.mBottom, interior.getWidth(), interior.getHeight(), mTexturep, UI_VERTEX_COLOR % alpha); +            gl_draw_scaled_image(interior.mLeft - 1, interior.mBottom, interior.getWidth(), interior.getHeight(), mTexturep, UI_VERTEX_COLOR % alpha); -        // Pump the priority -        mTexturep->addTextureStats((F32)(interior.getWidth() * interior.getHeight())); +            // Pump the priority +            mTexturep->addTextureStats((F32)(interior.getWidth() * interior.getHeight())); +        }      }  } @@ -771,12 +782,19 @@ BOOL LLOutfitGalleryItem::handleDoubleClick(S32 x, S32 y, MASK mask)      return LLPanel::handleDoubleClick(x, y, mask);  } -void LLOutfitGalleryItem::setImageAssetId(LLUUID image_asset_id) +bool LLOutfitGalleryItem::setImageAssetId(LLUUID image_asset_id)  { -    mImageAssetId = image_asset_id; -    mTexturep = LLViewerTextureManager::getFetchedTexture(image_asset_id, FTT_DEFAULT, MIPMAP_YES, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE); -    getChildView("preview_outfit")->setVisible(FALSE); -    mDefaultImage = false; +    LLPointer<LLViewerFetchedTexture> texture = LLViewerTextureManager::getFetchedTexture(image_asset_id, FTT_DEFAULT, MIPMAP_YES, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE); +    if (texture && texture->getOriginalWidth() <= MAX_OUTFIT_PHOTO_WIDTH && texture->getOriginalHeight() <= MAX_OUTFIT_PHOTO_HEIGHT) +    { +        mImageAssetId = image_asset_id; +        mTexturep = texture; +        getChildView("preview_outfit")->setVisible(FALSE); +        mDefaultImage = false; +        mImageUpdatePending = (texture->getDiscardLevel() == -1); +        return true; +    } +    return false;  }  LLUUID LLOutfitGalleryItem::getImageAssetId() @@ -790,6 +808,7 @@ void LLOutfitGalleryItem::setDefaultImage()      mImageAssetId.setNull();      getChildView("preview_outfit")->setVisible(TRUE);      mDefaultImage = true; +    mImageUpdatePending = false;  }  LLContextMenu* LLOutfitGalleryContextMenu::createMenu() @@ -1025,13 +1044,28 @@ void LLOutfitGallery::refreshOutfit(const LLUUID& category_id)          BOOST_FOREACH(LLViewerInventoryItem* outfit_item, outfit_item_array)          {              LLViewerInventoryItem* linked_item = outfit_item->getLinkedItem(); -            if (linked_item != NULL && linked_item->getActualType() == LLAssetType::AT_TEXTURE) +            LLUUID asset_id, inv_id; +            std::string item_name; +            if (linked_item != NULL)              { -                LLUUID asset_id = linked_item->getAssetUUID(); -                mOutfitMap[category_id]->setImageAssetId(asset_id); -                photo_loaded = true; -                std::string linked_item_name = linked_item->getName(); -                if (!mOutfitRenamePending.isNull() && mOutfitRenamePending.asString() == linked_item_name) +                if (linked_item->getActualType() == LLAssetType::AT_TEXTURE) +                { +                    asset_id = linked_item->getAssetUUID(); +                    inv_id = linked_item->getUUID(); +                    item_name = linked_item->getName(); +                } +            } +            else if (outfit_item->getActualType() == LLAssetType::AT_TEXTURE) +            { +                asset_id = outfit_item->getAssetUUID(); +                inv_id = outfit_item->getUUID(); +                item_name = outfit_item->getName(); +            } +            if (asset_id.notNull()) +            { +                photo_loaded |= mOutfitMap[category_id]->setImageAssetId(asset_id); +                // Rename links +                if (!mOutfitRenamePending.isNull() && mOutfitRenamePending.asString() == item_name)                  {                      LLViewerInventoryCategory *outfit_cat = gInventory.getCategory(mOutfitRenamePending);                      LLStringUtil::format_map_t photo_string_args; @@ -1039,7 +1073,7 @@ void LLOutfitGallery::refreshOutfit(const LLUUID& category_id)                      std::string new_name = getString("outfit_photo_string", photo_string_args);                      LLSD updates;                      updates["name"] = new_name; -                    update_inventory_item(linked_item->getUUID(), updates, NULL); +                    update_inventory_item(inv_id, updates, NULL);                      mOutfitRenamePending.setNull();                      LLFloater* inv_floater = LLFloaterReg::getInstance("inventory");                      if (inv_floater) @@ -1052,7 +1086,11 @@ void LLOutfitGallery::refreshOutfit(const LLUUID& category_id)                          appearance_floater->setFocus(TRUE);                      }                  } -                break; +                if (item_name == LLAppearanceMgr::sExpectedTextureName) +                { +                    // Images with "appropriate" name take priority +                    break; +                }              }              if (!photo_loaded)              { @@ -1067,6 +1105,7 @@ void LLOutfitGallery::refreshOutfit(const LLUUID& category_id)      }  } +// Refresh linked textures from "textures" uploads folder  void LLOutfitGallery::refreshTextures(const LLUUID& category_id)  {      LLInventoryModel::cat_array_t cat_array; @@ -1176,6 +1215,7 @@ void LLOutfitGallery::uploadPhoto(LLUUID outfit_id)                  upload_pending_name, callback, expected_upload_cost, nruserdata);              mOutfitLinkPending = outfit_id;          } +        delete unit;      }  } diff --git a/indra/newview/lloutfitgallery.h b/indra/newview/lloutfitgallery.h index 2566247072..b1ca850508 100644 --- a/indra/newview/lloutfitgallery.h +++ b/indra/newview/lloutfitgallery.h @@ -259,7 +259,7 @@ public:      /*virtual*/ BOOL handleDoubleClick(S32 x, S32 y, MASK mask);      void setDefaultImage(); -    void setImageAssetId(LLUUID asset_id); +    bool setImageAssetId(LLUUID asset_id);      LLUUID getImageAssetId();      void setOutfitName(std::string name);      void setOutfitWorn(bool value); @@ -282,6 +282,7 @@ private:      bool     mSelected;      bool     mWorn;      bool     mDefaultImage; +    bool     mImageUpdatePending;      bool	 mHidden;      std::string mOutfitName;  }; diff --git a/indra/newview/llpanellogin.cpp b/indra/newview/llpanellogin.cpp index f8a5bbb036..a88c10521c 100644 --- a/indra/newview/llpanellogin.cpp +++ b/indra/newview/llpanellogin.cpp @@ -791,7 +791,7 @@ void LLPanelLogin::loadLoginPage()  	params["grid"] = LLGridManager::getInstance()->getGridId();  	// add OS info -	params["os"] = LLAppViewer::instance()->getOSInfo().getOSStringSimple(); +	params["os"] = LLOSInfo::instance().getOSStringSimple();  	// sourceid  	params["sourceid"] = gSavedSettings.getString("sourceid"); diff --git a/indra/newview/llpanelmaininventory.cpp b/indra/newview/llpanelmaininventory.cpp index dd75ae9c06..f771a027e0 100644 --- a/indra/newview/llpanelmaininventory.cpp +++ b/indra/newview/llpanelmaininventory.cpp @@ -30,6 +30,8 @@  #include "llagent.h"  #include "llagentcamera.h"  #include "llavataractions.h" +#include "llcheckboxctrl.h" +#include "llcombobox.h"  #include "lldndbutton.h"  #include "lleconomy.h"  #include "llfilepicker.h" @@ -84,6 +86,9 @@ public:  	BOOL getCheckSinceLogoff();  	U32 getDateSearchDirection(); +	void onCreatorSelfFilterCommit(); +	void onCreatorOtherFilterCommit(); +  	static void onTimeAgo(LLUICtrl*, void *);  	static void onCloseBtn(void* user_data);  	static void selectAllTypes(void* user_data); @@ -92,6 +97,8 @@ private:  	LLPanelMainInventory*	mPanelMainInventory;  	LLSpinCtrl*			mSpinSinceDays;  	LLSpinCtrl*			mSpinSinceHours; +	LLCheckBoxCtrl*		mCreatorSelf; +	LLCheckBoxCtrl*		mCreatorOthers;  	LLInventoryFilter*	mFilter;  }; @@ -102,6 +109,7 @@ private:  LLPanelMainInventory::LLPanelMainInventory(const LLPanel::Params& p)  	: LLPanel(p),  	  mActivePanel(NULL), +	  mWornItemsPanel(NULL),  	  mSavedFolderState(NULL),  	  mFilterText(""),  	  mMenuGearDefault(NULL), @@ -158,6 +166,25 @@ BOOL LLPanelMainInventory::postBuild()  		recent_items_panel->setSelectCallback(boost::bind(&LLPanelMainInventory::onSelectionChange, this, recent_items_panel, _1, _2));  	} +	mWornItemsPanel = getChild<LLInventoryPanel>("Worn Items"); +	if (mWornItemsPanel) +	{ +		U32 filter_types = 0x0; +		filter_types |= 0x1 << LLInventoryType::IT_WEARABLE; +		filter_types |= 0x1 << LLInventoryType::IT_ATTACHMENT; +		filter_types |= 0x1 << LLInventoryType::IT_OBJECT; +		mWornItemsPanel->setFilterTypes(filter_types); +		mWornItemsPanel->setFilterWorn(); +		mWornItemsPanel->setShowFolderState(LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS); +		mWornItemsPanel->setFilterLinks(LLInventoryFilter::FILTERLINK_EXCLUDE_LINKS); +		mWornItemsPanel->getFilter().markDefault(); +		mWornItemsPanel->setSelectCallback(boost::bind(&LLPanelMainInventory::onSelectionChange, this, mWornItemsPanel, _1, _2)); +	} +	mSearchTypeCombo  = getChild<LLComboBox>("search_type"); +	if(mSearchTypeCombo) +	{ +		mSearchTypeCombo->setCommitCallback(boost::bind(&LLPanelMainInventory::onSelectSearchType, this)); +	}  	// Now load the stored settings from disk, if available.  	std::string filterSaveName(gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, FILTERS_FILENAME));  	LL_INFOS() << "LLPanelMainInventory::init: reading from " << filterSaveName << LL_ENDL; @@ -262,6 +289,16 @@ LLPanelMainInventory::~LLPanelMainInventory( void )  	delete mSavedFolderState;  } +LLInventoryPanel* LLPanelMainInventory::getAllItemsPanel() +{ +	return  getChild<LLInventoryPanel>("All Items"); +} + +void LLPanelMainInventory::selectAllItemsPanel() +{ +	mFilterTabs->selectFirstTab(); +} +  void LLPanelMainInventory::startSearch()  {  	// this forces focus to line editor portion of search editor @@ -387,6 +424,48 @@ void LLPanelMainInventory::setSortBy(const LLSD& userdata)      }  } +void LLPanelMainInventory::onSelectSearchType() +{ +	std::string new_type = mSearchTypeCombo->getValue(); +	if (new_type == "search_by_name") +	{ +		getActivePanel()->setSearchType(LLInventoryFilter::SEARCHTYPE_NAME); +	} +	if (new_type == "search_by_creator") +	{ +		getActivePanel()->setSearchType(LLInventoryFilter::SEARCHTYPE_CREATOR); +	} +	if (new_type == "search_by_description") +	{ +		getActivePanel()->setSearchType(LLInventoryFilter::SEARCHTYPE_DESCRIPTION); +	} +	if (new_type == "search_by_UUID") +	{ +		getActivePanel()->setSearchType(LLInventoryFilter::SEARCHTYPE_UUID); +	} +} + +void LLPanelMainInventory::updateSearchTypeCombo() +{ +	LLInventoryFilter::ESearchType search_type = getActivePanel()->getSearchType(); +	switch(search_type) +	{ +		case LLInventoryFilter::SEARCHTYPE_CREATOR: +			mSearchTypeCombo->setValue("search_by_creator"); +			break; +		case LLInventoryFilter::SEARCHTYPE_DESCRIPTION: +			mSearchTypeCombo->setValue("search_by_description"); +			break; +		case LLInventoryFilter::SEARCHTYPE_UUID: +			mSearchTypeCombo->setValue("search_by_UUID"); +			break; +		case LLInventoryFilter::SEARCHTYPE_NAME: +		default: +			mSearchTypeCombo->setValue("search_by_name"); +			break; +	} +} +  // static  BOOL LLPanelMainInventory::filtersVisible(void* user_data)  { @@ -400,7 +479,7 @@ void LLPanelMainInventory::onClearSearch()  {  	BOOL initially_active = FALSE;  	LLFloater *finder = getFinder(); -	if (mActivePanel) +	if (mActivePanel && (getActivePanel() != mWornItemsPanel))  	{  		initially_active = mActivePanel->getFilter().isNotDefault();  		mActivePanel->setFilterSubString(LLStringUtil::null); @@ -507,6 +586,11 @@ void LLPanelMainInventory::onFilterSelected()  		return;  	} +	if (getActivePanel() == mWornItemsPanel) +	{ +		mActivePanel->openAllFolders(); +	} +	updateSearchTypeCombo();  	setFilterSubString(mFilterSubString);  	LLInventoryFilter& filter = mActivePanel->getFilter();  	LLFloaterInventoryFinder *finder = getFinder(); @@ -540,7 +624,7 @@ BOOL LLPanelMainInventory::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,  {  	// Check to see if we are auto scrolling from the last frame  	LLInventoryPanel* panel = (LLInventoryPanel*)this->getActivePanel(); -	BOOL needsToScroll = panel->getScrollableContainer()->autoScroll(x, y); +	BOOL needsToScroll = panel->getScrollableContainer()->canAutoScroll(x, y);  	if(mFilterTabs)  	{  		if(needsToScroll) @@ -705,6 +789,11 @@ BOOL LLFloaterInventoryFinder::postBuild()  	mSpinSinceDays = getChild<LLSpinCtrl>("spin_days_ago");  	childSetCommitCallback("spin_days_ago", onTimeAgo, this); +	mCreatorSelf = getChild<LLCheckBoxCtrl>("check_created_by_me"); +	mCreatorOthers = getChild<LLCheckBoxCtrl>("check_created_by_others"); +	mCreatorSelf->setCommitCallback(boost::bind(&LLFloaterInventoryFinder::onCreatorSelfFilterCommit, this)); +	mCreatorOthers->setCommitCallback(boost::bind(&LLFloaterInventoryFinder::onCreatorOtherFilterCommit, this)); +  	childSetAction("Close", onCloseBtn, this);  	updateElementsFromFilter(); @@ -763,6 +852,10 @@ void LLFloaterInventoryFinder::updateElementsFromFilter()  	U32 hours = mFilter->getHoursAgo();  	U32 date_search_direction = mFilter->getDateSearchDirection(); +	LLInventoryFilter::EFilterCreatorType filter_creator = mFilter->getFilterCreator(); +	bool show_created_by_me = ((filter_creator == LLInventoryFilter::FILTERCREATOR_ALL) || (filter_creator == LLInventoryFilter::FILTERCREATOR_SELF)); +	bool show_created_by_others = ((filter_creator == LLInventoryFilter::FILTERCREATOR_ALL) || (filter_creator == LLInventoryFilter::FILTERCREATOR_OTHERS)); +  	// update the ui elements  	setTitle(mFilter->getName()); @@ -780,6 +873,10 @@ void LLFloaterInventoryFinder::updateElementsFromFilter()  	getChild<LLUICtrl>("check_texture")->setValue((S32) (filter_types & 0x1 << LLInventoryType::IT_TEXTURE));  	getChild<LLUICtrl>("check_snapshot")->setValue((S32) (filter_types & 0x1 << LLInventoryType::IT_SNAPSHOT));  	getChild<LLUICtrl>("check_show_empty")->setValue(show_folders == LLInventoryFilter::SHOW_ALL_FOLDERS); + +	getChild<LLUICtrl>("check_created_by_me")->setValue(show_created_by_me); +	getChild<LLUICtrl>("check_created_by_others")->setValue(show_created_by_others); +  	getChild<LLUICtrl>("check_since_logoff")->setValue(mFilter->isSinceLogoff());  	mSpinSinceHours->set((F32)(hours % 24));  	mSpinSinceDays->set((F32)(hours / 24)); @@ -877,6 +974,7 @@ void LLFloaterInventoryFinder::draw()  	mPanelMainInventory->getPanel()->setShowFolderState(getCheckShowEmpty() ?  		LLInventoryFilter::SHOW_ALL_FOLDERS : LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS);  	mPanelMainInventory->getPanel()->setFilterTypes(filter); +  	if (getCheckSinceLogoff())  	{  		mSpinSinceDays->set(0); @@ -905,6 +1003,46 @@ void LLFloaterInventoryFinder::draw()  	LLPanel::draw();  } +void LLFloaterInventoryFinder::onCreatorSelfFilterCommit() +{ +	bool show_creator_self = mCreatorSelf->getValue(); +	bool show_creator_other = mCreatorOthers->getValue(); + +	if(show_creator_self && show_creator_other) +	{ +		mFilter->setFilterCreator(LLInventoryFilter::FILTERCREATOR_ALL); +	} +	else if(show_creator_self) +	{ +		mFilter->setFilterCreator(LLInventoryFilter::FILTERCREATOR_SELF); +	} +	else if(!show_creator_self || !show_creator_other) +	{ +		mFilter->setFilterCreator(LLInventoryFilter::FILTERCREATOR_OTHERS); +		mCreatorOthers->set(TRUE); +	} +} + +void LLFloaterInventoryFinder::onCreatorOtherFilterCommit() +{ +	bool show_creator_self = mCreatorSelf->getValue(); +	bool show_creator_other = mCreatorOthers->getValue(); + +	if(show_creator_self && show_creator_other) +	{ +		mFilter->setFilterCreator(LLInventoryFilter::FILTERCREATOR_ALL); +	} +	else if(show_creator_other) +	{ +		mFilter->setFilterCreator(LLInventoryFilter::FILTERCREATOR_OTHERS); +	} +	else if(!show_creator_other || !show_creator_self) +	{ +		mFilter->setFilterCreator(LLInventoryFilter::FILTERCREATOR_SELF); +		mCreatorSelf->set(TRUE); +	} +} +  BOOL LLFloaterInventoryFinder::getCheckShowEmpty()  {  	return getChild<LLUICtrl>("check_show_empty")->getValue(); diff --git a/indra/newview/llpanelmaininventory.h b/indra/newview/llpanelmaininventory.h index 38936804ac..530f4e618c 100644 --- a/indra/newview/llpanelmaininventory.h +++ b/indra/newview/llpanelmaininventory.h @@ -34,6 +34,7 @@  #include "llfolderview.h" +class LLComboBox;  class LLFolderViewItem;  class LLInventoryPanel;  class LLSaveFolderState; @@ -76,6 +77,8 @@ public:  	LLInventoryPanel* getPanel() { return mActivePanel; }  	LLInventoryPanel* getActivePanel() { return mActivePanel; } +	LLInventoryPanel* getAllItemsPanel(); +	void selectAllItemsPanel();  	const LLInventoryPanel* getActivePanel() const { return mActivePanel; }  	const std::string& getFilterText() const { return mFilterText; } @@ -120,6 +123,8 @@ protected:  	void updateItemcountText();  	void onFocusReceived(); +	void onSelectSearchType(); +	void updateSearchTypeCombo();  private:  	LLFloaterInventoryFinder* getFinder(); @@ -129,12 +134,14 @@ private:      LLUICtrl*                   mCounterCtrl;  	LLHandle<LLFloater>			mFinderHandle;  	LLInventoryPanel*			mActivePanel; +	LLInventoryPanel*			mWornItemsPanel;  	bool						mResortActivePanel;  	LLSaveFolderState*			mSavedFolderState;  	std::string					mFilterText;  	std::string					mFilterSubString;  	S32							mItemCount;  	std::string 				mItemCountString; +	LLComboBox*					mSearchTypeCombo;  	////////////////////////////////////////////////////////////////////////////////// diff --git a/indra/newview/llpanelobject.cpp b/indra/newview/llpanelobject.cpp index 5dd44b4444..0bf4d48421 100644 --- a/indra/newview/llpanelobject.cpp +++ b/indra/newview/llpanelobject.cpp @@ -1712,7 +1712,7 @@ void LLPanelObject::sendPosition(BOOL btn_down)  			if (mObject->isRootEdit())  			{								  				// only offset by parent's translation -				mObject->resetChildrenPosition(LLVector3(-delta), TRUE) ;				 +				mObject->resetChildrenPosition(LLVector3(-delta), TRUE, TRUE) ;  			}  			if(!btn_down) diff --git a/indra/newview/llpanelobjectinventory.cpp b/indra/newview/llpanelobjectinventory.cpp index dbfebf901a..b5ee68ba25 100644 --- a/indra/newview/llpanelobjectinventory.cpp +++ b/indra/newview/llpanelobjectinventory.cpp @@ -110,6 +110,11 @@ public:  	virtual const std::string& getDisplayName() const;  	virtual const std::string& getSearchableName() const; +	virtual std::string getSearchableDescription() const {return LLStringUtil::null;} +	virtual std::string getSearchableCreatorName() const {return LLStringUtil::null;} +	virtual std::string getSearchableUUIDString() const {return LLStringUtil::null;} + +  	virtual PermissionMask getPermissionMask() const { return PERM_NONE; }  	/*virtual*/ LLFolderType::EType getPreferredType() const { return LLFolderType::FT_NONE; }  	virtual const LLUUID& getUUID() const { return mUUID; } diff --git a/indra/newview/llpanelsnapshotpostcard.cpp b/indra/newview/llpanelsnapshotpostcard.cpp index 3d18e837af..f3a4cf36ee 100644 --- a/indra/newview/llpanelsnapshotpostcard.cpp +++ b/indra/newview/llpanelsnapshotpostcard.cpp @@ -164,6 +164,8 @@ void LLPanelSnapshotPostcard::sendPostcardFinished(LLSD result)  void LLPanelSnapshotPostcard::sendPostcard()  { +    if (!gAgent.getRegion()) return; +      // upload the image      std::string url = gAgent.getRegion()->getCapability("SendPostcard");      if (!url.empty()) diff --git a/indra/newview/llpanelwearing.cpp b/indra/newview/llpanelwearing.cpp index a150007177..3099a6e039 100644 --- a/indra/newview/llpanelwearing.cpp +++ b/indra/newview/llpanelwearing.cpp @@ -416,7 +416,7 @@ bool LLPanelWearing::populateAttachmentsList(bool update)  void LLPanelWearing::requestAttachmentDetails()  {  	LLSD body; -	std::string url = gAgent.getRegion()->getCapability("AttachmentResources"); +	std::string url = gAgent.getRegionCapability("AttachmentResources");  	if (!url.empty())  	{  		LLCoros::instance().launch("LLPanelWearing::getAttachmentLimitsCoro", diff --git a/indra/newview/llpreview.cpp b/indra/newview/llpreview.cpp index fb21b980dc..fc2de4844e 100644 --- a/indra/newview/llpreview.cpp +++ b/indra/newview/llpreview.cpp @@ -62,7 +62,8 @@ LLPreview::LLPreview(const LLSD& key)  	mUserResized(FALSE),  	mCloseAfterSave(FALSE),  	mAssetStatus(PREVIEW_ASSET_UNLOADED), -	mDirty(TRUE) +	mDirty(TRUE), +	mSaveDialogShown(FALSE)  {  	mAuxItem = new LLInventoryItem;  	// don't necessarily steal focus on creation -- sometimes these guys pop up without user action diff --git a/indra/newview/llpreview.h b/indra/newview/llpreview.h index 49c114720b..b41aa2be1a 100644 --- a/indra/newview/llpreview.h +++ b/indra/newview/llpreview.h @@ -121,7 +121,8 @@ protected:  	// for LLInventoryObserver   	virtual void changed(U32 mask);	  	BOOL mDirty; -	 +	BOOL mSaveDialogShown; +  protected:  	LLUUID mItemUUID; diff --git a/indra/newview/llpreviewanim.cpp b/indra/newview/llpreviewanim.cpp index fb40af1302..12ac9e6fc5 100644 --- a/indra/newview/llpreviewanim.cpp +++ b/indra/newview/llpreviewanim.cpp @@ -148,6 +148,12 @@ void LLPreviewAnim::draw()  			}  			if(gAgentAvatarp->isMotionActive(this->mItemID) && !this->mDidStart)  			{ +				const LLInventoryItem *item = getItem(); +				LLMotion* motion = gAgentAvatarp->findMotion(this->mItemID); +				if (item && motion) +				{ +					motion->setName(item->getName()); +				}  				this->mDidStart = true;  			}  		} diff --git a/indra/newview/llpreviewgesture.cpp b/indra/newview/llpreviewgesture.cpp index ff9a70d05c..787bd68e58 100644 --- a/indra/newview/llpreviewgesture.cpp +++ b/indra/newview/llpreviewgesture.cpp @@ -234,9 +234,13 @@ BOOL LLPreviewGesture::canClose()  	}  	else  	{ -		// Bring up view-modal dialog: Save changes? Yes, No, Cancel -		LLNotificationsUtil::add("SaveChanges", LLSD(), LLSD(), -			boost::bind(&LLPreviewGesture::handleSaveChangesDialog, this, _1, _2) ); +		if(!mSaveDialogShown) +		{ +			mSaveDialogShown = TRUE; +			// Bring up view-modal dialog: Save changes? Yes, No, Cancel +			LLNotificationsUtil::add("SaveChanges", LLSD(), LLSD(), +					boost::bind(&LLPreviewGesture::handleSaveChangesDialog, this, _1, _2) ); +		}  		return FALSE;  	}  } @@ -264,6 +268,7 @@ void LLPreviewGesture::onVisibilityChanged ( const LLSD& new_visibility )  bool LLPreviewGesture::handleSaveChangesDialog(const LLSD& notification, const LLSD& response)  { +	mSaveDialogShown = FALSE;  	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);  	switch(option)  	{ diff --git a/indra/newview/llpreviewnotecard.cpp b/indra/newview/llpreviewnotecard.cpp index 510d91839d..850c3b350d 100644 --- a/indra/newview/llpreviewnotecard.cpp +++ b/indra/newview/llpreviewnotecard.cpp @@ -153,9 +153,12 @@ BOOL LLPreviewNotecard::canClose()  	}  	else  	{ -		// Bring up view-modal dialog: Save changes? Yes, No, Cancel -		LLNotificationsUtil::add("SaveChanges", LLSD(), LLSD(), boost::bind(&LLPreviewNotecard::handleSaveChangesDialog,this, _1, _2)); -								   +		if(!mSaveDialogShown) +		{ +			mSaveDialogShown = TRUE; +			// Bring up view-modal dialog: Save changes? Yes, No, Cancel +			LLNotificationsUtil::add("SaveChanges", LLSD(), LLSD(), boost::bind(&LLPreviewNotecard::handleSaveChangesDialog,this, _1, _2)); +		}  		return FALSE;  	}  } @@ -639,6 +642,7 @@ void LLPreviewNotecard::onSaveComplete(const LLUUID& asset_uuid, void* user_data  bool LLPreviewNotecard::handleSaveChangesDialog(const LLSD& notification, const LLSD& response)  { +	mSaveDialogShown = FALSE;  	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);  	switch(option)  	{ diff --git a/indra/newview/llpreviewscript.cpp b/indra/newview/llpreviewscript.cpp index b7fea4e982..6ecc4c7fb9 100644 --- a/indra/newview/llpreviewscript.cpp +++ b/indra/newview/llpreviewscript.cpp @@ -376,7 +376,8 @@ LLScriptEdCore::LLScriptEdCore(  	mLive(live),  	mContainer(container),  	mHasScriptData(FALSE), -	mScriptRemoved(FALSE) +	mScriptRemoved(FALSE), +	mSaveDialogShown(FALSE)  {  	setFollowsAll();  	setBorderVisible(FALSE); @@ -584,6 +585,14 @@ void LLScriptEdCore::setScriptText(const std::string& text, BOOL is_valid)  	}  } +void LLScriptEdCore::makeEditorPristine() +{ +	if (mEditor) +	{ +		mEditor->makePristine(); +	} +} +  bool LLScriptEdCore::loadScriptText(const std::string& filename)  {  	if (filename.empty()) @@ -847,8 +856,12 @@ BOOL LLScriptEdCore::canClose()  	}  	else  	{ -		// Bring up view-modal dialog: Save changes? Yes, No, Cancel -		LLNotificationsUtil::add("SaveChanges", LLSD(), LLSD(), boost::bind(&LLScriptEdCore::handleSaveChangesDialog, this, _1, _2)); +		if(!mSaveDialogShown) +		{ +			mSaveDialogShown = TRUE; +			// Bring up view-modal dialog: Save changes? Yes, No, Cancel +			LLNotificationsUtil::add("SaveChanges", LLSD(), LLSD(), boost::bind(&LLScriptEdCore::handleSaveChangesDialog, this, _1, _2)); +		}  		return FALSE;  	}  } @@ -861,6 +874,7 @@ void LLScriptEdCore::setEnableEditing(bool enable)  bool LLScriptEdCore::handleSaveChangesDialog(const LLSD& notification, const LLSD& response )  { +	mSaveDialogShown = FALSE;  	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);  	switch( option )  	{ @@ -1200,7 +1214,7 @@ void LLScriptEdCore::onBtnLoadFromFile( void* data )  	std::string filename = file_picker.getFirstFile(); -	std::ifstream fin(filename.c_str()); +	llifstream fin(filename.c_str());  	std::string line;  	std::string text; @@ -1238,7 +1252,7 @@ void LLScriptEdCore::onBtnSaveToFile( void* userdata )  		{  			std::string filename = file_picker.getFirstFile();  			std::string scriptText=self->mEditor->getText(); -			std::ofstream fout(filename.c_str()); +			llofstream fout(filename.c_str());  			fout<<(scriptText);  			fout.close();  			self->mSaveCallback( self->mUserdata, FALSE ); @@ -2026,7 +2040,7 @@ void LLLiveLSLEditor::loadScriptText(LLVFS *vfs, const LLUUID &uuid, LLAssetType  	buffer[file_length] = '\0';  	mScriptEd->setScriptText(LLStringExplicit(&buffer[0]), TRUE); -	mScriptEd->mEditor->makePristine(); +	mScriptEd->makeEditorPristine();  	mScriptEd->setScriptName(getItem()->getName());  } diff --git a/indra/newview/llpreviewscript.h b/indra/newview/llpreviewscript.h index 6b31125641..a185d85889 100644 --- a/indra/newview/llpreviewscript.h +++ b/indra/newview/llpreviewscript.h @@ -90,6 +90,7 @@ public:  	bool			canLoadOrSaveToFile( void* userdata );  	void            setScriptText(const std::string& text, BOOL is_valid); +	void			makeEditorPristine();  	bool			loadScriptText(const std::string& filename);  	bool			writeToFile(const std::string& filename);  	void			sync(); @@ -166,6 +167,7 @@ private:  	LLLiveLSLFile*	mLiveFile;  	LLUUID			mAssociatedExperience;  	BOOL			mScriptRemoved; +	BOOL			mSaveDialogShown;  	LLScriptEdContainer* mContainer; // parent view diff --git a/indra/newview/llproductinforequest.cpp b/indra/newview/llproductinforequest.cpp index b663df4aae..4abb673555 100644 --- a/indra/newview/llproductinforequest.cpp +++ b/indra/newview/llproductinforequest.cpp @@ -41,7 +41,7 @@ LLProductInfoRequestManager::LLProductInfoRequestManager():  void LLProductInfoRequestManager::initSingleton()  { -	std::string url = gAgent.getRegion()->getCapability("ProductInfoRequest"); +	std::string url = gAgent.getRegionCapability("ProductInfoRequest");  	if (!url.empty())  	{          LLCoros::instance().launch("LLProductInfoRequestManager::getLandDescriptionsCoro", diff --git a/indra/newview/llscenemonitor.cpp b/indra/newview/llscenemonitor.cpp index 02912f12a9..5ab0013055 100644 --- a/indra/newview/llscenemonitor.cpp +++ b/indra/newview/llscenemonitor.cpp @@ -532,7 +532,7 @@ void LLSceneMonitor::dumpToFile(std::string file_name)  	LL_INFOS("SceneMonitor") << "Saving scene load stats to " << file_name << LL_ENDL;  -	std::ofstream os(file_name.c_str()); +	llofstream os(file_name.c_str());  	os << std::setprecision(10); diff --git a/indra/newview/llsidepanelinventory.cpp b/indra/newview/llsidepanelinventory.cpp index c6a0198afd..e25cac8c17 100644 --- a/indra/newview/llsidepanelinventory.cpp +++ b/indra/newview/llsidepanelinventory.cpp @@ -696,6 +696,19 @@ LLInventoryPanel *LLSidepanelInventory::getActivePanel()  	return NULL;  } +void LLSidepanelInventory::selectAllItemsPanel() +{ +	if (!getVisible()) +	{ +		return; +	} +	if (mInventoryPanel->getVisible()) +	{ +		 mPanelMainInventory->selectAllItemsPanel(); +	} + +} +  BOOL LLSidepanelInventory::isMainInventoryPanelActive() const  {  	return mInventoryPanel->getVisible(); diff --git a/indra/newview/llsidepanelinventory.h b/indra/newview/llsidepanelinventory.h index 5060f7025f..3b8cdb98ab 100644 --- a/indra/newview/llsidepanelinventory.h +++ b/indra/newview/llsidepanelinventory.h @@ -57,6 +57,7 @@ public:  	/*virtual*/ void onOpen(const LLSD& key);  	LLInventoryPanel* getActivePanel(); // Returns an active inventory panel, if any. +	void selectAllItemsPanel();  	LLInventoryPanel* getInboxPanel() const { return mInventoryPanelInbox.get(); }  	LLPanelMainInventory* getMainInventoryPanel() const { return mPanelMainInventory; } diff --git a/indra/newview/llspeakers.cpp b/indra/newview/llspeakers.cpp index 19d1af34f9..abb936c3e5 100644 --- a/indra/newview/llspeakers.cpp +++ b/indra/newview/llspeakers.cpp @@ -818,7 +818,7 @@ void LLIMSpeakerMgr::toggleAllowTextChat(const LLUUID& speaker_id)  	LLPointer<LLSpeaker> speakerp = findSpeaker(speaker_id);  	if (!speakerp) return; -	std::string url = gAgent.getRegion()->getCapability("ChatSessionRequest"); +	std::string url = gAgent.getRegionCapability("ChatSessionRequest");  	LLSD data;  	data["method"] = "mute update";  	data["session-id"] = getSessionID(); @@ -844,7 +844,7 @@ void LLIMSpeakerMgr::moderateVoiceParticipant(const LLUUID& avatar_id, bool unmu  	// do not send voice moderation changes for avatars not in voice channel  	if (!is_in_voice) return; -	std::string url = gAgent.getRegion()->getCapability("ChatSessionRequest"); +	std::string url = gAgent.getRegionCapability("ChatSessionRequest");  	LLSD data;  	data["method"] = "mute update";  	data["session-id"] = getSessionID(); @@ -924,7 +924,7 @@ void LLIMSpeakerMgr::processSessionUpdate(const LLSD& session_update)  void LLIMSpeakerMgr::moderateVoiceSession(const LLUUID& session_id, bool disallow_voice)  { -	std::string url = gAgent.getRegion()->getCapability("ChatSessionRequest"); +	std::string url = gAgent.getRegionCapability("ChatSessionRequest");  	LLSD data;  	data["method"] = "session update";  	data["session-id"] = session_id; diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp index 485b88e4c7..db74689df9 100644 --- a/indra/newview/llstartup.cpp +++ b/indra/newview/llstartup.cpp @@ -345,7 +345,7 @@ bool idle_startup()  	const std::string delims (" ");  	std::string system;  	int begIdx, endIdx; -	std::string osString = LLAppViewer::instance()->getOSInfo().getOSStringSimple(); +	std::string osString = LLOSInfo::instance().getOSStringSimple();  	begIdx = osString.find_first_not_of (delims);  	endIdx = osString.find_first_of (delims, begIdx); @@ -830,7 +830,8 @@ bool idle_startup()  		// Don't do anything.  Wait for the login view to call the login_callback,  		// which will push us to the next state. -		display_startup(); + +		// display() function will be the one to run display_startup()  		// Sleep so we don't spin the CPU  		ms_sleep(1);  		return FALSE; diff --git a/indra/newview/lltexturecache.cpp b/indra/newview/lltexturecache.cpp index a541273621..f0c28041d1 100644 --- a/indra/newview/lltexturecache.cpp +++ b/indra/newview/lltexturecache.cpp @@ -31,6 +31,7 @@  #include "llapr.h"  #include "lldir.h"  #include "llimage.h" +#include "llimagej2c.h" // for version control  #include "lllfsthread.h"  #include "llviewercontrol.h" @@ -938,6 +939,14 @@ BOOL LLTextureCache::isInLocal(const LLUUID& id)  F32 LLTextureCache::sHeaderCacheVersion = 1.7f;  U32 LLTextureCache::sCacheMaxEntries = 1024 * 1024; //~1 million textures.  S64 LLTextureCache::sCacheMaxTexturesSize = 0; // no limit +std::string LLTextureCache::sHeaderCacheEncoderVersion = LLImageJ2C::getEngineInfo(); + +#if defined(ADDRESS_SIZE) +U32 LLTextureCache::sHeaderCacheAddressSize = ADDRESS_SIZE; +#else +U32 LLTextureCache::sHeaderCacheAddressSize = 32; +#endif +  const char* entries_filename = "texture.entries";  const char* cache_filename = "texture.cache";  const char* old_textures_dirname = "textures"; @@ -1080,12 +1089,28 @@ void LLTextureCache::readEntriesHeader()  	}  	else //create an empty entries header.  	{ -		mHeaderEntriesInfo.mVersion = sHeaderCacheVersion ; -		mHeaderEntriesInfo.mEntries = 0 ; +		setEntriesHeader();  		writeEntriesHeader() ;  	}  } +void LLTextureCache::setEntriesHeader() +{ +	if (sHeaderEncoderStringSize < sHeaderCacheEncoderVersion.size() + 1) +	{ +		// For simplicity we use predefined size of header, so if version string +		// doesn't fit, either getEngineInfo() returned malformed string or  +		// sHeaderEncoderStringSize need to be increased. +		// Also take into accout that c_str() returns additional null character +		LL_ERRS() << "Version string doesn't fit in header" << LL_ENDL; +	} + +	mHeaderEntriesInfo.mVersion = sHeaderCacheVersion; +	mHeaderEntriesInfo.mAdressSize = sHeaderCacheAddressSize; +	strcpy(mHeaderEntriesInfo.mEncoderVersion, sHeaderCacheEncoderVersion.c_str()); +	mHeaderEntriesInfo.mEntries = 0; +} +  void LLTextureCache::writeEntriesHeader()  {  	llassert_always(mHeaderAPRFile == NULL); @@ -1439,10 +1464,13 @@ void LLTextureCache::readHeaderCache()  	readEntriesHeader(); -	if (mHeaderEntriesInfo.mVersion != sHeaderCacheVersion) +	if (mHeaderEntriesInfo.mVersion != sHeaderCacheVersion +		|| mHeaderEntriesInfo.mAdressSize != sHeaderCacheAddressSize +		|| strcmp(mHeaderEntriesInfo.mEncoderVersion, sHeaderCacheEncoderVersion.c_str()) != 0)  	{  		if (!mReadOnly)  		{ +			LL_INFOS() << "Texture Cache version mismatch, Purging." << LL_ENDL;  			purgeAllTextures(false);  		}  	} @@ -1587,9 +1615,9 @@ void LLTextureCache::purgeAllTextures(bool purge_directories)  				gDirUtilp->deleteFilesInDir(dirname, mask);  			}  		} +		gDirUtilp->deleteFilesInDir(mTexturesDirName, mask); // headers, fast cache  		if (purge_directories)  		{ -			gDirUtilp->deleteFilesInDir(mTexturesDirName, mask);  			LLFile::rmdir(mTexturesDirName);  		}  	} @@ -1601,8 +1629,7 @@ void LLTextureCache::purgeAllTextures(bool purge_directories)  	mUpdatedEntryMap.clear();  	// Info with 0 entries -	mHeaderEntriesInfo.mVersion = sHeaderCacheVersion; -	mHeaderEntriesInfo.mEntries = 0; +	setEntriesHeader();  	writeEntriesHeader();  	LL_INFOS() << "The entire texture cache is cleared." << LL_ENDL ; @@ -1960,15 +1987,13 @@ bool LLTextureCache::writeToFastCache(S32 id, LLPointer<LLImageRaw> raw, S32 dis  		if(w * h *c > 0) //valid  		{  			//make a duplicate to keep the original raw image untouched. -			raw = raw->duplicate(); +			raw = raw->scaled(w, h);  			if (raw->isBufferInvalid())  			{  				LL_WARNS() << "Invalid image duplicate buffer" << LL_ENDL;  				return false;  			} -			raw->scale(w, h) ; -			  			discardlevel += i ;  		}  	} diff --git a/indra/newview/lltexturecache.h b/indra/newview/lltexturecache.h index 6ff4c44568..95f9afc2bc 100644 --- a/indra/newview/lltexturecache.h +++ b/indra/newview/lltexturecache.h @@ -46,10 +46,13 @@ class LLTextureCache : public LLWorkerThread  private:  	// Entries +	static const U32 sHeaderEncoderStringSize = 32;  	struct EntriesInfo  	{ -		EntriesInfo() : mVersion(0.f), mEntries(0) {} +		EntriesInfo() : mVersion(0.f), mAdressSize(0), mEntries(0) { memset(mEncoderVersion, 0, sHeaderEncoderStringSize); }  		F32 mVersion; +		U32 mAdressSize; +		char mEncoderVersion[sHeaderEncoderStringSize];  		U32 mEntries;  	};  	struct Entry @@ -156,6 +159,7 @@ private:  	LLAPRFile* openHeaderEntriesFile(bool readonly, S32 offset);  	void closeHeaderEntriesFile();  	void readEntriesHeader(); +	void setEntriesHeader();  	void writeEntriesHeader();  	S32 openAndReadEntry(const LLUUID& id, Entry& entry, bool create);  	bool updateEntry(S32& idx, Entry& entry, S32 new_image_size, S32 new_body_size); @@ -224,6 +228,8 @@ private:  	// Statics  	static F32 sHeaderCacheVersion; +	static U32 sHeaderCacheAddressSize; +	static std::string sHeaderCacheEncoderVersion;  	static U32 sCacheMaxEntries;  	static S64 sCacheMaxTexturesSize;  }; diff --git a/indra/newview/lltexturefetch.cpp b/indra/newview/lltexturefetch.cpp index 64ff59f6a6..8447cf893e 100644 --- a/indra/newview/lltexturefetch.cpp +++ b/indra/newview/lltexturefetch.cpp @@ -2559,7 +2559,7 @@ LLTextureFetch::LLTextureFetch(LLTextureCache* cache, LLImageDecodeThread* image  	  mTextureInfoMainThread(false)  {  	mMaxBandwidth = gSavedSettings.getF32("ThrottleBandwidthKBPS"); -	mTextureInfo.setUpLogging(gSavedSettings.getBOOL("LogTextureDownloadsToViewerLog"), gSavedSettings.getBOOL("LogTextureDownloadsToSimulator"), U32Bytes(gSavedSettings.getU32("TextureLoggingThreshold"))); +	mTextureInfo.setLogging(true);  	LLAppCoreHttp & app_core_http(LLAppViewer::instance()->getAppCoreHttp());  	mHttpRequest = new LLCore::HttpRequest; diff --git a/indra/newview/lltextureinfo.cpp b/indra/newview/lltextureinfo.cpp index 473d8ce709..e79bb62a52 100644 --- a/indra/newview/lltextureinfo.cpp +++ b/indra/newview/lltextureinfo.cpp @@ -26,10 +26,19 @@  #include "llviewerprecompiledheaders.h" +#include "llagent.h" +#include "llmeshrepository.h" +#include "llsdutil.h"  #include "lltextureinfo.h" +#include "lltexturecache.h" +#include "lltexturefetch.h"  #include "lltexturestats.h" -#include "llviewercontrol.h"  #include "lltrace.h" +#include "llviewercontrol.h" +#include "llviewerregion.h" +#include "llviewerstats.h" +#include "llvocache.h" +#include "llworld.h"  static LLTrace::CountStatHandle<S32> sTextureDownloadsStarted("texture_downloads_started", "number of texture downloads initiated");  static LLTrace::CountStatHandle<S32> sTextureDownloadsCompleted("texture_downloads_completed", "number of texture downloads completed"); @@ -37,10 +46,8 @@ static LLTrace::CountStatHandle<S32Bytes > sTextureDataDownloaded("texture_data_  static LLTrace::CountStatHandle<U32Milliseconds > sTexureDownloadTime("texture_download_time", "amount of time spent fetching textures");  LLTextureInfo::LLTextureInfo(bool postponeStartRecoreder) : -	mLogTextureDownloadsToViewerLog(false), -	mLogTextureDownloadsToSimulator(false), -	mTextureDownloadProtocol("NONE"), -	mTextureLogThreshold(LLUnits::Kilobytes::fromValue(100)) +	mLoggingEnabled(false), +	mTextureDownloadProtocol("NONE")  {  	if (!postponeStartRecoreder)  	{ @@ -48,11 +55,9 @@ LLTextureInfo::LLTextureInfo(bool postponeStartRecoreder) :  	}  } -void LLTextureInfo::setUpLogging(bool writeToViewerLog, bool sendToSim, U32Bytes textureLogThreshold) +void LLTextureInfo::setLogging(bool log_info)  { -	mLogTextureDownloadsToViewerLog = writeToViewerLog; -	mLogTextureDownloadsToSimulator = sendToSim; -	mTextureLogThreshold = U32Bytes(textureLogThreshold); +	mLoggingEnabled = log_info;  }  LLTextureInfo::~LLTextureInfo() @@ -147,36 +152,80 @@ void LLTextureInfo::setRequestCompleteTimeAndLog(const LLUUID& id, U64Microsecon  		break;  	} -	if (mLogTextureDownloadsToViewerLog) +	if (mLoggingEnabled)  	{ -		LL_INFOS() << "texture="   << id  -			    << " start="    << details.mStartTime  -			    << " end="      << details.mCompleteTime -			    << " size="     << details.mSize -			    << " offset="   << details.mOffset -			    << " length="   << U32Milliseconds(details.mCompleteTime - details.mStartTime) -			    << " protocol=" << protocol -			    << LL_ENDL; -	} +		static LLCachedControl<bool> log_to_viewer_log(gSavedSettings, "LogTextureDownloadsToViewerLog", false); +		static LLCachedControl<bool> log_to_simulator(gSavedSettings, "LogTextureDownloadsToSimulator", false); +		static LLCachedControl<U32> texture_log_threshold(gSavedSettings, "TextureLoggingThreshold", 1); -	if(mLogTextureDownloadsToSimulator) -	{ -		add(sTextureDataDownloaded, details.mSize); -		add(sTexureDownloadTime, details.mCompleteTime - details.mStartTime); -		add(sTextureDownloadsCompleted, 1); -		mTextureDownloadProtocol = protocol; -		if (mRecording.getSum(sTextureDataDownloaded) >= mTextureLogThreshold) +		if (log_to_viewer_log) +		{ +			LL_INFOS() << "texture="   << id  +				    << " start="    << details.mStartTime  +				    << " end="      << details.mCompleteTime +				    << " size="     << details.mSize +				    << " offset="   << details.mOffset +				    << " length="   << U32Milliseconds(details.mCompleteTime - details.mStartTime) +				    << " protocol=" << protocol +				    << LL_ENDL; +		} + +		if(log_to_simulator)  		{ -			LLSD texture_data; -			std::stringstream startTime; -			startTime << mCurrentStatsBundleStartTime; -			texture_data["start_time"] = startTime.str(); -			std::stringstream endTime; -			endTime << completeTime; -			texture_data["end_time"] = endTime.str(); -			texture_data["averages"] = getAverages(); -			send_texture_stats_to_sim(texture_data); -			resetTextureStatistics(); +			add(sTextureDataDownloaded, details.mSize); +			add(sTexureDownloadTime, details.mCompleteTime - details.mStartTime); +			add(sTextureDownloadsCompleted, 1); +			mTextureDownloadProtocol = protocol; +			if (mRecording.getSum(sTextureDataDownloaded) >= U32Bytes(texture_log_threshold)) +			{ +				LLSD texture_data; +				std::stringstream startTime; +				startTime << mCurrentStatsBundleStartTime; +				texture_data["start_time"] = startTime.str(); +				std::stringstream endTime; +				endTime << completeTime; +				texture_data["end_time"] = endTime.str(); +				texture_data["averages"] = getAverages(); + +				// Texture cache +				LLSD texture_cache; +				U32 cache_read = 0, cache_write = 0, res_wait = 0; +				F64 cache_hit_rate = 0; +				LLAppViewer::getTextureFetch()->getStateStats(&cache_read, &cache_write, &res_wait); +				if (cache_read > 0 || cache_write > 0) +				{ +					cache_hit_rate = cache_read / (cache_read + cache_write); +				} +				texture_cache["cache_read"] = LLSD::Integer(cache_read); +				texture_cache["cache_write"] = LLSD::Integer(cache_write); +				texture_cache["hit_rate"] = LLSD::Real(cache_hit_rate); +				texture_cache["entries"] = LLSD::Integer(LLAppViewer::getTextureCache()->getEntries()); +				texture_cache["space_max"] = ll_sd_from_U64((U64)LLAppViewer::getTextureCache()->getMaxUsage().value()); // bytes +				texture_cache["space_used"] = ll_sd_from_U64((U64)LLAppViewer::getTextureCache()->getUsage().value()); // bytes +				texture_data["texture_cache"] = texture_cache; + +				// VO and mesh cache +				LLSD object_cache; +				object_cache["vo_entries_max"] = LLSD::Integer(LLVOCache::getInstance()->getCacheEntriesMax()); +				object_cache["vo_entries_curent"] = LLSD::Integer(LLVOCache::getInstance()->getCacheEntries()); +				object_cache["vo_active_entries"] = LLSD::Integer(LLWorld::getInstance()->getNumOfActiveCachedObjects()); +				U64 region_hit_count = gAgent.getRegion() != NULL ? gAgent.getRegion()->getRegionCacheHitCount() : 0; +				U64 region_miss_count = gAgent.getRegion() != NULL ? gAgent.getRegion()->getRegionCacheMissCount() : 0; +				F64 region_vocache_hit_rate = 0; +				if (region_hit_count > 0 || region_miss_count > 0) +				{ +					region_vocache_hit_rate = region_hit_count / (region_hit_count + region_miss_count); +				} +				object_cache["vo_region_hitcount"] = ll_sd_from_U64(region_hit_count); +				object_cache["vo_region_misscount"] = ll_sd_from_U64(region_miss_count); +				object_cache["vo_region_hitrate"] = LLSD::Real(region_vocache_hit_rate); +				object_cache["mesh_reads"] = LLSD::Integer(LLMeshRepository::sCacheReads); +				object_cache["mesh_writes"] = LLSD::Integer(LLMeshRepository::sCacheWrites); +				texture_data["object_cache"] = object_cache; + +				send_texture_stats_to_sim(texture_data); +				resetTextureStatistics(); +			}  		}  	} diff --git a/indra/newview/lltextureinfo.h b/indra/newview/lltextureinfo.h index 03721bdd73..46378eb7f8 100644 --- a/indra/newview/lltextureinfo.h +++ b/indra/newview/lltextureinfo.h @@ -38,7 +38,7 @@ public:  	LLTextureInfo(bool postponeStartRecoreder = true);  	~LLTextureInfo(); -	void setUpLogging(bool writeToViewerLog, bool sendToSim, U32Bytes textureLogThreshold); +	void setLogging(bool log_info);  	bool has(const LLUUID& id);  	void setRequestStartTime(const LLUUID& id, U64 startTime);  	void setRequestSize(const LLUUID& id, U32 size); @@ -61,12 +61,11 @@ private:  	std::map<LLUUID, LLTextureInfoDetails *>	mTextures;  	LLSD										mAverages; -	bool										mLogTextureDownloadsToViewerLog, -												mLogTextureDownloadsToSimulator; +	bool										mLoggingEnabled;  	std::string									mTextureDownloadProtocol; -	U32Bytes					mTextureLogThreshold;   	U64Microseconds			mCurrentStatsBundleStartTime;  	LLTrace::Recording							mRecording; +  };  #endif // LL_LLTEXTUREINFO_H diff --git a/indra/newview/lltexturestats.cpp b/indra/newview/lltexturestats.cpp index 8ded148e17..b55b4d9ca4 100644 --- a/indra/newview/lltexturestats.cpp +++ b/indra/newview/lltexturestats.cpp @@ -30,6 +30,7 @@  #include "llagent.h"  #include "lltexturefetch.h"   #include "lltexturestats.h" +#include "llversioninfo.h"  #include "llviewerregion.h"  #include "llcorehttputil.h" @@ -45,6 +46,8 @@ void send_texture_stats_to_sim(const LLSD &texture_stats)  	LLUUID agent_id = gAgent.getID();  	texture_stats_report["agent_id"] = agent_id;  	texture_stats_report["region_id"] = gAgent.getRegion()->getRegionID(); +	texture_stats_report["viewer_channel"] = LLVersionInfo::getChannel(); +	texture_stats_report["viewer_version"] = LLVersionInfo::getVersion();  	texture_stats_report["stats_data"] = texture_stats;  	std::string texture_cap_url = gAgent.getRegion()->getCapability("TextureStats"); diff --git a/indra/newview/lltoolpie.cpp b/indra/newview/lltoolpie.cpp index fc052ae3aa..f473000657 100644 --- a/indra/newview/lltoolpie.cpp +++ b/indra/newview/lltoolpie.cpp @@ -485,7 +485,8 @@ void LLToolPie::walkToClickedLocation()  	mAutoPilotDestination->setColor(LLColor4U(170, 210, 190));  	mAutoPilotDestination->setDuration(3.f); -	handle_go_to(); +	LLVector3d pos = LLToolPie::getInstance()->getPick().mPosGlobal; +	gAgent.startAutoPilotGlobal(pos, std::string(), NULL, NULL, NULL, 0.f, 0.03f, FALSE);  }  // When we get object properties after left-clicking on an object diff --git a/indra/newview/llviewerinventory.cpp b/indra/newview/llviewerinventory.cpp index da6b18bb77..6c9fe5e39b 100644 --- a/indra/newview/llviewerinventory.cpp +++ b/indra/newview/llviewerinventory.cpp @@ -1511,67 +1511,64 @@ void purge_descendents_of(const LLUUID& id, LLPointer<LLInventoryCallback> cb)  	LLPointer<LLViewerInventoryCategory> cat = gInventory.getCategory(id);  	if (cat.notNull())  	{ -		if (LLClipboard::instance().hasContents() && LLClipboard::instance().isCutMode()) +		if (LLClipboard::instance().hasContents())  		{ -			// Something on the clipboard is in "cut mode" and needs to be preserved -			LL_DEBUGS(LOG_INV) << "purge_descendents_of clipboard case " << cat->getName() -							   << " iterate and purge non hidden items" << LL_ENDL; -			LLInventoryModel::cat_array_t* categories; -			LLInventoryModel::item_array_t* items; -			// Get the list of direct descendants in tha categoy passed as argument -			gInventory.getDirectDescendentsOf(id, categories, items); -			std::vector<LLUUID> list_uuids; -			// Make a unique list with all the UUIDs of the direct descendants (items and categories are not treated differently) -			// Note: we need to do that shallow copy as purging things will invalidate the categories or items lists -			for (LLInventoryModel::cat_array_t::const_iterator it = categories->begin(); it != categories->end(); ++it) -			{ -				list_uuids.push_back((*it)->getUUID()); -			} -			for (LLInventoryModel::item_array_t::const_iterator it = items->begin(); it != items->end(); ++it) +			// Remove items from clipboard or it will remain active even if there is nothing to paste/copy +			LLInventoryModel::cat_array_t categories; +			LLInventoryModel::item_array_t items; +			gInventory.collectDescendents(id, categories, items, TRUE); + +			for (LLInventoryModel::cat_array_t::const_iterator it = categories.begin(); it != categories.end(); ++it)  			{ -				list_uuids.push_back((*it)->getUUID()); +				if (LLClipboard::instance().isOnClipboard((*it)->getUUID())) +				{ +					// No sense in removing single items, partial 'paste' will result in confusion only +					LLClipboard::instance().reset(); +					break; +				}  			} -			// Iterate through the list and only purge the UUIDs that are not on the clipboard -			for (std::vector<LLUUID>::const_iterator it = list_uuids.begin(); it != list_uuids.end(); ++it) +			if (LLClipboard::instance().hasContents())  			{ -				if (!LLClipboard::instance().isOnClipboard(*it)) +				for (LLInventoryModel::item_array_t::const_iterator it = items.begin(); it != items.end(); ++it)  				{ -					remove_inventory_object(*it, NULL); +					if (LLClipboard::instance().isOnClipboard((*it)->getUUID())) +					{ +						LLClipboard::instance().reset(); +						break; +					}  				}  			}  		} -		else + +		if (AISAPI::isAvailable())  		{ -            if (AISAPI::isAvailable()) +			if (cat->getVersion() == LLViewerInventoryCategory::VERSION_UNKNOWN)  			{ -				if (cat->getVersion() == LLViewerInventoryCategory::VERSION_UNKNOWN) -				{ -					LL_WARNS() << "Purging not fetched folder: " << cat->getName() << LL_ENDL; -				} -                AISAPI::completion_t cr = (cb) ? boost::bind(&doInventoryCb, cb, _1) : AISAPI::completion_t(); -                AISAPI::PurgeDescendents(id, cr); +				LL_WARNS() << "Purging not fetched folder: " << cat->getName() << LL_ENDL;  			} -			else // no cap +			AISAPI::completion_t cr = (cb) ? boost::bind(&doInventoryCb, cb, _1) : AISAPI::completion_t(); +			AISAPI::PurgeDescendents(id, cr); +		} +		else // no cap +		{ +			// Fast purge +			LL_DEBUGS(LOG_INV) << "purge_descendents_of fast case " << cat->getName() << LL_ENDL; + +			// send it upstream +			LLMessageSystem* msg = gMessageSystem; +			msg->newMessage("PurgeInventoryDescendents"); +			msg->nextBlock("AgentData"); +			msg->addUUID("AgentID", gAgent.getID()); +			msg->addUUID("SessionID", gAgent.getSessionID()); +			msg->nextBlock("InventoryData"); +			msg->addUUID("FolderID", id); +			gAgent.sendReliableMessage(); + +			// Update model immediately because there is no callback mechanism. +			gInventory.onDescendentsPurgedFromServer(id); +			if (cb)  			{ -				// Fast purge -				LL_DEBUGS(LOG_INV) << "purge_descendents_of fast case " << cat->getName() << LL_ENDL; - -				// send it upstream -				LLMessageSystem* msg = gMessageSystem; -				msg->newMessage("PurgeInventoryDescendents"); -				msg->nextBlock("AgentData"); -				msg->addUUID("AgentID", gAgent.getID()); -				msg->addUUID("SessionID", gAgent.getSessionID()); -				msg->nextBlock("InventoryData"); -				msg->addUUID("FolderID", id); -				gAgent.sendReliableMessage(); - -				// Update model immediately because there is no callback mechanism. -				gInventory.onDescendentsPurgedFromServer(id); -				if (cb) -				{ -					cb->fire(id); -				} +				cb->fire(id);  			}  		}  	} diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index f346f48ef5..5bbf5650ad 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -618,6 +618,7 @@ class LLAdvancedDumpInfoToConsole : public view_listener_t  {  	bool handleEvent(const LLSD& userdata)  	{ +		gDebugView->mDebugConsolep->setVisible(TRUE);  		std::string info_type = userdata.asString();  		if ("region" == info_type)  		{ @@ -8000,7 +8001,7 @@ void handle_report_bug(const LLSD& param)  	LLUIString url(param.asString());  	LLStringUtil::format_map_t replace; -	replace["[ENVIRONMENT]"] = LLURI::escape(LLAppViewer::instance()->getViewerInfoString()); +	replace["[ENVIRONMENT]"] = LLURI::escape(LLAppViewer::instance()->getShortViewerInfoString());  	LLSLURL location_url;  	LLAgentUI::buildSLURL(location_url);  	replace["[LOCATION]"] = LLURI::escape(location_url.getSLURLString()); diff --git a/indra/newview/llviewermenufile.cpp b/indra/newview/llviewermenufile.cpp index 8d0c5af314..90355b7166 100644 --- a/indra/newview/llviewermenufile.cpp +++ b/indra/newview/llviewermenufile.cpp @@ -799,7 +799,7 @@ void upload_new_resource(  //     uploadInfo->setTransactionId(tid); -	std::string url = gAgent.getRegion()->getCapability("NewFileAgentInventory"); +	std::string url = gAgent.getRegionCapability("NewFileAgentInventory");  	if ( !url.empty() )  	{ diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index 083d2991f8..e7917c043f 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -3569,7 +3569,7 @@ void process_chat_from_simulator(LLMessageSystem *msg, void **user_data)  		LLAvatarName av_name;  		if (LLAvatarNameCache::get(from_id, &av_name))  		{ -			chat.mFromName = av_name.getDisplayName(); +			chat.mFromName = av_name.getCompleteName();  		}  		else  		{ @@ -6851,14 +6851,10 @@ void process_teleport_failed(LLMessageSystem *msg, void**)  		// Get the message ID  		msg->getStringFast(_PREHASH_AlertInfo, _PREHASH_Message, message_id);  		big_reason = LLAgent::sTeleportErrorMessages[message_id]; -		if ( big_reason.size() > 0 ) -		{	// Substitute verbose reason from the local map -			args["REASON"] = big_reason; -		} -		else -		{	// Nothing found in the map - use what the server returned in the original message block +		if ( big_reason.size() <= 0 ) +		{ +			// Nothing found in the map - use what the server returned in the original message block  			msg->getStringFast(_PREHASH_Info, _PREHASH_Reason, big_reason); -			args["REASON"] = big_reason;  		}  		LLSD llsd_block; @@ -6873,6 +6869,16 @@ void process_teleport_failed(LLMessageSystem *msg, void**)  			}  			else  			{ +				if(llsd_block.has("REGION_NAME")) +				{ +					std::string region_name = llsd_block["REGION_NAME"].asString(); +					if(!region_name.empty()) +					{ +						LLStringUtil::format_map_t name_args; +						name_args["[REGION_NAME]"] = region_name; +						LLStringUtil::format(big_reason, name_args); +					} +				}  				// change notification name in this special case  				if (handle_teleport_access_blocked(llsd_block, message_id, args["REASON"]))  				{ @@ -6884,7 +6890,7 @@ void process_teleport_failed(LLMessageSystem *msg, void**)  				}  			}  		} - +		args["REASON"] = big_reason;  	}  	else  	{	// Extra message payload not found - use what the simulator sent diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp index 9299e60b1c..f15c6d26ec 100644 --- a/indra/newview/llviewerobject.cpp +++ b/indra/newview/llviewerobject.cpp @@ -6216,7 +6216,7 @@ void LLViewerObject::resetChildrenRotationAndPosition(const std::vector<LLQuater  }  //counter-translation -void LLViewerObject::resetChildrenPosition(const LLVector3& offset, BOOL simplified) +void LLViewerObject::resetChildrenPosition(const LLVector3& offset, BOOL simplified, BOOL skip_avatar_child)  {  	if(mChildList.empty())  	{ @@ -6246,6 +6246,7 @@ void LLViewerObject::resetChildrenPosition(const LLVector3& offset, BOOL simplif  			iter != mChildList.end(); iter++)  	{  		LLViewerObject* childp = *iter; +  		if (!childp->isSelected() && childp->mDrawable.notNull())  		{  			if (childp->getPCode() != LL_PCODE_LEGACY_AVATAR) @@ -6255,14 +6256,16 @@ void LLViewerObject::resetChildrenPosition(const LLVector3& offset, BOOL simplif  			}  			else //avatar  			{ -				LLVector3 reset_pos = ((LLVOAvatar*)childp)->mDrawable->mXform.getPosition() + child_offset ; +				if(!skip_avatar_child) +				{ +					LLVector3 reset_pos = ((LLVOAvatar*)childp)->mDrawable->mXform.getPosition() + child_offset ; -				((LLVOAvatar*)childp)->mDrawable->mXform.setPosition(reset_pos); -				((LLVOAvatar*)childp)->mDrawable->getVObj()->setPosition(reset_pos);				 -				 -				LLManip::rebuild(childp); -			}			 -		}		 +					((LLVOAvatar*)childp)->mDrawable->mXform.setPosition(reset_pos); +					((LLVOAvatar*)childp)->mDrawable->getVObj()->setPosition(reset_pos); +					LLManip::rebuild(childp); +				} +			} +		}  	}  	return ; diff --git a/indra/newview/llviewerobject.h b/indra/newview/llviewerobject.h index 24fcf0517e..7a490f6957 100644 --- a/indra/newview/llviewerobject.h +++ b/indra/newview/llviewerobject.h @@ -575,7 +575,7 @@ public:  public:  	//counter-translation -	void resetChildrenPosition(const LLVector3& offset, BOOL simplified = FALSE) ; +	void resetChildrenPosition(const LLVector3& offset, BOOL simplified = FALSE,  BOOL skip_avatar_child = FALSE) ;  	//counter-rotation  	void resetChildrenRotationAndPosition(const std::vector<LLQuaternion>& rotations,   											const std::vector<LLVector3>& positions) ; diff --git a/indra/newview/llviewerobjectlist.cpp b/indra/newview/llviewerobjectlist.cpp index 8f98d66c0c..3c83e3a006 100644 --- a/indra/newview/llviewerobjectlist.cpp +++ b/indra/newview/llviewerobjectlist.cpp @@ -1247,9 +1247,11 @@ void LLViewerObjectList::clearDebugText()  void LLViewerObjectList::cleanupReferences(LLViewerObject *objectp)  { +	bool new_dead_object = true;  	if (mDeadObjects.find(objectp->mID) != mDeadObjects.end())  	{  		LL_INFOS() << "Object " << objectp->mID << " already on dead list!" << LL_ENDL;	 +		new_dead_object = false;  	}  	else  	{ @@ -1286,7 +1288,10 @@ void LLViewerObjectList::cleanupReferences(LLViewerObject *objectp)  	// Also, not cleaned up  	removeDrawable(objectp->mDrawable); -	mNumDeadObjects++; +	if(new_dead_object) +	{ +		mNumDeadObjects++; +	}  }  static LLTrace::BlockTimerStatHandle FTM_REMOVE_DRAWABLE("Remove Drawable"); diff --git a/indra/newview/llviewerparcelmedia.cpp b/indra/newview/llviewerparcelmedia.cpp index 0ab3d2b4e7..d31fc0d606 100644 --- a/indra/newview/llviewerparcelmedia.cpp +++ b/indra/newview/llviewerparcelmedia.cpp @@ -461,7 +461,7 @@ void LLViewerParcelMedia::processParcelMediaUpdate( LLMessageSystem *msg, void *  // *TODO: I can not find any active code where this method is called...  void LLViewerParcelMedia::sendMediaNavigateMessage(const std::string& url)  { -	std::string region_url = gAgent.getRegion()->getCapability("ParcelNavigateMedia"); +	std::string region_url = gAgent.getRegionCapability("ParcelNavigateMedia");  	if (!region_url.empty())  	{  		// send navigate event to sim for link sharing diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp index d9d382f1c5..06b5c48e6c 100644 --- a/indra/newview/llviewerregion.cpp +++ b/indra/newview/llviewerregion.cpp @@ -532,7 +532,9 @@ LLViewerRegion::LLViewerRegion(const U64 &handle,  	mDead(FALSE),  	mLastVisitedEntry(NULL),  	mInvisibilityCheckHistory(-1), -	mPaused(FALSE) +	mPaused(FALSE), +	mRegionCacheHitCount(0), +	mRegionCacheMissCount(0)  {  	mWidth = region_width_meters;  	mImpl->mOriginGlobal = from_region_handle(handle);  @@ -2440,6 +2442,7 @@ LLVOCacheEntry* LLViewerRegion::getCacheEntry(U32 local_id, bool valid)  void LLViewerRegion::addCacheMiss(U32 id, LLViewerRegion::eCacheMissType miss_type)  { +	mRegionCacheMissCount++;  #if 0  	mCacheMissList.insert(CacheMissItem(id, miss_type));  #else @@ -2491,6 +2494,7 @@ bool LLViewerRegion::probeCache(U32 local_id, U32 crc, U32 flags, U8 &cache_miss  		if (entry->getCRC() == crc)  		{  			// Record a hit +			mRegionCacheHitCount++;  			entry->recordHit();  		cache_miss_type = CACHE_MISS_TYPE_NONE;  			entry->setUpdateFlags(flags); diff --git a/indra/newview/llviewerregion.h b/indra/newview/llviewerregion.h index 61ce5b454d..69fb9c4d4e 100644 --- a/indra/newview/llviewerregion.h +++ b/indra/newview/llviewerregion.h @@ -338,6 +338,8 @@ public:  	LLVOCacheEntry* getCacheEntryForOctree(U32 local_id);  	LLVOCacheEntry* getCacheEntry(U32 local_id, bool valid = true);  	bool probeCache(U32 local_id, U32 crc, U32 flags, U8 &cache_miss_type); +	U64 getRegionCacheHitCount() { return mRegionCacheHitCount; } +	U64 getRegionCacheMissCount() { return mRegionCacheMissCount; }  	void requestCacheMisses();  	void addCacheMissFull(const U32 local_id);  	//update object cache if the object receives a full-update or terse update @@ -534,7 +536,9 @@ private:  		typedef std::list<CacheMissItem> cache_miss_list_t;  	};  	CacheMissItem::cache_miss_list_t   mCacheMissList; -	 +	U64 mRegionCacheHitCount; +	U64 mRegionCacheMissCount; +  	caps_received_signal_t mCapabilitiesReceivedSignal;		  	caps_received_signal_t mSimulatorFeaturesReceivedSignal;		 diff --git a/indra/newview/llviewerstats.cpp b/indra/newview/llviewerstats.cpp index 8ff735a8c1..256e69d029 100644 --- a/indra/newview/llviewerstats.cpp +++ b/indra/newview/llviewerstats.cpp @@ -490,7 +490,7 @@ void send_stats()  	LLSD &system = body["system"];  	system["ram"] = (S32) gSysMemory.getPhysicalMemoryKB().value(); -	system["os"] = LLAppViewer::instance()->getOSInfo().getOSStringSimple(); +	system["os"] = LLOSInfo::instance().getOSStringSimple();  	system["cpu"] = gSysCPU.getCPUString();  	system["address_size"] = ADDRESS_SIZE;  	unsigned char MACAddress[MAC_ADDRESS_BYTES]; @@ -587,9 +587,6 @@ void send_stats()  	misc["string_1"] = llformat("%d", window_size);  	misc["string_2"] = llformat("Texture Time: %.2f, Total Time: %.2f", gTextureTimer.getElapsedTimeF32(), gFrameTimeSeconds.value()); -// 	misc["int_1"] = LLSD::Integer(gSavedSettings.getU32("RenderQualityPerformance")); // Steve: 1.21 -// 	misc["int_2"] = LLSD::Integer(gFrameStalls); // Steve: 1.21 -  	F32 unbaked_time = LLVOAvatar::sUnbakedTime * 1000.f / gFrameTimeSeconds;  	misc["int_1"] = LLSD::Integer(unbaked_time); // Steve: 1.22  	F32 grey_time = LLVOAvatar::sGreyTime * 1000.f / gFrameTimeSeconds; diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp index cd8dd54fa6..e5a1bed48c 100644 --- a/indra/newview/llviewertexture.cpp +++ b/indra/newview/llviewertexture.cpp @@ -1396,8 +1396,7 @@ void LLViewerFetchedTexture::addToCreateTexture()  						{  							//make a duplicate in case somebody else is using this raw image -							mRawImage = mRawImage->duplicate();  -							mRawImage->scale(w >> i, h >> i) ;					 +							mRawImage = mRawImage->scaled(w >> i, h >> i);  						}  					}  				} @@ -2913,8 +2912,7 @@ void LLViewerFetchedTexture::setCachedRawImage()  			{  				//make a duplicate in case somebody else is using this raw image -				mRawImage = mRawImage->duplicate();  -				mRawImage->scale(w >> i, h >> i) ; +				mRawImage = mRawImage->scaled(w >> i, h >> i);  			}  		}  		mCachedRawImage = mRawImage; @@ -3966,7 +3964,7 @@ void LLTexturePipelineTester::updateStablizingTime()  }  //virtual  -void LLTexturePipelineTester::compareTestSessions(std::ofstream* os)  +void LLTexturePipelineTester::compareTestSessions(llofstream* os)   {	  	LLTexturePipelineTester::LLTextureTestSession* base_sessionp = dynamic_cast<LLTexturePipelineTester::LLTextureTestSession*>(mBaseSessionp);  	LLTexturePipelineTester::LLTextureTestSession* current_sessionp = dynamic_cast<LLTexturePipelineTester::LLTextureTestSession*>(mCurrentSessionp); diff --git a/indra/newview/llviewertexture.h b/indra/newview/llviewertexture.h index 8017d82604..c9dea17f63 100644 --- a/indra/newview/llviewertexture.h +++ b/indra/newview/llviewertexture.h @@ -779,7 +779,7 @@ private:  	};  	/*virtual*/ LLMetricPerformanceTesterWithSession::LLTestSession* loadTestSession(LLSD* log) ; -	/*virtual*/ void compareTestSessions(std::ofstream* os) ; +	/*virtual*/ void compareTestSessions(llofstream* os) ;  };  #endif diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index a96cede739..6b201ffe37 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -4403,6 +4403,11 @@ BOOL LLViewerWindow::saveImageNumbered(LLImageFormatted *image, BOOL force_picke  		LLViewerWindow::sSnapshotDir = gDirUtilp->getDirName(filepath);  	} +	if(LLViewerWindow::sSnapshotDir.empty()) +	{ +		return FALSE; +	} +  // Check if there is enough free space to save snapshot  #ifdef LL_WINDOWS  	boost::filesystem::space_info b_space = boost::filesystem::space(utf8str_to_utf16str(sSnapshotDir)); diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index 80c6805ead..efcdb07176 100644 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -3417,10 +3417,62 @@ void LLVOAvatar::updateDebugText()  				std::string output;  				if (motionp->getName().empty())  				{ +					std::string name; +					if (gAgent.isGodlikeWithoutAdminMenuFakery() || isSelf()) +					{ +						name = motionp->getID().asString(); +						LLVOAvatar::AnimSourceIterator anim_it = mAnimationSources.begin(); +						for (; anim_it != mAnimationSources.end(); ++anim_it) +						{ +							if (anim_it->second == motionp->getID()) +							{ +								LLViewerObject* object = gObjectList.findObject(anim_it->first); +								if (!object) +								{ +									break; +								} +								if (object->isAvatar()) +								{ +									if (mMotionController.mIsSelf) +									{ +										// Searching inventory by asset id is really long +										// so just mark as inventory +										// Also item is likely to be named by LLPreviewAnim +										name += "(inventory)"; +									} +								} +								else +								{ +									LLViewerInventoryItem* item = NULL; +									if (!object->isInventoryDirty()) +									{ +										item = object->getInventoryItemByAsset(motionp->getID()); +									} +									if (item) +									{ +										name = item->getName(); +									} +									else if (object->isAttachment()) +									{ +										name += "(" + getAttachmentItemName() + ")"; +									} +									else +									{ +										// in-world object, name or content unknown +										name += "(in-world)"; +									} +								} +								break; +							} +						} +					} +					else +					{ +						name = LLUUID::null.asString(); +					} +  					output = llformat("%s - %d", -							  gAgent.isGodlikeWithoutAdminMenuFakery() ? -							  motionp->getID().asString().c_str() : -							  LLUUID::null.asString().c_str(), +							  name.c_str(),  							  (U32)motionp->getPriority());  				}  				else @@ -5230,10 +5282,6 @@ LLUUID LLVOAvatar::remapMotionID(const LLUUID& id)  			if (use_new_walk_run)  				result = ANIM_AGENT_FEMALE_RUN_NEW;  		} -		else if (id == ANIM_AGENT_SIT) -		{ -			result = ANIM_AGENT_SIT_FEMALE; -		}  	}  	else  	{ @@ -8378,7 +8426,7 @@ void dump_sequential_xml(const std::string outprefix, const LLSD& content)  {  	std::string outfilename = get_sequential_numbered_file_name(outprefix,".xml");  	std::string fullpath = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,outfilename); -	std::ofstream ofs(fullpath.c_str(), std::ios_base::out); +	llofstream ofs(fullpath.c_str(), std::ios_base::out);  	ofs << LLSDOStreamer<LLSDXMLFormatter>(content, LLSDFormatter::OPTIONS_PRETTY);  	LL_DEBUGS("Avatar") << "results saved to: " << fullpath << LL_ENDL;  } diff --git a/indra/newview/llvoavatarself.cpp b/indra/newview/llvoavatarself.cpp index d62862dfb8..10af524ee7 100644 --- a/indra/newview/llvoavatarself.cpp +++ b/indra/newview/llvoavatarself.cpp @@ -2744,7 +2744,7 @@ bool LLVOAvatarSelf::sendAppearanceMessage(LLMessageSystem *mesgsys) const  //------------------------------------------------------------------------  void LLVOAvatarSelf::sendHoverHeight() const  { -	std::string url = gAgent.getRegion()->getCapability("AgentPreferences"); +	std::string url = gAgent.getRegionCapability("AgentPreferences");  	if (!url.empty())  	{ diff --git a/indra/newview/llvocache.cpp b/indra/newview/llvocache.cpp index fd1d57a9d0..fb28d9bdb5 100644 --- a/indra/newview/llvocache.cpp +++ b/indra/newview/llvocache.cpp @@ -1093,11 +1093,21 @@ void LLVOCache::initCache(ELLPath location, U32 size, U32 cache_version)  	}  	mCacheSize = llclamp(size, MIN_ENTRIES_TO_PURGE, MAX_NUM_OBJECT_ENTRIES);  	mMetaInfo.mVersion = cache_version; + +#if defined(ADDRESS_SIZE) +	U32 expected_address = ADDRESS_SIZE; +#else +	U32 expected_address = 32; +#endif +	mMetaInfo.mAddressSize = expected_address; +  	readCacheHeader();	 -	if(mMetaInfo.mVersion != cache_version)  +	if( mMetaInfo.mVersion != cache_version +		|| mMetaInfo.mAddressSize != expected_address)   	{  		mMetaInfo.mVersion = cache_version ; +		mMetaInfo.mAddressSize = expected_address;  		if(mReadOnly) //disable cache  		{  			clearCacheInMemory(); diff --git a/indra/newview/llvocache.h b/indra/newview/llvocache.h index 7aabde1b2d..7d450c5231 100644 --- a/indra/newview/llvocache.h +++ b/indra/newview/llvocache.h @@ -237,9 +237,10 @@ private:  	struct HeaderMetaInfo  	{ -		HeaderMetaInfo() : mVersion(0){} +		HeaderMetaInfo() : mVersion(0), mAddressSize(0) {}  		U32 mVersion; +		U32 mAddressSize;  	};  	struct header_entry_less @@ -267,6 +268,9 @@ public:  	void setReadOnly(bool read_only) {mReadOnly = read_only;}  +	U32 getCacheEntries() { return mNumEntries; } +	U32 getCacheEntriesMax() { return mCacheSize; } +  private:  	void setDirNames(ELLPath location);	  	// determine the cache filename for the region from the region handle	 diff --git a/indra/newview/llvoicevivox.cpp b/indra/newview/llvoicevivox.cpp index 189ed54993..25df528d89 100644 --- a/indra/newview/llvoicevivox.cpp +++ b/indra/newview/llvoicevivox.cpp @@ -153,6 +153,7 @@ static bool sMuteListListener_listening = false;  ///////////////////////////////////////////////////////////////////////////////////////////////  static LLProcessPtr sGatewayPtr; +static LLEventStream sGatewayPump("VivoxDaemonPump", true);  static bool isGatewayRunning()  { @@ -163,6 +164,7 @@ static void killGateway()  {  	if (sGatewayPtr)  	{ +		sGatewayPump.stopListening("VivoxDaemonPump");  		sGatewayPtr->kill();  	}  } @@ -599,6 +601,19 @@ bool LLVivoxVoiceClient::endAndDisconnectSession()      return true;  } +bool LLVivoxVoiceClient::callbackEndDaemon(const LLSD& data) +{ +    if (!LLAppViewer::isExiting()) +    { +        terminateAudioSession(false); +        closeSocket(); +        cleanUp(); +        LLVoiceClient::getInstance()->setUserPTTState(false); +        gAgent.setVoiceConnected(false); +    } +    sGatewayPump.stopListening("VivoxDaemonPump"); +    return false; +}  bool LLVivoxVoiceClient::startAndLaunchDaemon()  { @@ -670,6 +685,9 @@ bool LLVivoxVoiceClient::startAndLaunchDaemon()              params.args.add(LLVivoxSecurity::getInstance()->connectorHandle());  #           endif // VIVOX_HANDLE_ARGS +            params.postend = sGatewayPump.getName(); +            sGatewayPump.listen("VivoxDaemonPump", boost::bind(&LLVivoxVoiceClient::callbackEndDaemon, this, _1)); +              sGatewayPtr = LLProcess::create(params);              mDaemonHost = LLHost(gSavedSettings.getString("VivoxVoiceHost").c_str(), gSavedSettings.getU32("VivoxVoicePort")); @@ -764,15 +782,13 @@ bool LLVivoxVoiceClient::provisionVoiceAccount()          llcoro::suspend();      } -    LLViewerRegion *region = gAgent.getRegion(); - -    while (!region->capabilitiesReceived()) +    while (!gAgent.getRegion()->capabilitiesReceived())      {          // *TODO* Pump a message for wake up.          llcoro::suspend();      } -    std::string url = region->getCapability("ProvisionVoiceAccountRequest"); +    std::string url = gAgent.getRegionCapability("ProvisionVoiceAccountRequest");      LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID);      LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t diff --git a/indra/newview/llvoicevivox.h b/indra/newview/llvoicevivox.h index 81e924e438..c7ce92fff5 100644 --- a/indra/newview/llvoicevivox.h +++ b/indra/newview/llvoicevivox.h @@ -623,6 +623,7 @@ private:      bool startAndConnectSession();      bool endAndDisconnectSession(); +    bool callbackEndDaemon(const LLSD& data);      bool startAndLaunchDaemon();      bool provisionVoiceAccount();      bool establishVoiceConnection(); diff --git a/indra/newview/llweb.cpp b/indra/newview/llweb.cpp index 8026dc3ea8..b816225b07 100644 --- a/indra/newview/llweb.cpp +++ b/indra/newview/llweb.cpp @@ -192,7 +192,7 @@ std::string LLWeb::expandURLSubstitutions(const std::string &url,  	substitution["CHANNEL"] = LLVersionInfo::getChannel();  	substitution["GRID"] = LLGridManager::getInstance()->getGridId();  	substitution["GRID_LOWERCASE"] = utf8str_tolower(LLGridManager::getInstance()->getGridId()); -	substitution["OS"] = LLAppViewer::instance()->getOSInfo().getOSStringSimple(); +	substitution["OS"] = LLOSInfo::instance().getOSStringSimple();  	substitution["SESSION_ID"] = gAgent.getSessionID();  	substitution["FIRST_LOGIN"] = gAgent.isFirstLogin(); @@ -224,6 +224,22 @@ std::string LLWeb::expandURLSubstitutions(const std::string &url,  	}  	substitution["PARCEL_ID"] = llformat("%d", parcel_id); +	// find the grid +	std::string current_grid = LLGridManager::getInstance()->getGridId(); +	std::transform(current_grid.begin(), current_grid.end(), current_grid.begin(), ::tolower); +	if (current_grid == "agni") +	{ +		substitution["GRID"] = "secondlife.com"; +	} +	else if (current_grid == "damballah") +	{ +		// Staging grid has its own naming scheme. +		substitution["GRID"] = "secondlife-staging.com"; +	} +	else +	{ +		substitution["GRID"] = llformat("%s.lindenlab.com", current_grid.c_str()); +	}  	// expand all of the substitution strings and escape the url  	std::string expanded_url = url;  	LLStringUtil::format(expanded_url, substitution); diff --git a/indra/newview/llwlhandlers.cpp b/indra/newview/llwlhandlers.cpp index 87e8c3008e..ea65a0c6d9 100644 --- a/indra/newview/llwlhandlers.cpp +++ b/indra/newview/llwlhandlers.cpp @@ -74,7 +74,7 @@ void LLEnvironmentRequest::onRegionCapsReceived(const LLUUID& region_id)  // static  bool LLEnvironmentRequest::doRequest()  { -	std::string url = gAgent.getRegion()->getCapability("EnvironmentSettings"); +	std::string url = gAgent.getRegionCapability("EnvironmentSettings");  	if (url.empty())  	{  		LL_INFOS("WindlightCaps") << "Skipping windlight setting request - we don't have this capability" << LL_ENDL; @@ -162,7 +162,7 @@ bool LLEnvironmentApply::initiateRequest(const LLSD& content)  	sLastUpdate = current;  	// Send update request. -	std::string url = gAgent.getRegion()->getCapability("EnvironmentSettings"); +	std::string url = gAgent.getRegionCapability("EnvironmentSettings");  	if (url.empty())  	{  		LL_WARNS("WindlightCaps") << "Applying windlight settings not supported" << LL_ENDL; diff --git a/indra/newview/llxmlrpclistener.cpp b/indra/newview/llxmlrpclistener.cpp index cc3645131d..99070d5bee 100644 --- a/indra/newview/llxmlrpclistener.cpp +++ b/indra/newview/llxmlrpclistener.cpp @@ -312,7 +312,7 @@ public:          }          XMLRPC_RequestSetData(request, xparams); -        mTransaction.reset(new LLXMLRPCTransaction(mUri, request)); +        mTransaction.reset(new LLXMLRPCTransaction(mUri, request, true, command.has("http_params")? LLSD(command["http_params"]) : LLSD()));  		mPreviousStatus = mTransaction->status(NULL);          // Free the XMLRPC_REQUEST object and the attached data values. diff --git a/indra/newview/llxmlrpctransaction.cpp b/indra/newview/llxmlrpctransaction.cpp index f8b38669b6..0c8495a6e4 100644 --- a/indra/newview/llxmlrpctransaction.cpp +++ b/indra/newview/llxmlrpctransaction.cpp @@ -208,7 +208,7 @@ public:  	std::string         mCertStore;  	LLPointer<LLCertificate> mErrorCert; -	Impl(const std::string& uri, XMLRPC_REQUEST request, bool useGzip); +	Impl(const std::string& uri, XMLRPC_REQUEST request, bool useGzip, const LLSD& httpParams);  	Impl(const std::string& uri,  		const std::string& method, LLXMLRPCValue params, bool useGzip);  	~Impl(); @@ -219,7 +219,7 @@ public:  	void setHttpStatus(const LLCore::HttpStatus &status);  private: -	void init(XMLRPC_REQUEST request, bool useGzip); +	void init(XMLRPC_REQUEST request, bool useGzip, const LLSD& httpParams);  };  LLXMLRPCTransaction::Handler::Handler(LLCore::HttpRequest::ptr_t &request,  @@ -315,13 +315,13 @@ void LLXMLRPCTransaction::Handler::onCompleted(LLCore::HttpHandle handle,  //=========================================================================  LLXMLRPCTransaction::Impl::Impl(const std::string& uri, -		XMLRPC_REQUEST request, bool useGzip) +		XMLRPC_REQUEST request, bool useGzip, const LLSD& httpParams)  	: mHttpRequest(),  	  mStatus(LLXMLRPCTransaction::StatusNotStarted),  	  mURI(uri),  	  mResponse(0)  { -	init(request, useGzip); +	init(request, useGzip, httpParams);  } @@ -337,7 +337,7 @@ LLXMLRPCTransaction::Impl::Impl(const std::string& uri,  	XMLRPC_RequestSetRequestType(request, xmlrpc_request_call);  	XMLRPC_RequestSetData(request, params.getValue()); -	init(request, useGzip); +	init(request, useGzip, LLSD());      // DEV-28398: without this XMLRPC_RequestFree() call, it looks as though      // the 'request' object is simply leaked. It's less clear to me whether we      // should also ask to free request value data (second param 1), since the @@ -345,7 +345,7 @@ LLXMLRPCTransaction::Impl::Impl(const std::string& uri,      XMLRPC_RequestFree(request, 1);  } -void LLXMLRPCTransaction::Impl::init(XMLRPC_REQUEST request, bool useGzip) +void LLXMLRPCTransaction::Impl::init(XMLRPC_REQUEST request, bool useGzip, const LLSD& httpParams)  {  	LLCore::HttpOptions::ptr_t httpOpts;  	LLCore::HttpHeaders::ptr_t httpHeaders; @@ -359,7 +359,15 @@ void LLXMLRPCTransaction::Impl::init(XMLRPC_REQUEST request, bool useGzip)  	// LLRefCounted starts with a 1 ref, so don't add a ref in the smart pointer  	httpOpts = LLCore::HttpOptions::ptr_t(new LLCore::HttpOptions());  -	httpOpts->setTimeout(40L); +	// delay between repeats will start from 5 sec and grow to 20 sec with each repeat +	httpOpts->setMinBackoff(5E6L); +	httpOpts->setMaxBackoff(20E6L); + +	httpOpts->setTimeout(httpParams.has("timeout") ? httpParams["timeout"].asInteger() : 40L); +	if (httpParams.has("retries")) +	{ +		httpOpts->setRetries(httpParams["retries"].asInteger()); +	}  	bool vefifySSLCert = !gSavedSettings.getBOOL("NoVerifySSLCert");  	mCertStore = gSavedSettings.getString("CertStore"); @@ -526,8 +534,8 @@ void LLXMLRPCTransaction::Impl::setHttpStatus(const LLCore::HttpStatus &status)  LLXMLRPCTransaction::LLXMLRPCTransaction( -	const std::string& uri, XMLRPC_REQUEST request, bool useGzip) -: impl(* new Impl(uri, request, useGzip)) +	const std::string& uri, XMLRPC_REQUEST request, bool useGzip, const LLSD& httpParams) +: impl(* new Impl(uri, request, useGzip, httpParams))  { } diff --git a/indra/newview/llxmlrpctransaction.h b/indra/newview/llxmlrpctransaction.h index 3a1c9c82b7..7a9bc991f7 100644 --- a/indra/newview/llxmlrpctransaction.h +++ b/indra/newview/llxmlrpctransaction.h @@ -85,7 +85,7 @@ class LLXMLRPCTransaction  {  public:  	LLXMLRPCTransaction(const std::string& uri, -		XMLRPC_REQUEST request, bool useGzip = true); +		XMLRPC_REQUEST request, bool useGzip = true, const LLSD& httpParams = LLSD());  		// does not take ownership of the request object  		// request can be freed as soon as the transaction is constructed diff --git a/indra/newview/skins/default/xui/de/menu_viewer.xml b/indra/newview/skins/default/xui/de/menu_viewer.xml index c484f11590..5feedef965 100644 --- a/indra/newview/skins/default/xui/de/menu_viewer.xml +++ b/indra/newview/skins/default/xui/de/menu_viewer.xml @@ -173,6 +173,7 @@  	</menu>  	<menu label="Hilfe" name="Help">  		<menu_item_call label="Anweisungen..." name="How To"/> +		<menu_item_call label="Kurzanleitung" name="Quickstart"/>  		<menu_item_call label="Knowledge Base" name="Knowledge Base"/>  		<menu_item_call label="Wiki" name="Wiki"/>  		<menu_item_call label="Community-Foren" name="Community Forums"/> diff --git a/indra/newview/skins/default/xui/de/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/de/panel_preferences_advanced.xml index 60e4fb19a7..b8ddc63b93 100644 --- a/indra/newview/skins/default/xui/de/panel_preferences_advanced.xml +++ b/indra/newview/skins/default/xui/de/panel_preferences_advanced.xml @@ -6,7 +6,7 @@  	<text name="Cache:">  		Cache:  	</text> -	<spinner label="Cache-Größe (64 – 9.984 MB)" name="cachesizespinner"/> +	<spinner label="Cache-Größe (256 – 9.984 MB)" name="cachesizespinner"/>  	<text name="text_box5">  		MB  	</text> diff --git a/indra/newview/skins/default/xui/en/floater_avatar_picker.xml b/indra/newview/skins/default/xui/en/floater_avatar_picker.xml index 1a55dc2e2c..dddb258ed9 100644 --- a/indra/newview/skins/default/xui/en/floater_avatar_picker.xml +++ b/indra/newview/skins/default/xui/en/floater_avatar_picker.xml @@ -16,6 +16,10 @@          '[TEXT]' not found      </floater.string>      <floater.string +     name="not_found_text"> +        Resident wasn't found. +    </floater.string> +    <floater.string       name="no_one_near">          No one near      </floater.string> diff --git a/indra/newview/skins/default/xui/en/floater_grid_status.xml b/indra/newview/skins/default/xui/en/floater_grid_status.xml index b97bd8056d..bf78204282 100644 --- a/indra/newview/skins/default/xui/en/floater_grid_status.xml +++ b/indra/newview/skins/default/xui/en/floater_grid_status.xml @@ -12,7 +12,6 @@    save_rect="true"    save_visibility="true"    title="" -  initial_mime_type="text/html"    width="780"    tab_stop="true"    filename="floater_web_content.xml"/> diff --git a/indra/newview/skins/default/xui/en/floater_inventory_view_finder.xml b/indra/newview/skins/default/xui/en/floater_inventory_view_finder.xml index 519d3e043c..1b4992b4ca 100644 --- a/indra/newview/skins/default/xui/en/floater_inventory_view_finder.xml +++ b/indra/newview/skins/default/xui/en/floater_inventory_view_finder.xml @@ -2,7 +2,7 @@  <floater   legacy_header_height="18"   can_minimize="false" - height="440" + height="468"   layout="topleft"   name="Inventory Finder"   help_topic="inventory_finder" @@ -245,11 +245,36 @@       layout="topleft"       left="10"       name="horiz_separator" -     top_pad="8" +     top_pad="10"       width="260"/>      <check_box       height="16" -     top="324" +     label="Created by me" +     layout="topleft" +     left="8" +     name="check_created_by_me" +     top_delta="8" +     width="130" /> +    <check_box +     height="16" +     label="Created by others" +     layout="topleft" +     left_pad="0" +     name="check_created_by_others" +     top_delta="0" +     width="70" /> +    <view_border +     bevel_style="none" +     follows="top|left" +     height="0" +     layout="topleft" +     left="10" +     name="horiz_separator2" +     top_pad="10" +     width="260"/> +    <check_box +     height="16" +     top="352"       label="Since Logoff"       layout="topleft"       left_delta="0" @@ -265,7 +290,7 @@       layout="topleft"       left_delta="0"       name="- OR -" -     top="342" +     top="370"       width="144">          - OR -      </text> @@ -273,7 +298,7 @@       height="16"       layout="topleft"       name="date_search_direction" -     top="360" +     top="388"       left="8"       width="270">       <radio_item @@ -343,6 +368,6 @@       layout="topleft"       name="Close"       right="-6" -     top="406" +     top="434"       width="76" />  </floater> diff --git a/indra/newview/skins/default/xui/en/floater_web_content.xml b/indra/newview/skins/default/xui/en/floater_web_content.xml index 4473ce0cda..fe9ffba6cd 100644 --- a/indra/newview/skins/default/xui/en/floater_web_content.xml +++ b/indra/newview/skins/default/xui/en/floater_web_content.xml @@ -10,7 +10,6 @@    help_topic="floater_web_content"    save_rect="true"    title="" -  initial_mime_type="text/html"    width="780">    <layout_stack      bottom="775" diff --git a/indra/newview/skins/default/xui/en/menu_inventory.xml b/indra/newview/skins/default/xui/en/menu_inventory.xml index ec9f947338..5b45364127 100644 --- a/indra/newview/skins/default/xui/en/menu_inventory.xml +++ b/indra/newview/skins/default/xui/en/menu_inventory.xml @@ -569,6 +569,14 @@           function="Inventory.DoToSelected"           parameter="copy_uuid" />      </menu_item_call> +    <menu_item_call +     label="Show in Main Panel" +     layout="topleft" +     name="Show in Main Panel"> +       <menu_item_call.on_click +        function="Inventory.DoToSelected" +        parameter="show_in_main_panel" /> +    </menu_item_call>      <menu_item_separator       layout="topleft"        name="Copy Separator" /> diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index a314213644..a0130b568a 100644 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -6285,6 +6285,13 @@ Although you're very nice, you can't add yourself as a friend.    <notification     icon="notifytip.tga" +   name="AddSelfRenderExceptions" +   type="notifytip"> +You can't add yourself to the rendering exceptions list. +  </notification> + +  <notification +   icon="notifytip.tga"     name="UploadingAuctionSnapshot"     type="notifytip">  Uploading in-world and web site snapshots... diff --git a/indra/newview/skins/default/xui/en/panel_active_object_row.xml b/indra/newview/skins/default/xui/en/panel_active_object_row.xml index 3e3271b181..656171ff96 100644 --- a/indra/newview/skins/default/xui/en/panel_active_object_row.xml +++ b/indra/newview/skins/default/xui/en/panel_active_object_row.xml @@ -18,15 +18,7 @@      left="5"      height="25"      width="25" -    visible="false" -    speaker.name="speaker_p2p" -    speaker.width="20" -    speaker.height="25" -    speaker.left="25" -    speaker.top="25" -    speaker.auto_update="true" -    speaker.draw_border="false" -    speaker.visible="false"> +    visible="false">    </chiclet_script>    <chiclet_offer      name="inv_offer_chiclet" @@ -36,15 +28,7 @@      left="5"      height="25"      width="25" -    visible="false" -    speaker.name="speaker_p2p" -    speaker.width="20" -    speaker.height="25" -    speaker.left="25" -    speaker.top="25" -    speaker.auto_update="true" -    speaker.draw_border="false" -    speaker.visible="false"> +    visible="false">    </chiclet_offer>  	<text      type="string" diff --git a/indra/newview/skins/default/xui/en/panel_main_inventory.xml b/indra/newview/skins/default/xui/en/panel_main_inventory.xml index 0a85477bf4..df70398599 100644 --- a/indra/newview/skins/default/xui/en/panel_main_inventory.xml +++ b/indra/newview/skins/default/xui/en/panel_main_inventory.xml @@ -41,13 +41,37 @@     text_pad_left="10"     follows="left|top|right"     height="23" -   label="Filter Inventory" +   label="Enter search text"     layout="topleft"     left="10"     max_length_chars="300"     name="inventory search editor"     top="18" -   width="303" /> +   width="208" /> +  <combo_box +   height="23" +   layout="topleft" +   left_pad="4" +   name="search_type" +   follows="top|right" +   width="90"> +    <item +     label="Name" +     name="Name" +     value="search_by_name"/> +    <item +     label="Creator" +     name="Creator" +     value="search_by_creator"/> +    <item +     label="Description" +     name="Description" +     value="search_by_description"/> +    <item +     label="UUID" +     name="UUID" +     value="search_by_UUID"/> +    </combo_box>    <tab_container       follows="all"       halign="center" @@ -92,6 +116,20 @@       name="Recent Items"       show_item_link_overlays="true"       width="290" /> +       <inventory_panel +      name="Worn Items" +      label="WORN" +      show_empty_message="false" +      follows="all" +      layout="topleft" +      width="290" +      bg_opaque_color="DkGray2" +      bg_alpha_color="DkGray2" +      background_visible="true" +      border="false" +      bevel_style="none" +      scroll.reserve_scroll_corner="false"> +  </inventory_panel>    </tab_container>    <layout_stack     animate="false" diff --git a/indra/newview/skins/default/xui/en/panel_media_settings_general.xml b/indra/newview/skins/default/xui/en/panel_media_settings_general.xml index e844a15118..2316beeb36 100644 --- a/indra/newview/skins/default/xui/en/panel_media_settings_general.xml +++ b/indra/newview/skins/default/xui/en/panel_media_settings_general.xml @@ -193,7 +193,7 @@     follows="left|top"      height="16"     increment="1"  -   initial_val="256"  +   initial_value="256"      label=""      label_width="0"     left_delta="68"  @@ -213,7 +213,7 @@  	  follows="left|top"   	  height="16"  	  increment="1" -	  initial_val="256"  +	  initial_value="256"   	  label=""  	  label_width="0"  	  left_delta="20"  diff --git a/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml index 0cd56af6d7..4f0bb9d3b7 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml @@ -32,12 +32,12 @@     height="23"     increment="64"     initial_value="1024" -   label="Cache size (64 - 9984MB)" +   label="Cache size (256 - 9984MB)"     label_width="150"     layout="topleft"     left="80"     max_val="9984" -   min_val="64" +   min_val="256"     top_pad="10"     name="cachesizespinner"     width="200" /> @@ -87,7 +87,7 @@     height="23"     layout="topleft"     left="80" -   max_length="4096" +   max_length_bytes="4096"     name="cache_location"     top_pad="5"     width="205" /> diff --git a/indra/newview/skins/default/xui/en/panel_preferences_chat.xml b/indra/newview/skins/default/xui/en/panel_preferences_chat.xml index 78f771cd51..9e7023d2f2 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_chat.xml @@ -1,7 +1,6 @@  <?xml version="1.0" encoding="utf-8" standalone="yes" ?>  <panel      border="true" -    has_border="true"      height="408"      label="Text Chat"      layout="topleft" @@ -541,7 +540,7 @@          height="23"          layout="topleft"          left_pad="55" -        max_length="4096" +        max_length_bytes="4096"          name="log_path_string"          top_delta="-5"          width="185"> diff --git a/indra/newview/skins/default/xui/es/menu_viewer.xml b/indra/newview/skins/default/xui/es/menu_viewer.xml index 805b24e290..447dd2629c 100644 --- a/indra/newview/skins/default/xui/es/menu_viewer.xml +++ b/indra/newview/skins/default/xui/es/menu_viewer.xml @@ -173,6 +173,7 @@  	</menu>  	<menu label="Ayuda" name="Help">  		<menu_item_call label="Cómo..." name="How To"/> +		<menu_item_call label="Guía rápida" name="Quickstart"/>  		<menu_item_call label="Base de Conocimientos" name="Knowledge Base"/>  		<menu_item_call label="Wiki" name="Wiki"/>  		<menu_item_call label="Foros comunitarios" name="Community Forums"/> diff --git a/indra/newview/skins/default/xui/es/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/es/panel_preferences_advanced.xml index efa003c17e..4cb816a120 100644 --- a/indra/newview/skins/default/xui/es/panel_preferences_advanced.xml +++ b/indra/newview/skins/default/xui/es/panel_preferences_advanced.xml @@ -6,7 +6,7 @@  	<text name="Cache:">  		Caché:  	</text> -	<spinner label="Tamaño de la caché (64 - 9984 MB)" name="cachesizespinner"/> +	<spinner label="Tamaño de la caché (256 - 9984 MB)" name="cachesizespinner"/>  	<text name="text_box5">  		MB  	</text> diff --git a/indra/newview/skins/default/xui/es/strings.xml b/indra/newview/skins/default/xui/es/strings.xml index 67e45076e1..d1472a74f9 100644 --- a/indra/newview/skins/default/xui/es/strings.xml +++ b/indra/newview/skins/default/xui/es/strings.xml @@ -78,7 +78,7 @@ Versión de Voice Server: [VOICE_VERSION]  		Paquetes perdidos: [PACKETS_LOST,number,0]/[PACKETS_IN,number,0] ([PACKETS_PCT,number,1]%)  	</string>  	<string name="AboutTime"> -		[mes, fecha_hora, slt] [día, fecha_hora, slt] [año, fecha_hora, slt] [hora, fecha_hora, slt]:[min, fecha_hora, slt]:[segundo,fecha_hora,slt] +		[month, datetime, slt] [day, datetime, slt] [year, datetime, slt] [hour, datetime, slt]:[min, datetime, slt]:[second,datetime,slt]  	</string>  	<string name="ErrorFetchingServerReleaseNotesURL">  		Error al obtener la URL de las notas de la versión del servidor. diff --git a/indra/newview/skins/default/xui/fr/menu_viewer.xml b/indra/newview/skins/default/xui/fr/menu_viewer.xml index 451d45bedd..04fa85d488 100644 --- a/indra/newview/skins/default/xui/fr/menu_viewer.xml +++ b/indra/newview/skins/default/xui/fr/menu_viewer.xml @@ -173,6 +173,7 @@  	</menu>  	<menu label="Aide" name="Help">  		<menu_item_call label="Aide rapide..." name="How To"/> +		<menu_item_call label="Démarrage rapide" name="Quickstart"/>  		<menu_item_call label="Base de connaissances" name="Knowledge Base"/>  		<menu_item_call label="Wiki" name="Wiki"/>  		<menu_item_call label="Forums de la communauté" name="Community Forums"/> diff --git a/indra/newview/skins/default/xui/fr/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/fr/panel_preferences_advanced.xml index f61dc5aa35..b96cb6dc49 100644 --- a/indra/newview/skins/default/xui/fr/panel_preferences_advanced.xml +++ b/indra/newview/skins/default/xui/fr/panel_preferences_advanced.xml @@ -6,7 +6,7 @@  	<text name="Cache:">  		Cache :  	</text> -	<spinner label="Taille du cache (64 - 9984 Mo)" name="cachesizespinner"/> +	<spinner label="Taille du cache (256 - 9984 Mo)" name="cachesizespinner"/>  	<text name="text_box5">  		Mo  	</text> diff --git a/indra/newview/skins/default/xui/it/menu_viewer.xml b/indra/newview/skins/default/xui/it/menu_viewer.xml index e010ec1591..607171d9be 100644 --- a/indra/newview/skins/default/xui/it/menu_viewer.xml +++ b/indra/newview/skins/default/xui/it/menu_viewer.xml @@ -173,6 +173,7 @@  	</menu>  	<menu label="Aiuto" name="Help">  		<menu_item_call label="Istruzioni..." name="How To"/> +		<menu_item_call label="Guida introduttiva" name="Quickstart"/>  		<menu_item_call label="Base di conoscenza" name="Knowledge Base"/>  		<menu_item_call label="Wiki" name="Wiki"/>  		<menu_item_call label="Forum della comunità" name="Community Forums"/> diff --git a/indra/newview/skins/default/xui/it/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/it/panel_preferences_advanced.xml index 85cbfb92ef..87cee345fa 100644 --- a/indra/newview/skins/default/xui/it/panel_preferences_advanced.xml +++ b/indra/newview/skins/default/xui/it/panel_preferences_advanced.xml @@ -6,7 +6,7 @@  	<text name="Cache:">  		Cache:  	</text> -	<spinner label="Dimensione cache (64 - 9984 MB)" name="cachesizespinner"/> +	<spinner label="Dimensione cache (256 - 9984 MB)" name="cachesizespinner"/>  	<text name="text_box5">  		MB  	</text> diff --git a/indra/newview/skins/default/xui/ja/menu_viewer.xml b/indra/newview/skins/default/xui/ja/menu_viewer.xml index f2d989f17f..9154f327c1 100644 --- a/indra/newview/skins/default/xui/ja/menu_viewer.xml +++ b/indra/newview/skins/default/xui/ja/menu_viewer.xml @@ -173,6 +173,7 @@  	</menu>  	<menu label="ヘルプ" name="Help">  		<menu_item_call label="ハウツー..." name="How To"/> +		<menu_item_call label="クイックスタート" name="Quickstart"/>  		<menu_item_call label="ナレッジベース" name="Knowledge Base"/>  		<menu_item_call label="Wiki" name="Wiki"/>  		<menu_item_call label="コミュニティフォーラム" name="Community Forums"/> diff --git a/indra/newview/skins/default/xui/ja/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/ja/panel_preferences_advanced.xml index 62b8daeb4e..266809f4da 100644 --- a/indra/newview/skins/default/xui/ja/panel_preferences_advanced.xml +++ b/indra/newview/skins/default/xui/ja/panel_preferences_advanced.xml @@ -6,7 +6,7 @@  	<text name="Cache:">  		キャッシュ:  	</text> -	<spinner label="キャッシュサイズ(64~9,984MB)" name="cachesizespinner"/> +	<spinner label="キャッシュサイズ(256~9,984MB)" name="cachesizespinner"/>  	<text name="text_box5">  		MB  	</text> diff --git a/indra/newview/skins/default/xui/pl/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/pl/panel_preferences_advanced.xml index cc85ec20f6..4609b2f916 100644 --- a/indra/newview/skins/default/xui/pl/panel_preferences_advanced.xml +++ b/indra/newview/skins/default/xui/pl/panel_preferences_advanced.xml @@ -3,7 +3,7 @@  	<text name="Cache:">  		Pamięć podręczna:  	</text> -	<spinner label="Rozmiar (64 - 9984 MB)" name="cachesizespinner" /> +	<spinner label="Rozmiar (256 - 9984 MB)" name="cachesizespinner" />  	<button label="Wyczyść" label_selected="Wyczyść" name="clear_cache" />  	<text name="Cache location">  		Położenie buforu pamięci podręcznej: diff --git a/indra/newview/skins/default/xui/pt/menu_viewer.xml b/indra/newview/skins/default/xui/pt/menu_viewer.xml index f4a18cfc2c..cef0f02070 100644 --- a/indra/newview/skins/default/xui/pt/menu_viewer.xml +++ b/indra/newview/skins/default/xui/pt/menu_viewer.xml @@ -173,6 +173,7 @@  	</menu>  	<menu label="Ajuda" name="Help">  		<menu_item_call label="Como..." name="How To"/> +		<menu_item_call label="Início rápido" name="Quickstart"/>  		<menu_item_call label="Base de conhecimento" name="Knowledge Base"/>  		<menu_item_call label="Wiki" name="Wiki"/>  		<menu_item_call label="Fóruns da comunidade" name="Community Forums"/> diff --git a/indra/newview/skins/default/xui/pt/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/pt/panel_preferences_advanced.xml index 15340a9a5f..56065d95a3 100644 --- a/indra/newview/skins/default/xui/pt/panel_preferences_advanced.xml +++ b/indra/newview/skins/default/xui/pt/panel_preferences_advanced.xml @@ -6,7 +6,7 @@  	<text name="Cache:">  		Cache:  	</text> -	<spinner label="Cache (64 - 9984 MB)" name="cachesizespinner"/> +	<spinner label="Cache (256 - 9984 MB)" name="cachesizespinner"/>  	<text name="text_box5">  		MB  	</text> diff --git a/indra/newview/skins/default/xui/ru/menu_viewer.xml b/indra/newview/skins/default/xui/ru/menu_viewer.xml index b92e266b8d..309253213c 100644 --- a/indra/newview/skins/default/xui/ru/menu_viewer.xml +++ b/indra/newview/skins/default/xui/ru/menu_viewer.xml @@ -170,6 +170,7 @@  	</menu>  	<menu label="Справка" name="Help">  		<menu_item_call label="Инструкции..." name="How To"/> +		<menu_item_call label="Краткое руководство" name="Quickstart"/>  		<menu_item_call label="База знаний" name="Knowledge Base"/>  		<menu_item_call label="Wiki" name="Wiki"/>  		<menu_item_call label="Форумы сообщества" name="Community Forums"/> diff --git a/indra/newview/skins/default/xui/ru/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/ru/panel_preferences_advanced.xml index 88bcc22414..03295084dc 100644 --- a/indra/newview/skins/default/xui/ru/panel_preferences_advanced.xml +++ b/indra/newview/skins/default/xui/ru/panel_preferences_advanced.xml @@ -6,7 +6,7 @@  	<text name="Cache:">  		Кэш:  	</text> -	<spinner label="Размер кэша (64 - 9984 МБ)" name="cachesizespinner"/> +	<spinner label="Размер кэша (256 - 9984 МБ)" name="cachesizespinner"/>  	<text name="text_box5">  		МБ  	</text> diff --git a/indra/newview/skins/default/xui/tr/menu_viewer.xml b/indra/newview/skins/default/xui/tr/menu_viewer.xml index 04b05ee2bb..ad134c717e 100644 --- a/indra/newview/skins/default/xui/tr/menu_viewer.xml +++ b/indra/newview/skins/default/xui/tr/menu_viewer.xml @@ -171,6 +171,7 @@  	</menu>  	<menu label="Yardım" name="Help">  		<menu_item_call label="Nasıl yapılır..." name="How To"/> +		<menu_item_call label="Hızlı Başlangıç" name="Quickstart"/>  		<menu_item_call label="Bilgi Bankası" name="Knowledge Base"/>  		<menu_item_call label="Wiki" name="Wiki"/>  		<menu_item_call label="Topluluk Forumları" name="Community Forums"/> diff --git a/indra/newview/skins/default/xui/tr/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/tr/panel_preferences_advanced.xml index c3ac198d08..f8aa17f0c6 100644 --- a/indra/newview/skins/default/xui/tr/panel_preferences_advanced.xml +++ b/indra/newview/skins/default/xui/tr/panel_preferences_advanced.xml @@ -6,7 +6,7 @@  	<text name="Cache:">  		Önbellek:  	</text> -	<spinner label="Önbellek boyutu (64-9984 MB)" name="cachesizespinner"/> +	<spinner label="Önbellek boyutu (256-9984 MB)" name="cachesizespinner"/>  	<text name="text_box5">  		MB  	</text> diff --git a/indra/newview/skins/default/xui/zh/menu_viewer.xml b/indra/newview/skins/default/xui/zh/menu_viewer.xml index 0388b891d6..433e34758a 100644 --- a/indra/newview/skins/default/xui/zh/menu_viewer.xml +++ b/indra/newview/skins/default/xui/zh/menu_viewer.xml @@ -171,6 +171,7 @@  	</menu>  	<menu label="幫助" name="Help">  		<menu_item_call label="簡易教學…" name="How To"/> +		<menu_item_call label="快速上手" name="Quickstart"/>  		<menu_item_call label="知識庫" name="Knowledge Base"/>  		<menu_item_call label="維基" name="Wiki"/>  		<menu_item_call label="社群論壇" name="Community Forums"/> diff --git a/indra/newview/skins/default/xui/zh/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/zh/panel_preferences_advanced.xml index 170cdddb8c..47f1069254 100644 --- a/indra/newview/skins/default/xui/zh/panel_preferences_advanced.xml +++ b/indra/newview/skins/default/xui/zh/panel_preferences_advanced.xml @@ -6,7 +6,7 @@  	<text name="Cache:">  		快取:  	</text> -	<spinner label="快取大小 (64 - 9984MB)" name="cachesizespinner"/> +	<spinner label="快取大小 (256 - 9984MB)" name="cachesizespinner"/>  	<text name="text_box5">  		MB  	</text> diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index ecff21e6d2..8b304ee0cd 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -61,7 +61,7 @@ class ViewerManifest(LLManifest):          self.path(src="../../etc/message.xml", dst="app_settings/message.xml")          if self.is_packaging_viewer(): -            if self.prefix(src="app_settings"): +            with self.prefix(src="app_settings"):                  self.exclude("logcontrol.xml")                  self.exclude("logcontrol-dev.xml")                  self.path("*.pem") @@ -84,9 +84,8 @@ class ViewerManifest(LLManifest):                  # ... and the included spell checking dictionaries                  pkgdir = os.path.join(self.args['build'], os.pardir, 'packages') -                if self.prefix(src=pkgdir,dst=""): +                with self.prefix(src=pkgdir,dst=""):                      self.path("dictionaries") -                    self.end_prefix(pkgdir)                  # include the extracted packages information (see BuildPackagesInfo.cmake)                  self.path(src=os.path.join(self.args['build'],"packages-info.txt"), dst="packages-info.txt") @@ -129,24 +128,21 @@ class ViewerManifest(LLManifest):                                   "settings_install.xml",                                   src="environment") -                self.end_prefix("app_settings") -            if self.prefix(src="character"): +            with self.prefix(src="character"):                  self.path("*.llm")                  self.path("*.xml")                  self.path("*.tga") -                self.end_prefix("character")              # Include our fonts -            if self.prefix(src="fonts"): +            with self.prefix(src="fonts"):                  self.path("*.ttf")                  self.path("*.txt") -                self.end_prefix("fonts")              # skins -            if self.prefix(src="skins"): +            with self.prefix(src="skins"):                      # include the entire textures directory recursively -                    if self.prefix(src="*/textures"): +                    with self.prefix(src="*/textures"):                              self.path("*/*.tga")                              self.path("*/*.j2c")                              self.path("*/*.jpg") @@ -156,7 +152,6 @@ class ViewerManifest(LLManifest):                              self.path("*.jpg")                              self.path("*.png")                              self.path("textures.xml") -                            self.end_prefix("*/textures")                      self.path("*/xui/*/*.xml")                      self.path("*/xui/*/widgets/*.xml")                      self.path("*/*.xml") @@ -168,19 +163,16 @@ class ViewerManifest(LLManifest):                      # we're wrong, a user actually does have the relevant                      # files; s/he just needs to rename every html.old                      # directory back to html to recover them. -                    if self.prefix(src="*/html", dst="*/html.old"): +                    with self.prefix(src="*/html", dst="*/html.old"):                              self.path("*.png")                              self.path("*/*/*.html")                              self.path("*/*/*.gif") -                            self.end_prefix("*/html") -                    self.end_prefix("skins")              # local_assets dir (for pre-cached textures) -            if self.prefix(src="local_assets"): +            with self.prefix(src="local_assets"):                  self.path("*.j2c")                  self.path("*.tga") -                self.end_prefix("local_assets")              # File in the newview/ directory              self.path("gpu_table.txt") @@ -368,28 +360,27 @@ class WindowsManifest(ViewerManifest):              self.path(src='%s/secondlife-bin.exe' % self.args['configuration'], dst=self.final_exe())              # include the compiled launcher scripts so that it gets included in the file_list -            self.path(src='%s/apply_update.exe' % vmpdir, dst="apply_update.exe")              self.path(src='%s/download_update.exe' % vmpdir, dst="download_update.exe")              self.path(src='%s/SL_Launcher.exe' % vmpdir, dst="SL_Launcher.exe") -            self.path(src='%s/update_manager.exe' % vmpdir, dst="update_manager.exe")              #IUM is not normally executed directly, just imported.  No exe needed.              self.path2basename(vmpdir,"InstallerUserMessage.py") +            with self.prefix(src=self.icon_path(), dst="vmp_icons"): +                self.path("secondlife.ico") +              #VMP  Tkinter icons -            if self.prefix("vmp_icons"): +            with self.prefix("vmp_icons"):                  self.path("*.png")                  self.path("*.gif") -                self.end_prefix("vmp_icons")              #before, we only needed llbase at build time.  With VMP, we need it at run time.              llbase_path = os.path.join(self.get_dst_prefix(),'llbase')              if not os.path.exists(llbase_path):                  os.makedirs(llbase_path) -            if self.prefix(dst="llbase"): +            with self.prefix(dst="llbase"):                  self.path2basename(llbasedir,"*.py")                  self.path2basename(llbasedir,"_cllsd.so") -                self.end_prefix()          # Plugin host application          self.path2basename(os.path.join(os.pardir, @@ -397,7 +388,7 @@ class WindowsManifest(ViewerManifest):                             "slplugin.exe")          # Get shared libs from the shared libs staging directory -        if self.prefix(src=os.path.join(os.pardir, 'sharedlibs', self.args['configuration']), +        with self.prefix(src=os.path.join(os.pardir, 'sharedlibs', self.args['configuration']),                         dst=""):              # Get llcommon and deps. If missing assume static linkage and continue. @@ -469,31 +460,27 @@ class WindowsManifest(ViewerManifest):              except:                  print "Skipping libtcmalloc_minimal.dll" -            self.end_prefix()          self.path(src="licenses-win32.txt", dst="licenses.txt")          self.path("featuretable.txt")          self.path("ca-bundle.crt")          # Media plugins - CEF -        if self.prefix(src='../media_plugins/cef/%s' % self.args['configuration'], dst="llplugin"): +        with self.prefix(src='../media_plugins/cef/%s' % self.args['configuration'], dst="llplugin"):              self.path("media_plugin_cef.dll") -            self.end_prefix()          # Media plugins - LibVLC -        if self.prefix(src='../media_plugins/libvlc/%s' % self.args['configuration'], dst="llplugin"): +        with self.prefix(src='../media_plugins/libvlc/%s' % self.args['configuration'], dst="llplugin"):              self.path("media_plugin_libvlc.dll") -            self.end_prefix()          # Media plugins - Example (useful for debugging - not shipped with release viewer)          if self.channel_type() != 'release': -            if self.prefix(src='../media_plugins/example/%s' % self.args['configuration'], dst="llplugin"): +            with self.prefix(src='../media_plugins/example/%s' % self.args['configuration'], dst="llplugin"):                  self.path("media_plugin_example.dll") -                self.end_prefix()          # CEF runtime files - debug          if self.args['configuration'].lower() == 'debug': -            if self.prefix(src=os.path.join(os.pardir, 'packages', 'bin', 'debug'), dst="llplugin"): +            with self.prefix(src=os.path.join(os.pardir, 'packages', 'bin', 'debug'), dst="llplugin"):                  self.path("chrome_elf.dll")                  self.path("d3dcompiler_43.dll")                  self.path("d3dcompiler_47.dll") @@ -504,10 +491,9 @@ class WindowsManifest(ViewerManifest):                  self.path("natives_blob.bin")                  self.path("snapshot_blob.bin")                  self.path("widevinecdmadapter.dll") -                self.end_prefix()          else:          # CEF runtime files - not debug (release, relwithdebinfo etc.) -            if self.prefix(src=os.path.join(os.pardir, 'packages', 'bin', 'release'), dst="llplugin"): +            with self.prefix(src=os.path.join(os.pardir, 'packages', 'bin', 'release'), dst="llplugin"):                  self.path("chrome_elf.dll")                  self.path("d3dcompiler_43.dll")                  self.path("d3dcompiler_47.dll") @@ -518,25 +504,22 @@ class WindowsManifest(ViewerManifest):                  self.path("natives_blob.bin")                  self.path("snapshot_blob.bin")                  self.path("widevinecdmadapter.dll") -                self.end_prefix()          # MSVC DLLs needed for CEF and have to be in same directory as plugin -        if self.prefix(src=os.path.join(os.pardir, 'sharedlibs', 'Release'), dst="llplugin"): +        with self.prefix(src=os.path.join(os.pardir, 'sharedlibs', 'Release'), dst="llplugin"):              self.path("msvcp120.dll")              self.path("msvcr120.dll") -            self.end_prefix()          # CEF files common to all configurations -        if self.prefix(src=os.path.join(os.pardir, 'packages', 'resources'), dst="llplugin"): +        with self.prefix(src=os.path.join(os.pardir, 'packages', 'resources'), dst="llplugin"):              self.path("cef.pak")              self.path("cef_100_percent.pak")              self.path("cef_200_percent.pak")              self.path("cef_extensions.pak")              self.path("devtools_resources.pak")              self.path("icudtl.dat") -            self.end_prefix() -        if self.prefix(src=os.path.join(os.pardir, 'packages', 'resources', 'locales'), dst=os.path.join('llplugin', 'locales')): +        with self.prefix(src=os.path.join(os.pardir, 'packages', 'resources', 'locales'), dst=os.path.join('llplugin', 'locales')):              self.path("am.pak")              self.path("ar.pak")              self.path("bg.pak") @@ -590,13 +573,11 @@ class WindowsManifest(ViewerManifest):              self.path("vi.pak")              self.path("zh-CN.pak")              self.path("zh-TW.pak") -            self.end_prefix() -            if self.prefix(src=os.path.join(os.pardir, 'packages', 'bin', 'release'), dst="llplugin"): +            with self.prefix(src=os.path.join(os.pardir, 'packages', 'bin', 'release'), dst="llplugin"):                  self.path("libvlc.dll")                  self.path("libvlccore.dll")                  self.path("plugins/") -                self.end_prefix()          # pull in the crash logger and updater from other projects          # tag:"crash-logger" here as a cue to the exporter @@ -712,10 +693,8 @@ class WindowsManifest(ViewerManifest):          # note that the enclosing setup exe is signed later, after the makensis makes it.          # Unlike the viewer binary, the VMP filenames are invariant with respect to version, os, etc.          for exe in ( -            "apply_update.exe",              "download_update.exe",              "SL_Launcher.exe", -            "update_manager.exe",              ):              self.sign(exe) @@ -799,14 +778,14 @@ class DarwinManifest(ViewerManifest):          chardetdir = os.path.join(pkgdir, "lib", "python", "chardet")          idnadir = os.path.join(pkgdir, "lib", "python", "idna") -        if self.prefix(src="", dst="Contents"):  # everything goes in Contents +        with self.prefix(src="", dst="Contents"):  # everything goes in Contents              self.path("Info.plist", dst="Info.plist")              # copy additional libs in <bundle>/Contents/MacOS/              self.path(os.path.join(relpkgdir, "libndofdev.dylib"), dst="Resources/libndofdev.dylib")              self.path(os.path.join(relpkgdir, "libhunspell-1.3.0.dylib"), dst="Resources/libhunspell-1.3.0.dylib")    -            if self.prefix(dst="MacOS"):               +            with self.prefix(dst="MacOS"):                                #this copies over the python wrapper script, associated utilities and required libraries, see SL-321, SL-322, SL-323                  self.path2basename(vmpdir,"SL_Launcher")                  self.path2basename(vmpdir,"*.py") @@ -814,52 +793,44 @@ class DarwinManifest(ViewerManifest):                  certifi_path = os.path.join(self.get_dst_prefix(),'certifi')                  if not os.path.exists(certifi_path):                      os.makedirs(certifi_path) -                if self.prefix(dst="certifi"): +                with self.prefix(dst="certifi"):                      self.path2basename(os.path.join(vmpdir,"certifi"),"*") -                    self.end_prefix()                                     # llbase provides our llrest service layer and llsd decoding                  llbase_path = os.path.join(self.get_dst_prefix(),'llbase')                  if not os.path.exists(llbase_path):                      os.makedirs(llbase_path) -                if self.prefix(dst="llbase"): +                with self.prefix(dst="llbase"):                      self.path2basename(llbasedir,"*.py")                      self.path2basename(llbasedir,"_cllsd.so") -                    self.end_prefix()                  #requests module needed by llbase/llrest.py                  #this is only needed on POSIX, because in Windows we compile it into the EXE                  requests_path = os.path.join(self.get_dst_prefix(),'requests')                  if not os.path.exists(requests_path):                      os.makedirs(requests_path) -                if self.prefix(dst="requests"): +                with self.prefix(dst="requests"):                      self.path2basename(requestsdir,"*") -                    self.end_prefix()                                     urllib3_path = os.path.join(self.get_dst_prefix(),'urllib3')                  if not os.path.exists(urllib3_path):                      os.makedirs(urllib3_path) -                if self.prefix(dst="urllib3"): +                with self.prefix(dst="urllib3"):                      self.path2basename(urllib3dir,"*") -                    self.end_prefix()                                     chardet_path = os.path.join(self.get_dst_prefix(),'chardet')                  if not os.path.exists(chardet_path):                      os.makedirs(chardet_path) -                if self.prefix(dst="chardet"): +                with self.prefix(dst="chardet"):                      self.path2basename(chardetdir,"*") -                    self.end_prefix()                                     idna_path = os.path.join(self.get_dst_prefix(),'idna')                  if not os.path.exists(idna_path):                      os.makedirs(idna_path) -                if self.prefix(dst="idna"): +                with self.prefix(dst="idna"):                      self.path2basename(idnadir,"*") -                    self.end_prefix()                    -                self.end_prefix()                       # most everything goes in the Resources directory -            if self.prefix(src="", dst="Resources"): +            with self.prefix(src="", dst="Resources"):                  super(DarwinManifest, self).construct() -                if self.prefix("cursors_mac"): +                with self.prefix("cursors_mac"):                      self.path("*.tif") -                    self.end_prefix("cursors_mac")                  self.path("licenses-mac.txt", dst="licenses.txt")                  self.path("featuretable_mac.txt") @@ -867,15 +838,16 @@ class DarwinManifest(ViewerManifest):                  self.path("ca-bundle.crt")                  icon_path = self.icon_path() -                if self.prefix(src=icon_path, dst="") : +                with self.prefix(src=icon_path, dst="") :                      self.path("secondlife.icns") -                    self.end_prefix(icon_path) + +                with self.prefix(src=icon_path, dst="vmp_icons"): +                    self.path("secondlife.ico")                  #VMP Tkinter icons -                if self.prefix("vmp_icons"): +                with self.prefix("vmp_icons"):                      self.path("*.png")                      self.path("*.gif") -                    self.end_prefix("vmp_icons")                  self.path("SecondLife.nib") @@ -994,7 +966,7 @@ class DarwinManifest(ViewerManifest):                              print "Can't symlink %s -> %s: %s" % (src, dst, err)                  # Dullahan helper apps go inside SLPlugin.app -                if self.prefix(src="", dst="SLPlugin.app/Contents/Frameworks"): +                with self.prefix(src="", dst="SLPlugin.app/Contents/Frameworks"):                      helperappfile = 'DullahanHelper.app'                      self.path2basename(relpkgdir, helperappfile) @@ -1010,15 +982,14 @@ class DarwinManifest(ViewerManifest):                          self.dst_path_of('DullahanHelper.app/Contents/MacOS/'                                           'Frameworks/Chromium Embedded Framework.framework') -                    self.end_prefix() -                    helperexecutablepath = self.dst_path_of('SLPlugin.app/Contents/Frameworks/DullahanHelper.app/Contents/MacOS/DullahanHelper') -                    self.run_command('install_name_tool -change ' -                                     '"@rpath/Frameworks/Chromium Embedded Framework.framework/Chromium Embedded Framework" ' -                                     '"@executable_path/Frameworks/Chromium Embedded Framework.framework/Chromium Embedded Framework" "%s"' % helperexecutablepath) +                helperexecutablepath = self.dst_path_of('SLPlugin.app/Contents/Frameworks/DullahanHelper.app/Contents/MacOS/DullahanHelper') +                self.run_command('install_name_tool -change ' +                                 '"@rpath/Frameworks/Chromium Embedded Framework.framework/Chromium Embedded Framework" ' +                                 '"@executable_path/Frameworks/Chromium Embedded Framework.framework/Chromium Embedded Framework" "%s"' % helperexecutablepath)                  # SLPlugin plugins -                if self.prefix(src="", dst="llplugin"): +                with self.prefix(src="", dst="llplugin"):                      self.path2basename("../media_plugins/cef/" + self.args['configuration'],                                         "media_plugin_cef.dylib") @@ -1027,74 +998,68 @@ class DarwinManifest(ViewerManifest):                                         "media_plugin_libvlc.dylib")                      # copy LibVLC dynamic libraries -                    if self.prefix(src=os.path.join(os.pardir, 'packages', 'lib', 'release' ), dst="lib"): +                    with self.prefix(src=os.path.join(os.pardir, 'packages', 'lib', 'release' ), dst="lib"):                          self.path( "libvlc*.dylib*" ) -                        self.end_prefix()                      # copy LibVLC plugins folder -                    if self.prefix(src=os.path.join(os.pardir, 'packages', 'lib', 'release', 'plugins' ), dst="lib"): +                    with self.prefix(src=os.path.join(os.pardir, 'packages', 'lib', 'release', 'plugins' ), dst="lib"):                          self.path( "*.dylib" )                          self.path( "plugins.dat" ) -                        self.end_prefix() - -                    self.end_prefix("llplugin") - -                    # do this install_name_tool *after* media plugin is copied over -                    dylibexecutablepath = self.dst_path_of('llplugin/media_plugin_cef.dylib') -                    self.run_command('install_name_tool -change ' -                                     '"@rpath/Frameworks/Chromium Embedded Framework.framework/Chromium Embedded Framework" ' -                                     '"@executable_path/../Frameworks/Chromium Embedded Framework.framework/Chromium Embedded Framework" "%s"' % dylibexecutablepath) - -                self.end_prefix("Resources") - -                # CEF framework goes inside Second Life.app/Contents/Frameworks -                if self.prefix(src="", dst="Frameworks"): -                    frameworkfile="Chromium Embedded Framework.framework" -                    self.path2basename(relpkgdir, frameworkfile) -                    self.end_prefix("Frameworks") - -                # This code constructs a relative path from the -                # target framework folder back to the location of the symlink. -                # It needs to be relative so that the symlink still works when -                # (as is normal) the user moves the app bundle out of the DMG -                # and into the /Applications folder. Note we also call 'raise' -                # to terminate the process if we get an error since without -                # this symlink, Second Life web media can't possibly work. -                # Real Framework folder: -                #   Second Life.app/Contents/Frameworks/Chromium Embedded Framework.framework/ -                # Location of symlink and why it's relative  -                #   Second Life.app/Contents/Resources/SLPlugin.app/Contents/Frameworks/Chromium Embedded Framework.framework/ -                # Real Frameworks folder, with the symlink inside the bundled SLPlugin.app (and why it's relative) -                #   <top level>.app/Contents/Frameworks/Chromium Embedded Framework.framework/ -                #   <top level>.app/Contents/Resources/SLPlugin.app/Contents/Frameworks/Chromium Embedded Framework.framework -> -                # It might seem simpler just to create a symlink Frameworks to -                # the parent of Chromimum Embedded Framework.framework. But -                # that would create a symlink cycle, which breaks our -                # packaging step. So make a symlink from Chromium Embedded -                # Framework.framework to the directory of the same name, which -                # is NOT an ancestor of the symlink. -                frameworkpath = os.path.join(os.pardir, os.pardir, os.pardir, -                                             os.pardir, "Frameworks", -                                             "Chromium Embedded Framework.framework") -                try: -                    # from SLPlugin.app/Contents/Frameworks/Chromium Embedded -                    # Framework.framework back to Second -                    # Life.app/Contents/Frameworks/Chromium Embedded Framework.framework -                    origin, target = pluginframeworkpath, frameworkpath -                    symlinkf(target, origin) -                    # from SLPlugin.app/Contents/Frameworks/Dullahan -                    # Helper.app/Contents/MacOS/Frameworks/Chromium Embedded -                    # Framework.framework back to -                    # SLPlugin.app/Contents/Frameworks/Chromium Embedded Framework.framework -                    self.cmakedirs(os.path.dirname(helperframeworkpath)) -                    origin = helperframeworkpath -                    target = os.path.join(os.pardir, frameworkpath) -                    symlinkf(target, origin) -                except OSError as err: -                    print "Can't symlink %s -> %s: %s" % (origin, target, err) -                    raise - -            self.end_prefix("Contents") + + +                # do this install_name_tool *after* media plugin is copied over +                dylibexecutablepath = self.dst_path_of('llplugin/media_plugin_cef.dylib') +                self.run_command('install_name_tool -change ' +                                 '"@rpath/Frameworks/Chromium Embedded Framework.framework/Chromium Embedded Framework" ' +                                 '"@executable_path/../Frameworks/Chromium Embedded Framework.framework/Chromium Embedded Framework" "%s"' % dylibexecutablepath) + + +            # CEF framework goes inside Second Life.app/Contents/Frameworks +            with self.prefix(src="", dst="Frameworks"): +                frameworkfile="Chromium Embedded Framework.framework" +                self.path2basename(relpkgdir, frameworkfile) + +            # This code constructs a relative path from the +            # target framework folder back to the location of the symlink. +            # It needs to be relative so that the symlink still works when +            # (as is normal) the user moves the app bundle out of the DMG +            # and into the /Applications folder. Note we also call 'raise' +            # to terminate the process if we get an error since without +            # this symlink, Second Life web media can't possibly work. +            # Real Framework folder: +            #   Second Life.app/Contents/Frameworks/Chromium Embedded Framework.framework/ +            # Location of symlink and why it's relative  +            #   Second Life.app/Contents/Resources/SLPlugin.app/Contents/Frameworks/Chromium Embedded Framework.framework/ +            # Real Frameworks folder, with the symlink inside the bundled SLPlugin.app (and why it's relative) +            #   <top level>.app/Contents/Frameworks/Chromium Embedded Framework.framework/ +            #   <top level>.app/Contents/Resources/SLPlugin.app/Contents/Frameworks/Chromium Embedded Framework.framework -> +            # It might seem simpler just to create a symlink Frameworks to +            # the parent of Chromimum Embedded Framework.framework. But +            # that would create a symlink cycle, which breaks our +            # packaging step. So make a symlink from Chromium Embedded +            # Framework.framework to the directory of the same name, which +            # is NOT an ancestor of the symlink. +            frameworkpath = os.path.join(os.pardir, os.pardir, os.pardir, +                                         os.pardir, "Frameworks", +                                         "Chromium Embedded Framework.framework") +            try: +                # from SLPlugin.app/Contents/Frameworks/Chromium Embedded +                # Framework.framework back to Second +                # Life.app/Contents/Frameworks/Chromium Embedded Framework.framework +                origin, target = pluginframeworkpath, frameworkpath +                symlinkf(target, origin) +                # from SLPlugin.app/Contents/Frameworks/Dullahan +                # Helper.app/Contents/MacOS/Frameworks/Chromium Embedded +                # Framework.framework back to +                # SLPlugin.app/Contents/Frameworks/Chromium Embedded Framework.framework +                self.cmakedirs(os.path.dirname(helperframeworkpath)) +                origin = helperframeworkpath +                target = os.path.join(os.pardir, frameworkpath) +                symlinkf(target, origin) +            except OSError as err: +                print "Can't symlink %s -> %s: %s" % (origin, target, err) +                raise +          # NOTE: the -S argument to strip causes it to keep enough info for          # annotated backtraces (i.e. function names in the crash log).  'strip' with no @@ -1291,21 +1256,19 @@ class LinuxManifest(ViewerManifest):          debpkgdir = os.path.join(pkgdir, "lib", "debug")          self.path("licenses-linux.txt","licenses.txt") -        if self.prefix("linux_tools", dst=""): +        with self.prefix("linux_tools", dst=""):              self.path("client-readme.txt","README-linux.txt")              self.path("client-readme-voice.txt","README-linux-voice.txt")              self.path("client-readme-joystick.txt","README-linux-joystick.txt")              self.path("wrapper.sh","secondlife") -            if self.prefix(src="", dst="etc"): +            with self.prefix(src="", dst="etc"):                  self.path("handle_secondlifeprotocol.sh")                  self.path("register_secondlifeprotocol.sh")                  self.path("refresh_desktop_app_entry.sh")                  self.path("launch_url.sh") -                self.end_prefix("etc")              self.path("install.sh") -            self.end_prefix("linux_tools") -        if self.prefix(src="", dst="bin"): +        with self.prefix(src="", dst="bin"):              self.path("secondlife-bin","do-not-directly-run-secondlife-bin")              self.path("../linux_crash_logger/linux-crash-logger","linux-crash-logger.bin")              self.path2basename("../llplugin/slplugin", "SLPlugin")  @@ -1315,40 +1278,33 @@ class LinuxManifest(ViewerManifest):              llbase_path = os.path.join(self.get_dst_prefix(),'llbase')              if not os.path.exists(llbase_path):                  os.makedirs(llbase_path) -            if self.prefix(dst="llbase"): +            with self.prefix(dst="llbase"):                  self.path2basename("../packages/lib/python/llbase","*.py")                  self.path2basename("../packages/lib/python/llbase","_cllsd.so")          -            self.end_prefix("bin") -        if self.prefix("res-sdl"): +        with self.prefix("res-sdl"):              self.path("*")              # recurse -            self.end_prefix("res-sdl")          # Get the icons based on the channel type          icon_path = self.icon_path()          print "DEBUG: icon_path '%s'" % icon_path -        if self.prefix(src=icon_path, dst="") : +        with self.prefix(src=icon_path, dst="") :              self.path("secondlife_256.png","secondlife_icon.png") -            if self.prefix(src="",dst="res-sdl") : +            with self.prefix(src="",dst="res-sdl") :                  self.path("secondlife_256.BMP","ll_icon.BMP") -                self.end_prefix("res-sdl") -            self.end_prefix(icon_path)          # plugins -        if self.prefix(src="", dst="bin/llplugin"): +        with self.prefix(src="", dst="bin/llplugin"):              self.path("../media_plugins/gstreamer010/libmedia_plugin_gstreamer010.so", "libmedia_plugin_gstreamer.so")              self.path("../media_plugins/libvlc/libmedia_plugin_libvlc.so", "libmedia_plugin_libvlc.so") -            self.end_prefix("bin/llplugin") -        if self.prefix(src=os.path.join(os.pardir, 'packages', 'lib', 'vlc', 'plugins'), dst="bin/llplugin/vlc/plugins"): +        with self.prefix(src=os.path.join(os.pardir, 'packages', 'lib', 'vlc', 'plugins'), dst="bin/llplugin/vlc/plugins"):              self.path( "plugins.dat" )              self.path( "*/*.so" ) -            self.end_prefix() -        if self.prefix(src=os.path.join(os.pardir, 'packages', 'lib' ), dst="lib"): +        with self.prefix(src=os.path.join(os.pardir, 'packages', 'lib' ), dst="lib"):              self.path( "libvlc*.so*" ) -            self.end_prefix()          # llcommon          if not self.path("../llcommon/libllcommon.so", "lib/libllcommon.so"): @@ -1411,7 +1367,7 @@ class Linux_i686_Manifest(LinuxManifest):          relpkgdir = os.path.join(pkgdir, "lib", "release")          debpkgdir = os.path.join(pkgdir, "lib", "debug") -        if self.prefix(relpkgdir, dst="lib"): +        with self.prefix(relpkgdir, dst="lib"):              self.path("libapr-1.so")              self.path("libapr-1.so.0")              self.path("libapr-1.so.0.4.5") @@ -1471,21 +1427,18 @@ class Linux_i686_Manifest(LinuxManifest):                  print "Skipping libfmodex.so - not found"                  pass -            self.end_prefix("lib") -            # Vivox runtimes -            if self.prefix(src=relpkgdir, dst="bin"): -                self.path("SLVoice") -                self.end_prefix() -            if self.prefix(src=relpkgdir, dst="lib"): -                self.path("libortp.so") -                self.path("libsndfile.so.1") -                #self.path("libvivoxoal.so.1") # no - we'll re-use the viewer's own OpenAL lib -                self.path("libvivoxsdk.so") -                self.path("libvivoxplatform.so") -                self.end_prefix("lib") - -            self.strip_binaries() +        # Vivox runtimes +        with self.prefix(src=relpkgdir, dst="bin"): +            self.path("SLVoice") +        with self.prefix(src=relpkgdir, dst="lib"): +            self.path("libortp.so") +            self.path("libsndfile.so.1") +            #self.path("libvivoxoal.so.1") # no - we'll re-use the viewer's own OpenAL lib +            self.path("libvivoxsdk.so") +            self.path("libvivoxplatform.so") + +        self.strip_binaries()  class Linux_x86_64_Manifest(LinuxManifest): diff --git a/indra/test/test.cpp b/indra/test/test.cpp index 630af2b73b..1c0317df1d 100644 --- a/indra/test/test.cpp +++ b/indra/test/test.cpp @@ -136,7 +136,7 @@ public:  private:  	NamedTempFile mTempFile; -	std::ofstream mFile; +	llofstream mFile;  };  class LLReplayLogReal: public LLReplayLog, public boost::noncopyable @@ -569,7 +569,7 @@ int main(int argc, char **argv)  	apr_status_t apr_err;  	const char* opt_arg = NULL;  	int opt_id = 0; -	boost::scoped_ptr<std::ofstream> output; +	boost::scoped_ptr<llofstream> output;  	const char *touch = NULL;  	while(true) @@ -599,7 +599,7 @@ int main(int argc, char **argv)  				verbose_mode = true;  				break;  			case 'o': -				output.reset(new std::ofstream); +				output.reset(new llofstream);  				output->open(opt_arg);  				break;  			case 's':	// --sourcedir @@ -673,7 +673,7 @@ int main(int argc, char **argv)  	if (touch && success)  	{ -		std::ofstream s; +		llofstream s;  		s.open(touch);  		s << "ok" << std::endl;  		s.close(); diff --git a/indra/win_crash_logger/llcrashloggerwindows.cpp b/indra/win_crash_logger/llcrashloggerwindows.cpp index 167acf6ac7..267224a79b 100644 --- a/indra/win_crash_logger/llcrashloggerwindows.cpp +++ b/indra/win_crash_logger/llcrashloggerwindows.cpp @@ -377,7 +377,7 @@ bool LLCrashLoggerWindows::initCrashServer()  	std::wstring wpipe_name;  	wpipe_name = mCrashReportPipeStr + std::wstring(wstringize(mPID)); -	std::wstring wdump_path( wstringize(dump_path) ); +	std::wstring wdump_path(utf8str_to_utf16str(dump_path));  	//Pipe naming conventions:  http://msdn.microsoft.com/en-us/library/aa365783%28v=vs.85%29.aspx  	mCrashHandler = new CrashGenerationServer( wpipe_name, diff --git a/indra/win_crash_logger/win_crash_logger.cpp b/indra/win_crash_logger/win_crash_logger.cpp index 7466dbb766..58746eba02 100644 --- a/indra/win_crash_logger/win_crash_logger.cpp +++ b/indra/win_crash_logger/win_crash_logger.cpp @@ -29,15 +29,26 @@  #include <stdlib.h>  #include "llcrashloggerwindows.h" +#ifdef _UNICODE +int APIENTRY wWinMain(HINSTANCE hInstance, +                      HINSTANCE hPrevInstance, +                      LPWSTR    lpCmdLine, +                      int       nCmdShow) +#else  int APIENTRY WinMain(HINSTANCE hInstance,                       HINSTANCE hPrevInstance,                       LPSTR     lpCmdLine,                       int       nCmdShow) +#endif //_UNICODE  {  	LL_INFOS() << "Starting crash reporter with args" << &lpCmdLine << LL_ENDL;  	LLCrashLoggerWindows app;  	app.setHandle(hInstance); +#ifdef _UNICODE +	app.parseCommandOptions(__argc, __wargv); +#else  	app.parseCommandOptions(__argc, __argv); +#endif //_UNICODE  	LLSD options = LLApp::instance()->getOptionData(                     LLApp::PRIORITY_COMMAND_LINE); | 
