diff options
Diffstat (limited to 'indra')
46 files changed, 506 insertions, 424 deletions
| diff --git a/indra/llcommon/llavatarname.cpp b/indra/llcommon/llavatarname.cpp index b1ec9e9875..ad1845d387 100644 --- a/indra/llcommon/llavatarname.cpp +++ b/indra/llcommon/llavatarname.cpp @@ -48,7 +48,7 @@ LLAvatarName::LLAvatarName()  	mLegacyFirstName(),  	mLegacyLastName(),  	mIsDisplayNameDefault(false), -	mIsDummy(false), +	mIsTemporaryName(false),  	mExpires(F64_MAX),  	mNextUpdate(0.0)  { } diff --git a/indra/llcommon/llavatarname.h b/indra/llcommon/llavatarname.h index 145aeccd35..ba258d6d52 100644 --- a/indra/llcommon/llavatarname.h +++ b/indra/llcommon/llavatarname.h @@ -79,7 +79,7 @@ public:  	// Under error conditions, we may insert "dummy" records with  	// names like "???" into caches as placeholders.  These can be  	// shown in UI, but are not serialized. -	bool mIsDummy; +	bool mIsTemporaryName;  	// Names can change, so need to keep track of when name was  	// last checked. diff --git a/indra/llimage/llpngwrapper.cpp b/indra/llimage/llpngwrapper.cpp index fe737e2072..2cc7d3c460 100644 --- a/indra/llimage/llpngwrapper.cpp +++ b/indra/llimage/llpngwrapper.cpp @@ -50,8 +50,6 @@ LLPngWrapper::LLPngWrapper()  	  mCompressionType( 0 ),  	  mFilterMethod( 0 ),  	  mFinalSize( 0 ), -	  mHasBKGD(false), -	  mBackgroundColor(),  	  mGamma(0.f)  {  } @@ -111,9 +109,9 @@ void LLPngWrapper::writeFlush(png_structp png_ptr)  }  // Read the PNG file using the libpng.  The low-level interface is used here -// because we want to do various transformations (including setting the -// matte background if any, and applying gama) which can't be done with -// the high-level interface. The scanline also begins at the bottom of +// because we want to do various transformations (including applying gama) +// which can't be done with the high-level interface. +// The scanline also begins at the bottom of  // the image (per SecondLife conventions) instead of at the top, so we  // must assign row-pointers in "reverse" order.  BOOL LLPngWrapper::readPng(U8* src, LLImageRaw* rawImage, ImageInfo *infop) @@ -201,8 +199,7 @@ void LLPngWrapper::normalizeImage()  	//		2. Convert grayscales to RGB  	//		3. Create alpha layer from transparency  	//		4. Ensure 8-bpp for all images -	//		5. Apply background matte if any -	//		6. Set (or guess) gamma +	//		5. Set (or guess) gamma  	if (mColorType == PNG_COLOR_TYPE_PALETTE)  	{ @@ -229,12 +226,6 @@ void LLPngWrapper::normalizeImage()  	{  		png_set_strip_16(mReadPngPtr);  	} -	mHasBKGD = png_get_bKGD(mReadPngPtr, mReadInfoPtr, &mBackgroundColor); -	if (mHasBKGD) -	{ -		png_set_background(mReadPngPtr, mBackgroundColor, -			PNG_BACKGROUND_GAMMA_FILE, 1, 1.0); -	}  #if LL_DARWIN  	const F64 SCREEN_GAMMA = 1.8; @@ -261,7 +252,6 @@ void LLPngWrapper::updateMetaData()      mBitDepth = png_get_bit_depth(mReadPngPtr, mReadInfoPtr);      mColorType = png_get_color_type(mReadPngPtr, mReadInfoPtr);  	mChannels = png_get_channels(mReadPngPtr, mReadInfoPtr); -	mHasBKGD = png_get_bKGD(mReadPngPtr, mReadInfoPtr, &mBackgroundColor);  }  // Method to write raw image into PNG at dest. The raw scanline begins diff --git a/indra/llimage/llpngwrapper.h b/indra/llimage/llpngwrapper.h index 47a4207d66..739f435996 100644 --- a/indra/llimage/llpngwrapper.h +++ b/indra/llimage/llpngwrapper.h @@ -88,9 +88,6 @@ private:  	U32 mFinalSize; -	bool mHasBKGD; -	png_color_16p mBackgroundColor; -  	F64 mGamma;  	std::string mErrorMessage; diff --git a/indra/llmessage/llavatarnamecache.cpp b/indra/llmessage/llavatarnamecache.cpp index 03c28eb2a5..767001b633 100644 --- a/indra/llmessage/llavatarnamecache.cpp +++ b/indra/llmessage/llavatarnamecache.cpp @@ -81,8 +81,11 @@ namespace LLAvatarNameCache  	// only need per-frame timing resolution  	LLFrameTimer sRequestTimer; -	// Periodically clean out expired entries from the cache -	//LLFrameTimer sEraseExpiredTimer; +    /// Maximum time an unrefreshed cache entry is allowed +    const F64 MAX_UNREFRESHED_TIME = 20.0 * 60.0; + +    /// Time when unrefreshed cached names were checked last +    static F64 sLastExpireCheck;  	//-----------------------------------------------------------------------  	// Internal methods @@ -99,8 +102,9 @@ namespace LLAvatarNameCache  	// Legacy name system callback  	void legacyNameCallback(const LLUUID& agent_id, -		const std::string& full_name, -		bool is_group); +							const std::string& full_name, +							bool is_group +							);  	void requestNamesViaLegacy(); @@ -117,7 +121,7 @@ namespace LLAvatarNameCache  	bool isRequestPending(const LLUUID& agent_id);  	// Erase expired names from cache -	void eraseExpired(); +	void eraseUnrefreshed();  	bool expirationFromCacheControl(LLSD headers, F64 *expires);  } @@ -187,6 +191,7 @@ public:  	{  		// Pull expiration out of headers if available  		F64 expires = LLAvatarNameCache::nameExpirationFromHeaders(mHeaders); +		F64 now = LLFrameTimer::getTotalSeconds();  		LLSD agents = content["agents"];  		LLSD::array_const_iterator it = agents.beginArray(); @@ -207,84 +212,91 @@ public:  				av_name.mDisplayName = av_name.mUsername;  			} +			LL_DEBUGS("AvNameCache") << "LLAvatarNameResponder::result for " << agent_id << " " +									 << "user '" << av_name.mUsername << "' " +									 << "display '" << av_name.mDisplayName << "' " +									 << "expires in " << expires - now << " seconds" +									 << LL_ENDL; +			  			// cache it and fire signals  			LLAvatarNameCache::processName(agent_id, av_name, true);  		}  		// Same logic as error response case  		LLSD unresolved_agents = content["bad_ids"]; -		if (unresolved_agents.size() > 0) +		S32  num_unresolved = unresolved_agents.size(); +		if (num_unresolved > 0)  		{ -			const std::string DUMMY_NAME("\?\?\?"); -			LLAvatarName av_name; -			av_name.mUsername = DUMMY_NAME; -			av_name.mDisplayName = DUMMY_NAME; -			av_name.mIsDisplayNameDefault = false; -			av_name.mIsDummy = true; -			av_name.mExpires = expires; - +            LL_WARNS("AvNameCache") << "LLAvatarNameResponder::result " << num_unresolved << " unresolved ids; " +                                    << "expires in " << expires - now << " seconds" +                                    << LL_ENDL;  			it = unresolved_agents.beginArray();  			for ( ; it != unresolved_agents.endArray(); ++it)  			{  				const LLUUID& agent_id = *it; -				// cache it and fire signals -				LLAvatarNameCache::processName(agent_id, av_name, true); + +				LL_WARNS("AvNameCache") << "LLAvatarNameResponder::result " +                                        << "failed id " << agent_id +                                        << LL_ENDL; + +                LLAvatarNameCache::handleAgentError(agent_id);  			}  		} -	} +        LL_DEBUGS("AvNameCache") << "LLAvatarNameResponder::result "  +                                 << LLAvatarNameCache::sCache.size() << " cached names" +                                 << LL_ENDL; +    }  	/*virtual*/ void error(U32 status, const std::string& reason)  	{  		// If there's an error, it might be caused by PeopleApi,  		// or when loading textures on startup and using a very slow  -		// network, this query may time out. Fallback to the legacy -		// cache.  - -		llwarns << "LLAvatarNameResponder error " << status << " " << reason << llendl; +		// network, this query may time out. +		// What we should do depends on whether or not we have a cached name +		LL_WARNS("AvNameCache") << "LLAvatarNameResponder::error " << status << " " << reason +								<< LL_ENDL; -		// Add dummy records for all agent IDs in this request +		// Add dummy records for any agent IDs in this request that we do not have cached already  		std::vector<LLUUID>::const_iterator it = mAgentIDs.begin();  		for ( ; it != mAgentIDs.end(); ++it)  		{  			const LLUUID& agent_id = *it; -			gCacheName->get(agent_id, false,  // legacy compatibility -						boost::bind(&LLAvatarNameCache::legacyNameCallback, -						_1, _2, _3)); -		} -	} - -	// Return time to retry a request that generated an error, based on -	// error type and headers.  Return value is seconds-since-epoch. -	F64 errorRetryTimestamp(S32 status) -	{ -		F64 now = LLFrameTimer::getTotalSeconds(); - -		// Retry-After takes priority -		LLSD retry_after = mHeaders["retry-after"]; -		if (retry_after.isDefined()) -		{ -			// We only support the delta-seconds type -			S32 delta_seconds = retry_after.asInteger(); -			if (delta_seconds > 0) -			{ -				// ...valid delta-seconds -				return now + F64(delta_seconds); -			} +			LLAvatarNameCache::handleAgentError(agent_id);  		} - -		// If no Retry-After, look for Cache-Control max-age -		F64 expires = 0.0; -		if (LLAvatarNameCache::expirationFromCacheControl(mHeaders, &expires)) -		{ -			return expires; -		} - -		// No information in header, make a guess -		const F64 DEFAULT_DELAY = 120.0; // 2 mintues -		return now + DEFAULT_DELAY;  	}  }; +// Provide some fallback for agents that return errors +void LLAvatarNameCache::handleAgentError(const LLUUID& agent_id) +{ +	std::map<LLUUID,LLAvatarName>::iterator existing = sCache.find(agent_id); +	if (existing == sCache.end()) +    { +        // there is no existing cache entry, so make a temporary name from legacy +        LL_WARNS("AvNameCache") << "LLAvatarNameCache get legacy for agent " +                                << agent_id << LL_ENDL; +        gCacheName->get(agent_id, false,  // legacy compatibility +                        boost::bind(&LLAvatarNameCache::legacyNameCallback, +                                    _1, _2, _3)); +    } +	else +    { +        // we have a chached (but probably expired) entry - since that would have +        // been returned by the get method, there is no need to signal anyone + +        // Clear this agent from the pending list +        LLAvatarNameCache::sPendingQueue.erase(agent_id); + +        const LLAvatarName& av_name = existing->second; +        LL_DEBUGS("AvNameCache") << "LLAvatarNameCache use cache for agent " +                                 << agent_id  +                                 << "user '" << av_name.mUsername << "' " +                                 << "display '" << av_name.mDisplayName << "' " +                                 << "expires in " << av_name.mExpires - LLFrameTimer::getTotalSeconds() << " seconds" +                                 << LL_ENDL; +    } +} +  void LLAvatarNameCache::processName(const LLUUID& agent_id,  									const LLAvatarName& av_name,  									bool add_to_cache) @@ -326,6 +338,7 @@ void LLAvatarNameCache::requestNamesViaCapability()  	std::vector<LLUUID> agent_ids;  	agent_ids.reserve(128); +	U32 ids = 0;  	ask_queue_t::const_iterator it = sAskQueue.begin();  	for ( ; it != sAskQueue.end(); ++it)  	{ @@ -336,11 +349,13 @@ void LLAvatarNameCache::requestNamesViaCapability()  			// ...starting new request  			url += sNameLookupURL;  			url += "?ids="; +			ids = 1;  		}  		else  		{  			// ...continuing existing request  			url += "&ids="; +			ids++;  		}  		url += agent_id.asString();  		agent_ids.push_back(agent_id); @@ -350,8 +365,10 @@ void LLAvatarNameCache::requestNamesViaCapability()  		if (url.size() > NAME_URL_SEND_THRESHOLD)  		{ -			//llinfos << "requestNames " << url << llendl; -			LLHTTPClient::get(url, new LLAvatarNameResponder(agent_ids));//, LLSD(), 10.0f); +			LL_DEBUGS("AvNameCache") << "LLAvatarNameCache::requestNamesViaCapability first " +									 << ids << " ids" +									 << LL_ENDL; +			LLHTTPClient::get(url, new LLAvatarNameResponder(agent_ids));  			url.clear();  			agent_ids.clear();  		} @@ -359,8 +376,10 @@ void LLAvatarNameCache::requestNamesViaCapability()  	if (!url.empty())  	{ -		//llinfos << "requestNames " << url << llendl; -		LLHTTPClient::get(url, new LLAvatarNameResponder(agent_ids));//, LLSD(), 10.0f); +		LL_DEBUGS("AvNameCache") << "LLAvatarNameCache::requestNamesViaCapability all " +								 << ids << " ids" +								 << LL_ENDL; +		LLHTTPClient::get(url, new LLAvatarNameResponder(agent_ids));  		url.clear();  		agent_ids.clear();  	} @@ -376,6 +395,11 @@ void LLAvatarNameCache::legacyNameCallback(const LLUUID& agent_id,  	// Construct a dummy record for this name.  By convention, SLID is blank  	// Never expires, but not written to disk, so lasts until end of session.  	LLAvatarName av_name; +	LL_DEBUGS("AvNameCache") << "LLAvatarNameCache::legacyNameCallback " +							 << "agent " << agent_id << " " +							 << "full name '" << full_name << "'" +							 << ( is_group ? " [group]" : "" ) +							 << LL_ENDL;  	buildLegacyName(full_name, &av_name);  	// Don't add to cache, the data already exists in the legacy name system @@ -397,6 +421,8 @@ void LLAvatarNameCache::requestNamesViaLegacy()  		// invoked below.  This should never happen in practice.  		sPendingQueue[agent_id] = now; +		LL_DEBUGS("AvNameCache") << "LLAvatarNameCache::requestNamesViaLegacy agent " << agent_id << LL_ENDL; +  		gCacheName->get(agent_id, false,  // legacy compatibility  			boost::bind(&LLAvatarNameCache::legacyNameCallback,  				_1, _2, _3)); @@ -435,21 +461,24 @@ void LLAvatarNameCache::importFile(std::istream& istr)  		av_name.fromLLSD( it->second );  		sCache[agent_id] = av_name;  	} -	// entries may have expired since we last ran the viewer, just -	// clean them out now -	eraseExpired(); -	llinfos << "loaded " << sCache.size() << llendl; +    LL_INFOS("AvNameCache") << "loaded " << sCache.size() << LL_ENDL; + +	// Some entries may have expired since the cache was stored, +    // but they will be flushed in the first call to eraseUnrefreshed +    // from LLAvatarNameResponder::idle  }  void LLAvatarNameCache::exportFile(std::ostream& ostr)  {  	LLSD agents; +	F64 max_unrefreshed = LLFrameTimer::getTotalSeconds() - MAX_UNREFRESHED_TIME;  	cache_t::const_iterator it = sCache.begin();  	for ( ; it != sCache.end(); ++it)  	{  		const LLUUID& agent_id = it->first;  		const LLAvatarName& av_name = it->second; -		if (!av_name.mIsDummy) +		// Do not write temporary or expired entries to the stored cache +		if (!av_name.mIsTemporaryName && av_name.mExpires >= max_unrefreshed)  		{  			// key must be a string  			agents[agent_id.asString()] = av_name.asLLSD(); @@ -484,62 +513,63 @@ void LLAvatarNameCache::idle()  	//	return;  	//} -	// Must be large relative to above - -	// No longer deleting expired entries, just re-requesting in the get -	// this way first synchronous get call on an expired entry won't return -	// legacy name.  LF - -	//const F32 ERASE_EXPIRED_TIMEOUT = 60.f; // seconds -	//if (sEraseExpiredTimer.checkExpirationAndReset(ERASE_EXPIRED_TIMEOUT)) -	//{ -	//	eraseExpired(); -	//} - -	if (sAskQueue.empty()) +	if (!sAskQueue.empty())  	{ -		return; +        if (useDisplayNames()) +        { +            requestNamesViaCapability(); +        } +        else +        { +            // ...fall back to legacy name cache system +            requestNamesViaLegacy(); +        }  	} -	if (useDisplayNames()) -	{ -		requestNamesViaCapability(); -	} -	else -	{ -		// ...fall back to legacy name cache system -		requestNamesViaLegacy(); -	} +    // erase anything that has not been refreshed for more than MAX_UNREFRESHED_TIME +    eraseUnrefreshed();  }  bool LLAvatarNameCache::isRequestPending(const LLUUID& agent_id)  { +	bool isPending = false;  	const F64 PENDING_TIMEOUT_SECS = 5.0 * 60.0; -	F64 now = LLFrameTimer::getTotalSeconds(); -	F64 expire_time = now - PENDING_TIMEOUT_SECS;  	pending_queue_t::const_iterator it = sPendingQueue.find(agent_id);  	if (it != sPendingQueue.end())  	{ -		bool request_expired = (it->second < expire_time); -		return !request_expired; +		// in the list of requests in flight, retry if too old +		F64 expire_time = LLFrameTimer::getTotalSeconds() - PENDING_TIMEOUT_SECS; +		isPending = (it->second > expire_time);  	} -	return false; +	return isPending;  } -void LLAvatarNameCache::eraseExpired() +void LLAvatarNameCache::eraseUnrefreshed()  {  	F64 now = LLFrameTimer::getTotalSeconds(); -	cache_t::iterator it = sCache.begin(); -	while (it != sCache.end()) -	{ -		cache_t::iterator cur = it; -		++it; -		const LLAvatarName& av_name = cur->second; -		if (av_name.mExpires < now) -		{ -			sCache.erase(cur); -		} +	F64 max_unrefreshed = now - MAX_UNREFRESHED_TIME; + +    if (!sLastExpireCheck || sLastExpireCheck < max_unrefreshed) +    { +        sLastExpireCheck = now; +        cache_t::iterator it = sCache.begin(); +        while (it != sCache.end()) +        { +            cache_t::iterator cur = it; +            ++it; +            const LLAvatarName& av_name = cur->second; +            if (av_name.mExpires < max_unrefreshed) +            { +                const LLUUID& agent_id = it->first; +                LL_DEBUGS("AvNameCache") << agent_id  +                                         << " user '" << av_name.mUsername << "' " +                                         << "expired " << now - av_name.mExpires << " secs ago" +                                         << LL_ENDL; +                sCache.erase(cur); +            } +        } +        LL_INFOS("AvNameCache") << sCache.size() << " cached avatar names" << LL_ENDL;  	}  } @@ -550,8 +580,11 @@ void LLAvatarNameCache::buildLegacyName(const std::string& full_name,  	av_name->mUsername = "";  	av_name->mDisplayName = full_name;  	av_name->mIsDisplayNameDefault = true; -	av_name->mIsDummy = true; -	av_name->mExpires = F64_MAX; +	av_name->mIsTemporaryName = true; +	av_name->mExpires = F64_MAX; // not used because these are not cached +	LL_DEBUGS("AvNameCache") << "LLAvatarNameCache::buildLegacyName " +							 << full_name +							 << LL_ENDL;  }  // fills in av_name if it has it in the cache, even if expired (can check expiry time) @@ -574,6 +607,9 @@ bool LLAvatarNameCache::get(const LLUUID& agent_id, LLAvatarName *av_name)  				{  					if (!isRequestPending(agent_id))  					{ +						LL_DEBUGS("AvNameCache") << "LLAvatarNameCache::get " +												 << "refresh agent " << agent_id +												 << LL_ENDL;  						sAskQueue.insert(agent_id);  					}  				} @@ -595,6 +631,9 @@ bool LLAvatarNameCache::get(const LLUUID& agent_id, LLAvatarName *av_name)  	if (!isRequestPending(agent_id))  	{ +		LL_DEBUGS("AvNameCache") << "LLAvatarNameCache::get " +								 << "queue request for agent " << agent_id +								 << LL_ENDL;  		sAskQueue.insert(agent_id);  	} @@ -627,7 +666,6 @@ void LLAvatarNameCache::get(const LLUUID& agent_id, callback_slot_t slot)  				{  					// ...name already exists in cache, fire callback now  					fireSignal(agent_id, slot, av_name); -  					return;  				}  			} @@ -723,6 +761,9 @@ F64 LLAvatarNameCache::nameExpirationFromHeaders(LLSD headers)  bool LLAvatarNameCache::expirationFromCacheControl(LLSD headers, F64 *expires)  { +	bool fromCacheControl = false; +	F64 now = LLFrameTimer::getTotalSeconds(); +  	// Allow the header to override the default  	LLSD cache_control_header = headers["cache-control"];  	if (cache_control_header.isDefined()) @@ -731,12 +772,16 @@ bool LLAvatarNameCache::expirationFromCacheControl(LLSD headers, F64 *expires)  		std::string cache_control = cache_control_header.asString();  		if (max_age_from_cache_control(cache_control, &max_age))  		{ -			F64 now = LLFrameTimer::getTotalSeconds();  			*expires = now + (F64)max_age; -			return true; +			fromCacheControl = true;  		}  	} -	return false; +	LL_DEBUGS("AvNameCache") +		<< ( fromCacheControl ? "expires based on cache control " : "default expiration " ) +		<< "in " << *expires - now << " seconds" +		<< LL_ENDL; +	 +	return fromCacheControl;  } diff --git a/indra/llmessage/llavatarnamecache.h b/indra/llmessage/llavatarnamecache.h index 8f21ace96a..59c1329ffa 100644 --- a/indra/llmessage/llavatarnamecache.h +++ b/indra/llmessage/llavatarnamecache.h @@ -82,6 +82,9 @@ namespace LLAvatarNameCache  	void erase(const LLUUID& agent_id); +    /// Provide some fallback for agents that return errors +	void handleAgentError(const LLUUID& agent_id); +  	// Force a re-fetch of the most recent data, but keep the current  	// data in cache  	void fetch(const LLUUID& agent_id); diff --git a/indra/llui/llnotifications.cpp b/indra/llui/llnotifications.cpp index cd0f0e36b0..cc9edfcdea 100644 --- a/indra/llui/llnotifications.cpp +++ b/indra/llui/llnotifications.cpp @@ -1367,7 +1367,6 @@ LLNotifications::TemplateNames LLNotifications::getTemplateNames() const  typedef std::map<std::string, std::string> StringMap;  void replaceSubstitutionStrings(LLXMLNodePtr node, StringMap& replacements)  { -	//llwarns << "replaceSubstitutionStrings" << llendl;  	// walk the list of attributes looking for replacements  	for (LLXMLAttribList::iterator it=node->mAttributes.begin();  		 it != node->mAttributes.end(); ++it) @@ -1381,13 +1380,12 @@ void replaceSubstitutionStrings(LLXMLNodePtr node, StringMap& replacements)  			if (found != replacements.end())  			{  				replacement = found->second; -				//llwarns << "replaceSubstituionStrings: value: " << value << " repl: " << replacement << llendl; - +				lldebugs << "replaceSubstitutionStrings: value: \"" << value << "\" repl: \"" << replacement << "\"." << llendl;  				it->second->setValue(replacement);  			}  			else  			{ -				llwarns << "replaceSubstituionStrings FAILURE: value: " << value << " repl: " << replacement << llendl; +				llwarns << "replaceSubstitutionStrings FAILURE: could not find replacement \"" << value << "\"." << llendl;  			}  		}  	} diff --git a/indra/newview/app_settings/lindenlab.pem b/indra/newview/app_settings/lindenlab.pem index cf88d0e047..eddae0426d 100644 --- a/indra/newview/app_settings/lindenlab.pem +++ b/indra/newview/app_settings/lindenlab.pem @@ -24,4 +24,74 @@ xA39CIJ65Zozs28Eg1aV9/Y+Of7TnWhW+U3J3/wD/GghaAGiKK6vMn9gJBIdBX/9  e6ef37VGyiOEFFjnUIbuk0RWty0orN76q/lI/xjCi15XSA/VSq2j4vmnwfZcPTDu  glmQ1A==  -----END CERTIFICATE----- - +-----BEGIN CERTIFICATE----- +MIIEkDCCA3igAwIBAgICTSUwDQYJKoZIhvcNAQEFBQAwQDELMAkGA1UEBhMCVVMx +FzAVBgNVBAoTDkdlb1RydXN0LCBJbmMuMRgwFgYDVQQDEw9HZW9UcnVzdCBTU0wg +Q0EwHhcNMTAxMjIwMTkxMTI2WhcNMTIwMjIxMTI1NDAzWjCBnzEpMCcGA1UEBRMg +UkMteW9jbXIwdXRmRTdOMVBlaHJHQXdqL0lNc2hJZS0xCzAJBgNVBAYTAlVTMRMw +EQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1TYW4gRnJhbmNpc2NvMR0wGwYD +VQQKExRMaW5kZW4gUmVzZWFyY2ggSW5jLjEZMBcGA1UEAwwQKi5zZWNvbmRsaWZl +LmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAN/VCCu1SZ5x4vNp +XZZ8r3lzqeLwjxVZfMSQCKM4lV5DFbqiZMMBto4Y/ib7i0audzuTDnImCLsfzlTu +7iZLoJNy42/43Rq4xtaDZ7joxALFmzXUKEipgHiTTbAbLQNCS4wPXts3tScODVZY +/mhlmXdlLuGxJbqoyOEP6NEQbgXWDCKDERnAEG/FJBVHKyBfg3abrrIuQNwYCKCS +2OZ5Z5MveGmY4tSKUOOi/c0vV9HsanQn/ymybZjxR5Kmb1CvQr7VVtbpR1MhlGkc +sfJz1NFIFxdXkUggIny+XSG1dAAJRFFumyRM+X/eh0NHNmAI14JJ43hB6Zw3dzzl +An9BSeECAwEAAaOCATIwggEuMB8GA1UdIwQYMBaAFEJ5VBthzVUrPmPVPEhX9Z/7 +Rc5KMA4GA1UdDwEB/wQEAwIFoDAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUH +AwIwKwYDVR0RBCQwIoIQKi5zZWNvbmRsaWZlLmNvbYIOc2Vjb25kbGlmZS5jb20w +PQYDVR0fBDYwNDAyoDCgLoYsaHR0cDovL2d0c3NsLWNybC5nZW90cnVzdC5jb20v +Y3Jscy9ndHNzbC5jcmwwHQYDVR0OBBYEFK9UTMkc4Fh/Ug4fVs6UVhxP6my0MAwG +A1UdEwEB/wQCMAAwQwYIKwYBBQUHAQEENzA1MDMGCCsGAQUFBzAChidodHRwOi8v +Z3Rzc2wtYWlhLmdlb3RydXN0LmNvbS9ndHNzbC5jcnQwDQYJKoZIhvcNAQEFBQAD +ggEBACIR9yggGHDcZ60AMNdFmZ8XJeahTuv6q2X/It2JxqSQp5BVQUei0NGIYYOt +yg0JFBZn5KqXiQ5Zz84K4hdvh/6grCEAn4v37sozSbkeZ92Lec8NOZR42HfYIOCo +Hx9q7CNRxdhv6ehV4LekaRBxrtp5etVsIDaWvRZEswCWl46VuLrfjcpauj6DAdOQ +FfPVAW+4nPgLr8KapZMnXYnabIwrj9DQLQ88w/D7durenu/SYJEahWW9mb++n9is +eMjyuyzYW0PTUBTaDsj+2ZmHJtoR1tBiLqh0Q62UQnmDgsf5SK5PTb8jnta/1SvN +3pirsuvjMPV19zuH6b9NpJfXfd0= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDfTCCAuagAwIBAgIDErvmMA0GCSqGSIb3DQEBBQUAME4xCzAJBgNVBAYTAlVT +MRAwDgYDVQQKEwdFcXVpZmF4MS0wKwYDVQQLEyRFcXVpZmF4IFNlY3VyZSBDZXJ0 +aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDIwNTIxMDQwMDAwWhcNMTgwODIxMDQwMDAw +WjBCMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UE +AxMSR2VvVHJ1c3QgR2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB +CgKCAQEA2swYYzD99BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9m +OSm9BXiLnTjoBbdqfnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIu +T8rxh0PBFpVXLVDviS2Aelet8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6c +JmTM386DGXHKTubU1XupGc1V3sjs0l44U+VcT4wt/lAjNvxm5suOpDkZALeVAjmR +Cw7+OC7RHQWa9k0+bw8HHa8sHo9gOeL6NlMTOdReJivbPagUvTLrGAMoUgRx5asz +PeE4uwc2hGKceeoWMPRfwCvocWvk+QIDAQABo4HwMIHtMB8GA1UdIwQYMBaAFEjm +aPkr0rKV10fYIyAQTzOYkJ/UMB0GA1UdDgQWBBTAephojYn7qwVkDBF9qn1luMrM +TjAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjA6BgNVHR8EMzAxMC+g +LaArhilodHRwOi8vY3JsLmdlb3RydXN0LmNvbS9jcmxzL3NlY3VyZWNhLmNybDBO +BgNVHSAERzBFMEMGBFUdIAAwOzA5BggrBgEFBQcCARYtaHR0cHM6Ly93d3cuZ2Vv +dHJ1c3QuY29tL3Jlc291cmNlcy9yZXBvc2l0b3J5MA0GCSqGSIb3DQEBBQUAA4GB +AHbhEm5OSxYShjAGsoEIz/AIx8dxfmbuwu3UOx//8PDITtZDOLC5MH0Y0FWDomrL +NhGc6Ehmo21/uBPUR/6LWlxz/K7ZGzIZOKuXNBSqltLroxwUCEm2u+WR74M26x1W +b8ravHNjkOR/ez4iyz0H7V84dJzjA1BOoa+Y7mHyhD8S +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIID2TCCAsGgAwIBAgIDAjbQMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT +MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i +YWwgQ0EwHhcNMTAwMjE5MjIzOTI2WhcNMjAwMjE4MjIzOTI2WjBAMQswCQYDVQQG +EwJVUzEXMBUGA1UEChMOR2VvVHJ1c3QsIEluYy4xGDAWBgNVBAMTD0dlb1RydXN0 +IFNTTCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJCzgMHk5Uat +cGA9uuUU3Z6KXot1WubKbUGlI+g5hSZ6p1V3mkihkn46HhrxJ6ujTDnMyz1Hr4Gu +FmpcN+9FQf37mpc8oEOdxt8XIdGKolbCA0mEEoE+yQpUYGa5jFTk+eb5lPHgX3UR +8im55IaisYmtph6DKWOy8FQchQt65+EuDa+kvc3nsVrXjAVaDktzKIt1XTTYdwvh +dGLicTBi2LyKBeUxY0pUiWozeKdOVSQdl+8a5BLGDzAYtDRN4dgjOyFbLTAZJQ50 +96QhS6CkIMlszZhWwPKoXz4mdaAN+DaIiixafWcwqQ/RmXAueOFRJq9VeiS+jDkN +d53eAsMMvR8CAwEAAaOB2TCB1jAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFEJ5 +VBthzVUrPmPVPEhX9Z/7Rc5KMB8GA1UdIwQYMBaAFMB6mGiNifurBWQMEX2qfWW4 +ysxOMBIGA1UdEwEB/wQIMAYBAf8CAQAwOgYDVR0fBDMwMTAvoC2gK4YpaHR0cDov +L2NybC5nZW90cnVzdC5jb20vY3Jscy9ndGdsb2JhbC5jcmwwNAYIKwYBBQUHAQEE +KDAmMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5nZW90cnVzdC5jb20wDQYJKoZI +hvcNAQEFBQADggEBANTvU4ToGr2hiwTAqfVfoRB4RV2yV2pOJMtlTjGXkZrUJPji +J2ZwMZzBYlQG55cdOprApClICq8kx6jEmlTBfEx4TCtoLF0XplR4TEbigMMfOHES +0tdT41SFULgCy+5jOvhWiU1Vuy7AyBh3hjELC3DwfjWDpCoTZFZnNF0WX3OsewYk +2k9QbSqr0E1TQcKOu3EDSSmGGM8hQkx0YlEVxW+o78Qn5Rsz3VqI138S0adhJR/V +4NwdzxoQ2KDLX4z6DOW/cf/lXUQdpj6HR/oaToODEj+IZpWYeZqF6wJHzSXj8gYE +TpnKXKBuervdo5AaRTPvvz7SBMS24CqFZUE+ENQ= +-----END CERTIFICATE----- diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index bc181b5f8b..304ba15d07 100755 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -12837,16 +12837,5 @@        <key>Value</key>        <string>name</string>      </map> -    <key>ReleaseNotesURL</key> -    <map> -      <key>Comment</key> -      <string>Release notes URL template</string> -      <key>Persist</key> -      <integer>1</integer> -      <key>Type</key> -      <string>String</string> -      <key>Value</key> -      <string>http://secondlife.com/app/releasenotes/?channel=[CHANNEL]&version=[VERSION]</string> -    </map>  </map>  </llsd> diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index 7e8c68632d..52f4e3c45e 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -475,8 +475,6 @@ static void settings_to_globals()  	gDebugWindowProc = gSavedSettings.getBOOL("DebugWindowProc");  	gShowObjectUpdates = gSavedSettings.getBOOL("ShowObjectUpdates");  	LLWorldMapView::sMapScale = gSavedSettings.getF32("MapScale"); - -	LLCubeMap::sUseCubeMaps = LLFeatureManager::getInstance()->isFeatureAvailable("RenderCubeMap");  }  static void settings_modify() @@ -858,6 +856,9 @@ bool LLAppViewer::init()  	gGLActive = TRUE;  	initWindow(); +	// initWindow also initializes the Feature List, so now we can initialize this global. +	LLCubeMap::sUseCubeMaps = LLFeatureManager::getInstance()->isFeatureAvailable("RenderCubeMap"); +  	// call all self-registered classes  	LLInitClassList::instance().fireCallbacks(); @@ -1416,16 +1417,6 @@ bool LLAppViewer::cleanup()  	}  	mPlugins.clear(); -	//---------------------------------------------- -	//this test code will be removed after the test -	//test manual call stack tracer -	if(gSavedSettings.getBOOL("QAMode")) -	{ -		LLError::LLCallStacks::print() ; -	} -	//end of the test code -	//---------------------------------------------- -  	//flag all elements as needing to be destroyed immediately  	// to ensure shutdown order  	LLMortician::setZealous(TRUE); @@ -3110,35 +3101,32 @@ void LLAppViewer::initMarkerFile()  	std::string llerror_marker_file = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, LLERROR_MARKER_FILE_NAME);  	std::string error_marker_file = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, ERROR_MARKER_FILE_NAME); -	  	if (LLAPRFile::isExist(mMarkerFileName, NULL, LL_APR_RB) && !anotherInstanceRunning())  	{  		gLastExecEvent = LAST_EXEC_FROZE;  		LL_INFOS("MarkerFile") << "Exec marker found: program froze on previous execution" << LL_ENDL;  	}     -      	if(LLAPRFile::isExist(logout_marker_file, NULL, LL_APR_RB))  	{ -		LL_INFOS("MarkerFile") << "Last exec LLError crashed, setting LastExecEvent to " << LAST_EXEC_LLERROR_CRASH << LL_ENDL;  		gLastExecEvent = LAST_EXEC_LOGOUT_FROZE; +		LL_INFOS("MarkerFile") << "Last exec LLError crashed, setting LastExecEvent to " << gLastExecEvent << LL_ENDL; +		LLAPRFile::remove(logout_marker_file);  	}  	if(LLAPRFile::isExist(llerror_marker_file, NULL, LL_APR_RB))  	{ -		llinfos << "Last exec LLError crashed, setting LastExecEvent to " << LAST_EXEC_LLERROR_CRASH << llendl;  		if(gLastExecEvent == LAST_EXEC_LOGOUT_FROZE) gLastExecEvent = LAST_EXEC_LOGOUT_CRASH;  		else gLastExecEvent = LAST_EXEC_LLERROR_CRASH; +		LL_INFOS("MarkerFile") << "Last exec LLError crashed, setting LastExecEvent to " << gLastExecEvent << LL_ENDL; +		LLAPRFile::remove(llerror_marker_file);  	}  	if(LLAPRFile::isExist(error_marker_file, NULL, LL_APR_RB))  	{ -		LL_INFOS("MarkerFile") << "Last exec crashed, setting LastExecEvent to " << LAST_EXEC_OTHER_CRASH << LL_ENDL;  		if(gLastExecEvent == LAST_EXEC_LOGOUT_FROZE) gLastExecEvent = LAST_EXEC_LOGOUT_CRASH;  		else gLastExecEvent = LAST_EXEC_OTHER_CRASH; +		LL_INFOS("MarkerFile") << "Last exec crashed, setting LastExecEvent to " << gLastExecEvent << LL_ENDL; +		LLAPRFile::remove(error_marker_file);  	} -	 -	LLAPRFile::remove(logout_marker_file); -	LLAPRFile::remove(llerror_marker_file); -	LLAPRFile::remove(error_marker_file); -	 +  	// No new markers if another instance is running.  	if(anotherInstanceRunning())   	{ @@ -3780,6 +3768,7 @@ void LLAppViewer::loadNameCache()  	// display names cache  	std::string filename =  		gDirUtilp->getExpandedFilename(LL_PATH_CACHE, "avatar_name_cache.xml"); +	LL_INFOS("AvNameCache") << filename << LL_ENDL;  	llifstream name_cache_stream(filename);  	if(name_cache_stream.is_open())  	{ diff --git a/indra/newview/llcolorswatch.cpp b/indra/newview/llcolorswatch.cpp index 4a1ba6f1b5..6f02192d0a 100644 --- a/indra/newview/llcolorswatch.cpp +++ b/indra/newview/llcolorswatch.cpp @@ -319,7 +319,7 @@ void LLColorSwatchCtrl::onColorChanged ( void* data, EColorPickOp pick_op )  // This is called when the main floatercustomize panel is closed.  // Since this class has pointers up to its parents, we need to cleanup  // this class first in order to avoid a crash. -void LLColorSwatchCtrl::onParentFloaterClosed() +void LLColorSwatchCtrl::closeFloaterColorPicker()  {  	LLFloaterColorPicker* pickerp = (LLFloaterColorPicker*)mPickerHandle.get();  	if (pickerp) diff --git a/indra/newview/llcolorswatch.h b/indra/newview/llcolorswatch.h index cd859ea128..5bdd1712d2 100644 --- a/indra/newview/llcolorswatch.h +++ b/indra/newview/llcolorswatch.h @@ -100,7 +100,7 @@ public:  	/*virtual*/ void	setEnabled( BOOL enabled );  	static void		onColorChanged ( void* data, EColorPickOp pick_op = COLOR_CHANGE ); -	void			onParentFloaterClosed(); +	void			closeFloaterColorPicker();  protected:  	BOOL			mValid; diff --git a/indra/newview/llfeaturemanager.cpp b/indra/newview/llfeaturemanager.cpp index ca2ef5f5b8..4e16cc4217 100644 --- a/indra/newview/llfeaturemanager.cpp +++ b/indra/newview/llfeaturemanager.cpp @@ -290,11 +290,9 @@ BOOL LLFeatureManager::parseFeatureTable(std::string filename)  	mTableVersion = version;  	LLFeatureList *flp = NULL; -	while (!file.eof() && file.good()) +	while (file >> name)  	{  		char buffer[MAX_STRING];		 /*Flawfinder: ignore*/ - -		file >> name;  		if (name.substr(0,2) == "//")  		{ @@ -303,13 +301,6 @@ BOOL LLFeatureManager::parseFeatureTable(std::string filename)  			continue;  		} -		if (name.empty()) -		{ -			// This is a blank line -			file.getline(buffer, MAX_STRING); -			continue; -		} -  		if (name == "list")  		{  			if (flp) diff --git a/indra/newview/llfloatersettingsdebug.cpp b/indra/newview/llfloatersettingsdebug.cpp index 71882fbb83..07f5220ab7 100644 --- a/indra/newview/llfloatersettingsdebug.cpp +++ b/indra/newview/llfloatersettingsdebug.cpp @@ -178,7 +178,7 @@ void LLFloaterSettingsDebug::onClickDefault()  	if (controlp)  	{ -		controlp->resetToDefault(); +		controlp->resetToDefault(true);  		updateControl(controlp);  	}  } diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp index afd565bb26..9623554200 100644 --- a/indra/newview/llimview.cpp +++ b/indra/newview/llimview.cpp @@ -279,7 +279,7 @@ LLIMModel::LLIMSession::LLIMSession(const LLUUID& session_id, const std::string&  void LLIMModel::LLIMSession::onAdHocNameCache(const LLAvatarName& av_name)  { -	if (av_name.mIsDummy) +	if (av_name.mIsTemporaryName)  	{  		S32 separator_index = mName.rfind(" ");  		std::string name = mName.substr(0, separator_index); diff --git a/indra/newview/lllogininstance.cpp b/indra/newview/lllogininstance.cpp index d866db1829..33e051bfab 100644 --- a/indra/newview/lllogininstance.cpp +++ b/indra/newview/lllogininstance.cpp @@ -214,6 +214,9 @@ void MandatoryUpdateMachine::start(void)  			case LLUpdaterService::CHECKING_FOR_UPDATE:  				setCurrentState(new CheckingForUpdate(*this));  				break; +			case LLUpdaterService::TEMPORARY_ERROR: +				setCurrentState(new Error(*this)); +				break;  			case LLUpdaterService::DOWNLOADING:  				setCurrentState(new WaitingForDownload(*this));  				break; @@ -289,6 +292,7 @@ bool MandatoryUpdateMachine::CheckingForUpdate::onEvent(LLSD const & event)  			case LLUpdaterService::DOWNLOADING:  				mMachine.setCurrentState(new WaitingForDownload(mMachine));  				break; +			case LLUpdaterService::TEMPORARY_ERROR:  			case LLUpdaterService::UP_TO_DATE:  			case LLUpdaterService::TERMINAL:  			case LLUpdaterService::FAILURE: @@ -324,7 +328,7 @@ MandatoryUpdateMachine::Error::Error(MandatoryUpdateMachine & machine):  void MandatoryUpdateMachine::Error::enter(void)  {  	llinfos << "entering error" << llendl; -	LLNotificationsUtil::add("FailedUpdateInstall", LLSD(), LLSD(), boost::bind(&MandatoryUpdateMachine::Error::onButtonClicked, this, _1, _2)); +	LLNotificationsUtil::add("FailedRequiredUpdateInstall", LLSD(), LLSD(), boost::bind(&MandatoryUpdateMachine::Error::onButtonClicked, this, _1, _2));  } @@ -468,7 +472,6 @@ LLLoginInstance::LLLoginInstance() :  	mLoginModule(new LLLogin()),  	mNotifications(NULL),  	mLoginState("offline"), -	mUserInteraction(true),  	mSkipOptionalUpdate(false),  	mAttemptComplete(false),  	mTransferRate(0.0f), @@ -637,64 +640,57 @@ void LLLoginInstance::handleLoginFailure(const LLSD& event)  	LLSD response = event["data"];  	std::string reason_response = response["reason"].asString();  	std::string message_response = response["message"].asString(); -	if(mUserInteraction) +	// For the cases of critical message or TOS agreement, +	// start the TOS dialog. The dialog response will be handled +	// by the LLLoginInstance::handleTOSResponse() callback. +	// The callback intiates the login attempt next step, either  +	// to reconnect or to end the attempt in failure. +	if(reason_response == "tos")  	{ -		// For the cases of critical message or TOS agreement, -		// start the TOS dialog. The dialog response will be handled -		// by the LLLoginInstance::handleTOSResponse() callback. -		// The callback intiates the login attempt next step, either  -		// to reconnect or to end the attempt in failure. -		if(reason_response == "tos") -		{ -			LLSD data(LLSD::emptyMap()); -			data["message"] = message_response; -			data["reply_pump"] = TOS_REPLY_PUMP; -			gViewerWindow->setShowProgress(FALSE); -			LLFloaterReg::showInstance("message_tos", data); -			LLEventPumps::instance().obtain(TOS_REPLY_PUMP) -				.listen(TOS_LISTENER_NAME, -						boost::bind(&LLLoginInstance::handleTOSResponse,  -									this, _1, "agree_to_tos")); -		} -		else if(reason_response == "critical") -		{ -			LLSD data(LLSD::emptyMap()); -			data["message"] = message_response; -			data["reply_pump"] = TOS_REPLY_PUMP; -			if(response.has("error_code")) -			{ -				data["error_code"] = response["error_code"]; -			} -			if(response.has("certificate")) -			{ -				data["certificate"] = response["certificate"]; -			} -			 -			gViewerWindow->setShowProgress(FALSE); -			LLFloaterReg::showInstance("message_critical", data); -			LLEventPumps::instance().obtain(TOS_REPLY_PUMP) -				.listen(TOS_LISTENER_NAME, -						boost::bind(&LLLoginInstance::handleTOSResponse,  -									this, _1, "read_critical")); -		} -		else if(reason_response == "update" || gSavedSettings.getBOOL("ForceMandatoryUpdate")) +		LLSD data(LLSD::emptyMap()); +		data["message"] = message_response; +		data["reply_pump"] = TOS_REPLY_PUMP; +		gViewerWindow->setShowProgress(FALSE); +		LLFloaterReg::showInstance("message_tos", data); +		LLEventPumps::instance().obtain(TOS_REPLY_PUMP) +			.listen(TOS_LISTENER_NAME, +					boost::bind(&LLLoginInstance::handleTOSResponse,  +								this, _1, "agree_to_tos")); +	} +	else if(reason_response == "critical") +	{ +		LLSD data(LLSD::emptyMap()); +		data["message"] = message_response; +		data["reply_pump"] = TOS_REPLY_PUMP; +		if(response.has("error_code"))  		{ -			gSavedSettings.setBOOL("ForceMandatoryUpdate", FALSE); -			updateApp(true, message_response); +			data["error_code"] = response["error_code"];  		} -		else if(reason_response == "optional") +		if(response.has("certificate"))  		{ -			updateApp(false, message_response); +			data["certificate"] = response["certificate"];  		} -		else -		{	 -			attemptComplete(); -		}	 +		 +		gViewerWindow->setShowProgress(FALSE); +		LLFloaterReg::showInstance("message_critical", data); +		LLEventPumps::instance().obtain(TOS_REPLY_PUMP) +			.listen(TOS_LISTENER_NAME, +					boost::bind(&LLLoginInstance::handleTOSResponse,  +								this, _1, "read_critical"));  	} -	else // no user interaction +	else if(reason_response == "update" || gSavedSettings.getBOOL("ForceMandatoryUpdate"))  	{ -		attemptComplete(); +		gSavedSettings.setBOOL("ForceMandatoryUpdate", FALSE); +		updateApp(true, message_response);  	} +	else if(reason_response == "optional") +	{ +		updateApp(false, message_response); +	} +	else +	{	 +		attemptComplete(); +	}	  }  void LLLoginInstance::handleLoginSuccess(const LLSD& event) diff --git a/indra/newview/lllogininstance.h b/indra/newview/lllogininstance.h index b872d7d1b1..8b53431219 100644 --- a/indra/newview/lllogininstance.h +++ b/indra/newview/lllogininstance.h @@ -61,12 +61,6 @@ public:  	// Only valid when authSuccess == true.  	const F64 getLastTransferRateBPS() { return mTransferRate; } -		// Set whether this class will drive user interaction. -	// If not, login failures like 'need tos agreement' will  -	// end the login attempt. -	void setUserInteraction(bool state) { mUserInteraction = state; }  -	bool getUserInteraction() { return mUserInteraction; } -  	// Whether to tell login to skip optional update request.  	// False by default.  	void setSkipOptionalUpdate(bool state) { mSkipOptionalUpdate = state; } @@ -100,7 +94,6 @@ private:  	std::string mLoginState;  	LLSD mRequestData;  	LLSD mResponseData; -	bool mUserInteraction;   	bool mSkipOptionalUpdate;  	bool mAttemptComplete;  	F64 mTransferRate; diff --git a/indra/newview/llpaneleditwearable.cpp b/indra/newview/llpaneleditwearable.cpp index 90ed8b9e58..4a74b7925c 100644 --- a/indra/newview/llpaneleditwearable.cpp +++ b/indra/newview/llpaneleditwearable.cpp @@ -569,6 +569,7 @@ static void update_color_swatch_ctrl(LLPanelEditWearable* self, LLPanel* panel,  	if (color_swatch_ctrl)  	{  		color_swatch_ctrl->set(self->getWearable()->getClothesColor(entry->mTextureIndex)); +		color_swatch_ctrl->closeFloaterColorPicker();  	}  } diff --git a/indra/newview/llpanelgrouproles.cpp b/indra/newview/llpanelgrouproles.cpp index d1362d7922..3dbc637318 100644 --- a/indra/newview/llpanelgrouproles.cpp +++ b/indra/newview/llpanelgrouproles.cpp @@ -1843,7 +1843,8 @@ bool LLPanelGroupRolesSubTab::apply(std::string& mesg)  {  	lldebugs << "LLPanelGroupRolesSubTab::apply()" << llendl; -	saveRoleChanges(); +	saveRoleChanges(true); +  	LLGroupMgr::getInstance()->sendGroupRoleChanges(mGroupID);  	notifyObservers(); @@ -2022,7 +2023,7 @@ void LLPanelGroupRolesSubTab::handleRoleSelect()  		return;  	} -	saveRoleChanges(); +	saveRoleChanges(false);  	// Check if there is anything selected.  	LLScrollListItem* item = mRolesList->getFirstSelected(); @@ -2385,7 +2386,7 @@ void LLPanelGroupRolesSubTab::handleDeleteRole()  	notifyObservers();  } -void LLPanelGroupRolesSubTab::saveRoleChanges() +void LLPanelGroupRolesSubTab::saveRoleChanges(bool select_saved_role)  {  	LLGroupMgrGroupData* gdatap = LLGroupMgr::getInstance()->getGroupData(mGroupID); @@ -2400,13 +2401,23 @@ void LLPanelGroupRolesSubTab::saveRoleChanges()  		rd.mRoleDescription = mRoleDescription->getText();  		rd.mRoleTitle = mRoleTitle->getText(); +		S32 role_members_count = 0; +		if (mSelectedRole.isNull()) +		{ +			role_members_count = gdatap->mMemberCount; +		} +		else if(LLGroupRoleData* grd = get_ptr_in_map(gdatap->mRoles, mSelectedRole)) +		{ +			role_members_count = grd->getTotalMembersInRole(); +		} +  		gdatap->setRoleData(mSelectedRole,rd);  		mRolesList->deleteSingleItem(mRolesList->getItemIndex(mSelectedRole)); -		LLSD row = createRoleItem(mSelectedRole,rd.mRoleName,rd.mRoleTitle,0); +		LLSD row = createRoleItem(mSelectedRole,rd.mRoleName,rd.mRoleTitle,role_members_count);  		LLScrollListItem* item = mRolesList->addElement(row, ADD_BOTTOM, this); -		item->setSelected(TRUE); +		item->setSelected(select_saved_role);  		mHasRoleChange = FALSE;  	} diff --git a/indra/newview/llpanelgrouproles.h b/indra/newview/llpanelgrouproles.h index 270259c16f..a55e264150 100644 --- a/indra/newview/llpanelgrouproles.h +++ b/indra/newview/llpanelgrouproles.h @@ -257,7 +257,7 @@ public:  	static void onDeleteRole(void*);  	void handleDeleteRole(); -	void saveRoleChanges(); +	void saveRoleChanges(bool select_saved_role);  	virtual void setGroupID(const LLUUID& id);  protected: diff --git a/indra/newview/llpanellandmarks.cpp b/indra/newview/llpanellandmarks.cpp index e8c8273a9d..80f6862169 100644 --- a/indra/newview/llpanellandmarks.cpp +++ b/indra/newview/llpanellandmarks.cpp @@ -71,6 +71,7 @@ static void collapse_all_folders(LLFolderView* root_folder);  static void expand_all_folders(LLFolderView* root_folder);  static bool has_expanded_folders(LLFolderView* root_folder);  static bool has_collapsed_folders(LLFolderView* root_folder); +static void toggle_restore_menu(LLMenuGL* menu, BOOL visible, BOOL enabled);  /**   * Functor counting expanded and collapsed folders in folder view tree to know @@ -708,6 +709,9 @@ void LLLandmarksPanel::initListCommandsHandlers()  	mGearFolderMenu = LLUICtrlFactory::getInstance()->createFromFile<LLToggleableMenu>("menu_places_gear_folder.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());  	mMenuAdd = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_place_add_button.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance()); +	mGearLandmarkMenu->setVisibilityChangeCallback(boost::bind(&LLLandmarksPanel::onMenuVisibilityChange, this, _1, _2)); +	mGearFolderMenu->setVisibilityChangeCallback(boost::bind(&LLLandmarksPanel::onMenuVisibilityChange, this, _1, _2)); +  	mListCommands->childSetAction(ADD_BUTTON_NAME, boost::bind(&LLLandmarksPanel::showActionMenu, this, mMenuAdd, ADD_BUTTON_NAME));  } @@ -1079,6 +1083,60 @@ void LLLandmarksPanel::onCustomAction(const LLSD& userdata)  	{  		doActionOnCurSelectedLandmark(boost::bind(&LLLandmarksPanel::doCreatePick, this, _1));  	} +	else if ("restore" == command_name && mCurrentSelectedList) +	{ +		mCurrentSelectedList->doToSelected(userdata); +	} +} + +void LLLandmarksPanel::onMenuVisibilityChange(LLUICtrl* ctrl, const LLSD& param) +{ +	bool new_visibility = param["visibility"].asBoolean(); + +	// We don't have to update items visibility if the menu is hiding. +	if (!new_visibility) return; + +	BOOL are_any_items_in_trash = FALSE; +	BOOL are_all_items_in_trash = TRUE; + +	LLFolderView* root_folder_view = mCurrentSelectedList ? mCurrentSelectedList->getRootFolder() : NULL; +	if(root_folder_view) +	{ +		const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH); + +		std::set<LLUUID> selected_uuids = root_folder_view->getSelectionList(); + +		// Iterate through selected items to find out if any of these items are in Trash +		// or all the items are in Trash category. +		for (std::set<LLUUID>::const_iterator iter = selected_uuids.begin(); iter != selected_uuids.end(); ++iter) +		{ +			LLFolderViewItem* item = root_folder_view->getItemByID(*iter); + +			// If no item is found it might be a folder id. +			if (!item) +			{ +				item = root_folder_view->getFolderByID(*iter); +			} +			if (!item) continue; + +			LLFolderViewEventListener* listenerp = item->getListener(); +			if(!listenerp) continue; + +			// Trash category itself should not be included because it can't be +			// actually restored from trash. +			are_all_items_in_trash &= listenerp->isItemInTrash() && *iter != trash_id; + +			// If there are any selected items in Trash including the Trash category itself +			// we show "Restore Item" in context menu and hide other irrelevant items. +			are_any_items_in_trash |= listenerp->isItemInTrash(); +		} +	} + +	// Display "Restore Item" menu entry if at least one of the selected items +	// is in Trash or the Trash category itself is among selected items. +	// Hide other menu entries in this case. +	// Enable this menu entry only if all selected items are in the Trash category. +	toggle_restore_menu((LLMenuGL*)ctrl, are_any_items_in_trash, are_all_items_in_trash);  }  /* @@ -1414,4 +1472,31 @@ static bool has_collapsed_folders(LLFolderView* root_folder)  	return true;  } + +// Displays "Restore Item" context menu entry while hiding +// all other entries or vice versa. +// Sets "Restore Item" enabled state. +void toggle_restore_menu(LLMenuGL *menu, BOOL visible, BOOL enabled) +{ +	if (!menu) return; + +	const LLView::child_list_t *list = menu->getChildList(); +	for (LLView::child_list_t::const_iterator itor = list->begin(); +		 itor != list->end(); +		 ++itor) +	{ +		LLView *menu_item = (*itor); +		std::string name = menu_item->getName(); + +		if ("restore_item" == name) +		{ +			menu_item->setVisible(visible); +			menu_item->setEnabled(enabled); +		} +		else +		{ +			menu_item->setVisible(!visible); +		} +	} +}  // EOF diff --git a/indra/newview/llpanellandmarks.h b/indra/newview/llpanellandmarks.h index 8dcbca0440..b2f4e92473 100644 --- a/indra/newview/llpanellandmarks.h +++ b/indra/newview/llpanellandmarks.h @@ -129,6 +129,14 @@ private:  	void onCustomAction(const LLSD& command_name);  	/** +	 * Updates context menu depending on the selected items location. +	 * +	 * For items in Trash category the menu includes the "Restore Item" +	 * context menu entry. +	 */ +	void onMenuVisibilityChange(LLUICtrl* ctrl, const LLSD& param); + +	/**  	 * Determines if an item can be modified via context/gear menu.  	 *  	 * It validates Places Landmarks rules first. And then LLFolderView permissions. diff --git a/indra/newview/llpanellogin.cpp b/indra/newview/llpanellogin.cpp index c143aff2d4..8d3b1fd7a0 100644 --- a/indra/newview/llpanellogin.cpp +++ b/indra/newview/llpanellogin.cpp @@ -35,6 +35,7 @@  #include "llsecondlifeurls.h"  #include "v4color.h" +#include "llappviewer.h"  #include "llbutton.h"  #include "llcheckboxctrl.h"  #include "llcommandhandler.h"		// for secondlife:///app/login/ @@ -859,6 +860,13 @@ void LLPanelLogin::loadLoginPage()  	char* curl_grid = curl_escape(LLGridManager::getInstance()->getGridLabel().c_str(), 0);  	oStr << "&grid=" << curl_grid;  	curl_free(curl_grid); +	 +	// add OS info +	char * os_info = curl_escape(LLAppViewer::instance()->getOSInfo().getOSStringSimple().c_str(), 0); +	oStr << "&os=" << os_info; +	curl_free(os_info); +	 +	  	gViewerWindow->setMenuBackgroundColor(false, !LLGridManager::getInstance()->isInProductionGrid());  	gLoginMenuBarView->setBackgroundColor(gMenuBarView->getBackgroundColor()); diff --git a/indra/newview/llpanelobjectinventory.cpp b/indra/newview/llpanelobjectinventory.cpp index c4d1495a31..bfe6cab52f 100644 --- a/indra/newview/llpanelobjectinventory.cpp +++ b/indra/newview/llpanelobjectinventory.cpp @@ -766,22 +766,12 @@ BOOL LLTaskCategoryBridge::startDrag(EDragAndDropType* type, LLUUID* id) const  		LLViewerObject* object = gObjectList.findObject(mPanel->getTaskUUID());  		if(object)  		{ -			const LLInventoryItem *inv = dynamic_cast<LLInventoryItem*>(object->getInventoryObject(mUUID)); -			if (inv) +			const LLInventoryObject* cat = object->getInventoryObject(mUUID); +			if ( (cat) && (move_inv_category_world_to_agent(mUUID, LLUUID::null, FALSE)) )  			{ -				const LLPermissions& perm = inv->getPermissions(); -				bool can_copy = gAgent.allowOperation(PERM_COPY, perm, -														GP_OBJECT_MANIPULATE); -				if((can_copy && perm.allowTransferTo(gAgent.getID())) -				   || object->permYouOwner()) -//				   || gAgent.isGodlike()) - -				{ -					*type = LLViewerAssetType::lookupDragAndDropType(inv->getType()); - -					*id = inv->getUUID(); -					return TRUE; -				} +				*type = LLViewerAssetType::lookupDragAndDropType(cat->getType()); +				*id = mUUID; +				return TRUE;  			}  		}  	} diff --git a/indra/newview/llselectmgr.h b/indra/newview/llselectmgr.h index bb0afd74d0..85d8d3212d 100644 --- a/indra/newview/llselectmgr.h +++ b/indra/newview/llselectmgr.h @@ -236,7 +236,7 @@ public:  	{  		bool operator()(LLSelectNode* node);  	}; -	typedef boost::filter_iterator<is_root, list_t::iterator > valid_root_iterator; +	typedef boost::filter_iterator<is_valid_root, list_t::iterator > valid_root_iterator;  	valid_root_iterator valid_root_begin() { return valid_root_iterator(mList.begin(), mList.end()); }  	valid_root_iterator valid_root_end() { return valid_root_iterator(mList.end(), mList.end()); } diff --git a/indra/newview/llsidepanelappearance.cpp b/indra/newview/llsidepanelappearance.cpp index b316171604..363fe5f12b 100644 --- a/indra/newview/llsidepanelappearance.cpp +++ b/indra/newview/llsidepanelappearance.cpp @@ -185,7 +185,7 @@ void LLSidepanelAppearance::onVisibilityChange(const LLSD &new_visibility)  {  	LLSD visibility;  	visibility["visible"] = new_visibility.asBoolean(); -	visibility["reset_accordion"] = true; +	visibility["reset_accordion"] = false;  	updateToVisibility(visibility);  } diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp index 029a48480f..c6efaf4afe 100755 --- a/indra/newview/llstartup.cpp +++ b/indra/newview/llstartup.cpp @@ -981,7 +981,6 @@ bool idle_startup()  			login->setSkipOptionalUpdate(true);  		} -		login->setUserInteraction(show_connect_box);  		login->setSerialNumber(LLAppViewer::instance()->getSerialNumber());  		login->setLastExecEvent(gLastExecEvent);  		login->setUpdaterLauncher(boost::bind(&LLAppViewer::launchUpdater, LLAppViewer::instance())); diff --git a/indra/newview/lltexturecache.cpp b/indra/newview/lltexturecache.cpp index 6a213309a0..92080d1fd7 100644 --- a/indra/newview/lltexturecache.cpp +++ b/indra/newview/lltexturecache.cpp @@ -1858,8 +1858,22 @@ void LLTextureCache::removeCachedTexture(const LLUUID& id)  //called after mHeaderMutex is locked.  void LLTextureCache::removeEntry(S32 idx, Entry& entry, std::string& filename)  { + 	bool file_maybe_exists = true;	// Always attempt to remove when idx is invalid. +  	if(idx >= 0) //valid entry  	{ +		if (entry.mBodySize == 0)	// Always attempt to remove when mBodySize > 0. +		{ +		  if (LLAPRFile::isExist(filename, getLocalAPRFilePool()))		// Sanity check. Shouldn't exist when body size is 0. +		  { +			  LL_WARNS("TextureCache") << "Entry has body size of zero but file " << filename << " exists. Deleting this file, too." << LL_ENDL; +		  } +		  else +		  { +			  file_maybe_exists = false; +		  } +		} +  		entry.mImageSize = -1;  		entry.mBodySize = 0;  		mHeaderIDMap.erase(entry.mID); @@ -1869,7 +1883,10 @@ void LLTextureCache::removeEntry(S32 idx, Entry& entry, std::string& filename)  		mFreeList.insert(idx);	  	} -	LLAPRFile::remove(filename, getLocalAPRFilePool());		 +	if (file_maybe_exists) +	{ +		LLAPRFile::remove(filename, getLocalAPRFilePool());		 +	}  }  bool LLTextureCache::removeFromCache(const LLUUID& id) diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index a4b5143a02..ae8bd3f29a 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -171,31 +171,6 @@ const BOOL SCRIPT_QUESTION_IS_CAUTION[SCRIPT_PERMISSION_EOF] =  	FALSE	// ControlYourCamera  }; -// Extract channel and version from a string like "SL Web Viewer Beta 10.11.29.215604". -// (channel: "SL Web Viewer Beta", version: "10.11.29.215604") -static bool parse_version_info(const std::string& version_info, std::string& channel, std::string& ver) -{ -	size_t last_space = version_info.rfind(" "); -	channel = version_info; - -	if (last_space != std::string::npos) -	{ -		try -		{ -			ver = version_info.substr(last_space + 1); -			channel.replace(last_space, ver.length() + 1, ""); // strip version -		} -		catch (std::out_of_range) -		{ -			return false; -		} - -		return true; -	} - -	return false; -} -  bool friendship_offer_callback(const LLSD& notification, const LLSD& response)  {  	S32 option = LLNotificationsUtil::getSelectedOption(notification, response); @@ -3848,31 +3823,6 @@ void process_agent_movement_complete(LLMessageSystem* msg, void**)  		return;  	} -	if (!gLastVersionChannel.empty()) -	{ -		std::string url = regionp->getCapability("ServerReleaseNotes"); -		if (url.empty()) -		{ -			// The capability hasn't arrived yet or is not supported, -			// fall back to parsing server version channel. -			std::string channel, ver; -			if (!parse_version_info(version_channel, channel, ver)) -			{ -				llwarns << "Failed to parse server version channel (" << version_channel << ")" << llendl; -			} - -			url = gSavedSettings.getString("ReleaseNotesURL"); -			LLSD args; -			args["CHANNEL"] = LLWeb::escapeURL(channel); -			args["VERSION"] = LLWeb::escapeURL(ver); -			LLStringUtil::format(url, args); -		} - -		LLSD args; -		args["URL"] = url; -		LLNotificationsUtil::add("ServerVersionChanged", args); -	} -  	gLastVersionChannel = version_channel;  } diff --git a/indra/newview/skins/default/xui/da/notifications.xml b/indra/newview/skins/default/xui/da/notifications.xml index 593e686d4c..27024f4eaa 100644 --- a/indra/newview/skins/default/xui/da/notifications.xml +++ b/indra/newview/skins/default/xui/da/notifications.xml @@ -1580,9 +1580,6 @@ Klik på Acceptér for at deltage eller Afvis for at afvise invitationen. Klik p  	<notification name="VoiceCallGenericError">  		En fejl er opstået under forsøget på at koble sig på stemme chatten [VOICE_CHANNEL_NAME].  Pråv venligst senere.  	</notification> -	<notification name="ServerVersionChanged"> -		Du er netop ankommet til en region der benytter en anden server version, hvilket kan influere på hastigheden. [[URL] For at se yderligere.] -	</notification>  	<notification name="UnsupportedCommandSLURL">  		Den SLurl du klikkede på understøttes ikke.  	</notification> diff --git a/indra/newview/skins/default/xui/de/notifications.xml b/indra/newview/skins/default/xui/de/notifications.xml index a2d0b5a170..c26b02ec8f 100644 --- a/indra/newview/skins/default/xui/de/notifications.xml +++ b/indra/newview/skins/default/xui/de/notifications.xml @@ -2691,9 +2691,6 @@ Klicken Sie auf  'Akzeptieren ', um dem Chat beizutreten, oder auf  &a  	<notification name="VoiceCallGenericError">  		Fehler beim Versuch, eine Voice-Chat-Verbindung zu [VOICE_CHANNEL_NAME] herzustellen.  Bitte versuchen Sie es erneut.  	</notification> -	<notification name="ServerVersionChanged"> -		Sie haben eine Region betreten, die eine andere Server-Version verwendet. Dies kann sich auf die Leistung auswirken. [[URL] Versionshinweise anzeigen.] -	</notification>  	<notification name="UnsupportedCommandSLURL">  		Die SLurl, auf die Sie geklickt haben, wird nicht unterstützt.  	</notification> diff --git a/indra/newview/skins/default/xui/en/floater_tools.xml b/indra/newview/skins/default/xui/en/floater_tools.xml index 1554ae390f..60cd82d227 100644 --- a/indra/newview/skins/default/xui/en/floater_tools.xml +++ b/indra/newview/skins/default/xui/en/floater_tools.xml @@ -928,12 +928,13 @@               length="1"               follows="left|top"               left_pad="0" -             height="30" +             height="20"               layout="topleft"               name="Creator Name"               top_delta="0"               width="190" -             word_wrap="true"> +             word_wrap="true" +             use_ellipses="ture">                  Mrs. Esbee Linden (esbee.linden)              </text>              <text @@ -944,7 +945,7 @@               height="19"               layout="topleft"               name="Owner:" -             top_pad="3" +             top_pad="13"               width="90">                  Owner:              </text> @@ -953,13 +954,14 @@               type="string"               length="1"               follows="left|top" -             height="30" +             height="20"               layout="topleft"               name="Owner Name"               left_pad="0"               top_delta="0"               width="190" -             word_wrap="true"> +             word_wrap="true" +             use_ellipses="true">                  Mrs. Erica "Moose" Linden (erica.linden)              </text>             <text @@ -970,7 +972,7 @@               left="10"               height="18"               name="Group:" -             top_pad="7" +             top_pad="17"               width="75">                  Group:              </text> 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 d90d0feda9..6ec063cd26 100644 --- a/indra/newview/skins/default/xui/en/floater_web_content.xml +++ b/indra/newview/skins/default/xui/en/floater_web_content.xml @@ -2,26 +2,26 @@  <floater    legacy_header_height="18"    can_resize="true" -  height="440" +  height="775"    layout="topleft" -  min_height="140" -  min_width="467" +  min_height="400" +  min_width="500"    name="floater_web_content"    help_topic="floater_web_content"    save_rect="true"    auto_tile="true"    title=""    initial_mime_type="text/html" -  width="820"> +  width="735">    <layout_stack -    bottom="440" +    bottom="775"      follows="left|right|top|bottom"      layout="topleft"      left="5"      name="stack1"      orientation="vertical"      top="20" -    width="810"> +    width="725">      <layout_panel        auto_resize="false"        default_tab_group="1" @@ -32,14 +32,14 @@        name="nav_controls"        top="400"        user_resize="false" -      width="800"> +      width="725">        <button          image_overlay="Arrow_Left_Off" -        image_disabled="PushButton_Disabled" -        image_disabled_selected="PushButton_Disabled" -        image_selected="PushButton_Selected" -        image_unselected="PushButton_Off" -        hover_glow_amount="0.15" +		    image_disabled="PushButton_Disabled" +		    image_disabled_selected="PushButton_Disabled" +		    image_selected="PushButton_Selected" +		    image_unselected="PushButton_Off" +		    hover_glow_amount="0.15"          tool_tip="Navigate back"          follows="left|top"          height="22" @@ -53,10 +53,10 @@        </button>        <button          image_overlay="Arrow_Right_Off" -        image_disabled="PushButton_Disabled" -        image_disabled_selected="PushButton_Disabled" -        image_selected="PushButton_Selected" -        image_unselected="PushButton_Off" +		    image_disabled="PushButton_Disabled" +		    image_disabled_selected="PushButton_Disabled" +		    image_selected="PushButton_Selected" +		    image_unselected="PushButton_Off"          tool_tip="Navigate forward"          follows="left|top"          height="22" @@ -70,10 +70,10 @@        </button>        <button          image_overlay="Stop_Off" -        image_disabled="PushButton_Disabled" -        image_disabled_selected="PushButton_Disabled" -        image_selected="PushButton_Selected" -        image_unselected="PushButton_Off" +		    image_disabled="PushButton_Disabled" +		    image_disabled_selected="PushButton_Disabled" +		    image_selected="PushButton_Selected" +		    image_unselected="PushButton_Off"          tool_tip="Stop navigation"          enabled="true"          follows="left|top" @@ -88,10 +88,10 @@        </button>        <button          image_overlay="Refresh_Off" -        image_disabled="PushButton_Disabled" -        image_disabled_selected="PushButton_Disabled" -        image_selected="PushButton_Selected" -        image_unselected="PushButton_Off" +		    image_disabled="PushButton_Disabled" +		    image_disabled_selected="PushButton_Disabled" +		    image_selected="PushButton_Selected" +		    image_unselected="PushButton_Off"          tool_tip="Reload page"          follows="left|top"          height="22" @@ -115,7 +115,7 @@          combo_editor.select_on_focus="true"          tool_tip="Enter URL here"          top_delta="0" -        width="702"> +        width="627">          <combo_box.commit_callback            function="WebContent.EnterAddress" />        </combo_box> @@ -125,24 +125,24 @@          follows="top|right"          image_name="Lock2"          layout="topleft" -        left_delta="656" +        left_delta="575"          top_delta="2"          visible="false"           tool_tip="Secured Browsing"          width="16" />        <button          image_overlay="ExternalBrowser_Off" -        image_disabled="PushButton_Disabled" -        image_disabled_selected="PushButton_Disabled" -        image_selected="PushButton_Selected" -        image_unselected="PushButton_Off" +		    image_disabled="PushButton_Disabled" +		    image_disabled_selected="PushButton_Disabled" +		    image_selected="PushButton_Selected" +		    image_unselected="PushButton_Off"          tool_tip="Open current URL in your desktop browser"          follows="right|top"          enabled="true"           height="22"          layout="topleft"          name="popexternal" -        right="800" +        right="725"          top_delta="-2"          width="22">          <button.commit_callback @@ -166,16 +166,16 @@          top="0"/>        <text          type="string" -        length="100" +        length="200"          follows="bottom|left"          height="20"          layout="topleft"          left_delta="0"          name="statusbartext"          parse_urls="false" -        text_color="0.4 0.4 0.4 1"  +        text_color="0.4 0.4 0.4 1"          top_pad="5" -        width="452"/> +        width="520"/>        <progress_bar          color_bar="0.3 1.0 0.3 1"          follows="bottom|right" diff --git a/indra/newview/skins/default/xui/en/menu_places_gear_folder.xml b/indra/newview/skins/default/xui/en/menu_places_gear_folder.xml index 6f46165883..1aeb166e01 100644 --- a/indra/newview/skins/default/xui/en/menu_places_gear_folder.xml +++ b/indra/newview/skins/default/xui/en/menu_places_gear_folder.xml @@ -25,6 +25,14 @@           function="Places.LandmarksGear.Enable"           parameter="category" />      </menu_item_call> +    <menu_item_call +     label="Restore Item" +     layout="topleft" +     name="restore_item"> +        <menu_item_call.on_click +         function="Places.LandmarksGear.Custom.Action" +         parameter="restore" /> +    </menu_item_call>      <menu_item_separator       layout="topleft" />      <menu_item_call diff --git a/indra/newview/skins/default/xui/en/menu_places_gear_landmark.xml b/indra/newview/skins/default/xui/en/menu_places_gear_landmark.xml index 121e7cc07a..ff5fdd3795 100644 --- a/indra/newview/skins/default/xui/en/menu_places_gear_landmark.xml +++ b/indra/newview/skins/default/xui/en/menu_places_gear_landmark.xml @@ -60,6 +60,14 @@           function="Places.LandmarksGear.Enable"           parameter="category" />      </menu_item_call> +    <menu_item_call +     label="Restore Item" +     layout="topleft" +     name="restore_item"> +        <menu_item_call.on_click +         function="Places.LandmarksGear.Custom.Action" +         parameter="restore" /> +    </menu_item_call>      <menu_item_separator       layout="topleft" />      <menu_item_call diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml index 6211561a5d..cb2cbbe033 100644 --- a/indra/newview/skins/default/xui/en/menu_viewer.xml +++ b/indra/newview/skins/default/xui/en/menu_viewer.xml @@ -2571,18 +2571,6 @@                   function="ToggleControl"                   parameter="PingInterpolate" />              </menu_item_check> -            <menu_item_check -             label="Region Debug Console" -             name="Region Debug Console" -             shortcut="control|shift|`" -             use_mac_ctrl="true"> -                <menu_item_check.on_check -                 function="Floater.Visible" -                 parameter="region_debug_console" /> -                <menu_item_check.on_click -                 function="Floater.Toggle" -                 parameter="region_debug_console" /> -            </menu_item_check>              <menu_item_separator/> @@ -2781,26 +2769,6 @@                   function="Floater.Toggle"                   parameter="region_debug_console" />              </menu_item_check> -            <menu_item_check -           <menu_item_separator /> - -            <menu_item_check -             label="Region Debug Console" -             name="Region Debug Console" -             shortcut="control|shift|`" -             use_mac_ctrl="true"> -                <menu_item_check.on_check -                 function="Floater.Visible" -                 parameter="region_debug_console" /> -                <menu_item_check.on_click -                 function="Floater.Toggle" -                 parameter="region_debug_console" /> -            </menu_item_check> - -            <menu_item_separator /> - -            <menu_item_check -              <menu_item_separator />              <menu_item_check @@ -3198,7 +3166,7 @@              <menu_item_call.on_click               function="Advanced.LeaveAdminStatus" />          </menu_item_call> -		    <menu_item_check +		<menu_item_check           label="Show Admin Menu"           name="View Admin Options">              <menu_item_check.on_enable diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index cac25b9312..4fbe7b564f 100644 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -6304,15 +6304,6 @@ An error has occurred while trying to connect to voice chat for [VOICE_CHANNEL_N    </notification>    <notification -   duration="10" -   icon="notifytip.tga" -   name="ServerVersionChanged" -   priority="high" -   type="notifytip"> -You just entered a region using a different server version, which may affect performance. [[URL] View the release notes.] -  </notification> - -  <notification     icon="notifytip.tga"     name="UnsupportedCommandSLURL"     priority="high" diff --git a/indra/newview/skins/default/xui/es/notifications.xml b/indra/newview/skins/default/xui/es/notifications.xml index 14ce39e8fc..1c31066962 100644 --- a/indra/newview/skins/default/xui/es/notifications.xml +++ b/indra/newview/skins/default/xui/es/notifications.xml @@ -2678,9 +2678,6 @@ Pulsa Aceptar o Rehusar para coger o no la llamada. Pulsa Ignorar para ignorar a  	<notification name="VoiceCallGenericError">  		Se ha producido un error al intentar conectarte al [VOICE_CHANNEL_NAME]. Por favor, inténtalo más tarde.  	</notification> -	<notification name="ServerVersionChanged"> -		Acabas de entrar en una región que usa un servidor con una versión distinta, y esto puede influir en el funcionamiento. [[URL] Ver las notas de desarrollo]. -	</notification>  	<notification name="UnsupportedCommandSLURL">  		No se admite el formato de la SLurl que has pulsado.  	</notification> diff --git a/indra/newview/skins/default/xui/fr/notifications.xml b/indra/newview/skins/default/xui/fr/notifications.xml index f0b0e63af0..2ccac5c19a 100644 --- a/indra/newview/skins/default/xui/fr/notifications.xml +++ b/indra/newview/skins/default/xui/fr/notifications.xml @@ -2674,9 +2674,6 @@ Pour y participer, cliquez sur Accepter. Sinon, cliquez sur Refuser. Pour ignore  	<notification name="VoiceCallGenericError">  		Une erreur est survenue pendant la connexion au chat vocal pour [VOICE_CHANNEL_NAME]. Veuillez réessayer ultérieurement.  	</notification> -	<notification name="ServerVersionChanged"> -		La région dans laquelle vous avez pénétré utilise une version de serveur différente, ce qui peut avoir un impact sur votre performance. [[URL] Consultez les notes de version.] -	</notification>  	<notification name="UnsupportedCommandSLURL">  		La SLurl que vous avez saisie n'est pas prise en charge.  	</notification> diff --git a/indra/newview/skins/default/xui/it/notifications.xml b/indra/newview/skins/default/xui/it/notifications.xml index 5e53080c77..cce5888598 100644 --- a/indra/newview/skins/default/xui/it/notifications.xml +++ b/indra/newview/skins/default/xui/it/notifications.xml @@ -2623,9 +2623,6 @@ Clicca su Accetta per unirti alla chat oppure su Declina per declinare l'in  	<notification name="VoiceCallGenericError">  		Si è verificato un errore durante il tentativo di collegarti a una voice chat con [VOICE_CHANNEL_NAME].  Riprova più tardi.  	</notification> -	<notification name="ServerVersionChanged"> -		Sei appena entrato in una regione che usa una versione differente del server: ciò potrebbe incidere sule prestazioni. [[URL] Visualizza le note sulla versione.] -	</notification>  	<notification name="UnsupportedCommandSLURL">  		Lo SLurl su cui hai cliccato non è valido.  	</notification> diff --git a/indra/newview/skins/default/xui/ja/notifications.xml b/indra/newview/skins/default/xui/ja/notifications.xml index f133bb361a..baec8c073c 100644 --- a/indra/newview/skins/default/xui/ja/notifications.xml +++ b/indra/newview/skins/default/xui/ja/notifications.xml @@ -2675,9 +2675,6 @@ M キーを押して変更します。  	<notification name="VoiceCallGenericError">  		[VOICE_CHANNEL_NAME] のボイスチャットに接続中に、エラーが発生しました。後でもう一度お試しください。  	</notification> -	<notification name="ServerVersionChanged"> -		サーバーのバージョンが異なるリージョンに来ました。パフォーマンスに影響することがあります。 [[URL] リリースノートを確認] -	</notification>  	<notification name="UnsupportedCommandSLURL">  		クリックした SLurl はサポートされていません。  	</notification> diff --git a/indra/newview/skins/default/xui/nl/notifications.xml b/indra/newview/skins/default/xui/nl/notifications.xml index be0c17d2ff..f27b83d3f9 100644 --- a/indra/newview/skins/default/xui/nl/notifications.xml +++ b/indra/newview/skins/default/xui/nl/notifications.xml @@ -3012,9 +3012,6 @@ Klik Accepteren om deel te nemen aan de chat of Afwijzen om de uitnodiging af te  	<notification name="VoiceCallGenericError">  		Er is een fout opgetreden tijdens het verbinden met voice chat voor [VOICE_CHANNEL_NAME]. Probeert u het later alstublieft opnieuw.  	</notification> -	<notification name="ServerVersionChanged"> -		De regio die u bent binnengetreden wordt onder een andere simulatorversie uitgevoerd. Klik dit bericht voor meer details. -	</notification>  	<notification name="UnableToOpenCommandURL">  		De URL die u heeft geklikt kan niet binnen deze webbrowser worden geopend.  	</notification> diff --git a/indra/newview/skins/default/xui/pl/notifications.xml b/indra/newview/skins/default/xui/pl/notifications.xml index 57a6b8b8ef..138125ff0b 100644 --- a/indra/newview/skins/default/xui/pl/notifications.xml +++ b/indra/newview/skins/default/xui/pl/notifications.xml @@ -2635,9 +2635,6 @@ Wybierz Zaakceptuj żeby zacząć czat albo Odmów żeby nie przyjąć zaproszen  	<notification name="VoiceCallGenericError">  		Błąd podczas łączenia z rozmową [VOICE_CHANNEL_NAME]. Spróbuj póżniej.  	</notification> -	<notification name="ServerVersionChanged"> -		Ten region używa innej wersji symulatora. Kliknij na tą wiadomość żeby uzyskać więcej informacji: [[URL] View the release notes.] -	</notification>  	<notification name="UnsupportedCommandSLURL">  		Nie można otworzyć wybranego SLurl.  	</notification> diff --git a/indra/newview/skins/default/xui/pt/notifications.xml b/indra/newview/skins/default/xui/pt/notifications.xml index a1855f2e89..9c3b9386e0 100644 --- a/indra/newview/skins/default/xui/pt/notifications.xml +++ b/indra/newview/skins/default/xui/pt/notifications.xml @@ -2658,9 +2658,6 @@ Clique em Aceitar para atender ou em Recusar para recusar este convite.  Clique  	<notification name="VoiceCallGenericError">  		Ocorreu um erro enquanto você tentava se conectar à conversa de voz de [VOICE_CHANNEL_NAME].  Favor tentar novamente mais tarde.  	</notification> -	<notification name="ServerVersionChanged"> -		Você chegou a uma região com uma versão diferente de servidor, que pode afetar o desempenho.  [[URL] Consultar notas da versão.] -	</notification>  	<notification name="UnsupportedCommandSLURL">  		O SLurl no qual você clicou não é suportado.  	</notification> diff --git a/indra/viewer_components/updater/llupdaterservice.cpp b/indra/viewer_components/updater/llupdaterservice.cpp index aa4983a3b6..ea242f45cd 100644 --- a/indra/viewer_components/updater/llupdaterservice.cpp +++ b/indra/viewer_components/updater/llupdaterservice.cpp @@ -361,6 +361,7 @@ void LLUpdaterServiceImpl::error(std::string const & message)  {  	if(mIsChecking)  	{ +		setState(LLUpdaterService::TEMPORARY_ERROR);  		restartTimer(mCheckPeriod);  	}  } diff --git a/indra/viewer_components/updater/llupdaterservice.h b/indra/viewer_components/updater/llupdaterservice.h index 421481bc43..450f19c1c6 100644 --- a/indra/viewer_components/updater/llupdaterservice.h +++ b/indra/viewer_components/updater/llupdaterservice.h @@ -59,6 +59,7 @@ public:  	enum eUpdaterState {  		INITIAL,  		CHECKING_FOR_UPDATE, +		TEMPORARY_ERROR,  		DOWNLOADING,  		INSTALLING,  		UP_TO_DATE, | 
