diff --git a/.hgtags b/.hgtags index 0f28b62de7..41d279f17d 100755 --- a/.hgtags +++ b/.hgtags @@ -579,3 +579,4 @@ ad0e15543836d64d6399d28b32852510435e344a 5.1.0-release 04538b8157c1f5cdacd9403f0a395452d4a93689 5.1.6-release ac3b1332ad4f55b7182a8cbcc1254535a0069f75 5.1.7-release 23ea0fe36fadf009a60c080392ce80e4bf8af8d9 5.1.8-release +52422540bfe54b71155aa455360bee6e3ef1fd96 5.1.9-release diff --git a/autobuild.xml b/autobuild.xml index 58d7d6bef3..d2d1f674e5 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -3566,9 +3566,9 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors archive hash - f45c0a5e7b4601b355e163bf62f5718e + ce95944fb842849108102263a25fc794 url - http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/20587/147509/viewer_manager-1.0.517052-darwin64-517052.tar.bz2 + http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/23237/178332/viewer_manager-1.0.518840-darwin64-518840.tar.bz2 name darwin64 @@ -3602,9 +3602,9 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors archive hash - d2443caf062697430071d458a965f611 + 642f847a9ac45551af65a55826974334 url - http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/20588/147516/viewer_manager-1.0.517052-windows-517052.tar.bz2 + http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/23236/178338/viewer_manager-1.0.518840-windows-518840.tar.bz2 name windows @@ -3615,7 +3615,7 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors source_type hg version - 1.0.517052 + 1.0.518840 vlc-bin diff --git a/indra/llappearance/llavatarappearance.cpp b/indra/llappearance/llavatarappearance.cpp index 27cbf60e60..9af6e28115 100644 --- a/indra/llappearance/llavatarappearance.cpp +++ b/indra/llappearance/llavatarappearance.cpp @@ -1599,9 +1599,10 @@ BOOL LLAvatarAppearance::allocateCollisionVolumes( U32 num ) delete_and_clear_array(mCollisionVolumes); mNumCollisionVolumes = 0; - mCollisionVolumes = new LLAvatarJointCollisionVolume[num]; + mCollisionVolumes = new(std::nothrow) LLAvatarJointCollisionVolume[num]; if (!mCollisionVolumes) { + LL_WARNS() << "Failed to allocate collision volumes" << LL_ENDL; return FALSE; } diff --git a/indra/llappearance/llwearabletype.cpp b/indra/llappearance/llwearabletype.cpp index c84644ce84..737ea37b70 100644 --- a/indra/llappearance/llwearabletype.cpp +++ b/indra/llappearance/llwearabletype.cpp @@ -103,7 +103,7 @@ LLWearableDictionary::LLWearableDictionary() // [/SL:KB] // addEntry(LLWearableType::WT_PHYSICS, new WearableEntry("physics", "New Physics", LLAssetType::AT_CLOTHING, LLInventoryType::ICONNAME_CLOTHING_PHYSICS, TRUE, TRUE)); - addEntry(LLWearableType::WT_INVALID, new WearableEntry("invalid", "Invalid Wearable", LLAssetType::AT_NONE, LLInventoryType::ICONNAME_NONE, FALSE, FALSE)); + addEntry(LLWearableType::WT_INVALID, new WearableEntry("invalid", "Invalid Wearable", LLAssetType::AT_NONE, LLInventoryType::ICONNAME_UNKNOWN, FALSE, FALSE)); addEntry(LLWearableType::WT_NONE, new WearableEntry("none", "Invalid Wearable", LLAssetType::AT_NONE, LLInventoryType::ICONNAME_NONE, FALSE, FALSE)); } diff --git a/indra/llaudio/llaudiodecodemgr.cpp b/indra/llaudio/llaudiodecodemgr.cpp index f14d8d3966..a57d0b746f 100644 --- a/indra/llaudio/llaudiodecodemgr.cpp +++ b/indra/llaudio/llaudiodecodemgr.cpp @@ -265,9 +265,19 @@ BOOL LLVorbisDecodeState::initDecode() mInFilep = NULL; return FALSE; } - - mWAVBuffer.reserve(size_guess); - mWAVBuffer.resize(WAV_HEADER_SIZE); + + try + { + mWAVBuffer.reserve(size_guess); + mWAVBuffer.resize(WAV_HEADER_SIZE); + } + catch (std::bad_alloc) + { + LL_WARNS("AudioEngine") << "Out of memory when trying to alloc buffer: " << size_guess << LL_ENDL; + delete mInFilep; + mInFilep = NULL; + return FALSE; + } { // write the .wav format header diff --git a/indra/llcharacter/llkeyframemotion.cpp b/indra/llcharacter/llkeyframemotion.cpp index 056a4425e1..050674395a 100644 --- a/indra/llcharacter/llkeyframemotion.cpp +++ b/indra/llcharacter/llkeyframemotion.cpp @@ -582,8 +582,15 @@ LLMotion::LLMotionInitStatus LLKeyframeMotion::onInitialize(LLCharacter *charact else { anim_file_size = anim_file->getSize(); - anim_data = new U8[anim_file_size]; - success = anim_file->read(anim_data, anim_file_size); /*Flawfinder: ignore*/ + anim_data = new(std::nothrow) U8[anim_file_size]; + if (anim_data) + { + success = anim_file->read(anim_data, anim_file_size); /*Flawfinder: ignore*/ + } + else + { + LL_WARNS() << "Failed to allocate buffer: " << anim_file_size << mID << LL_ENDL; + } delete anim_file; anim_file = NULL; } diff --git a/indra/llcommon/llassettype.cpp b/indra/llcommon/llassettype.cpp index 4304db36be..7e5a157cdf 100644 --- a/indra/llcommon/llassettype.cpp +++ b/indra/llcommon/llassettype.cpp @@ -95,6 +95,7 @@ LLAssetDictionary::LLAssetDictionary() addEntry(LLAssetType::AT_MESH, new AssetEntry("MESH", "mesh", "mesh", false, false, false)); addEntry(LLAssetType::AT_WIDGET, new AssetEntry("WIDGET", "widget", "widget", false, false, false)); addEntry(LLAssetType::AT_PERSON, new AssetEntry("PERSON", "person", "person", false, false, false)); + addEntry(LLAssetType::AT_UNKNOWN, new AssetEntry("UNKNOWN", "invalid", NULL, false, false, false)); addEntry(LLAssetType::AT_NONE, new AssetEntry("NONE", "-1", NULL, FALSE, FALSE, FALSE)); }; @@ -156,7 +157,7 @@ LLAssetType::EType LLAssetType::lookup(const std::string& type_name) return iter->first; } } - return AT_NONE; + return AT_UNKNOWN; } // static diff --git a/indra/llcommon/llassettype.h b/indra/llcommon/llassettype.h index b849be9f16..79ab3d7efe 100644 --- a/indra/llcommon/llassettype.h +++ b/indra/llcommon/llassettype.h @@ -130,7 +130,7 @@ public: // | 4. ADD TO LLViewerAssetType.cpp | // | 5. ADD TO DEFAULT_ASSET_FOR_INV in LLInventoryType.cpp | // +*********************************************************+ - + AT_UNKNOWN = 255, AT_NONE = -1 }; diff --git a/indra/llcommon/llerror.cpp b/indra/llcommon/llerror.cpp index f695b9bbde..b605cdf09a 100644 --- a/indra/llcommon/llerror.cpp +++ b/indra/llcommon/llerror.cpp @@ -41,6 +41,7 @@ # include #endif // !LL_WINDOWS #include +#include "string.h" #include "llapp.h" #include "llapr.h" @@ -588,21 +589,16 @@ namespace LLError mTags(new const char* [tag_count]), mTagCount(tag_count) { - for (int i = 0; i < tag_count; i++) - { - mTags[i] = tags[i]; - } - switch (mLevel) { - case LEVEL_DEBUG: mLevelString = "DEBUG:"; break; - case LEVEL_INFO: mLevelString = "INFO:"; break; - case LEVEL_WARN: mLevelString = "WARNING:"; break; - case LEVEL_ERROR: mLevelString = "ERROR:"; break; - default: mLevelString = "XXX:"; break; + case LEVEL_DEBUG: mLevelString = "DEBUG"; break; + case LEVEL_INFO: mLevelString = "INFO"; break; + case LEVEL_WARN: mLevelString = "WARNING"; break; + case LEVEL_ERROR: mLevelString = "ERROR"; break; + default: mLevelString = "XXX"; break; }; - mLocationString = llformat("%s(%d) :", abbreviateFile(mFile).c_str(), mLine); + mLocationString = llformat("%s(%d)", abbreviateFile(mFile).c_str(), mLine); #if LL_WINDOWS // DevStudio: __FUNCTION__ already includes the full class name #else @@ -616,11 +612,21 @@ namespace LLError mFunctionString = className(mClassInfo) + "::"; } #endif - mFunctionString += std::string(mFunction) + ":"; - const std::string tag_hash("#"); + mFunctionString += std::string(mFunction); + + for (int i = 0; i < tag_count; i++) + { + if (strchr(tags[i], ' ')) + { + LL_ERRS() << "Space is not allowed in a log tag at " << mLocationString << LL_ENDL; + } + mTags[i] = tags[i]; + } + + mTagString.append("#"); + // always construct a tag sequence; will be just a single # if no tag for (size_t i = 0; i < mTagCount; i++) { - mTagString.append(tag_hash); // Tags can be 0, so work around that. //mTagString.append(mTags[i]); char const *pTag = mTags[i]; @@ -628,7 +634,7 @@ namespace LLError pTag = ""; mTagString.append(pTag); // - mTagString.append((i == mTagCount - 1) ? ";" : ","); + mTagString.append("#"); } } @@ -1022,7 +1028,46 @@ namespace LLError namespace { - void writeToRecorders(const LLError::CallSite& site, const std::string& message, bool show_location = true, bool show_time = true, bool show_tags = true, bool show_level = true, bool show_function = true) + void addEscapedMessage(std::ostream& out, const std::string& message) + { + size_t written_out = 0; + size_t all_content = message.length(); + size_t escape_char_index; // always relative to start of message + // Use find_first_of to find the next character in message that needs escaping + for ( escape_char_index = message.find_first_of("\\\n\r"); + escape_char_index != std::string::npos && written_out < all_content; + // record what we've written this iteration, scan for next char that needs escaping + written_out = escape_char_index + 1, escape_char_index = message.find_first_of("\\\n\r", written_out) + ) + { + // found a character that needs escaping, so write up to that with the escape prefix + // note that escape_char_index is relative to the start, not to the written_out offset + out << message.substr(written_out, escape_char_index - written_out) << '\\'; + + // write out the appropriate second character in the escape sequence + char found = message[escape_char_index]; + switch ( found ) + { + case '\\': + out << '\\'; + break; + case '\n': + out << 'n'; + break; + case '\r': + out << 'r'; + break; + } + } + + if ( written_out < all_content ) // if the loop above didn't write everything + { + // write whatever was left + out << message.substr(written_out, std::string::npos); + } + } + + void writeToRecorders(const LLError::CallSite& site, const std::string& escaped_message, bool show_location = true, bool show_time = true, bool show_tags = true, bool show_level = true, bool show_function = true) { LLError::ELevel level = site.mLevel; LLError::SettingsConfigPtr s = LLError::Settings::getInstance()->getSettingsConfig(); @@ -1040,32 +1085,37 @@ namespace std::ostringstream message_stream; - if (show_time && r->wantsTime() && s->mTimeFunction != NULL) + if (r->wantsTime() && s->mTimeFunction != NULL) { - message_stream << s->mTimeFunction() << " "; + message_stream << s->mTimeFunction(); } - + message_stream << " "; + if (show_level && r->wantsLevel()) { - message_stream << site.mLevelString << " "; + message_stream << site.mLevelString; } + message_stream << " "; - if (show_tags && r->wantsTags() && !site.mTagString.empty()) + if (r->wantsTags() && !site.mTagString.empty()) { message_stream << site.mTagString << " "; } + message_stream << " "; - if (show_location && (r->wantsLocation() || level == LLError::LEVEL_ERROR || s->mPrintLocation)) + if (r->wantsLocation() || level == LLError::LEVEL_ERROR || s->mPrintLocation) { - message_stream << site.mLocationString << " "; + message_stream << site.mLocationString; } + message_stream << " "; if (show_function && r->wantsFunctionName()) { - message_stream << site.mFunctionString << " "; + message_stream << site.mFunctionString; } + message_stream << " : "; - message_stream << message; + message_stream << escaped_message; r->recordMessage(level, message_stream.str()); } @@ -1264,15 +1314,10 @@ namespace LLError delete out; } - if (site.mLevel == LEVEL_ERROR) - { - writeToRecorders(site, "error", true, true, true, false, false); - } std::ostringstream prefix; if( nd::logging::throttle( site.mFile, site.mLine, &prefix ) ) return; - std::ostringstream message_stream; if (site.mPrintOnce) @@ -1298,8 +1343,11 @@ namespace LLError } } + // Fix log output - we don't need an escaped output + //addEscapedMessage(message_stream, message); message_stream << message; - + // + writeToRecorders(site, message_stream.str()); if (site.mLevel == LEVEL_ERROR && s->mCrashFunction) diff --git a/indra/llcommon/llerror.h b/indra/llcommon/llerror.h index e74e9723a4..447c0fb31f 100644 --- a/indra/llcommon/llerror.h +++ b/indra/llcommon/llerror.h @@ -146,11 +146,22 @@ const int LL_ERR_NOERR = 0; will result in messages like: - WARN: LLFoo::doSomething: called with a big value for i: 283 + WARN #FooBarTag# llcommon/llfoo(100) LLFoo::doSomething : called with a big value for i: 283 + the syntax is: + SPACE SPACE SPACE SPACE SPACE COLON SPACE + + where each SPACE is a single space character; note that if a field is empty (such as when no + tags are specified), all the SPACEs are still present. + + The tags must be a single word (may not contain a space); if more than one tag is specified, + they are all surrounded by '#' ( #FooTag#BarTag# ). + Which messages are logged and which are suppressed can be controlled at run - time from the live file logcontrol.xml based on function, class and/or - source file. See etc/logcontrol-dev.xml for details. + time from the configuration file. The default configuration is in newview/app_settings/logcontrol.xml + A copy of that file named logcontrol-dev.xml can be made in the users personal settings + directory; that will override the installed default file. See the logcontrol.xml + file or http://wiki.secondlife.com/wiki/Logging_System_Overview for configuration details. Lastly, logging is now very efficient in both compiled code and execution when skipped. There is no need to wrap messages, even debugging ones, in diff --git a/indra/llcommon/llprocessor.cpp b/indra/llcommon/llprocessor.cpp index 446c312ca9..a618a1cc70 100644 --- a/indra/llcommon/llprocessor.cpp +++ b/indra/llcommon/llprocessor.cpp @@ -610,7 +610,7 @@ private: value = (uint64_t)(( uint8_t *)&value); else { - LL_WARNS("Unknown type returned from sysctl!") << LL_ENDL; + LL_WARNS() << "Unknown type returned from sysctl" << LL_ENDL; } } diff --git a/indra/llcommon/llthread.cpp b/indra/llcommon/llthread.cpp index 4db0feeeaf..ed799c3ecb 100644 --- a/indra/llcommon/llthread.cpp +++ b/indra/llcommon/llthread.cpp @@ -236,11 +236,12 @@ void LLThread::shutdown() // This thread just wouldn't stop, even though we gave it time //LL_WARNS() << "LLThread::~LLThread() exiting thread before clean exit!" << LL_ENDL; // Put a stake in its heart. - delete mRecorder; - // ND: There is no such thing as to terminate a std::thread, we detach it so no wait will happen. // Otherwise craft something platform specific with std::thread::native_handle mThreadp->detach(); + delete mRecorder; + mRecorder = NULL; + mStatus = STOPPED; return; } mThreadp = NULL; diff --git a/indra/llcommon/tests/llerror_test.cpp b/indra/llcommon/tests/llerror_test.cpp index 20de205454..ce0dbce075 100644 --- a/indra/llcommon/tests/llerror_test.cpp +++ b/indra/llcommon/tests/llerror_test.cpp @@ -36,6 +36,26 @@ #include "../test/lltut.h" +enum LogFieldIndex +{ + TIME_FIELD, + LEVEL_FIELD, + TAGS_FIELD, + LOCATION_FIELD, + FUNCTION_FIELD, + MSG_FIELD +}; + +static const char* FieldName[] = +{ + "TIME", + "LEVEL", + "TAGS", + "LOCATION", + "FUNCTION", + "MSG" +}; + namespace { #ifdef __clang__ @@ -58,7 +78,7 @@ namespace tut class TestRecorder : public LLError::Recorder { public: - TestRecorder() { mWantsTime = false; } + TestRecorder() { mWantsTime = false; mWantsTags = true; } virtual ~TestRecorder() { } virtual void recordMessage(LLError::ELevel level, @@ -133,13 +153,64 @@ namespace tut ensure_equals("message count", countMessages(), expectedCount); } - void ensure_message_contains(int n, const std::string& expectedText) - { - std::ostringstream test_name; - test_name << "testing message " << n; + std::string message_field(int msgnum, LogFieldIndex fieldnum) + { + std::ostringstream test_name; + test_name << "testing message " << msgnum << ", not enough messages"; + tut::ensure(test_name.str(), msgnum < countMessages()); - ensure_contains(test_name.str(), message(n), expectedText); - } + std::string msg(message(msgnum)); + + std::string field_value; + + // find the start of the field; fields are separated by a single space + size_t scan = 0; + int on_field = 0; + while ( scan < msg.length() && on_field < fieldnum ) + { + // fields are delimited by one space + if ( ' ' == msg[scan] ) + { + if ( on_field < FUNCTION_FIELD ) + { + on_field++; + } + // except function, which may have embedded spaces so ends with " : " + else if ( ( on_field == FUNCTION_FIELD ) + && ( ':' == msg[scan+1] && ' ' == msg[scan+2] ) + ) + { + on_field++; + scan +=2; + } + } + scan++; + } + size_t start_field = scan; + size_t fieldlen = 0; + if ( fieldnum < FUNCTION_FIELD ) + { + fieldlen = msg.find(' ', start_field) - start_field; + } + else if ( fieldnum == FUNCTION_FIELD ) + { + fieldlen = msg.find(" : ", start_field) - start_field; + } + else if ( MSG_FIELD == fieldnum ) // no delimiter, just everything to the end + { + fieldlen = msg.length() - start_field; + } + + return msg.substr(start_field, fieldlen); + } + + void ensure_message_field_equals(int msgnum, LogFieldIndex fieldnum, const std::string& expectedText) + { + std::ostringstream test_name; + test_name << "testing message " << msgnum << " field " << FieldName[fieldnum] << "\n message: \"" << message(msgnum) << "\"\n "; + + ensure_equals(test_name.str(), message_field(msgnum, fieldnum), expectedText); + } void ensure_message_does_not_contain(int n, const std::string& expectedText) { @@ -162,8 +233,8 @@ namespace tut LL_INFOS() << "test" << LL_ENDL; LL_INFOS() << "bob" << LL_ENDL; - ensure_message_contains(0, "test"); - ensure_message_contains(1, "bob"); + ensure_message_field_equals(0, MSG_FIELD, "test"); + ensure_message_field_equals(1, MSG_FIELD, "bob"); } } @@ -171,11 +242,10 @@ namespace { void writeSome() { - LL_DEBUGS() << "one" << LL_ENDL; - LL_INFOS() << "two" << LL_ENDL; - LL_WARNS() << "three" << LL_ENDL; - // fatal messages write out an additional "error" message - LL_ERRS() << "four" << LL_ENDL; + LL_DEBUGS("WriteTag","AnotherTag") << "one" << LL_ENDL; + LL_INFOS("WriteTag") << "two" << LL_ENDL; + LL_WARNS("WriteTag") << "three" << LL_ENDL; + LL_ERRS("WriteTag") << "four" << LL_ENDL; } }; @@ -187,37 +257,41 @@ namespace tut { LLError::setDefaultLevel(LLError::LEVEL_DEBUG); writeSome(); - ensure_message_contains(0, "one"); - ensure_message_contains(1, "two"); - ensure_message_contains(2, "three"); - ensure_message_contains(3, "error"); - ensure_message_contains(4, "four"); - ensure_message_count(5); + ensure_message_field_equals(0, MSG_FIELD, "one"); + ensure_message_field_equals(0, LEVEL_FIELD, "DEBUG"); + ensure_message_field_equals(0, TAGS_FIELD, "#WriteTag#AnotherTag#"); + ensure_message_field_equals(1, MSG_FIELD, "two"); + ensure_message_field_equals(1, LEVEL_FIELD, "INFO"); + ensure_message_field_equals(1, TAGS_FIELD, "#WriteTag#"); + ensure_message_field_equals(2, MSG_FIELD, "three"); + ensure_message_field_equals(2, LEVEL_FIELD, "WARNING"); + ensure_message_field_equals(2, TAGS_FIELD, "#WriteTag#"); + ensure_message_field_equals(3, MSG_FIELD, "four"); + ensure_message_field_equals(3, LEVEL_FIELD, "ERROR"); + ensure_message_field_equals(3, TAGS_FIELD, "#WriteTag#"); + ensure_message_count(4); LLError::setDefaultLevel(LLError::LEVEL_INFO); writeSome(); - ensure_message_contains(5, "two"); - ensure_message_contains(6, "three"); - ensure_message_contains(7, "error"); - ensure_message_contains(8, "four"); - ensure_message_count(9); + ensure_message_field_equals(4, MSG_FIELD, "two"); + ensure_message_field_equals(5, MSG_FIELD, "three"); + ensure_message_field_equals(6, MSG_FIELD, "four"); + ensure_message_count(7); LLError::setDefaultLevel(LLError::LEVEL_WARN); writeSome(); - ensure_message_contains(9, "three"); - ensure_message_contains(10, "error"); - ensure_message_contains(11, "four"); - ensure_message_count(12); + ensure_message_field_equals(7, MSG_FIELD, "three"); + ensure_message_field_equals(8, MSG_FIELD, "four"); + ensure_message_count(9); LLError::setDefaultLevel(LLError::LEVEL_ERROR); writeSome(); - ensure_message_contains(12, "error"); - ensure_message_contains(13, "four"); - ensure_message_count(14); + ensure_message_field_equals(9, MSG_FIELD, "four"); + ensure_message_count(10); LLError::setDefaultLevel(LLError::LEVEL_NONE); writeSome(); - ensure_message_count(14); + ensure_message_count(10); } template<> template<> @@ -225,12 +299,11 @@ namespace tut // error type string in output { writeSome(); - ensure_message_contains(0, "DEBUG: "); - ensure_message_contains(1, "INFO: "); - ensure_message_contains(2, "WARNING: "); - ensure_message_does_not_contain(3, "ERROR"); - ensure_message_contains(4, "ERROR: "); - ensure_message_count(5); + ensure_message_field_equals(0, LEVEL_FIELD, "DEBUG"); + ensure_message_field_equals(1, LEVEL_FIELD, "INFO"); + ensure_message_field_equals(2, LEVEL_FIELD, "WARNING"); + ensure_message_field_equals(3, LEVEL_FIELD, "ERROR"); + ensure_message_count(4); } template<> template<> @@ -280,7 +353,7 @@ namespace { std::ostringstream location; location << LLError::abbreviateFile(__FILE__) - << "(" << line << ") : "; + << "(" << line << ")"; return location.str(); } @@ -321,7 +394,7 @@ namespace tut writeReturningLocation(); ensure_message_does_not_contain(0, location); - ensure_message_contains(1, location); + ensure_message_field_equals(1, LOCATION_FIELD, location); ensure_message_does_not_contain(2, location); } } @@ -496,13 +569,13 @@ namespace tut void ErrorTestObject::test<7>() { outerLogger(); - ensure_message_contains(0, "inside"); - ensure_message_contains(1, "outside(moo)"); + ensure_message_field_equals(0, MSG_FIELD, "inside"); + ensure_message_field_equals(1, MSG_FIELD, "outside(moo)"); ensure_message_count(2); metaLogger(); - ensure_message_contains(2, "logging"); - ensure_message_contains(3, "meta(baz)"); + ensure_message_field_equals(2, MSG_FIELD, "logging"); + ensure_message_field_equals(3, MSG_FIELD, "meta(baz)"); ensure_message_count(4); } @@ -513,9 +586,9 @@ namespace tut LLError::setPrintLocation(false); std::string location = errorReturningLocation(); - ensure_message_contains(0, location + "error"); - ensure_message_contains(1, "die"); - ensure_message_count(2); + ensure_message_field_equals(0, LOCATION_FIELD, location); + ensure_message_field_equals(0, MSG_FIELD, "die"); + ensure_message_count(1); ensure("fatal callback called", fatalWasCalled); } @@ -544,13 +617,13 @@ namespace tut setWantsTime(false); ufoSighting(); - ensure_message_contains(0, "ufo"); + ensure_message_field_equals(0, MSG_FIELD, "ufo"); ensure_message_does_not_contain(0, roswell()); setWantsTime(true); ufoSighting(); - ensure_message_contains(1, "ufo"); - ensure_message_contains(1, roswell()); + ensure_message_field_equals(1, MSG_FIELD, "ufo"); + ensure_message_field_equals(1, TIME_FIELD, roswell()); } template<> template<> @@ -564,9 +637,9 @@ namespace tut function; writeReturningLocationAndFunction(location, function); - ensure_equals("order is time location type function message", + ensure_equals("order is time level tags location function message", message(0), - roswell() + " INFO: " + location + function + ": apple"); + roswell() + " INFO " + "# " /* no tag */ + location + " " + function + " : " + "apple"); } template<> template<> @@ -578,7 +651,7 @@ namespace tut LL_INFOS() << "boo" << LL_ENDL; - ensure_message_contains(0, "boo"); + ensure_message_field_equals(0, MSG_FIELD, "boo"); ensure_equals("alt recorder count", boost::dynamic_pointer_cast(altRecorder)->countMessages(), 1); ensure_contains("alt recorder message 0", boost::dynamic_pointer_cast(altRecorder)->message(0), "boo"); @@ -637,14 +710,12 @@ namespace tut TestAlpha::doAll(); TestBeta::doAll(); - ensure_message_contains(0, "aim west"); - ensure_message_contains(1, "error"); - ensure_message_contains(2, "ate eels"); - ensure_message_contains(3, "buy iron"); - ensure_message_contains(4, "bad word"); - ensure_message_contains(5, "error"); - ensure_message_contains(6, "big easy"); - ensure_message_count(7); + ensure_message_field_equals(0, MSG_FIELD, "aim west"); + ensure_message_field_equals(1, MSG_FIELD, "ate eels"); + ensure_message_field_equals(2, MSG_FIELD, "buy iron"); + ensure_message_field_equals(3, MSG_FIELD, "bad word"); + ensure_message_field_equals(4, MSG_FIELD, "big easy"); + ensure_message_count(5); } template<> template<> @@ -657,8 +728,8 @@ namespace tut LLError::setFunctionLevel("TestBeta::doError", LLError::LEVEL_NONE); TestBeta::doAll(); - ensure_message_contains(0, "buy iron"); - ensure_message_contains(1, "bad word"); + ensure_message_field_equals(0, MSG_FIELD, "buy iron"); + ensure_message_field_equals(1, MSG_FIELD, "bad word"); ensure_message_count(2); } @@ -678,9 +749,9 @@ namespace tut TestAlpha::doAll(); TestBeta::doAll(); - ensure_message_contains(0, "any idea"); - ensure_message_contains(1, "aim west"); - ensure_message_contains(2, "bad word"); + ensure_message_field_equals(0, MSG_FIELD, "any idea"); + ensure_message_field_equals(1, MSG_FIELD, "aim west"); + ensure_message_field_equals(2, MSG_FIELD, "bad word"); ensure_message_count(3); } @@ -718,14 +789,13 @@ namespace tut // configuration from LLSD void ErrorTestObject::test<16>() { - std::string this_file = LLError::abbreviateFile(__FILE__); LLSD config; config["print-location"] = true; config["default-level"] = "DEBUG"; LLSD set1; set1["level"] = "WARN"; - set1["files"][0] = this_file; + set1["files"][0] = LLError::abbreviateFile(__FILE__); LLSD set2; set2["level"] = "INFO"; @@ -744,10 +814,9 @@ namespace tut TestAlpha::doAll(); TestBeta::doAll(); - ensure_message_contains(0, "any idea"); - ensure_message_contains(0, this_file); - ensure_message_contains(1, "aim west"); - ensure_message_contains(2, "bad word"); + ensure_message_field_equals(0, MSG_FIELD, "any idea"); + ensure_message_field_equals(1, MSG_FIELD, "aim west"); + ensure_message_field_equals(2, MSG_FIELD, "bad word"); ensure_message_count(3); // make sure reconfiguring works @@ -758,17 +827,75 @@ namespace tut TestAlpha::doAll(); TestBeta::doAll(); - ensure_message_contains(3, "aim west"); - ensure_message_does_not_contain(3, this_file); - ensure_message_contains(4, "error"); - ensure_message_contains(5, "ate eels"); - ensure_message_contains(6, "bad word"); - ensure_message_contains(7, "error"); - ensure_message_contains(8, "big easy"); - ensure_message_count(9); + ensure_message_field_equals(3, MSG_FIELD, "aim west"); + ensure_message_field_equals(4, MSG_FIELD, "ate eels"); + ensure_message_field_equals(5, MSG_FIELD, "bad word"); + ensure_message_field_equals(6, MSG_FIELD, "big easy"); + ensure_message_count(7); } } +namespace +{ + void writeMsgNeedsEscaping() + { + LL_DEBUGS("WriteTag") << "backslash\\" << LL_ENDL; + LL_INFOS("WriteTag") << "newline\nafternewline" << LL_ENDL; + LL_WARNS("WriteTag") << "return\rafterreturn" << LL_ENDL; + + LL_DEBUGS("WriteTag") << "backslash\\backslash\\" << LL_ENDL; + LL_INFOS("WriteTag") << "backslash\\newline\nanothernewline\nafternewline" << LL_ENDL; + LL_WARNS("WriteTag") << "backslash\\returnnewline\r\n\\afterbackslash" << LL_ENDL; + } +}; + +namespace tut +{ + template<> template<> + void ErrorTestObject::test<17>() + // backslash, return, and newline are escaped with backslashes + { + LLError::setDefaultLevel(LLError::LEVEL_DEBUG); + writeMsgNeedsEscaping(); + ensure_message_field_equals(0, MSG_FIELD, "backslash\\\\"); + ensure_message_field_equals(1, MSG_FIELD, "newline\\nafternewline"); + ensure_message_field_equals(2, MSG_FIELD, "return\\rafterreturn"); + ensure_message_field_equals(3, MSG_FIELD, "backslash\\\\backslash\\\\"); + ensure_message_field_equals(4, MSG_FIELD, "backslash\\\\newline\\nanothernewline\\nafternewline"); + ensure_message_field_equals(5, MSG_FIELD, "backslash\\\\returnnewline\\r\\n\\\\afterbackslash"); + ensure_message_count(6); + } +} + +namespace +{ + std::string writeTagWithSpaceReturningLocation() + { + LL_DEBUGS("Write Tag") << "not allowed" << LL_ENDL; int this_line = __LINE__; + + std::ostringstream location; + location << LLError::abbreviateFile(__FILE__).c_str() << "(" << this_line << ")"; + return location.str(); + } +}; + +namespace tut +{ + template<> template<> + void ErrorTestObject::test<18>() + // space character is not allowed in a tag + { + LLError::setDefaultLevel(LLError::LEVEL_DEBUG); + fatalWasCalled = false; + + std::string location = writeTagWithSpaceReturningLocation(); + std::string expected = "Space is not allowed in a log tag at " + location; + ensure_message_field_equals(0, LEVEL_FIELD, "ERROR"); + ensure_message_field_equals(0, MSG_FIELD, expected); + ensure("fatal callback called", fatalWasCalled); + } +} + /* Tests left: handling of classes without LOG_CLASS diff --git a/indra/llcorehttp/httpstats.cpp b/indra/llcorehttp/httpstats.cpp index b2de7f51ff..19eceae5ef 100644 --- a/indra/llcorehttp/httpstats.cpp +++ b/indra/llcorehttp/httpstats.cpp @@ -101,7 +101,7 @@ void HTTPStats::dumpStats() out << (*it).first << " " << (*it).second << std::endl; } - LL_WARNS("HTTP Core") << out.str() << LL_ENDL; + LL_WARNS("HTTPCore") << out.str() << LL_ENDL; } diff --git a/indra/llcorehttp/tests/test_refcounted.hpp b/indra/llcorehttp/tests/test_refcounted.hpp index cb4b50287a..5dff143e5d 100644 --- a/indra/llcorehttp/tests/test_refcounted.hpp +++ b/indra/llcorehttp/tests/test_refcounted.hpp @@ -30,6 +30,7 @@ #include "test_allocator.h" +#if 0 // disable all of this because it's hanging win64 builds? using namespace LLCoreInt; namespace tut @@ -152,5 +153,5 @@ namespace tut ensure(mMemTotal == (GetMemTotal() - sizeof(RefCounted))); } } - +#endif // if 0 #endif // TEST_LLCOREINT_REF_COUNTED_H_ diff --git a/indra/llimage/llimage.cpp b/indra/llimage/llimage.cpp index 3e4c4917a8..4d73533797 100644 --- a/indra/llimage/llimage.cpp +++ b/indra/llimage/llimage.cpp @@ -906,7 +906,7 @@ void LLImageRaw::setDataAndSize(U8 *data, S32 width, S32 height, S8 components) bool LLImageRaw::resize(U16 width, U16 height, S8 components) { - if ((getWidth() == width) && (getHeight() == height) && (getComponents() == components)) + if ((getWidth() == width) && (getHeight() == height) && (getComponents() == components) && !isBufferInvalid()) { return true; } @@ -915,7 +915,7 @@ bool LLImageRaw::resize(U16 width, U16 height, S8 components) allocateDataSize(width,height,components); - return true; + return !isBufferInvalid(); } bool LLImageRaw::setSubImage(U32 x_pos, U32 y_pos, U32 width, U32 height, diff --git a/indra/llimage/llimagebmp.cpp b/indra/llimage/llimagebmp.cpp index e20e1192ed..a5ea5935dc 100644 --- a/indra/llimage/llimagebmp.cpp +++ b/indra/llimage/llimagebmp.cpp @@ -318,7 +318,7 @@ bool LLImageBMP::updateData() if( 0 != mColorPaletteColors ) { - mColorPalette = new U8[color_palette_size]; + mColorPalette = new(std::nothrow) U8[color_palette_size]; if (!mColorPalette) { LL_WARNS() << "Out of memory in LLImageBMP::updateData(), size: " << color_palette_size << LL_ENDL; @@ -344,7 +344,11 @@ bool LLImageBMP::decode(LLImageRaw* raw_image, F32 decode_time) return false; } - raw_image->resize(getWidth(), getHeight(), 3); + if (!raw_image->resize(getWidth(), getHeight(), 3)) + { + setLastError("llimagebmp failed to resize image!"); + return false; + } U8* src = mdata + mBitmapOffset; U8* dst = raw_image->getData(); diff --git a/indra/llimage/llimagedxt.cpp b/indra/llimage/llimagedxt.cpp index 3a7319d765..36317a5ba8 100644 --- a/indra/llimage/llimagedxt.cpp +++ b/indra/llimage/llimagedxt.cpp @@ -289,7 +289,11 @@ bool LLImageDXT::decode(LLImageRaw* raw_image, F32 time) return false; } - raw_image->resize(width, height, ncomponents); + if (!raw_image->resize(width, height, ncomponents)) + { + setLastError("llImageDXT failed to resize image!"); + return false; + } memcpy(raw_image->getData(), data, image_size); /* Flawfinder: ignore */ return true; diff --git a/indra/llimage/llimagejpeg.cpp b/indra/llimage/llimagejpeg.cpp index 5c372eb0e7..6b166769c1 100644 --- a/indra/llimage/llimagejpeg.cpp +++ b/indra/llimage/llimagejpeg.cpp @@ -29,6 +29,7 @@ #include "llimagejpeg.h" #include "llerror.h" +#include "llexception.h" jmp_buf LLImageJPEG::sSetjmpBuffer ; LLImageJPEG::LLImageJPEG(S32 quality) @@ -256,7 +257,10 @@ bool LLImageJPEG::decode(LLImageRaw* raw_image, F32 decode_time) setSize(cinfo.image_width, cinfo.image_height, 3); // Force to 3 components (RGB) - raw_image->resize(getWidth(), getHeight(), getComponents()); + if (!raw_image->resize(getWidth(), getHeight(), getComponents())) + { + throw std::bad_alloc(); + } raw_image_data = raw_image->getData(); @@ -311,6 +315,13 @@ bool LLImageJPEG::decode(LLImageRaw* raw_image, F32 decode_time) jpeg_destroy_decompress(&cinfo); } + catch (std::bad_alloc) + { + setLastError( "Out of memory"); + jpeg_destroy_decompress(&cinfo); + return true; // done + } + catch (int) { jpeg_destroy_decompress(&cinfo); @@ -370,10 +381,11 @@ boolean LLImageJPEG::encodeEmptyOutputBuffer( j_compress_ptr cinfo ) // Double the buffer size; S32 new_buffer_size = self->mOutputBufferSize * 2; - U8* new_buffer = new U8[ new_buffer_size ]; + U8* new_buffer = new(std::nothrow) U8[ new_buffer_size ]; if (!new_buffer) { - LL_WARNS() << "Out of memory in LLImageJPEG::encodeEmptyOutputBuffer( j_compress_ptr cinfo ), size: " << new_buffer_size << LL_ENDL; + self->setLastError("Out of memory in LLImageJPEG::encodeEmptyOutputBuffer( j_compress_ptr cinfo )"); + LLTHROW(LLContinueError("Out of memory in LLImageJPEG::encodeEmptyOutputBuffer( j_compress_ptr cinfo )")); return false; } memcpy( new_buffer, self->mOutputBuffer, self->mOutputBufferSize ); /* Flawfinder: ignore */ @@ -494,11 +506,13 @@ bool LLImageJPEG::encode( const LLImageRaw* raw_image, F32 encode_time ) disclaimMem(mOutputBufferSize); mOutputBufferSize = getWidth() * getHeight() * getComponents() + 1024; claimMem(mOutputBufferSize); - mOutputBuffer = new U8[ mOutputBufferSize ]; - if(!mOutputBuffer) + mOutputBuffer = new(std::nothrow) U8[ mOutputBufferSize ]; + if (mOutputBuffer == NULL) { - LL_WARNS() << "could not allocate memory for image encoding, size:" << mOutputBufferSize << LL_ENDL; - return FALSE; + disclaimMem(mOutputBufferSize); + mOutputBufferSize = 0; + setLastError("Failed to allocate output buffer"); + return false; } const U8* raw_image_data = NULL; diff --git a/indra/llimage/llimagepng.cpp b/indra/llimage/llimagepng.cpp index 2288fbb793..2ccb87e4e6 100644 --- a/indra/llimage/llimagepng.cpp +++ b/indra/llimage/llimagepng.cpp @@ -125,7 +125,12 @@ bool LLImagePNG::encode(const LLImageRaw* raw_image, F32 encode_time) // Temporary buffer to hold the encoded image. Note: the final image // size should be much smaller due to compression. U32 bufferSize = getWidth() * getHeight() * getComponents() + 8192; - U8* tmpWriteBuffer = new U8[ bufferSize ]; + U8* tmpWriteBuffer = new(std::nothrow) U8[ bufferSize ]; + if (!tmpWriteBuffer) + { + setLastError("LLImagePNG::out of memory"); + return false; + } // Delegate actual encoding work to wrapper LLPngWrapper pngWrapper; diff --git a/indra/llimage/llimagetga.cpp b/indra/llimage/llimagetga.cpp index b19a1707a1..d43f8dcc3b 100644 --- a/indra/llimage/llimagetga.cpp +++ b/indra/llimage/llimagetga.cpp @@ -263,7 +263,7 @@ bool LLImageTGA::updateData() // only allocate memory for one if _we_ intend to use it. if ( (1 == mImageType) || (9 == mImageType) ) { - mColorMap = new U8[ color_map_bytes ]; + mColorMap = new(std::nothrow) U8[ color_map_bytes ]; if (!mColorMap) { LL_WARNS() << "Out of Memory in bool LLImageTGA::updateData(), size: " << color_map_bytes << LL_ENDL; @@ -336,7 +336,11 @@ bool LLImageTGA::decode(LLImageRaw* raw_image, F32 decode_time) // Copy everything after the header. - raw_image->resize(getWidth(), getHeight(), getComponents()); + if( !raw_image->resize(getWidth(), getHeight(), getComponents())) + { + setLastError("LLImageTGA::out of memory"); + return false; + } // Handle out of memory situations a bit more graceful than a crash if( raw_image->isBufferInvalid() ) @@ -351,6 +355,11 @@ bool LLImageTGA::decode(LLImageRaw* raw_image, F32 decode_time) return false; } + if( raw_image->isBufferInvalid()) + { + setLastError("LLImageTGA::out of memory"); + return false; + } if( mOriginRightBit ) { @@ -405,6 +414,11 @@ bool LLImageTGA::decodeTruecolor( LLImageRaw* raw_image, bool rle, bool flipped // alpha was entirely opaque // convert to 24 bit image LLPointer compacted_image = new LLImageRaw(raw_image->getWidth(), raw_image->getHeight(), 3); + if (compacted_image->isBufferInvalid()) + { + success = false; + break; + } compacted_image->copy(raw_image); raw_image->resize(raw_image->getWidth(), raw_image->getHeight(), 3); raw_image->copy(compacted_image); @@ -421,9 +435,16 @@ bool LLImageTGA::decodeTruecolor( LLImageRaw* raw_image, bool rle, bool flipped // alpha was entirely opaque // convert to 24 bit image LLPointer compacted_image = new LLImageRaw(raw_image->getWidth(), raw_image->getHeight(), 3); - compacted_image->copy(raw_image); - raw_image->resize(raw_image->getWidth(), raw_image->getHeight(), 3); - raw_image->copy(compacted_image); + if (compacted_image->isBufferInvalid()) + { + success = false; + } + else + { + compacted_image->copy(raw_image); + raw_image->resize(raw_image->getWidth(), raw_image->getHeight(), 3); + raw_image->copy(compacted_image); + } } } @@ -1069,7 +1090,11 @@ bool LLImageTGA::decodeAndProcess( LLImageRaw* raw_image, F32 domain, F32 weight return false; } - raw_image->resize(getWidth(), getHeight(), getComponents()); + if( !raw_image->resize(getWidth(), getHeight(), getComponents()) ) + { + LL_ERRS() << "LLImageTGA: Failed to resize image" << LL_ENDL; + return false; + } U8* dst = raw_image->getData(); U8* src = getData() + mDataOffset; diff --git a/indra/llimage/llpngwrapper.cpp b/indra/llimage/llpngwrapper.cpp index eb70b78a36..f298764cc0 100644 --- a/indra/llimage/llpngwrapper.cpp +++ b/indra/llimage/llpngwrapper.cpp @@ -173,8 +173,11 @@ BOOL LLPngWrapper::readPng(U8* src, S32 dataSize, LLImageRaw* rawImage, ImageInf // data space if (rawImage != NULL) { - rawImage->resize(static_cast(mWidth), - static_cast(mHeight), mChannels); + if (!rawImage->resize(static_cast(mWidth), + static_cast(mHeight), mChannels)) + { + LLTHROW(PngError("Failed to resize image")); + } U8 *dest = rawImage->getData(); int offset = mWidth * mChannels; @@ -207,6 +210,12 @@ BOOL LLPngWrapper::readPng(U8* src, S32 dataSize, LLImageRaw* rawImage, ImageInf releaseResources(); return (FALSE); } + catch (std::bad_alloc) + { + mErrorMessage = "LLPngWrapper"; + releaseResources(); + return (FALSE); + } // Clean up and return releaseResources(); diff --git a/indra/llinventory/llinventorytype.cpp b/indra/llinventory/llinventorytype.cpp index 401825e460..481c8b0f73 100644 --- a/indra/llinventory/llinventorytype.cpp +++ b/indra/llinventory/llinventorytype.cpp @@ -182,7 +182,7 @@ LLInventoryType::EType LLInventoryType::defaultForAssetType(LLAssetType::EType a } else { - return IT_NONE; + return IT_UNKNOWN; } } diff --git a/indra/llinventory/llinventorytype.h b/indra/llinventory/llinventorytype.h index fc3c78cf50..891ab217fd 100644 --- a/indra/llinventory/llinventorytype.h +++ b/indra/llinventory/llinventorytype.h @@ -66,6 +66,7 @@ public: IT_PERSON = 24, IT_COUNT = 25, + IT_UNKNOWN = 255, IT_NONE = -1 }; @@ -111,6 +112,7 @@ public: ICONNAME_MESH, ICONNAME_INVALID, + ICONNAME_UNKNOWN, ICONNAME_COUNT, ICONNAME_NONE = -1 }; diff --git a/indra/llmessage/lliosocket.cpp b/indra/llmessage/lliosocket.cpp index 5cdaec0f6c..6462d9e1d3 100644 --- a/indra/llmessage/lliosocket.cpp +++ b/indra/llmessage/lliosocket.cpp @@ -101,7 +101,7 @@ void ll_debug_socket(const char* msg, apr_socket_t* apr_sock) /// // static -LLSocket::ptr_t LLSocket::create(apr_pool_t* pool, EType type, U16 port) +LLSocket::ptr_t LLSocket::create(apr_pool_t* pool, EType type, U16 port, const char *hostname) { LLSocket::ptr_t rv; apr_socket_t* socket = NULL; @@ -150,7 +150,7 @@ LLSocket::ptr_t LLSocket::create(apr_pool_t* pool, EType type, U16 port) apr_sockaddr_t* sa = NULL; status = apr_sockaddr_info_get( &sa, - APR_ANYADDR, + hostname, APR_UNSPEC, port, 0, diff --git a/indra/llmessage/lliosocket.h b/indra/llmessage/lliosocket.h index f840f0275c..303d80eb14 100644 --- a/indra/llmessage/lliosocket.h +++ b/indra/llmessage/lliosocket.h @@ -96,12 +96,14 @@ public: * and associated with the socket. * @param type The type of socket to create * @param port The port for the socket + * @param hostname e.g. APR_ANYADDR to listen openly, or "127.0.0.1" * @return A valid socket shared pointer if the call worked. */ static ptr_t create( apr_pool_t* pool, EType type, - U16 port = PORT_EPHEMERAL); + U16 port = PORT_EPHEMERAL, + const char *hostname = APR_ANYADDR); /** * @brief Create a LLSocket when you already have an apr socket. diff --git a/indra/llmessage/lltransfermanager.cpp b/indra/llmessage/lltransfermanager.cpp index ec7b21d8b6..452b77fb6d 100644 --- a/indra/llmessage/lltransfermanager.cpp +++ b/indra/llmessage/lltransfermanager.cpp @@ -62,9 +62,11 @@ LLTransferManager::LLTransferManager() : LLTransferManager::~LLTransferManager() { + // LLTransferManager should have been cleaned up by message system shutdown process + llassert(!mValid); if (mValid) { - LL_WARNS() << "LLTransferManager::~LLTransferManager - Should have been cleaned up by message system shutdown process" << LL_ENDL; + // Usually happens if OS tries to kill viewer cleanup(); } } diff --git a/indra/llrender/llimagegl.cpp b/indra/llrender/llimagegl.cpp index 753ab70cfb..8c1a45d022 100644 --- a/indra/llrender/llimagegl.cpp +++ b/indra/llrender/llimagegl.cpp @@ -1270,7 +1270,8 @@ BOOL LLImageGL::createGLTexture() stop_glerror(); if (!mTexName) { - LL_ERRS() << "LLImageGL::createGLTexture failed to make an empty texture" << LL_ENDL; + LL_WARNS() << "LLImageGL::createGLTexture failed to make an empty texture" << LL_ENDL; + return FALSE; } return TRUE ; @@ -1403,7 +1404,16 @@ BOOL LLImageGL::createGLTexture(S32 discard_level, const U8* data_in, BOOL data_ } if (!mTexName) { - LL_ERRS() << "LLImageGL::createGLTexture failed to make texture" << LL_ENDL; + if (old_name) + { + sGlobalTextureMemory -= mTextureMemory; + LLImageGL::deleteTextures(1, &old_name); + disclaimMem(mTextureMemory); + stop_glerror(); + } + + LL_WARNS() << "LLImageGL::createGLTexture failed to make texture" << LL_ENDL; + return FALSE; } if (mUseMipMaps) diff --git a/indra/llui/llscrolllistctrl.cpp b/indra/llui/llscrolllistctrl.cpp index 7e99a4b4c8..88552d8770 100644 --- a/indra/llui/llscrolllistctrl.cpp +++ b/indra/llui/llscrolllistctrl.cpp @@ -203,9 +203,9 @@ LLScrollListCtrl::LLScrollListCtrl(const LLScrollListCtrl::Params& p) mHoveredColor(p.hovered_color()), mSearchColumn(p.search_column), mColumnPadding(p.column_padding), - // Fix for FS-specific people list (radar) - //mContextMenuType(MENU_NONE) mContextMenuType(MENU_NONE), + mIsFriendSignal(NULL), + // Fix for FS-specific people list (radar) mFilterColumn(-1), mIsFiltered(false), mPersistSortOrder(p.persist_sort_order), @@ -386,6 +386,7 @@ LLScrollListCtrl::~LLScrollListCtrl() mItemList.clear(); std::for_each(mColumns.begin(), mColumns.end(), DeletePairedPointer()); mColumns.clear(); + delete mIsFriendSignal; } @@ -2065,6 +2066,19 @@ BOOL LLScrollListCtrl::handleRightMouseDown(S32 x, S32 y, MASK mask) menu_name, LLMenuGL::sMenuContainer, LLMenuHolderGL::child_registry_t::instance()); if (mPopupMenu) { + if (mIsFriendSignal) + { + bool isFriend = *(*mIsFriendSignal)(uuid); + LLView* addFriendButton = mPopupMenu->getChild("add_friend"); + LLView* removeFriendButton = mPopupMenu->getChild("remove_friend"); + + if (addFriendButton && removeFriendButton) + { + addFriendButton->setEnabled(!isFriend); + removeFriendButton->setEnabled(isFriend); + } + } + mPopupMenu->show(x, y); LLMenuGL::showPopup(this, mPopupMenu, x, y); return TRUE; @@ -3409,6 +3423,15 @@ void LLScrollListCtrl::onFocusLost() LLUICtrl::onFocusLost(); } +boost::signals2::connection LLScrollListCtrl::setIsFriendCallback(const is_friend_signal_t::slot_type& cb) +{ + if (!mIsFriendSignal) + { + mIsFriendSignal = new is_friend_signal_t(); + } + return mIsFriendSignal->connect(cb); +} + // Fix for FS-specific people list (radar) void LLScrollListCtrl::setFilterString(const std::string& str) { diff --git a/indra/llui/llscrolllistctrl.h b/indra/llui/llscrolllistctrl.h index 0726a1d7c5..2704747dbf 100644 --- a/indra/llui/llscrolllistctrl.h +++ b/indra/llui/llscrolllistctrl.h @@ -90,6 +90,7 @@ public: typedef boost::signals2::signal > sort_signal_t; + typedef boost::signals2::signal is_friend_signal_t; struct Params : public LLInitParam::Block { @@ -414,6 +415,8 @@ public: return mSortCallback->connect(cb); } + boost::signals2::connection setIsFriendCallback(const is_friend_signal_t::slot_type& cb); + // For manually setting line height; we might need it at some time void setLineHeight(S32 height) { mLineHeight = height; } @@ -562,6 +565,8 @@ private: std::vector mSortColumns; sort_signal_t* mSortCallback; + + is_friend_signal_t* mIsFriendSignal; }; // end class LLScrollListCtrl #endif // LL_SCROLLLISTCTRL_H diff --git a/indra/llwindow/llwindowwin32.cpp b/indra/llwindow/llwindowwin32.cpp index 3686e35d8a..5c05b1d105 100644 --- a/indra/llwindow/llwindowwin32.cpp +++ b/indra/llwindow/llwindowwin32.cpp @@ -758,9 +758,6 @@ void LLWindowWin32::close() mDragDrop->reset(); - // Make sure cursor is visible and we haven't mangled the clipping state. - setMouseClipping(FALSE); - showCursor(); // Go back to screen mode written in the registry. if (mFullscreen) @@ -768,9 +765,23 @@ void LLWindowWin32::close() resetDisplayResolution(); } + // Don't process events in our mainWindowProc any longer. + SetWindowLongPtr(mWindowHandle, GWLP_USERDATA, NULL); + + // Make sure cursor is visible and we haven't mangled the clipping state. + showCursor(); + setMouseClipping(FALSE); + if (gKeyboard) + { + gKeyboard->resetKeys(); + } + // Clean up remaining GL state - LL_DEBUGS("Window") << "Shutting down GL" << LL_ENDL; - gGLManager.shutdownGL(); + if (gGLManager.mInited) + { + LL_INFOS("Window") << "Cleaning up GL" << LL_ENDL; + gGLManager.shutdownGL(); + } LL_DEBUGS("Window") << "Releasing Context" << LL_ENDL; if (mhRC) @@ -791,16 +802,16 @@ void LLWindowWin32::close() // Restore gamma to the system values. restoreGamma(); - if (mhDC && !ReleaseDC(mWindowHandle, mhDC)) + if (mhDC) { - LL_WARNS("Window") << "Release of mhDC failed" << LL_ENDL; + if (!ReleaseDC(mWindowHandle, mhDC)) + { + LL_WARNS("Window") << "Release of mhDC failed" << LL_ENDL; + } mhDC = NULL; } LL_DEBUGS("Window") << "Destroying Window" << LL_ENDL; - - // Don't process events in our mainWindowProc any longer. - SetWindowLongPtr(mWindowHandle, GWLP_USERDATA, NULL); // Make sure we don't leave a blank toolbar button. ShowWindow(mWindowHandle, SW_HIDE); diff --git a/indra/newview/app_settings/grids.xml b/indra/newview/app_settings/grids.xml index b298b7fa64..8d21457e45 100644 --- a/indra/newview/app_settings/grids.xml +++ b/indra/newview/app_settings/grids.xml @@ -564,7 +564,7 @@ util.aditi.lindenlab.com LastModified - 2018-06-22T22:15:00Z + 2018-09-26T20:15:00Z app_slurl_base secondlife:///app gridname @@ -572,7 +572,7 @@ gridnick aditi helperuri - http://aditi-secondlife.webdev.lindenlab.com/helpers/ + https://secondlife.aditi.lindenlab.com/helpers/ login_identifier_types agent diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp index 1f0b9c069d..6ffa8d0298 100644 --- a/indra/newview/llagent.cpp +++ b/indra/newview/llagent.cpp @@ -5032,6 +5032,7 @@ void LLAgent::setTeleportState(ETeleportState state) " for previously failed teleport. Ignore!" << LL_ENDL; return; } + LL_DEBUGS("Teleport") << "Setting teleport state to " << state << " Previous state: " << mTeleportState << LL_ENDL; mTeleportState = state; if (mTeleportState > TELEPORT_NONE && gSavedSettings.getBOOL("FreezeTime")) { diff --git a/indra/newview/llagent.h b/indra/newview/llagent.h index c4bead4531..8e150081b2 100644 --- a/indra/newview/llagent.h +++ b/indra/newview/llagent.h @@ -725,6 +725,7 @@ public: // void teleportViaLocationLookAt(const LLVector3d& pos_global);// To a global location, preserving camera rotation void teleportCancel(); // May or may not be allowed by server void restoreCanceledTeleportRequest(); + bool canRestoreCanceledTeleport() { return mTeleportCanceled != NULL; } bool getTeleportKeepsLookAt() { return mbTeleportKeepsLookAt; } // Whether look-at reset after teleport // Client LSL Bridge bool teleportBridgeLocal(LLVector3& pos_local); // Teleport using LSL Bridge diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index df3120526e..8415f3e356 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -3769,7 +3769,7 @@ LLSD LLAppViewer::getViewerInfo() const } else { - LL_WARNS("Driver version")<< "Cannot get driver version from getDriverVersionWMI" << LL_ENDL; + LL_WARNS("DriverVersion")<< "Cannot get driver version from getDriverVersionWMI" << LL_ENDL; LLSD driver_info = gDXHardware.getDisplayInfo(); if (driver_info.has("DriverVersion")) { diff --git a/indra/newview/llappviewerwin32.cpp b/indra/newview/llappviewerwin32.cpp index 35760f9921..60ae1dc875 100644 --- a/indra/newview/llappviewerwin32.cpp +++ b/indra/newview/llappviewerwin32.cpp @@ -790,7 +790,7 @@ void LLAppViewerWin32::initCrashReporting(bool reportFreeze) &processInfo) == FALSE) // Could not start application -> call 'GetLastError()' { - LL_WARNS("CrashReport Launch") << "CreateProcess failed " << GetLastError() << LL_ENDL; + LL_WARNS("CrashReport") << "CreateProcess failed " << GetLastError() << LL_ENDL; return; } } diff --git a/indra/newview/llchicletbar.cpp b/indra/newview/llchicletbar.cpp index 6b931e0468..ddf1998c89 100644 --- a/indra/newview/llchicletbar.cpp +++ b/indra/newview/llchicletbar.cpp @@ -185,7 +185,7 @@ void LLChicletBar::log(LLView* panel, const std::string& descr) { if (NULL == panel) return; LLView* layout = panel->getParent(); - LL_DEBUGS("Chiclet Bar Rects") << descr << ": " + LL_DEBUGS("ChicletBarRects") << descr << ": " << "panel: " << panel->getName() << ", rect: " << panel->getRect() << " layout: " << layout->getName() diff --git a/indra/newview/llestateinfomodel.cpp b/indra/newview/llestateinfomodel.cpp index e56a67f8d1..95d40be913 100644 --- a/indra/newview/llestateinfomodel.cpp +++ b/indra/newview/llestateinfomodel.cpp @@ -93,7 +93,7 @@ void LLEstateInfoModel::update(const strings_t& strings) mFlags = strtoul(strings[3].c_str(), NULL, 10); mSunHour = ((F32)(strtod(strings[4].c_str(), NULL)))/1024.0f; - LL_DEBUGS("Windlight Sync") << "Received estate info: " + LL_DEBUGS("WindlightSync") << "Received estate info: " << "is_sun_fixed = " << getUseFixedSun() << ", sun_hour = " << getSunHour() << LL_ENDL; LL_DEBUGS() << getInfoDump() << LL_ENDL; @@ -151,7 +151,7 @@ void LLEstateInfoModel::commitEstateInfoCapsCoro(std::string url) body["invoice"] = LLFloaterRegionInfo::getLastInvoice(); - LL_DEBUGS("Windlight Sync") << "Sending estate caps: " + LL_DEBUGS("WindlightSync") << "Sending estate caps: " << "is_sun_fixed = " << getUseFixedSun() << ", sun_hour = " << getSunHour() << LL_ENDL; LL_DEBUGS() << body << LL_ENDL; @@ -181,7 +181,7 @@ void LLEstateInfoModel::commitEstateInfoCapsCoro(std::string url) // strings[3] = str((S32)(sun_hour * 1024.f)) void LLEstateInfoModel::commitEstateInfoDataserver() { - LL_DEBUGS("Windlight Sync") << "Sending estate info: " + LL_DEBUGS("WindlightSync") << "Sending estate info: " << "is_sun_fixed = " << getUseFixedSun() << ", sun_hour = " << getSunHour() << LL_ENDL; LL_DEBUGS() << getInfoDump() << LL_ENDL; diff --git a/indra/newview/llfeaturemanager.cpp b/indra/newview/llfeaturemanager.cpp index bc44ccc162..0951dc8a55 100644 --- a/indra/newview/llfeaturemanager.cpp +++ b/indra/newview/llfeaturemanager.cpp @@ -382,6 +382,43 @@ bool LLFeatureManager::parseFeatureTable(std::string filename) F32 gpu_benchmark(); +#if LL_WINDOWS + +static const U32 STATUS_MSC_EXCEPTION = 0xE06D7363; // compiler specific + +U32 exception_benchmark_filter(U32 code, struct _EXCEPTION_POINTERS *exception_infop) +{ + if (code == STATUS_MSC_EXCEPTION) + { + // C++ exception, go on + return EXCEPTION_CONTINUE_SEARCH; + } + else + { + // handle it + return EXCEPTION_EXECUTE_HANDLER; + } +} + +F32 logExceptionBenchmark() +{ + // Todo: make a wrapper/class for SEH exceptions + F32 gbps = -1; + __try + { + gbps = gpu_benchmark(); + } + __except (exception_benchmark_filter(GetExceptionCode(), GetExceptionInformation())) + { + // convert to C++ styled exception + char integer_string[32]; + sprintf(integer_string, "SEH, code: %lu\n", GetExceptionCode()); + throw std::exception(integer_string); + } + return gbps; +} +#endif + bool LLFeatureManager::loadGPUClass() { if (!gSavedSettings.getBOOL("SkipBenchmark")) @@ -392,10 +429,13 @@ bool LLFeatureManager::loadGPUClass() { // Allow to skip gpu_benchmark with -noprobe. // This can make sense for some Intel GPUs which can take 15+ Minutes or crash during gpu_benchmark - // gbps = gpu_benchmark(); gbps = -1.0f; if( !gSavedSettings.getBOOL( "NoHardwareProbe" ) ) +#if LL_WINDOWS + gbps = logExceptionBenchmark(); +#else gbps = gpu_benchmark(); +#endif // } catch (const std::exception& e) @@ -411,11 +451,11 @@ bool LLFeatureManager::loadGPUClass() LL_WARNS("RenderInit") << "Unable to get an accurate benchmark; defaulting to class 3" << LL_ENDL; mGPUClass = GPU_CLASS_3; #else - if (gGLManager.mGLVersion < 2.f) + if (gGLManager.mGLVersion <= 2.f) { mGPUClass = GPU_CLASS_0; } - else if (gGLManager.mGLVersion < 3.f) + else if (gGLManager.mGLVersion <= 3.f) { mGPUClass = GPU_CLASS_1; } @@ -431,6 +471,11 @@ bool LLFeatureManager::loadGPUClass() { mGPUClass = GPU_CLASS_4; } + if (gGLManager.mIsIntel && mGPUClass > GPU_CLASS_1) + { + // Intels are generally weaker then other GPUs despite having advanced features + mGPUClass = (EGPUClass)(mGPUClass - 1); + } #endif } else if (gGLManager.mGLVersion <= 2.f) diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp index 3e0b0803e2..74b5c68814 100644 --- a/indra/newview/llfloaterpreference.cpp +++ b/indra/newview/llfloaterpreference.cpp @@ -4285,6 +4285,18 @@ void LLPanelPreferenceGraphics::cancel() void LLPanelPreferenceGraphics::saveSettings() { resetDirtyChilds(); + // Improved graphics preferences; We don't need this + //std::string preset_graphic_active = gSavedSettings.getString("PresetGraphicActive"); + //if (preset_graphic_active.empty()) + //{ + // LLFloaterPreference* instance = LLFloaterReg::findTypedInstance("preferences"); + // if (instance) + // { + // //don't restore previous preset after closing Preferences + // instance->saveGraphicsPreset(preset_graphic_active); + // } + //} + // LLPanelPreference::saveSettings(); } void LLPanelPreferenceGraphics::setHardwareDefaults() diff --git a/indra/newview/llfloaterregioninfo.cpp b/indra/newview/llfloaterregioninfo.cpp index ec5dbf7eb3..e9bf536df1 100644 --- a/indra/newview/llfloaterregioninfo.cpp +++ b/indra/newview/llfloaterregioninfo.cpp @@ -3494,14 +3494,14 @@ void LLPanelEnvironmentInfo::sendRegionSunUpdate() param_set.setAll(sky_map.beginMap()->second); F32 sun_angle = param_set.getSunAngle(); - LL_DEBUGS("Windlight Sync") << "Old sun hour: " << region_info.mSunHour << LL_ENDL; + LL_DEBUGS("WindlightSync") << "Old sun hour: " << region_info.mSunHour << LL_ENDL; // convert value range from 0..2pi to 6..30 region_info.mSunHour = fmodf((sun_angle / F_TWO_PI) * 24.f, 24.f) + 6.f; } region_info.setUseFixedSun(region_use_fixed_sky); region_info.mUseEstateSun = !region_use_fixed_sky; - LL_DEBUGS("Windlight Sync") << "Sun hour: " << region_info.mSunHour << LL_ENDL; + LL_DEBUGS("WindlightSync") << "Sun hour: " << region_info.mSunHour << LL_ENDL; region_info.sendRegionTerrain(LLFloaterRegionInfo::getLastInvoice()); } diff --git a/indra/newview/llfloatersaveprefpreset.cpp b/indra/newview/llfloatersaveprefpreset.cpp index bdef718d0e..684778c93a 100644 --- a/indra/newview/llfloatersaveprefpreset.cpp +++ b/indra/newview/llfloatersaveprefpreset.cpp @@ -34,6 +34,7 @@ #include "llfloaterreg.h" #include "llnotificationsutil.h" #include "llpresetsmanager.h" +#include "lltrans.h" LLFloaterSavePrefPreset::LLFloaterSavePrefPreset(const LLSD &key) : LLFloater(key) @@ -76,7 +77,7 @@ void LLFloaterSavePrefPreset::onOpen(const LLSD& key) setTitle(floater_title); - EDefaultOptions option = DEFAULT_TOP; + EDefaultOptions option = DEFAULT_HIDE; LLPresetsManager::getInstance()->setPresetNamesInComboBox(mSubdirectory, mPresetCombo, option); onPresetNameEdited(); @@ -86,7 +87,11 @@ void LLFloaterSavePrefPreset::onBtnSave() { std::string name = mPresetCombo->getSimple(); - if (!LLPresetsManager::getInstance()->savePreset(mSubdirectory, name)) + if ((name == LLTrans::getString(PRESETS_DEFAULT)) || (name == PRESETS_DEFAULT)) + { + LLNotificationsUtil::add("DefaultPresetNotSaved"); + } + else if (!LLPresetsManager::getInstance()->savePreset(mSubdirectory, name)) { LLSD args; args["NAME"] = name; @@ -98,7 +103,7 @@ void LLFloaterSavePrefPreset::onBtnSave() void LLFloaterSavePrefPreset::onPresetsListChange() { - EDefaultOptions option = DEFAULT_TOP; + EDefaultOptions option = DEFAULT_HIDE; LLPresetsManager::getInstance()->setPresetNamesInComboBox(mSubdirectory, mPresetCombo, option); } diff --git a/indra/newview/llfloatertools.cpp b/indra/newview/llfloatertools.cpp index 006f1d536e..b4a869cdf9 100644 --- a/indra/newview/llfloatertools.cpp +++ b/indra/newview/llfloatertools.cpp @@ -1511,7 +1511,7 @@ void LLFloaterTools::getMediaState() if(!has_media_capability) { getChildView("add_media")->setEnabled(FALSE); - LL_WARNS("LLFloaterTools: media") << "Media not enabled (no capability) in this region!" << LL_ENDL; + LL_WARNS("LLFloaterToolsMedia") << "Media not enabled (no capability) in this region!" << LL_ENDL; clearMediaSettings(); return; } @@ -1535,7 +1535,7 @@ void LLFloaterTools::getMediaState() { if (!object->permModify()) { - LL_INFOS("LLFloaterTools: media") + LL_INFOS("LLFloaterToolsMedia") << "Selection not editable due to lack of modify permissions on object id " << object->getID() << LL_ENDL; @@ -1548,7 +1548,7 @@ void LLFloaterTools::getMediaState() // contention as to whether this is a sufficient solution. // if (object->isMediaDataBeingFetched()) // { -// LL_INFOS("LLFloaterTools: media") +// LL_INFOS("LLFloaterToolsMedia") // << "Selection not editable due to media data being fetched for object id " // << object->getID() << LL_ENDL; // diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp index db7a4e6abd..c7a02e7115 100644 --- a/indra/newview/llinventorybridge.cpp +++ b/indra/newview/llinventorybridge.cpp @@ -1563,7 +1563,9 @@ LLInvFVBridge* LLInvFVBridge::createBridge(LLAssetType::EType asset_type, } new_listener = new LLMeshBridge(inventory, root, uuid); break; - + case LLAssetType::AT_UNKNOWN: + new_listener = new LLUnknownItemBridge(inventory, root, uuid); + break; case LLAssetType::AT_IMAGE_TGA: case LLAssetType::AT_IMAGE_JPEG: //LL_WARNS() << LLAssetType::lookup(asset_type) << " asset type is unhandled for uuid " << uuid << LL_ENDL; @@ -7670,6 +7672,21 @@ const LLUUID &LLLinkFolderBridge::getFolderID() const return LLUUID::null; } +void LLUnknownItemBridge::buildContextMenu(LLMenuGL& menu, U32 flags) +{ + menuentry_vec_t items; + menuentry_vec_t disabled_items; + items.push_back(std::string("Properties")); + items.push_back(std::string("Rename")); + hide_context_entries(menu, items, disabled_items); +} + +LLUIImagePtr LLUnknownItemBridge::getIcon() const +{ + return LLInventoryIcon::getIcon(LLAssetType::AT_UNKNOWN, mInvType); +} + + /******************************************************************************** ** ** BRIDGE ACTIONS @@ -8045,7 +8062,7 @@ void LLFolderViewGroupedItemBridge::groupFilterContextMenu(folder_view_item_dequ menuentry_vec_t disabled_items; if (get_selection_item_uuids(selected_items, ids)) { - if (!LLAppearanceMgr::instance().canAddWearables(ids)) + if (!LLAppearanceMgr::instance().canAddWearables(ids) && canWearSelected(ids)) { disabled_items.push_back(std::string("Wearable Add")); } @@ -8053,6 +8070,20 @@ void LLFolderViewGroupedItemBridge::groupFilterContextMenu(folder_view_item_dequ disable_context_entries_if_present(menu, disabled_items); } +bool LLFolderViewGroupedItemBridge::canWearSelected(uuid_vec_t item_ids) +{ + for (uuid_vec_t::const_iterator it = item_ids.begin(); it != item_ids.end(); ++it) + { + LLViewerInventoryItem* item = gInventory.getItem(*it); + LLAssetType::EType asset_type = item->getType(); + if (!item || (asset_type >= LLAssetType::AT_COUNT) || (asset_type <= LLAssetType::AT_NONE)) + { + return false; + } + } + return true; +} + /************************************************************************/ /* Worn Inventory Panel related classes */ /************************************************************************/ diff --git a/indra/newview/llinventorybridge.h b/indra/newview/llinventorybridge.h index 868822d592..629a753104 100644 --- a/indra/newview/llinventorybridge.h +++ b/indra/newview/llinventorybridge.h @@ -599,6 +599,17 @@ protected: static std::string sPrefix; }; +class LLUnknownItemBridge : public LLItemBridge +{ +public: + LLUnknownItemBridge(LLInventoryPanel* inventory, + LLFolderView* root, + const LLUUID& uuid) : + LLItemBridge(inventory, root, uuid) {} + virtual LLUIImagePtr getIcon() const; + virtual void buildContextMenu(LLMenuGL& menu, U32 flags); +}; + class LLLinkFolderBridge : public LLItemBridge { public: @@ -808,6 +819,7 @@ class LLFolderViewGroupedItemBridge: public LLFolderViewGroupedItemModel public: LLFolderViewGroupedItemBridge(); virtual void groupFilterContextMenu(folder_view_item_deque& selected_items, LLMenuGL& menu); + bool canWearSelected(uuid_vec_t item_ids); }; #endif // LL_LLINVENTORYBRIDGE_H diff --git a/indra/newview/llinventoryfilter.cpp b/indra/newview/llinventoryfilter.cpp index 28fdacdba8..3b93a664e3 100644 --- a/indra/newview/llinventoryfilter.cpp +++ b/indra/newview/llinventoryfilter.cpp @@ -216,7 +216,7 @@ bool LLInventoryFilter::checkFolder(const LLUUID& folder_id) const // we're showing all folders, overriding filter if (mFilterOps.mShowFolderState == LLInventoryFilter::SHOW_ALL_FOLDERS) { - return !gInventory.isCategoryHidden(folder_id); + return true; } // when applying a filter, matching folders get their contents downloaded first diff --git a/indra/newview/llinventoryicon.cpp b/indra/newview/llinventoryicon.cpp index 2f5a83840e..961d960cf7 100644 --- a/indra/newview/llinventoryicon.cpp +++ b/indra/newview/llinventoryicon.cpp @@ -93,6 +93,7 @@ LLIconDictionary::LLIconDictionary() addEntry(LLInventoryType::ICONNAME_MESH, new IconEntry("Inv_Mesh")); addEntry(LLInventoryType::ICONNAME_INVALID, new IconEntry("Inv_Invalid")); + addEntry(LLInventoryType::ICONNAME_UNKNOWN, new IconEntry("Inv_Unknown")); addEntry(LLInventoryType::ICONNAME_NONE, new IconEntry("NONE")); } @@ -169,6 +170,8 @@ const std::string& LLInventoryIcon::getIconName(LLAssetType::EType asset_type, break; case LLAssetType::AT_MESH: idx = LLInventoryType::ICONNAME_MESH; + case LLAssetType::AT_UNKNOWN: + idx = LLInventoryType::ICONNAME_UNKNOWN; default: break; } diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp index 375c659fef..92620cb288 100644 --- a/indra/newview/llinventorymodel.cpp +++ b/indra/newview/llinventorymodel.cpp @@ -362,34 +362,6 @@ LLViewerInventoryCategory* LLInventoryModel::getCategory(const LLUUID& id) const return category; } -bool LLInventoryModel::isCategoryHidden(const LLUUID& id) const -{ - // Show inbox folder depending on FSShowInboxFolder setting - static LLCachedControl fsShowInboxFolder(gSavedSettings, "FSShowInboxFolder"); - - bool res = false; - const LLViewerInventoryCategory* category = getCategory(id); - if (category) - { - LLFolderType::EType cat_type = category->getPreferredType(); - switch (cat_type) - { - case LLFolderType::FT_INBOX: - // Show inbox folder depending on FSShowInboxFolder setting - res = !fsShowInboxFolder; - break; - // - case LLFolderType::FT_OUTBOX: - case LLFolderType::FT_MARKETPLACE_LISTINGS: - res = true; - break; - default: - break; - } - } - return res; -} - S32 LLInventoryModel::getItemCount() const { return mItemMap.size(); @@ -1993,11 +1965,7 @@ void LLInventoryModel::addItem(LLViewerInventoryItem* item) llassert(item); if(item) { - // This can happen if assettype enums from llassettype.h ever change. - // For example, there is a known backwards compatibility issue in some viewer prototypes prior to when - // the AT_LINK enum changed from 23 to 24. - if ((item->getType() == LLAssetType::AT_NONE) - || LLAssetType::lookup(item->getType()) == LLAssetType::badLookup()) + if (item->getType() <= LLAssetType::AT_NONE) { LL_WARNS(LOG_INV) << "Got bad asset type for item [ name: " << item->getName() << " type: " << item->getType() @@ -2005,6 +1973,13 @@ void LLInventoryModel::addItem(LLViewerInventoryItem* item) return; } + if (LLAssetType::lookup(item->getType()) == LLAssetType::badLookup()) + { + LL_WARNS(LOG_INV) << "Got unknown asset type for item [ name: " << item->getName() + << " type: " << item->getType() + << " inv-type: " << item->getInventoryType() << " ]." << LL_ENDL; + } + // This condition means that we tried to add a link without the baseobj being in memory. // The item will show up as a broken link. if (item->getIsBrokenLink()) @@ -2213,6 +2188,7 @@ bool LLInventoryModel::loadSkeleton( update_map_t child_counts; cat_array_t categories; item_array_t items; + changed_items_t categories_to_update; item_array_t possible_broken_links; cat_set_t invalid_categories; // Used to mark categories that weren't successfully loaded. std::string inventory_filename = getInvCacheAddres(owner_id); @@ -2238,7 +2214,7 @@ bool LLInventoryModel::loadSkeleton( } } bool is_cache_obsolete = false; - if(loadFromFile(inventory_filename, categories, items, is_cache_obsolete)) + if (loadFromFile(inventory_filename, categories, items, categories_to_update, is_cache_obsolete)) { // We were able to find a cache of files. So, use what we // found to generate a set of categories we should add. We @@ -2256,6 +2232,12 @@ bool LLInventoryModel::loadSkeleton( continue; // cache corruption?? not sure why this happens -SJB } LLViewerInventoryCategory* tcat = *cit; + + if (categories_to_update.find(tcat->getUUID()) != categories_to_update.end()) + { + tcat->setVersion(NO_VERSION); + LL_WARNS() << "folder to update: " << tcat->getName() << LL_ENDL; + } // we can safely ignore anything loaded from file, but // not sent down in the skeleton. Must have been removed from inventory. @@ -2816,6 +2798,7 @@ bool LLUUIDAndName::operator>(const LLUUIDAndName& rhs) const bool LLInventoryModel::loadFromFile(const std::string& filename, LLInventoryModel::cat_array_t& categories, LLInventoryModel::item_array_t& items, + LLInventoryModel::changed_items_t& cats_to_update, bool &is_cache_obsolete) { if(filename.empty()) @@ -2890,7 +2873,14 @@ bool LLInventoryModel::loadFromFile(const std::string& filename, } else { - items.push_back(inv_item); + if (inv_item->getType() == LLAssetType::AT_UNKNOWN) + { + cats_to_update.insert(inv_item->getParentUUID()); + } + else + { + items.push_back(inv_item); + } } } else diff --git a/indra/newview/llinventorymodel.h b/indra/newview/llinventorymodel.h index 4f736a5947..9cc1c33fad 100644 --- a/indra/newview/llinventorymodel.h +++ b/indra/newview/llinventorymodel.h @@ -341,9 +341,7 @@ public: // Copy content of all folders of type "type" into folder "id" and delete/purge the empty folders // Note : This method has been designed for FT_OUTBOX (aka Merchant Outbox) but can be used for other categories void consolidateForType(const LLUUID& id, LLFolderType::EType type); - - bool isCategoryHidden(const LLUUID& id) const; - + // ReplaceWornItemsOnly void wearItemsOnAvatar(LLInventoryCategory* category); void wearAttachmentsOnAvatarCheckRemove(LLViewerObject *object, const LLViewerJointAttachment *attachment); @@ -650,6 +648,7 @@ protected: static bool loadFromFile(const std::string& filename, cat_array_t& categories, item_array_t& items, + changed_items_t& cats_to_update, bool& is_cache_obsolete); static bool saveToFile(const std::string& filename, const cat_array_t& categories, diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp index c986a10f70..99537f4dd5 100644 --- a/indra/newview/llinventorypanel.cpp +++ b/indra/newview/llinventorypanel.cpp @@ -933,13 +933,37 @@ LLFolderViewItem* LLInventoryPanel::buildNewViews(const LLUUID& id) if (!folder_view_item && parent_folder) { - if (objectp->getType() <= LLAssetType::AT_NONE || - objectp->getType() >= LLAssetType::AT_COUNT) + if (objectp->getType() <= LLAssetType::AT_NONE) + { + LL_WARNS() << "LLInventoryPanel::buildNewViews called with invalid objectp->mType : " + << ((S32)objectp->getType()) << " name " << objectp->getName() << " UUID " << objectp->getUUID() + << LL_ENDL; + return NULL; + } + + if (objectp->getType() >= LLAssetType::AT_COUNT) { - LL_WARNS() << "LLInventoryPanel::buildNewViews called with invalid objectp->mType : " - << ((S32) objectp->getType()) << " name " << objectp->getName() << " UUID " << objectp->getUUID() - << LL_ENDL; - return NULL; + LL_WARNS() << "LLInventoryPanel::buildNewViews called with unknown objectp->mType : " + << ((S32) objectp->getType()) << " name " << objectp->getName() << " UUID " << objectp->getUUID() + << LL_ENDL; + + LLInventoryItem* item = (LLInventoryItem*)objectp; + if (item) + { + LLInvFVBridge* new_listener = mInvFVBridgeBuilder->createBridge(LLAssetType::AT_UNKNOWN, + LLAssetType::AT_UNKNOWN, + LLInventoryType::IT_UNKNOWN, + this, + &mInventoryViewModel, + mFolderRoot.get(), + item->getUUID(), + item->getFlags()); + + if (new_listener) + { + folder_view_item = createFolderViewItem(new_listener); + } + } } if ((objectp->getType() == LLAssetType::AT_CATEGORY) && diff --git a/indra/newview/lloutfitgallery.cpp b/indra/newview/lloutfitgallery.cpp index ca089eb5ab..9bf0aed31d 100644 --- a/indra/newview/lloutfitgallery.cpp +++ b/indra/newview/lloutfitgallery.cpp @@ -1102,13 +1102,6 @@ void LLOutfitGallery::refreshOutfit(const LLUUID& category_id) updates["name"] = new_name; update_inventory_item(inv_id, updates, NULL); mOutfitRenamePending.setNull(); - // FIRE-20526: Outfit snapshot upload closes inventory; No idea what purpose serves closing the inventory window here - //LLFloater* inv_floater = LLFloaterReg::getInstance("inventory"); - //if (inv_floater) - //{ - // inv_floater->closeFloater(); - //} - // LLFloater* appearance_floater = LLFloaterReg::getInstance("appearance"); if (appearance_floater) { @@ -1242,7 +1235,7 @@ void LLOutfitGallery::uploadOutfitImage(const std::vector& filename LLFloaterPerms::getNextOwnerPerms("Uploads"), LLFloaterPerms::getGroupPerms("Uploads"), LLFloaterPerms::getEveryonePerms("Uploads"), - upload_pending_name, callback, expected_upload_cost, nruserdata); + upload_pending_name, callback, expected_upload_cost, nruserdata, false); mOutfitLinkPending = outfit_id; } delete unit; diff --git a/indra/newview/llpanelface.cpp b/indra/newview/llpanelface.cpp index 6d7c4b4d47..955d48adde 100644 --- a/indra/newview/llpanelface.cpp +++ b/indra/newview/llpanelface.cpp @@ -1387,7 +1387,7 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/) if (material && editable) { - LL_DEBUGS("Materials: OnMatererialsLoaded:") << material->asLLSD() << LL_ENDL; + LL_DEBUGS("Materials") << material->asLLSD() << LL_ENDL; // Alpha LLCtrlSelectionInterface* combobox_alphamode = diff --git a/indra/newview/llpanelgroupnotices.cpp b/indra/newview/llpanelgroupnotices.cpp index 3f8f299446..1d3a3378c3 100644 --- a/indra/newview/llpanelgroupnotices.cpp +++ b/indra/newview/llpanelgroupnotices.cpp @@ -314,6 +314,8 @@ void LLPanelGroupNotices::activate() { if(mNoticesList) mNoticesList->deleteAllItems(); + + mPrevSelectedNotice = LLUUID(); BOOL can_send = gAgent.hasPowerInGroup(mGroupID,GP_NOTICES_SEND); BOOL can_receive = gAgent.hasPowerInGroup(mGroupID,GP_NOTICES_RECEIVE); @@ -466,12 +468,18 @@ void LLPanelGroupNotices::refreshNotices() } +void LLPanelGroupNotices::clearNoticeList() +{ + mPrevSelectedNotice = mNoticesList->getStringUUIDSelectedItem(); + mNoticesList->deleteAllItems(); +} + void LLPanelGroupNotices::onClickRefreshNotices(void* data) { LL_DEBUGS() << "LLPanelGroupNotices::onClickGetPastNotices" << LL_ENDL; LLPanelGroupNotices* self = (LLPanelGroupNotices*)data; - self->mNoticesList->deleteAllItems(); + self->clearNoticeList(); LLMessageSystem* msg = gMessageSystem; msg->newMessage("GroupNoticesListRequest"); @@ -562,7 +570,6 @@ void LLPanelGroupNotices::processNotices(LLMessageSystem* msg) LLSD row; row["id"] = id; - row["columns"][0]["column"] = "icon"; if (has_attachment) { @@ -590,13 +597,13 @@ void LLPanelGroupNotices::processNotices(LLMessageSystem* msg) mNoticesList->setNeedsSort(save_sort); mNoticesList->updateSort(); - // Don't do this while composing a new notice or you will lose it - //mNoticesList->selectFirstItem(); if (mPanelViewNotice->getVisible()) { - mNoticesList->selectFirstItem(); + if (!mNoticesList->selectByID(mPrevSelectedNotice)) + { + mNoticesList->selectFirstItem(); + } } - // } void LLPanelGroupNotices::onSelectNotice(LLUICtrl* ctrl, void* data) diff --git a/indra/newview/llpanelgroupnotices.h b/indra/newview/llpanelgroupnotices.h index be0c2daeac..01b35e0007 100644 --- a/indra/newview/llpanelgroupnotices.h +++ b/indra/newview/llpanelgroupnotices.h @@ -65,6 +65,8 @@ public: void refreshNotices(); + void clearNoticeList(); + virtual void setGroupID(const LLUUID& id); private: @@ -114,6 +116,8 @@ private: LLOfferInfo* mInventoryOffer; + LLUUID mPrevSelectedNotice; + static std::map sInstances; }; diff --git a/indra/newview/llpanelgrouproles.cpp b/indra/newview/llpanelgrouproles.cpp index 0a421801e5..a7b616c412 100644 --- a/indra/newview/llpanelgrouproles.cpp +++ b/indra/newview/llpanelgrouproles.cpp @@ -861,6 +861,7 @@ BOOL LLPanelGroupMembersSubTab::postBuildSubTab(LLView* root) //mMembersList->setContextMenu(LLScrollListCtrl::MENU_AVATAR); mMembersList->setContextMenu(&gFSNameListAvatarMenu); // + mMembersList->setIsFriendCallback(LLAvatarActions::isFriend); LLSD row; row["columns"][0]["column"] = "name"; diff --git a/indra/newview/llpanelobject.cpp b/indra/newview/llpanelobject.cpp index 45fc1c63be..172def4395 100644 --- a/indra/newview/llpanelobject.cpp +++ b/indra/newview/llpanelobject.cpp @@ -496,11 +496,6 @@ void LLPanelObject::getState( ) return; } - // can move or rotate only linked group with move permissions, or sub-object with move and modify perms - BOOL enable_move = objectp->permMove() && !objectp->isPermanentEnforced() && ((root_objectp == NULL) || !root_objectp->isPermanentEnforced()) && (objectp->permModify() || !gSavedSettings.getBOOL("EditLinkedParts")); - BOOL enable_scale = objectp->permMove() && !objectp->isPermanentEnforced() && ((root_objectp == NULL) || !root_objectp->isPermanentEnforced()) && objectp->permModify(); - BOOL enable_rotate = objectp->permMove() && !objectp->isPermanentEnforced() && ((root_objectp == NULL) || !root_objectp->isPermanentEnforced()) && (objectp->permModify() || !gSavedSettings.getBOOL("EditLinkedParts")); - S32 selected_count = LLSelectMgr::getInstance()->getSelection()->getObjectCount(); BOOL single_volume = (LLSelectMgr::getInstance()->selectionAllPCode( LL_PCODE_VOLUME )) && (selected_count == 1); @@ -510,20 +505,13 @@ void LLPanelObject::getState( ) updateLimits(objectp->isAttachment()); // FIRE-8205 - if (LLSelectMgr::getInstance()->getSelection()->getRootObjectCount() > 1) - { - enable_move = FALSE; - enable_scale = FALSE; - enable_rotate = FALSE; - } + bool enable_move; + bool enable_modify; -// [RLVa:KB] - Checked: 2010-03-31 (RLVa-1.2.0c) | Modified: RLVa-1.0.0g - if ( (rlv_handler_t::isEnabled()) && ((gRlvHandler.hasBehaviour(RLV_BHVR_UNSIT)) || (gRlvHandler.hasBehaviour(RLV_BHVR_SITTP))) ) - { - if ( (isAgentAvatarValid()) && (gAgentAvatarp->isSitting()) && (gAgentAvatarp->getRoot() == objectp->getRootEdit()) ) - enable_move = enable_scale = enable_rotate = FALSE; - } -// [/RLVa:KB] + LLSelectMgr::getInstance()->selectGetEditMoveLinksetPermissions(enable_move, enable_modify); + + BOOL enable_scale = enable_modify; + BOOL enable_rotate = enable_move; // already accounts for a case of children, which needs permModify() as well LLVector3 vec; if (enable_move) diff --git a/indra/newview/llpanelpeople.cpp b/indra/newview/llpanelpeople.cpp index 7e0996dfd8..1d4f880079 100644 --- a/indra/newview/llpanelpeople.cpp +++ b/indra/newview/llpanelpeople.cpp @@ -233,10 +233,39 @@ protected: } }; +class LLAvatarItemRecentArrivalComparator : public LLAvatarItemNameComparator +{ +public: + LLAvatarItemRecentArrivalComparator() {}; + virtual ~LLAvatarItemRecentArrivalComparator() {}; + +protected: + virtual bool doCompare(const LLAvatarListItem* item1, const LLAvatarListItem* item2) const + { + + F32 arr_time1 = LLRecentPeople::instance().getArrivalTimeByID(item1->getAvatarId()); + F32 arr_time2 = LLRecentPeople::instance().getArrivalTimeByID(item2->getAvatarId()); + + if (arr_time1 == arr_time2) + { + std::string name1 = item1->getAvatarName(); + std::string name2 = item2->getAvatarName(); + + LLStringUtil::toUpper(name1); + LLStringUtil::toUpper(name2); + + return name1 < name2; + } + + return arr_time1 > arr_time2; + } +}; + static const LLAvatarItemRecentComparator RECENT_COMPARATOR; static const LLAvatarItemStatusComparator STATUS_COMPARATOR; static LLAvatarItemDistanceComparator DISTANCE_COMPARATOR; static const LLAvatarItemRecentSpeakerComparator RECENT_SPEAKER_COMPARATOR; +static LLAvatarItemRecentArrivalComparator RECENT_ARRIVAL_COMPARATOR; static LLPanelInjector t_people("panel_people"); @@ -572,6 +601,9 @@ LLPanelPeople::LLPanelPeople() //mEnableCallbackRegistrar.add("People.Nearby.ViewSort.CheckItem", boost::bind(&LLPanelPeople::onNearbyViewSortMenuItemCheck, this, _2)); mEnableCallbackRegistrar.add("People.Group.Plus.Validate", boost::bind(&LLPanelPeople::onGroupPlusButtonValidate, this)); + + // Firestorm radar + //doPeriodically(boost::bind(&LLPanelPeople::updateNearbyArrivalTime, this), 2.0); // [FS:CR] Contact sets mCommitCallbackRegistrar.add("ContactSet.Action", boost::bind(&LLPanelPeople::onContactSetsMenuItemClicked, this, _2)); @@ -1206,6 +1238,10 @@ void LLPanelPeople::setSortOrder(LLAvatarList* list, ESortOrder order, bool save list->setComparator(&DISTANCE_COMPARATOR); list->sort(); break; + case E_SORT_BY_RECENT_ARRIVAL: + list->setComparator(&RECENT_ARRIVAL_COMPARATOR); + list->sort(); + break; // FIRE-5283: Sort by username case E_SORT_BY_USERNAME: list->sortByUserName(); @@ -1589,6 +1625,10 @@ void LLPanelPeople::onNearbyViewSortMenuItemClicked(const LLSD& userdata) { setSortOrder(mNearbyList, E_SORT_BY_DISTANCE); } + else if (chosen_item == "sort_arrival") + { + setSortOrder(mNearbyList, E_SORT_BY_RECENT_ARRIVAL); + } else if (chosen_item == "view_usernames") { bool hide_usernames = !gSavedSettings.getBOOL("NearbyListHideUsernames"); @@ -1610,6 +1650,8 @@ bool LLPanelPeople::onNearbyViewSortMenuItemCheck(const LLSD& userdata) return sort_order == E_SORT_BY_NAME; if (item == "sort_distance") return sort_order == E_SORT_BY_DISTANCE; + if (item == "sort_arrival") + return sort_order == E_SORT_BY_RECENT_ARRIVAL; return false; } @@ -1805,6 +1847,16 @@ bool LLPanelPeople::isAccordionCollapsedByUser(const std::string& name) return isAccordionCollapsedByUser(getChild(name)); } +bool LLPanelPeople::updateNearbyArrivalTime() +{ + std::vector positions; + std::vector uuids; + static LLCachedControl range(gSavedSettings, "NearMeRange"); + LLWorld::getInstance()->getAvatars(&uuids, &positions, gAgent.getPositionGlobal(), range); + LLRecentPeople::instance().updateAvatarsArrivalTime(uuids); + return LLApp::isExiting(); +} + // [FS:CR] Contact sets void LLPanelPeople::updateContactSets(LGGContactSets::EContactSetUpdate type) { diff --git a/indra/newview/llpanelpeople.h b/indra/newview/llpanelpeople.h index 60b018ae70..08f03e0df7 100644 --- a/indra/newview/llpanelpeople.h +++ b/indra/newview/llpanelpeople.h @@ -81,6 +81,8 @@ public: // internals class Updater; + bool updateNearbyArrivalTime(); + private: typedef enum e_sort_oder { @@ -89,8 +91,9 @@ private: E_SORT_BY_MOST_RECENT = 2, E_SORT_BY_DISTANCE = 3, E_SORT_BY_RECENT_SPEAKERS = 4, + E_SORT_BY_RECENT_ARRIVAL = 5, // FIRE-5283: Sort by username - E_SORT_BY_USERNAME = 5, + E_SORT_BY_USERNAME = 6 } ESortOrder; void removePicker(); diff --git a/indra/newview/llpresetsmanager.cpp b/indra/newview/llpresetsmanager.cpp index 1ab24340bb..d80e8d3846 100644 --- a/indra/newview/llpresetsmanager.cpp +++ b/indra/newview/llpresetsmanager.cpp @@ -155,6 +155,11 @@ bool LLPresetsManager::savePreset(const std::string& subdirectory, std::string n { name = PRESETS_DEFAULT; } + if (!createDefault && name == PRESETS_DEFAULT) + { + LL_WARNS() << "Should not overwrite default" << LL_ENDL; + return false; + } bool saved = false; std::vector name_list; diff --git a/indra/newview/llpreviewscript.cpp b/indra/newview/llpreviewscript.cpp index 38794293e2..b89e397ef7 100644 --- a/indra/newview/llpreviewscript.cpp +++ b/indra/newview/llpreviewscript.cpp @@ -861,7 +861,7 @@ void LLScriptEdCore::updateButtonBar() mLoadFromDiskBtn->setEnabled(mEditor->canLoadOrSaveToFile()); // Recompile button static LLCachedControl FSScriptEditorRecompileButton(gSavedSettings, "FSScriptEditorRecompileButton"); - mSaveBtn2->setEnabled((hasChanged() && !mScriptRemoved) || (mLSLProc && FSScriptEditorRecompileButton && !mCompiling)); + mSaveBtn2->setEnabled((hasChanged() || (mLSLProc && FSScriptEditorRecompileButton && !mCompiling && mHasScriptData)) && !mScriptRemoved); mSaveBtn2->setLabel((!mLSLProc || !FSScriptEditorRecompileButton || hasChanged()) ? LLTrans::getString("save_file_verb") : LLTrans::getString("recompile_script_verb")); // } diff --git a/indra/newview/llrecentpeople.cpp b/indra/newview/llrecentpeople.cpp index 7689cd1a52..83b0c4f1bf 100644 --- a/indra/newview/llrecentpeople.cpp +++ b/indra/newview/llrecentpeople.cpp @@ -126,3 +126,33 @@ bool LLRecentPeople::handleEvent(LLPointer event, const LLSD& userdata) add(event->getValue().asUUID()); return true; } + +void LLRecentPeople::updateAvatarsArrivalTime(uuid_vec_t& uuids) +{ + id_to_time_map_t buf = mAvatarsArrivalTime; + mAvatarsArrivalTime.clear(); + + for (uuid_vec_t::const_iterator id_it = uuids.begin(); id_it != uuids.end(); ++id_it) + { + if (buf.find(*id_it) != buf.end()) + { + mAvatarsArrivalTime[*id_it] = buf[*id_it]; + } + else + { + mAvatarsArrivalTime[*id_it] = LLDate::now().secondsSinceEpoch(); + } + } +} + +F32 LLRecentPeople::getArrivalTimeByID(const LLUUID& id) +{ + id_to_time_map_t::const_iterator it = mAvatarsArrivalTime.find(id); + + if (it != mAvatarsArrivalTime.end()) + { + return it->second; + } + return LLDate::now().secondsSinceEpoch(); +} + diff --git a/indra/newview/llrecentpeople.h b/indra/newview/llrecentpeople.h index c7aaf604f5..1b4295ddad 100644 --- a/indra/newview/llrecentpeople.h +++ b/indra/newview/llrecentpeople.h @@ -53,6 +53,7 @@ class LLRecentPeople: public LLSingleton, public LLOldEvents::LL LLSINGLETON_EMPTY_CTOR(LLRecentPeople); LOG_CLASS(LLRecentPeople); public: + typedef std::map id_to_time_map_t; typedef boost::signals2::signal signal_t; /** @@ -116,6 +117,9 @@ public: */ /*virtual*/ bool handleEvent(LLPointer event, const LLSD& userdata); + void updateAvatarsArrivalTime(uuid_vec_t& uuids); + F32 getArrivalTimeByID(const LLUUID& id); + private: const LLUUID& getIDByPhoneNumber(const LLSD& userdata); @@ -123,6 +127,7 @@ private: typedef std::map recent_people_t; recent_people_t mPeople; signal_t mChangedSignal; + id_to_time_map_t mAvatarsArrivalTime; }; #endif // LL_LLRECENTPEOPLE_H diff --git a/indra/newview/llregioninfomodel.cpp b/indra/newview/llregioninfomodel.cpp index 25d7be831f..7daaa7ef8e 100644 --- a/indra/newview/llregioninfomodel.cpp +++ b/indra/newview/llregioninfomodel.cpp @@ -158,7 +158,7 @@ void LLRegionInfoModel::update(LLMessageSystem* msg) // actually the "last set" sun hour, not the current sun hour. JC msg->getF32(_PREHASH_RegionInfo, _PREHASH_SunHour, mSunHour); - LL_DEBUGS("Windlight Sync") << "Got region sun hour: " << mSunHour << LL_ENDL; + LL_DEBUGS("WindlightSync") << "Got region sun hour: " << mSunHour << LL_ENDL; msg->getS32Fast(_PREHASH_RegionInfo2, _PREHASH_HardMaxAgents, mHardAgentLimit); diff --git a/indra/newview/llscripteditor.cpp b/indra/newview/llscripteditor.cpp index 7f6b346f73..645d944fcc 100644 --- a/indra/newview/llscripteditor.cpp +++ b/indra/newview/llscripteditor.cpp @@ -31,7 +31,9 @@ #include "llsyntaxid.h" #include "lllocalcliprect.h" -const S32 UI_TEXTEDITOR_LINE_NUMBER_MARGIN = 32; +// FIRE-23047: Increase width of line number column +//const S32 UI_TEXTEDITOR_LINE_NUMBER_MARGIN = 32; +const S32 UI_TEXTEDITOR_LINE_NUMBER_MARGIN = 40; static LLDefaultChildRegistry::Register r("script_editor"); diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp index 61cf193cb5..f7079509da 100644 --- a/indra/newview/llselectmgr.cpp +++ b/indra/newview/llselectmgr.cpp @@ -3801,6 +3801,58 @@ void LLSelectMgr::selectForceDelete() SEND_ONLY_ROOTS); } +BOOL LLSelectMgr::selectGetEditMoveLinksetPermissions(bool &move, bool &modify) +{ + move = true; + modify = true; + // gSavedSettings replacement + //bool selecting_linked_set = !gSavedSettings.getBOOL("EditLinkedParts"); + static LLCachedControl editLinkedParts(gSavedSettings, "EditLinkedParts"); + bool selecting_linked_set = !editLinkedParts(); + // + + for (LLObjectSelection::iterator iter = getSelection()->begin(); + iter != getSelection()->end(); iter++) + { + LLSelectNode* nodep = *iter; + LLViewerObject* object = nodep->getObject(); + if (!object || !nodep->mValid) + { + move = false; + modify = false; + return FALSE; + } + + LLViewerObject *root_object = object->getRootEdit(); + bool this_object_movable = false; + if (object->permMove() && !object->isPermanentEnforced() && + ((root_object == NULL) || !root_object->isPermanentEnforced()) && + (object->permModify() || selecting_linked_set)) + { + this_object_movable = true; + +// [RLVa:KB] - Checked: 2010-03-31 (RLVa-1.2.0c) | Modified: RLVa-1.0.0g + if ( (rlv_handler_t::isEnabled()) && ((gRlvHandler.hasBehaviour(RLV_BHVR_UNSIT)) || (gRlvHandler.hasBehaviour(RLV_BHVR_SITTP))) ) + { + if ( (isAgentAvatarValid()) && (gAgentAvatarp->isSitting()) && (gAgentAvatarp->getRoot() == object->getRootEdit()) ) + move = modify = false; + } +// [/RLVa:KB] + } + move = move && this_object_movable; + modify = modify && object->permModify(); + + // Optimize: Once move and modify are both false, there is no reason to continue checking - neither will become true again + if (!move && !modify) + { + return TRUE; + } + // + } + + return TRUE; +} + void LLSelectMgr::selectGetAggregateSaleInfo(U32 &num_for_sale, BOOL &is_for_sale_mixed, BOOL &is_sale_price_mixed, diff --git a/indra/newview/llselectmgr.h b/indra/newview/llselectmgr.h index 3def5ec9ca..8b85d01f43 100644 --- a/indra/newview/llselectmgr.h +++ b/indra/newview/llselectmgr.h @@ -757,6 +757,11 @@ public: // returns TRUE if all the nodes are valid. Accumulates // permissions in the parameter. BOOL selectGetPermissions(LLPermissions& perm); + + // returns TRUE if all the nodes are valid. Depends onto "edit linked" state + // Children in linksets are a bit special - they require not only move permission + // but also modify if "edit linked" is set, since you move them relative to parent + BOOL selectGetEditMoveLinksetPermissions(bool &move, bool &modify); // Get a bunch of useful sale information for the object(s) selected. // "_mixed" is true if not all objects have the same setting. diff --git a/indra/newview/llsidepaneliteminfo.cpp b/indra/newview/llsidepaneliteminfo.cpp index 246f26ffb3..d5e4bd71fa 100644 --- a/indra/newview/llsidepaneliteminfo.cpp +++ b/indra/newview/llsidepaneliteminfo.cpp @@ -637,7 +637,7 @@ void LLSidepanelItemInfo::refreshFromItem(LLViewerInventoryItem* item) LLCheckBoxCtrl* ctl = getChild("CheckShareWithGroup"); if(ctl) { - ctl->setTentative(TRUE); + ctl->setTentative(!ctl->getEnabled()); ctl->set(TRUE); } } diff --git a/indra/newview/llsnapshotlivepreview.cpp b/indra/newview/llsnapshotlivepreview.cpp index deff615eaa..af101af9af 100644 --- a/indra/newview/llsnapshotlivepreview.cpp +++ b/indra/newview/llsnapshotlivepreview.cpp @@ -1178,7 +1178,7 @@ void LLSnapshotLivePreview::saveTexture(BOOL outfit_snapshot, std::string name) tid, LLAssetType::AT_TEXTURE, res_name, res_desc, 0, folder_type, inv_type, PERM_ALL, LLFloaterPerms::getGroupPerms("Uploads"), LLFloaterPerms::getEveryonePerms("Uploads"), - expected_upload_cost)); + expected_upload_cost, !outfit_snapshot)); upload_new_resource(assetUploadInfo); diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp index 11b62ba755..a2c1fd5d9a 100644 --- a/indra/newview/llstartup.cpp +++ b/indra/newview/llstartup.cpp @@ -393,28 +393,10 @@ void downloadGridlistError( LLSD const &aData, std::string const &aURL ) sGridListRequestReady = true; } - void downloadGridstatusComplete( LLSD const &aData ) + void downloadGridstatusComplete(LLSD const &aData) { LLSD header = aData[ LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS ][ LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS_HEADERS]; - LLCore::HttpStatus status = LLCoreHttpUtil::HttpCoroutineAdapter::getStatusFromLLSD( aData[ LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS ] ); - - const LLSD::Binary &rawData = aData[LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS_RAW].asBinary(); - - if( status.getType() < 200 && status.getType() >= 300 && status.getType() != HTTP_NOT_MODIFIED) - { - if (status.getType() == HTTP_INTERNAL_ERROR) - { - report_to_nearby_chat(LLTrans::getString("SLGridStatusTimedOut")); - } - else - { - LLStringUtil::format_map_t args; - args["STATUS"] = llformat("%d", status.getType()); - report_to_nearby_chat(LLTrans::getString("SLGridStatusOtherError", args)); - } - LL_WARNS("SLGridStatusResponder") << "Error - status " << status.getType() << LL_ENDL; - return; - } + const LLSD::Binary &rawData = aData[LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS_RAW].asBinary(); if (rawData.size() == 0) { @@ -504,6 +486,23 @@ void downloadGridlistError( LLSD const &aData, std::string const &aURL ) LL_WARNS("SLGridStatusResponder") << "Error - output without " << LL_ENDL; } } + +void downloadGridstatusError(LLSD const &aData, std::string const &aURL) +{ + LLCore::HttpStatus status = LLCoreHttpUtil::HttpCoroutineAdapter::getStatusFromLLSD(aData); + LL_WARNS("SLGridStatusResponder") << "Error - status " << status.getType() << LL_ENDL; + + if (status.getType() == HTTP_INTERNAL_ERROR) + { + report_to_nearby_chat(LLTrans::getString("SLGridStatusTimedOut")); + } + else + { + LLStringUtil::format_map_t args; + args["STATUS"] = llformat("%d", status.getType()); + report_to_nearby_chat(LLTrans::getString("SLGridStatusOtherError", args)); + } +} // // Check for test build expiration @@ -3085,9 +3084,8 @@ bool idle_startup() // if (gSavedSettings.getBOOL("AutoQueryGridStatus")) { - FSCoreHttpUtil::callbackHttpGetRaw( gSavedSettings.getString("AutoQueryGridStatusURL"), - downloadGridstatusComplete ); - + FSCoreHttpUtil::callbackHttpGetRaw(gSavedSettings.getString("AutoQueryGridStatusURL"), + downloadGridstatusComplete, [](const LLSD& data) { downloadGridstatusError(data, gSavedSettings.getString("AutoQueryGridStatusURL")); }); } // diff --git a/indra/newview/llteleporthistory.cpp b/indra/newview/llteleporthistory.cpp index 5b1481743a..81406ee55c 100644 --- a/indra/newview/llteleporthistory.cpp +++ b/indra/newview/llteleporthistory.cpp @@ -119,6 +119,8 @@ void LLTeleportHistory::handleLoginComplete() void LLTeleportHistory::updateCurrentLocation(const LLVector3d& new_pos) { + if (!gAgent.getRegion()) return; + if (!mTeleportHistoryStorage) { mTeleportHistoryStorage = LLTeleportHistoryStorage::getInstance(); diff --git a/indra/newview/lltoolpie.cpp b/indra/newview/lltoolpie.cpp index f0a1eaec0b..3d7521dd2a 100644 --- a/indra/newview/lltoolpie.cpp +++ b/indra/newview/lltoolpie.cpp @@ -677,8 +677,8 @@ BOOL LLToolPie::handleHover(S32 x, S32 y, MASK mask) gViewerWindow->setCursor(UI_CURSOR_TOOLGRAB); LL_DEBUGS("UserInput") << "hover handled by LLToolPie (inactive)" << LL_ENDL; } - else if ( (object && object->flagHandleTouch()) - || (parent && parent->flagHandleTouch())) + else if ((!object || !object->isAttachment() || object->getClickAction() != CLICK_ACTION_DISABLED) + && ((object && object->flagHandleTouch()) || (parent && parent->flagHandleTouch()))) { show_highlight = true; gViewerWindow->setCursor(UI_CURSOR_HAND); diff --git a/indra/newview/llviewerassettype.cpp b/indra/newview/llviewerassettype.cpp index ad0c1734f9..f07c14d01f 100644 --- a/indra/newview/llviewerassettype.cpp +++ b/indra/newview/llviewerassettype.cpp @@ -84,6 +84,8 @@ LLViewerAssetDictionary::LLViewerAssetDictionary() addEntry(LLViewerAssetType::AT_PERSON, new ViewerAssetEntry(DAD_PERSON)); + addEntry(LLViewerAssetType::AT_UNKNOWN, new ViewerAssetEntry(DAD_NONE)); + addEntry(LLViewerAssetType::AT_NONE, new ViewerAssetEntry(DAD_NONE)); }; diff --git a/indra/newview/llviewerassetupload.cpp b/indra/newview/llviewerassetupload.cpp index b727d8ef3e..d7b9163262 100644 --- a/indra/newview/llviewerassetupload.cpp +++ b/indra/newview/llviewerassetupload.cpp @@ -66,7 +66,7 @@ LLResourceUploadInfo::LLResourceUploadInfo(LLTransactionID transactId, LLAssetType::EType assetType, std::string name, std::string description, S32 compressionInfo, LLFolderType::EType destinationType, LLInventoryType::EType inventoryType, U32 nextOWnerPerms, - U32 groupPerms, U32 everyonePerms, S32 expectedCost) : + U32 groupPerms, U32 everyonePerms, S32 expectedCost, bool showInventory) : mTransactionId(transactId), mAssetType(assetType), mName(name), @@ -78,6 +78,7 @@ LLResourceUploadInfo::LLResourceUploadInfo(LLTransactionID transactId, mGroupPerms(groupPerms), mEveryonePerms(everyonePerms), mExpectedUploadCost(expectedCost), + mShowInventory(showInventory), mFolderId(LLUUID::null), mItemId(LLUUID::null), mAssetId(LLAssetID::null) @@ -87,7 +88,7 @@ LLResourceUploadInfo::LLResourceUploadInfo(LLTransactionID transactId, LLResourceUploadInfo::LLResourceUploadInfo(std::string name, std::string description, S32 compressionInfo, LLFolderType::EType destinationType, LLInventoryType::EType inventoryType, - U32 nextOWnerPerms, U32 groupPerms, U32 everyonePerms, S32 expectedCost): + U32 nextOWnerPerms, U32 groupPerms, U32 everyonePerms, S32 expectedCost, bool showInventory) : mName(name), mDescription(description), mCompressionInfo(compressionInfo), @@ -97,6 +98,7 @@ LLResourceUploadInfo::LLResourceUploadInfo(std::string name, mGroupPerms(groupPerms), mEveryonePerms(everyonePerms), mExpectedUploadCost(expectedCost), + mShowInventory(showInventory), mTransactionId(), mAssetType(LLAssetType::AT_NONE), mFolderId(LLUUID::null), @@ -118,6 +120,7 @@ LLResourceUploadInfo::LLResourceUploadInfo(LLAssetID assetId, LLAssetType::EType mGroupPerms(0), mEveryonePerms(0), mExpectedUploadCost(0), + mShowInventory(true), mTransactionId(), mFolderId(LLUUID::null), mItemId(LLUUID::null) @@ -337,10 +340,11 @@ LLNewFileResourceUploadInfo::LLNewFileResourceUploadInfo( U32 nextOWnerPerms, U32 groupPerms, U32 everyonePerms, - S32 expectedCost) : + S32 expectedCost, + bool show_inventory) : LLResourceUploadInfo(name, description, compressionInfo, destinationType, inventoryType, - nextOWnerPerms, groupPerms, everyonePerms, expectedCost), + nextOWnerPerms, groupPerms, everyonePerms, expectedCost, show_inventory), mFileName(fileName) { } diff --git a/indra/newview/llviewerassetupload.h b/indra/newview/llviewerassetupload.h index 43e23a0d42..ee1806b782 100644 --- a/indra/newview/llviewerassetupload.h +++ b/indra/newview/llviewerassetupload.h @@ -53,7 +53,8 @@ public: U32 nextOWnerPerms, U32 groupPerms, U32 everyonePerms, - S32 expectedCost); + S32 expectedCost, + bool showInventory = true); virtual ~LLResourceUploadInfo() { } @@ -79,7 +80,7 @@ public: S32 getExpectedUploadCost() const { return mExpectedUploadCost; }; virtual bool showUploadDialog() const { return true; } - virtual bool showInventoryPanel() const { return true; } + virtual bool showInventoryPanel() const { return mShowInventory; } virtual std::string getDisplayName() const; @@ -97,7 +98,8 @@ protected: U32 nextOWnerPerms, U32 groupPerms, U32 everyonePerms, - S32 expectedCost); + S32 expectedCost, + bool showInventory = true); LLResourceUploadInfo( LLAssetID assetId, @@ -130,6 +132,7 @@ private: LLUUID mFolderId; LLUUID mItemId; LLAssetID mAssetId; + bool mShowInventory; }; //------------------------------------------------------------------------- @@ -146,7 +149,8 @@ public: U32 nextOWnerPerms, U32 groupPerms, U32 everyonePerms, - S32 expectedCost); + S32 expectedCost, + bool show_inventory = true); virtual LLSD prepareUpload(); diff --git a/indra/newview/llviewerkeyboard.cpp b/indra/newview/llviewerkeyboard.cpp index 0f2e563f18..a4e0e684fc 100644 --- a/indra/newview/llviewerkeyboard.cpp +++ b/indra/newview/llviewerkeyboard.cpp @@ -775,8 +775,8 @@ BOOL LLViewerKeyboard::handleKey(KEY translated_key, MASK translated_mask, BOOL if(mKeysSkippedByUI.find(translated_key) != mKeysSkippedByUI.end()) { mKeyHandledByUI[translated_key] = FALSE; - //LL_INFOS("Keyboard Handling") << "Key wasn't handled by UI!" << LL_ENDL; - LL_INFOS_ONCE("Keyboard Handling") << "Key wasn't handled by UI!" << LL_ENDL; // Change log message to not print out every time + //LL_INFOS("KeyboardHandling") << "Key wasn't handled by UI!" << LL_ENDL; + LL_INFOS_ONCE("KeyboardHandling") << "Key wasn't handled by UI!" << LL_ENDL; // Change log message to not print out every time } else { diff --git a/indra/newview/llviewermenufile.cpp b/indra/newview/llviewermenufile.cpp index 677becb77f..ac066ccb02 100644 --- a/indra/newview/llviewermenufile.cpp +++ b/indra/newview/llviewermenufile.cpp @@ -717,7 +717,8 @@ LLUUID upload_new_resource( const std::string& display_name, LLAssetStorage::LLStoreAssetCallback callback, S32 expected_upload_cost, - void *userdata) + void *userdata, + bool show_inventory) { LLResourceUploadInfo::ptr_t uploadInfo(new LLNewFileResourceUploadInfo( @@ -725,7 +726,7 @@ LLUUID upload_new_resource( name, desc, compression_info, destination_folder_type, inv_type, next_owner_perms, group_perms, everyone_perms, - expected_upload_cost)); + expected_upload_cost, show_inventory)); upload_new_resource(uploadInfo, callback, userdata); return LLUUID::null; diff --git a/indra/newview/llviewermenufile.h b/indra/newview/llviewermenufile.h index d9a84dbd26..a4c3a8052e 100644 --- a/indra/newview/llviewermenufile.h +++ b/indra/newview/llviewermenufile.h @@ -56,7 +56,8 @@ LLUUID upload_new_resource( const std::string& display_name, LLAssetStorage::LLStoreAssetCallback callback, S32 expected_upload_cost, - void *userdata); + void *userdata, + bool show_inventory = true); void upload_new_resource( LLResourceUploadInfo::ptr_t &uploadInfo, diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index 183426886c..4500f93628 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -201,7 +201,8 @@ void accept_friendship_coro(std::string url, LLSD notification) url += "?from=" + payload["from_id"].asString(); url += "&agent_name=\"" + LLURI::escape(gAgentAvatarp->getFullname()) + "\""; - LLSD result = httpAdapter->getAndSuspend(httpRequest, url); + LLSD data; + LLSD result = httpAdapter->postAndSuspend(httpRequest, url, data); LLSD httpResults = result[LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS]; LLCore::HttpStatus status = LLCoreHttpUtil::HttpCoroutineAdapter::getStatusFromLLSD(httpResults); @@ -244,7 +245,7 @@ void decline_friendship_coro(std::string url, LLSD notification, S32 option) LLSD payload = notification["payload"]; url += "?from=" + payload["from_id"].asString(); - LLSD result = httpAdapter->getAndSuspend(httpRequest, url); + LLSD result = httpAdapter->deleteAndSuspend(httpRequest, url); LLSD httpResults = result[LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS]; LLCore::HttpStatus status = LLCoreHttpUtil::HttpCoroutineAdapter::getStatusFromLLSD(httpResults); @@ -785,7 +786,7 @@ void response_group_invitation_coro(std::string url, LLUUID group_id, bool notif LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID); LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t - httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("friendshipResponceErrorProcessing", httpPolicy)); + httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("responseGroupInvitation", httpPolicy)); LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest); LLSD payload; @@ -853,6 +854,7 @@ void send_join_group_response(LLUUID group_id, LLUUID transaction_id, bool accep if (!url.empty()) { + LL_DEBUGS("GroupInvite") << "Capability url: " << url << LL_ENDL; LLCoros::instance().launch("LLMessageSystem::acceptGroupInvitation", boost::bind(response_group_invitation_coro, url, group_id, accept_invite)); } @@ -864,6 +866,8 @@ void send_join_group_response(LLUUID group_id, LLUUID transaction_id, bool accep } else { + LL_DEBUGS("GroupInvite") << "Replying to group invite via IM message" << LL_ENDL; + EInstantMessage type = accept_invite ? IM_GROUP_INVITATION_ACCEPT : IM_GROUP_INVITATION_DECLINE; send_improved_im(group_id, @@ -3338,6 +3342,12 @@ void process_teleport_start(LLMessageSystem *msg, void**) U32 teleport_flags = 0x0; msg->getU32("Info", "TeleportFlags", teleport_flags); + if (gAgent.getTeleportState() == LLAgent::TELEPORT_MOVING) + { + // Race condition? + LL_WARNS("Messaging") << "Got TeleportStart, but teleport already in progress. TeleportFlags=" << teleport_flags << LL_ENDL; + } + LL_DEBUGS("Messaging") << "Got TeleportStart with TeleportFlags=" << teleport_flags << ". gTeleportDisplay: " << gTeleportDisplay << ", gAgent.mTeleportState: " << gAgent.getTeleportState() << LL_ENDL; // *NOTE: The server sends two StartTeleport packets when you are teleporting to a LM @@ -3401,7 +3411,7 @@ void process_teleport_progress(LLMessageSystem* msg, void**) } std::string buffer; msg->getString("Info", "Message", buffer); - LL_DEBUGS("Messaging") << "teleport progress: " << buffer << LL_ENDL; + LL_DEBUGS("Messaging") << "teleport progress: " << buffer << " flags: " << teleport_flags << LL_ENDL; //Sorta hacky...default to using simulator raw messages //if we don't find the coresponding mapping in our progress mappings @@ -3524,9 +3534,25 @@ void process_teleport_finish(LLMessageSystem* msg, void**) if (gAgent.getTeleportState() == LLAgent::TELEPORT_NONE) { - // Server either ignored teleport cancel message or did not receive it in time. - // This message can't be ignored since teleport is complete at server side - gAgent.restoreCanceledTeleportRequest(); + if (gAgent.canRestoreCanceledTeleport()) + { + // Server either ignored teleport cancel message or did not receive it in time. + // This message can't be ignored since teleport is complete at server side + gAgent.restoreCanceledTeleportRequest(); + } + else + { + // Race condition? Make sure all variables are set correctly for teleport to work + LL_WARNS("Messaging") << "Teleport 'finish' message without 'start'" << LL_ENDL; + gTeleportDisplay = TRUE; + LLViewerMessage::getInstance()->mTeleportStartedSignal(); + gAgent.setTeleportState(LLAgent::TELEPORT_REQUESTED); + make_ui_sound("UISndTeleportOut"); + } + } + else if (gAgent.getTeleportState() == LLAgent::TELEPORT_MOVING) + { + LL_WARNS("Messaging") << "Teleport message in the middle of other teleport" << LL_ENDL; } // Teleport is finished; it can't be cancelled now. @@ -4599,7 +4625,7 @@ void process_time_synch(LLMessageSystem *mesgsys, void **user_data) LLWorld::getInstance()->setSpaceTimeUSec(space_time_usec); - LL_DEBUGS("Windlight Sync") << "Sun phase: " << phase << " rad = " << fmodf(phase / F_TWO_PI + 0.25, 1.f) * 24.f << " h" << LL_ENDL; + LL_DEBUGS("WindlightSync") << "Sun phase: " << phase << " rad = " << fmodf(phase / F_TWO_PI + 0.25, 1.f) * 24.f << " h" << LL_ENDL; gSky.setSunPhase(phase); gSky.setSunTargetDirection(sun_direction, sun_ang_velocity); diff --git a/indra/newview/llviewernetwork.cpp b/indra/newview/llviewernetwork.cpp index a4a8bd113b..4c1413ae36 100644 --- a/indra/newview/llviewernetwork.cpp +++ b/indra/newview/llviewernetwork.cpp @@ -127,7 +127,7 @@ void LLGridManager::initialize(const std::string& grid_file) addSystemGrid(SECOND_LIFE_BETA_LABEL, "util.aditi.lindenlab.com", "https://login.aditi.lindenlab.com/cgi-bin/login.cgi", - "http://aditi-secondlife.webdev.lindenlab.com/helpers/", + "https://secondlife.aditi.lindenlab.com/helpers/", DEFAULT_LOGIN_PAGE, SL_UPDATE_QUERY_URL, "https://my.aditi.lindenlab.com/", diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp index c76f4191d1..1575671e6b 100644 --- a/indra/newview/llviewerregion.cpp +++ b/indra/newview/llviewerregion.cpp @@ -3044,7 +3044,7 @@ void LLViewerRegion::unpackRegionHandshake() void LLViewerRegionImpl::buildCapabilityNames(LLSD& capabilityNames) { capabilityNames.append("AbuseCategories"); - //capabilityNames.append("AcceptFriendship"); + capabilityNames.append("AcceptFriendship"); capabilityNames.append("AcceptGroupInvite"); // ReadOfflineMsgs recieved messages only!!! capabilityNames.append("AgentPreferences"); capabilityNames.append("AgentState"); @@ -3055,7 +3055,7 @@ void LLViewerRegionImpl::buildCapabilityNames(LLSD& capabilityNames) capabilityNames.append("ChatSessionRequest"); capabilityNames.append("CopyInventoryFromNotecard"); capabilityNames.append("CreateInventoryCategory"); - //capabilityNames.append("DeclineFriendship"); + capabilityNames.append("DeclineFriendship"); capabilityNames.append("DeclineGroupInvite"); // ReadOfflineMsgs recieved messages only!!! capabilityNames.append("DispatchRegionInfo"); capabilityNames.append("DirectDelivery"); @@ -3120,7 +3120,7 @@ void LLViewerRegionImpl::buildCapabilityNames(LLSD& capabilityNames) capabilityNames.append("ParcelVoiceInfoRequest"); capabilityNames.append("ProductInfoRequest"); capabilityNames.append("ProvisionVoiceAccountRequest"); - capabilityNames.append("ReadOfflineMsgs"); // Only use with AcceptGroupInvite AcceptFriendship + capabilityNames.append("ReadOfflineMsgs"); // Requires to respond reliably: AcceptFriendship, AcceptGroupInvite, DeclineFriendship, DeclineGroupInvite capabilityNames.append("RemoteParcelRequest"); capabilityNames.append("RenderMaterials"); capabilityNames.append("RequestTextureDownload"); diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp index 11226435eb..28697739e9 100644 --- a/indra/newview/llviewertexture.cpp +++ b/indra/newview/llviewertexture.cpp @@ -125,11 +125,18 @@ const F32 desired_discard_bias_min = -2.0f; // -max number of levels to improve const F32 desired_discard_bias_max = (F32)MAX_DISCARD_LEVEL; // max number of levels to reduce image quality by const F64 log_2 = log(2.0); +#if ADDRESS_SIZE == 32 +const U32 DESIRED_NORMAL_FETCHED_TEXTURE_SIZE = (U32)LLViewerFetchedTexture::MAX_IMAGE_SIZE_DEFAULT / 2; +#else +const U32 DESIRED_NORMAL_FETCHED_TEXTURE_SIZE = (U32)LLViewerFetchedTexture::MAX_IMAGE_SIZE_DEFAULT; +#endif + LLUUID LLViewerTexture::sInvisiprimTexture1 = LLUUID::null; LLUUID LLViewerTexture::sInvisiprimTexture2 = LLUUID::null; #define TEX_INVISIPRIM1 "e97cf410-8e61-7005-ec06-629eba4cd1fb" #define TEX_INVISIPRIM2 "38b86f85-2575-52a9-a531-23108d8da837" + //---------------------------------------------------------------------------------------------- //namespace: LLViewerTextureAccess //---------------------------------------------------------------------------------------------- @@ -1688,12 +1695,17 @@ void LLViewerFetchedTexture::processTextureStats() mDesiredDiscardLevel = llmin(getMaxDiscardLevel(), (S32)mLoadedCallbackDesiredDiscardLevel); } else - { + { + U32 desired_size = MAX_IMAGE_SIZE_DEFAULT; // MAX_IMAGE_SIZE_DEFAULT = 1024 and max size ever is 2048 + if (mBoostLevel <= LLGLTexture::BOOST_SCULPTED) + { + desired_size = DESIRED_NORMAL_FETCHED_TEXTURE_SIZE; + } if(!mKnownDrawWidth || !mKnownDrawHeight || mFullWidth <= mKnownDrawWidth || mFullHeight <= mKnownDrawHeight) { - if (mFullWidth > MAX_IMAGE_SIZE_DEFAULT || mFullHeight > MAX_IMAGE_SIZE_DEFAULT) + if (mFullWidth > desired_size || mFullHeight > desired_size) { - mDesiredDiscardLevel = 1; // MAX_IMAGE_SIZE_DEFAULT = 1024 and max size ever is 2048 + mDesiredDiscardLevel = 1; } else { @@ -3342,8 +3354,13 @@ void LLViewerLODTexture::processTextureStats() discard_level = floorf(discard_level); F32 min_discard = 0.f; - if (mFullWidth > MAX_IMAGE_SIZE_DEFAULT || mFullHeight > MAX_IMAGE_SIZE_DEFAULT) - min_discard = 1.f; // MAX_IMAGE_SIZE_DEFAULT = 1024 and max size ever is 2048 + U32 desired_size = MAX_IMAGE_SIZE_DEFAULT; // MAX_IMAGE_SIZE_DEFAULT = 1024 and max size ever is 2048 + if (mBoostLevel <= LLGLTexture::BOOST_SCULPTED) + { + desired_size = DESIRED_NORMAL_FETCHED_TEXTURE_SIZE; + } + if (mFullWidth > desired_size || mFullHeight > desired_size) + min_discard = 1.f; discard_level = llclamp(discard_level, min_discard, (F32)MAX_DISCARD_LEVEL); diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index bbf3747ec2..16c40dc94c 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -4962,50 +4962,22 @@ void LLViewerWindow::renderSelections( BOOL for_gl_pick, BOOL pick_parcel_walls, { if( !LLSelectMgr::getInstance()->getSelection()->isEmpty() ) { - BOOL moveable_object_selected = FALSE; - BOOL all_selected_objects_move = TRUE; - BOOL all_selected_objects_modify = TRUE; - // gSavedSettings replacement - //BOOL selecting_linked_set = !gSavedSettings.getBOOL("EditLinkedParts"); - static LLCachedControl editLinkedParts(gSavedSettings, "EditLinkedParts"); - BOOL selecting_linked_set = !(BOOL)editLinkedParts; - // - - for (LLObjectSelection::iterator iter = LLSelectMgr::getInstance()->getSelection()->begin(); - iter != LLSelectMgr::getInstance()->getSelection()->end(); iter++) - { - LLSelectNode* nodep = *iter; - LLViewerObject* object = nodep->getObject(); - LLViewerObject *root_object = (object == NULL) ? NULL : object->getRootEdit(); - BOOL this_object_movable = FALSE; - if (object->permMove() && !object->isPermanentEnforced() && - ((root_object == NULL) || !root_object->isPermanentEnforced()) && - (object->permModify() || selecting_linked_set)) - { - moveable_object_selected = TRUE; - this_object_movable = TRUE; - -// [RLVa:KB] - Checked: 2010-03-31 (RLVa-1.2.0c) | Modified: RLVa-0.2.0g - if ( (rlv_handler_t::isEnabled()) && - ((gRlvHandler.hasBehaviour(RLV_BHVR_UNSIT)) || (gRlvHandler.hasBehaviour(RLV_BHVR_SITTP))) ) - { - if ((isAgentAvatarValid()) && (gAgentAvatarp->isSitting()) && (gAgentAvatarp->getRoot() == object->getRootEdit())) - moveable_object_selected = this_object_movable = FALSE; - } -// [/RLVa:KB] - } - all_selected_objects_move = all_selected_objects_move && this_object_movable; - all_selected_objects_modify = all_selected_objects_modify && object->permModify(); - } + bool all_selected_objects_move; + bool all_selected_objects_modify; + // Note: This might be costly to do on each frame and when a lot of objects are selected + // we might be better off with some kind of memory for selection and/or states, consider + // optimizing, perhaps even some kind of selection generation at level of LLSelectMgr to + // make whole viewer benefit. + LLSelectMgr::getInstance()->selectGetEditMoveLinksetPermissions(all_selected_objects_move, all_selected_objects_modify); BOOL draw_handles = TRUE; - if (tool == LLToolCompTranslate::getInstance() && (!moveable_object_selected || !all_selected_objects_move)) + if (tool == LLToolCompTranslate::getInstance() && !all_selected_objects_move) { draw_handles = FALSE; } - if (tool == LLToolCompRotate::getInstance() && (!moveable_object_selected || !all_selected_objects_move)) + if (tool == LLToolCompRotate::getInstance() && !all_selected_objects_move) { draw_handles = FALSE; } diff --git a/indra/newview/llvoicechannel.cpp b/indra/newview/llvoicechannel.cpp index c58e98b3fb..f971554c9d 100644 --- a/indra/newview/llvoicechannel.cpp +++ b/indra/newview/llvoicechannel.cpp @@ -74,10 +74,18 @@ LLVoiceChannel::LLVoiceChannel(const LLUUID& session_id, const std::string& sess LLVoiceChannel::~LLVoiceChannel() { - // Must check instance exists here, the singleton MAY have already been destroyed. - if(LLVoiceClient::instanceExists()) + if (sSuspendedVoiceChannel == this) { - LLVoiceClient::getInstance()->removeObserver(this); + sSuspendedVoiceChannel = NULL; + } + if (sCurrentVoiceChannel == this) + { + sCurrentVoiceChannel = NULL; + // Must check instance exists here, the singleton MAY have already been destroyed. + if(LLVoiceClient::instanceExists()) + { + LLVoiceClient::getInstance()->removeObserver(this); + } } sVoiceChannelMap.erase(mSessionID); diff --git a/indra/newview/llvoicevivox.cpp b/indra/newview/llvoicevivox.cpp index 01f7718df7..6ea661d6c6 100644 --- a/indra/newview/llvoicevivox.cpp +++ b/indra/newview/llvoicevivox.cpp @@ -467,7 +467,7 @@ void LLVivoxVoiceClient::updateSettings() bool LLVivoxVoiceClient::writeString(const std::string &str) { bool result = false; - LL_DEBUGS("LOW Voice") << "sending:\n" << str << LL_ENDL; + LL_DEBUGS("LowVoice") << "sending:\n" << str << LL_ENDL; if(mConnected) { @@ -7445,12 +7445,12 @@ void LLVivoxProtocolParser::processResponse(std::string tag) if (isEvent) { const char *eventTypeCstr = eventTypeString.c_str(); - LL_DEBUGS("LOW Voice") << eventTypeCstr << LL_ENDL; + LL_DEBUGS("LowVoice") << eventTypeCstr << LL_ENDL; if (!stricmp(eventTypeCstr, "ParticipantUpdatedEvent")) { // These happen so often that logging them is pretty useless. - LL_DEBUGS("LOW Voice") << "Updated Params: " << sessionHandle << ", " << sessionGroupHandle << ", " << uriString << ", " << alias << ", " << isModeratorMuted << ", " << isSpeaking << ", " << volume << ", " << energy << LL_ENDL; + LL_DEBUGS("LowVoice") << "Updated Params: " << sessionHandle << ", " << sessionGroupHandle << ", " << uriString << ", " << alias << ", " << isModeratorMuted << ", " << isSpeaking << ", " << volume << ", " << energy << LL_ENDL; LLVivoxVoiceClient::getInstance()->participantUpdatedEvent(sessionHandle, sessionGroupHandle, uriString, alias, isModeratorMuted, isSpeaking, volume, energy); } else if (!stricmp(eventTypeCstr, "AccountLoginStateChangeEvent")) @@ -7519,7 +7519,7 @@ void LLVivoxProtocolParser::processResponse(std::string tag) 0 */ - LL_DEBUGS("LOW Voice") << "Added Params: " << sessionHandle << ", " << sessionGroupHandle << ", " << uriString << ", " << alias << ", " << nameString << ", " << displayNameString << ", " << participantType << LL_ENDL; + LL_DEBUGS("LowVoice") << "Added Params: " << sessionHandle << ", " << sessionGroupHandle << ", " << uriString << ", " << alias << ", " << nameString << ", " << displayNameString << ", " << participantType << LL_ENDL; LLVivoxVoiceClient::getInstance()->participantAddedEvent(sessionHandle, sessionGroupHandle, uriString, alias, nameString, displayNameString, participantType); } else if (!stricmp(eventTypeCstr, "ParticipantRemovedEvent")) @@ -7532,7 +7532,7 @@ void LLVivoxProtocolParser::processResponse(std::string tag) xtx7YNV-3SGiG7rA1fo5Ndw== */ - LL_DEBUGS("LOW Voice") << "Removed params:" << sessionHandle << ", " << sessionGroupHandle << ", " << uriString << ", " << alias << ", " << nameString << LL_ENDL; + LL_DEBUGS("LowVoice") << "Removed params:" << sessionHandle << ", " << sessionGroupHandle << ", " << uriString << ", " << alias << ", " << nameString << LL_ENDL; LLVivoxVoiceClient::getInstance()->participantRemovedEvent(sessionHandle, sessionGroupHandle, uriString, alias, nameString); } @@ -7599,7 +7599,7 @@ void LLVivoxProtocolParser::processResponse(std::string tag) else { const char *actionCstr = actionString.c_str(); - LL_DEBUGS("LOW Voice") << actionCstr << LL_ENDL; + LL_DEBUGS("LowVoice") << actionCstr << LL_ENDL; if (!stricmp(actionCstr, "Session.Set3DPosition.1")) { diff --git a/indra/newview/llweb.cpp b/indra/newview/llweb.cpp index 472598e306..5eb3b0a7f3 100644 --- a/indra/newview/llweb.cpp +++ b/indra/newview/llweb.cpp @@ -281,6 +281,6 @@ bool LLWeb::useExternalBrowser(const std::string &url) boost::match_results matches; return boost::regex_search(url, matches, pattern); } - return false; + //return false; // Fix unreachable code #endif } diff --git a/indra/newview/llworldmap.cpp b/indra/newview/llworldmap.cpp index 8ead825e56..04e3461513 100644 --- a/indra/newview/llworldmap.cpp +++ b/indra/newview/llworldmap.cpp @@ -195,7 +195,7 @@ void LLSimInfo::dump() const U32 x_pos, y_pos; from_region_handle(mHandle, &x_pos, &y_pos); - LL_INFOS("World Map") << x_pos << "," << y_pos + LL_INFOS("WorldMap") << x_pos << "," << y_pos << " " << mName << " " << (S32)mAccess << " " << std::hex << mRegionFlags << std::dec @@ -258,7 +258,7 @@ LLWorldMap::LLWorldMap() : mTrackingLocation( 0, 0, 0 ), mFirstRequest(true) { - //LL_INFOS("World Map") << "Creating the World Map -> LLWorldMap::LLWorldMap()" << LL_ENDL; + //LL_INFOS("WorldMap") << "Creating the World Map -> LLWorldMap::LLWorldMap()" << LL_ENDL; mMapBlockLoaded = new bool[MAP_BLOCK_RES*MAP_BLOCK_RES]; clearSimFlags(); } @@ -266,7 +266,7 @@ LLWorldMap::LLWorldMap() : LLWorldMap::~LLWorldMap() { - //LL_INFOS("World Map") << "Destroying the World Map -> LLWorldMap::~LLWorldMap()" << LL_ENDL; + //LL_INFOS("WorldMap") << "Destroying the World Map -> LLWorldMap::~LLWorldMap()" << LL_ENDL; reset(); delete[] mMapBlockLoaded; } @@ -431,7 +431,7 @@ bool LLWorldMap::simNameFromPosGlobal(const LLVector3d& pos_global, std::string void LLWorldMap::reloadItems(bool force) { - //LL_INFOS("World Map") << "LLWorldMap::reloadItems()" << LL_ENDL; + //LL_INFOS("WorldMap") << "LLWorldMap::reloadItems()" << LL_ENDL; if (clearItems(force)) { LLWorldMapMessage::getInstance()->sendItemRequest(MAP_ITEM_TELEHUB); @@ -466,7 +466,7 @@ bool LLWorldMap::insertRegion(U32 x_world, U32 y_world, U16 x_size, U16 y_size, else { U64 handle = to_region_handle(x_world, y_world); - //LL_INFOS("World Map") << "Map sim : " << name << ", ID : " << image_id.getString() << LL_ENDL; + //LL_INFOS("WorldMap") << "Map sim : " << name << ", ID : " << image_id.getString() << LL_ENDL; // Insert the region in the region map of the world map // Loading the LLSimInfo object with what we got and insert it in the map LLSimInfo* siminfo = LLWorldMap::getInstance()->simInfoFromHandle(handle); @@ -521,7 +521,7 @@ bool LLWorldMap::insertItem(U32 x_world, U32 y_world, std::string& name, LLUUID& siminfo = LLWorldMap::getInstance()->createSimInfoFromHandle(handle); } - //LL_INFOS("World Map") << "Process item : type = " << type << LL_ENDL; + //LL_INFOS("WorldMap") << "Process item : type = " << type << LL_ENDL; switch (type) { case MAP_ITEM_TELEHUB: // telehubs @@ -615,7 +615,7 @@ bool LLWorldMap::insertItem(U32 x_world, U32 y_world, std::string& name, LLUUID& } case MAP_ITEM_AGENT_LOCATIONS: // agent locations { -// LL_INFOS("World Map") << "New Location " << new_item.mName << LL_ENDL; +// LL_INFOS("WorldMap") << "New Location " << new_item.mName << LL_ENDL; // Map fails to clear agent from a map position if it's the last one //if (extra > 0) // @@ -687,7 +687,7 @@ void LLWorldMap::updateRegions(S32 x0, S32 y0, S32 x1, S32 y1) if (!mMapBlockLoaded[offset] || mMapBlockLastUpdateOffsets.find(offset) == mMapBlockLastUpdateOffsets.end()) // { - //LL_INFOS("World Map") << "Loading Block (" << block_x << "," << block_y << ")" << LL_ENDL; + //LL_INFOS("WorldMap") << "Loading Block (" << block_x << "," << block_y << ")" << LL_ENDL; LLWorldMapMessage::getInstance()->sendMapBlockRequest(block_x * MAP_BLOCK_SIZE, block_y * MAP_BLOCK_SIZE, (block_x * MAP_BLOCK_SIZE) + MAP_BLOCK_SIZE - 1, (block_y * MAP_BLOCK_SIZE) + MAP_BLOCK_SIZE - 1); mMapBlockLoaded[offset] = true; // Periodically update sim info @@ -699,7 +699,7 @@ void LLWorldMap::updateRegions(S32 x0, S32 y0, S32 x1, S32 y1) void LLWorldMap::dump() { - LL_INFOS("World Map") << "LLWorldMap::dump()" << LL_ENDL; + LL_INFOS("WorldMap") << "LLWorldMap::dump()" << LL_ENDL; for (sim_info_map_t::iterator it = mSimInfoMap.begin(); it != mSimInfoMap.end(); ++it) { LLSimInfo* info = it->second; diff --git a/indra/newview/llworldmapmessage.cpp b/indra/newview/llworldmapmessage.cpp index 4779fd7fa3..f4f39e79c6 100644 --- a/indra/newview/llworldmapmessage.cpp +++ b/indra/newview/llworldmapmessage.cpp @@ -58,7 +58,7 @@ LLWorldMapMessage::~LLWorldMapMessage() void LLWorldMapMessage::sendItemRequest(U32 type, U64 handle) { - //LL_INFOS("World Map") << "Send item request : type = " << type << LL_ENDL; + //LL_INFOS("WorldMap") << "Send item request : type = " << type << LL_ENDL; LLMessageSystem* msg = gMessageSystem; msg->newMessageFast(_PREHASH_MapItemRequest); @@ -78,7 +78,7 @@ void LLWorldMapMessage::sendItemRequest(U32 type, U64 handle) void LLWorldMapMessage::sendNamedRegionRequest(std::string region_name) { - //LL_INFOS("World Map") << "LLWorldMap::sendNamedRegionRequest()" << LL_ENDL; + //LL_INFOS("WorldMap") << LL_ENDL; LLMessageSystem* msg = gMessageSystem; // Request for region data @@ -99,7 +99,7 @@ void LLWorldMapMessage::sendNamedRegionRequest(std::string region_name, const std::string& callback_url, bool teleport) // immediately teleport when result returned { - //LL_INFOS("World Map") << "LLWorldMap::sendNamedRegionRequest()" << LL_ENDL; + //LL_INFOS("WorldMap") << LL_ENDL; mSLURLRegionName = region_name; mSLURLRegionHandle = 0; mSLURL = callback_url; @@ -114,7 +114,7 @@ void LLWorldMapMessage::sendHandleRegionRequest(U64 region_handle, const std::string& callback_url, bool teleport) // immediately teleport when result returned { - //LL_INFOS("World Map") << "LLWorldMap::sendHandleRegionRequest()" << LL_ENDL; + //LL_INFOS("WorldMap") << LL_ENDL; mSLURLRegionName.clear(); mSLURLRegionHandle = region_handle; mSLURL = callback_url; @@ -132,7 +132,7 @@ void LLWorldMapMessage::sendHandleRegionRequest(U64 region_handle, void LLWorldMapMessage::sendMapBlockRequest(U16 min_x, U16 min_y, U16 max_x, U16 max_y, bool return_nonexistent) { - //LL_INFOS("World Map") << "LLWorldMap::sendMapBlockRequest()" << ", min = (" << min_x << ", " << min_y << "), max = (" << max_x << ", " << max_y << "), nonexistent = " << return_nonexistent << LL_ENDL; + //LL_INFOS("WorldMap" << " min = (" << min_x << ", " << min_y << "), max = (" << max_x << ", " << max_y << ", nonexistent = " << return_nonexistent << LL_ENDL; LLMessageSystem* msg = gMessageSystem; msg->newMessageFast(_PREHASH_MapBlockRequest); msg->nextBlockFast(_PREHASH_AgentData); @@ -165,7 +165,7 @@ void LLWorldMapMessage::processMapBlockReply(LLMessageSystem* msg, void**) } S32 num_blocks = msg->getNumberOfBlocksFast(_PREHASH_Data); - //LL_INFOS("World Map") << "LLWorldMap::processMapBlockReply(), num_blocks = " << num_blocks << LL_ENDL; + //LL_INFOS("WorldMap") << "num_blocks = " << num_blocks << LL_ENDL; bool found_null_sim = false; @@ -263,7 +263,7 @@ void LLWorldMapMessage::processMapBlockReply(LLMessageSystem* msg, void**) // public static void LLWorldMapMessage::processMapItemReply(LLMessageSystem* msg, void**) { - //LL_INFOS("World Map") << "LLWorldMap::processMapItemReply()" << LL_ENDL; + //LL_INFOS("WorldMap") << LL_ENDL; U32 type; msg->getU32Fast(_PREHASH_RequestData, _PREHASH_ItemType, type); diff --git a/indra/newview/llworldmapview.cpp b/indra/newview/llworldmapview.cpp index 18ab6e39c1..30bb186509 100644 --- a/indra/newview/llworldmapview.cpp +++ b/indra/newview/llworldmapview.cpp @@ -193,7 +193,7 @@ LLWorldMapView::LLWorldMapView() mMouseDownY( 0 ), mSelectIDStart(0) { - //LL_INFOS("World Map") << "Creating the Map -> LLWorldMapView::LLWorldMapView()" << LL_ENDL; + //LL_INFOS("WorldMap") << "Creating the Map -> LLWorldMapView::LLWorldMapView()" << LL_ENDL; clearLastClick(); } @@ -233,7 +233,7 @@ BOOL LLWorldMapView::postBuild() LLWorldMapView::~LLWorldMapView() { - //LL_INFOS("World Map") << "Destroying the map -> LLWorldMapView::~LLWorldMapView()" << LL_ENDL; + //LL_INFOS("WorldMap") << "Destroying the map -> LLWorldMapView::~LLWorldMapView()" << LL_ENDL; cleanupTextures(); } @@ -741,7 +741,7 @@ void LLWorldMapView::drawMipmap(S32 width, S32 height) } else { - //LL_INFOS("World Map") << "Render complete, don't draw background..." << LL_ENDL; + //LL_INFOS("WorldMap") << "Render complete, don't draw background..." << LL_ENDL; } // Render the current level @@ -853,7 +853,7 @@ bool LLWorldMapView::drawMipmapLevel(S32 width, S32 height, S32 level, bool load //else //{ // Waiting for a tile -> the level is not complete - // LL_INFOS("World Map") << "Unfetched tile. level = " << level << LL_ENDL; + // LL_INFOS("WorldMap") << "Unfetched tile. level = " << level << LL_ENDL; //} } else @@ -1844,7 +1844,7 @@ void LLWorldMapView::updateVisibleBlocks() S32 world_bottom = world_center_y - S32(half_height / sMapScale) - 1; S32 world_top = world_center_y + S32(half_height / sMapScale) + 1; - //LL_INFOS("World Map") << "LLWorldMapView::updateVisibleBlocks() : sMapScale = " << sMapScale << ", left = " << world_left << ", right = " << world_right << ", bottom = " << world_bottom << ", top = " << world_top << LL_ENDL; + //LL_INFOS("WorldMap") << "LLWorldMapView::updateVisibleBlocks() : sMapScale = " << sMapScale << ", left = " << world_left << ", right = " << world_right << ", bottom = " << world_bottom << ", top = " << world_top << LL_ENDL; LLWorldMap::getInstance()->updateRegions(world_left, world_bottom, world_right, world_top); } diff --git a/indra/newview/llworldmipmap.cpp b/indra/newview/llworldmipmap.cpp index 72756c8e72..3a657780b5 100644 --- a/indra/newview/llworldmipmap.cpp +++ b/indra/newview/llworldmipmap.cpp @@ -108,7 +108,7 @@ void LLWorldMipmap::equalizeBoostLevels() } } #if DEBUG_TILES_STAT - LL_INFOS("World Map") << "LLWorldMipmap tile stats : total requested = " << nb_tiles << ", visible = " << nb_visible << ", missing = " << nb_missing << LL_ENDL; + LL_INFOS("WorldMap") << "LLWorldMipmap tile stats : total requested = " << nb_tiles << ", visible = " << nb_visible << ", missing = " << nb_missing << LL_ENDL; #endif // DEBUG_TILES_STAT } @@ -198,7 +198,7 @@ LLPointer LLWorldMipmap::loadObjectsTile(U32 grid_x, U32 // Use a local jpeg for every tile to test map speed without S3 access //imageurl = "file://C:\\Develop\\mapserver-distribute-3\\indra\\build-vc80\\mapserver\\relwithdebinfo\\regions\\00995\\01001\\region-995-1001-prims.jpg"; // END DEBUG - //LL_INFOS("World Map") << "LLWorldMipmap::loadObjectsTile(), URL = " << imageurl << LL_ENDL; + //LL_INFOS("WorldMap") << "LLWorldMipmap::loadObjectsTile(), URL = " << imageurl << LL_ENDL; LLPointer img = LLViewerTextureManager::getFetchedTextureFromUrl(imageurl, FTT_MAP_TILE, TRUE, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE); img->setBoostLevel(LLGLTexture::BOOST_MAP); diff --git a/indra/newview/skins/default/textures/icons/Inv_UnknownObject.png b/indra/newview/skins/default/textures/icons/Inv_UnknownObject.png new file mode 100644 index 0000000000..10f2b31cb5 Binary files /dev/null and b/indra/newview/skins/default/textures/icons/Inv_UnknownObject.png differ diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml index 836ff5d9eb..0b406bf91e 100644 --- a/indra/newview/skins/default/textures/textures.xml +++ b/indra/newview/skins/default/textures/textures.xml @@ -341,6 +341,7 @@ with the same filename but different name + diff --git a/indra/newview/skins/default/xui/de/notifications.xml b/indra/newview/skins/default/xui/de/notifications.xml index 55f17eb564..3d50d72eb7 100644 --- a/indra/newview/skins/default/xui/de/notifications.xml +++ b/indra/newview/skins/default/xui/de/notifications.xml @@ -3429,6 +3429,9 @@ Diese werden für ein paar Sekunden sicherheitshalber gesperrt. Fehler beim Speichern der Voreinstellung [NAME]. + + Standard-Voreinstellung kann nicht überschrieben werden. + Fehler beim Löschen der Voreinstellung [NAME]. diff --git a/indra/newview/skins/default/xui/en/floater_outgoing_call.xml b/indra/newview/skins/default/xui/en/floater_outgoing_call.xml index 5bf0f722f7..69102b05ea 100644 --- a/indra/newview/skins/default/xui/en/floater_outgoing_call.xml +++ b/indra/newview/skins/default/xui/en/floater_outgoing_call.xml @@ -56,7 +56,8 @@ top="27" visible="false" width="315" - word_wrap="true"> + word_wrap="true" + parse_urls="false"> Connecting to [CALLEE_NAME] + word_wrap="true" + parse_urls="false"> Calling [CALLEE_NAME] + word_wrap="true" + parse_urls="false"> You have been disconnected from [VOICE_CHANNEL_NAME]. [RECONNECT_NEARBY] + word_wrap="true" + parse_urls="false"> Your call has ended. [RECONNECT_NEARBY] + word_wrap="true" + parse_urls="false"> You have ended the call. [RECONNECT_NEARBY] + word_wrap="true" + parse_urls="false"> Leaving [CURRENT_CHAT].