diff --git a/.hgtags b/.hgtags index 682215b471..11deee1042 100755 --- a/.hgtags +++ b/.hgtags @@ -33,6 +33,7 @@ a27ad24ed75000d96d056aa20495637386e4a53e Firestorm_4.7.5_Release 31f9b0f8e9365a87975af3aa73e3f782db17f994 Firestorm_4.7.7_Release 6ef63161a501b12536b1a94b74d0084a4b014572 Firestorm_4.7.9_Release ab632018105ccfdf8a9e5ea1a8302badd58b686e Firestorm_5.0.1_Release +85a08f4808867882219d3fceeb32f7df0de523b7 Firestorm_5.0.7_Release bb38ff1a763738609e1b3cada6d15fa61e5e84b9 2.1.1-release 003dd9461bfa479049afcc34545ab3431b147c7c v2start 52d96ad3d39be29147c5b2181b3bb46af6164f0e alpha-3 diff --git a/indra/lib/python/indra/util/llmanifest.py b/indra/lib/python/indra/util/llmanifest.py index 9086f80838..072542fd5b 100755 --- a/indra/lib/python/indra/util/llmanifest.py +++ b/indra/lib/python/indra/util/llmanifest.py @@ -176,8 +176,6 @@ def main(): option_names.append('help') option_names.append('m64') - option_names.append('upgradecodes=') - option_names.append('copy_artwork') options, remainder = getopt.getopt(sys.argv[1:], "", option_names) diff --git a/indra/llcorehttp/_httpinternal.h b/indra/llcorehttp/_httpinternal.h index 79c89d6c92..690ebbecd8 100644 --- a/indra/llcorehttp/_httpinternal.h +++ b/indra/llcorehttp/_httpinternal.h @@ -127,9 +127,12 @@ const int HTTP_TRACE_MAX = HTTP_TRACE_CURL_BODIES; // We want to span a few windows to allow transport to slow // after onset of the throttles and then recover without a final // failure. Other systems may need other constants. -const int HTTP_RETRY_COUNT_DEFAULT = 8; +const int HTTP_RETRY_COUNT_DEFAULT = 5; const int HTTP_RETRY_COUNT_MIN = 0; const int HTTP_RETRY_COUNT_MAX = 100; +const HttpTime HTTP_RETRY_BACKOFF_MIN_DEFAULT = 1E6L; // 1 sec +const HttpTime HTTP_RETRY_BACKOFF_MAX_DEFAULT = 5E6L; // 5 sec +const HttpTime HTTP_RETRY_BACKOFF_MAX = 20E6L; // 20 sec const int HTTP_REDIRECTS_DEFAULT = 10; diff --git a/indra/llcorehttp/_httpoprequest.cpp b/indra/llcorehttp/_httpoprequest.cpp index 4d4b49fff3..5e3cb61e22 100644 --- a/indra/llcorehttp/_httpoprequest.cpp +++ b/indra/llcorehttp/_httpoprequest.cpp @@ -140,6 +140,8 @@ HttpOpRequest::HttpOpRequest() mPolicy503Retries(0), mPolicyRetryAt(HttpTime(0)), mPolicyRetryLimit(HTTP_RETRY_COUNT_DEFAULT), + mPolicyMinRetryBackoff(HttpTime(HTTP_RETRY_BACKOFF_MIN_DEFAULT)), + mPolicyMaxRetryBackoff(HttpTime(HTTP_RETRY_BACKOFF_MAX_DEFAULT)), mCallbackSSLVerify(NULL) { // *NOTE: As members are added, retry initialization/cleanup @@ -434,6 +436,9 @@ void HttpOpRequest::setupCommon(HttpRequest::policy_t policy_id, mPolicyRetryLimit = options->getRetries(); mPolicyRetryLimit = llclamp(mPolicyRetryLimit, HTTP_RETRY_COUNT_MIN, HTTP_RETRY_COUNT_MAX); mTracing = (std::max)(mTracing, llclamp(options->getTrace(), HTTP_TRACE_MIN, HTTP_TRACE_MAX)); + + mPolicyMinRetryBackoff = llclamp(options->getMinBackoff(), HttpTime(0), HTTP_RETRY_BACKOFF_MAX); + mPolicyMaxRetryBackoff = llclamp(options->getMaxBackoff(), mPolicyMinRetryBackoff, HTTP_RETRY_BACKOFF_MAX); } } diff --git a/indra/llcorehttp/_httpoprequest.h b/indra/llcorehttp/_httpoprequest.h index 8a94ca3cdc..bf22eadce4 100644 --- a/indra/llcorehttp/_httpoprequest.h +++ b/indra/llcorehttp/_httpoprequest.h @@ -232,6 +232,8 @@ public: int mPolicy503Retries; HttpTime mPolicyRetryAt; int mPolicyRetryLimit; + HttpTime mPolicyMinRetryBackoff; // initial delay between retries (mcs) + HttpTime mPolicyMaxRetryBackoff; }; // end class HttpOpRequest diff --git a/indra/llcorehttp/_httppolicy.cpp b/indra/llcorehttp/_httppolicy.cpp index b2709b53ec..4889cac9bf 100644 --- a/indra/llcorehttp/_httppolicy.cpp +++ b/indra/llcorehttp/_httppolicy.cpp @@ -151,20 +151,16 @@ void HttpPolicy::addOp(const HttpOpRequest::ptr_t &op) void HttpPolicy::retryOp(const HttpOpRequest::ptr_t &op) { - static const HttpTime retry_deltas[] = - { - 250000, // 1st retry in 0.25 S, etc... - 500000, - 1000000, - 2000000, - 5000000 // ... to every 5.0 S. - }; - static const int delta_max(int(LL_ARRAY_SIZE(retry_deltas)) - 1); static const HttpStatus error_503(503); const HttpTime now(totalTime()); const int policy_class(op->mReqPolicy); - HttpTime delta(retry_deltas[llclamp(op->mPolicyRetries, 0, delta_max)]); + + HttpTime delta_min = op->mPolicyMinRetryBackoff; + HttpTime delta_max = op->mPolicyMaxRetryBackoff; + // mPolicyRetries limited to 100 + U32 delta_factor = op->mPolicyRetries <= 10 ? 1 << op->mPolicyRetries : 1024; + HttpTime delta = llmin(delta_min * delta_factor, delta_max); bool external_delta(false); if (op->mReplyRetryAfter > 0 && op->mReplyRetryAfter < 30) diff --git a/indra/llcorehttp/httpoptions.cpp b/indra/llcorehttp/httpoptions.cpp index aab447f2dd..df5aa52fa9 100644 --- a/indra/llcorehttp/httpoptions.cpp +++ b/indra/llcorehttp/httpoptions.cpp @@ -39,6 +39,8 @@ HttpOptions::HttpOptions() : mTimeout(HTTP_REQUEST_TIMEOUT_DEFAULT), mTransferTimeout(HTTP_REQUEST_XFER_TIMEOUT_DEFAULT), mRetries(HTTP_RETRY_COUNT_DEFAULT), + mMinRetryBackoff(HTTP_RETRY_BACKOFF_MIN_DEFAULT), + mMaxRetryBackoff(HTTP_RETRY_BACKOFF_MAX_DEFAULT), mUseRetryAfter(HTTP_USE_RETRY_AFTER_DEFAULT), mFollowRedirects(true), mVerifyPeer(false), @@ -81,6 +83,16 @@ void HttpOptions::setRetries(unsigned int retries) mRetries = retries; } +void HttpOptions::setMinBackoff(HttpTime delay) +{ + mMinRetryBackoff = delay; +} + +void HttpOptions::setMaxBackoff(HttpTime delay) +{ + mMaxRetryBackoff = delay; +} + void HttpOptions::setUseRetryAfter(bool use_retry) { mUseRetryAfter = use_retry; diff --git a/indra/llcorehttp/httpoptions.h b/indra/llcorehttp/httpoptions.h index 510eaa45bb..8a6de61b04 100644 --- a/indra/llcorehttp/httpoptions.h +++ b/indra/llcorehttp/httpoptions.h @@ -101,13 +101,31 @@ public: /// Sets the number of retries on an LLCore::HTTPRequest before the /// request fails. - // Default: 8 + // Default: 5 void setRetries(unsigned int retries); unsigned int getRetries() const { return mRetries; } + /// Sets minimal delay before request retries. In microseconds. + /// HttpPolicy will increase delay from min to max with each retry + // Default: 1 000 000 mcs + void setMinBackoff(HttpTime delay); + HttpTime getMinBackoff() const + { + return mMinRetryBackoff; + } + + /// Sets maximum delay before request retries. In microseconds. + /// HttpPolicy will increase delay from min to max with each retry + // Default: 5 000 000 mcs + void setMaxBackoff(HttpTime delay); + HttpTime getMaxBackoff() const + { + return mMaxRetryBackoff; + } + // Default: true void setUseRetryAfter(bool use_retry); bool getUseRetryAfter() const @@ -166,6 +184,8 @@ protected: unsigned int mTimeout; unsigned int mTransferTimeout; unsigned int mRetries; + HttpTime mMinRetryBackoff; + HttpTime mMaxRetryBackoff; bool mUseRetryAfter; bool mFollowRedirects; bool mVerifyPeer; diff --git a/indra/llui/llurlentry.cpp b/indra/llui/llurlentry.cpp index efea8c9ef0..bc8803637e 100644 --- a/indra/llui/llurlentry.cpp +++ b/indra/llui/llurlentry.cpp @@ -897,7 +897,9 @@ LLUrlEntryAgentDisplayName::LLUrlEntryAgentDisplayName() std::string LLUrlEntryAgentDisplayName::getName(const LLAvatarName& avatar_name) { - return avatar_name.getDisplayName(true); + // Don't force a display name if display names are disabled + //return avatar_name.getDisplayName(true); + return avatar_name.getDisplayName(); } // diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 6ab85c0221..8ae0dd8c9e 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -2146,7 +2146,7 @@ if (WINDOWS) ) if( ND_BUILD64BIT_ARCH ) - set( VIEWERMANIFEST_FLAGS --m64 --copy_artwork ) + set( VIEWERMANIFEST_FLAGS --m64 ) set( VIEWERMANIFEST_PACKAGE_FLAGS --m64 ) else( ND_BUILD64BIT_ARCH ) set( VIEWERMANIFEST_FLAGS "" ) diff --git a/indra/newview/app_settings/scriptlibrary_ossl.xml b/indra/newview/app_settings/scriptlibrary_ossl.xml index e78fd0fb0d..9510442a97 100644 --- a/indra/newview/app_settings/scriptlibrary_ossl.xml +++ b/indra/newview/app_settings/scriptlibrary_ossl.xml @@ -417,6 +417,30 @@ desc="osAddAgentToGroup(key avatar, string group_name, string role_name);Adds the avatar to a group under a given role" /> + + + + + + + + + + + + diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index c037f9d182..45a2b73018 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -13,6 +13,17 @@ Value 0 + FSEnforceStrictObjectCheck + + Comment + Force malformed prims to be treated as invalid. This setting derenders all malformed prims, even those that might not cause obvious issues. Setting to false will allow bad prims to render but can cause crashes. + Persist + 1 + Type + Boolean + Value + 1 + FSUseV2Friends Comment @@ -7800,12 +7811,12 @@ Type F32 Value - 10.0 + 40.0 LoginSRVPump Comment - Name of the message pump that handles SRV request + Name of the message pump that handles SRV request (deprecated) Persist 0 Type @@ -8650,7 +8661,7 @@ Type Boolean Value - 1 + 0 MemoryLogFrequency diff --git a/indra/newview/fschathistory.cpp b/indra/newview/fschathistory.cpp index c74c2371d7..8d5c27f3c2 100644 --- a/indra/newview/fschathistory.cpp +++ b/indra/newview/fschathistory.cpp @@ -1334,7 +1334,10 @@ void FSChatHistory::appendMessage(const LLChat& chat, const LLSD &args, const LL { if (chat.mSourceType == CHAT_SOURCE_AGENT) { - std::string name_format = "completename"; + static LLCachedControl useDisplayNames(gSavedSettings, "UseDisplayNames"); + static LLCachedControl nameTagShowUsernames(gSavedSettings, "NameTagShowUsernames"); + + std::string name_format = (useDisplayNames && nameTagShowUsernames) ? "completename" : "displayname"; if (is_local && gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES)) { name_format = "rlvanonym"; diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp index 268cd3e577..caaddab212 100644 --- a/indra/newview/llagent.cpp +++ b/indra/newview/llagent.cpp @@ -3283,7 +3283,10 @@ bool LLAgent::requestPostCapability(const std::string &capName, LLSD &postData, { std::string url; - url = getRegion()->getCapability(capName); + // FIRE-21323: Crashfix + //url = getRegion()->getCapability(capName); + url = getRegion() ? getRegion()->getCapability(capName) : ""; + // if (url.empty()) { @@ -3299,7 +3302,10 @@ bool LLAgent::requestGetCapability(const std::string &capName, httpCallback_t cb { std::string url; - url = getRegion()->getCapability(capName); + // FIRE-21323: Crashfix + //url = getRegion()->getCapability(capName); + url = getRegion() ? getRegion()->getCapability(capName) : ""; + // if (url.empty()) { diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index cf54183208..c4dc8d75db 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -1518,7 +1518,8 @@ void LLAppViewer::checkMemory() if(is_low) { - LLMemory::logMemoryInfo() ; + // Causes spammy log output + //LLMemory::logMemoryInfo() ; } } diff --git a/indra/newview/llavataractions.cpp b/indra/newview/llavataractions.cpp index 1623acd162..009df1d75c 100644 --- a/indra/newview/llavataractions.cpp +++ b/indra/newview/llavataractions.cpp @@ -1362,7 +1362,17 @@ void LLAvatarActions::viewChatHistory(const LLUUID& id) { if (iter->getParticipantID() == id) { - LLFloaterReg::showInstance("preview_conversation", iter->getSessionID(), true); + // External chat history option + //LLFloaterReg::showInstance("preview_conversation", iter->getSessionID(), true); + if (gSavedSettings.getBOOL("FSUseBuiltInHistory")) + { + LLFloaterReg::showInstance("preview_conversation", iter->getSessionID(), TRUE); + } + else + { + gViewerWindow->getWindow()->openFile(LLLogChat::makeLogFileName(iter->getHistoryFileName())); + } + // return; } } @@ -1376,6 +1386,7 @@ void LLAvatarActions::viewChatHistory(const LLUUID& id) extended_id[LL_FCP_COMPLETE_NAME] = avatar_name.getCompleteName(); // [Legacy IM logfile names] //extended_id[LL_FCP_ACCOUNT_NAME] = avatar_name.getAccountName(); + //LLFloaterReg::showInstance("preview_conversation", extended_id, true); if (gSavedSettings.getBOOL("UseLegacyIMLogNames")) { std::string avatar_user_name = avatar_name.getUserName(); @@ -1385,8 +1396,16 @@ void LLAvatarActions::viewChatHistory(const LLUUID& id) { extended_id[LL_FCP_ACCOUNT_NAME] = avatar_name.getAccountName(); } + + if (gSavedSettings.getBOOL("FSUseBuiltInHistory")) + { + LLFloaterReg::showInstance("preview_conversation", extended_id, TRUE); + } + else + { + gViewerWindow->getWindow()->openFile(LLLogChat::makeLogFileName(extended_id[LL_FCP_ACCOUNT_NAME].asString())); + } // [Legacy IM logfile names] - LLFloaterReg::showInstance("preview_conversation", extended_id, true); } } diff --git a/indra/newview/llfloaterbvhpreview.cpp b/indra/newview/llfloaterbvhpreview.cpp index f2619cb605..db3739098f 100644 --- a/indra/newview/llfloaterbvhpreview.cpp +++ b/indra/newview/llfloaterbvhpreview.cpp @@ -1196,7 +1196,10 @@ bool LLFloaterBvhPreview::validateLoopIn(const LLSD& data) getChild("loop_in_point")->setValue(LLSD(loop_in_value)); // FIRE-17277: Allow entering Loop In/Loop Out as frames - getChild("loop_in_frames")->setValue(LLSD(loop_in_value / 100.f * (F32)mNumFrames)); + // FIRE-21330: (additional cleanup) make loop out round to an integer + // getChild("loop_in_frames")->setValue(LLSD(loop_in_value / 100.f * (F32)mNumFrames)); + getChild("loop_in_frames")->setValue(LLSD(ll_round(loop_in_value / 100.f * (F32)mNumFrames))); + // // return true; } @@ -1227,7 +1230,10 @@ bool LLFloaterBvhPreview::validateLoopOut(const LLSD& data) getChild("loop_out_point")->setValue(LLSD(loop_out_value)); // FIRE-17277: Allow entering Loop In/Loop Out as frames - getChild("loop_out_frames")->setValue(LLSD(loop_out_value / 100.f * (F32)mNumFrames)); + // FIRE-21330: (additional cleanup) make loop out round to an integer +// getChild("loop_out_frames")->setValue(LLSD(loop_out_value / 100.f * (F32)mNumFrames)); + getChild("loop_out_frames")->setValue(LLSD(ll_round(loop_out_value / 100.f * (F32)mNumFrames))); + // // return true; } @@ -1249,9 +1255,12 @@ bool LLFloaterBvhPreview::validateLoopInFrames(const LLSD& data) { loop_in_value = 0.f; } - else if (loop_in_value > 100.f) + // FIRE-21330: Max value for the ctrl is 1000 not 100. +// else if (loop_in_value > 100.f) + else if (loop_in_value > 1000.f) { - loop_in_value = 100.f; +// loop_in_value = 100.f; + loop_in_value = 1000.f; } else if (loop_in_value > loop_out_value) { @@ -1278,9 +1287,12 @@ bool LLFloaterBvhPreview::validateLoopOutFrames(const LLSD& data) { loop_out_value = 0.f; } - else if (loop_out_value > 100.f) + // FIRE-21330: Max value for the ctrl is 1000 not 100. + // else if (loop_out_value > 100.f) + else if (loop_out_value > 1000.f) { - loop_out_value = 100.f; + // loop_out_value = 100.f; + loop_out_value = 1000.f; } else if (loop_out_value < loop_in_value) { diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp index 9d0e646ca5..fc63493a62 100644 --- a/indra/newview/llimview.cpp +++ b/indra/newview/llimview.cpp @@ -3075,15 +3075,21 @@ void LLIMMgr::addMessage( if (!dontIgnoreAdHocFromFriends || (dontIgnoreAdHocFromFriends && LLAvatarTracker::instance().getBuddyInfo(other_participant_id) == NULL)) { static LLCachedControl reportIgnoredAdHocSession(gSavedSettings, "FSReportIgnoredAdHocSession"); - LL_INFOS() << "Ignoring conference (ad-hoc) chat from " << new_session_id.asString() << LL_ENDL; + // [FIRE-21385] Add inviter name/UUID to ad-hoc ignored messages + LLSD args; + args["AVATAR_NAME"] = LLSLURL("agent", other_participant_id, "about").getSLURLString(); +// LL_INFOS() << "Ignoring conference (ad-hoc) chat from " << new_session_id.asString() << LL_ENDL; + LL_INFOS() << "Ignoring conference (ad-hoc) chat from " << args["AVATAR_NAME"] << LL_ENDL; if (!gIMMgr->leaveSession(new_session_id)) { LL_WARNS() << "Ad-hoc session " << new_session_id.asString() << " does not exist." << LL_ENDL; } else if (reportIgnoredAdHocSession) { - report_to_nearby_chat(LLTrans::getString("IgnoredAdHocSession")); +// report_to_nearby_chat(LLTrans::getString("IgnoredAdHocSession")); + report_to_nearby_chat(LLTrans::getString("IgnoredAdHocSession", args)); } + // return; } } diff --git a/indra/newview/llinventorymodelbackgroundfetch.cpp b/indra/newview/llinventorymodelbackgroundfetch.cpp index efc0d240aa..71c0a1fe1f 100644 --- a/indra/newview/llinventorymodelbackgroundfetch.cpp +++ b/indra/newview/llinventorymodelbackgroundfetch.cpp @@ -42,6 +42,7 @@ #include "bufferstream.h" #include "llcorehttputil.h" #include "llviewermenu.h" +#include "llviewernetwork.h" // History (may be apocryphal) // @@ -554,7 +555,13 @@ void LLInventoryModelBackgroundFetch::bulkFetch() // OnIdle it will be called anyway due to Add flag for processed item. // It seems like in some cases we are updaiting on fail (no flag), // but is there anything to update? - gInventory.notifyObservers(); + // FIRE-21376: Inventory not loading properly on OpenSim + //gInventory.notifyObservers(); + if (LLGridManager::getInstance()->isInSecondLife()) + { + gInventory.notifyObservers(); + } + // } if ((mFetchCount > max_concurrent_fetches) || @@ -873,6 +880,12 @@ void BGFolderHttpHandler::processData(LLSD & content, LLCore::HttpResponse * res titem->setParent(lost_uuid); titem->updateParentOnServer(FALSE); gInventory.updateItem(titem); + // FIRE-21376: Inventory not loading properly on OpenSim + if (!LLGridManager::getInstance()->isInSecondLife()) + { + gInventory.notifyObservers(); + } + // } } } @@ -945,6 +958,13 @@ void BGFolderHttpHandler::processData(LLSD & content, LLCore::HttpResponse * res { fetcher->setAllFoldersFetched(); } + + // FIRE-21376: Inventory not loading properly on OpenSim + if (!LLGridManager::getInstance()->isInSecondLife()) + { + gInventory.notifyObservers(); + } + // } @@ -987,6 +1007,13 @@ void BGFolderHttpHandler::processFailure(LLCore::HttpStatus status, LLCore::Http fetcher->setAllFoldersFetched(); } } + + // FIRE-21376: Inventory not loading properly on OpenSim + if (!LLGridManager::getInstance()->isInSecondLife()) + { + gInventory.notifyObservers(); + } + // } @@ -1024,6 +1051,13 @@ void BGFolderHttpHandler::processFailure(const char * const reason, LLCore::Http fetcher->setAllFoldersFetched(); } } + + // FIRE-21376: Inventory not loading properly on OpenSim + if (!LLGridManager::getInstance()->isInSecondLife()) + { + gInventory.notifyObservers(); + } + // } diff --git a/indra/newview/lllogininstance.cpp b/indra/newview/lllogininstance.cpp index 0bbe6897e1..bac5707047 100644 --- a/indra/newview/lllogininstance.cpp +++ b/indra/newview/lllogininstance.cpp @@ -63,6 +63,8 @@ #include #include +const S32 LOGIN_MAX_RETRIES = 3; + class LLLoginInstance::Disposable { public: virtual ~Disposable() {} @@ -625,13 +627,16 @@ void LLLoginInstance::constructAuthParams(LLPointer user_credentia request_params["host_id"] = gSavedSettings.getString("HostID"); request_params["extended_errors"] = true; // request message_id and message_args + // Specify desired timeout/retry options + LLSD http_params; + http_params["timeout"] = gSavedSettings.getF32("LoginSRVTimeout"); + http_params["retries"] = LOGIN_MAX_RETRIES; + mRequestData.clear(); mRequestData["method"] = "login_to_simulator"; mRequestData["params"] = request_params; mRequestData["options"] = requested_options; - - mRequestData["cfg_srv_timeout"] = gSavedSettings.getF32("LoginSRVTimeout"); - mRequestData["cfg_srv_pump"] = gSavedSettings.getString("LoginSRVPump"); + mRequestData["http_params"] = http_params; } bool LLLoginInstance::handleLoginEvent(const LLSD& event) diff --git a/indra/newview/llmachineid.cpp b/indra/newview/llmachineid.cpp index b5fd3df0f3..6ca65f4ac0 100644 --- a/indra/newview/llmachineid.cpp +++ b/indra/newview/llmachineid.cpp @@ -37,6 +37,25 @@ using namespace std; unsigned char static_unique_id[] = {0,0,0,0,0,0}; bool static has_static_unique_id = false; +#if LL_WINDOWS +class FSComInitialize +{ + HRESULT mHR; +public: + FSComInitialize() + { + mHR = CoInitializeEx( 0, COINIT_MULTITHREADED ); + if( FAILED( mHR ) ) + LL_DEBUGS( "AppInit" ) << "Failed to initialize COM library. Error code = 0x" << hex << mHR << LL_ENDL; + } + + ~FSComInitialize() + { + if( SUCCEEDED( mHR ) ) + CoUninitialize(); + } +}; +#endif // get an unique machine id. // NOT THREAD SAFE - do before setting up threads. // MAC Address doesn't work for Windows 7 since the first returned hardware MAC address changes with each reboot, Go figure?? @@ -59,12 +78,18 @@ S32 LLMachineID::init() // Step 1: -------------------------------------------------- // Initialize COM. ------------------------------------------ - hres = CoInitializeEx(0, COINIT_MULTITHREADED); - if (FAILED(hres)) - { - LL_DEBUGS("AppInit") << "Failed to initialize COM library. Error code = 0x" << hex << hres << LL_ENDL; - return 1; // Program has failed. - } + // Do not fail in case CoInitialize fails as it can be harmless + + //hres = CoInitializeEx(0, COINIT_MULTITHREADED); + //if (FAILED(hres)) + //{ + // LL_DEBUGS("AppInit") << "Failed to initialize COM library. Error code = 0x" << hex << hres << LL_ENDL; + // return 1; // Program has failed. + //} + + FSComInitialize comInit; + + // // Step 2: -------------------------------------------------- // Set general COM security levels -------------------------- @@ -89,7 +114,7 @@ S32 LLMachineID::init() if (FAILED(hres)) { LL_WARNS("AppInit") << "Failed to initialize security. Error code = 0x" << hex << hres << LL_ENDL; - CoUninitialize(); + // CoUninitialize(); Counitialize will be handled by RAII class return 1; // Program has failed. } @@ -107,7 +132,7 @@ S32 LLMachineID::init() if (FAILED(hres)) { LL_WARNS("AppInit") << "Failed to create IWbemLocator object." << " Err code = 0x" << hex << hres << LL_ENDL; - CoUninitialize(); + // CoUninitialize(); Counitialize will be handled by RAII class return 1; // Program has failed. } @@ -134,7 +159,7 @@ S32 LLMachineID::init() { LL_WARNS("AppInit") << "Could not connect. Error code = 0x" << hex << hres << LL_ENDL; pLoc->Release(); - CoUninitialize(); + // CoUninitialize(); Counitialize will be handled by RAII class return 1; // Program has failed. } @@ -160,7 +185,7 @@ S32 LLMachineID::init() LL_WARNS("AppInit") << "Could not set proxy blanket. Error code = 0x" << hex << hres << LL_ENDL; pSvc->Release(); pLoc->Release(); - CoUninitialize(); + // CoUninitialize(); Counitialize will be handled by RAII class return 1; // Program has failed. } @@ -181,7 +206,7 @@ S32 LLMachineID::init() LL_WARNS("AppInit") << "Query for operating system name failed." << " Error code = 0x" << hex << hres << LL_ENDL; pSvc->Release(); pLoc->Release(); - CoUninitialize(); + // CoUninitialize(); Counitialize will be handled by RAII class return 1; // Program has failed. } @@ -236,7 +261,7 @@ S32 LLMachineID::init() pLoc->Release(); if (pEnumerator) pEnumerator->Release(); - CoUninitialize(); + // CoUninitialize(); Counitialize will be handled by RAII class ret_code=0; #else unsigned char * staticPtr = (unsigned char *)(&static_unique_id[0]); diff --git a/indra/newview/llpanelmaininventory.cpp b/indra/newview/llpanelmaininventory.cpp index 99c608ad9b..360fb19031 100644 --- a/indra/newview/llpanelmaininventory.cpp +++ b/indra/newview/llpanelmaininventory.cpp @@ -1564,28 +1564,6 @@ void LLPanelMainInventory::onCustomAction(const LLSD& userdata) } LLFloaterReg::showInstance("linkreplace", params); } - - // Inventory Links Replace - if (command_name == "replace_links") - { - LLSD params; - LLFolderViewItem* current_item = getActivePanel()->getRootFolder()->getCurSelectedItem(); - if (current_item) - { - LLInvFVBridge* bridge = (LLInvFVBridge*)current_item->getViewModelItem(); - - if (bridge) - { - LLInventoryObject* obj = bridge->getInventoryObject(); - if (obj && obj->getType() != LLAssetType::AT_CATEGORY && obj->getActualType() != LLAssetType::AT_LINK_FOLDER) - { - params = LLSD(obj->getUUID()); - } - } - } - LLFloaterReg::showInstance("fs_linkreplace", params); - } - // } void LLPanelMainInventory::onVisibilityChange( BOOL new_visibility ) diff --git a/indra/newview/llphysicsshapebuilderutil.cpp b/indra/newview/llphysicsshapebuilderutil.cpp index 5bfe5c9941..3aff67b90b 100644 --- a/indra/newview/llphysicsshapebuilderutil.cpp +++ b/indra/newview/llphysicsshapebuilderutil.cpp @@ -201,7 +201,22 @@ void LLPhysicsShapeBuilderUtil::determinePhysicsShape( const LLPhysicsVolumePara } else if ( volume_params.isSculpt() ) // Is a sculpt of any kind (mesh or legacy) { - specOut.mType = volume_params.isMeshSculpt() ? PhysicsShapeSpecification::USER_MESH : PhysicsShapeSpecification::SCULPT; + // [BUG-134006] Viewer code is not aligned to server code when calculating physics shape for thin objects. + specOut.mType = PhysicsShapeSpecification::INVALID; + if (volume_params.isMeshSculpt()){ + static const float SHAPE_BUILDER_CONVEXIFICATION_SIZE_MESH = 0.5; + // it's a mesh and only one size is smaller than min. + for (S32 i = 0; i < 3; ++i) + { + if (scale[i] < SHAPE_BUILDER_CONVEXIFICATION_SIZE_MESH) + { + specOut.mType = PhysicsShapeSpecification::PRIM_CONVEX; + } + } + } + if (specOut.mType == PhysicsShapeSpecification::INVALID) + // + specOut.mType = volume_params.isMeshSculpt() ? PhysicsShapeSpecification::USER_MESH : PhysicsShapeSpecification::SCULPT; } else // Resort to mesh { diff --git a/indra/newview/llviewerassetstorage.cpp b/indra/newview/llviewerassetstorage.cpp index 1db21e4975..8abd1f9b82 100644 --- a/indra/newview/llviewerassetstorage.cpp +++ b/indra/newview/llviewerassetstorage.cpp @@ -515,7 +515,7 @@ void LLViewerAssetStorage::assetRequestCoro( } // [UDP Assets] - bool with_http = false; + bool with_http = true; bool is_temp = false; LLViewerAssetStatsFF::record_enqueue(atype, with_http, is_temp); // [UDP Assets] diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index c70352e760..f5d077c039 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -10402,6 +10402,13 @@ class LLViewCheckHUDAttachments : public view_listener_t } }; +// Disable Show HUD attachments if prevented by RLVa +bool enable_show_HUD_attachments() +{ + return (!LLPipeline::sShowHUDAttachments || !rlv_handler_t::isEnabled() || !gRlvAttachmentLocks.hasLockedHUD()); +}; +// + class LLEditEnableTakeOff : public view_listener_t { bool handleEvent(const LLSD& userdata) @@ -11105,6 +11112,7 @@ void initialize_menus() view_listener_t::addMenu(new LLViewStatusAway(), "View.Status.CheckAway"); view_listener_t::addMenu(new LLViewStatusDoNotDisturb(), "View.Status.CheckDoNotDisturb"); view_listener_t::addMenu(new LLViewCheckHUDAttachments(), "View.CheckHUDAttachments"); + enable.add("View.EnableHUDAttachments", boost::bind(&enable_show_HUD_attachments)); // Disable Show HUD attachments if prevented by RLVa // Add reset camera angles menu view_listener_t::addMenu(new LLViewResetCameraAngles(), "View.ResetCameraAngles"); // diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp index cba26f5889..cf05bb6dfd 100644 --- a/indra/newview/llvovolume.cpp +++ b/indra/newview/llvovolume.cpp @@ -373,7 +373,33 @@ U32 LLVOVolume::processUpdateMessage(LLMessageSystem *mesgsys, // Unpack volume data LLVolumeParams volume_params; - LLVolumeMessage::unpackVolumeParams(&volume_params, mesgsys, _PREHASH_ObjectData, block_num); + // Extend the bogus volume error handling to the other code path + //LLVolumeMessage::unpackVolumeParams(&volume_params, mesgsys, _PREHASH_ObjectData, block_num); + BOOL res = LLVolumeMessage::unpackVolumeParams(&volume_params, mesgsys, _PREHASH_ObjectData, block_num); + if (!res) + { + // Improved bad object handling courtesy of Drake. + std::string region_name = "unknown region"; + if (getRegion()) + { + region_name = getRegion()->getName(); + if (gSavedSettings.getBOOL("FSEnforceStrictObjectCheck")) + { + LL_WARNS() << "An invalid object (" << getID() << ") has been removed (FSEnforceStrictObjectCheck)" << LL_ENDL; + getRegion()->addCacheMissFull(getLocalID()); // force cache skip the object + } + } + LL_WARNS() << "Bogus volume parameters in object " << getID() << " @ " << getPositionRegion() + << " in " << region_name << LL_ENDL; + + if (gSavedSettings.getBOOL("FSEnforceStrictObjectCheck")) + { + gObjectList.killObject(this); + return (INVALID_UPDATE); + } + // + } + volume_params.setSculptID(sculpt_id, sculpt_type); if (setVolume(volume_params, 0)) @@ -389,6 +415,31 @@ U32 LLVOVolume::processUpdateMessage(LLMessageSystem *mesgsys, // S32 result = unpackTEMessage(mesgsys, _PREHASH_ObjectData, (S32) block_num); + // Improved bad object handling courtesy of Drake. + if (TEM_INVALID == result) + { + // There's something bogus in the data that we're unpacking. + dp->dumpBufferToLog(); + std::string region_name = "unknown region"; + if (getRegion()) + { + region_name = getRegion()->getName(); + if (gSavedSettings.getBOOL("FSEnforceStrictObjectCheck")) + { + LL_WARNS() << "An invalid object (" << getID() << ") has been removed (FSEnforceStrictObjectCheck)" << LL_ENDL; + getRegion()->addCacheMissFull(getLocalID()); // force cache skip + } + } + + LL_WARNS() << "Bogus TE data in object " << getID() << " @ " << getPositionRegion() + << " in " << region_name << LL_ENDL; + if (gSavedSettings.getBOOL("FSEnforceStrictObjectCheck")) + { + gObjectList.killObject(this); + return (INVALID_UPDATE); + } + } + // if (result & teDirtyBits) { updateTEData(); @@ -406,13 +457,33 @@ U32 LLVOVolume::processUpdateMessage(LLMessageSystem *mesgsys, BOOL res = LLVolumeMessage::unpackVolumeParams(&volume_params, *dp); if (!res) { - LL_WARNS() << "Bogus volume parameters in object " << getID() << LL_ENDL; - LL_WARNS() << getRegion()->getOriginGlobal() << LL_ENDL; + // Improved bad object handling courtesy of Drake. + //LL_WARNS() << "Bogus volume parameters in object " << getID() << LL_ENDL; + //LL_WARNS() << getRegion()->getOriginGlobal() << LL_ENDL; + std::string region_name = "unknown region"; + if (getRegion()) + { + region_name = getRegion()->getName(); + if (gSavedSettings.getBOOL("FSEnforceStrictObjectCheck")) + { + LL_WARNS() << "An invalid object (" << getID() << ") has been removed (FSEnforceStrictObjectCheck)" << LL_ENDL; + getRegion()->addCacheMissFull(getLocalID()); // force cache skip the object + } + } + LL_WARNS() << "Bogus volume parameters in object " << getID() << " @ " << getPositionRegion() + << " in " << region_name << LL_ENDL; // [FIRE-16995] [CRASH] Continuous crashing upon entering 3 adjacent sims incl. Hathian, D8, Devil's Pocket // A bad object entry in a .slc simobject cache can result in an unreadable/unusable volume // This leaves the volume in an uncertain state and can result in a crash when later code access an uninitialised pointer // return an INVALID_UPDATE instead - return(INVALID_UPDATE); + // July 2017 Change backed out due to side effects. FIRE-16995 still an exposure. + // return(INVALID_UPDATE); + // NOTE: An option here would be to correctly return the media status using "retval |= INVALID_UPDATE" + if (gSavedSettings.getBOOL("FSEnforceStrictObjectCheck")) + { + gObjectList.killObject(this); + return (INVALID_UPDATE); + } // } @@ -427,14 +498,34 @@ U32 LLVOVolume::processUpdateMessage(LLMessageSystem *mesgsys, { // There's something bogus in the data that we're unpacking. dp->dumpBufferToLog(); - LL_WARNS() << "Flushing cache files" << LL_ENDL; + // Improved bad object handling courtesy of Drake. + //LL_WARNS() << "Flushing cache files" << LL_ENDL; - if(LLVOCache::instanceExists() && getRegion()) + //if(LLVOCache::instanceExists() && getRegion()) + //{ + // LLVOCache::getInstance()->removeEntry(getRegion()->getHandle()) ; + //} + // + //LL_WARNS() << "Bogus TE data in " << getID() << LL_ENDL; + std::string region_name = "unknown region"; + if (getRegion()) { - LLVOCache::getInstance()->removeEntry(getRegion()->getHandle()) ; + region_name = getRegion()->getName(); + if (gSavedSettings.getBOOL("FSEnforceStrictObjectCheck")) + { + LL_WARNS() << "An invalid object (" << getID() << ") has been removed (FSEnforceStrictObjectCheck)" << LL_ENDL; + getRegion()->addCacheMissFull(getLocalID()); // force cache skip + } } - - LL_WARNS() << "Bogus TE data in " << getID() << LL_ENDL; + + LL_WARNS() << "Bogus TE data in object " << getID() << " @ " << getPositionRegion() + << " in " << region_name << LL_ENDL; + if (gSavedSettings.getBOOL("FSEnforceStrictObjectCheck")) + { + gObjectList.killObject(this); + return (INVALID_UPDATE); + } + // } else { diff --git a/indra/newview/llworldmap.cpp b/indra/newview/llworldmap.cpp index 12624af6a2..8ead825e56 100644 --- a/indra/newview/llworldmap.cpp +++ b/indra/newview/llworldmap.cpp @@ -363,7 +363,8 @@ LLSimInfo* LLWorldMap::simInfoFromHandle(const U64 handle) //{ // return it->second; std::map::const_iterator it; - for (it = LLWorldMap::getInstance()->mSimInfoMap.begin(); it != LLWorldMap::getInstance()->mSimInfoMap.end(); ++it) + std::map::const_iterator end = LLWorldMap::instance().mSimInfoMap.end(); + for (it = LLWorldMap::instance().mSimInfoMap.begin(); it != end; ++it) { const U64 hndl = (*it).first; LLSimInfo* info = (*it).second; diff --git a/indra/newview/llworldmapview.cpp b/indra/newview/llworldmapview.cpp index e84d86c3fd..3b2a1222f2 100644 --- a/indra/newview/llworldmapview.cpp +++ b/indra/newview/llworldmapview.cpp @@ -376,8 +376,13 @@ void LLWorldMapView::draw() gGL.setColorMask(true, true); // Draw per sim overlayed information (names, mature, offline...) - for (LLWorldMap::sim_info_map_t::const_iterator it = LLWorldMap::getInstance()->getRegionMap().begin(); - it != LLWorldMap::getInstance()->getRegionMap().end(); ++it) + // Performance tweak + //for (LLWorldMap::sim_info_map_t::const_iterator it = LLWorldMap::getInstance()->getRegionMap().begin(); + // it != LLWorldMap::getInstance()->getRegionMap().end(); ++it) + LLWorldMap::sim_info_map_t::const_iterator end_it = LLWorldMap::instance().getRegionMap().end(); + for (LLWorldMap::sim_info_map_t::const_iterator it = LLWorldMap::instance().getRegionMap().begin(); + it != end_it; ++it) + // { U64 handle = it->first; LLSimInfo* info = it->second; @@ -767,6 +772,7 @@ bool LLWorldMapView::drawMipmapLevel(S32 width, S32 height, S32 level, bool load pos_NE[VY] += tile_width; // Iterate through the tiles on screen: we just need to ask for one tile every tile_width meters + LLWorldMap* world_map = LLWorldMap::getInstance(); // Performance tweak U32 grid_x, grid_y; for (F64 index_y = pos_SW[VY]; index_y < pos_NE[VY]; index_y += tile_width) { @@ -777,7 +783,10 @@ bool LLWorldMapView::drawMipmapLevel(S32 width, S32 height, S32 level, bool load // Convert to the mipmap level coordinates for that point (i.e. which tile to we hit) LLWorldMipmap::globalToMipmap(pos_global[VX], pos_global[VY], level, &grid_x, &grid_y); // Get the tile. Note: NULL means that the image does not exist (so it's considered "complete" as far as fetching is concerned) - LLPointer simimage = LLWorldMap::getInstance()->getObjectsTile(grid_x, grid_y, level, load); + // Performance tweak + //LLPointer simimage = LLWorldMap::getInstance()->getObjectsTile(grid_x, grid_y, level, load); + LLPointer simimage = world_map->getObjectsTile(grid_x, grid_y, level, load); + // if (simimage) { // Checks that the image has a valid texture @@ -943,10 +952,16 @@ void LLWorldMapView::drawItems() bool show_mature = mature_enabled && showMatureEvents; bool show_adult = adult_enabled && showAdultEvents; + // Performance tweak + LLWorldMap* world_map = LLWorldMap::getInstance(); + for (handle_list_t::iterator iter = mVisibleRegions.begin(); iter != mVisibleRegions.end(); ++iter) { U64 handle = *iter; - LLSimInfo* info = LLWorldMap::getInstance()->simInfoFromHandle(handle); + // Performance tweak + //LLSimInfo* info = LLWorldMap::getInstance()->simInfoFromHandle(handle); + LLSimInfo* info = world_map->simInfoFromHandle(handle); + // if ((info == NULL) || (info->isDown())) { continue; @@ -995,10 +1010,16 @@ void LLWorldMapView::drawAgents() { static LLUIColor map_avatar_color = LLUIColorTable::instance().getColor("MapAvatarColor", LLColor4::white); + // Performance tweak + LLWorldMap* world_map = LLWorldMap::getInstance(); + for (handle_list_t::iterator iter = mVisibleRegions.begin(); iter != mVisibleRegions.end(); ++iter) { U64 handle = *iter; - LLSimInfo* siminfo = LLWorldMap::getInstance()->simInfoFromHandle(handle); + // Performance tweak + //LLSimInfo* siminfo = LLWorldMap::getInstance()->simInfoFromHandle(handle); + LLSimInfo* siminfo = world_map->simInfoFromHandle(handle); + // if ((siminfo == NULL) || (siminfo->isDown())) { continue; diff --git a/indra/newview/llxmlrpclistener.cpp b/indra/newview/llxmlrpclistener.cpp index e62bb78f8c..7bc8af4a0b 100644 --- a/indra/newview/llxmlrpclistener.cpp +++ b/indra/newview/llxmlrpclistener.cpp @@ -312,7 +312,7 @@ public: } XMLRPC_RequestSetData(request, xparams); - mTransaction.reset(new LLXMLRPCTransaction(mUri, request)); + mTransaction.reset(new LLXMLRPCTransaction(mUri, request, true, command.has("http_params")? LLSD(command["http_params"]) : LLSD())); mPreviousStatus = mTransaction->status(NULL); // Free the XMLRPC_REQUEST object and the attached data values. diff --git a/indra/newview/llxmlrpctransaction.cpp b/indra/newview/llxmlrpctransaction.cpp index dcde89d02f..143c97fca4 100644 --- a/indra/newview/llxmlrpctransaction.cpp +++ b/indra/newview/llxmlrpctransaction.cpp @@ -208,7 +208,7 @@ public: std::string mCertStore; LLSD mErrorCertData; - Impl(const std::string& uri, XMLRPC_REQUEST request, bool useGzip); + Impl(const std::string& uri, XMLRPC_REQUEST request, bool useGzip, const LLSD& httpParams); Impl(const std::string& uri, const std::string& method, LLXMLRPCValue params, bool useGzip); ~Impl(); @@ -219,7 +219,7 @@ public: void setHttpStatus(const LLCore::HttpStatus &status); private: - void init(XMLRPC_REQUEST request, bool useGzip); + void init(XMLRPC_REQUEST request, bool useGzip, const LLSD& httpParams); }; LLXMLRPCTransaction::Handler::Handler(LLCore::HttpRequest::ptr_t &request, @@ -309,13 +309,13 @@ void LLXMLRPCTransaction::Handler::onCompleted(LLCore::HttpHandle handle, //========================================================================= LLXMLRPCTransaction::Impl::Impl(const std::string& uri, - XMLRPC_REQUEST request, bool useGzip) + XMLRPC_REQUEST request, bool useGzip, const LLSD& httpParams) : mHttpRequest(), mStatus(LLXMLRPCTransaction::StatusNotStarted), mURI(uri), mResponse(0) { - init(request, useGzip); + init(request, useGzip, httpParams); } @@ -331,7 +331,7 @@ LLXMLRPCTransaction::Impl::Impl(const std::string& uri, XMLRPC_RequestSetRequestType(request, xmlrpc_request_call); XMLRPC_RequestSetData(request, params.getValue()); - init(request, useGzip); + init(request, useGzip, LLSD()); // DEV-28398: without this XMLRPC_RequestFree() call, it looks as though // the 'request' object is simply leaked. It's less clear to me whether we // should also ask to free request value data (second param 1), since the @@ -339,7 +339,7 @@ LLXMLRPCTransaction::Impl::Impl(const std::string& uri, XMLRPC_RequestFree(request, 1); } -void LLXMLRPCTransaction::Impl::init(XMLRPC_REQUEST request, bool useGzip) +void LLXMLRPCTransaction::Impl::init(XMLRPC_REQUEST request, bool useGzip, const LLSD& httpParams) { LLCore::HttpOptions::ptr_t httpOpts; LLCore::HttpHeaders::ptr_t httpHeaders; @@ -353,7 +353,15 @@ void LLXMLRPCTransaction::Impl::init(XMLRPC_REQUEST request, bool useGzip) // LLRefCounted starts with a 1 ref, so don't add a ref in the smart pointer httpOpts = LLCore::HttpOptions::ptr_t(new LLCore::HttpOptions()); - httpOpts->setTimeout(40L); + // delay between repeats will start from 5 sec and grow to 20 sec with each repeat + httpOpts->setMinBackoff(5E6L); + httpOpts->setMaxBackoff(20E6L); + + httpOpts->setTimeout(httpParams.has("timeout") ? httpParams["timeout"].asInteger() : 40L); + if (httpParams.has("retries")) + { + httpOpts->setRetries(httpParams["retries"].asInteger()); + } bool vefifySSLCert = !gSavedSettings.getBOOL("NoVerifySSLCert"); mCertStore = gSavedSettings.getString("CertStore"); @@ -520,8 +528,8 @@ void LLXMLRPCTransaction::Impl::setHttpStatus(const LLCore::HttpStatus &status) LLXMLRPCTransaction::LLXMLRPCTransaction( - const std::string& uri, XMLRPC_REQUEST request, bool useGzip) -: impl(* new Impl(uri, request, useGzip)) + const std::string& uri, XMLRPC_REQUEST request, bool useGzip, const LLSD& httpParams) +: impl(* new Impl(uri, request, useGzip, httpParams)) { } diff --git a/indra/newview/llxmlrpctransaction.h b/indra/newview/llxmlrpctransaction.h index 017b72ab5e..8065a2aff3 100644 --- a/indra/newview/llxmlrpctransaction.h +++ b/indra/newview/llxmlrpctransaction.h @@ -85,7 +85,7 @@ class LLXMLRPCTransaction { public: LLXMLRPCTransaction(const std::string& uri, - XMLRPC_REQUEST request, bool useGzip = true); + XMLRPC_REQUEST request, bool useGzip = true, const LLSD& httpParams = LLSD()); // does not take ownership of the request object // request can be freed as soon as the transaction is constructed diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index 86968669a5..fd15588a30 100644 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -816,8 +816,10 @@ void LLPipeline::throttleNewMemoryAllocation(BOOL disable) if(sMemAllocationThrottled) { //send out notification - LLNotification::Params params("LowMemory"); - LLNotifications::instance().add(params); + // Disable annoying notification + //LLNotification::Params params("LowMemory"); + //LLNotifications::instance().add(params); + // //release some memory. } diff --git a/indra/newview/skins/default/xui/de/strings.xml b/indra/newview/skins/default/xui/de/strings.xml index bff8b6dfca..1ed785bfeb 100644 --- a/indra/newview/skins/default/xui/de/strings.xml +++ b/indra/newview/skins/default/xui/de/strings.xml @@ -6586,7 +6586,7 @@ Setzen Sie den Editorpfad in Anführungszeichen Ignoriere Gruppenchat von [NAME]. - Eine Einladung zu einer Konferenz wurde aufgrund der aktuellen Einstellungen automatisch ignoriert. + Eine Einladung zu einer Konferenz durch [AVATAR_NAME] wurde aufgrund der aktuellen Einstellungen automatisch ignoriert. diff --git a/indra/newview/skins/default/xui/en/floater_animation_bvh_preview.xml b/indra/newview/skins/default/xui/en/floater_animation_bvh_preview.xml index ece291f491..23b3d0359f 100644 --- a/indra/newview/skins/default/xui/en/floater_animation_bvh_preview.xml +++ b/indra/newview/skins/default/xui/en/floater_animation_bvh_preview.xml @@ -261,6 +261,7 @@ Maximum animation length is [MAX_LENGTH] seconds. follows="left|top" height="23" increment="1" + decimal_digits="0" label="In (frm)" label_width="70" layout="topleft" @@ -275,6 +276,7 @@ Maximum animation length is [MAX_LENGTH] seconds. follows="left|top" height="23" increment="1" + decimal_digits="0" label="Out (frm)" layout="topleft" left_pad="10" diff --git a/indra/newview/skins/default/xui/en/floater_fs_area_search.xml b/indra/newview/skins/default/xui/en/floater_fs_area_search.xml index d0a8e57c2f..ed22f4d3ec 100644 --- a/indra/newview/skins/default/xui/en/floater_fs_area_search.xml +++ b/indra/newview/skins/default/xui/en/floater_fs_area_search.xml @@ -9,6 +9,7 @@ height="435" save_rect="true" single_instance="true" + reuse_instance="false" can_resize="true" can_minimize="true" can_close="true" diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml index 45a8ae9dbf..569a4be68d 100644 --- a/indra/newview/skins/default/xui/en/menu_viewer.xml +++ b/indra/newview/skins/default/xui/en/menu_viewer.xml @@ -347,6 +347,8 @@ function="View.CheckHUDAttachments" /> + diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml index 3d8b6d4225..81b3cc5c37 100644 --- a/indra/newview/skins/default/xui/en/strings.xml +++ b/indra/newview/skins/default/xui/en/strings.xml @@ -2948,7 +2948,7 @@ Try enclosing path to the editor with double quotes. None Muting group chat from [NAME]. - You've been invited to a conference (ad-hoc) chat, but viewer automatically ignored it because of your settings. + You've been invited to a conference (ad-hoc) chat by [AVATAR_NAME], but viewer automatically ignored it because of your settings. The camera cannot focus user [AVATARNAME] because they are outside your draw distance. diff --git a/indra/newview/skins/default/xui/pl/strings.xml b/indra/newview/skins/default/xui/pl/strings.xml index 295e2fd541..a09d053ce2 100644 --- a/indra/newview/skins/default/xui/pl/strings.xml +++ b/indra/newview/skins/default/xui/pl/strings.xml @@ -5950,7 +5950,7 @@ Spróbuj załączyć ścieżkę do edytora w cytowaniu. Wyciszanie czatu grupowego [NAME]. - Zostałeś/aś zaproszony/a do konferencji (czatu ad-hoc), ale przeglądarka automatycznie ją zignorowała ze względu na Twoje ustawienia. + Zostałeś/aś zaproszony/a do konferencji (czatu ad-hoc) przez [AVATAR_NAME], ale przeglądarka automatycznie ją zignorowała ze względu na Twoje ustawienia. Kamera nie może skupić się na [AVATARNAME], ponieważ jest on/ona poza polem widzenia. diff --git a/indra/newview/skins/vintage/xui/de/floater_about_land.xml b/indra/newview/skins/vintage/xui/de/floater_about_land.xml index 2862452269..4c52bb5485 100644 --- a/indra/newview/skins/vintage/xui/de/floater_about_land.xml +++ b/indra/newview/skins/vintage/xui/de/floater_about_land.xml @@ -481,7 +481,7 @@ Nur große Parzellen können in der Suche aufgeführt werden. - Immer verbannt ([COUNT]/[MAX]) + Immer zulässig ([COUNT]/[MAX])