diff --git a/.gitignore b/.gitignore index 92cbb73c55..0c3c3a6f92 100755 --- a/.gitignore +++ b/.gitignore @@ -21,10 +21,8 @@ indra/.distcc build-vc80/ build-vc100/ build-vc120/ -build-vc120-32/ -build-vc120-64/ -build-vc150-32/ -build-vc150-64/ +build-vc[0-9]*-32/ +build-vc[0-9]*-64/ indra/CMakeFiles indra/build-vc[0-9]* indra/lib/mono/1.0/*.dll diff --git a/autobuild.xml b/autobuild.xml index c27514475e..445e99c999 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -48,9 +48,9 @@ archive hash - 47ddd059d48f650e39796c10ea828689 + 7d375112b162e32e37262da4a6c0a702 url - http://3p.firestormviewer.org/ndPhysicsStub-1.0-darwin-201606211534-r77.tar.bz2 + http://3p.firestormviewer.org/ndPhysicsStub-1.0-darwin-202330107.tar.bz2 name darwin @@ -60,9 +60,9 @@ archive hash - 99fe10fdec03a22d680de72bc8b5f85a + c266a8d6124fc11e41a82c288f2bf8e4 url - http://3p.firestormviewer.org/ndPhysicsStub-1.181041840-linux64-181041840.tar.bz2 + http://3p.firestormviewer.org/ndPhysicsStub-1.202321033-linux64-202321033.tar.bz2 name linux64 @@ -292,9 +292,9 @@ archive hash - d670d00aa732b97d105d287b62582762 + 9b8bcc3be6dbe40a04c9c81c313f70dc url - http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/55065/512118/apr_suite-1.4.5.539073-darwin64-539073.tar.bz2 + http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/68333/658209/apr_suite-1.4.5.548882-darwin64-548882.tar.bz2 name darwin64 @@ -328,9 +328,9 @@ archive hash - 83b4a047db5f7ee462753d91e6277cba + 6bdf460c18ee004b41a46afc80041a92 url - http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/55143/512317/apr_suite-1.4.5.539073-windows-539073.tar.bz2 + http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/68334/658225/apr_suite-1.4.5.548882-windows-548882.tar.bz2 name windows @@ -340,16 +340,16 @@ archive hash - b3bbf168b39e25c08cc1febddeb33332 + 83104bfa4dabb77cd70d185e38a95b49 url - http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/55139/512304/apr_suite-1.4.5.539073-windows64-539073.tar.bz2 + http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/68332/658215/apr_suite-1.4.5.548882-windows64-548882.tar.bz2 name windows64 version - 1.4.5.539073 + 1.4.5.548882 boost @@ -964,11 +964,11 @@ archive hash - 6963689ea12131c0ff80b07a08cbe667 + 2c7c5fb28c34d4833b14d49d4abb101a hash_algorithm md5 url - file:///opt/firestorm/fmodstudio-2.01.03-darwin-202272255.tar.bz2 + file:///opt/firestorm/fmodstudio-2.01.04-darwin-202612342.tar.bz2 name darwin @@ -992,11 +992,11 @@ archive hash - fab47cbf13e89dd0359b5f5e995f6794 + fd75a1941350a5a0b510b18192f28ef3 hash_algorithm md5 url - file:///c:/cygwin/opt/firestorm/fmodstudio-2.01.03-windows-202191858.tar.bz2 + file:///c:/cygwin/opt/firestorm/fmodstudio-2.01.04-windows-202592205.tar.bz2 name windows @@ -1006,18 +1006,18 @@ archive hash - a757fe92a8a48b247e23802c22153d1c + 534c065e8d284b794d1aabeda20f3600 hash_algorithm md5 url - file:///c:/cygwin/opt/firestorm/fmodstudio-2.01.03-windows64-202191859.tar.bz2 + file:///c:/cygwin/opt/firestorm/fmodstudio-2.01.04-windows64-202592207.tar.bz2 name windows64 version - 2.01.02 + 2.01.04 fontconfig @@ -1947,7 +1947,7 @@ version - 7.A.6 + 8.0.6 libhunspell @@ -2375,16 +2375,16 @@ archive hash - 8501cbaa7e0f254614694da784a9c61c + b677ee43822212f0a27c838dc8bf3623 url - http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/64944/606925/llca-202008010216.546021-common-546021.tar.bz2 + http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/67622/646614/llca-202009010215.548269-common-548269.tar.bz2 name common version - 202008010216.546021 + 202009010215.548269 llphysicsextensions_source @@ -4520,9 +4520,9 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors -G ${AUTOBUILD_WIN_CMAKE_GEN|NOTWIN} - -DUNATTENDED:BOOL=ON -DINSTALL_PROPRIETARY=FALSE -DUSE_KDU=FALSE + -DOPENAL:BOOL=ON name @@ -4593,6 +4593,7 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors -DUNATTENDED:BOOL=ON -DINSTALL_PROPRIETARY=FALSE -DUSE_KDU=FALSE + -DOPENAL:BOOL=ON name diff --git a/doc/contributions.txt b/doc/contributions.txt index 532227dffb..0b651f9d40 100755 --- a/doc/contributions.txt +++ b/doc/contributions.txt @@ -261,6 +261,8 @@ Beansy Twine Benja Kepler VWR-746 Benjamin Bigdipper +Beq Janus + BUG-227094 Beth Walcher Beq Janus SL-10288 @@ -1313,6 +1315,7 @@ Shyotl Kuhr MAINT-2334 MAINT-6913 STORM-2143 + SL-11625 Siana Gearz STORM-960 STORM-1088 @@ -1352,6 +1355,7 @@ Sovereign Engineer MAINT-7343 SL-11079 OPEN-343 + SL-11625 SpacedOut Frye VWR-34 VWR-45 diff --git a/indra/cmake/Copy3rdPartyLibs.cmake b/indra/cmake/Copy3rdPartyLibs.cmake index 21c4ca9912..33684e7b07 100644 --- a/indra/cmake/Copy3rdPartyLibs.cmake +++ b/indra/cmake/Copy3rdPartyLibs.cmake @@ -84,7 +84,7 @@ if(WINDOWS) endif (FMODSTUDIO) if (OPENAL) - set(release_files ${release_files} OpenAL32.dll alut.dll) + list(APPEND release_files openal32.dll alut.dll) endif (OPENAL) #******************************* diff --git a/indra/llcorehttp/_httpoprequest.cpp b/indra/llcorehttp/_httpoprequest.cpp index 4c0948a90e..ae2d067bc2 100644 --- a/indra/llcorehttp/_httpoprequest.cpp +++ b/indra/llcorehttp/_httpoprequest.cpp @@ -1024,11 +1024,20 @@ CURLcode HttpOpRequest::curlSslCtxCallback(CURL *curl, void *sslctx, void *userd { HttpOpRequest::ptr_t op(HttpOpRequest::fromHandle(userdata)); - if (op->mCallbackSSLVerify) - { - SSL_CTX * ctx = (SSL_CTX *)sslctx; - // disable any default verification for server certs - SSL_CTX_set_verify(ctx, SSL_VERIFY_NONE, NULL); + if (op->mCallbackSSLVerify) + { + SSL_CTX * ctx = (SSL_CTX *)sslctx; + if (op->mReqOptions && op->mReqOptions->getSSLVerifyPeer()) + { + // verification for ssl certs + SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER, NULL); + } + else + { + // disable any default verification for server certs + // Ex: setting urls (assume non-SL) for parcel media in LLFloaterURLEntry + SSL_CTX_set_verify(ctx, SSL_VERIFY_NONE, NULL); + } // set the verification callback. SSL_CTX_set_cert_verify_callback(ctx, sslCertVerifyCallback, userdata); // the calls are void diff --git a/indra/llmath/llvector4a.h b/indra/llmath/llvector4a.h index 222f3cf235..27abf39537 100644 --- a/indra/llmath/llvector4a.h +++ b/indra/llmath/llvector4a.h @@ -46,10 +46,10 @@ class LLRotation; // of this writing, July 08, 2010) about getting it implemented before you resort to // LLVector3/LLVector4. ///////////////////////////////// -class LLVector4a; +struct LLVector4a; LL_ALIGN_PREFIX(16) -class LLVector4a +struct LLVector4a { public: @@ -92,6 +92,7 @@ public: // CONSTRUCTORS //////////////////////////////////// + //LLVector4a is plain data which should never have a default constructor or destructor(malloc&free won't trigger it) LLVector4a() { //DO NOT INITIALIZE -- The overhead is completely unnecessary ll_assert_aligned(this,16); diff --git a/indra/llmessage/llcoproceduremanager.cpp b/indra/llmessage/llcoproceduremanager.cpp index 652ac321dc..b4169f7dab 100644 --- a/indra/llmessage/llcoproceduremanager.cpp +++ b/indra/llmessage/llcoproceduremanager.cpp @@ -77,12 +77,12 @@ public: /// inline size_t countActive() const { - return mActiveCoprocs.size(); + return mActiveCoprocsCount; } /// Returns the total number of coprocedures either queued or in active processing. /// - inline size_t count() const + inline S32 count() const { return countPending() + countActive(); } @@ -113,12 +113,10 @@ private: // because the consuming coroutine might outlive this LLCoprocedurePool // instance. typedef boost::shared_ptr CoprocQueuePtr; - typedef std::map ActiveCoproc_t; std::string mPoolName; - size_t mPoolSize, mPending{0}; + size_t mPoolSize, mActiveCoprocsCount, mPending; CoprocQueuePtr mPendingCoprocs; - ActiveCoproc_t mActiveCoprocs; LLTempBoundListener mStatusListener; typedef std::map CoroAdapterMap_t; @@ -191,8 +189,13 @@ LLUUID LLCoprocedureManager::enqueueCoprocedure(const std::string &pool, const s void LLCoprocedureManager::setPropertyMethods(SettingQuery_t queryfn, SettingUpdate_t updatefn) { + // functions to discover and store the pool sizes mPropertyQueryFn = queryfn; mPropertyDefineFn = updatefn; + + // workaround until we get mutex into initializePool + initializePool("VAssetStorage"); + initializePool("Upload"); } //------------------------------------------------------------------------- @@ -272,21 +275,12 @@ void LLCoprocedureManager::close(const std::string &pool) } } -// Explicitly create the VAAssetStorage pool -void LLCoprocedureManager::createPool(const std::string& poolName) -{ - poolMap_t::iterator it = mPoolMap.find(poolName); - if (it == mPoolMap.end()) - { - initializePool(poolName); - } -} -// Explicitly create the VAAssetStorage pool - //========================================================================= LLCoprocedurePool::LLCoprocedurePool(const std::string &poolName, size_t size): mPoolName(poolName), mPoolSize(size), + mActiveCoprocsCount(0), + mPending(0), mPendingCoprocs(boost::make_shared(DEFAULT_QUEUE_SIZE)), mHTTPPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID), mCoroMapping() @@ -412,8 +406,7 @@ void LLCoprocedurePool::coprocedureInvokerCoro( } // we actually popped an item --mPending; - - ActiveCoproc_t::iterator itActive = mActiveCoprocs.insert(ActiveCoproc_t::value_type(coproc->mId, httpAdapter)).first; + mActiveCoprocsCount++; LL_DEBUGS("CoProcMgr") << "Dequeued and invoking coprocedure(" << coproc->mName << ") with id=" << coproc->mId.asString() << " in pool \"" << mPoolName << "\" (" << mPending << " left)" << LL_ENDL; @@ -421,20 +414,26 @@ void LLCoprocedurePool::coprocedureInvokerCoro( { coproc->mProc(httpAdapter, coproc->mId); } + catch (const LLCoros::Stop &e) + { + LL_INFOS("LLCoros") << "coprocedureInvokerCoro terminating because " + << e.what() << LL_ENDL; + throw; // let toplevel handle this as LLContinueError + } catch (...) { LOG_UNHANDLED_EXCEPTION(STRINGIZE("Coprocedure('" << coproc->mName << "', id=" << coproc->mId.asString() << ") in pool '" << mPoolName << "'")); // must NOT omit this or we deplete the pool - mActiveCoprocs.erase(itActive); + mActiveCoprocsCount--; continue; } // Nicky: This is super spammy. Consider using LL_DEBUGS here? LL_DEBUGS("CoProcMgr") << "Finished coprocedure(" << coproc->mName << ")" << " in pool \"" << mPoolName << "\"" << LL_ENDL; - mActiveCoprocs.erase(itActive); + mActiveCoprocsCount--; } } diff --git a/indra/llmessage/llcoproceduremanager.h b/indra/llmessage/llcoproceduremanager.h index 9a9cbef6d5..70204ba02b 100644 --- a/indra/llmessage/llcoproceduremanager.h +++ b/indra/llmessage/llcoproceduremanager.h @@ -79,8 +79,6 @@ public: void close(); void close(const std::string &pool); - - void createPool(const std::string& poolName); // Explicitly create the VAAssetStorage pool private: diff --git a/indra/llmessage/llexperiencecache.cpp b/indra/llmessage/llexperiencecache.cpp index aab5886e07..05da0c57f2 100644 --- a/indra/llmessage/llexperiencecache.cpp +++ b/indra/llmessage/llexperiencecache.cpp @@ -86,15 +86,15 @@ const F64 LLExperienceCache::DEFAULT_EXPIRATION = 600.0; const S32 LLExperienceCache::DEFAULT_QUOTA = 128; // this is megabytes const int LLExperienceCache::SEARCH_PAGE_SIZE = 30; +bool LLExperienceCache::sShutdown = false; + //========================================================================= -LLExperienceCache::LLExperienceCache(): - mShutdown(false) +LLExperienceCache::LLExperienceCache() { } LLExperienceCache::~LLExperienceCache() { - } void LLExperienceCache::initSingleton() @@ -128,7 +128,7 @@ void LLExperienceCache::cleanup() { cache_stream << (*this); } - mShutdown = true; + sShutdown = true; } //------------------------------------------------------------------------- @@ -350,7 +350,7 @@ void LLExperienceCache::requestExperiences() ostr << urlBase << "?page_size=" << PAGE_SIZE1; RequestQueue_t requests; - while (!mRequestQueue.empty()) + while (!mRequestQueue.empty() && !sShutdown) { RequestQueue_t::iterator it = mRequestQueue.begin(); LLUUID key = (*it); @@ -404,8 +404,6 @@ void LLExperienceCache::idleCoro() LL_INFOS("ExperienceCache") << "Launching Experience cache idle coro." << LL_ENDL; do { - llcoro::suspendUntilTimeout(SECS_BETWEEN_REQUESTS); - if (mEraseExpiredTimer.checkExpirationAndReset(ERASE_EXPIRED_TIMEOUT)) { eraseExpired(); @@ -416,7 +414,9 @@ void LLExperienceCache::idleCoro() requestExperiences(); } - } while (!mShutdown); + llcoro::suspendUntilTimeout(SECS_BETWEEN_REQUESTS); + + } while (!sShutdown); // The coroutine system will likely be shut down by the time we get to this point // (or at least no further cycling will occur on it since the user has decided to quit.) diff --git a/indra/llmessage/llexperiencecache.h b/indra/llmessage/llexperiencecache.h index f9ff69c2b6..1c97133723 100644 --- a/indra/llmessage/llexperiencecache.h +++ b/indra/llmessage/llexperiencecache.h @@ -142,7 +142,7 @@ private: LLFrameTimer mEraseExpiredTimer; // Periodically clean out expired entries from the cache CapabilityQuery_t mCapability; std::string mCacheFileName; - bool mShutdown; + static bool sShutdown; // control for coroutines, they exist out of LLExperienceCache's scope, so they need a static control void idleCoro(); void eraseExpired(); diff --git a/indra/llmessage/llteleportflags.h b/indra/llmessage/llteleportflags.h index b3fcad036e..fd1e702832 100644 --- a/indra/llmessage/llteleportflags.h +++ b/indra/llmessage/llteleportflags.h @@ -44,6 +44,8 @@ const U32 TELEPORT_FLAGS_VIA_REGION_ID = 1 << 12; const U32 TELEPORT_FLAGS_IS_FLYING = 1 << 13; const U32 TELEPORT_FLAGS_SHOW_RESET_HOME = 1 << 14; const U32 TELEPORT_FLAGS_FORCE_REDIRECT = 1 << 15; // used to force a redirect to some random location - used when kicking someone from land. +const U32 TELEPORT_FLAGS_VIA_GLOBAL_COORDS = 1 << 16; +const U32 TELEPORT_FLAGS_WITHIN_REGION = 1 << 17; const U32 TELEPORT_FLAGS_MASK_VIA = TELEPORT_FLAGS_VIA_LURE | TELEPORT_FLAGS_VIA_LANDMARK diff --git a/indra/llui/llaccordionctrl.cpp b/indra/llui/llaccordionctrl.cpp index 938cb5f5ce..fedbbfb4c6 100644 --- a/indra/llui/llaccordionctrl.cpp +++ b/indra/llui/llaccordionctrl.cpp @@ -668,7 +668,7 @@ void LLAccordionCtrl::onScrollPosChangeCallback(S32, LLScrollbar*) } // virtual -void LLAccordionCtrl::onChildGotFocus(const LLUICtrl *cntrl) +void LLAccordionCtrl::onUpdateScrollToChild(const LLUICtrl *cntrl) { if (mScrollbar && mScrollbar->getVisible()) { @@ -694,7 +694,7 @@ void LLAccordionCtrl::onChildGotFocus(const LLUICtrl *cntrl) } } - LLUICtrl::onChildGotFocus(cntrl); + LLUICtrl::onUpdateScrollToChild(cntrl); } void LLAccordionCtrl::onOpen (const LLSD& key) diff --git a/indra/llui/llaccordionctrl.h b/indra/llui/llaccordionctrl.h index c9e0e7c4b7..9d9db271e6 100644 --- a/indra/llui/llaccordionctrl.h +++ b/indra/llui/llaccordionctrl.h @@ -116,7 +116,7 @@ public: void draw(); void onScrollPosChangeCallback(S32, LLScrollbar*); - virtual void onChildGotFocus(const LLUICtrl * cntrl); + virtual void onUpdateScrollToChild(const LLUICtrl * cntrl); void onOpen (const LLSD& key); S32 notifyParent(const LLSD& info); diff --git a/indra/llui/llaccordionctrltab.cpp b/indra/llui/llaccordionctrltab.cpp index d5c4ad961c..098621b543 100644 --- a/indra/llui/llaccordionctrltab.cpp +++ b/indra/llui/llaccordionctrltab.cpp @@ -453,7 +453,7 @@ void LLAccordionCtrlTab::onVisibilityChange(BOOL new_visibility) } // virtual -void LLAccordionCtrlTab::onChildGotFocus(const LLUICtrl *cntrl) +void LLAccordionCtrlTab::onUpdateScrollToChild(const LLUICtrl *cntrl) { if (mScrollbar && mScrollbar->getVisible()) { @@ -478,7 +478,7 @@ void LLAccordionCtrlTab::onChildGotFocus(const LLUICtrl *cntrl) } } - LLUICtrl::onChildGotFocus(cntrl); + LLUICtrl::onUpdateScrollToChild(cntrl); } BOOL LLAccordionCtrlTab::handleMouseDown(S32 x, S32 y, MASK mask) diff --git a/indra/llui/llaccordionctrltab.h b/indra/llui/llaccordionctrltab.h index 53546ad5a1..2c72e8c036 100644 --- a/indra/llui/llaccordionctrltab.h +++ b/indra/llui/llaccordionctrltab.h @@ -159,7 +159,7 @@ public: * Raises notifyParent event with "child_visibility_change" = new_visibility */ void onVisibilityChange(BOOL new_visibility); - virtual void onChildGotFocus(const LLUICtrl * cntrl); + virtual void onUpdateScrollToChild(const LLUICtrl * cntrl); // Changes expand/collapse state and triggers expand/collapse callbacks virtual BOOL handleMouseDown(S32 x, S32 y, MASK mask); diff --git a/indra/llui/llbadgeowner.cpp b/indra/llui/llbadgeowner.cpp index ea26b34529..d4f8ed1106 100644 --- a/indra/llui/llbadgeowner.cpp +++ b/indra/llui/llbadgeowner.cpp @@ -56,6 +56,14 @@ void LLBadgeOwner::initBadgeParams(const LLBadge::Params& p) } } +void LLBadgeOwner::reshapeBadge(const LLRect& new_rect) +{ + if (mBadge) + { + mBadge->setShape(new_rect); + } +} + // Re-add setBadgeLabel void LLBadgeOwner::setBadgeLabel(const LLStringExplicit& label) { diff --git a/indra/llui/llbadgeowner.h b/indra/llui/llbadgeowner.h index 990f35ff9d..22b6da9e92 100644 --- a/indra/llui/llbadgeowner.h +++ b/indra/llui/llbadgeowner.h @@ -49,6 +49,7 @@ public: // void setBadgeVisibility(bool visible); void setDrawBadgeAtTop(bool draw_at_top); + void reshapeBadge(const LLRect& new_rect); private: diff --git a/indra/llui/llcombobox.cpp b/indra/llui/llcombobox.cpp index 57b8237f43..c2c7d0d50c 100644 --- a/indra/llui/llcombobox.cpp +++ b/indra/llui/llcombobox.cpp @@ -517,6 +517,14 @@ S32 LLComboBox::getCurrentIndex() const return -1; } +void LLComboBox::setEnabledByValue(const LLSD& value, BOOL enabled) +{ + LLScrollListItem *found = mList->getItem(value); + if (found) + { + found->setEnabled(enabled); + } +} void LLComboBox::createLineEditor(const LLComboBox::Params& p) { diff --git a/indra/llui/llcombobox.h b/indra/llui/llcombobox.h index a6fab1bf31..4525ef9029 100644 --- a/indra/llui/llcombobox.h +++ b/indra/llui/llcombobox.h @@ -159,6 +159,8 @@ public: BOOL setCurrentByIndex( S32 index ); S32 getCurrentIndex() const; + void setEnabledByValue(const LLSD& value, BOOL enabled); + void createLineEditor(const Params&); // For setting the focus to the LLLineEditor diff --git a/indra/llui/lllineeditor.cpp b/indra/llui/lllineeditor.cpp index a8653b02d2..66f8fc96dd 100644 --- a/indra/llui/lllineeditor.cpp +++ b/indra/llui/lllineeditor.cpp @@ -2247,6 +2247,7 @@ void LLLineEditor::clear() void LLLineEditor::onTabInto() { selectAll(); + LLUICtrl::onTabInto(); } //virtual diff --git a/indra/llui/llmultisliderctrl.cpp b/indra/llui/llmultisliderctrl.cpp index 20e2b569f1..b3df7c154b 100644 --- a/indra/llui/llmultisliderctrl.cpp +++ b/indra/llui/llmultisliderctrl.cpp @@ -509,6 +509,7 @@ void LLMultiSliderCtrl::onTabInto() { mEditor->onTabInto(); } + LLF32UICtrl::onTabInto(); } void LLMultiSliderCtrl::reportInvalidData() diff --git a/indra/llui/llnotifications.cpp b/indra/llui/llnotifications.cpp index a115c6abb8..2295ec04b8 100644 --- a/indra/llui/llnotifications.cpp +++ b/indra/llui/llnotifications.cpp @@ -256,7 +256,7 @@ LLNotificationForm::LLNotificationForm(const LLSD& sd) } else { - LL_WARNS() << "Invalid form data " << sd << LL_ENDL; + LL_WARNS("Notifications") << "Invalid form data " << sd << LL_ENDL; mFormData = LLSD::emptyArray(); } } @@ -449,11 +449,11 @@ LLNotificationTemplate::LLNotificationTemplate(const LLNotificationTemplate::Par mUniqueContext.push_back(context.value); } - LL_DEBUGS() << "notification \"" << mName << "\": tag count is " << p.tags.size() << LL_ENDL; + LL_DEBUGS("Notifications") << "notification \"" << mName << "\": tag count is " << p.tags.size() << LL_ENDL; BOOST_FOREACH(const LLNotificationTemplate::Tag& tag, p.tags) { - LL_DEBUGS() << " tag \"" << std::string(tag.value) << "\"" << LL_ENDL; + LL_DEBUGS("Notifications") << " tag \"" << std::string(tag.value) << "\"" << LL_ENDL; mTags.push_back(tag.value); } @@ -1407,8 +1407,14 @@ void LLNotifications::initSingleton() createDefaultChannels(); } +void LLNotifications::cleanupSingleton() +{ + clear(); +} + void LLNotifications::createDefaultChannels() { + LL_INFOS("Notifications") << "Generating default notification channels" << LL_ENDL; // now construct the various channels AFTER loading the notifications, // because the history channel is going to rewrite the stored notifications file mDefaultChannels.push_back(new LLNotificationChannel("Enabled", "", @@ -1464,7 +1470,7 @@ void LLNotifications::forceResponse(const LLNotification::Params& params, S32 op if (selected_item.isUndefined()) { - LL_WARNS() << "Invalid option" << option << " for notification " << (std::string)params.name << LL_ENDL; + LL_WARNS("Notifications") << "Invalid option" << option << " for notification " << (std::string)params.name << LL_ENDL; return; } response[selected_item["name"].asString()] = true; @@ -1498,12 +1504,12 @@ void replaceSubstitutionStrings(LLXMLNodePtr node, StringMap& replacements) if (found != replacements.end()) { replacement = found->second; - LL_DEBUGS() << "replaceSubstitutionStrings: value: \"" << value << "\" repl: \"" << replacement << "\"." << LL_ENDL; + LL_DEBUGS("Notifications") << "replaceSubstitutionStrings: value: \"" << value << "\" repl: \"" << replacement << "\"." << LL_ENDL; it->second->setValue(replacement); } else { - LL_WARNS() << "replaceSubstitutionStrings FAILURE: could not find replacement \"" << value << "\"." << LL_ENDL; + LL_WARNS("Notifications") << "replaceSubstitutionStrings FAILURE: could not find replacement \"" << value << "\"." << LL_ENDL; } } } @@ -1542,7 +1548,7 @@ void addPathIfExists(const std::string& new_path, std::vector& path bool LLNotifications::loadTemplates() { - LL_INFOS() << "Reading notifications template" << LL_ENDL; + LL_INFOS("Notifications") << "Reading notifications template" << LL_ENDL; // Passing findSkinnedFilenames(constraint=LLDir::ALL_SKINS) makes it // output all relevant pathnames instead of just the ones from the most // specific skin. @@ -1613,7 +1619,7 @@ bool LLNotifications::loadTemplates() mTemplates[notification.name] = LLNotificationTemplatePtr(new LLNotificationTemplate(notification)); } - LL_INFOS() << "...done" << LL_ENDL; + LL_INFOS("Notifications") << "...done" << LL_ENDL; return true; } @@ -1841,7 +1847,7 @@ bool LLNotifications::isVisibleByRules(LLNotificationPtr n) for(it = mVisibilityRules.begin(); it != mVisibilityRules.end(); it++) { // An empty type/tag/name string will match any notification, so only do the comparison when the string is non-empty in the rule. - LL_DEBUGS() + LL_DEBUGS("Notifications") << "notification \"" << n->getName() << "\" " << "testing against " << ((*it)->mVisible?"show":"hide") << " rule, " << "name = \"" << (*it)->mName << "\" " @@ -1886,7 +1892,7 @@ bool LLNotifications::isVisibleByRules(LLNotificationPtr n) if((*it)->mResponse.empty()) { // Response property is empty. Cancel this notification. - LL_DEBUGS() << "cancelling notification " << n->getName() << LL_ENDL; + LL_DEBUGS("Notifications") << "cancelling notification " << n->getName() << LL_ENDL; cancel(n); } @@ -1897,7 +1903,7 @@ bool LLNotifications::isVisibleByRules(LLNotificationPtr n) // TODO: verify that the response template has an item with the correct name response[(*it)->mResponse] = true; - LL_DEBUGS() << "responding to notification " << n->getName() << " with response = " << response << LL_ENDL; + LL_DEBUGS("Notifications") << "responding to notification " << n->getName() << " with response = " << response << LL_ENDL; n->respond(response); } @@ -1909,7 +1915,7 @@ bool LLNotifications::isVisibleByRules(LLNotificationPtr n) break; } - LL_DEBUGS() << "allowing notification " << n->getName() << LL_ENDL; + LL_DEBUGS("Notifications") << "allowing notification " << n->getName() << LL_ENDL; return true; } @@ -1971,7 +1977,7 @@ void LLPostponedNotification::onAvatarNameCache(const LLUUID& agent_id, // from PE merge - we should figure out if this is the right thing to do if (name.empty()) { - LL_WARNS() << "Empty name received for Id: " << agent_id << LL_ENDL; + LL_WARNS("Notifications") << "Empty name received for Id: " << agent_id << LL_ENDL; name = SYSTEM_FROM; } diff --git a/indra/llui/llnotifications.h b/indra/llui/llnotifications.h index aedf5c8dcf..1d2f3e75ec 100644 --- a/indra/llui/llnotifications.h +++ b/indra/llui/llnotifications.h @@ -963,6 +963,7 @@ public: private: /*virtual*/ void initSingleton(); + /*virtual*/ void cleanupSingleton(); void loadPersistentNotifications(); @@ -1078,6 +1079,7 @@ public: LLPersistentNotificationChannel() : LLNotificationChannel("Persistent", "Visible", ¬ificationFilter) {} + virtual ~LLPersistentNotificationChannel() {} typedef std::vector history_list_t; history_list_t::iterator beginHistory() { sortHistory(); return mHistory.begin(); } diff --git a/indra/llui/llsliderctrl.cpp b/indra/llui/llsliderctrl.cpp index 3b89a8ca63..d80a434f22 100644 --- a/indra/llui/llsliderctrl.cpp +++ b/indra/llui/llsliderctrl.cpp @@ -479,6 +479,7 @@ void LLSliderCtrl::onTabInto() { mEditor->onTabInto(); } + LLF32UICtrl::onTabInto(); } void LLSliderCtrl::reportInvalidData() diff --git a/indra/llui/llspinctrl.cpp b/indra/llui/llspinctrl.cpp index 21b1ab4abc..f871252d7a 100644 --- a/indra/llui/llspinctrl.cpp +++ b/indra/llui/llspinctrl.cpp @@ -496,7 +496,8 @@ void LLSpinCtrl::setAllowEdit(BOOL allow_edit) void LLSpinCtrl::onTabInto() { - mEditor->onTabInto(); + mEditor->onTabInto(); + LLF32UICtrl::onTabInto(); } diff --git a/indra/llui/llstyle.cpp b/indra/llui/llstyle.cpp index 8c4d3a5c6b..020c4e553d 100644 --- a/indra/llui/llstyle.cpp +++ b/indra/llui/llstyle.cpp @@ -33,7 +33,7 @@ #include "llui.h" LLStyle::Params::Params() -: visible("visible", true), + : visible("visible", true), drop_shadow("drop_shadow", LLFontGL::NO_SHADOW), color("color", LLColor4::black), readonly_color("readonly_color", LLColor4::black), @@ -44,7 +44,7 @@ LLStyle::Params::Params() is_link("is_link"), // Don't highlight URLs on hover if font style contains underline use_default_link_style("use_default_link_style", true), - is_chat_header("is_chat_header", false) + can_underline_on_hover("can_underline_on_hover", true) // {} diff --git a/indra/llui/llstyle.h b/indra/llui/llstyle.h index 2fe9117509..1678d434d8 100644 --- a/indra/llui/llstyle.h +++ b/indra/llui/llstyle.h @@ -50,7 +50,7 @@ public: Optional is_link; // Don't highlight URLs on hover if font style contains underline Optional use_default_link_style; - Optional is_chat_header; + Optional can_underline_on_hover; // Params(); }; diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp index d0f4f69023..d440c245bc 100644 --- a/indra/llui/lltextbase.cpp +++ b/indra/llui/lltextbase.cpp @@ -1112,8 +1112,6 @@ BOOL LLTextBase::handleMouseDown(S32 x, S32 y, MASK mask) line_start = it->mDocIndexStart; } line_end = it->mDocIndexEnd; - - // FIRE-29545: Backspace not working after triple-click selecting last line line_end = llclamp(line_end, 0, getLength()); } @@ -2260,15 +2258,7 @@ void LLTextBase::appendTextImpl(const std::string &new_text, const LLStyle::Para //link_params.overwriteFrom(match.getStyle()); if (input_params.use_default_link_style) { - LLUIColor color(link_params.color()); - LLUIColor readonly_color(link_params.readonly_color()); - bool is_chat_header = link_params.is_chat_header(); link_params.overwriteFrom(match.getStyle()); - if (is_chat_header) - { - link_params.color = color; - link_params.readonly_color = readonly_color; - } } // @@ -2309,7 +2299,7 @@ void LLTextBase::appendTextImpl(const std::string &new_text, const LLStyle::Para // FIRE-11437 - Don't supress font style for chat history name links //appendAndHighlightTextImpl(match.getLabel(), part, link_params, match.underlineOnHoverOnly()); appendAndHighlightTextImpl(match.getLabel(), part, link_params, - input_params.use_default_link_style ? match.underlineOnHoverOnly() : false); + input_params.can_underline_on_hover ? match.underlineOnHoverOnly() : false); // bool tooltip_required = !match.getTooltip().empty(); @@ -2330,7 +2320,7 @@ void LLTextBase::appendTextImpl(const std::string &new_text, const LLStyle::Para static LLUIColor query_part_color = LLUIColorTable::getInstance()->getColor("UriQueryPartColor", LLColor4::grey); link_params.color = query_part_color; link_params.readonly_color = query_part_color; - appendAndHighlightTextImpl(label, part, link_params, input_params.use_default_link_style ? match.underlineOnHoverOnly() : false); + appendAndHighlightTextImpl(label, part, link_params, input_params.can_underline_on_hover ? match.underlineOnHoverOnly() : false); // // set the tooltip for the query part of url @@ -2506,7 +2496,16 @@ void LLTextBase::appendAndHighlightTextImpl(const std::string &new_text, S32 hig LLTextSegmentPtr segmentp; if (underline_on_hover_only || mSkipLinkUnderline) { - highlight_params.font.style("NORMAL"); + // Only reset underline font style + //highlight_params.font.style("NORMAL"); + std::string normal_font_style(highlight_params.font.style()); + LLStringUtil::replaceString(normal_font_style, "UNDERLINE", ""); + if (normal_font_style.empty()) + { + normal_font_style = "NORMAL"; + } + highlight_params.font.style(normal_font_style); + // LLStyleConstSP normal_sp(new LLStyle(highlight_params)); segmentp = new LLOnHoverChangeableTextSegment(sp, normal_sp, cur_length, cur_length + wide_text.size(), *this); } diff --git a/indra/llui/lluictrl.cpp b/indra/llui/lluictrl.cpp index ce9449f587..98f06ee29f 100644 --- a/indra/llui/lluictrl.cpp +++ b/indra/llui/lluictrl.cpp @@ -709,7 +709,6 @@ void LLUICtrl::setFocus(BOOL b) if (!hasFocus()) { gFocusMgr.setKeyboardFocus( this ); - onChildGotFocus(this); } } else @@ -752,8 +751,9 @@ void LLUICtrl::resetDirty() } // virtual -void LLUICtrl::onTabInto() +void LLUICtrl::onTabInto() { + onUpdateScrollToChild(this); } // virtual diff --git a/indra/llui/llview.cpp b/indra/llui/llview.cpp index 63439fbf34..ed0237ea55 100644 --- a/indra/llui/llview.cpp +++ b/indra/llui/llview.cpp @@ -691,12 +691,12 @@ void LLView::onVisibilityChange ( BOOL new_visibility ) } // virtual -void LLView::onChildGotFocus(const LLUICtrl * cntrl) +void LLView::onUpdateScrollToChild(const LLUICtrl * cntrl) { LLView* parent_view = getParent(); if (parent_view) { - parent_view->onChildGotFocus(cntrl); + parent_view->onUpdateScrollToChild(cntrl); } } diff --git a/indra/llui/llview.h b/indra/llui/llview.h index bee9dd8c60..ae24ca5c0b 100644 --- a/indra/llui/llview.h +++ b/indra/llui/llview.h @@ -307,7 +307,7 @@ public: virtual BOOL setLabelArg( const std::string& key, const LLStringExplicit& text ); virtual void onVisibilityChange ( BOOL new_visibility ); - virtual void onChildGotFocus(const LLUICtrl * cntrl); + virtual void onUpdateScrollToChild(const LLUICtrl * cntrl); void pushVisible(BOOL visible) { mLastVisible = mVisible; setVisible(visible); } void popVisible() { setVisible(mLastVisible); } diff --git a/indra/llwindow/llopenglview-objc.mm b/indra/llwindow/llopenglview-objc.mm index 2890036615..d609eca77b 100644 --- a/indra/llwindow/llopenglview-objc.mm +++ b/indra/llwindow/llopenglview-objc.mm @@ -369,10 +369,10 @@ attributedStringInfo getSegments(NSAttributedString *str) callRightMouseDown(mMousePos, [theEvent modifierFlags]); mSimulatedRightClick = true; } else { - if ([theEvent clickCount] >= 2) + if ([theEvent clickCount] == 2) { callDoubleClick(mMousePos, [theEvent modifierFlags]); - } else if ([theEvent clickCount] == 1) { + } else if ([theEvent clickCount] >= 1) { callLeftMouseDown(mMousePos, [theEvent modifierFlags]); } } diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 4ee5d2525b..6bb8b663e1 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -2122,6 +2122,12 @@ endif (FMODSTUDIO) # set_source_files_properties(llstartup.cpp PROPERTIES COMPILE_FLAGS "${LLSTARTUP_COMPILE_FLAGS}") set_source_files_properties(llstartup.cpp llfloaterpreference.cpp PROPERTIES COMPILE_FLAGS "${LLSTARTUP_COMPILE_FLAGS}") # + +if (HAVOK OR HAVOK_TPV) + set(LLSTARTUP_COMPILE_FLAGS "${LLSTARTUP_COMPILE_FLAGS} -DLL_HAVOK") +endif (HAVOK OR HAVOK_TPV) + +# progress view disables/enables icons based on available packages set_source_files_properties(llprogressview.cpp PROPERTIES COMPILE_FLAGS "${LLSTARTUP_COMPILE_FLAGS}") list(APPEND viewer_SOURCE_FILES ${viewer_HEADER_FILES}) @@ -2250,10 +2256,10 @@ if (WINDOWS) endif (FMODSTUDIO) if (OPENAL) - list(APPEND COPY_INPUT_DEPENDENCIES - ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/OpenAL32.dll - ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/alut.dll - ) + list(APPEND COPY_INPUT_DEPENDENCIES + ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/OpenAL32.dll + ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/alut.dll + ) endif (OPENAL) add_custom_command( @@ -2266,6 +2272,7 @@ if (WINDOWS) --artwork=${ARTWORK_DIR} "--bugsplat=${BUGSPLAT_DB}" "--fmodstudio=${FMODSTUDIO}" + "--openal=${OPENAL}" --build=${CMAKE_CURRENT_BINARY_DIR} --buildtype=${CMAKE_BUILD_TYPE} "--channel=${VIEWER_CHANNEL}" @@ -2276,7 +2283,6 @@ if (WINDOWS) --touch=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/copy_touched.bat --versionfile=${CMAKE_CURRENT_BINARY_DIR}/viewer_version.txt --viewer_flavor=${ND_VIEWER_FLAVOR} - --openal=${OPENAL} DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py stage_third_party_libs @@ -2330,6 +2336,7 @@ if (WINDOWS) --artwork=${ARTWORK_DIR} "--bugsplat=${BUGSPLAT_DB}" "--fmodstudio=${FMODSTUDIO}" + "--openal=${OPENAL}" --build=${CMAKE_CURRENT_BINARY_DIR} --buildtype=${CMAKE_BUILD_TYPE} "--channel=${VIEWER_CHANNEL}" @@ -2340,7 +2347,6 @@ if (WINDOWS) --touch=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/touched.bat --versionfile=${CMAKE_CURRENT_BINARY_DIR}/viewer_version.txt --viewer_flavor=${ND_VIEWER_FLAVOR} - --openal=${OPENAL} DEPENDS ${VIEWER_BINARY_NAME} ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py @@ -2511,6 +2517,7 @@ endif (NOT ENABLE_MEDIA_PLUGINS) --artwork=${ARTWORK_DIR} "--bugsplat=${BUGSPLAT_DB}" "--fmodstudio=${FMODSTUDIO}" + "--openal=${OPENAL}" --build=${CMAKE_CURRENT_BINARY_DIR} --buildtype=${CMAKE_BUILD_TYPE} "--channel=${VIEWER_CHANNEL}" @@ -2521,7 +2528,6 @@ endif (NOT ENABLE_MEDIA_PLUGINS) --touch=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/.${product}.touched --versionfile=${CMAKE_CURRENT_BINARY_DIR}/viewer_version.txt --viewer_flavor=${ND_VIEWER_FLAVOR} - --openal=${OPENAL} DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py ${COPY_INPUT_DEPENDENCIES} @@ -2538,6 +2544,7 @@ endif (NOT ENABLE_MEDIA_PLUGINS) --artwork=${ARTWORK_DIR} "--bugsplat=${BUGSPLAT_DB}" "--fmodstudio=${FMODSTUDIO}" + "--openal=${OPENAL}" --build=${CMAKE_CURRENT_BINARY_DIR} --buildtype=${CMAKE_BUILD_TYPE} "--channel=${VIEWER_CHANNEL}" @@ -2547,7 +2554,6 @@ endif (NOT ENABLE_MEDIA_PLUGINS) --source=${CMAKE_CURRENT_SOURCE_DIR} --versionfile=${CMAKE_CURRENT_BINARY_DIR}/viewer_version.txt --viewer_flavor=${ND_VIEWER_FLAVOR} - --openal=${OPENAL} DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py ${COPY_INPUT_DEPENDENCIES} @@ -2622,6 +2628,7 @@ if (DARWIN) --artwork=${ARTWORK_DIR} "--bugsplat=${BUGSPLAT_DB}" "--fmodstudio=${FMODSTUDIO}" + "--openal=${OPENAL}" --build=${CMAKE_CURRENT_BINARY_DIR} --buildtype=${CMAKE_BUILD_TYPE} --bundleid=${MACOSX_BUNDLE_GUI_IDENTIFIER} @@ -2632,7 +2639,6 @@ if (DARWIN) --source=${CMAKE_CURRENT_SOURCE_DIR} --versionfile=${CMAKE_CURRENT_BINARY_DIR}/viewer_version.txt --viewer_flavor=${ND_VIEWER_FLAVOR} - --openal=${OPENAL} DEPENDS ${VIEWER_BINARY_NAME} ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py @@ -2659,6 +2665,7 @@ if (DARWIN) --artwork=${ARTWORK_DIR} "--bugsplat=${BUGSPLAT_DB}" "--fmodstudio=${FMODSTUDIO}" + "--openal=${OPENAL}" --build=${CMAKE_CURRENT_BINARY_DIR} --buildtype=${CMAKE_BUILD_TYPE} "--channel=${VIEWER_CHANNEL}" @@ -2669,7 +2676,6 @@ if (DARWIN) --touch=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/.${product}.touched --versionfile=${CMAKE_CURRENT_BINARY_DIR}/viewer_version.txt --viewer_flavor=${ND_VIEWER_FLAVOR} - --openal=${OPENAL} ${SIGNING_SETTING} DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py diff --git a/indra/newview/VIEWER_VERSION.txt b/indra/newview/VIEWER_VERSION.txt index 4b20d9700d..a228920441 100644 --- a/indra/newview/VIEWER_VERSION.txt +++ b/indra/newview/VIEWER_VERSION.txt @@ -1 +1 @@ -6.4.8 +6.4.9 diff --git a/indra/newview/app_settings/camera/Front.xml b/indra/newview/app_settings/camera/Front.xml index f9f615c4a7..1bf35c8682 100644 --- a/indra/newview/app_settings/camera/Front.xml +++ b/indra/newview/app_settings/camera/Front.xml @@ -1,16 +1,5 @@ - AppearanceCameraMovement - - Comment - When entering appearance editing mode, camera zooms in on currently selected portion of avatar - Persist - 1 - Type - Boolean - Value - 1 - AvatarSitRotation Comment @@ -90,17 +79,6 @@ Value 0.90322577953338623 - EditCameraMovement - - Comment - When entering build mode, camera moves up above avatar - Persist - 1 - Type - Boolean - Value - 0 - FocusOffsetRearView Comment diff --git a/indra/newview/app_settings/camera/Rear.xml b/indra/newview/app_settings/camera/Rear.xml index a084f83bfe..a4de53d698 100644 --- a/indra/newview/app_settings/camera/Rear.xml +++ b/indra/newview/app_settings/camera/Rear.xml @@ -1,16 +1,5 @@ - AppearanceCameraMovement - - Comment - When entering appearance editing mode, camera zooms in on currently selected portion of avatar - Persist - 1 - Type - Boolean - Value - 1 - AvatarSitRotation Comment @@ -90,17 +79,6 @@ Value 0.90322577953338623 - EditCameraMovement - - Comment - When entering build mode, camera moves up above avatar - Persist - 1 - Type - Boolean - Value - 0 - FocusOffsetRearView Comment diff --git a/indra/newview/app_settings/camera/Side.xml b/indra/newview/app_settings/camera/Side.xml index 5db5b164bd..0ff6c5ae3f 100644 --- a/indra/newview/app_settings/camera/Side.xml +++ b/indra/newview/app_settings/camera/Side.xml @@ -1,16 +1,5 @@ - AppearanceCameraMovement - - Comment - When entering appearance editing mode, camera zooms in on currently selected portion of avatar - Persist - 1 - Type - Boolean - Value - 1 - AvatarSitRotation Comment @@ -90,17 +79,6 @@ Value 0.90322577953338623 - EditCameraMovement - - Comment - When entering build mode, camera moves up above avatar - Persist - 1 - Type - Boolean - Value - 0 - FocusOffsetRearView Comment diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 1ff9db26cb..14bddd6ac0 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -1407,10 +1407,21 @@ Backup 0 + RLVaShowRedirectChatTyping + + Comment + Sends typing start messages (and optionally plays the typing animation) when @redirchat restricted + Persist + 1 + Type + Boolean + Value + 0 + RLVaSplitRedirectChat Comment - Splits long nearby chat lines across multiple messages when @redir* restricted. + Splits long nearby chat lines across multiple messages when @redir* restricted Persist 1 Type @@ -17963,17 +17974,6 @@ Change of this parameter will affect the layout of buttons in notification toast Backup 0 - VoiceCallsFriendsOnly - - Comment - Only accept voice calls from residents on your friends list - Persist - 1 - Type - Boolean - Value - 0 - VoiceCallsRejectGroup Comment @@ -22718,17 +22718,6 @@ Change of this parameter will affect the layout of buttons in notification toast Value 0 - UseHTTPBakedTextureFetch - - Comment - If true, baked avatar textures will be fetched using HTTP instead of UDP. - Persist - 1 - Type - Boolean - Value - 0 - FSIMTabNameFormat Comment diff --git a/indra/newview/app_settings/settings_per_account.xml b/indra/newview/app_settings/settings_per_account.xml index 0c6e00bd01..e35efe7f38 100644 --- a/indra/newview/app_settings/settings_per_account.xml +++ b/indra/newview/app_settings/settings_per_account.xml @@ -477,6 +477,17 @@ Value 1 + VoiceCallsFriendsOnly + + Comment + Only accept voice calls and receive IMs from residents on your friends list + Persist + 1 + Type + Boolean + Value + 0 + VoiceEffectDefault Comment diff --git a/indra/newview/exogroupmutelist.cpp b/indra/newview/exogroupmutelist.cpp index eb18c8a1bf..b8d6882355 100644 --- a/indra/newview/exogroupmutelist.cpp +++ b/indra/newview/exogroupmutelist.cpp @@ -167,16 +167,29 @@ bool exoGroupMuteList::restoreDeferredGroupChat(const LLUUID& group) LLGroupData groupData; if (gAgent.getGroupData(group, groupData)) { - gIMMgr->addSession(groupData.mName, IM_SESSION_INVITE, group); - - uuid_vec_t ids; - LLIMModel::sendStartSession(group, group, ids, IM_SESSION_GROUP_START); - - if (!gAgent.isDoNotDisturb() && gSavedSettings.getU32("PlayModeUISndNewIncomingGroupIMSession") != 0) + if (!isMuted(group)) { - make_ui_sound("UISndNewIncomingGroupIMSession"); + LL_INFOS() << "Restoring group chat from " << groupData.mName << " (" << group.asString() << ")" << LL_ENDL; + + gIMMgr->addSession(groupData.mName, IM_SESSION_INVITE, group); + + uuid_vec_t ids; + LLIMModel::sendStartSession(group, group, ids, IM_SESSION_GROUP_START); + + if (!gAgent.isDoNotDisturb() && gSavedSettings.getU32("PlayModeUISndNewIncomingGroupIMSession") != 0) + { + make_ui_sound("UISndNewIncomingGroupIMSession"); + } + return true; + } + else + { + LL_INFOS() << "NOT restoring group chat from " << groupData.mName << " (" << group.asString() << ") because the group is muted" << LL_ENDL; + gIMMgr->clearPendingInvitation(group); + gIMMgr->clearPendingAgentListUpdates(group); + LLIMModel::getInstance()->sendLeaveSession(group, group); + return false; } - return true; } } diff --git a/indra/newview/fonts/fonts.xml b/indra/newview/fonts/fonts.xml index 3e7eff4d4f..00ce0e8b17 100644 --- a/indra/newview/fonts/fonts.xml +++ b/indra/newview/fonts/fonts.xml @@ -15,6 +15,7 @@ nirmala.ttf tahoma.ttf Cambria.ttc + micross.ttf malgun.ttf @@ -29,6 +30,7 @@ 华文细黑.ttf PingFang.ttc STIXGeneral.otf + Thonburi.ttc diff --git a/indra/newview/fonts/fonts_celestia_medium_redux.xml b/indra/newview/fonts/fonts_celestia_medium_redux.xml index 4196fbc6a0..d177a69a56 100644 --- a/indra/newview/fonts/fonts_celestia_medium_redux.xml +++ b/indra/newview/fonts/fonts_celestia_medium_redux.xml @@ -15,6 +15,7 @@ nirmala.ttf tahoma.ttf Cambria.ttc + micross.ttf malgun.ttf @@ -29,6 +30,7 @@ 华文细黑.ttf PingFang.ttc STIXGeneral.otf + Thonburi.ttc diff --git a/indra/newview/fonts/fonts_droid.xml b/indra/newview/fonts/fonts_droid.xml index 927bcdde17..c540333cbe 100644 --- a/indra/newview/fonts/fonts_droid.xml +++ b/indra/newview/fonts/fonts_droid.xml @@ -15,6 +15,7 @@ nirmala.ttf tahoma.ttf Cambria.ttc + micross.ttf malgun.ttf @@ -29,6 +30,7 @@ 华文细黑.ttf PingFang.ttc STIXGeneral.otf + Thonburi.ttc diff --git a/indra/newview/fonts/fonts_dyslexia.xml b/indra/newview/fonts/fonts_dyslexia.xml index 9ebb445a84..ce40f41f94 100644 --- a/indra/newview/fonts/fonts_dyslexia.xml +++ b/indra/newview/fonts/fonts_dyslexia.xml @@ -15,6 +15,7 @@ nirmala.ttf tahoma.ttf Cambria.ttc + micross.ttf malgun.ttf @@ -29,6 +30,7 @@ 华文细黑.ttf PingFang.ttc STIXGeneral.otf + Thonburi.ttc diff --git a/indra/newview/fonts/fonts_liberation.xml b/indra/newview/fonts/fonts_liberation.xml index b612fe663f..0685fe5e61 100644 --- a/indra/newview/fonts/fonts_liberation.xml +++ b/indra/newview/fonts/fonts_liberation.xml @@ -15,6 +15,7 @@ nirmala.ttf tahoma.ttf Cambria.ttc + micross.ttf malgun.ttf @@ -29,6 +30,7 @@ 华文细黑.ttf PingFang.ttc STIXGeneral.otf + Thonburi.ttc diff --git a/indra/newview/fonts/fonts_mobi.xml b/indra/newview/fonts/fonts_mobi.xml index 4b73ba4e1d..76e08ece60 100644 --- a/indra/newview/fonts/fonts_mobi.xml +++ b/indra/newview/fonts/fonts_mobi.xml @@ -15,6 +15,7 @@ nirmala.ttf tahoma.ttf Cambria.ttc + micross.ttf malgun.ttf @@ -29,6 +30,7 @@ 华文细黑.ttf PingFang.ttc STIXGeneral.otf + Thonburi.ttc diff --git a/indra/newview/fonts/fonts_noto.xml b/indra/newview/fonts/fonts_noto.xml index 57b3940962..08c4fbf813 100644 --- a/indra/newview/fonts/fonts_noto.xml +++ b/indra/newview/fonts/fonts_noto.xml @@ -15,6 +15,7 @@ nirmala.ttf tahoma.ttf Cambria.ttc + micross.ttf malgun.ttf @@ -29,6 +30,7 @@ 华文细黑.ttf PingFang.ttc STIXGeneral.otf + Thonburi.ttc diff --git a/indra/newview/fonts/fonts_roboto.xml b/indra/newview/fonts/fonts_roboto.xml index e1c35b5332..004061a1b9 100644 --- a/indra/newview/fonts/fonts_roboto.xml +++ b/indra/newview/fonts/fonts_roboto.xml @@ -15,6 +15,7 @@ nirmala.ttf tahoma.ttf Cambria.ttc + micross.ttf malgun.ttf @@ -29,6 +30,7 @@ 华文细黑.ttf PingFang.ttc STIXGeneral.otf + Thonburi.ttc diff --git a/indra/newview/fonts/fonts_ubuntu.xml b/indra/newview/fonts/fonts_ubuntu.xml index f4f9cbe46a..5246683517 100644 --- a/indra/newview/fonts/fonts_ubuntu.xml +++ b/indra/newview/fonts/fonts_ubuntu.xml @@ -15,6 +15,7 @@ nirmala.ttf tahoma.ttf Cambria.ttc + micross.ttf malgun.ttf @@ -29,6 +30,7 @@ 华文细黑.ttf PingFang.ttc STIXGeneral.otf + Thonburi.ttc diff --git a/indra/newview/fschathistory.cpp b/indra/newview/fschathistory.cpp index 71bf32fcbb..d861ee32a7 100644 --- a/indra/newview/fschathistory.cpp +++ b/indra/newview/fschathistory.cpp @@ -73,6 +73,7 @@ #include "llfocusmgr.h" #include "llkeyboard.h" #include "llpanelblockedlist.h" +#include "rlvactions.h" #include "rlvcommon.h" #include "rlvhandler.h" @@ -509,6 +510,12 @@ public: { return canModerate(userdata); } +// [RLVa:KB] - @pay + else if (param == "can_pay") + { + return RlvActions::canPayAvatar(getAvatarId()); + } +// [/RLVa:KB] else if (param == "can_ban_member") { return canBanGroupMember(getAvatarId()); @@ -997,6 +1004,13 @@ protected: { const LLRect sticky_rect = mUserNameTextBox->getRect(); S32 icon_x = llmin(sticky_rect.mLeft + mUserNameTextBox->getTextBoundingRect().getWidth() + 7, sticky_rect.mRight - 3); + + if (gSavedSettings.getBOOL("ShowChatMiniIcons")) + { + LLAvatarIconCtrl* icon = getChild("avatar_icon"); + icon_x += icon->getRect().getWidth() + icon->getRect().mLeft; + } + mInfoCtrl->setOrigin(icon_x, sticky_rect.getCenterY() - mInfoCtrl->getRect().getHeight() / 2 ) ; } mInfoCtrl->setVisible(isVisible); @@ -1256,12 +1270,14 @@ void FSChatHistory::appendMessage(const LLChat& chat, const LLSD &args, const LL LLStyle::Params name_params(body_message_params); name_params.color(name_color); name_params.readonly_color(name_color); - name_params.is_chat_header(true); + std::string name_font_style_postfix = use_plain_text_chat_history ? "UNDERLINE" : ""; + name_params.font.style = name_font_style_postfix; // This will be used when hovering the name (LLTextBase::appendAndHighlightTextImpl() will filter it out) + std::string delimiter_style = "NORMAL"; // FS:LO FIRE-2899 - Faded text for IMs in nearby chat F32 FSIMChatHistoryFade = gSavedSettings.getF32("FSIMChatHistoryFade"); - if(FSIMChatHistoryFade > 1.0f) + if (FSIMChatHistoryFade > 1.0f) { FSIMChatHistoryFade = 1.0f; gSavedSettings.setF32("FSIMChatHistoryFade",FSIMChatHistoryFade); @@ -1292,22 +1308,24 @@ void FSChatHistory::appendMessage(const LLChat& chat, const LLSD &args, const LL delimiter = LLStringUtil::null; // italics for emotes -Zi - if(gSavedSettings.getBOOL("EmotesUseItalic")) + if (gSavedSettings.getBOOL("EmotesUseItalic")) { body_message_params.font.style = "ITALIC"; - name_params.font.style = "ITALIC"; + name_params.font.style = "ITALIC" + name_font_style_postfix; } } if (chat.mChatType == CHAT_TYPE_WHISPER && gSavedSettings.getBOOL("FSEmphasizeShoutWhisper")) { body_message_params.font.style = "ITALIC"; - name_params.font.style = "ITALIC"; + name_params.font.style = "ITALIC" + name_font_style_postfix; + delimiter_style = "ITALIC"; } else if(chat.mChatType == CHAT_TYPE_SHOUT && gSavedSettings.getBOOL("FSEmphasizeShoutWhisper")) { body_message_params.font.style = "BOLD"; - name_params.font.style = "BOLD"; + name_params.font.style = "BOLD" + name_font_style_postfix; + delimiter_style = "BOLD"; } bool message_from_log = chat.mChatStyle == CHAT_STYLE_HISTORY; @@ -1327,11 +1345,23 @@ void FSChatHistory::appendMessage(const LLChat& chat, const LLSD &args, const LL U32 moderator_body_style_value = gSavedSettings.getU32("FSModTextStyle"); std::string moderator_name_style = applyModeratorStyle(moderator_name_style_value); std::string moderator_body_style = applyModeratorStyle(moderator_body_style_value); + std::string moderator_timestamp_style = moderator_name_style; if (chat.mChatStyle == CHAT_STYLE_MODERATOR) { moderator_style_active = true; + delimiter_style = moderator_name_style; + if (moderator_name_style_value < UNDERLINE) + { + // Need to add "UNDERLINE" here because we want to underline the name on hover + moderator_name_style += name_font_style_postfix; + } + else + { + // Always contains underline - don't show it on hover only + name_params.can_underline_on_hover = false; + } name_params.font.style(moderator_name_style); body_message_params.font.style(moderator_body_style); @@ -1340,6 +1370,7 @@ void FSChatHistory::appendMessage(const LLChat& chat, const LLSD &args, const LL if ( (ITALIC & moderator_name_style_value) != ITALIC )//HG: if ITALIC isn't one of the styles... add it { moderator_name_style += "ITALIC"; + moderator_timestamp_style += "ITALIC"; name_params.font.style(moderator_name_style); } if ( (ITALIC & moderator_body_style_value) != ITALIC ) @@ -1375,7 +1406,7 @@ void FSChatHistory::appendMessage(const LLChat& chat, const LLSD &args, const LL // FS-1734 seperate name and text styles for moderator if ( moderator_style_active ) { - timestamp_style.font.style(moderator_name_style); + timestamp_style.font.style(moderator_timestamp_style); } // FS-1734 seperate name and text styles for moderator appendText("[" + chat.mTimeStr + "] ", prependNewLineState, timestamp_style); @@ -1448,7 +1479,7 @@ void FSChatHistory::appendMessage(const LLChat& chat, const LLSD &args, const LL } } - name_params.use_default_link_style = (!moderator_style_active || moderator_name_style_value == 0); + name_params.use_default_link_style = false; name_params.link_href = LLSLURL("agent", chat.mFromID, "inspect").getSLURLString(); if (from_me && gSavedSettings.getBOOL("FSChatHistoryShowYou")) @@ -1466,7 +1497,7 @@ void FSChatHistory::appendMessage(const LLChat& chat, const LLSD &args, const LL if (delimiter.length() > 0 && delimiter[0] == ':') { LLStyle::Params delimiter_params(body_message_params); - delimiter_params.font.style = name_params.font.style; + delimiter_params.font.style = delimiter_style; appendText(":", prependNewLineState, delimiter_params); prependNewLineState = false; diff --git a/indra/newview/fsfloatercontacts.cpp b/indra/newview/fsfloatercontacts.cpp index 0a5f31ce85..ba91a8ebb6 100644 --- a/indra/newview/fsfloatercontacts.cpp +++ b/indra/newview/fsfloatercontacts.cpp @@ -49,6 +49,9 @@ #include "lltooldraganddrop.h" #include "llviewermenu.h" #include "llvoiceclient.h" +// [RLVa:KB] - @pay +#include "rlvactions.h" +// [/RLVa:KB] //Maximum number of people you can select to do an operation on at once. const U32 MAX_FRIEND_SELECT = 20; @@ -796,7 +799,7 @@ void FSFloaterContacts::refreshRightsChangeList() else { if (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWLOC) && - !gRlvHandler.isException(RLV_BHVR_TPLURE, *itr, RLV_CHECK_PERMISSIVE) && + !gRlvHandler.isException(RLV_BHVR_TPLURE, *itr, ERlvExceptionCheck::Permissive) && !friend_status->isRightGrantedTo(LLRelationship::GRANT_MAP_LOCATION)) { can_offer_teleport = false; @@ -840,7 +843,6 @@ void FSFloaterContacts::refreshUI() //Options that can only be performed with one friend selected childSetEnabled("profile_btn", single_selected && !multiple_selected); - childSetEnabled("pay_btn", single_selected && !multiple_selected); //Options that can be performed with up to MAX_FRIEND_SELECT friends selected //(single_selected will always be true in this situations) @@ -849,12 +851,15 @@ void FSFloaterContacts::refreshUI() LLScrollListItem* selected_item = mFriendsList->getFirstSelected(); bool mappable = false; + bool payable = false; if (selected_item) { LLUUID av_id = selected_item->getUUID(); mappable = (single_selected && !multiple_selected && av_id.notNull() && is_agent_mappable(av_id)); + payable = (single_selected && !multiple_selected && av_id.notNull() && RlvActions::canPayAvatar(av_id)); } childSetEnabled("map_btn", mappable && !gRlvHandler.hasBehaviour(RLV_BHVR_SHOWWORLDMAP)); + childSetEnabled("pay_btn", payable); // Set friend count mFriendsTab->getChild("friend_count")->setTextArg("COUNT", llformat("%d", mFriendsList->getItemCount())); @@ -1088,7 +1093,8 @@ void FSFloaterContacts::childShowTab(const std::string& id, const std::string& t void FSFloaterContacts::updateRlvRestrictions(ERlvBehaviour behavior) { if (behavior == RLV_BHVR_SHOWLOC || - behavior == RLV_BHVR_SHOWWORLDMAP) + behavior == RLV_BHVR_SHOWWORLDMAP || + behavior == RLV_BHVR_PAY) { refreshUI(); } diff --git a/indra/newview/fsfloaterim.cpp b/indra/newview/fsfloaterim.cpp index 4ebc1d6be3..d63c509230 100644 --- a/indra/newview/fsfloaterim.cpp +++ b/indra/newview/fsfloaterim.cpp @@ -545,7 +545,7 @@ void FSFloaterIM::sendMsg(const std::string& msg) if (fRlvFilter) { - utf8_text = RlvStrings::getString(RLV_STRING_BLOCKED_SENDIM); + utf8_text = RlvStrings::getString(RlvStringKeys::Blocked::SendIm); } } // [/RLVa:KB] diff --git a/indra/newview/fsnearbychathub.cpp b/indra/newview/fsnearbychathub.cpp index fa08908cf5..3a49944f36 100644 --- a/indra/newview/fsnearbychathub.cpp +++ b/indra/newview/fsnearbychathub.cpp @@ -613,8 +613,7 @@ void FSNearbyChat::handleChatBarKeystroke(LLUICtrl* source, S32 channel /* = 0 * static LLCachedControl allow_mu_pose(gSavedSettings, "AllowMUpose"); if (length > 0 && ((raw_text[0] != '/' || (type_during_emote && length > 3 && prefix == utf8string_to_wstring("/me") && (raw_text[3] == ' ' || raw_text[3] == '\''))) - && (raw_text[0] != ':' || !allow_mu_pose || type_during_emote)) && - !gRlvHandler.hasBehaviour(RLV_BHVR_REDIRCHAT)) + && (raw_text[0] != ':' || !allow_mu_pose || type_during_emote))) { // only start typing animation if we are chatting without / on channel 0 -Zi if (channel == 0) diff --git a/indra/newview/fspanelprofile.cpp b/indra/newview/fspanelprofile.cpp index 34f656d6d0..d4081fb6d5 100644 --- a/indra/newview/fspanelprofile.cpp +++ b/indra/newview/fspanelprofile.cpp @@ -719,7 +719,7 @@ void FSPanelProfileSecondLife::updateButtons() { const LLRelationship* friend_status = LLAvatarTracker::instance().getBuddyInfo(av_id); bool can_offer_tp = (!gRlvHandler.hasBehaviour(RLV_BHVR_SHOWLOC) || - (gRlvHandler.isException(RLV_BHVR_TPLURE, av_id, RLV_CHECK_PERMISSIVE) || + (gRlvHandler.isException(RLV_BHVR_TPLURE, av_id, ERlvExceptionCheck::Permissive) || friend_status->isRightGrantedTo(LLRelationship::GRANT_MAP_LOCATION))); mTeleportButton->setEnabled(is_buddy_online && can_offer_tp); @@ -729,7 +729,7 @@ void FSPanelProfileSecondLife::updateButtons() else { bool can_offer_tp = (!gRlvHandler.hasBehaviour(RLV_BHVR_SHOWLOC) || - gRlvHandler.isException(RLV_BHVR_TPLURE, av_id, RLV_CHECK_PERMISSIVE)); + gRlvHandler.isException(RLV_BHVR_TPLURE, av_id, ERlvExceptionCheck::Permissive)); mTeleportButton->setEnabled(can_offer_tp); mAddFriendButton->setEnabled(true); } diff --git a/indra/newview/fsradarmenu.cpp b/indra/newview/fsradarmenu.cpp index 0e1784ae6d..5fbd3e3f6c 100644 --- a/indra/newview/fsradarmenu.cpp +++ b/indra/newview/fsradarmenu.cpp @@ -39,6 +39,7 @@ #include "llcallingcard.h" // for LLAvatarTracker #include "llnetmap.h" #include "llviewermenu.h" // for gMenuHolder +#include "rlvactions.h" #include "rlvhandler.h" namespace FSFloaterRadarMenu @@ -228,6 +229,11 @@ bool FSRadarMenu::enableContextMenuItem(const LLSD& userdata) { return (!gRlvHandler.hasBehaviour(RLV_BHVR_SHOWINV)); } + else if (item == std::string("can_pay")) + { + const LLUUID& id = mUUIDs.front(); + return RlvActions::canPayAvatar(id); + } return false; } diff --git a/indra/newview/fsslurl.cpp b/indra/newview/fsslurl.cpp index a07f2700fa..4638789e71 100644 --- a/indra/newview/fsslurl.cpp +++ b/indra/newview/fsslurl.cpp @@ -605,7 +605,7 @@ std::string LLSLURL::getSLURLString() const // [RLVa:KB] - Checked: 2010-04-05 (RLVa-1.2.0d) | Added: RLVa-1.2.0d ret.append( ( ((!gRlvHandler.hasBehaviour(RLV_BHVR_SHOWLOC)) || (!RlvUtil::isNearbyRegion(mRegion))) ? (LLURI::escape(mRegion) + llformat("/%d/%d/%d",x,y,z)) - : RlvStrings::getString(RLV_STRING_HIDDEN_REGION) )); + : RlvStrings::getString(RlvStringKeys::Hidden::Region) )); // [/RLVa:KB] LL_DEBUGS("SLURL") << "Location: " << ret << LL_ENDL; return ret; diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp index 4f32670c44..428dbf75a9 100644 --- a/indra/newview/llagent.cpp +++ b/indra/newview/llagent.cpp @@ -1019,9 +1019,7 @@ void LLAgent::setRegion(LLViewerRegion *regionp) if (mRegionp != regionp) { - std::string ip = regionp->getHost().getString(); - LL_INFOS("AgentLocation") << "Moving agent into region: " << regionp->getName() - << " located at " << ip << LL_ENDL; + LL_INFOS("AgentLocation") << "Moving agent into region: " << regionp->getName() << LL_ENDL; if (mRegionp) { // NaCl - Antispam Registry clear anti-spam queues when changing regions @@ -2381,6 +2379,13 @@ BOOL LLAgent::needsRenderHead() //----------------------------------------------------------------------------- void LLAgent::startTyping() { +// [RLVa:KB] - @redirchat + if (!RlvActions::canSendTypingStart()) + { + return; + } +// [/RLVa:KB] + mTypingTimer.reset(); if (getRenderState() & AGENT_STATE_TYPING) @@ -4800,7 +4805,7 @@ void LLAgent::teleportViaLandmark(const LLUUID& landmark_asset_id) : gRlvHandler.hasBehaviour(RLV_BHVR_TPLM) && gRlvHandler.hasBehaviour(RLV_BHVR_TPLOC) ) || ((gRlvHandler.hasBehaviour(RLV_BHVR_UNSIT)) && (isAgentAvatarValid()) && (gAgentAvatarp->isSitting())) )) { - RlvUtil::notifyBlocked(RLV_STRING_BLOCKED_TELEPORT); + RlvUtil::notifyBlocked(RlvStringKeys::Blocked::Teleport); return; } // [/RLVa:KB] @@ -4915,7 +4920,7 @@ void LLAgent::teleportViaLocation(const LLVector3d& pos_global) if ( (RlvActions::isLocalTp(pos_global)) ? !RlvActions::canTeleportToLocal(pos_global) : !RlvActions::canTeleportToLocation() ) { - RlvUtil::notifyBlocked(RLV_STRING_BLOCKED_TELEPORT); + RlvUtil::notifyBlocked(RlvStringKeys::Blocked::Teleport); return; } @@ -5000,7 +5005,7 @@ void LLAgent::teleportViaLocationLookAt(const LLVector3d& pos_global, const LLVe if ( (RlvActions::isLocalTp(pos_global)) ? !RlvActions::canTeleportToLocal(pos_global) : !RlvActions::canTeleportToLocation() ) { - RlvUtil::notifyBlocked(RLV_STRING_BLOCKED_TELEPORT); + RlvUtil::notifyBlocked(RlvStringKeys::Blocked::Teleport); return; } diff --git a/indra/newview/llagentcamera.cpp b/indra/newview/llagentcamera.cpp index 6df8abbc10..0bd8fbfa21 100644 --- a/indra/newview/llagentcamera.cpp +++ b/indra/newview/llagentcamera.cpp @@ -388,6 +388,18 @@ void LLAgentCamera::resetView(BOOL reset_camera, BOOL change_camera, BOOL moveme // FIRE-8798: Option to prevent camera reset on movement } // + + if (LLSelectMgr::getInstance()->mAllowSelectAvatar) + { + // resetting camera also resets position overrides in debug mode 'AllowSelectAvatar' + LLObjectSelectionHandle selected_handle = LLSelectMgr::getInstance()->getSelection(); + if (selected_handle->getObjectCount() == 1 + && selected_handle->getFirstObject() != NULL + && selected_handle->getFirstObject()->isAvatar()) + { + LLSelectMgr::getInstance()->resetObjectOverrides(selected_handle); + } + } } // Allow camera to be moved somewhere other than behind avatar. diff --git a/indra/newview/llagentui.cpp b/indra/newview/llagentui.cpp index d6d7f71b88..a27ae92ba4 100644 --- a/indra/newview/llagentui.cpp +++ b/indra/newview/llagentui.cpp @@ -136,8 +136,8 @@ BOOL LLAgentUI::buildLocationString(std::string& str, ELocationFormat fmt,const // RELEASE-RLVa: [SL-2.0.0] Check ELocationFormat to make sure our switch still makes sense if (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWLOC)) { - parcel_name = RlvStrings::getString(RLV_STRING_HIDDEN_PARCEL); - region_name = RlvStrings::getString(RLV_STRING_HIDDEN_REGION); + parcel_name = RlvStrings::getString(RlvStringKeys::Hidden::Parcel); + region_name = RlvStrings::getString(RlvStringKeys::Hidden::Region); if (LOCATION_FORMAT_NO_MATURITY == fmt) fmt = LOCATION_FORMAT_LANDMARK; else if (LOCATION_FORMAT_FULL == fmt || LOCATION_FORMAT_V1 == fmt || LOCATION_FORMAT_V1_NO_COORDS == fmt) diff --git a/indra/newview/llappcorehttp.cpp b/indra/newview/llappcorehttp.cpp index bb21cb7026..30464e2f08 100644 --- a/indra/newview/llappcorehttp.cpp +++ b/indra/newview/llappcorehttp.cpp @@ -533,20 +533,20 @@ void LLAppCoreHttp::refreshSettings(bool initial) LLCore::HttpStatus LLAppCoreHttp::sslVerify(const std::string &url, const LLCore::HttpHandler::ptr_t &handler, void *appdata) { - X509_STORE_CTX *ctx = static_cast(appdata); - LLCore::HttpStatus result; - LLPointer store = gSecAPIHandler->getCertificateStore(""); - LLPointer chain = gSecAPIHandler->getCertificateChain(ctx); - LLSD validation_params = LLSD::emptyMap(); - LLURI uri(url); + LLCore::HttpStatus result; + try + { + X509_STORE_CTX *ctx = static_cast(appdata); + LLPointer store = gSecAPIHandler->getCertificateStore(""); + LLPointer chain = gSecAPIHandler->getCertificateChain(ctx); + LLSD validation_params = LLSD::emptyMap(); + LLURI uri(url); - validation_params[CERT_HOSTNAME] = uri.hostName(); + validation_params[CERT_HOSTNAME] = uri.hostName(); - // *TODO: In the case of an exception while validating the cert, we need a way - // to pass the offending(?) cert back out. *Rider* + // *TODO: In the case of an exception while validating the cert, we need a way + // to pass the offending(?) cert back out. *Rider* - try - { // don't validate hostname. Let libcurl do it instead. That way, it'll handle redirects store->validate(VALIDATION_POLICY_SSL & (~VALIDATION_POLICY_HOSTNAME), chain, validation_params); } diff --git a/indra/newview/llappdelegate-objc.mm b/indra/newview/llappdelegate-objc.mm index 69cc5811aa..7bd94a0f03 100644 --- a/indra/newview/llappdelegate-objc.mm +++ b/indra/newview/llappdelegate-objc.mm @@ -296,6 +296,7 @@ struct AttachmentInfo std::vector info{ AttachmentInfo(metadata.logFilePathname, "text/plain"), AttachmentInfo(metadata.userSettingsPathname, "text/xml"), + AttachmentInfo(metadata.accountSettingsPathname, "text/xml"), AttachmentInfo(metadata.staticDebugPathname, "text/xml") }; diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp index 0f3f18bc20..cc320f31fd 100644 --- a/indra/newview/llappearancemgr.cpp +++ b/indra/newview/llappearancemgr.cpp @@ -4017,6 +4017,10 @@ void LLAppearanceMgr::serverAppearanceUpdateCoro(LLCoreHttpUtil::HttpCoroutineAd } llcoro::suspend(); + if (LLApp::isQuitting()) + { + return; + } S32 retryCount(0); bool bRetry; do @@ -4080,6 +4084,11 @@ void LLAppearanceMgr::serverAppearanceUpdateCoro(LLCoreHttpUtil::HttpCoroutineAd LLSD result = httpAdapter->postAndSuspend(httpRequest, url, postData); + if (LLApp::isQuitting()) + { + return; + } + LLSD httpResults = result[LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS]; LLCore::HttpStatus status = LLCoreHttpUtil::HttpCoroutineAdapter::getStatusFromLLSD(httpResults); @@ -4115,6 +4124,10 @@ void LLAppearanceMgr::serverAppearanceUpdateCoro(LLCoreHttpUtil::HttpCoroutineAd LL_WARNS("Avatar") << "Bake retry #" << retryCount << " in " << timeout << " seconds." << LL_ENDL; llcoro::suspendUntilTimeout(timeout); + if (LLApp::isQuitting()) + { + return; + } bRetry = true; continue; } diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index 1afa75e047..df28d954ca 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -425,7 +425,10 @@ const std::string ERROR_MARKER_FILE_NAME(SAFE_FILE_NAME_PREFIX + ".error_marker" const std::string LLERROR_MARKER_FILE_NAME(SAFE_FILE_NAME_PREFIX + ".llerror_marker"); //FS orig modified LL const std::string LOGOUT_MARKER_FILE_NAME(SAFE_FILE_NAME_PREFIX + ".logout_marker"); //FS orig modified LL -static BOOL gDoDisconnect = FALSE; +//static BOOL gDoDisconnect = FALSE; +// [RLVa:KB] - Checked: RLVa-2.3 +BOOL gDoDisconnect = FALSE; +// [/RLVa:KB] static std::string gLaunchFileOnQuit; // Used on Win32 for other apps to identify our window (eg, win_setup) @@ -956,7 +959,7 @@ bool LLAppViewer::init() LLFile::remove(per_user_dir_glob + "filters.xml"); LLFile::remove(per_user_dir_glob + "medialist.xml"); LLFile::remove(per_user_dir_glob + "plugin_cookies.xml"); - LLFile::remove(per_user_dir_glob + "screen_last.bmp"); + LLFile::remove(per_user_dir_glob + "screen_last*.*"); LLFile::remove(per_user_dir_glob + "search_history.xml"); LLFile::remove(per_user_dir_glob + "settings_friends_groups.xml"); LLFile::remove(per_user_dir_glob + "settings_per_account.xml"); @@ -3428,7 +3431,7 @@ bool LLAppViewer::initConfiguration() } // [RLVa:KB] - Patch: RLVa-2.1.0 - if (LLControlVariable* pControl = gSavedSettings.getControl(RLV_SETTING_MAIN)) + if (LLControlVariable* pControl = gSavedSettings.getControl(RlvSettingNames::Main)) { if ( (pControl->getValue().asBoolean()) && (pControl->hasUnsavedValue()) ) { @@ -3779,9 +3782,8 @@ LLSD LLAppViewer::getViewerInfo() const info["POSITION"] = ll_sd_from_vector3d(pos); info["POSITION_LOCAL"] = ll_sd_from_vector3(gAgent.getPosAgentFromGlobal(pos)); info["REGION"] = gAgent.getRegion()->getName(); - info["HOSTNAME"] = gAgent.getRegion()->getHost().getHostName(); - info["HOSTIP"] = gAgent.getRegion()->getHost().getString(); -// info["SERVER_VERSION"] = gLastVersionChannel; + boost::regex regex("\\.(secondlife|lindenlab)\\..*"); + info["HOSTNAME"] = boost::regex_replace(gAgent.getRegion()->getHost().getHostName(), regex, ""); LLSLURL slurl; LLAgentUI::buildSLURL(slurl); info["SLURL"] = slurl.getSLURLString(); @@ -3789,7 +3791,7 @@ LLSD LLAppViewer::getViewerInfo() const } else { - info["REGION"] = RlvStrings::getString(RLV_STRING_HIDDEN_REGION); + info["REGION"] = RlvStrings::getString(RlvStringKeys::Hidden::Region); } info["SERVER_VERSION"] = gLastVersionChannel; // [/RLVa:KB] @@ -5722,13 +5724,14 @@ void LLAppViewer::idle() // return; } + + gViewerWindow->updateUI(); + if (gTeleportDisplay) { return; } - gViewerWindow->updateUI(); - /////////////////////////////////////// // Agent and camera movement // diff --git a/indra/newview/llappviewermacosx-for-objc.h b/indra/newview/llappviewermacosx-for-objc.h index 37e8a3917a..79c3efff91 100644 --- a/indra/newview/llappviewermacosx-for-objc.h +++ b/indra/newview/llappviewermacosx-for-objc.h @@ -41,6 +41,7 @@ struct CrashMetadata { std::string logFilePathname; std::string userSettingsPathname; + std::string accountSettingsPathname; std::string staticDebugPathname; std::string OSInfo; std::string agentFullname; diff --git a/indra/newview/llappviewermacosx.cpp b/indra/newview/llappviewermacosx.cpp index 3111540a13..662164af2d 100644 --- a/indra/newview/llappviewermacosx.cpp +++ b/indra/newview/llappviewermacosx.cpp @@ -199,10 +199,11 @@ CrashMetadataSingleton::CrashMetadataSingleton() else { LL_INFOS() << "Metadata from '" << staticDebugPathname << "':" << LL_ENDL; - logFilePathname = get_metadata(info, "SLLog"); - userSettingsPathname = get_metadata(info, "SettingsFilename"); - OSInfo = get_metadata(info, "OSInfo"); - agentFullname = get_metadata(info, "LoginName"); + logFilePathname = get_metadata(info, "SLLog"); + userSettingsPathname = get_metadata(info, "SettingsFilename"); + accountSettingsPathname = get_metadata(info, "PerAccountSettingsFilename"); + OSInfo = get_metadata(info, "OSInfo"); + agentFullname = get_metadata(info, "LoginName"); // Translate underscores back to spaces LLStringUtil::replaceChar(agentFullname, '_', ' '); regionName = get_metadata(info, "CurrentRegion"); diff --git a/indra/newview/llappviewerwin32.cpp b/indra/newview/llappviewerwin32.cpp index 9231ec0921..f56cbcd089 100644 --- a/indra/newview/llappviewerwin32.cpp +++ b/indra/newview/llappviewerwin32.cpp @@ -177,19 +177,29 @@ namespace // name and on the other hand a Linden will not likely ever crash on Firestom. sBugSplatSender->setDefaultUserName( WCSTR("Crash.Linden") ); - // Only send avatar name if enabled via prefs - if (gCrashSettings.getBOOL("CrashSubmitName")) + if (gAgentAvatarp) { - // - if (gAgentAvatarp) + // Only send avatar name if enabled via prefs + if (gCrashSettings.getBOOL("CrashSubmitName")) + // { // user name, when we have it sBugSplatSender->setDefaultUserName(WCSTR(gAgentAvatarp->getFullname())); + // Only send avatar name if enabled via prefs } - // Only send avatar name if enabled via prefs + // + + // Only include if sending settings file + //sBugSplatSender->sendAdditionalFile( + // WCSTR(gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, "settings_per_account.xml"))); + if (gCrashSettings.getBOOL("CrashSubmitSettings")) + { + sBugSplatSender->sendAdditionalFile( + WCSTR(gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, "settings_per_account.xml"))); + } + // } - // - + // LL_ERRS message, when there is one sBugSplatSender->setDefaultUserDescription(WCSTR(LLError::getFatalMessage())); diff --git a/indra/newview/llavataractions.cpp b/indra/newview/llavataractions.cpp index 98788a2cc8..dc8b1f7633 100644 --- a/indra/newview/llavataractions.cpp +++ b/indra/newview/llavataractions.cpp @@ -248,7 +248,7 @@ void LLAvatarActions::startIM(const LLUUID& id) if (!RlvActions::canStartIM(id)) { make_ui_sound("UISndInvalidOp"); - RlvUtil::notifyBlocked(RLV_STRING_BLOCKED_STARTIM, LLSD().with("RECIPIENT", LLSLURL("agent", id, "completename").getSLURLString())); + RlvUtil::notifyBlocked(RlvStringKeys::Blocked::StartIm, LLSD().with("RECIPIENT", LLSLURL("agent", id, "completename").getSLURLString())); return; } // [/RLVa:KB] @@ -293,7 +293,7 @@ void LLAvatarActions::startCall(const LLUUID& id) if (!RlvActions::canStartIM(id)) { make_ui_sound("UISndInvalidOp"); - RlvUtil::notifyBlocked(RLV_STRING_BLOCKED_STARTIM, LLSD().with("RECIPIENT", LLSLURL("agent", id, "completename").getSLURLString())); + RlvUtil::notifyBlocked(RlvStringKeys::Blocked::StartIm, LLSD().with("RECIPIENT", LLSLURL("agent", id, "completename").getSLURLString())); return; } // [/RLVa:KB] @@ -325,7 +325,7 @@ const LLUUID LLAvatarActions::startAdhocCall(const uuid_vec_t& ids, const LLUUID if (!RlvActions::canStartIM(idAgent)) { make_ui_sound("UISndInvalidOp"); - RlvUtil::notifyBlocked(RLV_STRING_BLOCKED_STARTCONF); + RlvUtil::notifyBlocked(RlvStringKeys::Blocked::StartConference); return LLUUID::null; } id_array.push_back(idAgent); @@ -391,7 +391,7 @@ const LLUUID LLAvatarActions::startConference(const uuid_vec_t& ids, const LLUUI if (!RlvActions::canStartIM(idAgent)) { make_ui_sound("UISndInvalidOp"); - RlvUtil::notifyBlocked(RLV_STRING_BLOCKED_STARTCONF); + RlvUtil::notifyBlocked(RlvStringKeys::Blocked::StartConference); return LLUUID::null; } id_array.push_back(idAgent); @@ -565,7 +565,7 @@ void LLAvatarActions::teleport_request_callback(const LLSD& notification, const // Filter the request message if the recipients is IM-blocked if ( (RlvActions::isRlvEnabled()) && ((!RlvActions::canStartIM(idRecipient)) || (!RlvActions::canSendIM(idRecipient))) ) { - strMessage = RlvStrings::getString(RLV_STRING_HIDDEN); + strMessage = RlvStrings::getString(RlvStringKeys::Hidden::Generic); } // [/RLVa:KB] @@ -1246,7 +1246,7 @@ bool LLAvatarActions::canOfferTeleport(const LLUUID& id) if (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWLOC)) { const LLRelationship* pBuddyInfo = LLAvatarTracker::instance().getBuddyInfo(id); - if (gRlvHandler.isException(RLV_BHVR_TPLURE, id, RLV_CHECK_PERMISSIVE) || + if (gRlvHandler.isException(RLV_BHVR_TPLURE, id, ERlvExceptionCheck::Permissive) || (pBuddyInfo && pBuddyInfo->isOnline() && pBuddyInfo->isRightGrantedTo(LLRelationship::GRANT_MAP_LOCATION))) { return true; diff --git a/indra/newview/llchathistory.cpp b/indra/newview/llchathistory.cpp index e590e2fb27..ad59fcc4d2 100644 --- a/indra/newview/llchathistory.cpp +++ b/indra/newview/llchathistory.cpp @@ -69,6 +69,7 @@ #include "llviewermenu.h" #include "llviewerobjectlist.h" // [RLVa:KB] - Checked: 2010-04-22 (RLVa-1.2.0f) +#include "rlvactions.h" #include "rlvcommon.h" // [/RLVa:KB] @@ -489,6 +490,12 @@ public: { return canModerate(userdata); } +// [RLVa:KB] - @pay + else if (level == "can_pay") + { + return RlvActions::canPayAvatar(getAvatarId()); + } +// [/RLVa:KB] else if (level == "can_ban_member") { return canBanGroupMember(getAvatarId()); diff --git a/indra/newview/llchiclet.cpp b/indra/newview/llchiclet.cpp index e7f86f7111..ae54043cba 100644 --- a/indra/newview/llchiclet.cpp +++ b/indra/newview/llchiclet.cpp @@ -1996,6 +1996,10 @@ void LLScriptChiclet::onMenuItemClicked(const LLSD& user_data) { LLScriptFloaterManager::instance().removeNotification(getSessionId()); } + else if ("close all" == action) + { + LLIMWellWindow::getInstance()->closeAll(); + } } void LLScriptChiclet::createPopupMenu() diff --git a/indra/newview/llcompilequeue.cpp b/indra/newview/llcompilequeue.cpp index cc7003dc5c..bacd855e68 100644 --- a/indra/newview/llcompilequeue.cpp +++ b/indra/newview/llcompilequeue.cpp @@ -449,6 +449,13 @@ void LLFloaterCompileQueue::processExperienceIdResults(LLSD result, LLUUID paren bool LLFloaterCompileQueue::processScript(LLHandle hfloater, const LLPointer &object, LLInventoryObject* inventory, LLEventPump &pump) { + if (LLApp::isQuitting()) + { + // Reply from coroutine came on shutdown + // We are quiting, don't start any more coroutines! + return true; + } + LLSD result; LLCheckedHandle floater(hfloater); // Dereferencing floater may fail. If they do they throw LLExeceptionStaleHandle. @@ -502,6 +509,8 @@ bool LLFloaterCompileQueue::processScript(LLHandle hfloat } // + floater.check(); + if (result.has("timeout")) { // A timeout filed in the result will always be true if present. LLStringUtil::format_map_t args; @@ -525,6 +534,12 @@ bool LLFloaterCompileQueue::processScript(LLHandle hfloat } + if (!gAssetStorage) + { + // viewer likely is shutting down + return true; + } + { // [LSL PreProc] //HandleScriptUserData userData(pump.getName()); @@ -609,6 +624,8 @@ bool LLFloaterCompileQueue::processScript(LLHandle hfloat result = llcoro::suspendUntilEventOnWithTimeout(pump, fetch_timeout, LLSDMap("timeout", LLSD::Boolean(true))); + floater.check(); + if (result.has("timeout")) { // A timeout filed in the result will always be true if present. LLStringUtil::format_map_t args; @@ -1012,6 +1029,7 @@ void LLFloaterScriptQueue::objectScriptProcessingQueueCoro(std::string action, L // but offers no guarantee of doing so. llcoro::suspend(); } + floater.check(); } // Translation fixes diff --git a/indra/newview/llconversationloglist.cpp b/indra/newview/llconversationloglist.cpp index 7881681224..bf43e048fe 100644 --- a/indra/newview/llconversationloglist.cpp +++ b/indra/newview/llconversationloglist.cpp @@ -37,6 +37,9 @@ #include "llviewercontrol.h" // #include "llviewerwindow.h" #include "llwindow.h" +// [RLVa:KB] - @pay +#include "rlvactions.h" +// [/RLVa:KB] static LLDefaultChildRegistry::Register r("conversation_log_list"); @@ -397,6 +400,12 @@ bool LLConversationLogList::isActionEnabled(const LLSD& userdata) { return (is_p2p || is_group_member) && LLAvatarActions::canCall(); } +// [RLVa:KB] - @pay + else if ("can_pay" == command_name) + { + return is_p2p && RlvActions::canPayAvatar(selected_id); + } +// [/RLVa:KB] else if ("add_rem_friend" == command_name || "can_invite_to_group" == command_name || "can_share" == command_name || diff --git a/indra/newview/lldrawpool.h b/indra/newview/lldrawpool.h index 4eb9a4151d..b8562e9077 100644 --- a/indra/newview/lldrawpool.h +++ b/indra/newview/lldrawpool.h @@ -138,24 +138,24 @@ public: PASS_POST_BUMP, PASS_MATERIAL, PASS_MATERIAL_ALPHA, - PASS_MATERIAL_ALPHA_MASK, + PASS_MATERIAL_ALPHA_MASK, // Diffuse texture used as alpha mask PASS_MATERIAL_ALPHA_EMISSIVE, PASS_SPECMAP, PASS_SPECMAP_BLEND, - PASS_SPECMAP_MASK, + PASS_SPECMAP_MASK, // Diffuse texture used as alpha mask and specular texture(map) PASS_SPECMAP_EMISSIVE, PASS_NORMMAP, PASS_NORMMAP_BLEND, - PASS_NORMMAP_MASK, + PASS_NORMMAP_MASK, // Diffuse texture used as alpha mask and normal map PASS_NORMMAP_EMISSIVE, PASS_NORMSPEC, PASS_NORMSPEC_BLEND, - PASS_NORMSPEC_MASK, + PASS_NORMSPEC_MASK, // Diffuse texture used as alpha mask with normal and specular map PASS_NORMSPEC_EMISSIVE, PASS_GLOW, PASS_ALPHA, PASS_ALPHA_MASK, - PASS_FULLBRIGHT_ALPHA_MASK, + PASS_FULLBRIGHT_ALPHA_MASK, // Diffuse texture used as alpha mask and fullbright PASS_ALPHA_INVISIBLE, NUM_RENDER_TYPES, }; diff --git a/indra/newview/lldrawpoolalpha.cpp b/indra/newview/lldrawpoolalpha.cpp index 3750a217cc..cc76b2e094 100644 --- a/indra/newview/lldrawpoolalpha.cpp +++ b/indra/newview/lldrawpoolalpha.cpp @@ -319,11 +319,15 @@ void LLDrawPoolAlpha::render(S32 pass) LLVertexBuffer::MAP_TEXCOORD0); pushBatches(LLRenderPass::PASS_ALPHA_MASK, LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0, FALSE); - pushBatches(LLRenderPass::PASS_FULLBRIGHT_ALPHA_MASK, LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0, FALSE); pushBatches(LLRenderPass::PASS_ALPHA_INVISIBLE, LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0, FALSE); + // Material alpha mask gGL.diffuseColor4f(0, 0, 1, 1); pushBatches(LLRenderPass::PASS_MATERIAL_ALPHA_MASK, LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0, FALSE); + pushBatches(LLRenderPass::PASS_NORMMAP_MASK, LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0, FALSE); + pushBatches(LLRenderPass::PASS_SPECMAP_MASK, LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0, FALSE); + pushBatches(LLRenderPass::PASS_NORMSPEC_MASK, LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0, FALSE); + pushBatches(LLRenderPass::PASS_FULLBRIGHT_ALPHA_MASK, LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0, FALSE); gGL.diffuseColor4f(0, 1, 0, 1); pushBatches(LLRenderPass::PASS_INVISIBLE, LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0, FALSE); diff --git a/indra/newview/lldrawpoolavatar.cpp b/indra/newview/lldrawpoolavatar.cpp index 0ae1d7f92c..7427d74d64 100644 --- a/indra/newview/lldrawpoolavatar.cpp +++ b/indra/newview/lldrawpoolavatar.cpp @@ -1879,15 +1879,14 @@ bool LLDrawPoolAvatar::getRiggedGeometry( face->setGeomIndex(0); face->setIndicesIndex(0); - - //rigged faces do not batch textures - // if needed reset drawinfo as the face was set up for texture for batching - if (face->getTextureIndex() != 0xFF ) - face->setDrawInfo(nullptr); - // + if (face->getTextureIndex() != FACE_DO_NOT_BATCH_TEXTURES) + { + face->setDrawInfo(NULL); + } - face->setTextureIndex(255); + //rigged faces do not batch textures + face->setTextureIndex(FACE_DO_NOT_BATCH_TEXTURES); if (buffer.isNull() || buffer->getTypeMask() != data_mask || !buffer->isWriteable()) { diff --git a/indra/newview/llface.cpp b/indra/newview/llface.cpp index 556d71a4bf..aa99a91a43 100644 --- a/indra/newview/llface.cpp +++ b/indra/newview/llface.cpp @@ -156,7 +156,7 @@ void LLFace::init(LLDrawable* drawablep, LLViewerObject* objp) } mTEOffset = -1; - mTextureIndex = 255; + mTextureIndex = FACE_DO_NOT_BATCH_TEXTURES; setDrawable(drawablep); mVObjp = objp; @@ -191,6 +191,7 @@ void LLFace::destroy() if(mTexture[i].notNull()) { mTexture[i]->removeFace(i, this) ; + mTexture[i] = NULL; } } @@ -210,7 +211,6 @@ void LLFace::destroy() { mDrawPoolp->removeFace(this); } - mDrawPoolp = NULL; } @@ -219,7 +219,7 @@ void LLFace::destroy() delete mTextureMatrix; mTextureMatrix = NULL; - if (mDrawablep.notNull()) + if (mDrawablep) { LLSpatialGroup* group = mDrawablep->getSpatialGroup(); if (group) @@ -231,7 +231,7 @@ void LLFace::destroy() } setDrawInfo(NULL); - + mDrawablep = NULL; mVObjp = NULL; } @@ -476,13 +476,13 @@ void LLFace::setTextureIndex(U8 index) { mTextureIndex = index; - if (mTextureIndex != 255) + if (mTextureIndex != FACE_DO_NOT_BATCH_TEXTURES) { mDrawablep->setState(LLDrawable::REBUILD_POSITION); } else { - if (mDrawInfo && mDrawInfo->mTextureList.size() <= 1) + if (mDrawInfo && !mDrawInfo->mTextureList.empty()) { LL_ERRS() << "Face with no texture index references indexed texture draw info." << LL_ENDL; } @@ -558,7 +558,7 @@ void LLFace::updateCenterAgent() void LLFace::renderSelected(LLViewerTexture *imagep, const LLColor4& color) { - if (mDrawablep->getSpatialGroup() == NULL) + if (mDrawablep == NULL || mDrawablep->getSpatialGroup() == NULL) { return; } @@ -566,7 +566,7 @@ void LLFace::renderSelected(LLViewerTexture *imagep, const LLColor4& color) mDrawablep->getSpatialGroup()->rebuildGeom(); mDrawablep->getSpatialGroup()->rebuildMesh(); - if(mDrawablep.isNull() || mVertexBuffer.isNull()) + if(mVertexBuffer.isNull()) { return; } @@ -1639,7 +1639,7 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume, mVertexBuffer->bindForFeedback(0, LLVertexBuffer::TYPE_VERTEX, mGeomIndex, mGeomCount); - U8 index = mTextureIndex < 255 ? mTextureIndex : 0; + U8 index = mTextureIndex < FACE_DO_NOT_BATCH_TEXTURES ? mTextureIndex : 0; S32 val = 0; U8* vp = (U8*) &val; @@ -2188,7 +2188,7 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume, LLVector4a texIdx; - S32 index = mTextureIndex < 255 ? mTextureIndex : 0; + S32 index = mTextureIndex < FACE_DO_NOT_BATCH_TEXTURES ? mTextureIndex : 0; F32 val = 0.f; S32* vp = (S32*) &val; @@ -2798,7 +2798,7 @@ S32 LLFace::renderElements(const U16 *index_array) const S32 LLFace::renderIndexed() { - if(mDrawablep.isNull() || mDrawPoolp == NULL) + if(mDrawablep == NULL || mDrawPoolp == NULL) { return 0; } @@ -2908,7 +2908,7 @@ void LLFace::setDefaultTexture(U32 nChannel, bool fShowDefault) const if ((fUpdated) && (mDrawablep)) { gPipeline.markTextured(mDrawablep); - const_cast(mDrawablep.get())->updateTexture(); + mDrawablep->updateTexture(); } } diff --git a/indra/newview/llface.h b/indra/newview/llface.h index bf2f3ca343..bee6e35f92 100644 --- a/indra/newview/llface.h +++ b/indra/newview/llface.h @@ -53,6 +53,7 @@ class LLDrawInfo; const F32 MIN_ALPHA_SIZE = 1024.f; const F32 MIN_TEX_ANIM_SIZE = 512.f; +const U8 FACE_DO_NOT_BATCH_TEXTURES = 255; class LLFace : public LLTrace::MemTrackableNonVirtual { @@ -286,8 +287,13 @@ private: LLXformMatrix* mXform; LLPointer mTexture[LLRender::NUM_TEXTURE_CHANNELS]; - - LLPointer mDrawablep; + + // mDrawablep is not supposed to be null, don't use LLPointer because + // mDrawablep owns LLFace and LLPointer is a good way to either cause a + // memory leak or a 'delete each other' situation if something deletes + // drawable wrongly. + LLDrawable* mDrawablep; + // LLViewerObject technically owns drawable, but also it should be strictly managed LLPointer mVObjp; S32 mTEOffset; diff --git a/indra/newview/llfloaterbuycurrency.cpp b/indra/newview/llfloaterbuycurrency.cpp index cfc69a779f..ae07b30a1e 100644 --- a/indra/newview/llfloaterbuycurrency.cpp +++ b/indra/newview/llfloaterbuycurrency.cpp @@ -74,7 +74,6 @@ public: void onClickBuy(); void onClickCancel(); - void onClickErrorWeb(); }; LLFloater* LLFloaterBuyCurrency::buildFloater(const LLSD& key) @@ -132,7 +131,6 @@ BOOL LLFloaterBuyCurrencyUI::postBuild() getChild("buy_btn")->setCommitCallback( boost::bind(&LLFloaterBuyCurrencyUI::onClickBuy, this)); getChild("cancel_btn")->setCommitCallback( boost::bind(&LLFloaterBuyCurrencyUI::onClickCancel, this)); - getChild("error_web")->setCommitCallback( boost::bind(&LLFloaterBuyCurrencyUI::onClickErrorWeb, this)); center(); @@ -173,7 +171,6 @@ void LLFloaterBuyCurrencyUI::updateUI() // hide most widgets - we'll turn them on as needed next getChildView("info_buying")->setVisible(FALSE); - getChildView("info_cannot_buy")->setVisible(FALSE); getChildView("info_need_more")->setVisible(FALSE); getChildView("purchase_warning_repurchase")->setVisible(FALSE); getChildView("purchase_warning_notenough")->setVisible(FALSE); @@ -183,32 +180,16 @@ void LLFloaterBuyCurrencyUI::updateUI() if (hasError) { // display an error from the server - getChildView("normal_background")->setVisible(FALSE); - getChildView("error_background")->setVisible(TRUE); - getChildView("info_cannot_buy")->setVisible(TRUE); - getChildView("cannot_buy_message")->setVisible(TRUE); - getChildView("balance_label")->setVisible(FALSE); - getChildView("balance_amount")->setVisible(FALSE); - getChildView("buying_label")->setVisible(FALSE); - getChildView("buying_amount")->setVisible(FALSE); - getChildView("total_label")->setVisible(FALSE); - getChildView("total_amount")->setVisible(FALSE); - - LLTextBox* message = getChild("cannot_buy_message"); - if (message) - { - message->setText(mManager.errorMessage()); - } - - getChildView("error_web")->setVisible( !mManager.errorURI().empty()); + LLSD args; + args["TITLE"] = getString("info_cannot_buy"); + args["MESSAGE"] = mManager.errorMessage(); + LLNotificationsUtil::add("CouldNotBuyCurrency", args); + closeFloater(); } else { // display the main Buy L$ interface getChildView("normal_background")->setVisible(TRUE); - getChildView("error_background")->setVisible(FALSE); - getChildView("cannot_buy_message")->setVisible(FALSE); - getChildView("error_web")->setVisible(FALSE); if (mHasTarget) { @@ -283,14 +264,6 @@ void LLFloaterBuyCurrencyUI::onClickCancel() LLStatusBar::sendMoneyBalanceRequest(); } -void LLFloaterBuyCurrencyUI::onClickErrorWeb() -{ - LLWeb::loadURL(mManager.errorURI()); - closeFloater(); - // Update L$ balance - LLStatusBar::sendMoneyBalanceRequest(); -} - // static void LLFloaterBuyCurrency::buyCurrency() { diff --git a/indra/newview/llfloaterconversationpreview.cpp b/indra/newview/llfloaterconversationpreview.cpp index d89edd2775..3ea64a30c4 100644 --- a/indra/newview/llfloaterconversationpreview.cpp +++ b/indra/newview/llfloaterconversationpreview.cpp @@ -101,12 +101,8 @@ BOOL LLFloaterConversationPreview::postBuild() name = LLTrans::getString("NearbyChatTitle"); file = "chat"; } - // Remember used log file name mChatHistoryFileName = file; - if (mIsGroup) - { - mChatHistoryFileName += GROUP_CHAT_SUFFIX; - } + LLStringUtil::format_map_t args; args["[NAME]"] = name; std::string title = getString("Title", args); diff --git a/indra/newview/llfloaterimagepreview.cpp b/indra/newview/llfloaterimagepreview.cpp index d99e346570..110624a7fd 100644 --- a/indra/newview/llfloaterimagepreview.cpp +++ b/indra/newview/llfloaterimagepreview.cpp @@ -35,6 +35,7 @@ #include "llagent.h" #include "llbutton.h" +#include "llcheckboxctrl.h" #include "llcombobox.h" #include "lldrawable.h" #include "lldrawpoolavatar.h" @@ -120,17 +121,26 @@ BOOL LLFloaterImagePreview::postBuild() mSculptedPreview->setPreviewTarget(mRawImagep, 2.0f); // BUG-228331 - lossless_check is misleading don't show it if it won't be used. - // if (mRawImagep->getWidth() * mRawImagep->getHeight () <= LL_IMAGE_REZ_LOSSLESS_CUTOFF * LL_IMAGE_REZ_LOSSLESS_CUTOFF) - // getChildView("lossless_check")->setEnabled(TRUE); + //if (mRawImagep->getWidth() * mRawImagep->getHeight() <= LL_IMAGE_REZ_LOSSLESS_CUTOFF * LL_IMAGE_REZ_LOSSLESS_CUTOFF) + //{ + // // We want "lossless_check" to be unchecked when it is disabled, regardless of + // // LosslessJ2CUpload state, so only assign control when enabling checkbox + // LLCheckBoxCtrl* check_box = getChild("lossless_check"); + // check_box->setEnabled(TRUE); + // check_box->setControlVariable(gSavedSettings.getControl("LosslessJ2CUpload")); + //} if (mRawImagep->getWidth() * mRawImagep->getHeight () <= LL_IMAGE_REZ_LOSSLESS_CUTOFF * LL_IMAGE_REZ_LOSSLESS_CUTOFF) { - getChildView("lossless_check")->setEnabled(TRUE); - getChildView("lossless_check")->setVisible(TRUE); + LLCheckBoxCtrl* check_box = getChild("lossless_check"); + check_box->setEnabled(TRUE); + check_box->setVisible(TRUE); + check_box->setControlVariable(gSavedSettings.getControl("LosslessJ2CUpload")); } else { - getChildView("lossless_check")->setEnabled(FALSE); - getChildView("lossless_check")->setVisible(FALSE); + LLCheckBoxCtrl* check_box = getChild("lossless_check"); + check_box->setEnabled(FALSE); + check_box->setVisible(FALSE); } // diff --git a/indra/newview/llfloaterimcontainer.cpp b/indra/newview/llfloaterimcontainer.cpp index 81f596c862..222a27917d 100644 --- a/indra/newview/llfloaterimcontainer.cpp +++ b/indra/newview/llfloaterimcontainer.cpp @@ -57,6 +57,9 @@ #include "llsdserialize.h" #include "llviewermenu.h" // is_agent_mappable #include "llviewerobjectlist.h" +// [RLVa:KB] - @pay +#include "rlvactions.h" +// [/RLVa:KB] #include "boost/foreach.hpp" // @@ -457,7 +460,7 @@ void LLFloaterIMContainer::idleUpdate() while (current_participant_model != end_participant_model) { LLConversationItemParticipant* participant_model = dynamic_cast(*current_participant_model); - participant_model->setModeratorOptionsVisible(is_moderator && participant_model->getUUID() != gAgentID); + participant_model->setModeratorOptionsVisible(is_moderator); participant_model->setGroupBanVisible(can_ban && participant_model->getUUID() != gAgentID); current_participant_model++; @@ -1411,12 +1414,21 @@ bool LLFloaterIMContainer::enableContextMenuItem(const std::string& item, uuid_v { return is_single_select; } - - // Beyond that point, if only the user agent is selected, everything is disabled - if (is_single_select && (single_id == gAgentID)) - { - return false; - } + + bool is_moderator_option = ("can_moderate_voice" == item) || ("can_allow_text_chat" == item) || ("can_mute" == item) || ("can_unmute" == item); + + // Beyond that point, if only the user agent is selected, everything is disabled + if (is_single_select && (single_id == gAgentID)) + { + if (is_moderator_option) + { + return enableModerateContextMenuItem(item, true); + } + else + { + return false; + } + } // If the user agent is selected with others, everything is disabled for (uuid_vec_t::const_iterator id = uuids.begin(); id != uuids.end(); ++id) @@ -1428,11 +1440,20 @@ bool LLFloaterIMContainer::enableContextMenuItem(const std::string& item, uuid_v } // Handle all other options - if (("can_invite" == item) || ("can_chat_history" == item) || ("can_share" == item) || ("can_pay" == item)) +// if (("can_invite" == item) || ("can_chat_history" == item) || ("can_share" == item) || ("can_pay" == item)) +// [RLVa:KB] - @pay + if (("can_invite" == item) || ("can_chat_history" == item) || ("can_share" == item)) +// [/RLVa:KB] { // Those menu items are enable only if a single avatar is selected return is_single_select; } +// [RLVa:KB] - @pay + else if ("can_pay" == item) + { + return is_single_select && RlvActions::canPayAvatar(single_id); + } +// [/RLVa:KB] else if ("can_block" == item) { return (is_single_select ? LLAvatarActions::canBlock(single_id) : false); @@ -1482,11 +1503,11 @@ bool LLFloaterIMContainer::enableContextMenuItem(const std::string& item, uuid_v { return canBanSelectedMember(single_id); } - else if (("can_moderate_voice" == item) || ("can_allow_text_chat" == item) || ("can_mute" == item) || ("can_unmute" == item)) - { - // *TODO : get that out of here... - return enableModerateContextMenuItem(item); - } + else if (is_moderator_option) + { + // *TODO : get that out of here... + return enableModerateContextMenuItem(item); + } // By default, options that not explicitely disabled are enabled return true; @@ -1856,7 +1877,7 @@ LLConversationViewParticipant* LLFloaterIMContainer::createConversationViewParti return LLUICtrlFactory::create(params); } -bool LLFloaterIMContainer::enableModerateContextMenuItem(const std::string& userdata) +bool LLFloaterIMContainer::enableModerateContextMenuItem(const std::string& userdata, bool is_self) { // only group moderators can perform actions related to this "enable callback" if (!isGroupModerator()) @@ -1876,7 +1897,7 @@ bool LLFloaterIMContainer::enableModerateContextMenuItem(const std::string& user { return voice_channel; } - else if ("can_mute" == userdata) + else if (("can_mute" == userdata) && !is_self) { return voice_channel && !isMuted(getCurSelectedViewModelItem()->getUUID()); } @@ -1886,7 +1907,7 @@ bool LLFloaterIMContainer::enableModerateContextMenuItem(const std::string& user } // The last invoke is used to check whether the "can_allow_text_chat" will enabled - return LLVoiceClient::getInstance()->isParticipantAvatar(getCurSelectedViewModelItem()->getUUID()); + return LLVoiceClient::getInstance()->isParticipantAvatar(getCurSelectedViewModelItem()->getUUID()) && !is_self; } bool LLFloaterIMContainer::isGroupModerator() diff --git a/indra/newview/llfloaterimcontainer.h b/indra/newview/llfloaterimcontainer.h index 1ff65ca46f..85da69cbc6 100644 --- a/indra/newview/llfloaterimcontainer.h +++ b/indra/newview/llfloaterimcontainer.h @@ -166,7 +166,7 @@ private: void doToSelectedGroup(const LLSD& userdata); static void confirmMuteAllCallback(const LLSD& notification, const LLSD& response); - bool enableModerateContextMenuItem(const std::string& userdata); + bool enableModerateContextMenuItem(const std::string& userdata, bool is_self = false); LLSpeaker * getSpeakerOfSelectedParticipant(LLSpeakerMgr * speaker_managerp); LLSpeakerMgr * getSpeakerMgrForSelectedParticipant(); bool isGroupModerator(); diff --git a/indra/newview/llfloaterimnearbychat.cpp b/indra/newview/llfloaterimnearbychat.cpp index 3e117af817..5225473cf6 100644 --- a/indra/newview/llfloaterimnearbychat.cpp +++ b/indra/newview/llfloaterimnearbychat.cpp @@ -478,10 +478,7 @@ void LLFloaterIMNearbyChat::onChatBoxKeystroke() S32 length = raw_text.length(); -// if( (length > 0) && (raw_text[0] != '/') ) // forward slash is used for escape (eg. emote) sequences -// [RLVa:KB] - Checked: 2010-03-26 (RLVa-1.2.0b) | Modified: RLVa-1.0.0d - if ( (length > 0) && (raw_text[0] != '/') && (!RlvActions::hasBehaviour(RLV_BHVR_REDIRCHAT)) ) -// [/RLVa:KB] + if( (length > 0) && (raw_text[0] != '/') ) // forward slash is used for escape (eg. emote) sequences { gAgent.startTyping(); } diff --git a/indra/newview/llfloaterimsession.cpp b/indra/newview/llfloaterimsession.cpp index 1d1c57489f..76900697bc 100644 --- a/indra/newview/llfloaterimsession.cpp +++ b/indra/newview/llfloaterimsession.cpp @@ -322,7 +322,7 @@ void LLFloaterIMSession::sendMsg(const std::string& msg) if (fRlvFilter) { - utf8_text = RlvStrings::getString(RLV_STRING_BLOCKED_SENDIM); + utf8_text = RlvStrings::getString(RlvStringKeys::Blocked::SendIm); } } // [/RLVa:KB] diff --git a/indra/newview/llfloaterperms.cpp b/indra/newview/llfloaterperms.cpp index e554559e58..3ccf20cf17 100644 --- a/indra/newview/llfloaterperms.cpp +++ b/indra/newview/llfloaterperms.cpp @@ -184,8 +184,6 @@ void LLFloaterPermsDefault::sendInitialPerms() // { updateCap(); - // Set cap sent = true only on success to allow re-transmit on region change - //setCapSent(true); } } @@ -247,7 +245,10 @@ void LLFloaterPermsDefault::updateCapCoro(std::string url) { const std::string& reason = status.toString(); // Do not display the same error more than once in a row - if (reason != previousReason) + // Getter for CapSent + //if ((reason != previousReason) && mCapSent) + if ((reason != previousReason) && sCapSent) + // { previousReason = reason; LLSD args; diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp index abc2606fee..62b3178088 100644 --- a/indra/newview/llfloaterpreference.cpp +++ b/indra/newview/llfloaterpreference.cpp @@ -1632,6 +1632,7 @@ void LLFloaterPreference::onBtnCancel(const LLSD& userdata) if (userdata.asString() == "closeadvanced") { LLFloaterReg::hideInstance("prefs_graphics_advanced"); + updateMaxComplexity(); } else { @@ -3128,6 +3129,9 @@ void LLFloaterPreference::setPersonalInfo(const std::string& visibility, bool im // Clear Cache button actually clears per-account cache items getChildView("clear_webcache")->setEnabled(TRUE); + + getChild("voice_call_friends_only_check")->setEnabled(TRUE); + getChild("voice_call_friends_only_check")->setValue(gSavedPerAccountSettings.getBOOL("VoiceCallsFriendsOnly")); } @@ -3318,6 +3322,14 @@ void LLFloaterPreference::updateMaxComplexity() LLAvatarComplexityControls::updateMax( getChild("IndirectMaxComplexity"), getChild("IndirectMaxComplexityText")); + + LLFloaterPreferenceGraphicsAdvanced* floater_graphics_advanced = LLFloaterReg::findTypedInstance("prefs_graphics_advanced"); + if (floater_graphics_advanced) + { + LLAvatarComplexityControls::updateMax( + floater_graphics_advanced->getChild("IndirectMaxComplexity"), + floater_graphics_advanced->getChild("IndirectMaxComplexityText")); + } } bool LLFloaterPreference::loadFromFilename(const std::string& filename, std::map &label_map) @@ -3365,6 +3377,14 @@ void LLFloaterPreferenceGraphicsAdvanced::updateMaxComplexity() LLAvatarComplexityControls::updateMax( getChild("IndirectMaxComplexity"), getChild("IndirectMaxComplexityText")); + + LLFloaterPreference* floater_preferences = LLFloaterReg::findTypedInstance("preferences"); + if (floater_preferences) + { + LLAvatarComplexityControls::updateMax( + floater_preferences->getChild("IndirectMaxComplexity"), + floater_preferences->getChild("IndirectMaxComplexityText")); + } } void LLFloaterPreference::onChangeMaturity() @@ -3986,9 +4006,13 @@ void LLPanelPreference::showMultipleViewersWarning(LLUICtrl* checkbox, const LLS void LLPanelPreference::showFriendsOnlyWarning(LLUICtrl* checkbox, const LLSD& value) { - if (checkbox && checkbox->getValue()) + if (checkbox) { - LLNotificationsUtil::add("FriendsAndGroupsOnly"); + gSavedPerAccountSettings.setBOOL("VoiceCallsFriendsOnly", checkbox->getValue().asBoolean()); + if (checkbox->getValue()) + { + LLNotificationsUtil::add("FriendsAndGroupsOnly"); + } } } // Manage the custom port alert, fixes Cant Close bug. -WoLf @@ -4159,7 +4183,6 @@ class LLPanelPreferencePrivacy : public LLPanelPreference public: LLPanelPreferencePrivacy() { - mAccountIndependentSettings.push_back("VoiceCallsFriendsOnly"); mAccountIndependentSettings.push_back("AutoDisengageMic"); mAutoresponseItem = gSavedPerAccountSettings.getString("FSAutoresponseItemUUID"); @@ -4557,6 +4580,7 @@ void LLFloaterPreferenceGraphicsAdvanced::onClickCloseBtn(bool app_quitting) { instance->cancel(); } + updateMaxComplexity(); } LLFloaterPreferenceProxy::~LLFloaterPreferenceProxy() diff --git a/indra/newview/llfloaterreporter.cpp b/indra/newview/llfloaterreporter.cpp index 3bc66e55ce..4d4f954a18 100644 --- a/indra/newview/llfloaterreporter.cpp +++ b/indra/newview/llfloaterreporter.cpp @@ -948,7 +948,7 @@ void LLFloaterReporter::takeNewSnapshot(bool refresh) // Take a screenshot, but don't draw this floater. setVisible(FALSE); - if (!gViewerWindow->rawSnapshot(mImageRaw, IMAGE_WIDTH, IMAGE_HEIGHT, TRUE, FALSE, gSavedSettings.getBOOL("RenderHUDInSnapshot"), TRUE, FALSE)) + if (!gViewerWindow->rawSnapshot(mImageRaw,IMAGE_WIDTH, IMAGE_HEIGHT, TRUE, FALSE, TRUE /*UI*/, TRUE, FALSE)) { LL_WARNS() << "Unable to take screenshot" << LL_ENDL; setVisible(TRUE); diff --git a/indra/newview/llfloaterworldmap.cpp b/indra/newview/llfloaterworldmap.cpp index 96be4d7fc3..31c4ba550d 100644 --- a/indra/newview/llfloaterworldmap.cpp +++ b/indra/newview/llfloaterworldmap.cpp @@ -880,7 +880,7 @@ void LLFloaterWorldMap::trackLocation(const LLVector3d& pos_global) std::string tooltip(""); mTrackedStatus = LLTracker::TRACKING_LOCATION; // [RLVa:KB] - Checked: 2012-02-08 (RLVa-1.4.5) | Added: RLVa-1.4.5 - LLTracker::trackLocation(pos_global, (!gRlvHandler.hasBehaviour(RLV_BHVR_SHOWLOC)) ? full_name : RlvStrings::getString(RLV_STRING_HIDDEN).c_str(), tooltip); + LLTracker::trackLocation(pos_global, (!gRlvHandler.hasBehaviour(RLV_BHVR_SHOWLOC)) ? full_name : RlvStrings::getString(RlvStringKeys::Hidden::Generic).c_str(), tooltip); // [/RLVa:KB] // LLTracker::trackLocation(pos_global, full_name, tooltip); LLWorldMap::getInstance()->cancelTracking(); // The floater is taking over the tracking @@ -983,7 +983,7 @@ void LLFloaterWorldMap::updateLocation() mSetToUserPosition = FALSE; // Fill out the location field - getChild("location")->setValue(RlvStrings::getString(RLV_STRING_HIDDEN_REGION)); + getChild("location")->setValue(RlvStrings::getString(RlvStringKeys::Hidden::Region)); // update the coordinate display with location of avatar in region updateTeleportCoordsDisplay( agentPos ); @@ -1045,7 +1045,7 @@ void LLFloaterWorldMap::updateLocation() { mSLURL = LLSLURL(); - childSetValue("location", RlvStrings::getString(RLV_STRING_HIDDEN_REGION)); + childSetValue("location", RlvStrings::getString(RlvStringKeys::Hidden::Region)); } else if (gotSimName) // [/RLVa:KB] diff --git a/indra/newview/llgroupactions.cpp b/indra/newview/llgroupactions.cpp index eba41c59bd..2fa1a3aaf8 100644 --- a/indra/newview/llgroupactions.cpp +++ b/indra/newview/llgroupactions.cpp @@ -240,7 +240,7 @@ void LLGroupActions::startCall(const LLUUID& group_id) if (!RlvActions::canStartIM(group_id)) { make_ui_sound("UISndInvalidOp"); - RlvUtil::notifyBlocked(RLV_STRING_BLOCKED_STARTIM, LLSD().with("RECIPIENT", LLSLURL("group", group_id, "about").getSLURLString())); + RlvUtil::notifyBlocked(RlvStringKeys::Blocked::StartIm, LLSD().with("RECIPIENT", LLSLURL("group", group_id, "about").getSLURLString())); return; } // [/RLVa:KB] @@ -626,7 +626,7 @@ LLUUID LLGroupActions::startIM(const LLUUID& group_id) if (!RlvActions::canStartIM(group_id)) { make_ui_sound("UISndInvalidOp"); - RlvUtil::notifyBlocked(RLV_STRING_BLOCKED_STARTIM, LLSD().with("RECIPIENT", LLSLURL("group", group_id, "about").getSLURLString())); + RlvUtil::notifyBlocked(RlvStringKeys::Blocked::StartIm, LLSD().with("RECIPIENT", LLSLURL("group", group_id, "about").getSLURLString())); return LLUUID::null; } // [/RLVa:KB] diff --git a/indra/newview/llgroupmgr.cpp b/indra/newview/llgroupmgr.cpp index 102514869f..8d8006490c 100644 --- a/indra/newview/llgroupmgr.cpp +++ b/indra/newview/llgroupmgr.cpp @@ -965,7 +965,7 @@ static void formatDateString(std::string &date_string) // static void LLGroupMgr::processGroupMembersReply(LLMessageSystem* msg, void** data) { - LL_DEBUGS() << "LLGroupMgr::processGroupMembersReply" << LL_ENDL; + LL_DEBUGS("GrpMgr") << "LLGroupMgr::processGroupMembersReply" << LL_ENDL; LLUUID agent_id; msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id ); if (gAgent.getID() != agent_id) @@ -1071,7 +1071,7 @@ void LLGroupMgr::processGroupMembersReply(LLMessageSystem* msg, void** data) //static void LLGroupMgr::processGroupPropertiesReply(LLMessageSystem* msg, void** data) { - LL_DEBUGS() << "LLGroupMgr::processGroupPropertiesReply" << LL_ENDL; + LL_DEBUGS("GrpMgr") << "LLGroupMgr::processGroupPropertiesReply" << LL_ENDL; if (!msg) { LL_ERRS() << "Can't access the messaging system" << LL_ENDL; @@ -1136,24 +1136,23 @@ void LLGroupMgr::processGroupPropertiesReply(LLMessageSystem* msg, void** data) group_datap->mGroupPropertiesDataComplete = true; group_datap->mChanged = TRUE; - // FIRE-19734/BUG-227094 stop persistent notification recovery spam - auto request = LLGroupMgr::getInstance()->mPropRequests.find(group_id); - if (request != LLGroupMgr::getInstance()->mPropRequests.end()) - { - LLGroupMgr::getInstance()->mPropRequests.erase(request); - } - else - { - LL_DEBUGS() << "GroupPropertyResponse received with no pending request. Response was slow." << LL_ENDL; - } - // + + properties_request_map_t::iterator request = LLGroupMgr::getInstance()->mPropRequests.find(group_id); + if (request != LLGroupMgr::getInstance()->mPropRequests.end()) + { + LLGroupMgr::getInstance()->mPropRequests.erase(request); + } + else + { + LL_DEBUGS("GrpMgr") << "GroupPropertyResponse received with no pending request. Response was slow." << LL_ENDL; + } LLGroupMgr::getInstance()->notifyObservers(GC_PROPERTIES); } // static void LLGroupMgr::processGroupRoleDataReply(LLMessageSystem* msg, void** data) { - LL_DEBUGS() << "LLGroupMgr::processGroupRoleDataReply" << LL_ENDL; + LL_DEBUGS("GrpMgr") << "LLGroupMgr::processGroupRoleDataReply" << LL_ENDL; LLUUID agent_id; msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id ); if (gAgent.getID() != agent_id) @@ -1214,7 +1213,7 @@ void LLGroupMgr::processGroupRoleDataReply(LLMessageSystem* msg, void** data) - LL_DEBUGS() << "Adding role data: " << name << " {" << role_id << "}" << LL_ENDL; + LL_DEBUGS("GrpMgr") << "Adding role data: " << name << " {" << role_id << "}" << LL_ENDL; LLGroupRoleData* rd = new LLGroupRoleData(role_id,name,title,desc,powers,member_count); group_datap->mRoles[role_id] = rd; } @@ -1238,7 +1237,7 @@ void LLGroupMgr::processGroupRoleDataReply(LLMessageSystem* msg, void** data) // static void LLGroupMgr::processGroupRoleMembersReply(LLMessageSystem* msg, void** data) { - LL_DEBUGS() << "LLGroupMgr::processGroupRoleMembersReply" << LL_ENDL; + LL_DEBUGS("GrpMgr") << "LLGroupMgr::processGroupRoleMembersReply" << LL_ENDL; LLUUID agent_id; msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id ); if (gAgent.getID() != agent_id) @@ -1299,7 +1298,7 @@ void LLGroupMgr::processGroupRoleMembersReply(LLMessageSystem* msg, void** data) if (rd && md) { - LL_DEBUGS() << "Adding role-member pair: " << role_id << ", " << member_id << LL_ENDL; + LL_DEBUGS("GrpMgr") << "Adding role-member pair: " << role_id << ", " << member_id << LL_ENDL; rd->addMember(member_id); md->addRole(role_id,rd); } @@ -1351,7 +1350,7 @@ void LLGroupMgr::processGroupRoleMembersReply(LLMessageSystem* msg, void** data) // static void LLGroupMgr::processGroupTitlesReply(LLMessageSystem* msg, void** data) { - LL_DEBUGS() << "LLGroupMgr::processGroupTitlesReply" << LL_ENDL; + LL_DEBUGS("GrpMgr") << "LLGroupMgr::processGroupTitlesReply" << LL_ENDL; LLUUID agent_id; msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id ); if (gAgent.getID() != agent_id) @@ -1384,7 +1383,7 @@ void LLGroupMgr::processGroupTitlesReply(LLMessageSystem* msg, void** data) if (!title.mTitle.empty()) { - LL_DEBUGS() << "LLGroupMgr adding title: " << title.mTitle << ", " << title.mRoleID << ", " << (title.mSelected ? 'Y' : 'N') << LL_ENDL; + LL_DEBUGS("GrpMgr") << "LLGroupMgr adding title: " << title.mTitle << ", " << title.mRoleID << ", " << (title.mSelected ? 'Y' : 'N') << LL_ENDL; group_datap->mTitles.push_back(title); } } @@ -1396,7 +1395,7 @@ void LLGroupMgr::processGroupTitlesReply(LLMessageSystem* msg, void** data) // static void LLGroupMgr::processEjectGroupMemberReply(LLMessageSystem* msg, void ** data) { - LL_DEBUGS() << "processEjectGroupMemberReply" << LL_ENDL; + LL_DEBUGS("GrpMgr") << "processEjectGroupMemberReply" << LL_ENDL; LLUUID group_id; msg->getUUIDFast(_PREHASH_GroupData, _PREHASH_GroupID, group_id); BOOL success; @@ -1412,7 +1411,7 @@ void LLGroupMgr::processEjectGroupMemberReply(LLMessageSystem* msg, void ** data // static void LLGroupMgr::processJoinGroupReply(LLMessageSystem* msg, void ** data) { - LL_DEBUGS() << "processJoinGroupReply" << LL_ENDL; + LL_DEBUGS("GrpMgr") << "processJoinGroupReply" << LL_ENDL; LLUUID group_id; BOOL success; msg->getUUIDFast(_PREHASH_GroupData, _PREHASH_GroupID, group_id); @@ -1432,7 +1431,7 @@ void LLGroupMgr::processJoinGroupReply(LLMessageSystem* msg, void ** data) // static void LLGroupMgr::processLeaveGroupReply(LLMessageSystem* msg, void ** data) { - LL_DEBUGS() << "processLeaveGroupReply" << LL_ENDL; + LL_DEBUGS("GrpMgr") << "processLeaveGroupReply" << LL_ENDL; LLUUID group_id; BOOL success; msg->getUUIDFast(_PREHASH_GroupData, _PREHASH_GroupID, group_id); @@ -1516,29 +1515,27 @@ LLGroupMgrGroupData* LLGroupMgr::createGroupData(const LLUUID& id) return group_datap; } -// FIRE-19734/BUG-227094 stop persistent notification recovery spam bool LLGroupMgr::hasPendingPropertyRequest(const LLUUID & id) { - auto existing_req = LLGroupMgr::getInstance()->mPropRequests.find(id); - if (existing_req != LLGroupMgr::getInstance()->mPropRequests.end()) - { - if (gFrameTime - existing_req->second < MIN_GROUP_PROPERTY_REQUEST_FREQ) - { - return true; - } - else - { - LLGroupMgr::getInstance()->mPropRequests.erase(existing_req); - } - } - return false; + properties_request_map_t::iterator existing_req = LLGroupMgr::getInstance()->mPropRequests.find(id); + if (existing_req != LLGroupMgr::getInstance()->mPropRequests.end()) + { + if (gFrameTime - existing_req->second < MIN_GROUP_PROPERTY_REQUEST_FREQ) + { + return true; + } + else + { + LLGroupMgr::getInstance()->mPropRequests.erase(existing_req); + } + } + return false; } void LLGroupMgr::addPendingPropertyRequest(const LLUUID& id) { - LLGroupMgr::getInstance()->mPropRequests[id] = gFrameTime; + LLGroupMgr::getInstance()->mPropRequests[id] = gFrameTime; } -// void LLGroupMgr::notifyObservers(LLGroupChange gc) { @@ -1622,16 +1619,17 @@ void LLGroupMgr::addGroup(LLGroupMgrGroupData* group_datap) void LLGroupMgr::sendGroupPropertiesRequest(const LLUUID& group_id) { - LL_DEBUGS() << "LLGroupMgr::sendGroupPropertiesRequest" << LL_ENDL; + LL_DEBUGS("GrpMgr") << "LLGroupMgr::sendGroupPropertiesRequest" << LL_ENDL; // This will happen when we get the reply //LLGroupMgrGroupData* group_datap = createGroupData(group_id); - // FIRE-19734/BUG-227094 stop persistent notification recovery spam - if (LLGroupMgr::getInstance()->hasPendingPropertyRequest(group_id)) - { - LL_DEBUGS() << "LLGroupMgr::sendGroupPropertiesRequest suppressed repeat for " << group_id << LL_ENDL; - return; - } - // + + if (LLGroupMgr::getInstance()->hasPendingPropertyRequest(group_id)) + { + LL_DEBUGS("GrpMgr") << "LLGroupMgr::sendGroupPropertiesRequest suppressed repeat for " << group_id << LL_ENDL; + return; + } + LLGroupMgr::getInstance()->addPendingPropertyRequest(group_id); + LLMessageSystem* msg = gMessageSystem; msg->newMessage("GroupProfileRequest"); msg->nextBlock("AgentData"); @@ -1640,14 +1638,11 @@ void LLGroupMgr::sendGroupPropertiesRequest(const LLUUID& group_id) msg->nextBlock("GroupData"); msg->addUUID("GroupID",group_id); gAgent.sendReliableMessage(); - // FIRE-19734/BUG-227094 stop persistent notification recovery spam - LLGroupMgr::getInstance()->addPendingPropertyRequest(group_id); - // } void LLGroupMgr::sendGroupMembersRequest(const LLUUID& group_id) { - LL_DEBUGS() << "LLGroupMgr::sendGroupMembersRequest" << LL_ENDL; + LL_DEBUGS("GrpMgr") << "LLGroupMgr::sendGroupMembersRequest" << LL_ENDL; LLGroupMgrGroupData* group_datap = createGroupData(group_id); if (group_datap->mMemberRequestID.isNull()) { @@ -1669,7 +1664,7 @@ void LLGroupMgr::sendGroupMembersRequest(const LLUUID& group_id) void LLGroupMgr::sendGroupRoleDataRequest(const LLUUID& group_id) { - LL_DEBUGS() << "LLGroupMgr::sendGroupRoleDataRequest" << LL_ENDL; + LL_DEBUGS("GrpMgr") << "LLGroupMgr::sendGroupRoleDataRequest" << LL_ENDL; LLGroupMgrGroupData* group_datap = createGroupData(group_id); if (group_datap->mRoleDataRequestID.isNull()) { @@ -1690,7 +1685,7 @@ void LLGroupMgr::sendGroupRoleDataRequest(const LLUUID& group_id) void LLGroupMgr::sendGroupRoleMembersRequest(const LLUUID& group_id) { - LL_DEBUGS() << "LLGroupMgr::sendGroupRoleMembersRequest" << LL_ENDL; + LL_DEBUGS("GrpMgr") << "LLGroupMgr::sendGroupRoleMembersRequest" << LL_ENDL; LLGroupMgrGroupData* group_datap = createGroupData(group_id); if (group_datap->mRoleMembersRequestID.isNull()) @@ -1700,7 +1695,7 @@ void LLGroupMgr::sendGroupRoleMembersRequest(const LLUUID& group_id) || !group_datap->isRoleDataComplete()) { // *TODO: KLW FIXME: Should we start a member or role data request? - LL_INFOS() << " Pending: " << (group_datap->mPendingRoleMemberRequest ? "Y" : "N") + LL_INFOS("GrpMgr") << " Pending: " << (group_datap->mPendingRoleMemberRequest ? "Y" : "N") << " MemberDataComplete: " << (group_datap->mMemberDataComplete ? "Y" : "N") << " RoleDataComplete: " << (group_datap->mRoleDataComplete ? "Y" : "N") << LL_ENDL; group_datap->mPendingRoleMemberRequest = true; @@ -1724,7 +1719,7 @@ void LLGroupMgr::sendGroupRoleMembersRequest(const LLUUID& group_id) void LLGroupMgr::sendGroupTitlesRequest(const LLUUID& group_id) { - LL_DEBUGS() << "LLGroupMgr::sendGroupTitlesRequest" << LL_ENDL; + LL_DEBUGS("GrpMgr") << "LLGroupMgr::sendGroupTitlesRequest" << LL_ENDL; LLGroupMgrGroupData* group_datap = createGroupData(group_id); group_datap->mTitles.clear(); @@ -1743,7 +1738,7 @@ void LLGroupMgr::sendGroupTitlesRequest(const LLUUID& group_id) void LLGroupMgr::sendGroupTitleUpdate(const LLUUID& group_id, const LLUUID& title_role_id) { - LL_DEBUGS() << "LLGroupMgr::sendGroupTitleUpdate" << LL_ENDL; + LL_DEBUGS("GrpMgr") << "LLGroupMgr::sendGroupTitleUpdate" << LL_ENDL; LLMessageSystem* msg = gMessageSystem; msg->newMessage("GroupTitleUpdate"); @@ -1802,7 +1797,7 @@ void LLGroupMgr::sendCreateGroupRequest(const std::string& name, void LLGroupMgr::sendUpdateGroupInfo(const LLUUID& group_id) { - LL_DEBUGS() << "LLGroupMgr::sendUpdateGroupInfo" << LL_ENDL; + LL_DEBUGS("GrpMgr") << "LLGroupMgr::sendUpdateGroupInfo" << LL_ENDL; LLGroupMgrGroupData* group_datap = createGroupData(group_id); LLMessageSystem* msg = gMessageSystem; @@ -1831,7 +1826,7 @@ void LLGroupMgr::sendUpdateGroupInfo(const LLUUID& group_id) void LLGroupMgr::sendGroupRoleMemberChanges(const LLUUID& group_id) { - LL_DEBUGS() << "LLGroupMgr::sendGroupRoleMemberChanges" << LL_ENDL; + LL_DEBUGS("GrpMgr") << "LLGroupMgr::sendGroupRoleMemberChanges" << LL_ENDL; LLGroupMgrGroupData* group_datap = createGroupData(group_id); if (group_datap->mRoleMemberChanges.empty()) return; @@ -2399,7 +2394,7 @@ void LLGroupMgr::processCapGroupMembersRequest(const LLSD& content) void LLGroupMgr::sendGroupRoleChanges(const LLUUID& group_id) { - LL_DEBUGS() << "LLGroupMgr::sendGroupRoleChanges" << LL_ENDL; + LL_DEBUGS("GrpMgr") << "LLGroupMgr::sendGroupRoleChanges" << LL_ENDL; LLGroupMgrGroupData* group_datap = getGroupData(group_id); if (group_datap && group_datap->pendingRoleChanges()) @@ -2414,7 +2409,7 @@ void LLGroupMgr::sendGroupRoleChanges(const LLUUID& group_id) void LLGroupMgr::cancelGroupRoleChanges(const LLUUID& group_id) { - LL_DEBUGS() << "LLGroupMgr::cancelGroupRoleChanges" << LL_ENDL; + LL_DEBUGS("GrpMgr") << "LLGroupMgr::cancelGroupRoleChanges" << LL_ENDL; LLGroupMgrGroupData* group_datap = getGroupData(group_id); if (group_datap) group_datap->cancelRoleChanges(); @@ -2448,7 +2443,7 @@ bool LLGroupMgr::parseRoleActions(const std::string& xml_filename) std::string action_set_name; if (action_set->getAttributeString("name", action_set_name)) { - LL_DEBUGS() << "Loading action set " << action_set_name << LL_ENDL; + LL_DEBUGS("GrpMgr") << "Loading action set " << action_set_name << LL_ENDL; role_action_data->mName = action_set_name; } else @@ -2489,7 +2484,7 @@ bool LLGroupMgr::parseRoleActions(const std::string& xml_filename) std::string action_name; if (action->getAttributeString("name", action_name)) { - LL_DEBUGS() << "Loading action " << action_name << LL_ENDL; + LL_DEBUGS("GrpMgr") << "Loading action " << action_name << LL_ENDL; role_action->mName = action_name; } else diff --git a/indra/newview/llgroupmgr.h b/indra/newview/llgroupmgr.h index 4ee157ed21..200b7886f3 100644 --- a/indra/newview/llgroupmgr.h +++ b/indra/newview/llgroupmgr.h @@ -458,20 +458,19 @@ private: void notifyObserver(const LLUUID& group_id, LLGroupChange gc); void addGroup(LLGroupMgrGroupData* group_datap); LLGroupMgrGroupData* createGroupData(const LLUUID &id); - // FIRE-19734/BUG-227094 stop persistent notification recovery spam bool hasPendingPropertyRequest(const LLUUID& id); void addPendingPropertyRequest(const LLUUID& id); - // + typedef std::multimap observer_multimap_t; observer_multimap_t mObservers; typedef std::map group_map_t; group_map_t mGroups; - // FIRE-19734/BUG-227094 stop persistent notification recovery spam + const U64MicrosecondsImplicit MIN_GROUP_PROPERTY_REQUEST_FREQ = 100000;//100ms between requests should be enough to avoid spamming. typedef std::map properties_request_map_t; properties_request_map_t mPropRequests; - // + typedef std::set observer_set_t; typedef std::map observer_map_t; observer_map_t mParticularObservers; diff --git a/indra/newview/llhudnametag.cpp b/indra/newview/llhudnametag.cpp index 689a292b53..9c27269beb 100644 --- a/indra/newview/llhudnametag.cpp +++ b/indra/newview/llhudnametag.cpp @@ -438,7 +438,8 @@ void LLHUDNameTag::clearString() void LLHUDNameTag::addLine(const std::string &text_utf8, const LLColor4& color, const LLFontGL::StyleFlags style, - const LLFontGL* font) + const LLFontGL* font, + const bool use_ellipses) { LLWString wline = utf8str_to_wstring(text_utf8); if (!wline.empty()) @@ -455,18 +456,52 @@ void LLHUDNameTag::addLine(const std::string &text_utf8, tokenizer tokens(wline, sep); tokenizer::iterator iter = tokens.begin(); - while (iter != tokens.end()) - { - U32 line_length = 0; - do - { - F32 max_pixels = HUD_TEXT_MAX_WIDTH; - S32 segment_length = font->maxDrawableChars(iter->substr(line_length).c_str(), max_pixels, wline.length(), LLFontGL::WORD_BOUNDARY_IF_POSSIBLE); - LLHUDTextSegment segment(iter->substr(line_length, segment_length), style, color, font); - mTextSegments.push_back(segment); - line_length += segment_length; - } - while (line_length != iter->size()); + const F32 max_pixels = HUD_TEXT_MAX_WIDTH; + while (iter != tokens.end()) + { + U32 line_length = 0; + if (use_ellipses) + { + // "QualityAssuranceAssuresQuality1" will end up like "QualityAssuranceAssuresQual..." + // "QualityAssuranceAssuresQuality QualityAssuranceAssuresQuality" will end up like "QualityAssuranceAssuresQual..." + // "QualityAssurance AssuresQuality1" will end up as "QualityAssurance AssuresQua..." because we are enforcing single line + do + { + S32 segment_length = font->maxDrawableChars(iter->substr(line_length).c_str(), max_pixels, wline.length(), LLFontGL::ANYWHERE); + if (segment_length + line_length < wline.length()) // since we only draw one string, line_length should be 0 + { + // token does does not fit into signle line, need to draw "...". + // Use four dots for ellipsis width to generate padding + const LLWString dots_pad(utf8str_to_wstring(std::string("...."))); + S32 elipses_width = font->getWidthF32(dots_pad.c_str()); + // truncated string length + segment_length = font->maxDrawableChars(iter->substr(line_length).c_str(), max_pixels - elipses_width, wline.length(), LLFontGL::ANYWHERE); + const LLWString dots(utf8str_to_wstring(std::string("..."))); + LLHUDTextSegment segment(iter->substr(line_length, segment_length) + dots, style, color, font); + mTextSegments.push_back(segment); + break; // consider it to be complete + } + else + { + // token fits fully into string + LLHUDTextSegment segment(iter->substr(line_length, segment_length), style, color, font); + mTextSegments.push_back(segment); + line_length += segment_length; + } + } while (line_length != iter->size()); + } + else + { + // "QualityAssuranceAssuresQuality 1" will be split into two lines "QualityAssuranceAssuresQualit" and "y 1" + // "QualityAssurance AssuresQuality 1" will be split into two lines "QualityAssurance" and "AssuresQuality" + do + { + S32 segment_length = font->maxDrawableChars(iter->substr(line_length).c_str(), max_pixels, wline.length(), LLFontGL::WORD_BOUNDARY_IF_POSSIBLE); + LLHUDTextSegment segment(iter->substr(line_length, segment_length), style, color, font); + mTextSegments.push_back(segment); + line_length += segment_length; + } while (line_length != iter->size()); + } ++iter; } } diff --git a/indra/newview/llhudnametag.h b/indra/newview/llhudnametag.h index d40554f520..f41a06d280 100644 --- a/indra/newview/llhudnametag.h +++ b/indra/newview/llhudnametag.h @@ -94,7 +94,7 @@ public: void clearString(); // Add text a line at a time, allowing custom formatting - void addLine(const std::string &text_utf8, const LLColor4& color, const LLFontGL::StyleFlags style = LLFontGL::NORMAL, const LLFontGL* font = NULL); + void addLine(const std::string &text_utf8, const LLColor4& color, const LLFontGL::StyleFlags style = LLFontGL::NORMAL, const LLFontGL* font = NULL, const bool use_ellipses = false); // For bubble chat, set the part above the chat text void setLabel(const std::string& label_utf8); diff --git a/indra/newview/llimprocessing.cpp b/indra/newview/llimprocessing.cpp index 0e3183f5a6..64fa0680b1 100644 --- a/indra/newview/llimprocessing.cpp +++ b/indra/newview/llimprocessing.cpp @@ -522,7 +522,7 @@ static void teleport_region_info_cb(const std::string& slurl, LLSD args, const L { if (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWLOC)) { - args["POS_SLURL"] = RlvStrings::getString(RLV_STRING_HIDDEN); + args["POS_SLURL"] = RlvStrings::getString(RlvStringKeys::Hidden::Generic); } else { @@ -690,7 +690,7 @@ void LLIMProcessing::processNewMessage(LLUUID from_id, || (dialog == IM_FROM_TASK && LLMuteList::getInstance()->isMuted(session_id)); BOOL is_owned_by_me = FALSE; BOOL is_friend = (LLAvatarTracker::instance().getBuddyInfo(from_id) == NULL) ? false : true; - static LLCachedControl accept_im_from_only_friend(gSavedSettings, "VoiceCallsFriendsOnly"); + static LLCachedControl accept_im_from_only_friend(gSavedPerAccountSettings, "VoiceCallsFriendsOnly"); //BOOL is_linden = chat.mSourceType != CHAT_SOURCE_OBJECT && // LLMuteList::getInstance()->isLinden(name); <:FS:TM> Bear compie fix - is_linden not referenced @@ -984,8 +984,8 @@ void LLIMProcessing::processNewMessage(LLUUID from_id, if ( (rlv_handler_t::isEnabled()) && (offline != IM_OFFLINE) && (!RlvActions::canReceiveIM(from_id)) && (!LLMuteList::getInstance()->isLinden(original_name) )) { if (!mute_im) - RlvUtil::sendBusyMessage(from_id, RlvStrings::getString(RLV_STRING_BLOCKED_RECVIM_REMOTE), session_id); - message = RlvStrings::getString(RLV_STRING_BLOCKED_RECVIM); + RlvUtil::sendBusyMessage(from_id, RlvStrings::getString(RlvStringKeys::Blocked::RecvImRemote), session_id); + message = RlvStrings::getString(RlvStringKeys::Blocked::RecvIm); } // [/RLVa:KB] @@ -1550,7 +1550,7 @@ void LLIMProcessing::processNewMessage(LLUUID from_id, { std::string::size_type idxPos = location.find('/'); if ( (std::string::npos != idxPos) && (RlvUtil::isNearbyRegion(location.substr(0, idxPos))) ) - location = RlvStrings::getString(RLV_STRING_HIDDEN_REGION); + location = RlvStrings::getString(RlvStringKeys::Hidden::Region); } } // [/RLVa:KB] @@ -1761,7 +1761,7 @@ void LLIMProcessing::processNewMessage(LLUUID from_id, } // FIRE-1245: Option to block/reject teleport offers - //else if (gSavedSettings.getBOOL("VoiceCallsFriendsOnly") && (LLAvatarTracker::instance().getBuddyInfo(from_id) == NULL)) + //else if (gSavedPerAccountSettings.getBOOL("VoiceCallsFriendsOnly") && (LLAvatarTracker::instance().getBuddyInfo(from_id) == NULL)) //{ // return; //} @@ -1839,7 +1839,7 @@ void LLIMProcessing::processNewMessage(LLUUID from_id, if ( ((IM_LURE_USER == dialog) && (!RlvActions::canAcceptTpOffer(from_id))) || ((IM_TELEPORT_REQUEST == dialog) && (!RlvActions::canAcceptTpRequest(from_id))) ) { - RlvUtil::sendBusyMessage(from_id, RlvStrings::getString(RLV_STRING_BLOCKED_TPLUREREQ_REMOTE)); + RlvUtil::sendBusyMessage(from_id, RlvStrings::getString(RlvStringKeys::Blocked::TpLureRequestRemote)); if (is_do_not_disturb) send_do_not_disturb_message(gMessageSystem, from_id); return; @@ -1849,7 +1849,7 @@ void LLIMProcessing::processNewMessage(LLUUID from_id, if ( (!RlvActions::canReceiveIM(from_id)) || ((gRlvHandler.hasBehaviour(RLV_BHVR_SHOWLOC)) && (IM_LURE_USER == dialog || IM_TELEPORT_REQUEST == dialog)) ) { - message = RlvStrings::getString(RLV_STRING_HIDDEN); + message = RlvStrings::getString(RlvStringKeys::Hidden::Generic); } } // [/RLVa:KB] diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp index 2bd2569760..f1ab6274c3 100644 --- a/indra/newview/llimview.cpp +++ b/indra/newview/llimview.cpp @@ -652,7 +652,7 @@ LLIMModel::LLIMModel() addNewMsgCallback(boost::bind(&FSFloaterIM::newIMCallback, _1)); // [FS communication UI] addNewMsgCallback(boost::bind(&on_new_message, _1)); - + LLCallDialogManager::instance(); } LLIMModel::LLIMSession::LLIMSession(const LLUUID& session_id, const std::string& name, const EInstantMessage& type, const LLUUID& other_participant_id, const uuid_vec_t& ids, bool voice, bool has_offline_msg) @@ -2975,8 +2975,8 @@ void LLIMMgr::addMessage( bool skip_message = false; bool from_linden = LLMuteList::getInstance()->isLinden(from); // FIRE-14564: VoiceCallFriendsOnly prevents receiving of - //if (gSavedSettings.getBOOL("VoiceCallsFriendsOnly") && !from_linden) - if (gSavedSettings.getBOOL("VoiceCallsFriendsOnly") && !from_linden && + //if (gSavedPerAccountSettings.getBOOL("VoiceCallsFriendsOnly") && !from_linden) + if (gSavedPerAccountSettings.getBOOL("VoiceCallsFriendsOnly") && !from_linden && (dialog == IM_NOTHING_SPECIAL || (dialog == IM_SESSION_INVITE && !gAgent.isInGroup(new_session_id))) ) // { @@ -3012,7 +3012,7 @@ void LLIMMgr::addMessage( // session id, so we can leave it! if (is_group_chat && !exoGroupMuteList::instance().isLoaded()) { - LL_INFOS() << "Received group chat from " << fixed_session_name << " (" << new_session_id.asString() << ") before must list has been loaded - skipping message" << LL_ENDL; + LL_INFOS() << "Received group chat from " << fixed_session_name << " (" << new_session_id.asString() << ") before mute list has been loaded - skipping message" << LL_ENDL; exoGroupMuteList::instance().addDeferredGroupChat(new_session_id); return; } @@ -3039,7 +3039,7 @@ void LLIMMgr::addMessage( if (IM_NOTHING_SPECIAL != dialog && IM_SESSION_P2P_INVITE != dialog && gAgent.isInGroup(new_session_id) && LLMuteList::getInstance()->isMuted(other_participant_id) && !from_linden) { - LL_INFOS() << "Ignoring group chat initiated by muted resident." << LL_ENDL; + LL_INFOS() << "Ignoring group chat from " << fixed_session_name << " (" << new_session_id.asString() << ") initiated by muted resident." << LL_ENDL; exoGroupMuteList::instance().addDeferredGroupChat(new_session_id); return; } @@ -3090,7 +3090,7 @@ void LLIMMgr::addMessage( // Configurable IM sounds // //Play sound for new conversations - // if (!gAgent.isDoNotDisturb() && (gSavedSettings.getBOOL("PlaySoundNewConversation") == TRUE)) + // if (!skip_message & !gAgent.isDoNotDisturb() && (gSavedSettings.getBOOL("PlaySoundNewConversation") == TRUE)) // Option to automatically ignore and leave all conference (ad-hoc) chats static LLCachedControl ignoreAdHocSessions(gSavedSettings, "FSIgnoreAdHocSessions"); @@ -3563,7 +3563,7 @@ void LLIMMgr::inviteToSession( if (voice_invite) { bool isRejectGroupCall = (gSavedSettings.getBOOL("VoiceCallsRejectGroup") && (notify_box_type == "VoiceInviteGroup")); - bool isRejectNonFriendCall = (gSavedSettings.getBOOL("VoiceCallsFriendsOnly") && (LLAvatarTracker::instance().getBuddyInfo(caller_id) == NULL)); + bool isRejectNonFriendCall = (gSavedPerAccountSettings.getBOOL("VoiceCallsFriendsOnly") && (LLAvatarTracker::instance().getBuddyInfo(caller_id) == NULL)); // FIRE-6522: Options to automatically decline all group and personal voice chat requests // if (isRejectGroupCall || isRejectNonFriendCall || gAgent.isDoNotDisturb()) bool isRejectAdHocCall = (gSavedSettings.getBOOL("VoiceCallsRejectAdHoc") && (notify_box_type == "VoiceInviteAdHoc")); @@ -4023,7 +4023,7 @@ void typingNameCallback(const LLUUID& av_id, const LLAvatarName& av_name, const BOOL is_muted = LLMuteList::getInstance()->isMuted(av_id, av_name.getCompleteName(), LLMute::flagTextChat); bool is_friend = (LLAvatarTracker::instance().getBuddyInfo(av_id) == NULL) ? false : true; - static LLCachedControl VoiceCallsFriendsOnly(gSavedSettings, "VoiceCallsFriendsOnly"); + static LLCachedControl VoiceCallsFriendsOnly(gSavedPerAccountSettings, "VoiceCallsFriendsOnly"); if (!is_muted && ( (VoiceCallsFriendsOnly && is_friend) || !VoiceCallsFriendsOnly )) { @@ -4365,7 +4365,7 @@ public: } else if (!RlvActions::canReceiveIM(from_id)) // Conference chat: don't block; censor if not an exception { - message = RlvStrings::getString(RLV_STRING_BLOCKED_RECVIM); + message = RlvStrings::getString(RlvStringKeys::Blocked::RecvIm); } } // [/RLVa:KB] diff --git a/indra/newview/llinspectavatar.cpp b/indra/newview/llinspectavatar.cpp index 1d0df95490..624eddcf92 100644 --- a/indra/newview/llinspectavatar.cpp +++ b/indra/newview/llinspectavatar.cpp @@ -63,6 +63,7 @@ #include "lltoggleablemenu.h" #include "lluictrl.h" #include "llviewerregion.h" +#include "rlvactions.h" // class LLFetchAvatarData; @@ -152,6 +153,7 @@ private: bool enableUnmute(); bool enableTeleportOffer(); bool enableTeleportRequest(); + bool enablePay(); bool godModeEnabled(); // Is used to determine if "Add friend" option should be enabled in gear menu @@ -257,6 +259,7 @@ LLInspectAvatar::LLInspectAvatar(const LLSD& sd) mEnableCallbackRegistrar.add("InspectAvatar.Gear.EnableCall", boost::bind(&LLAvatarActions::canCall)); mEnableCallbackRegistrar.add("InspectAvatar.Gear.EnableTeleportOffer", boost::bind(&LLInspectAvatar::enableTeleportOffer, this)); mEnableCallbackRegistrar.add("InspectAvatar.Gear.EnableTeleportRequest", boost::bind(&LLInspectAvatar::enableTeleportRequest, this)); + mEnableCallbackRegistrar.add("InspectAvatar.Gear.EnablePay", boost::bind(&LLInspectAvatar::enablePay, this)); mEnableCallbackRegistrar.add("InspectAvatar.EnableMute", boost::bind(&LLInspectAvatar::enableMute, this)); mEnableCallbackRegistrar.add("InspectAvatar.EnableUnmute", boost::bind(&LLInspectAvatar::enableUnmute, this)); // @@ -859,6 +862,11 @@ bool LLInspectAvatar::enableTeleportRequest() return LLAvatarActions::canRequestTeleport(mAvatarID); } +bool LLInspectAvatar::enablePay() +{ + return RlvActions::canPayAvatar(mAvatarID); +} + bool LLInspectAvatar::godModeEnabled() { return gAgent.isGodlike(); diff --git a/indra/newview/llinspectremoteobject.cpp b/indra/newview/llinspectremoteobject.cpp index 8fa90c5d62..c77b510a17 100644 --- a/indra/newview/llinspectremoteobject.cpp +++ b/indra/newview/llinspectremoteobject.cpp @@ -200,7 +200,7 @@ void LLInspectRemoteObject::update() getChild("block_btn")->setEnabled(!mObjectID.isNull() && !LLMuteList::getInstance()->isMuted(mObjectID)); // [RLVa:KB] - Checked: 2010-04-22 (RLVa-1.2.0f) | Added: RLVa-1.2.0f - if ( (rlv_handler_t::isEnabled()) && (RlvStrings::getString(RLV_STRING_HIDDEN_REGION) == mSLurl) ) + if ( (rlv_handler_t::isEnabled()) && (RlvStrings::getString(RlvStringKeys::Hidden::Region) == mSLurl) ) { getChild("object_slurl")->setValue(mSLurl); getChild("map_btn")->setEnabled(false); diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp index 75be38232c..6a920eabda 100644 --- a/indra/newview/llinventorybridge.cpp +++ b/indra/newview/llinventorybridge.cpp @@ -4102,7 +4102,7 @@ void LLFolderBridge::perform_pasteFromClipboard() // [RLVa:KB] - Checked: RLVa-2.1.0 if ( ((item) && (!RlvActions::canPasteInventory(item, dest_folder))) || ((cat) && (!RlvActions::canPasteInventory(cat, dest_folder))) ) { - RlvActions::notifyBlocked(RLV_STRING_BLOCKED_INVFOLDER); + RlvActions::notifyBlocked(RlvStringKeys::Blocked::InvFolder); return; } // [/RLVa:KB] @@ -4512,12 +4512,6 @@ void LLFolderBridge::buildContextMenuOptions(U32 flags, menuentry_vec_t& items items.push_back(std::string("New Body Parts")); items.push_back(std::string("New Settings")); items.push_back(std::string("upload_def")); - - if (!LLEnvironment::instance().isInventoryEnabled()) - { - disabled_items.push_back("New Settings"); - } - } } getClipboardEntries(false, items, disabled_items, flags); diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp index 816aa3af5e..a9ef7e66a3 100644 --- a/indra/newview/llinventorymodel.cpp +++ b/indra/newview/llinventorymodel.cpp @@ -1798,7 +1798,10 @@ void LLInventoryModel::idleNotifyObservers() } // Call this method when it's time to update everyone on a new state. -void LLInventoryModel::notifyObservers() +//void LLInventoryModel::notifyObservers() +// [SL:KB] - Patch: UI-Notifications | Checked: Catznip-6.5 +void LLInventoryModel::notifyObservers(const LLUUID& transaction_id) +// [/SL:KB] { if (mIsNotifyObservers) { @@ -1810,6 +1813,9 @@ void LLInventoryModel::notifyObservers() } mIsNotifyObservers = TRUE; +// [SL:KB] - Patch: UI-Notifications | Checked: Catznip-6.5 + mTransactionId = transaction_id; +// [/SL:KB] for (observer_list_t::iterator iter = mObservers.begin(); iter != mObservers.end(); ) { @@ -1823,6 +1829,9 @@ void LLInventoryModel::notifyObservers() mModifyMask = LLInventoryObserver::NONE; mChangedItemIDs.clear(); mAddedItemIDs.clear(); +// [SL:KB] - Patch: UI-Notifications | Checked: Catznip-6.5 + mTransactionId.setNull(); +// [/SL:KB] mIsNotifyObservers = FALSE; } @@ -3531,7 +3540,10 @@ void LLInventoryModel::processBulkUpdateInventory(LLMessageSystem* msg, void**) { gInventory.updateItem(*iit); } - gInventory.notifyObservers(); +// [SL:KB] - Patch: UI-Notifications | Checked: Catznip-6.5 + gInventory.notifyObservers(tid); +// [/SL:KB] +// gInventory.notifyObservers(); // The incoming inventory could span more than one BulkInventoryUpdate packet, // so record the transaction ID for this purchase, then wear all clothing diff --git a/indra/newview/llinventorymodel.h b/indra/newview/llinventorymodel.h index 7a8fca8875..91ce633498 100644 --- a/indra/newview/llinventorymodel.h +++ b/indra/newview/llinventorymodel.h @@ -564,7 +564,10 @@ public: void idleNotifyObservers(); // Call to explicitly update everyone on a new state. - void notifyObservers(); +// [SL:KB] - Patch: UI-Notifications | Checked: Catznip-6.5 + void notifyObservers(const LLUUID& transaction_id = LLUUID::null); +// [/SL:KB] +// void notifyObservers(); // Allows outsiders to tell the inventory if something has // been changed 'under the hood', but outside the control of the @@ -573,6 +576,9 @@ public: const changed_items_t& getChangedIDs() const { return mChangedItemIDs; } const changed_items_t& getAddedIDs() const { return mAddedItemIDs; } +// [SL:KB] - Patch: UI-Notifications | Checked: Catznip-6.5 + const LLUUID& getTransactionId() const { return mTransactionId; } +// [/SL:KB] protected: // Updates all linked items pointing to this id. void addChangedMaskForLinks(const LLUUID& object_id, U32 mask); @@ -584,6 +590,9 @@ private: U32 mModifyMask; changed_items_t mChangedItemIDs; changed_items_t mAddedItemIDs; +// [SL:KB] - Patch: UI-Notifications | Checked: Catznip-6.5 + LLUUID mTransactionId; +// [/SL:KB] //-------------------------------------------------------------------- diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp index c5db14c6dd..4b4e3d5dbe 100644 --- a/indra/newview/llinventorypanel.cpp +++ b/indra/newview/llinventorypanel.cpp @@ -1542,7 +1542,7 @@ bool LLInventoryPanel::beginIMSession() if (!fRlvCanStartIM) { make_ui_sound("UISndInvalidOp"); - RlvUtil::notifyBlocked(RLV_STRING_BLOCKED_STARTCONF); + RlvUtil::notifyBlocked(RlvStringKeys::Blocked::StartConference); return true; } // [/RLVa:KB] diff --git a/indra/newview/lllandmarklist.cpp b/indra/newview/lllandmarklist.cpp index c58540914e..1fc70cd6d6 100644 --- a/indra/newview/lllandmarklist.cpp +++ b/indra/newview/lllandmarklist.cpp @@ -39,6 +39,11 @@ // Globals LLLandmarkList gLandmarkList; +// number is mostly arbitrary, but it should be below DEFAULT_QUEUE_SIZE pool size, +// which is 4096, to not overfill the pool if user has more than 4K of landmarks, +// and low number helps with not flooding server with requests +const S32 MAX_SIMULTANEOUS_REQUESTS = 512; + //////////////////////////////////////////////////////////////////////////// // LLLandmarkList @@ -69,6 +74,11 @@ LLLandmark* LLLandmarkList::getAsset(const LLUUID& asset_uuid, loaded_callback_t { return NULL; } + if ( mWaitList.find(asset_uuid) != mWaitList.end() ) + { + // Landmark is sheduled for download, but not requested yet + return NULL; + } landmark_requested_list_t::iterator iter = mRequestedList.find(asset_uuid); if (iter != mRequestedList.end()) @@ -86,6 +96,13 @@ LLLandmark* LLLandmarkList::getAsset(const LLUUID& asset_uuid, loaded_callback_t mLoadedCallbackMap.insert(vt); } + if (mRequestedList.size() > MAX_SIMULTANEOUS_REQUESTS) + { + // Postpone download till queu is emptier + mWaitList.insert(asset_uuid); + return NULL; + } + gAssetStorage->getAssetData(asset_uuid, LLAssetType::AT_LANDMARK, LLLandmarkList::processGetAssetReply, @@ -155,8 +172,22 @@ void LLLandmarkList::processGetAssetReply( } gLandmarkList.mBadList.insert(uuid); + gLandmarkList.mRequestedList.erase(uuid); //mBadList effectively blocks any load, so no point keeping id in requests + // todo: this should clean mLoadedCallbackMap! } + if (!gLandmarkList.mWaitList.empty()) + { + // start new download from wait list + landmark_uuid_list_t::iterator iter = gLandmarkList.mWaitList.begin(); + LLUUID asset_uuid = *iter; + gLandmarkList.mWaitList.erase(iter); + gAssetStorage->getAssetData(asset_uuid, + LLAssetType::AT_LANDMARK, + LLLandmarkList::processGetAssetReply, + NULL); + gLandmarkList.mRequestedList[asset_uuid] = gFrameTimeSeconds; + } } BOOL LLLandmarkList::isAssetInLoadedCallbackMap(const LLUUID& asset_uuid) diff --git a/indra/newview/lllandmarklist.h b/indra/newview/lllandmarklist.h index 3356f866ce..2e7bd25610 100644 --- a/indra/newview/lllandmarklist.h +++ b/indra/newview/lllandmarklist.h @@ -70,9 +70,10 @@ protected: typedef std::map landmark_list_t; landmark_list_t mList; - typedef std::set landmark_bad_list_t; - landmark_bad_list_t mBadList; - + typedef std::set landmark_uuid_list_t; + landmark_uuid_list_t mBadList; + landmark_uuid_list_t mWaitList; + typedef std::map landmark_requested_list_t; landmark_requested_list_t mRequestedList; diff --git a/indra/newview/lllogchat.cpp b/indra/newview/lllogchat.cpp index 7a8502b4a4..6a23d9acf1 100644 --- a/indra/newview/lllogchat.cpp +++ b/indra/newview/lllogchat.cpp @@ -876,8 +876,8 @@ bool LLLogChat::isTranscriptExist(const LLUUID& avatar_id, bool is_group) { std::string file_name; gCacheName->getGroupName(avatar_id, file_name); - file_name = makeLogFileName(file_name); - return isTranscriptFileFound(makeLogFileName(file_name)); + file_name = makeLogFileName(file_name + GROUP_CHAT_SUFFIX); + return isTranscriptFileFound(file_name); } //return false; // Unreachable code } diff --git a/indra/newview/llmaniprotate.cpp b/indra/newview/llmaniprotate.cpp index f158aae3d2..c3e39429a2 100644 --- a/indra/newview/llmaniprotate.cpp +++ b/indra/newview/llmaniprotate.cpp @@ -447,6 +447,7 @@ BOOL LLManipRotate::handleMouseDownOnPart( S32 x, S32 y, MASK mask ) } mMouseCur = mMouseDown; + mAgentSelfAtAxis = gAgent.getAtAxis(); // no point checking if avatar was selected, just save the value // Route future Mouse messages here preemptively. (Release on mouse up.) setMouseCapture( TRUE ); @@ -610,6 +611,26 @@ void LLManipRotate::drag( S32 x, S32 y ) else { object->setRotation(new_rot, damped); + LLVOAvatar* avatar = object->asAvatar(); + if (avatar && avatar->isSelf() + && LLSelectMgr::getInstance()->mAllowSelectAvatar + && !object->getParent()) + { + // Normal avatars use object's orienttion, but self uses + // separate LLCoordFrame + // See LVOAvatar::updateOrientation() + if (gAgentCamera.getFocusOnAvatar()) + { + //Don't rotate camera with avatar + gAgentCamera.setFocusOnAvatar(false, false, false); + } + + LLVector3 at_axis = mAgentSelfAtAxis; + at_axis *= mRotation; + at_axis.mV[VZ] = 0.f; + at_axis.normalize(); + gAgent.resetAxes(at_axis); + } rebuild(object); } @@ -717,7 +738,7 @@ void LLManipRotate::drag( S32 x, S32 y ) LLViewerObject *root_object = (cur == NULL) ? NULL : cur->getRootEdit(); if( cur->permModify() && cur->permMove() && !cur->isPermanentEnforced() && ((root_object == NULL) || !root_object->isPermanentEnforced()) && - !cur->isAvatar()) + (!cur->isAvatar() || LLSelectMgr::getInstance()->mAllowSelectAvatar)) { selectNode->mLastRotation = cur->getRotation(); selectNode->mLastPositionLocal = cur->getPosition(); diff --git a/indra/newview/llmaniprotate.h b/indra/newview/llmaniprotate.h index 42e667bf73..e6a519d174 100644 --- a/indra/newview/llmaniprotate.h +++ b/indra/newview/llmaniprotate.h @@ -95,6 +95,7 @@ private: LLVector3 mMouseDown; LLVector3 mMouseCur; + LLVector3 mAgentSelfAtAxis; // Own agent uses separate rotation method F32 mRadiusMeters; LLVector3 mCenterToCam; diff --git a/indra/newview/llmeshrepository.cpp b/indra/newview/llmeshrepository.cpp index 967691ee03..f674a89971 100644 --- a/indra/newview/llmeshrepository.cpp +++ b/indra/newview/llmeshrepository.cpp @@ -1633,7 +1633,7 @@ bool LLMeshRepoThread::fetchMeshPhysicsShape(const LLUUID& mesh_id) if (!zero) { //attempt to parse - if (physicsShapeReceived(mesh_id, buffer, size)) + if (physicsShapeReceived(mesh_id, buffer, size) == MESH_OK) { delete[] buffer; return true; @@ -1734,7 +1734,7 @@ bool LLMeshRepoThread::fetchMeshHeader(const LLVolumeParams& mesh_params, bool c LLMeshRepository::sCacheBytesRead += bytes; ++LLMeshRepository::sCacheReads; file.read(buffer, bytes); - if (headerReceived(mesh_params, buffer, bytes)) + if (headerReceived(mesh_params, buffer, bytes) == MESH_OK) { // Found mesh in VFS cache return true; @@ -1895,7 +1895,7 @@ bool LLMeshRepoThread::fetchMeshLOD(const LLVolumeParams& mesh_params, S32 lod, return retval; } -bool LLMeshRepoThread::headerReceived(const LLVolumeParams& mesh_params, U8* data, S32 data_size) +EMeshProcessingResult LLMeshRepoThread::headerReceived(const LLVolumeParams& mesh_params, U8* data, S32 data_size) { const LLUUID mesh_id = mesh_params.getSculptID(); LLSD header; @@ -1903,30 +1903,39 @@ bool LLMeshRepoThread::headerReceived(const LLVolumeParams& mesh_params, U8* dat U32 header_size = 0; if (data_size > 0) { - std::string res_str((char*) data, data_size); + std::istringstream stream; + try + { + std::string res_str((char*)data, data_size); - std::string deprecated_header(""); + std::string deprecated_header(""); - if (res_str.substr(0, deprecated_header.size()) == deprecated_header) - { - res_str = res_str.substr(deprecated_header.size()+1, data_size); - header_size = deprecated_header.size()+1; - } - data_size = res_str.size(); + if (res_str.substr(0, deprecated_header.size()) == deprecated_header) + { + res_str = res_str.substr(deprecated_header.size() + 1, data_size); + header_size = deprecated_header.size() + 1; + } + data_size = res_str.size(); - std::istringstream stream(res_str); + stream.str(res_str); + } + catch (std::bad_alloc&) + { + // out of memory, we won't be able to process this mesh + return MESH_OUT_OF_MEMORY; + } if (!LLSDSerialize::fromBinary(header, stream, data_size)) { LL_WARNS(LOG_MESH) << "Mesh header parse error. Not a valid mesh asset! ID: " << mesh_id << LL_ENDL; - return false; + return MESH_PARSE_FAILURE; } if (!header.isMap()) { LL_WARNS(LOG_MESH) << "Mesh header is invalid for ID: " << mesh_id << LL_ENDL; - return false; + return MESH_INVALID; } if (header.has("version") && header["version"].asInteger() > MAX_MESH_VERSION) @@ -1972,7 +1981,7 @@ bool LLMeshRepoThread::headerReceived(const LLVolumeParams& mesh_params, U8* dat } } - return true; + return MESH_OK; } EMeshProcessingResult LLMeshRepoThread::lodReceived(const LLVolumeParams& mesh_params, S32 lod, U8* data, S32 data_size) @@ -2023,18 +2032,25 @@ bool LLMeshRepoThread::skinInfoReceived(const LLUUID& mesh_id, U8* data, S32 dat if (data_size > 0) { - std::string res_str((char*) data, data_size); + try + { + std::string res_str((char*)data, data_size); + std::istringstream stream(res_str); - std::istringstream stream(res_str); - - U32 uzip_result = LLUZipHelper::unzip_llsd(skin, stream, data_size); - if (uzip_result != LLUZipHelper::ZR_OK) - { - LL_WARNS(LOG_MESH) << "Mesh skin info parse error. Not a valid mesh asset! ID: " << mesh_id - << " uzip result" << uzip_result - << LL_ENDL; - return false; - } + U32 uzip_result = LLUZipHelper::unzip_llsd(skin, stream, data_size); + if (uzip_result != LLUZipHelper::ZR_OK) + { + LL_WARNS(LOG_MESH) << "Mesh skin info parse error. Not a valid mesh asset! ID: " << mesh_id + << " uzip result" << uzip_result + << LL_ENDL; + return false; + } + } + catch (std::bad_alloc&) + { + LL_WARNS(LOG_MESH) << "Out of memory for mesh ID " << mesh_id << " of size: " << data_size << LL_ENDL; + return false; + } } { @@ -2056,19 +2072,26 @@ bool LLMeshRepoThread::decompositionReceived(const LLUUID& mesh_id, U8* data, S3 LLSD decomp; if (data_size > 0) - { - std::string res_str((char*) data, data_size); + { + try + { + std::string res_str((char*)data, data_size); + std::istringstream stream(res_str); - std::istringstream stream(res_str); - - U32 uzip_result = LLUZipHelper::unzip_llsd(decomp, stream, data_size); - if (uzip_result != LLUZipHelper::ZR_OK) - { - LL_WARNS(LOG_MESH) << "Mesh decomposition parse error. Not a valid mesh asset! ID: " << mesh_id - << " uzip result: " << uzip_result - << LL_ENDL; - return false; - } + U32 uzip_result = LLUZipHelper::unzip_llsd(decomp, stream, data_size); + if (uzip_result != LLUZipHelper::ZR_OK) + { + LL_WARNS(LOG_MESH) << "Mesh decomposition parse error. Not a valid mesh asset! ID: " << mesh_id + << " uzip result: " << uzip_result + << LL_ENDL; + return false; + } + } + catch (std::bad_alloc&) + { + LL_WARNS(LOG_MESH) << "Out of memory for mesh ID " << mesh_id << " of size: " << data_size << LL_ENDL; + return false; + } } { @@ -2083,7 +2106,7 @@ bool LLMeshRepoThread::decompositionReceived(const LLUUID& mesh_id, U8* data, S3 return true; } -bool LLMeshRepoThread::physicsShapeReceived(const LLUUID& mesh_id, U8* data, S32 data_size) +EMeshProcessingResult LLMeshRepoThread::physicsShapeReceived(const LLUUID& mesh_id, U8* data, S32 data_size) { LLSD physics_shape; @@ -2100,8 +2123,19 @@ bool LLMeshRepoThread::physicsShapeReceived(const LLUUID& mesh_id, U8* data, S32 volume_params.setType(LL_PCODE_PROFILE_SQUARE, LL_PCODE_PATH_LINE); volume_params.setSculptID(mesh_id, LL_SCULPT_TYPE_MESH); LLPointer volume = new LLVolume(volume_params,0); - std::string mesh_string((char*) data, data_size); - std::istringstream stream(mesh_string); + + std::istringstream stream; + try + { + std::string mesh_string((char*)data, data_size); + stream.str(mesh_string); + } + catch (std::bad_alloc&) + { + // out of memory, we won't be able to process this mesh + delete d; + return MESH_OUT_OF_MEMORY; + } if (volume->unpackVolumeFaces(stream, data_size)) { @@ -2140,7 +2174,7 @@ bool LLMeshRepoThread::physicsShapeReceived(const LLUUID& mesh_id, U8* data, S32 LLMutexLock lock(mMutex); mDecompositionQ.push_back(d); } - return true; + return MESH_OK; } LLMeshUploadThread::LLMeshUploadThread(LLMeshUploadThread::instance_list& data, LLVector3& scale, bool upload_textures, @@ -3252,15 +3286,21 @@ void LLMeshHeaderHandler::processData(LLCore::BufferArray * /* body */, S32 /* b U8 * data, S32 data_size) { LLUUID mesh_id = mMeshParams.getSculptID(); - bool success = (! MESH_HEADER_PROCESS_FAILED) - && ((data != NULL) == (data_size > 0)) // if we have data but no size or have size but no data, something is wrong - && gMeshRepo.mThread->headerReceived(mMeshParams, data, data_size); + bool success = (!MESH_HEADER_PROCESS_FAILED) + && ((data != NULL) == (data_size > 0)); // if we have data but no size or have size but no data, something is wrong; llassert(success); + EMeshProcessingResult res = MESH_UNKNOWN; + if (success) + { + res = gMeshRepo.mThread->headerReceived(mMeshParams, data, data_size); + success = (res == MESH_OK); + } if (! success) { // *TODO: Get real reason for parse failure here. Might we want to retry? LL_WARNS(LOG_MESH) << "Unable to parse mesh header. ID: " << mesh_id - << ", Unknown reason. Not retrying." + << ", Size: " << data_size + << ", Reason: " << res << " Not retrying." << LL_ENDL; // Can't get the header so none of the LODs will be available @@ -3544,7 +3584,7 @@ void LLMeshPhysicsShapeHandler::processData(LLCore::BufferArray * /* body */, S3 { if ((!MESH_PHYS_SHAPE_PROCESS_FAILED) && ((data != NULL) == (data_size > 0)) // if we have data but no size or have size but no data, something is wrong - && gMeshRepo.mThread->physicsShapeReceived(mMeshID, data, data_size)) + && gMeshRepo.mThread->physicsShapeReceived(mMeshID, data, data_size) == MESH_OK) { // good fetch from sim, write to VFS for caching LLVFile file(gVFS, mMeshID, LLAssetType::AT_MESH, LLVFile::WRITE); diff --git a/indra/newview/llmeshrepository.h b/indra/newview/llmeshrepository.h index 4035e0b4ea..038bfabdc1 100644 --- a/indra/newview/llmeshrepository.h +++ b/indra/newview/llmeshrepository.h @@ -59,6 +59,8 @@ typedef enum e_mesh_processing_result_enum MESH_NO_DATA = 1, MESH_OUT_OF_MEMORY, MESH_HTTP_REQUEST_FAILED, + MESH_PARSE_FAILURE, + MESH_INVALID, MESH_UNKNOWN } EMeshProcessingResult; @@ -344,11 +346,11 @@ public: bool fetchMeshHeader(const LLVolumeParams& mesh_params, bool can_retry = true); bool fetchMeshLOD(const LLVolumeParams& mesh_params, S32 lod, bool can_retry = true); - bool headerReceived(const LLVolumeParams& mesh_params, U8* data, S32 data_size); + EMeshProcessingResult headerReceived(const LLVolumeParams& mesh_params, U8* data, S32 data_size); EMeshProcessingResult lodReceived(const LLVolumeParams& mesh_params, S32 lod, U8* data, S32 data_size); bool skinInfoReceived(const LLUUID& mesh_id, U8* data, S32 data_size); bool decompositionReceived(const LLUUID& mesh_id, U8* data, S32 data_size); - bool physicsShapeReceived(const LLUUID& mesh_id, U8* data, S32 data_size); + EMeshProcessingResult physicsShapeReceived(const LLUUID& mesh_id, U8* data, S32 data_size); bool hasPhysicsShapeInHeader(const LLUUID& mesh_id); void notifyLoadedMeshes(); diff --git a/indra/newview/llnetmap.cpp b/indra/newview/llnetmap.cpp index 2369f00669..f0eafeb38a 100644 --- a/indra/newview/llnetmap.cpp +++ b/indra/newview/llnetmap.cpp @@ -1096,7 +1096,7 @@ BOOL LLNetMap::handleToolTip( S32 x, S32 y, MASK mask ) // region_name = region->getName(); // [RLVa:KB] - Checked: RLVa-1.2.2 - region_name = (RlvActions::canShowLocation()) ? region->getName() : RlvStrings::getString(RLV_STRING_HIDDEN_REGION); + region_name = (RlvActions::canShowLocation()) ? region->getName() : RlvStrings::getString(RlvStringKeys::Hidden::Region); // [/RLVa:KB] // Synchronize tooltips throughout instances //if (!region_name.empty()) diff --git a/indra/newview/llpanelexperiences.cpp b/indra/newview/llpanelexperiences.cpp index 37981b36a9..91d3b523fb 100644 --- a/indra/newview/llpanelexperiences.cpp +++ b/indra/newview/llpanelexperiences.cpp @@ -93,9 +93,20 @@ void LLPanelExperiences::setExperienceList( const LLSD& experiences ) item->init(public_key); mExperiencesList->addItem(item, public_key); + + const LLSD& experience_details = LLExperienceCache::instance().get(public_key); + if (experience_details.isUndefined()) + { + LLExperienceCache::instance().get(public_key, boost::bind(&LLPanelExperiences::sortExperiencesList, this)); + } } - mExperiencesList->sort(); + sortExperiencesList(); +} + +void LLPanelExperiences::sortExperiencesList() +{ + mExperiencesList->sort(); } void LLPanelExperiences::getExperienceIdsList(std::vector& result) diff --git a/indra/newview/llpanelexperiences.h b/indra/newview/llpanelexperiences.h index f29fdfdecb..9d5afd1a6a 100644 --- a/indra/newview/llpanelexperiences.h +++ b/indra/newview/llpanelexperiences.h @@ -60,6 +60,8 @@ public: void setExperienceList(const LLSD& experiences); void getExperienceIdsList(std::vector& result); + void sortExperiencesList(); + LLExperienceItem* getSelectedExperienceItem(); void removeExperiences( const LLSD& ids ); void removeExperience( const LLUUID& id); diff --git a/indra/newview/llpanelmarketplaceinboxinventory.cpp b/indra/newview/llpanelmarketplaceinboxinventory.cpp index cb9e11e233..bdc38e0233 100644 --- a/indra/newview/llpanelmarketplaceinboxinventory.cpp +++ b/indra/newview/llpanelmarketplaceinboxinventory.cpp @@ -36,6 +36,7 @@ #include "llpanellandmarks.h" #include "llplacesinventorybridge.h" #include "llviewerfoldertype.h" +#include "llsdserialize.h" #include "lltrans.h" @@ -44,6 +45,8 @@ const LLColor4U DEFAULT_WHITE(255, 255, 255); +const std::string NEW_INBOX_FILENAME("inbox_new_items.xml"); + // // statics // @@ -59,7 +62,9 @@ static LLDefaultChildRegistry::Register r3("inbox_folder_ LLInboxInventoryPanel::LLInboxInventoryPanel(const LLInboxInventoryPanel::Params& p) : LLInventoryPanel(p) -{} +{ + LLInboxNewItemsStorage::getInstance()->load(); +} LLInboxInventoryPanel::~LLInboxInventoryPanel() {} @@ -149,7 +154,7 @@ void LLInboxFolderViewFolder::addItem(LLFolderViewItem* item) } // Compute freshness if our parent is the root folder for the inbox - if (mParentFolder == mRoot) + if ((mParentFolder == mRoot) && !mFresh) { computeFreshness(); } @@ -167,6 +172,12 @@ void LLInboxFolderViewFolder::draw() setBadgeVisibility(mFresh); LLFolderViewFolder::draw(); + + if (mFresh) + { + reshapeBadge(getRect()); + } + } BOOL LLInboxFolderViewFolder::handleMouseDown( S32 x, S32 y, MASK mask ) @@ -189,11 +200,12 @@ void LLInboxFolderViewFolder::selectItem() void LLInboxFolderViewFolder::computeFreshness() { + LLFolderViewModelItemInventory* view_model = static_cast(getViewModelItem()); const U32 last_expansion_utc = gSavedPerAccountSettings.getU32("LastInventoryInboxActivity"); if (last_expansion_utc > 0) { - mFresh = (static_cast(getViewModelItem())->getCreationDate() > last_expansion_utc); + mFresh = (view_model->getCreationDate() > last_expansion_utc) || LLInboxNewItemsStorage::getInstance()->isItemFresh(view_model->getUUID()); #if DEBUGGING_FRESHNESS if (mFresh) @@ -206,6 +218,11 @@ void LLInboxFolderViewFolder::computeFreshness() { mFresh = true; } + + if (mFresh) + { + LLInboxNewItemsStorage::getInstance()->addFreshItem(view_model->getUUID()); + } } void LLInboxFolderViewFolder::deFreshify() @@ -213,6 +230,7 @@ void LLInboxFolderViewFolder::deFreshify() mFresh = false; gSavedPerAccountSettings.setU32("LastInventoryInboxActivity", time_corrected()); + LLInboxNewItemsStorage::getInstance()->removeItem(static_cast(getViewModelItem())->getUUID()); } // @@ -295,5 +313,55 @@ void LLInboxFolderViewItem::deFreshify() gSavedPerAccountSettings.setU32("LastInventoryInboxActivity", time_corrected()); } +LLInboxNewItemsStorage::LLInboxNewItemsStorage() +{ +} +// static +void LLInboxNewItemsStorage::destroyClass() +{ + LLInboxNewItemsStorage::getInstance()->saveNewItemsIds(); +} + +void LLInboxNewItemsStorage::saveNewItemsIds() +{ + std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, NEW_INBOX_FILENAME); + if (!filename.empty()) + { + LLSD uuids_data; + for (std::set::const_iterator it = mNewItemsIDs.begin(); it != mNewItemsIDs.end(); it++) + { + uuids_data.append((*it)); + } + + llofstream file; + file.open(filename.c_str()); + if ( file.is_open() ) + { + LLSDSerialize::toPrettyXML(uuids_data, file); + file.close(); + } + } +} + +void LLInboxNewItemsStorage::load() +{ + std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, NEW_INBOX_FILENAME); + if (!filename.empty()) + { + llifstream in_file; + in_file.open(filename.c_str()); + + LLSD uuids_data; + if (in_file.is_open()) + { + LLSDSerialize::fromXML(uuids_data, in_file); + in_file.close(); + for (LLSD::array_iterator i = uuids_data.beginArray(); i != uuids_data.endArray(); ++i) + { + mNewItemsIDs.insert((*i).asUUID()); + } + } + } +} // eof diff --git a/indra/newview/llpanelmarketplaceinboxinventory.h b/indra/newview/llpanelmarketplaceinboxinventory.h index 0b27818c95..3e508e801b 100644 --- a/indra/newview/llpanelmarketplaceinboxinventory.h +++ b/indra/newview/llpanelmarketplaceinboxinventory.h @@ -113,4 +113,23 @@ protected: bool mFresh; }; +class LLInboxNewItemsStorage : public LLSingleton + , public LLDestroyClass +{ + LLSINGLETON(LLInboxNewItemsStorage); + LOG_CLASS(LLInboxNewItemsStorage); +public: + static void destroyClass(); + void saveNewItemsIds(); + + void load(); + + void addFreshItem(const LLUUID& id) { mNewItemsIDs.insert(id); } + void removeItem(const LLUUID& id) { mNewItemsIDs.erase(id); } + bool isItemFresh(const LLUUID& id) { return (mNewItemsIDs.find(id) != mNewItemsIDs.end()); } + +private: + std::set mNewItemsIDs; +}; + #endif //LL_INBOXINVENTORYPANEL_H diff --git a/indra/newview/llpanelobjectinventory.cpp b/indra/newview/llpanelobjectinventory.cpp index ae21eddd3a..4e37d8da59 100644 --- a/indra/newview/llpanelobjectinventory.cpp +++ b/indra/newview/llpanelobjectinventory.cpp @@ -1408,6 +1408,7 @@ LLPanelObjectInventory::LLPanelObjectInventory(const LLPanelObjectInventory::Par mCommitCallbackRegistrar.add("Inventory.BeginIMSession", boost::bind(&do_nothing)); mCommitCallbackRegistrar.add("Inventory.Share", boost::bind(&LLAvatarActions::shareWithAvatars, this)); mCommitCallbackRegistrar.add("Inventory.FileUploadLocation", boost::bind(&do_nothing)); + mCommitCallbackRegistrar.add("Inventory.SetFavoritesFolder", boost::bind(&do_nothing)); // Prevent warning "No callback found for: 'Inventory.SetFavoritesFolder' in control: Set Favorites folder" mCommitCallbackRegistrar.add("Inventory.CustomAction", boost::bind(&do_nothing)); // Prevent warning "No callback found for: 'Inventory.CustomAction' in control: Find Links" } diff --git a/indra/newview/llpanelpeoplemenus.cpp b/indra/newview/llpanelpeoplemenus.cpp index a516f14fb9..1e3d14b811 100644 --- a/indra/newview/llpanelpeoplemenus.cpp +++ b/indra/newview/llpanelpeoplemenus.cpp @@ -290,6 +290,12 @@ bool PeopleContextMenu::enableContextMenuItem(const LLSD& userdata) { return LLLogChat::isTranscriptExist(mUUIDs.front()); } +// [RLVa:KB] - @pay + else if (item == std::string("can_pay")) + { + return RlvActions::canPayAvatar(mUUIDs.front()); + } +// [/RLVa:KB] else if (item == std::string("can_im") || item == std::string("can_invite") || item == std::string("can_share") || item == std::string("can_pay")) { diff --git a/indra/newview/llpanelprimmediacontrols.cpp b/indra/newview/llpanelprimmediacontrols.cpp index 0538a96daf..e22c7df5f7 100644 --- a/indra/newview/llpanelprimmediacontrols.cpp +++ b/indra/newview/llpanelprimmediacontrols.cpp @@ -73,6 +73,7 @@ bool get_hud_matrices(glh::matrix4f &proj, glh::matrix4f &model); const LLPanelPrimMediaControls::EZoomLevel LLPanelPrimMediaControls::kZoomLevels[] = { ZOOM_NONE, ZOOM_MEDIUM }; const int LLPanelPrimMediaControls::kNumZoomLevels = 2; +const F32 EXCEEDING_ZOOM_DISTANCE = 0.5f; // // LLPanelPrimMediaControls // @@ -93,6 +94,7 @@ LLPanelPrimMediaControls::LLPanelPrimMediaControls() : mZoomObjectID(LLUUID::null), mZoomObjectFace(0), mVolumeSliderVisible(0), + mZoomedCameraPos(), mWindowShade(NULL), mHideImmediately(false), mSecureURL(false), @@ -256,7 +258,7 @@ void LLPanelPrimMediaControls::focusOnTarget() LLViewerMediaImpl* media_impl = getTargetMediaImpl(); if(media_impl) { - if(!media_impl->hasFocus()) + if (!media_impl->hasFocus()) { // The current target doesn't have media focus -- focus on it. LLViewerObject* objectp = getTargetObject(); @@ -307,7 +309,8 @@ void LLPanelPrimMediaControls::updateShape() bool can_navigate = parcel->getMediaAllowNavigate(); bool enabled = false; - bool is_zoomed = (mCurrentZoom != ZOOM_NONE) && (mTargetObjectID == mZoomObjectID) && (mTargetObjectFace == mZoomObjectFace); + bool is_zoomed = (mCurrentZoom != ZOOM_NONE) && (mTargetObjectID == mZoomObjectID) && (mTargetObjectFace == mZoomObjectFace) && !isZoomDistExceeding(); + // There is no such thing as "has_focus" being different from normal controls set // anymore (as of user feedback from bri 10/09). So we cheat here and force 'has_focus' // to 'true' (or, actually, we use a setting) @@ -1143,7 +1146,7 @@ void LLPanelPrimMediaControls::updateZoom() if (zoom_padding > 0.0f) { // since we only zoom into medium for now, always set zoom_in constraint to true - LLViewerMediaFocus::setCameraZoom(getTargetObject(), mTargetObjectNormal, zoom_padding, true); + mZoomedCameraPos = LLViewerMediaFocus::setCameraZoom(getTargetObject(), mTargetObjectNormal, zoom_padding, true); } // Remember the object ID/face we zoomed into, so we can update the zoom icon appropriately @@ -1403,6 +1406,10 @@ bool LLPanelPrimMediaControls::shouldVolumeSliderBeVisible() return mVolumeSliderVisible > 0; } +bool LLPanelPrimMediaControls::isZoomDistExceeding() +{ + return (gAgentCamera.getCameraPositionGlobal() - mZoomedCameraPos).normalize() >= EXCEEDING_ZOOM_DISTANCE; +} void LLPanelPrimMediaControls::clearFaceOnFade() { diff --git a/indra/newview/llpanelprimmediacontrols.h b/indra/newview/llpanelprimmediacontrols.h index d4301aaf7c..86fc036553 100644 --- a/indra/newview/llpanelprimmediacontrols.h +++ b/indra/newview/llpanelprimmediacontrols.h @@ -119,6 +119,8 @@ private: void showVolumeSlider(); void hideVolumeSlider(); bool shouldVolumeSliderBeVisible(); + + bool isZoomDistExceeding(); static void onScrollUp(void* user_data); static void onScrollUpHeld(void* user_data); @@ -183,6 +185,8 @@ private: F32 mZoomMediumPadding; F32 mZoomFarPadding; S32 mTopWorldViewAvoidZone; + + LLVector3d mZoomedCameraPos; LLUICtrl *mMediaPanelScroll; LLButton *mScrollUpCtrl; diff --git a/indra/newview/llpresetsmanager.cpp b/indra/newview/llpresetsmanager.cpp index f4d6ec4ae1..d99466ec28 100644 --- a/indra/newview/llpresetsmanager.cpp +++ b/indra/newview/llpresetsmanager.cpp @@ -275,8 +275,10 @@ void LLPresetsManager::getControlNames(std::vector& names) // From panel_preferences_move.xml ("CameraAngle") ("CameraOffsetScale") - ("EditCameraMovement") - ("AppearanceCameraMovement") + // FIRE-29930: Don't include these settings as it might be confusing why settings suddenly reset + //("EditCameraMovement") + //("AppearanceCameraMovement") + // // From llagentcamera.cpp ("CameraOffsetBuild") ("TrackFocusObject") @@ -286,9 +288,6 @@ void LLPresetsManager::getControlNames(std::vector& names) // Additional settings ("ZoomTime") ("CameraPositionSmoothing") - ("EditAppearanceLighting") - ("FSDisableMouseWheelCameraZoom") - ("DisableCameraConstraints") // ; names = camera_controls; diff --git a/indra/newview/llprogressview.cpp b/indra/newview/llprogressview.cpp index dce2981d11..2cf2d62dfc 100644 --- a/indra/newview/llprogressview.cpp +++ b/indra/newview/llprogressview.cpp @@ -464,9 +464,9 @@ void LLProgressView::initLogos() const S32 default_pad = 15; S32 icon_width; -#if defined(LL_FMODSTUDIO) || defined(HAVOK_TPV) +#if defined(LL_FMODSTUDIO) || defined(LL_HAVOK) S32 icon_height; -#endif // defined(LL_FMODSTUDIO) || defined(HAVOK_TPV) +#endif // defined(LL_FMODSTUDIO) || defined(LL_HAVOK) // We don't know final screen rect yet, so we can't precalculate position fully LLTextBox *logos_label = getChild("logos_lbl"); @@ -481,40 +481,35 @@ void LLProgressView::initLogos() temp_str += gDirUtilp->getDirDelimiter(); -#if defined(LL_FMODSTUDIO) || defined(HAVOK_TPV) - S32 pad_y = 0; // Build fix -#endif // defined(LL_FMODSTUDIO) || defined(HAVOK_TPV) - #ifdef LL_FMODSTUDIO // original image size is 264x96, it is on longer side but // with no internal paddings so it gets additional padding icon_width = 77; icon_height = 21; - /*S32*/ pad_y = 4; // Build fix + S32 pad_fmod_y = 4; texture_start_x++; loadLogo(temp_str + "fmod_logo.png", image_codec, - LLRect(texture_start_x, texture_start_y + pad_y + icon_height, texture_start_x + icon_width, texture_start_y + pad_y), + LLRect(texture_start_x, texture_start_y + pad_fmod_y + icon_height, texture_start_x + icon_width, texture_start_y + pad_fmod_y), default_clip, default_clip); texture_start_x += icon_width + default_pad + 1; -#endif - -#ifdef HAVOK_TPV // Don't show on non-Havok builds +#endif //LL_FMODSTUDIO +#ifdef LL_HAVOK // original image size is 342x113, central element is on a larger side // plus internal padding, so it gets slightly more height than desired 32 icon_width = 88; icon_height = 29; - pad_y = -1; + S32 pad_havok_y = -1; loadLogo(temp_str + "havok_logo.png", image_codec, - LLRect(texture_start_x, texture_start_y + pad_y + icon_height, texture_start_x + icon_width, texture_start_y + pad_y), + LLRect(texture_start_x, texture_start_y + pad_havok_y + icon_height, texture_start_x + icon_width, texture_start_y + pad_havok_y), default_clip, default_clip); texture_start_x += icon_width + default_pad; -#endif // Don't show on non-Havok builds +#endif //LL_HAVOK // 108x41 icon_width = 74; diff --git a/indra/newview/llsecapi.cpp b/indra/newview/llsecapi.cpp index 580e6aa5af..78c8aa1dcf 100644 --- a/indra/newview/llsecapi.cpp +++ b/indra/newview/llsecapi.cpp @@ -172,3 +172,10 @@ void LLCredential::authenticatorType(std::string &idType) } } + +LLCertException::LLCertException(const LLSD& cert_data, const std::string& msg) + : LLException(msg), + mCertData(cert_data) +{ + LL_WARNS("SECAPI") << "Certificate Error: " << msg << LL_ENDL; +} diff --git a/indra/newview/llsecapi.h b/indra/newview/llsecapi.h index dfd7aeb9e9..c2ccb8f779 100644 --- a/indra/newview/llsecapi.h +++ b/indra/newview/llsecapi.h @@ -75,6 +75,7 @@ #define CERT_EXTENDED_KEY_USAGE "extendedKeyUsage" #define CERT_EKU_SERVER_AUTH SN_server_auth +#define CERT_EKU_TLS_SERVER_AUTH LN_server_auth #define CERT_SUBJECT_KEY_IDENTFIER "subjectKeyIdentifier" #define CERT_AUTHORITY_KEY_IDENTIFIER "authorityKeyIdentifier" @@ -334,17 +335,23 @@ std::ostream& operator <<(std::ostream& s, const LLCredential& cred); class LLCertException: public LLException { public: - LLCertException(const LLSD& cert_data, const std::string& msg): LLException(msg), - mCertData(cert_data) - { - LL_WARNS("SECAPI") << "Certificate Error: " << msg << LL_ENDL; - } + LLCertException(const LLSD& cert_data, const std::string& msg); virtual ~LLCertException() throw() {} LLSD getCertData() const { return mCertData; } protected: LLSD mCertData; }; +class LLAllocationCertException : public LLCertException +{ +public: + LLAllocationCertException(const LLSD& cert_data) : LLCertException(cert_data, "CertAllocationFailure") + { + } + virtual ~LLAllocationCertException() throw() {} +protected: +}; + class LLInvalidCertificate : public LLCertException { public: diff --git a/indra/newview/llsechandler_basic.cpp b/indra/newview/llsechandler_basic.cpp index 4d641ae17b..8ac375dd2f 100644 --- a/indra/newview/llsechandler_basic.cpp +++ b/indra/newview/llsechandler_basic.cpp @@ -78,16 +78,16 @@ LLBasicCertificate::LLBasicCertificate(const std::string& pem_cert, BIO * pem_bio = BIO_new_mem_buf((void*)pem_cert.c_str(), pem_cert.length()); if(pem_bio == NULL) { - LL_WARNS("SECAPI") << "Could not allocate an openssl memory BIO." << LL_ENDL; - LLTHROW(LLInvalidCertificate(LLSD::emptyMap())); + LL_WARNS("SECAPI") << "Could not allocate an openssl memory BIO." << LL_ENDL; + LLTHROW(LLAllocationCertException(LLSD::emptyMap())); } mCert = NULL; PEM_read_bio_X509(pem_bio, &mCert, 0, NULL); BIO_free(pem_bio); if (!mCert) { - LL_WARNS("SECAPI") << "Could not decode certificate to x509." << LL_ENDL; - LLTHROW(LLInvalidCertificate(LLSD::emptyMap())); + LL_WARNS("SECAPI") << "Could not decode certificate to x509." << LL_ENDL; + LLTHROW(LLInvalidCertificate(LLSD::emptyMap())); } } @@ -932,9 +932,13 @@ void _validateCert(int validation_policy, LLTHROW(LLCertKeyUsageValidationException(current_cert_info)); } // only validate EKU if the cert has it - if(current_cert_info.has(CERT_EXTENDED_KEY_USAGE) && current_cert_info[CERT_EXTENDED_KEY_USAGE].isArray() && - (!_LLSDArrayIncludesValue(current_cert_info[CERT_EXTENDED_KEY_USAGE], - LLSD((std::string)CERT_EKU_SERVER_AUTH)))) + if(current_cert_info.has(CERT_EXTENDED_KEY_USAGE) + && current_cert_info[CERT_EXTENDED_KEY_USAGE].isArray() + && (!_LLSDArrayIncludesValue(current_cert_info[CERT_EXTENDED_KEY_USAGE], + LLSD((std::string)CERT_EKU_TLS_SERVER_AUTH))) + && (!_LLSDArrayIncludesValue(current_cert_info[CERT_EXTENDED_KEY_USAGE], + LLSD((std::string)CERT_EKU_SERVER_AUTH))) + ) { LLTHROW(LLCertKeyUsageValidationException(current_cert_info)); } diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp index 3f7e53e5d9..d0945ef8ad 100644 --- a/indra/newview/llselectmgr.cpp +++ b/indra/newview/llselectmgr.cpp @@ -325,6 +325,27 @@ void LLSelectMgr::updateEffects() } } +void LLSelectMgr::resetObjectOverrides() +{ + resetObjectOverrides(getSelection()); +} + +void LLSelectMgr::resetObjectOverrides(LLObjectSelectionHandle selected_handle) +{ + struct f : public LLSelectedNodeFunctor + { + virtual bool apply(LLSelectNode* node) + { + node->mLastPositionLocal.setVec(0, 0, 0); + node->mLastRotation = LLQuaternion(); + node->mLastScale.setVec(0, 0, 0); + return true; + } + } func; + + selected_handle->applyToNodes(&func); +} + void LLSelectMgr::overrideObjectUpdates() { //override any position updates from simulator on objects being edited @@ -4045,11 +4066,11 @@ BOOL LLSelectMgr::selectGetAggregateTexturePermissions(LLAggregatePermissions& r return TRUE; } -BOOL LLSelectMgr::isSelfAvatarSelected() +BOOL LLSelectMgr::isMovableAvatarSelected() { if (mAllowSelectAvatar) { - return (getSelection()->getObjectCount() == 1) && (getSelection()->getFirstRootObject() == gAgentAvatarp); + return (getSelection()->getObjectCount() == 1) && (getSelection()->getFirstRootObject()->isAvatar()) && getSelection()->getFirstMoveableNode(TRUE); } return FALSE; } @@ -5314,18 +5335,27 @@ void LLSelectMgr::sendListToRegions(LLObjectSelectionHandle selected_handle, bool link_operation = message_name == "ObjectLink"; - //clear update override data (allow next update through) - struct f : public LLSelectedNodeFunctor - { - virtual bool apply(LLSelectNode* node) - { - node->mLastPositionLocal.setVec(0,0,0); - node->mLastRotation = LLQuaternion(); - node->mLastScale.setVec(0,0,0); - return true; - } - } func; - selected_handle->applyToNodes(&func); + if (mAllowSelectAvatar) + { + if (selected_handle->getObjectCount() == 1 + && selected_handle->getFirstObject() != NULL + && selected_handle->getFirstObject()->isAvatar()) + { + // Server doesn't move avatars at the moment, it is a local debug feature, + // but server does update position regularly, so do not drop mLastPositionLocal + // Position override for avatar gets reset in LLAgentCamera::resetView(). + } + else + { + // drop mLastPositionLocal (allow next update through) + resetObjectOverrides(selected_handle); + } + } + else + { + //clear update override data (allow next update through) + resetObjectOverrides(selected_handle); + } std::queue nodes_to_send; @@ -7072,98 +7102,26 @@ void LLSelectMgr::pauseAssociatedAvatars() mSelectedObjects->mSelectType = getSelectTypeForObject(object); - bool is_attached = false; - // Chalice Yao's pause agent on attachment selection - //if (mSelectedObjects->mSelectType == SELECT_TYPE_ATTACHMENT && - // isAgentAvatarValid()) + LLVOAvatar* parent_av = NULL; if (mSelectedObjects->mSelectType == SELECT_TYPE_ATTACHMENT) - // { // Selection can be obsolete, confirm that this is an attachment - LLViewerObject* parent = (LLViewerObject*)object->getParent(); - while (parent != NULL) - { - if (parent->isAvatar()) - { - is_attached = true; - break; - } - else - { - parent = (LLViewerObject*)parent->getParent(); - } - } + // and find parent avatar + parent_av = object->getAvatarAncestor(); } - - if (is_attached) + // Can be both an attachment and animated object + if (parent_av) { - if (object->isAnimatedObject()) - { - // Is an animated object attachment. - // Pause both the control avatar and the avatar it's attached to. - if (object->getControlAvatar()) - { - mPauseRequests.push_back(object->getControlAvatar()->requestPause()); - } - // Chalice Yao's pause agent on attachment selection - //mPauseRequests.push_back(gAgentAvatarp->requestPause()); - if (isAgentAvatarValid() && object->permYouOwner()) - { - mPauseRequests.push_back(gAgentAvatarp->requestPause()); - } - else - { - LLViewerObject* objectp = object; - if (objectp && objectp->isAttachment()) - { - while (objectp && !objectp->isAvatar()) - { - objectp = (LLViewerObject*)objectp->getParent(); - } - - if (objectp && objectp->isAvatar()) - { - mPauseRequests.push_back(objectp->asAvatar()->requestPause()); - } - } - } - // - } - else - { - // Is a regular attachment. Pause the avatar it's attached to. - // Chalice Yao's pause agent on attachment selection - //mPauseRequests.push_back(gAgentAvatarp->requestPause()); - if (isAgentAvatarValid() && object->permYouOwner()) - { - mPauseRequests.push_back(gAgentAvatarp->requestPause()); - } - else - { - LLViewerObject* objectp = object; - if (objectp && objectp->isAttachment()) - { - while (objectp && !objectp->isAvatar()) - { - objectp = (LLViewerObject*)objectp->getParent(); - } - - if (objectp && objectp->isAvatar()) - { - mPauseRequests.push_back(objectp->asAvatar()->requestPause()); - } - } - } - // - } + // It's an attachment. Pause the avatar it's attached to. + mPauseRequests.push_back(parent_av->requestPause()); } - else if (object && object->isAnimatedObject() && object->getControlAvatar()) + + if (object->isAnimatedObject() && object->getControlAvatar()) { - // Is a non-attached animated object. Pause the control avatar. + // It's an animated object. Pause the control avatar. mPauseRequests.push_back(object->getControlAvatar()->requestPause()); } - } } diff --git a/indra/newview/llselectmgr.h b/indra/newview/llselectmgr.h index ee8cf57216..e9ca79797d 100644 --- a/indra/newview/llselectmgr.h +++ b/indra/newview/llselectmgr.h @@ -528,6 +528,13 @@ public: void clearSelections(); void update(); void updateEffects(); // Update HUD effects + + // When we edit object's position/rotation/scale we set local + // overrides and ignore any updates (override received valeus). + // When we send data to server, we send local values and reset + // overrides + void resetObjectOverrides(); + void resetObjectOverrides(LLObjectSelectionHandle selected_handle); void overrideObjectUpdates(); // Returns the previous value of mForceSelection @@ -804,7 +811,7 @@ public: LLPermissions* findObjectPermissions(const LLViewerObject* object); - BOOL isSelfAvatarSelected(); + BOOL isMovableAvatarSelected(); void selectDelete(); // Delete on simulator void selectForceDelete(); // just delete, no into trash diff --git a/indra/newview/llslurl.cpp b/indra/newview/llslurl.cpp index 2831e73ba8..f9b0dc241d 100644 --- a/indra/newview/llslurl.cpp +++ b/indra/newview/llslurl.cpp @@ -398,7 +398,7 @@ std::string LLSLURL::getSLURLString() const // [RLVa:KB] - Checked: 2010-04-05 (RLVa-1.2.0d) | Added: RLVa-1.2.0d return LLGridManager::getInstance()->getSLURLBase(mGrid) + ( ((!gRlvHandler.hasBehaviour(RLV_BHVR_SHOWLOC)) || (!RlvUtil::isNearbyRegion(mRegion))) - ? (LLURI::escape(mRegion) + llformat("/%d/%d/%d",x,y,z)) : RlvStrings::getString(RLV_STRING_HIDDEN_REGION) ); + ? (LLURI::escape(mRegion) + llformat("/%d/%d/%d",x,y,z)) : RlvStrings::getString(RlvStringKeys::Hidden::Region) ); // [/RLVa:KB] } case APP: diff --git a/indra/newview/llspatialpartition.cpp b/indra/newview/llspatialpartition.cpp index 08b0f825ca..96595e3ce1 100644 --- a/indra/newview/llspatialpartition.cpp +++ b/indra/newview/llspatialpartition.cpp @@ -3604,7 +3604,7 @@ public: U8 index = facep->getTextureIndex(); if (facep->mDrawInfo) { - if (index < 255) + if (index < FACE_DO_NOT_BATCH_TEXTURES) { if (facep->mDrawInfo->mTextureList.size() <= index) { diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp index fffa153389..c4c46e2bff 100644 --- a/indra/newview/llstartup.cpp +++ b/indra/newview/llstartup.cpp @@ -1096,7 +1096,7 @@ bool idle_startup() } // [RLVa:KB] - Patch: RLVa-2.1.0 - if (gSavedSettings.getBOOL(RLV_SETTING_MAIN)) + if (gSavedSettings.get(RlvSettingNames::Main)) { show_connect_box = TRUE; } @@ -1326,7 +1326,7 @@ bool idle_startup() } // [RLVa:KB] - Checked: RLVa-0.2.1 - if (gSavedSettings.getBOOL(RLV_SETTING_MAIN)) + if (gSavedSettings.get(RlvSettingNames::Main)) { RlvHandler::setEnabled(true); } @@ -1425,9 +1425,9 @@ bool idle_startup() } // Set PerAccountSettingsFile to the default value. - gSavedSettings.setString("PerAccountSettingsFile", - gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, - LLAppViewer::instance()->getSettingsFilename("Default", "PerAccount"))); + std::string settings_per_account = gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, LLAppViewer::instance()->getSettingsFilename("Default", "PerAccount")); + gSavedSettings.setString("PerAccountSettingsFile", settings_per_account); + gDebugInfo["PerAccountSettingsFilename"] = settings_per_account; // Note: can't store warnings files per account because some come up before login @@ -1716,7 +1716,7 @@ bool idle_startup() // If optional was skipped this case shouldn't // be reached. - LL_INFOS() << "Forcing a quit due to update." << LL_ENDL; + LL_INFOS("LLStartup") << "Forcing a quit due to update." << LL_ENDL; LLLoginInstance::getInstance()->disconnect(); LLAppViewer::instance()->forceQuit(); } @@ -1737,7 +1737,24 @@ bool idle_startup() { // This was a certificate error, so grab the certificate // and throw up the appropriate dialog. - LLPointer certificate = gSecAPIHandler->getCertificate(response["certificate"]); + LLPointer certificate; + try + { + certificate = gSecAPIHandler->getCertificate(response["certificate"]); + } + catch (LLCertException &cert_exception) + { + LL_WARNS("LLStartup", "SECAPI") << "Caught " << cert_exception.what() << " certificate expception on getCertificate("<< response["certificate"] << ")" << LL_ENDL; + LLSD args; + args["REASON"] = LLTrans::getString(cert_exception.what()); + + LLNotificationsUtil::add("GeneralCertificateErrorShort", args, response, + general_cert_done); + + reset_login(); + gSavedSettings.setBOOL("AutoLogin", FALSE); + show_connect_box = true; + } if(certificate) { LLSD args = transform_cert_args(certificate); diff --git a/indra/newview/llteleporthistory.cpp b/indra/newview/llteleporthistory.cpp index 81406ee55c..5d4bcc27e3 100644 --- a/indra/newview/llteleporthistory.cpp +++ b/indra/newview/llteleporthistory.cpp @@ -187,7 +187,7 @@ void LLTeleportHistory::updateCurrentLocation(const LLVector3d& new_pos) } else { - mItems[mCurrentItem] = LLTeleportHistoryItem(RlvStrings::getString(RLV_STRING_HIDDEN_PARCEL), LLVector3d::zero); + mItems[mCurrentItem] = LLTeleportHistoryItem(RlvStrings::getString(RlvStringKeys::Hidden::Parcel), LLVector3d::zero); } // [/RLVa:KB] } diff --git a/indra/newview/lltexturectrl.cpp b/indra/newview/lltexturectrl.cpp index 6f28f699f2..48e20e4fc2 100644 --- a/indra/newview/lltexturectrl.cpp +++ b/indra/newview/lltexturectrl.cpp @@ -152,17 +152,17 @@ void LLFloaterTexturePicker::setImageID(const LLUUID& image_id, bool set_selecti if (LLAvatarAppearanceDefines::LLAvatarAppearanceDictionary::isBakedImageId(mImageAssetID)) { - if ( mBakeTextureEnabled && mModeSelector->getSelectedIndex() != 2) + if ( mBakeTextureEnabled && mModeSelector->getValue().asInteger() != 2) { - mModeSelector->setSelectedIndex(2, 0); + mModeSelector->selectByValue(2); onModeSelect(0,this); } } else { - if (mModeSelector->getSelectedIndex() == 2) + if (mModeSelector->getValue().asInteger() == 2) { - mModeSelector->setSelectedIndex(0, 0); + mModeSelector->selectByValue(0); onModeSelect(0,this); } @@ -400,7 +400,7 @@ BOOL LLFloaterTexturePicker::postBuild() } mTentativeLabel = getChild("Multiple"); - mResolutionLabel = getChild("unknown"); + mResolutionLabel = getChild("size_lbl"); childSetAction("Default",LLFloaterTexturePicker::onBtnSetToDefault,this); @@ -417,9 +417,9 @@ BOOL LLFloaterTexturePicker::postBuild() mInventoryPanel = getChild("inventory panel"); - mModeSelector = getChild("mode_selection"); + mModeSelector = getChild("mode_selection"); mModeSelector->setCommitCallback(onModeSelect, this); - mModeSelector->setSelectedIndex(0, 0); + mModeSelector->selectByValue(0); if(mInventoryPanel) { @@ -870,7 +870,7 @@ void LLFloaterTexturePicker::onSelectionChange(const std::dequemModeSelector->getSelectedIndex(); + int index = self->mModeSelector->getValue().asInteger(); self->getChild("Default")->setVisible(index == 0 ? TRUE : FALSE); self->getChild("Blank")->setVisible(index == 0 ? TRUE : FALSE); @@ -1213,7 +1213,7 @@ void LLFloaterTexturePicker::onFilterEdit(const std::string& search_string ) void LLFloaterTexturePicker::setLocalTextureEnabled(BOOL enabled) { - mModeSelector->setIndexEnabled(1,enabled); + mModeSelector->setEnabledByValue(1, enabled); } void LLFloaterTexturePicker::setBakeTextureEnabled(BOOL enabled) @@ -1221,18 +1221,18 @@ void LLFloaterTexturePicker::setBakeTextureEnabled(BOOL enabled) BOOL changed = (enabled != mBakeTextureEnabled); mBakeTextureEnabled = enabled; - mModeSelector->setIndexEnabled(2, enabled); + mModeSelector->setEnabledByValue(2, enabled); - if (!mBakeTextureEnabled && (mModeSelector->getSelectedIndex() == 2)) + if (!mBakeTextureEnabled && (mModeSelector->getValue().asInteger() == 2)) { - mModeSelector->setSelectedIndex(0, 0); + mModeSelector->selectByValue(0); } if (changed && mBakeTextureEnabled && LLAvatarAppearanceDefines::LLAvatarAppearanceDictionary::isBakedImageId(mImageAssetID)) { - if (mModeSelector->getSelectedIndex() != 2) + if (mModeSelector->getValue().asInteger() != 2) { - mModeSelector->setSelectedIndex(2, 0); + mModeSelector->selectByValue(2); } } onModeSelect(0, this); diff --git a/indra/newview/lltexturectrl.h b/indra/newview/lltexturectrl.h index 24ec6f748f..2741955e89 100644 --- a/indra/newview/lltexturectrl.h +++ b/indra/newview/lltexturectrl.h @@ -36,7 +36,6 @@ #include "llstring.h" #include "lluictrl.h" #include "llpermissionsflags.h" -#include "llradiogroup.h" #include "lltextbox.h" // for params #include "llviewerinventory.h" #include "llviewborder.h" // for params @@ -44,7 +43,7 @@ #include "llviewertexture.h" #include "llwindow.h" -class LLButton; +class LLComboBox; class LLFloaterTexturePicker; class LLInventoryItem; class LLViewerFetchedTexture; @@ -384,7 +383,7 @@ protected: LLSaveFolderState mSavedFolderState; BOOL mSelectedItemPinned; - LLRadioGroup* mModeSelector; + LLComboBox* mModeSelector; LLScrollListCtrl* mLocalScrollCtrl; private: diff --git a/indra/newview/lltoolpie.cpp b/indra/newview/lltoolpie.cpp index fc7658d48b..4717786f65 100644 --- a/indra/newview/lltoolpie.cpp +++ b/indra/newview/lltoolpie.cpp @@ -308,14 +308,39 @@ BOOL LLToolPie::handleLeftClickPick() } // [/RLVa:KB] +// [RLVa:KB] - @buy + const std::function fnRlvCheck = [](const LLUUID& idObj, U8 clickAction) { + switch (clickAction) + { + case CLICK_ACTION_BUY: + return RlvActions::canBuyObject(idObj); + case CLICK_ACTION_PAY: + return RlvActions::canPayObject(idObj); + default: + return true; + } + }; +// [/RLVa:KB] mClickAction = 0; if (object && object->getClickAction()) { mClickAction = object->getClickAction(); +// [RLVa:KB] - @buy + if ( (RlvActions::isRlvEnabled()) && (!fnRlvCheck(object->getID(), mClickAction)) ) + { + mClickAction = CLICK_ACTION_NONE; + } +// [/RLVa:KB] } else if (parent && parent->getClickAction()) { mClickAction = parent->getClickAction(); +// [RLVa:KB] - @buy + if ((RlvActions::isRlvEnabled()) && (!fnRlvCheck(parent->getID(), mClickAction))) + { + mClickAction = CLICK_ACTION_NONE; + } +// [/RLVa:KB] } switch(mClickAction) @@ -563,7 +588,12 @@ ECursorType LLToolPie::cursorFromObject(LLViewerObject* object) LLSelectNode* node = LLSelectMgr::getInstance()->getHoverNode(); if (!node || node->mSaleInfo.isForSale()) { - cursor = UI_CURSOR_TOOLBUY; +// [RLVa:KB] - @buy + cursor = (!object || RlvActions::canBuyObject(parent ? parent->getID() : object->getID())) + ? UI_CURSOR_TOOLBUY + : ((object && object->flagHandleTouch()) || (parent && parent->flagHandleTouch())) ? UI_CURSOR_HAND : UI_CURSOR_ARROW; +// [/RLVa:KB] +// cursor = UI_CURSOR_TOOLBUY; } } break; @@ -581,7 +611,12 @@ ECursorType LLToolPie::cursorFromObject(LLViewerObject* object) || (parent && parent->flagTakesMoney())) { //cursor = UI_CURSOR_TOOLBUY; FIRESTORM - pay cursor is separate from buy cursor - cursor = UI_CURSOR_TOOLPAY; +// [RLVa:KB] - @buy + cursor = ((object && RlvActions::canPayObject(object->getID())) || (parent && RlvActions::canPayObject(parent->getID()))) + ? UI_CURSOR_TOOLPAY + : ((object && object->flagHandleTouch()) || (parent && parent->flagHandleTouch())) ? UI_CURSOR_HAND : UI_CURSOR_ARROW; +// [/RLVa:KB] +// cursor = UI_CURSOR_TOOLPAY; } } break; @@ -838,7 +873,7 @@ BOOL LLToolPie::handleMouseUp(S32 x, S32 y, MASK mask) if ( (fValidPick) && (RlvActions::isRlvEnabled()) && (!RlvActions::canTeleportToLocal(mPick.mPosGlobal)) ) { - RlvUtil::notifyBlocked(RLV_STRING_BLOCKED_AUTOPILOT); + RlvUtil::notifyBlocked(RlvStringKeys::Blocked::AutoPilot); fValidPick = false; } @@ -949,7 +984,7 @@ BOOL LLToolPie::handleDoubleClick(S32 x, S32 y, MASK mask) if ( (fValidPick) && (RlvActions::isRlvEnabled()) && (!RlvActions::canTeleportToLocal(mPick.mPosGlobal)) ) { - RlvUtil::notifyBlocked(RLV_STRING_BLOCKED_AUTOPILOT); + RlvUtil::notifyBlocked(RlvStringKeys::Blocked::AutoPilot); fValidPick = false; } diff --git a/indra/newview/llviewerassetstorage.cpp b/indra/newview/llviewerassetstorage.cpp index 047d7cc3f4..9d1e5c9c1f 100644 --- a/indra/newview/llviewerassetstorage.cpp +++ b/indra/newview/llviewerassetstorage.cpp @@ -51,6 +51,7 @@ /// LLViewerAssetRequest ///---------------------------------------------------------------------------- + // There is also PoolSizeVAssetStorage value in setting that should mirror this name static const std::string VIEWER_ASSET_STORAGE_CORO_POOL = "VAssetStorage"; /** @@ -116,8 +117,6 @@ LLViewerAssetStorage::LLViewerAssetStorage(LLMessageSystem *msg, LLXferManager * mCountSucceeded(0), mTotalBytesFetched(0) { - // Explicitly create the VAAssetStorage pool - LLCoprocedureManager::instance().createPool(VIEWER_ASSET_STORAGE_CORO_POOL); } @@ -131,8 +130,6 @@ LLViewerAssetStorage::LLViewerAssetStorage(LLMessageSystem *msg, LLXferManager * mCountSucceeded(0), mTotalBytesFetched(0) { - // Explicitly create the VAAssetStorage pool - LLCoprocedureManager::instance().createPool(VIEWER_ASSET_STORAGE_CORO_POOL); } LLViewerAssetStorage::~LLViewerAssetStorage() diff --git a/indra/newview/llviewercontrol.cpp b/indra/newview/llviewercontrol.cpp index 57199cd529..ff950a7096 100644 --- a/indra/newview/llviewercontrol.cpp +++ b/indra/newview/llviewercontrol.cpp @@ -1174,7 +1174,7 @@ void settings_setup_listeners() gSavedPerAccountSettings.getControl("AvatarHoverOffsetZ")->getCommitSignal()->connect(boost::bind(&handleAvatarHoverOffsetChanged, _2)); // [RLVa:KB] - Checked: 2015-12-27 (RLVa-1.5.0) - gSavedSettings.getControl("RestrainedLove")->getSignal()->connect(boost::bind(&RlvSettings::onChangedSettingMain, _2)); + gSavedSettings.getControl(RlvSettingNames::Main)->getSignal()->connect(boost::bind(&RlvSettings::onChangedSettingMain, _2)); // [/RLVa:KB] // Is done inside XUI now, using visibility_control // gSavedSettings.getControl("ShowNavbarFavoritesPanel")->getSignal()->connect(boost::bind(&toggle_show_favorites_panel, _2)); diff --git a/indra/newview/llviewerjointmesh.cpp b/indra/newview/llviewerjointmesh.cpp index 6183eba22d..3d30e7d7d5 100644 --- a/indra/newview/llviewerjointmesh.cpp +++ b/indra/newview/llviewerjointmesh.cpp @@ -253,7 +253,6 @@ U32 LLViewerJointMesh::drawShape( F32 pixelArea, BOOL first_pass, BOOL is_dummy) //---------------------------------------------------------------- llassert( !(mTexture.notNull() && mLayerSet) ); // mutually exclusive - // LLTexUnit::eTextureAddressMode old_mode = LLTexUnit::TAM_WRAP; // Rye Mutt's broken local texture rendering fix LLViewerTexLayerSet *layerset = dynamic_cast(mLayerSet); if (mTestImageName) { @@ -280,24 +279,15 @@ U32 LLViewerJointMesh::drawShape( F32 pixelArea, BOOL first_pass, BOOL is_dummy) gGL.getTexUnit(diffuse_channel)->bind(LLViewerTextureManager::getFetchedTexture(IMG_DEFAULT)); } } - else - if ( !is_dummy && mTexture.notNull() ) + else if ( !is_dummy && mTexture.notNull() ) { - // Rye Mutt's broken local texture rendering fix - //if(mTexture->hasGLTexture()) - //{ - // old_mode = mTexture->getAddressMode(); - //} - // gGL.getTexUnit(diffuse_channel)->bind(mTexture); - //gGL.getTexUnit(diffuse_channel)->setTextureAddressMode(LLTexUnit::TAM_CLAMP); // Rye Mutt's broken local texture rendering fix } else { gGL.getTexUnit(diffuse_channel)->bind(LLViewerTextureManager::getFetchedTexture(IMG_DEFAULT)); } - U32 mask = sRenderMask; U32 start = mMesh->mFaceVertexOffset; @@ -343,14 +333,6 @@ U32 LLViewerJointMesh::drawShape( F32 pixelArea, BOOL first_pass, BOOL is_dummy) gGL.getTexUnit(diffuse_channel)->setTextureBlendType(LLTexUnit::TB_MULT); } - // Rye Mutt's broken local texture rendering fix - //if (mTexture.notNull() && !is_dummy) - //{ - // gGL.getTexUnit(diffuse_channel)->bind(mTexture); - // gGL.getTexUnit(diffuse_channel)->setTextureAddressMode(old_mode); - //} - // - return triangle_count; } diff --git a/indra/newview/llviewermediafocus.cpp b/indra/newview/llviewermediafocus.cpp index 052ec942db..1c5eac6f98 100644 --- a/indra/newview/llviewermediafocus.cpp +++ b/indra/newview/llviewermediafocus.cpp @@ -205,8 +205,9 @@ bool LLViewerMediaFocus::getFocus() } // This function selects an ideal viewing distance based on the focused object, pick normal, and padding value -void LLViewerMediaFocus::setCameraZoom(LLViewerObject* object, LLVector3 normal, F32 padding_factor, bool zoom_in_only) +LLVector3d LLViewerMediaFocus::setCameraZoom(LLViewerObject* object, LLVector3 normal, F32 padding_factor, bool zoom_in_only) { + LLVector3d camera_pos; if (object) { gAgentCamera.setFocusOnAvatar(FALSE, ANIMATE); @@ -254,7 +255,7 @@ void LLViewerMediaFocus::setCameraZoom(LLViewerObject* object, LLVector3 normal, distance += depth * 0.5; // Finally animate the camera to this new position and focal point - LLVector3d camera_pos, target_pos; + LLVector3d target_pos; // The target lookat position is the center of the selection (in global coords) target_pos = center; // Target look-from (camera) position is "distance" away from the target along the normal @@ -287,7 +288,7 @@ void LLViewerMediaFocus::setCameraZoom(LLViewerObject* object, LLVector3 normal, if (zoom_in_only && (dist_vec_squared(gAgentCamera.getCameraPositionGlobal(), target_pos) < dist_vec_squared(camera_pos, target_pos))) { - return; + return camera_pos; } gAgentCamera.setCameraPosAndFocusGlobal(camera_pos, target_pos, object->getID() ); @@ -298,6 +299,7 @@ void LLViewerMediaFocus::setCameraZoom(LLViewerObject* object, LLVector3 normal, // If we have no object, focus back on the avatar. gAgentCamera.setFocusOnAvatar(TRUE, ANIMATE); } + return camera_pos; } void LLViewerMediaFocus::onFocusReceived() { diff --git a/indra/newview/llviewermediafocus.h b/indra/newview/llviewermediafocus.h index fa469c36e3..effd08a559 100644 --- a/indra/newview/llviewermediafocus.h +++ b/indra/newview/llviewermediafocus.h @@ -63,7 +63,7 @@ public: void update(); - static void setCameraZoom(LLViewerObject* object, LLVector3 normal, F32 padding_factor, bool zoom_in_only = false); + static LLVector3d setCameraZoom(LLViewerObject* object, LLVector3 normal, F32 padding_factor, bool zoom_in_only = false); static F32 getBBoxAspectRatio(const LLBBox& bbox, const LLVector3& normal, F32* height, F32* width, F32* depth); bool isFocusedOnFace(LLPointer objectp, S32 face); diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index 71f2ef837e..abc9bb9637 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -1346,7 +1346,7 @@ class LLAdvancedToggleWireframe : public view_listener_t // [RLVa:KB] - Checked: RLVa-2.0.0 bool fRlvBlockWireframe = gRlvAttachmentLocks.hasLockedHUD(); if ( (!gUseWireframe) && (fRlvBlockWireframe) ) - RlvUtil::notifyBlocked(RLV_STRING_BLOCKED_WIREFRAME); + RlvUtil::notifyBlocked(RlvStringKeys::Blocked::Wireframe); set_use_wireframe( (!gUseWireframe) && (!fRlvBlockWireframe) ); return true; } @@ -4416,6 +4416,11 @@ bool enable_buy_object() if( for_sale_selection(node) ) { +// [RLVa:KB] - @buy + if (!RlvActions::canBuyObject(obj->getID())) + return false; +// [/RLVa:KB] + // *NOTE: Is this needed? This checks to see if anyone owns the // object, dating back to when we had "public" objects owned by // no one. JC @@ -6185,6 +6190,11 @@ BOOL is_selection_buy_not_take() LLViewerObject* obj = node->getObject(); if(obj && !(obj->permYouOwner()) && (node->mSaleInfo.isForSale())) { +// [RLVa:KB] - @buy + if (!RlvActions::canBuyObject(obj->getID())) + continue; +// [/RLVa:KB] + // you do not own the object and it is for sale, thus, // it's a buy return TRUE; @@ -7702,8 +7712,8 @@ bool enable_pay_avatar() LLViewerObject* obj = LLSelectMgr::getInstance()->getSelection()->getPrimaryObject(); LLVOAvatar* avatar = find_avatar_from_object(obj); // return (avatar != NULL); -// [RLVa:KB] - Checked: RLVa-1.2.1 - return (avatar != NULL) && (RlvActions::canShowName(RlvActions::SNC_DEFAULT, avatar->getID())); +// [RLVa:KB] - @shownames and @pay + return (avatar != NULL) && (RlvActions::canShowName(RlvActions::SNC_DEFAULT, avatar->getID())) && (RlvActions::canPayAvatar(avatar->getID())); // [/RLVa:KB] } @@ -7715,7 +7725,10 @@ bool enable_pay_object() LLViewerObject *parent = (LLViewerObject *)object->getParent(); if((object->flagTakesMoney()) || (parent && parent->flagTakesMoney())) { - return true; +// [RLVa:KB] - @buy + return RlvActions::canBuyObject(object->getID()); +// [/RLVa:KB] +// return true; } } return false; diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index 865e96d7ba..1934613b8b 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -6989,8 +6989,8 @@ void notify_cautioned_script_question(const LLSD& notification, const LLSD& resp // [RLVa:KB] - Checked: 2010-04-23 (RLVa-1.2.0g) | Modified: RLVa-1.0.0a if (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWLOC)) { - notice.setArg("[REGIONNAME]", RlvStrings::getString(RLV_STRING_HIDDEN_REGION)); - notice.setArg("[REGIONPOS]", RlvStrings::getString(RLV_STRING_HIDDEN)); + notice.setArg("[REGIONNAME]", RlvStrings::getString(RlvStringKeys::Hidden::Region)); + notice.setArg("[REGIONPOS]", RlvStrings::getString(RlvStringKeys::Hidden::Generic)); } else if (!foundpos) // [/RLVa:KB] @@ -7760,7 +7760,7 @@ void send_lures(const LLSD& notification, const LLSD& response) if ( (gRlvHandler.isEnabled()) && (std::any_of(sdRecipients.beginArray(), sdRecipients.endArray(), [](const LLSD& id) { return !RlvActions::canStartIM(id.asUUID()) || !RlvActions::canSendIM(id.asUUID()); })) ) { - text = RlvStrings::getString(RLV_STRING_HIDDEN); + text = RlvStrings::getString(RlvStringKeys::Hidden::Generic); } // [/RLVa:KB] @@ -7852,7 +7852,7 @@ void handle_lure(const uuid_vec_t& ids) LLSD edit_args; // [RLVa:KB] - Checked: 2010-04-07 (RLVa-1.2.0d) | Modified: RLVa-1.0.0a - edit_args["REGION"] = (!gRlvHandler.hasBehaviour(RLV_BHVR_SHOWLOC)) ? gAgent.getRegion()->getName() : RlvStrings::getString(RLV_STRING_HIDDEN); + edit_args["REGION"] = (!gRlvHandler.hasBehaviour(RLV_BHVR_SHOWLOC)) ? gAgent.getRegion()->getName() : RlvStrings::getString(RlvStringKeys::Hidden::Generic); // [/RLVa:KB] // edit_args["REGION"] = gAgent.getRegion()->getName(); @@ -7865,10 +7865,10 @@ void handle_lure(const uuid_vec_t& ids) if (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWLOC)) { const LLRelationship* pBuddyInfo = LLAvatarTracker::instance().getBuddyInfo(idAgent); - if ( (!gRlvHandler.isException(RLV_BHVR_TPLURE, idAgent, RLV_CHECK_PERMISSIVE)) && + if ( (!gRlvHandler.isException(RLV_BHVR_TPLURE, idAgent, ERlvExceptionCheck::Permissive)) && ((!pBuddyInfo) || (!pBuddyInfo->isOnline()) || (!pBuddyInfo->isRightGrantedTo(LLRelationship::GRANT_MAP_LOCATION))) ) { - RlvUtil::notifyBlocked(RLV_STRING_BLOCKED_TELEPORT_OFFER); + RlvUtil::notifyBlocked(RlvStringKeys::Blocked::TeleportOffer); return; } } diff --git a/indra/newview/llviewerparcelmgr.cpp b/indra/newview/llviewerparcelmgr.cpp index 71988d4de5..de86f2f106 100644 --- a/indra/newview/llviewerparcelmgr.cpp +++ b/indra/newview/llviewerparcelmgr.cpp @@ -1988,7 +1988,10 @@ void LLViewerParcelMgr::processParcelProperties(LLMessageSystem *msg, void **use || music_url.substr(0, 8) == "https://") { LLViewerRegion *region = LLWorld::getInstance()->getRegion(msg->getSender()); - optionally_start_music(music_url, parcel->mLocalID, region->getRegionID()); + if (region) + { + optionally_start_music(music_url, parcel->mLocalID, region->getRegionID()); + } } else { diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp index a8af5d394c..54696cb998 100644 --- a/indra/newview/llviewerregion.cpp +++ b/indra/newview/llviewerregion.cpp @@ -306,6 +306,11 @@ void LLViewerRegionImpl::requestBaseCapabilitiesCoro(U64 regionHandle) // Fix seed cap retry count //++mSeedCapAttempts; + if (LLApp::isExiting()) + { + return; + } + regionp = LLWorld::getInstance()->getRegionFromHandle(regionHandle); if (!regionp) //region was removed { @@ -423,6 +428,11 @@ void LLViewerRegionImpl::requestBaseCapabilitiesCompleteCoro(U64 regionHandle) break; // no retry } + if (LLApp::isExiting()) + { + break; + } + regionp = LLWorld::getInstance()->getRegionFromHandle(regionHandle); if (!regionp) //region was removed { @@ -526,6 +536,11 @@ void LLViewerRegionImpl::requestSimulatorFeatureCoro(std::string url, U64 region continue; } + if (LLApp::isExiting()) + { + break; + } + // remove the http_result from the llsd result.erase("http_result"); @@ -3382,7 +3397,7 @@ void LLViewerRegion::setCapabilitiesReceived(bool received) { mCapabilitiesReceivedSignal(getRegionID()); - //LLFloaterPermsDefault::sendInitialPerms(); + LLFloaterPermsDefault::sendInitialPerms(); // This is a single-shot signal. Forget callbacks to save resources. mCapabilitiesReceivedSignal.disconnect_all_slots(); diff --git a/indra/newview/llviewertexlayer.cpp b/indra/newview/llviewertexlayer.cpp index 4af37c3703..6ad460c8ef 100644 --- a/indra/newview/llviewertexlayer.cpp +++ b/indra/newview/llviewertexlayer.cpp @@ -60,10 +60,7 @@ LLViewerTexLayerSetBuffer::LLViewerTexLayerSetBuffer(LLTexLayerSet* const owner, S32 width, S32 height) : // ORDER_LAST => must render these after the hints are created. LLTexLayerSetBuffer(owner), - // Rye Mutt's broken local texture rendering fix - //LLViewerDynamicTexture( width, height, 4, LLViewerDynamicTexture::ORDER_LAST, TRUE ), - LLViewerDynamicTexture( width, height, 4, LLViewerDynamicTexture::ORDER_LAST, FALSE ), - // + LLViewerDynamicTexture(width, height, 4, LLViewerDynamicTexture::ORDER_LAST, FALSE), // [Legacy Bake] mUploadPending(FALSE), // Not used for any logic here, just to sync sending of updates mNeedsUpload(FALSE), diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index ebe431eef0..d031e25133 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -5055,12 +5055,12 @@ void LLViewerWindow::renderSelections( BOOL for_gl_pick, BOOL pick_parcel_walls, BOOL draw_handles = TRUE; - if (tool == LLToolCompTranslate::getInstance() && !all_selected_objects_move && !LLSelectMgr::getInstance()->isSelfAvatarSelected()) + if (tool == LLToolCompTranslate::getInstance() && !all_selected_objects_move && !LLSelectMgr::getInstance()->isMovableAvatarSelected()) { draw_handles = FALSE; } - if (tool == LLToolCompRotate::getInstance() && !all_selected_objects_move) + if (tool == LLToolCompRotate::getInstance() && !all_selected_objects_move && !LLSelectMgr::getInstance()->isMovableAvatarSelected()) { draw_handles = FALSE; } diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index abe84e84e4..a7cdcfa69f 100644 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -2569,6 +2569,7 @@ S32 LLVOAvatar::setTETexture(const U8 te, const LLUUID& uuid) } static LLTrace::BlockTimerStatHandle FTM_AVATAR_UPDATE("Avatar Update"); +static LLTrace::BlockTimerStatHandle FTM_AVATAR_UPDATE_COMPLEXITY("Avatar Update Complexity"); static LLTrace::BlockTimerStatHandle FTM_JOINT_UPDATE("Update Joints"); //------------------------------------------------------------------------ @@ -2623,7 +2624,6 @@ void LLVOAvatar::idleUpdate(LLAgent &agent, const F64 &time) // Update should be happening max once per frame. // enable dynamic spreading of the BB calculations - //const S32 upd_freq = 4; // force update every upd_freq frames. static LLCachedControl refreshPeriod(gSavedSettings, "AvatarExtentRefreshPeriodBatch"); static LLCachedControl refreshMaxPerPeriod(gSavedSettings, "AvatarExtentRefreshMaxPerBatch"); static S32 upd_freq = refreshPeriod; // initialise to a reasonable defauilt of 1 batch @@ -2645,6 +2645,7 @@ void LLVOAvatar::idleUpdate(LLAgent &agent, const F64 &time) else { // enable dynamic spreading of the BB calculations + //const S32 upd_freq = 4; // force update every upd_freq frames. //mNeedsExtentUpdate = ((LLDrawable::getCurrentFrame()+mID.mData[0]) % upd_freq == 0); mNeedsExtentUpdate = ((thisFrame + mID.mData[0]) % upd_freq == 0); // @@ -2731,7 +2732,40 @@ void LLVOAvatar::idleUpdate(LLAgent &agent, const F64 &time) } idleUpdateNameTag( mLastRootPos ); - idleUpdateRenderComplexity(); + + // Complexity has stale mechanics, but updates still can be very rapid + // so spread avatar complexity calculations over frames to lesen load from + // rapid updates and to make sure all avatars are not calculated at once. + S32 compl_upd_freq = 20; + if (isControlAvatar()) + { + // animeshes do not (or won't) have impostors nor change outfis, + // no need for high frequency + compl_upd_freq = 100; + } + else if (mLastRezzedStatus <= 0) //cloud or init + { + compl_upd_freq = 60; + } + else if (isSelf()) + { + compl_upd_freq = 5; + } + else if (mLastRezzedStatus == 1) //'grey', not fully loaded + { + compl_upd_freq = 40; + } + else if (isInMuteList()) //cheap, buffers value from search + { + compl_upd_freq = 100; + } + + if ((LLFrameTimer::getFrameCount() + mID.mData[0]) % compl_upd_freq == 0) + { + LL_RECORD_BLOCK_TIME(FTM_AVATAR_UPDATE_COMPLEXITY); + idleUpdateRenderComplexity(); + } + idleUpdateDebugInfo(); } void LLVOAvatar::idleUpdateVoiceVisualizer(bool voice_enabled) @@ -3078,7 +3112,10 @@ F32 LLVOAvatar::calcMorphAmount() void LLVOAvatar::idleUpdateLipSync(bool voice_enabled) { // Use the Lipsync_Ooh and Lipsync_Aah morphs for lip sync - if ( voice_enabled && (LLVoiceClient::getInstance()->lipSyncEnabled()) && LLVoiceClient::getInstance()->getIsSpeaking( mID ) ) + if ( voice_enabled + && mLastRezzedStatus > 0 // no point updating lip-sync for clouds + && (LLVoiceClient::getInstance()->lipSyncEnabled()) + && LLVoiceClient::getInstance()->getIsSpeaking( mID ) ) { F32 ooh_morph_amount = 0.0f; F32 aah_morph_amount = 0.0f; @@ -3642,7 +3679,7 @@ void LLVOAvatar::idleUpdateNameTagText(BOOL new_name) std::string title_str = title->getString(); LLStringFn::replace_ascii_controlchars(title_str,LL_UNKNOWN_CHAR); addNameTagLine(title_str, name_tag_color, LLFontGL::NORMAL, - LLFontGL::getFontSansSerifSmall()); + LLFontGL::getFontSansSerifSmall(), true); } static LLUICachedControl show_display_names("NameTagShowDisplayNames", true); @@ -3670,11 +3707,11 @@ void LLVOAvatar::idleUpdateNameTagText(BOOL new_name) if (mClientTagData.has("name") && !mClientTagData["name"].asString().empty()) { - addNameTagLine((av_name.isDisplayNameDefault() ? av_name.getUserNameForDisplay() : av_name.getDisplayName()) +" (" + mClientTagData["name"].asString() + ")",name_tag_color,LLFontGL::NORMAL, LLFontGL::getFontSansSerif(), (!av_name.getDisplayName().empty()) ); + addNameTagLine((av_name.isDisplayNameDefault() ? av_name.getUserNameForDisplay() : av_name.getDisplayName()) +" (" + mClientTagData["name"].asString() + ")",name_tag_color,LLFontGL::NORMAL, LLFontGL::getFontSansSerif(), true, (!av_name.getDisplayName().empty()) ); } else { - addNameTagLine((av_name.isDisplayNameDefault() ? av_name.getUserNameForDisplay() : av_name.getDisplayName()), name_tag_color, LLFontGL::NORMAL, LLFontGL::getFontSansSerif(), true); + addNameTagLine((av_name.isDisplayNameDefault() ? av_name.getUserNameForDisplay() : av_name.getDisplayName()), name_tag_color, LLFontGL::NORMAL, LLFontGL::getFontSansSerif(), true, true); } } // Suppress SLID display if display name matches exactly (ugh) @@ -3696,13 +3733,13 @@ void LLVOAvatar::idleUpdateNameTagText(BOOL new_name) // Show user name as legacy name if selected std::string username( show_legacynames ? av_name.getUserNameForDisplay() : av_name.getAccountName() ); - addNameTagLine(username, username_color, LLFontGL::NORMAL, LLFontGL::getFontSansSerifSmall()); + addNameTagLine(username, username_color, LLFontGL::NORMAL, LLFontGL::getFontSansSerifSmall(), true); } // [RLVa:KB] - Checked: RLVa-1.2.2 } else { - addNameTagLine(RlvStrings::getAnonym(av_name), name_tag_color, LLFontGL::NORMAL, LLFontGL::getFontSansSerif(), (!av_name.getDisplayName().empty()) ); + addNameTagLine(RlvStrings::getAnonym(av_name), name_tag_color, LLFontGL::NORMAL, LLFontGL::getFontSansSerif(), true, (!av_name.getDisplayName().empty()) ); } // [/RLVa:KB] } @@ -3714,18 +3751,18 @@ void LLVOAvatar::idleUpdateNameTagText(BOOL new_name) if ( (!fRlvShowAvName) && (!isSelf()) ) { full_name = RlvStrings::getAnonym(full_name); - addNameTagLine(full_name, name_tag_color, LLFontGL::NORMAL, font, true); + addNameTagLine(full_name, name_tag_color, LLFontGL::NORMAL, font, true, true); } // [/RLVa:KB] else // Only check for client tags when not RLV anon -AO { if (mClientTagData.has("name") && !mClientTagData["name"].asString().empty()) { - addNameTagLine(full_name + " (" + mClientTagData["name"].asString() + ")", name_tag_color, LLFontGL::NORMAL, font, true); + addNameTagLine(full_name + " (" + mClientTagData["name"].asString() + ")", name_tag_color, LLFontGL::NORMAL, font, true, true); } else { - addNameTagLine(full_name, name_tag_color, LLFontGL::NORMAL, font, true); + addNameTagLine(full_name, name_tag_color, LLFontGL::NORMAL, font, true, true); } } } @@ -3883,8 +3920,8 @@ void LLVOAvatar::idleUpdateNameTagText(BOOL new_name) } // Fix nametag not properly updating when display name arrives -//void LLVOAvatar::addNameTagLine(const std::string& line, const LLColor4& color, S32 style, const LLFontGL* font) -void LLVOAvatar::addNameTagLine(const std::string& line, const LLColor4& color, S32 style, const LLFontGL* font, bool is_name /* = false */) +//void LLVOAvatar::addNameTagLine(const std::string& line, const LLColor4& color, S32 style, const LLFontGL* font, const bool use_ellipses) +void LLVOAvatar::addNameTagLine(const std::string& line, const LLColor4& color, S32 style, const LLFontGL* font, const bool use_ellipses, bool is_name /* = false */) // { llassert(mNameText); @@ -3894,7 +3931,7 @@ void LLVOAvatar::addNameTagLine(const std::string& line, const LLColor4& color, } else { - mNameText->addLine(line, color, (LLFontGL::StyleFlags)style, font); + mNameText->addLine(line, color, (LLFontGL::StyleFlags)style, font, use_ellipses); } // Fix nametag not properly updating when display name arrives //mNameIsSet |= !line.empty(); @@ -4548,6 +4585,11 @@ void LLVOAvatar::computeUpdatePeriod() { //background avatars are REALLY slow updating impostors mUpdatePeriod = 16; } + else if (mLastRezzedStatus <= 0) + { + // Don't update cloud avatars too often + mUpdatePeriod = 8; + } else if ( shouldImpostor(3) ) { //back 25% of max visible avatars are slow updating impostors mUpdatePeriod = 8; @@ -4950,16 +4992,16 @@ BOOL LLVOAvatar::updateCharacter(LLAgent &agent) // Set mUpdatePeriod and visible based on distance and other criteria. //-------------------------------------------------------------------- computeUpdatePeriod(); - visible = (LLDrawable::getCurrentFrame()+mID.mData[0])%mUpdatePeriod == 0 ? TRUE : FALSE; + bool needs_update = (LLDrawable::getCurrentFrame()+mID.mData[0])%mUpdatePeriod == 0; //-------------------------------------------------------------------- - // Early out if not visible and not self + // Early out if does not need update and not self // don't early out for your own avatar, as we rely on your animations playing reliably // for example, the "turn around" animation when entering customize avatar needs to trigger // even when your avatar is offscreen //-------------------------------------------------------------------- // Fix impostered animation speed based on a fix by Henri Beauchamp - //if (!visible && !isSelf()) + //if (!needs_update && !isSelf()) //{ // updateMotions(LLCharacter::HIDDEN_UPDATE); // return FALSE; @@ -4976,7 +5018,7 @@ BOOL LLVOAvatar::updateCharacter(LLAgent &agent) // This was originally done in updateTimeStep(), but since that is globally disabled for now, we do it here mMotionController.setUpdateFactor(mUpdatePeriod); - if (!visible && !isSelf()) + if (!needs_update && !isSelf()) { updateMotions(LLCharacter::HIDDEN_UPDATE); return FALSE; @@ -5020,12 +5062,17 @@ BOOL LLVOAvatar::updateCharacter(LLAgent &agent) mSpeed = speed; // update animations - if (mSpecialRenderMode == 1) // Animation Preview + if (!visible) + { + updateMotions(LLCharacter::HIDDEN_UPDATE); + } + else if (mSpecialRenderMode == 1) // Animation Preview { updateMotions(LLCharacter::FORCE_UPDATE); } else { + // Might be better to do HIDDEN_UPDATE if cloud updateMotions(LLCharacter::NORMAL_UPDATE); } @@ -5053,10 +5100,13 @@ BOOL LLVOAvatar::updateCharacter(LLAgent &agent) // Update child joints as needed. mRoot->updateWorldMatrixChildren(); - // System avatar mesh vertices need to be reskinned. - mNeedsSkin = TRUE; + if (visible) + { + // System avatar mesh vertices need to be reskinned. + mNeedsSkin = TRUE; + } - return TRUE; + return visible; } //----------------------------------------------------------------------------- @@ -11216,7 +11266,10 @@ void LLVOAvatar::idleUpdateRenderComplexity() // Render Complexity calculateUpdateRenderComplexity(); // Update mVisualComplexity if needed +} +void LLVOAvatar::idleUpdateDebugInfo() +{ if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_AVATAR_DRAW_INFO)) { std::string info_line; diff --git a/indra/newview/llvoavatar.h b/indra/newview/llvoavatar.h index 7a04a30a4b..cfb918b344 100644 --- a/indra/newview/llvoavatar.h +++ b/indra/newview/llvoavatar.h @@ -293,10 +293,11 @@ public: // force all name tags to rebuild, useful when display names turned on/off static void invalidateNameTags(); // Fix nametag not properly updating when display name arrives - //void addNameTagLine(const std::string& line, const LLColor4& color, S32 style, const LLFontGL* font); - void addNameTagLine(const std::string& line, const LLColor4& color, S32 style, const LLFontGL* font, bool is_name = false); + //void addNameTagLine(const std::string& line, const LLColor4& color, S32 style, const LLFontGL* font, const bool use_ellipses = false); + void addNameTagLine(const std::string& line, const LLColor4& color, S32 style, const LLFontGL* font, const bool use_ellipses = false, bool is_name = false); // void idleUpdateRenderComplexity(); + void idleUpdateDebugInfo(); void accountRenderComplexityForObject(const LLViewerObject *attached_object, const F32 max_attachment_complexity, LLVOVolume::texture_cost_t& textures, diff --git a/indra/newview/llvoavatarself.cpp b/indra/newview/llvoavatarself.cpp index b876ae6fd4..f2022109dd 100644 --- a/indra/newview/llvoavatarself.cpp +++ b/indra/newview/llvoavatarself.cpp @@ -3233,11 +3233,6 @@ void LLVOAvatarSelf::onCustomizeStart(bool disable_camera_switch) { gAgentCamera.changeCameraToCustomizeAvatar(); } - -#if 0 - gAgentAvatarp->clearVisualParamWeights(); - gAgentAvatarp->idleUpdateAppearanceAnimation(); -#endif gAgentAvatarp->invalidateAll(); // mark all bakes as dirty, request updates gAgentAvatarp->updateMeshTextures(); // make sure correct textures are applied to the avatar mesh. diff --git a/indra/newview/llvoicevivox.cpp b/indra/newview/llvoicevivox.cpp index 8074e9b4db..ea2fe59761 100644 --- a/indra/newview/llvoicevivox.cpp +++ b/indra/newview/llvoicevivox.cpp @@ -274,6 +274,8 @@ static void killGateway() /////////////////////////////////////////////////////////////////////////////////////////////// +bool LLVivoxVoiceClient::sShuttingDown = false; + LLVivoxVoiceClient::LLVivoxVoiceClient() : mSessionTerminateRequested(false), mRelogRequested(false), @@ -382,6 +384,7 @@ LLVivoxVoiceClient::~LLVivoxVoiceClient() { mAvatarNameCacheConnection.disconnect(); } + sShuttingDown = true; } //--------------------------------------------------- @@ -412,9 +415,12 @@ void LLVivoxVoiceClient::terminate() } else { + mRelogRequested = false; killGateway(); } + sShuttingDown = true; + // Delete useless Vivox logs on logout if (gSavedSettings.getString("VivoxDebugLevel") == "0") { @@ -711,12 +717,18 @@ void LLVivoxVoiceClient::voiceControlCoro() U32 retry = 0; - while (gAgent.getTeleportState() != LLAgent::TELEPORT_NONE) + while (gAgent.getTeleportState() != LLAgent::TELEPORT_NONE && !sShuttingDown) { LL_DEBUGS("Voice") << "Suspending voiceControlCoro() momentarily for teleport. Tuning: " << mTuningMode << ". Relog: " << mRelogRequested << LL_ENDL; llcoro::suspendUntilTimeout(1.0); } + if (sShuttingDown) + { + mIsCoroutineActive = false; + return; + } + do { bool success = startAndConnectSession(); @@ -742,7 +754,7 @@ void LLVivoxVoiceClient::voiceControlCoro() << "disconnected" << " RelogRequested=" << mRelogRequested << LL_ENDL; - if (mRelogRequested) + if (mRelogRequested && !sShuttingDown) { if (!success) { @@ -757,14 +769,14 @@ void LLVivoxVoiceClient::voiceControlCoro() LL_INFOS("Voice") << "will attempt to reconnect to voice" << LL_ENDL; } - while (isGatewayRunning() || gAgent.getTeleportState() != LLAgent::TELEPORT_NONE) + while (isGatewayRunning() || (gAgent.getTeleportState() != LLAgent::TELEPORT_NONE && !sShuttingDown)) { LL_INFOS("Voice") << "waiting for SLVoice to exit" << LL_ENDL; llcoro::suspendUntilTimeout(1.0); } } } - while (mVoiceEnabled && mRelogRequested); + while (mVoiceEnabled && mRelogRequested && !sShuttingDown); mIsCoroutineActive = false; LL_INFOS("Voice") << "exiting" << LL_ENDL; } @@ -809,7 +821,7 @@ bool LLVivoxVoiceClient::endAndDisconnectSession() bool LLVivoxVoiceClient::callbackEndDaemon(const LLSD& data) { - if (!LLAppViewer::isExiting() && mVoiceEnabled) + if (!sShuttingDown && mVoiceEnabled) { LL_WARNS("Voice") << "SLVoice terminated " << ll_stream_notation_sd(data) << LL_ENDL; terminateAudioSession(false); @@ -1014,7 +1026,7 @@ bool LLVivoxVoiceClient::startAndLaunchDaemon() LL_DEBUGS("Voice") << "Connecting to vivox daemon:" << mDaemonHost << LL_ENDL; LLVoiceVivoxStats::getInstance()->reset(); - while (!mConnected) + while (!mConnected && !sShuttingDown) { LLVoiceVivoxStats::getInstance()->connectionAttemptStart(); LL_DEBUGS("Voice") << "Attempting to connect to vivox daemon: " << mDaemonHost << LL_ENDL; @@ -1033,6 +1045,11 @@ bool LLVivoxVoiceClient::startAndLaunchDaemon() } //--------------------------------------------------------------------- + if (sShuttingDown && !mConnected) + { + return false; + } + llcoro::suspendUntilTimeout(UPDATE_THROTTLE_SECONDS); while (!mPump) @@ -1069,7 +1086,7 @@ bool LLVivoxVoiceClient::provisionVoiceAccount() { LL_INFOS("Voice") << "Provisioning voice account." << LL_ENDL; - while (!gAgent.getRegion() || !gAgent.getRegion()->capabilitiesReceived()) + while ((!gAgent.getRegion() || !gAgent.getRegion()->capabilitiesReceived()) && !sShuttingDown) { LL_DEBUGS("Voice") << "no capabilities for voice provisioning; waiting " << LL_ENDL; // *TODO* Pump a message for wake up. @@ -1113,10 +1130,15 @@ bool LLVivoxVoiceClient::provisionVoiceAccount() { provisioned = true; } - } while (!provisioned && retryCount <= PROVISION_RETRY_MAX); + } while (!provisioned && retryCount <= PROVISION_RETRY_MAX && !sShuttingDown); + + if (sShuttingDown && !provisioned) + { + return false; + } LLVoiceVivoxStats::getInstance()->provisionAttemptEnd(provisioned); - if (! provisioned ) + if (!provisioned) { LL_WARNS("Voice") << "Could not access voice provision cap after " << retryCount << " attempts." << LL_ENDL; return false; @@ -1157,6 +1179,11 @@ bool LLVivoxVoiceClient::establishVoiceConnection() LL_WARNS("Voice") << "cannot establish connection; enabled "<getName().c_str() : RlvStrings::getString(RLV_STRING_HIDDEN_REGION).c_str(), + (RlvActions::canShowLocation()) ? info->getName().c_str() : RlvStrings::getString(RlvStringKeys::Hidden::Region).c_str(), info->getAccessString().c_str()); // [/RLVa:KB] // std::string message = llformat("%s (%s)", info->getName().c_str(), info->getAccessString().c_str()); diff --git a/indra/newview/llxmlrpctransaction.cpp b/indra/newview/llxmlrpctransaction.cpp index da84f93d7d..4d7ec57ace 100644 --- a/indra/newview/llxmlrpctransaction.cpp +++ b/indra/newview/llxmlrpctransaction.cpp @@ -240,16 +240,16 @@ void LLXMLRPCTransaction::Handler::onCompleted(LLCore::HttpHandle handle, if (!status) { + mImpl->setHttpStatus(status); + LLSD errordata = status.getErrorData(); + mImpl->mErrorCertData = errordata; + if ((status.toULong() != CURLE_SSL_PEER_CERTIFICATE) && (status.toULong() != CURLE_SSL_CACERT)) { // if we have a curl error that's not already been handled - // (a non cert error), then generate the error message as + // (a non cert error), then generate the warning message as // appropriate - mImpl->setHttpStatus(status); - LLSD errordata = status.getErrorData(); - mImpl->mErrorCertData = errordata; - LL_WARNS() << "LLXMLRPCTransaction error " << status.toHex() << ": " << status.toString() << LL_ENDL; LL_WARNS() << "LLXMLRPCTransaction request URI: " diff --git a/indra/newview/rlvactions.cpp b/indra/newview/rlvactions.cpp index 956a6c90c2..5fde3943e7 100644 --- a/indra/newview/rlvactions.cpp +++ b/indra/newview/rlvactions.cpp @@ -1,6 +1,6 @@ /** * - * Copyright (c) 2009-2016, Kitty Barnett + * Copyright (c) 2009-2020, Kitty Barnett * * The source code in this file is provided to you under the terms of the * GNU Lesser General Public License, version 2.1, but WITHOUT ANY WARRANTY; @@ -188,6 +188,15 @@ bool RlvActions::canSendIM(const LLUUID& idRecipient) ( (!gRlvHandler.hasBehaviour(RLV_BHVR_SENDIMTO)) || (!gRlvHandler.isException(RLV_BHVR_SENDIMTO, idRecipient)) ) ); } +// Handles: @redirchat +bool RlvActions::canSendTypingStart() +{ + // The CHAT_TYPE_START indicator can be sent if: + // - nearby chat isn't being redirected + // - the user specifically indicated that they want to show typing under @redirchat + return !RlvHandler::instance().hasBehaviour(RLV_BHVR_REDIRCHAT) || gSavedSettings.get(RlvSettingNames::ShowRedirectChatTyping); +} + bool RlvActions::canStartIM(const LLUUID& idRecipient, bool fIgnoreOpen) { // User can start an IM session with "recipient" (could be an agent or a group) if: @@ -378,6 +387,14 @@ bool RlvActions::canBuild() (!gRlvHandler.hasBehaviour(RLV_BHVR_REZ)); } +// Handles: @buy +bool RlvActions::canBuyObject(const LLUUID& idObj) +{ + // User can buy an object set for sale if: + // - not restricted from buying objects + return (!RlvHandler::instance().hasBehaviour(RLV_BHVR_BUY)); +} + // Handles: @edit and @editobj bool RlvActions::canEdit(const LLViewerObject* pObj) { @@ -408,6 +425,22 @@ bool RlvActions::canInteract(const LLViewerObject* pObj, const LLVector3& posOff ( (!rlvHandler.hasBehaviour(RLV_BHVR_FARTOUCH)) || (pObj->isHUDAttachment()) || (dist_vec_squared(gAgent.getPositionGlobal(), pObj->getPositionGlobal() + LLVector3d(posOffset)) <= s_nFartouchDist * s_nFartouchDist)) ); } +// Handles: @pay +bool RlvActions::canPayAvatar(const LLUUID& idAvatar) +{ + // User can pay an avatar if: + // - not restricted from paying avatars + return (!RlvHandler::instance().hasBehaviour(RLV_BHVR_PAY)); +} + +// Handles: @buy +bool RlvActions::canPayObject(const LLUUID& idObj) +{ + // User can pay an object/vendor if: + // - not restricted from buying objects + return (!RlvHandler::instance().hasBehaviour(RLV_BHVR_BUY)); +} + bool RlvActions::canRez() { return (!gRlvHandler.hasBehaviour(RLV_BHVR_REZ)); @@ -456,7 +489,7 @@ bool RlvActions::canShowHoverText(const LLViewerObject *pObj) !( (rlvHandler.hasBehaviour(RLV_BHVR_SHOWHOVERTEXTALL)) || ( (rlvHandler.hasBehaviour(RLV_BHVR_SHOWHOVERTEXTWORLD)) && (!pObj->isHUDAttachment()) ) || ( (rlvHandler.hasBehaviour(RLV_BHVR_SHOWHOVERTEXTHUD)) && (pObj->isHUDAttachment()) ) || - (rlvHandler.isException(RLV_BHVR_SHOWHOVERTEXT, pObj->getID(), RLV_CHECK_PERMISSIVE)) ) ); + (rlvHandler.isException(RLV_BHVR_SHOWHOVERTEXT, pObj->getID(), ERlvExceptionCheck::Permissive)) ) ); } // Handles: @touchall, @touchthis, @touchworld, @touchattach, @touchattachself, @touchattachother, @touchhud, @touchme and @fartouch @@ -503,28 +536,28 @@ bool RlvActions::canTouch(const LLViewerObject* pObj, const LLVector3& posOffset bool fCanTouch = (idRoot.notNull()) && ( (pObj->isHUDAttachment()) || (!rlvHandler.hasBehaviour(RLV_BHVR_TOUCHALL)) ) && - ( (!rlvHandler.hasBehaviour(RLV_BHVR_TOUCHTHIS)) || (!rlvHandler.isException(RLV_BHVR_TOUCHTHIS, idRoot, RLV_CHECK_PERMISSIVE)) ); + ( (!rlvHandler.hasBehaviour(RLV_BHVR_TOUCHTHIS)) || (!rlvHandler.isException(RLV_BHVR_TOUCHTHIS, idRoot, ERlvExceptionCheck::Permissive)) ); if (fCanTouch) { if ( (!pObj->isAttachment()) || (!pObj->permYouOwner()) ) { // Rezzed or attachment worn by other - test for (1.c), (2.d), (2.e) and (1/2.h) fCanTouch = - ( (!pObj->isAttachment()) ? (!rlvHandler.hasBehaviour(RLV_BHVR_TOUCHWORLD)) || (rlvHandler.isException(RLV_BHVR_TOUCHWORLD, idRoot, RLV_CHECK_PERMISSIVE)) - : ((!rlvHandler.hasBehaviour(RLV_BHVR_TOUCHATTACH)) && (!rlvHandler.hasBehaviour(RLV_BHVR_TOUCHATTACHOTHER))) || (rlvHandler.isException(RLV_BHVR_TOUCHATTACH, idRoot, RLV_CHECK_PERMISSIVE)) ) && + ( (!pObj->isAttachment()) ? (!rlvHandler.hasBehaviour(RLV_BHVR_TOUCHWORLD)) || (rlvHandler.isException(RLV_BHVR_TOUCHWORLD, idRoot, ERlvExceptionCheck::Permissive)) + : ((!rlvHandler.hasBehaviour(RLV_BHVR_TOUCHATTACH)) && (!rlvHandler.hasBehaviour(RLV_BHVR_TOUCHATTACHOTHER))) || (rlvHandler.isException(RLV_BHVR_TOUCHATTACH, idRoot, ERlvExceptionCheck::Permissive)) ) && ( (!rlvHandler.hasBehaviour(RLV_BHVR_FARTOUCH)) || (dist_vec_squared(gAgent.getPositionGlobal(), pObj->getPositionGlobal() + LLVector3d(posOffset)) <= s_nFartouchDist * s_nFartouchDist) ); } else if (!pObj->isHUDAttachment()) { // Regular attachment worn by this avie - test for (3.d), (3.e) and (3.h) fCanTouch = - ((!rlvHandler.hasBehaviour(RLV_BHVR_TOUCHATTACH)) || (rlvHandler.isException(RLV_BHVR_TOUCHATTACH, idRoot, RLV_CHECK_PERMISSIVE))) && - ((!rlvHandler.hasBehaviour(RLV_BHVR_TOUCHATTACHSELF)) || (rlvHandler.isException(RLV_BHVR_TOUCHATTACH, idRoot, RLV_CHECK_PERMISSIVE))); + ((!rlvHandler.hasBehaviour(RLV_BHVR_TOUCHATTACH)) || (rlvHandler.isException(RLV_BHVR_TOUCHATTACH, idRoot, ERlvExceptionCheck::Permissive))) && + ((!rlvHandler.hasBehaviour(RLV_BHVR_TOUCHATTACHSELF)) || (rlvHandler.isException(RLV_BHVR_TOUCHATTACH, idRoot, ERlvExceptionCheck::Permissive))); } else { // HUD attachment - test for (4.g) - fCanTouch = (!hasBehaviour(RLV_BHVR_TOUCHHUD)) || (rlvHandler.isException(RLV_BHVR_TOUCHHUD, idRoot, RLV_CHECK_PERMISSIVE)); + fCanTouch = (!hasBehaviour(RLV_BHVR_TOUCHHUD)) || (rlvHandler.isException(RLV_BHVR_TOUCHHUD, idRoot, ERlvExceptionCheck::Permissive)); } } // Post-check for (1/2/3/4i) @@ -586,7 +619,11 @@ bool RlvActions::isRlvEnabled() return RlvHandler::isEnabled(); } +#ifdef CATZNIP_STRINGVIEW +void RlvActions::notifyBlocked(const boost::string_view& strNotifcation, const LLSD& sdArgs) +#else void RlvActions::notifyBlocked(const std::string& strNotifcation, const LLSD& sdArgs) +#endif // CATZNIP_STRINGVIEW { RlvUtil::notifyBlocked(strNotifcation, sdArgs); } diff --git a/indra/newview/rlvactions.h b/indra/newview/rlvactions.h index 87e824287f..060dc1a9c3 100644 --- a/indra/newview/rlvactions.h +++ b/indra/newview/rlvactions.h @@ -1,6 +1,6 @@ /** * - * Copyright (c) 2009-2016, Kitty Barnett + * Copyright (c) 2009-2020, Kitty Barnett * * The source code in this file is provided to you under the terms of the * GNU Lesser General Public License, version 2.1, but WITHOUT ANY WARRANTY; @@ -109,6 +109,11 @@ public: */ static bool canSendIM(const LLUUID& idRecipient); + /* + * Returns true if the viewer can inform the region about the user's (nearby chat) typing + */ + static bool canSendTypingStart(); + /* * Returns true if the user is allowed to start a - P2P or group - conversation with the specified UUID (or if the session already exists, unless 'ignore open' is specified) */ @@ -234,6 +239,11 @@ public: */ static bool canBuild(); + /* + * Returns true if the user can buy an object set for sale + */ + static bool canBuyObject(const LLUUID& idObj); + /* * Returns true if the user can edit the specified object (with an optional relative offset) */ @@ -250,6 +260,16 @@ public: */ static bool canInteract(const LLViewerObject* pObj, const LLVector3& posOffset = LLVector3::zero); + /* + * Returns true if the user can pay an avatar + */ + static bool canPayAvatar(const LLUUID& idAvatar); + + /* + * Returns true if the user can pay an object (i.e. vendor) + */ + static bool canPayObject(const LLUUID& idObj); + /* * Returns true if the user can rez new objects (from inventory or through the create tool) */ @@ -310,7 +330,11 @@ public: /* * Shows one of the blocked toast notifications (see rlva_strings.xml) */ +#ifdef CATZNIP_STRINGVIEW + static void notifyBlocked(const boost::string_view& strNotifcation, const LLSD& sdArgs = LLSD()); +#else static void notifyBlocked(const std::string& strNotifcation, const LLSD& sdArgs = LLSD()); +#endif // CATZNIP_STRINGVIEW }; // ============================================================================ diff --git a/indra/newview/rlvcommon.cpp b/indra/newview/rlvcommon.cpp index f61473b306..258136baa0 100644 --- a/indra/newview/rlvcommon.cpp +++ b/indra/newview/rlvcommon.cpp @@ -1,17 +1,17 @@ -/** +/** * - * Copyright (c) 2009-2011, Kitty Barnett - * - * The source code in this file is provided to you under the terms of the + * Copyright (c) 2009-2020, Kitty Barnett + * + * The source code in this file is provided to you under the terms of the * GNU Lesser General Public License, version 2.1, but WITHOUT ANY WARRANTY; - * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A - * PARTICULAR PURPOSE. Terms of the LGPL can be found in doc/LGPL-licence.txt + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A + * PARTICULAR PURPOSE. Terms of the LGPL can be found in doc/LGPL-licence.txt * in this distribution, or online at http://www.gnu.org/licenses/lgpl-2.1.txt - * + * * By copying, modifying or distributing this software, you acknowledge that - * you have read and understood your obligations described above, and agree to + * you have read and understood your obligations described above, and agree to * abide by those obligations. - * + * */ #include "llviewerprecompiledheaders.h" @@ -102,9 +102,9 @@ void RlvSettings::initClass() { initCompatibilityMode(LLStringUtil::null); - s_fTempAttach = rlvGetSetting(RLV_SETTING_ENABLETEMPATTACH, true); - if (gSavedSettings.controlExists(RLV_SETTING_ENABLETEMPATTACH)) - gSavedSettings.getControl(RLV_SETTING_ENABLETEMPATTACH)->getSignal()->connect(boost::bind(&onChangedSettingBOOL, _2, &s_fTempAttach)); + s_fTempAttach = rlvGetSetting(RlvSettingNames::EnableTempAttach, true); + if (gSavedSettings.controlExists(RlvSettingNames::EnableTempAttach)) + gSavedSettings.getControl(RlvSettingNames::EnableTempAttach)->getSignal()->connect(boost::bind(&onChangedSettingBOOL, _2, &s_fTempAttach)); #ifdef RLV_EXPERIMENTAL_COMPOSITEFOLDERS s_fCompositeFolders = rlvGetSetting(RLV_SETTING_ENABLECOMPOSITES, false); @@ -112,19 +112,19 @@ void RlvSettings::initClass() gSavedSettings.getControl(RLV_SETTING_ENABLECOMPOSITES)->getSignal()->connect(boost::bind(&onChangedSettingBOOL, _2, &s_fCompositeFolders)); #endif // RLV_EXPERIMENTAL_COMPOSITEFOLDERS - s_fLegacyNaming = rlvGetSetting(RLV_SETTING_ENABLELEGACYNAMING, true); - if (gSavedSettings.controlExists(RLV_SETTING_ENABLELEGACYNAMING)) - gSavedSettings.getControl(RLV_SETTING_ENABLELEGACYNAMING)->getSignal()->connect(boost::bind(&onChangedSettingBOOL, _2, &s_fLegacyNaming)); + s_fLegacyNaming = rlvGetSetting(RlvSettingNames::EnableLegacyNaming, true); + if (gSavedSettings.controlExists(RlvSettingNames::EnableLegacyNaming)) + gSavedSettings.getControl(RlvSettingNames::EnableLegacyNaming)->getSignal()->connect(boost::bind(&onChangedSettingBOOL, _2, &s_fLegacyNaming)); - s_fCanOOC = rlvGetSetting(RLV_SETTING_CANOOC, true); - s_fNoSetEnv = rlvGetSetting(RLV_SETTING_NOSETENV, false); + s_fCanOOC = rlvGetSetting(RlvSettingNames::CanOoc, true); + s_fNoSetEnv = rlvGetSetting(RlvSettingNames::NoSetEnv, false); // Don't allow toggling RLVaLoginLastLocation from the debug settings floater - if (gSavedPerAccountSettings.controlExists(RLV_SETTING_LOGINLASTLOCATION)) - gSavedPerAccountSettings.getControl(RLV_SETTING_LOGINLASTLOCATION)->setHiddenFromSettingsEditor(true); + if (gSavedPerAccountSettings.controlExists(RlvSettingNames::LoginLastLocation)) + gSavedPerAccountSettings.getControl(RlvSettingNames::LoginLastLocation)->setHiddenFromSettingsEditor(true); - if (gSavedSettings.controlExists(RLV_SETTING_TOPLEVELMENU)) - gSavedSettings.getControl(RLV_SETTING_TOPLEVELMENU)->getSignal()->connect(boost::bind(&onChangedMenuLevel)); + if (gSavedSettings.controlExists(RlvSettingNames::TopLevelMenu)) + gSavedSettings.getControl(RlvSettingNames::TopLevelMenu)->getSignal()->connect(boost::bind(&onChangedMenuLevel)); int nMinMaturity = gSavedSettings.getS32("RLVaExperienceMaturityThreshold"); s_nExperienceMinMaturity = (nMinMaturity == 0) ? 0 : ((nMinMaturity == 1) ? SIM_ACCESS_PG : ((nMinMaturity == 2) ? SIM_ACCESS_MATURE : SIM_ACCESS_ADULT)); @@ -138,12 +138,12 @@ void RlvSettings::initClass() // Checked: 2010-04-01 (RLVa-1.2.0c) | Modified: RLVa-0.2.1d void RlvSettings::updateLoginLastLocation() { - if ( (!LLApp::isQuitting()) && (gSavedPerAccountSettings.controlExists(RLV_SETTING_LOGINLASTLOCATION)) ) + if ( (!LLApp::isExiting()) && (gSavedPerAccountSettings.controlExists(RlvSettingNames::LoginLastLocation)) ) { - BOOL fValue = (gRlvHandler.hasBehaviour(RLV_BHVR_TPLOC)) || (!RlvActions::canStand()); - if (gSavedPerAccountSettings.getBOOL(RLV_SETTING_LOGINLASTLOCATION) != fValue) + bool fValue = (gRlvHandler.hasBehaviour(RLV_BHVR_TPLOC)) || (!RlvActions::canStand()); + if (gSavedPerAccountSettings.get(RlvSettingNames::LoginLastLocation) != fValue) { - gSavedPerAccountSettings.setBOOL(RLV_SETTING_LOGINLASTLOCATION, fValue); + gSavedPerAccountSettings.set(RlvSettingNames::LoginLastLocation, fValue); gSavedPerAccountSettings.saveToFile(gSavedSettings.getString("PerAccountSettingsFile"), TRUE); } } @@ -362,7 +362,11 @@ std::string RlvStrings::getAnonym(const std::string& strName) } // Checked: 2011-11-08 (RLVa-1.5.0) +#ifdef CATZNIP_STRINGVIEW +const std::string& RlvStrings::getString(const boost::string_view& strStringName) +#else const std::string& RlvStrings::getString(const std::string& strStringName) +#endif // CATZNIP_STRINGVIEW { static const std::string strMissing = "(Missing RLVa string)"; string_map_t::const_iterator itString = m_StringMap.find(strStringName); @@ -430,8 +434,8 @@ std::string RlvStrings::getVersion(const LLUUID& idRlvObject, bool fLegacy) std::string RlvStrings::getVersionAbout() { - return llformat("RLV v%d.%d.%d / RLVa v%d.%d.%d.%d", RLV_VERSION_MAJOR, RLV_VERSION_MINOR, RLV_VERSION_PATCH, RLVa_VERSION_MAJOR, RLVa_VERSION_MINOR, RLVa_VERSION_PATCH, - LLVersionInfo::getInstance()->getBuild()); + return llformat("RLV v%d.%d.%d / RLVa v%d.%d.%d.%d", + RLV_VERSION_MAJOR, RLV_VERSION_MINOR, RLV_VERSION_PATCH, RLVa_VERSION_MAJOR, RLVa_VERSION_MINOR, RLVa_VERSION_PATCH, LLVersionInfo::instance().getBuild()); } std::string RlvStrings::getVersionNum(const LLUUID& idRlvObject) @@ -484,14 +488,14 @@ void RlvUtil::filterLocation(std::string& strUTF8Text) { // Filter any mention of the surrounding region names LLWorld::region_list_t regions = LLWorld::getInstance()->getRegionList(); - const std::string& strHiddenRegion = RlvStrings::getString(RLV_STRING_HIDDEN_REGION); + const std::string& strHiddenRegion = RlvStrings::getString(RlvStringKeys::Hidden::Region); for (LLWorld::region_list_t::const_iterator itRegion = regions.begin(); itRegion != regions.end(); ++itRegion) boost::replace_all_regex(strUTF8Text, boost::regex("\\b" + escape_for_regex((*itRegion)->getName()) + "\\b", boost::regex::icase), strHiddenRegion); // Filter any mention of the parcel name LLViewerParcelMgr* pParcelMgr = LLViewerParcelMgr::getInstance(); if (pParcelMgr) - boost::replace_all_regex(strUTF8Text, boost::regex("\\b" + escape_for_regex(pParcelMgr->getAgentParcelName()) + "\\b", boost::regex::icase), RlvStrings::getString(RLV_STRING_HIDDEN_PARCEL)); + boost::replace_all_regex(strUTF8Text, boost::regex("\\b" + escape_for_regex(pParcelMgr->getAgentParcelName()) + "\\b", boost::regex::icase), RlvStrings::getString(RlvStringKeys::Hidden::Parcel)); } // Checked: 2010-12-08 (RLVa-1.2.2c) | Modified: RLVa-1.2.2c @@ -537,7 +541,7 @@ void RlvUtil::filterScriptQuestions(S32& nQuestions, LLSD& sdPayload) if ( (!gRlvAttachmentLocks.canAttach()) && (SCRIPT_PERMISSIONS[SCRIPT_PERMISSION_ATTACH].permbit & nQuestions) ) { // Notify the user that we blocked it since they're not allowed to wear any new attachments - sdPayload["rlv_blocked"] = RLV_STRING_BLOCKED_PERMATTACH; + sdPayload["rlv_blocked"] = RlvStringKeys::Blocked::PermissionAttach; nQuestions &= ~SCRIPT_PERMISSIONS[SCRIPT_PERMISSION_ATTACH].permbit; } @@ -545,7 +549,7 @@ void RlvUtil::filterScriptQuestions(S32& nQuestions, LLSD& sdPayload) if ( (gRlvHandler.hasBehaviour(RLV_BHVR_TPLOC)) && (SCRIPT_PERMISSIONS[SCRIPT_PERMISSION_TELEPORT].permbit & nQuestions) ) { // Notify the user that we blocked it since they're not allowed to teleport - sdPayload["rlv_blocked"] = RLV_STRING_BLOCKED_PERMTELEPORT; + sdPayload["rlv_blocked"] = RlvStringKeys::Blocked::PermissionTeleport; nQuestions &= ~SCRIPT_PERMISSIONS[SCRIPT_PERMISSION_TELEPORT].permbit; } @@ -588,7 +592,11 @@ bool RlvUtil::isNearbyRegion(const std::string& strRegion) } // Checked: 2011-04-11 (RLVa-1.3.0h) | Modified: RLVa-1.3.0h +#ifdef CATZNIP_STRINGVIEW +void RlvUtil::notifyBlocked(const boost::string_view& strNotifcation, const LLSD& sdArgs, bool fLogToChat) +#else void RlvUtil::notifyBlocked(const std::string& strNotifcation, const LLSD& sdArgs, bool fLogToChat) +#endif // CATZNIP_STRINGVIEW { std::string strMsg = RlvStrings::getString(strNotifcation); LLStringUtil::format(strMsg, sdArgs); @@ -607,7 +615,7 @@ void RlvUtil::notifyFailedAssertion(const std::string& strAssert, const std::str // Don't show the same assertion over and over, or if the user opted out static std::string strAssertPrev, strFilePrev; static int nLinePrev; if ( ((strAssertPrev == strAssert) && (strFile == strFilePrev) && (nLine == nLinePrev)) || - (!rlvGetSetting(RLV_SETTING_SHOWASSERTIONFAIL, true)) ) + (!rlvGetSetting(RlvSettingNames::ShowAssertionFail, true)) ) { return; } @@ -705,7 +713,7 @@ bool rlvMenuMainToggleVisible(LLUICtrl* pMenuCtrl) if (pMenuItem) { static std::string strLabel = pMenuItem->getLabel(); - if ((bool)gSavedSettings.getBOOL(RLV_SETTING_MAIN) == rlv_handler_t::isEnabled()) + if ((bool)gSavedSettings.get(RlvSettingNames::Main) == rlv_handler_t::isEnabled()) pMenuItem->setLabel(strLabel); else pMenuItem->setLabel(strLabel + " " + LLTrans::getString("RLVaPendingRestart")); @@ -716,7 +724,7 @@ bool rlvMenuMainToggleVisible(LLUICtrl* pMenuCtrl) // Checked: 2011-08-16 (RLVa-1.4.0b) | Added: RLVa-1.4.0b void rlvMenuToggleVisible() { - bool fTopLevel = rlvGetSetting(RLV_SETTING_TOPLEVELMENU, true); + bool fTopLevel = rlvGetSetting(RlvSettingNames::TopLevelMenu, true); bool fRlvEnabled = rlv_handler_t::isEnabled(); LLMenuGL* pRLVaMenuMain = gMenuBarView->findChildMenuByName("RLVa Main", FALSE); diff --git a/indra/newview/rlvcommon.h b/indra/newview/rlvcommon.h index 62b7c0ab6d..0dc9e0e3c4 100644 --- a/indra/newview/rlvcommon.h +++ b/indra/newview/rlvcommon.h @@ -1,21 +1,20 @@ -/** +/** * - * Copyright (c) 2009-2011, Kitty Barnett - * - * The source code in this file is provided to you under the terms of the + * Copyright (c) 2009-2020, Kitty Barnett + * + * The source code in this file is provided to you under the terms of the * GNU Lesser General Public License, version 2.1, but WITHOUT ANY WARRANTY; - * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A - * PARTICULAR PURPOSE. Terms of the LGPL can be found in doc/LGPL-licence.txt + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A + * PARTICULAR PURPOSE. Terms of the LGPL can be found in doc/LGPL-licence.txt * in this distribution, or online at http://www.gnu.org/licenses/lgpl-2.1.txt - * + * * By copying, modifying or distributing this software, you acknowledge that - * you have read and understood your obligations described above, and agree to + * you have read and understood your obligations described above, and agree to * abide by those obligations. - * + * */ -#ifndef RLV_COMMON_H -#define RLV_COMMON_H +#pragma once #include "llavatarname.h" #include "llselectmgr.h" @@ -65,13 +64,21 @@ class RlvGCTimer; // RlvSettings // +#ifdef CATZNIP_STRINGVIEW +template inline T rlvGetSetting(const boost::string_view& strSetting, const T& defaultValue) +#else template inline T rlvGetSetting(const std::string& strSetting, const T& defaultValue) +#endif // CATZNIP_STRINGVIEW { RLV_ASSERT_DBG(gSavedSettings.controlExists(strSetting)); return (gSavedSettings.controlExists(strSetting)) ? gSavedSettings.get(strSetting) : defaultValue; } +#ifdef CATZNIP_STRINGVIEW +template inline T rlvGetPerUserSetting(const boost::string_view& strSetting, const T& defaultValue) +#else template inline T rlvGetPerUserSetting(const std::string& strSetting, const T& defaultValue) +#endif // CATZNIP_STRINGVIEW { RLV_ASSERT_DBG(gSavedPerAccountSettings.controlExists(strSetting)); return (gSavedPerAccountSettings.controlExists(strSetting)) ? gSavedPerAccountSettings.get(strSetting) : defaultValue; @@ -80,29 +87,29 @@ template inline T rlvGetPerUserSetting(const std::string& strSetting class RlvSettings { public: - static bool getDebug() { return rlvGetSetting(RLV_SETTING_DEBUG, false); } + static bool getDebug() { return rlvGetSetting(RlvSettingNames::Debug, false); } static bool getCanOOC() { return s_fCanOOC; } - static bool getForbidGiveToRLV() { return rlvGetSetting(RLV_SETTING_FORBIDGIVETORLV, true); } + static bool getForbidGiveToRLV() { return rlvGetSetting(RlvSettingNames::ForbidGiveToRlv, true); } static bool getNoSetEnv() { return s_fNoSetEnv; } - static std::string getWearAddPrefix() { return rlvGetSetting(RLV_SETTING_WEARADDPREFIX, LLStringUtil::null); } - static std::string getWearReplacePrefix() { return rlvGetSetting(RLV_SETTING_WEARREPLACEPREFIX, LLStringUtil::null); } + static std::string getWearAddPrefix() { return rlvGetSetting(RlvSettingNames::WearAddPrefix, LLStringUtil::null); } + static std::string getWearReplacePrefix() { return rlvGetSetting(RlvSettingNames::WearReplacePrefix, LLStringUtil::null); } - static bool getDebugHideUnsetDup() { return rlvGetSetting(RLV_SETTING_DEBUGHIDEUNSETDUP, false); } + static bool getDebugHideUnsetDup() { return rlvGetSetting(RlvSettingNames::DebugHideUnsetDup, false); } #ifdef RLV_EXPERIMENTAL_COMPOSITEFOLDERS static BOOL getEnableComposites() { return s_fCompositeFolders; } #endif // RLV_EXPERIMENTAL_COMPOSITEFOLDERS - static bool getEnableIMQuery() { return rlvGetSetting("RLVaEnableIMQuery", true); } + static bool getEnableIMQuery() { return rlvGetSetting(RlvSettingNames::EnableIMQuery, true); } static bool getEnableLegacyNaming() { return s_fLegacyNaming; } - static bool getEnableSharedWear() { return rlvGetSetting(RLV_SETTING_ENABLESHAREDWEAR, false); } + static bool getEnableSharedWear() { return rlvGetSetting(RlvSettingNames::EnableSharedWear, false); } static bool getEnableTemporaryAttachments() { return s_fTempAttach; } - static bool getHideLockedLayers() { return rlvGetSetting(RLV_SETTING_HIDELOCKEDLAYER, false); } - static bool getHideLockedAttach() { return rlvGetSetting(RLV_SETTING_HIDELOCKEDATTACH, false); } - static bool getHideLockedInventory() { return rlvGetSetting(RLV_SETTING_HIDELOCKEDINVENTORY, false); } - static bool getSharedInvAutoRename() { return rlvGetSetting(RLV_SETTING_SHAREDINVAUTORENAME, true); } - static bool getSplitRedirectChat() { return rlvGetSetting(RLV_SETTING_SPLITREDIRECTCHAT, false); } + static bool getHideLockedLayers() { return rlvGetSetting(RlvSettingNames::HideLockedLayer, false); } + static bool getHideLockedAttach() { return rlvGetSetting(RlvSettingNames::HideLockedAttach, false); } + static bool getHideLockedInventory() { return rlvGetSetting(RlvSettingNames::HideLockedInventory, false); } + static bool getSharedInvAutoRename() { return rlvGetSetting(RlvSettingNames::SharedInvAutoRename, true); } + static bool getSplitRedirectChat() { return rlvGetSetting(RlvSettingNames::SplitRedirectChat, false); } - static bool getLoginLastLocation() { return rlvGetPerUserSetting(RLV_SETTING_LOGINLASTLOCATION, true); } + static bool getLoginLastLocation() { return rlvGetPerUserSetting(RlvSettingNames::LoginLastLocation, true); } static void updateLoginLastLocation(); static void initCompatibilityMode(std::string strCompatList); @@ -147,7 +154,11 @@ public: static std::string getAnonym(const LLAvatarName& avName); // @shownames static std::string getAnonym(const std::string& strName); // @shownames +#ifdef CATZNIP_STRINGVIEW + static const std::string& getString(const boost::string_view& strStringName); +#else static const std::string& getString(const std::string& strStringName); +#endif // CATZNIP_STRINGVIEW static const char* getStringFromReturnCode(ERlvCmdRet eRet); static const std::string& getStringMapPath() { return m_StringMapPath; } static std::string getVersion(const LLUUID& idRlvObject, bool fLegacy = false); @@ -159,7 +170,7 @@ public: protected: static std::vector m_Anonyms; - typedef std::map > string_map_t; + typedef std::map, std::less<>> string_map_t; static string_map_t m_StringMap; static std::string m_StringMapPath; }; @@ -182,9 +193,14 @@ public: static bool isForceTp() { return m_fForceTp; } static void forceTp(const LLVector3d& posDest); // Ignores restrictions that might otherwise prevent tp'ing +#ifdef CATZNIP_STRINGVIEW + static void notifyBlocked(const std::string& strNotifcation, const LLSD& sdArgs = LLSD(), bool fLogToChat = false) { notifyBlocked(boost::string_view(strNotifcation), sdArgs, fLogToChat); } + static void notifyBlocked(const boost::string_view& strNotifcation, const LLSD& sdArgs = LLSD(), bool fLogToChat = false); +#else static void notifyBlocked(const std::string& strNotifcation, const LLSD& sdArgs = LLSD(), bool fLogToChat = false); - static void notifyBlockedGeneric() { notifyBlocked(RLV_STRING_BLOCKED_GENERIC); } - static void notifyBlockedViewXXX(LLAssetType::EType assetType) { notifyBlocked(RLV_STRING_BLOCKED_VIEWXXX, LLSD().with("[TYPE]", LLTrans::getString(LLAssetType::lookupHumanReadable(assetType)))); } +#endif // CATZNIP_STRINGVIEW + static void notifyBlockedGeneric() { notifyBlocked(RlvStringKeys::Blocked::Generic); } + static void notifyBlockedViewXXX(LLAssetType::EType assetType) { notifyBlocked(RlvStringKeys::Blocked::ViewXxx, LLSD().with("[TYPE]", LLTrans::getString(LLAssetType::lookupHumanReadable(assetType)))); } static void notifyFailedAssertion(const std::string& strAssert, const std::string& strFile, int nLine); static void sendBusyMessage(const LLUUID& idTo, const std::string& strMsg, const LLUUID& idSession = LLUUID::null); @@ -333,5 +349,3 @@ inline bool RlvUtil::sendChatReply(const std::string& strChannel, const std::str } // ============================================================================ - -#endif // RLV_COMMON_H diff --git a/indra/newview/rlvdefines.h b/indra/newview/rlvdefines.h index 9ce476ee5c..2ae7d82b56 100644 --- a/indra/newview/rlvdefines.h +++ b/indra/newview/rlvdefines.h @@ -1,6 +1,6 @@ /** * - * Copyright (c) 2009-2016, Kitty Barnett + * Copyright (c) 2009-2020, Kitty Barnett * * The source code in this file is provided to you under the terms of the * GNU Lesser General Public License, version 2.1, but WITHOUT ANY WARRANTY; @@ -14,8 +14,11 @@ * */ -#ifndef RLV_DEFINES_H -#define RLV_DEFINES_H +#pragma once + +#ifdef CATZNIP_STRINGVIEW +#include "llstringview.h" +#endif // CATZNIP_STRINGVIE // ============================================================================ // Defines @@ -151,8 +154,10 @@ enum ERlvBehaviour { RLV_BHVR_ACCEPTTP, // "accepttp" RLV_BHVR_ACCEPTTPREQUEST, // "accepttprequest" RLV_BHVR_ALLOWIDLE, // "allowidle" + RLV_BHVR_BUY, // "buy" RLV_BHVR_EDIT, // "edit" RLV_BHVR_EDITOBJ, // "editobj" + RLV_BHVR_PAY, // "pay" RLV_BHVR_REZ, // "rez" RLV_BHVR_FARTOUCH, // "fartouch" RLV_BHVR_INTERACT, // "interact" @@ -324,11 +329,11 @@ enum ERlvCmdRet { }; #define RLV_RET_SUCCEEDED(eCmdRet) (((eCmdRet) & RLV_RET_SUCCESS) == RLV_RET_SUCCESS) -enum ERlvExceptionCheck +enum class ERlvExceptionCheck { - RLV_CHECK_PERMISSIVE, // Exception can be set by any object - RLV_CHECK_STRICT, // Exception must be set by all objects holding the restriction - RLV_CHECK_DEFAULT // Permissive or strict will be determined by currently enforced restrictions + Permissive, // Exception can be set by any object + Strict, // Exception must be set by all objects holding the restriction + Default, // Permissive or strict will be determined by currently enforced restrictions }; enum ERlvLockMask @@ -362,61 +367,131 @@ enum ERlvAttachGroupType // Settings // -#define RLV_SETTING_MAIN "RestrainedLove" -#define RLV_SETTING_DEBUG "RestrainedLoveDebug" -#define RLV_SETTING_CANOOC "RestrainedLoveCanOOC" -#define RLV_SETTING_FORBIDGIVETORLV "RestrainedLoveForbidGiveToRLV" -#define RLV_SETTING_NOSETENV "RestrainedLoveNoSetEnv" -#define RLV_SETTING_SHOWELLIPSIS "RestrainedLoveShowEllipsis" -#define RLV_SETTING_WEARADDPREFIX "RestrainedLoveStackWhenFolderBeginsWith" -#define RLV_SETTING_WEARREPLACEPREFIX "RestrainedLoveReplaceWhenFolderBeginsWith" +namespace RlvSettingNames +{ +#ifdef CATZNIP_STRINGVIEW + /*inline*/ constexpr boost::string_view Main = make_string_view("RestrainedLove"); + /*inline*/ constexpr boost::string_view Debug = make_string_view("RestrainedLoveDebug"); + /*inline*/ constexpr boost::string_view CanOoc = make_string_view("RestrainedLoveCanOOC"); + /*inline*/ constexpr boost::string_view ForbidGiveToRlv = make_string_view("RestrainedLoveForbidGiveToRLV"); + /*inline*/ constexpr boost::string_view NoSetEnv = make_string_view("RestrainedLoveNoSetEnv"); + /*inline*/ constexpr boost::string_view ShowEllipsis = make_string_view("RestrainedLoveShowEllipsis"); + /*inline*/ constexpr boost::string_view WearAddPrefix = make_string_view("RestrainedLoveStackWhenFolderBeginsWith"); + /*inline*/ constexpr boost::string_view WearReplacePrefix = make_string_view("RestrainedLoveReplaceWhenFolderBeginsWith"); -#define RLV_SETTING_DEBUGHIDEUNSETDUP "RLVaDebugHideUnsetDuplicate" -#define RLV_SETTING_ENABLECOMPOSITES "RLVaEnableCompositeFolders" -#define RLV_SETTING_ENABLELEGACYNAMING "RLVaEnableLegacyNaming" -#define RLV_SETTING_ENABLESHAREDWEAR "RLVaEnableSharedWear" -#define RLV_SETTING_ENABLETEMPATTACH "RLVaEnableTemporaryAttachments" -#define RLV_SETTING_HIDELOCKEDLAYER "RLVaHideLockedLayers" -#define RLV_SETTING_HIDELOCKEDATTACH "RLVaHideLockedAttachments" -#define RLV_SETTING_HIDELOCKEDINVENTORY "RLVaHideLockedInventory" -#define RLV_SETTING_LOGINLASTLOCATION "RLVaLoginLastLocation" -#define RLV_SETTING_SHAREDINVAUTORENAME "RLVaSharedInvAutoRename" -#define RLV_SETTING_SHOWASSERTIONFAIL "RLVaShowAssertionFailures" -#define RLV_SETTING_SPLITREDIRECTCHAT "RLVaSplitRedirectChat" -#define RLV_SETTING_TOPLEVELMENU "RLVaTopLevelMenu" -#define RLV_SETTING_WEARREPLACEUNLOCKED "RLVaWearReplaceUnlocked" + /*inline*/ constexpr boost::string_view DebugHideUnsetDup = make_string_view("RLVaDebugHideUnsetDuplicate"); + /*inline*/ constexpr boost::string_view EnableIMQuery = make_string_view("RLVaEnableIMQuery"); + /*inline*/ constexpr boost::string_view EnableLegacyNaming = make_string_view("RLVaEnableLegacyNaming"); + /*inline*/ constexpr boost::string_view EnableSharedWear = make_string_view("RLVaEnableSharedWear"); + /*inline*/ constexpr boost::string_view EnableTempAttach = make_string_view("RLVaEnableTemporaryAttachments"); + /*inline*/ constexpr boost::string_view HideLockedLayer = make_string_view("RLVaHideLockedLayers"); + /*inline*/ constexpr boost::string_view HideLockedAttach = make_string_view("RLVaHideLockedAttachments"); + /*inline*/ constexpr boost::string_view HideLockedInventory = make_string_view("RLVaHideLockedInventory"); + /*inline*/ constexpr boost::string_view LoginLastLocation = make_string_view("RLVaLoginLastLocation"); + /*inline*/ constexpr boost::string_view SharedInvAutoRename = make_string_view("RLVaSharedInvAutoRename"); + /*inline*/ constexpr boost::string_view ShowAssertionFail = make_string_view("RLVaShowAssertionFailures"); + /*inline*/ constexpr boost::string_view ShowRedirectChatTyping = make_string_view("RLVaShowRedirectChatTyping"); + /*inline*/ constexpr boost::string_view SplitRedirectChat = make_string_view("RLVaSplitRedirectChat"); + /*inline*/ constexpr boost::string_view TopLevelMenu = make_string_view("RLVaTopLevelMenu"); + /*inline*/ constexpr boost::string_view WearReplaceUnlocked = make_string_view("RLVaWearReplaceUnlocked"); +#else + constexpr const char Main[] = "RestrainedLove"; + constexpr const char Debug[] = "RestrainedLoveDebug"; + constexpr const char CanOoc[] = "RestrainedLoveCanOOC"; + constexpr const char ForbidGiveToRlv[] = "RestrainedLoveForbidGiveToRLV"; + constexpr const char NoSetEnv[] = "RestrainedLoveNoSetEnv"; + constexpr const char ShowEllipsis[] = "RestrainedLoveShowEllipsis"; + constexpr const char WearAddPrefix[] = "RestrainedLoveStackWhenFolderBeginsWith"; + constexpr const char WearReplacePrefix[] = "RestrainedLoveReplaceWhenFolderBeginsWith"; -#define RLV_SETTING_FIRSTUSE_PREFIX "FirstRLV" -#define RLV_SETTING_FIRSTUSE_GIVETORLV RLV_SETTING_FIRSTUSE_PREFIX"GiveToRLV" + constexpr const char DebugHideUnsetDup[] = "RLVaDebugHideUnsetDuplicate"; + constexpr const char EnableIMQuery[] = "RLVaEnableIMQuery"; + constexpr const char EnableLegacyNaming[] = "RLVaEnableLegacyNaming"; + constexpr const char EnableSharedWear[] = "RLVaEnableSharedWear"; + constexpr const char EnableTempAttach[] = "RLVaEnableTemporaryAttachments"; + constexpr const char HideLockedLayer[] = "RLVaHideLockedLayers"; + constexpr const char HideLockedAttach[] = "RLVaHideLockedAttachments"; + constexpr const char HideLockedInventory[] = "RLVaHideLockedInventory"; + constexpr const char LoginLastLocation[] = "RLVaLoginLastLocation"; + constexpr const char SharedInvAutoRename[] = "RLVaSharedInvAutoRename"; + constexpr const char ShowAssertionFail[] = "RLVaShowAssertionFailures"; + constexpr const char ShowRedirectChatTyping[] = "RLVaShowRedirectChatTyping"; + constexpr const char SplitRedirectChat[] = "RLVaSplitRedirectChat"; + constexpr const char TopLevelMenu[] = "RLVaTopLevelMenu"; + constexpr const char WearReplaceUnlocked[] = "RLVaWearReplaceUnlocked"; +#endif // CATZNIP_STRINGVIEW +} // ============================================================================ // Strings (see rlva_strings.xml) // -#define RLV_STRING_HIDDEN "hidden_generic" -#define RLV_STRING_HIDDEN_PARCEL "hidden_parcel" -#define RLV_STRING_HIDDEN_REGION "hidden_region" +namespace RlvStringKeys +{ + namespace Blocked + { +#ifdef CATZNIP_STRINGVIEW + /*inline*/ constexpr boost::string_view AutoPilot = make_string_view("blocked_autopilot"); + /*inline*/ constexpr boost::string_view Generic = make_string_view("blocked_generic"); + /*inline*/ constexpr boost::string_view GroupChange = make_string_view("blocked_groupchange"); + /*inline*/ constexpr boost::string_view InvFolder = make_string_view("blocked_invfolder"); + /*inline*/ constexpr boost::string_view PermissionAttach = make_string_view("blocked_permattach"); + /*inline*/ constexpr boost::string_view PermissionTeleport = make_string_view("blocked_permteleport"); + /*inline*/ constexpr boost::string_view RecvIm = make_string_view("blocked_recvim"); + /*inline*/ constexpr boost::string_view RecvImRemote = make_string_view("blocked_recvim_remote"); + /*inline*/ constexpr boost::string_view SendIm = make_string_view("blocked_sendim"); + /*inline*/ constexpr boost::string_view StartConference = make_string_view("blocked_startconf"); + /*inline*/ constexpr boost::string_view StartIm = make_string_view("blocked_startim"); + /*inline*/ constexpr boost::string_view Teleport = make_string_view("blocked_teleport"); + /*inline*/ constexpr boost::string_view TeleportOffer = make_string_view("blocked_teleport_offer"); + /*inline*/ constexpr boost::string_view TpLureRequestRemote = make_string_view("blocked_tplurerequest_remote"); + /*inline*/ constexpr boost::string_view ViewXxx = make_string_view("blocked_viewxxx"); + /*inline*/ constexpr boost::string_view Wireframe = make_string_view("blocked_wireframe"); +#else + constexpr const char AutoPilot[] = "blocked_autopilot"; + constexpr const char Generic[] = "blocked_generic"; + constexpr const char GroupChange[] = "blocked_groupchange"; + constexpr const char InvFolder[] = "blocked_invfolder"; + constexpr const char PermissionAttach[] = "blocked_permattach"; + constexpr const char PermissionTeleport[] = "blocked_permteleport"; + constexpr const char RecvIm[] = "blocked_recvim"; + constexpr const char RecvImRemote[] = "blocked_recvim_remote"; + constexpr const char SendIm[] = "blocked_sendim"; + constexpr const char StartConference[] = "blocked_startconf"; + constexpr const char StartIm[] = "blocked_startim"; + constexpr const char Teleport[] = "blocked_teleport"; + constexpr const char TeleportOffer[] = "blocked_teleport_offer"; + constexpr const char TpLureRequestRemote[] = "blocked_tplurerequest_remote"; + constexpr const char ViewXxx[] = "blocked_viewxxx"; + constexpr const char Wireframe[] = "blocked_wireframe"; +#endif // CATZNIP_STRINGVIEW + } -#define RLV_STRING_BLOCKED_AUTOPILOT "blocked_autopilot" -#define RLV_STRING_BLOCKED_GENERIC "blocked_generic" -#define RLV_STRING_BLOCKED_GROUPCHANGE "blocked_groupchange" -#define RLV_STRING_BLOCKED_INVFOLDER "blocked_invfolder" -#define RLV_STRING_BLOCKED_PERMATTACH "blocked_permattach" -#define RLV_STRING_BLOCKED_PERMTELEPORT "blocked_permteleport" -#define RLV_STRING_BLOCKED_RECVIM "blocked_recvim" -#define RLV_STRING_BLOCKED_RECVIM_REMOTE "blocked_recvim_remote" -#define RLV_STRING_BLOCKED_SENDIM "blocked_sendim" -#define RLV_STRING_BLOCKED_STARTCONF "blocked_startconf" -#define RLV_STRING_BLOCKED_STARTIM "blocked_startim" -#define RLV_STRING_BLOCKED_TELEPORT "blocked_teleport" -#define RLV_STRING_BLOCKED_TELEPORT_OFFER "blocked_teleport_offer" -#define RLV_STRING_BLOCKED_TPLUREREQ_REMOTE "blocked_tplurerequest_remote" -#define RLV_STRING_BLOCKED_VIEWXXX "blocked_viewxxx" -#define RLV_STRING_BLOCKED_WIREFRAME "blocked_wireframe" -#define RLV_STRING_STOPIM_NOSESSION "stopim_nosession" -#define RLV_STRING_STOPIM_ENDSESSION_REMOTE "stopim_endsession_remote" -#define RLV_STRING_STOPIM_ENDSESSION_LOCAL "stopim_endsession_local" + namespace Hidden + { +#ifdef CATZNIP_STRINGVIEW + /*inline*/ constexpr boost::string_view Generic = make_string_view("hidden_generic"); + /*inline*/ constexpr boost::string_view Parcel = make_string_view("hidden_parcel"); + /*inline*/ constexpr boost::string_view Region = make_string_view("hidden_region"); +#else + constexpr const char Generic[] = "hidden_generic"; + constexpr const char Parcel[] = "hidden_parcel"; + constexpr const char Region[] = "hidden_region"; +#endif // CATZNIP_STRINGVIEW + } + + namespace StopIm + { +#ifdef CATZNIP_STRINGVIEW + /*inline*/ constexpr boost::string_view NoSession = make_string_view("stopim_nosession"); + /*inline*/ constexpr boost::string_view EndSessionRemote = make_string_view("stopim_endsession_remote"); + /*inline*/ constexpr boost::string_view EndSessionLocal = make_string_view("stopim_endsession_local"); +#else + constexpr const char NoSession[] = "stopim_nosession"; + constexpr const char EndSessionRemote[] = "stopim_endsession_remote"; + constexpr const char EndSessionLocal[] = "stopim_endsession_local"; +#endif // CATZNIP_STRINGVIEW + } +} // ============================================================================ - -#endif // RLV_DEFINES_H diff --git a/indra/newview/rlvenvironment.cpp b/indra/newview/rlvenvironment.cpp index c8ca144bbf..91e043da23 100644 --- a/indra/newview/rlvenvironment.cpp +++ b/indra/newview/rlvenvironment.cpp @@ -558,15 +558,15 @@ ERlvCmdRet RlvEnvironment::handleSetFn(const std::string& strRlvOption, const st } template<> -std::string RlvEnvironment::handleLegacyGetFn(const std::function& getFn, U32 idxComponent) +std::string RlvEnvironment::handleLegacyGetFn(const std::function& getFn, U32 idxComponent) { - if (idxComponent > 2) + if (idxComponent >= 2) return LLStringUtil::null; return std::to_string(getFn(LLEnvironment::instance().getCurrentSky()).mV[idxComponent]); } template<> -std::string RlvEnvironment::handleLegacyGetFn(const std::function& getFn, U32 idxComponent) +std::string RlvEnvironment::handleLegacyGetFn(const std::function& getFn, U32 idxComponent) { if ( (idxComponent >= VRED) && (idxComponent <= VBLUE) ) { @@ -583,7 +583,7 @@ std::string RlvEnvironment::handleLegacyGetFn(const std::function ERlvCmdRet RlvEnvironment::handleLegacySetFn(float optionValue, LLVector2 curValue, const std::function& setFn, U32 idxComponent) { - if (idxComponent > 2) + if (idxComponent >= 2) return RLV_RET_FAILED_UNKNOWN; LLSettingsSky::ptr_t pSky = LLEnvironment::instance().getCurrentSky(); @@ -672,7 +672,7 @@ void RlvEnvironment::registerSetEnvFn(const std::string& strFnName, const std::f } template -void RlvEnvironment::registerLegacySkyFn(const std::string& strFnName, const std::function< T (LLSettingsSkyPtr_t)>& getFn, const std::function& setFn) +void RlvEnvironment::registerLegacySkyFn(const std::string& strFnName, const std::function& getFn, const std::function& setFn) { RLV_ASSERT(m_LegacyGetFnLookup.end() == m_LegacyGetFnLookup.find(strFnName)); m_LegacyGetFnLookup.insert(std::make_pair(strFnName, [this, getFn](const std::string& strRlvParam, U32 idxComponent) diff --git a/indra/newview/rlvenvironment.h b/indra/newview/rlvenvironment.h index 8daf12f97d..2d19ab2341 100644 --- a/indra/newview/rlvenvironment.h +++ b/indra/newview/rlvenvironment.h @@ -45,12 +45,12 @@ protected: void registerGetEnvFn(const std::string& strFnName, const std::function& getFn); template void registerSetEnvFn(const std::string& strFnName, const std::function& setFn); template void registerSkyFn(const std::string& strFnName, const std::function& getFn, const std::function& setFn); - template void registerLegacySkyFn(const std::string& strFnName, const std::function< T (LLSettingsSky::ptr_t)>& getFn, const std::function& setFn); + template void registerLegacySkyFn(const std::string& strFnName, const std::function& getFn, const std::function& setFn); // Command handling helpers template std::string handleGetFn(const std::function& fn); template ERlvCmdRet handleSetFn(const std::string& strRlvOption, const std::function& fn); - template std::string handleLegacyGetFn(const std::function< T (LLSettingsSky::ptr_t)>& getFn, U32 idxComponent); + template std::string handleLegacyGetFn(const std::function& getFn, U32 idxComponent); template ERlvCmdRet handleLegacySetFn(float optionValue, T value, const std::function& setFn, U32 idxComponent); /* diff --git a/indra/newview/rlvextensions.cpp b/indra/newview/rlvextensions.cpp index 4612331c96..9a44df6778 100644 --- a/indra/newview/rlvextensions.cpp +++ b/indra/newview/rlvextensions.cpp @@ -35,8 +35,8 @@ RlvExtGetSet::RlvExtGetSet() { m_DbgAllowed.insert(std::pair("AvatarSex", DBG_READ | DBG_WRITE | DBG_PSEUDO)); m_DbgAllowed.insert(std::pair("RenderResolutionDivisor", DBG_READ | DBG_WRITE)); - m_DbgAllowed.insert(std::pair(RLV_SETTING_FORBIDGIVETORLV, DBG_READ)); - m_DbgAllowed.insert(std::pair(RLV_SETTING_NOSETENV, DBG_READ)); + m_DbgAllowed.insert(std::pair(RlvSettingNames::ForbidGiveToRlv, DBG_READ)); + m_DbgAllowed.insert(std::pair(RlvSettingNames::NoSetEnv, DBG_READ)); m_DbgAllowed.insert(std::pair("WindLightUseAtmosShaders", DBG_READ)); // Cache persistance of every setting diff --git a/indra/newview/rlvhandler.cpp b/indra/newview/rlvhandler.cpp index e26da09bac..0cb1b49067 100644 --- a/indra/newview/rlvhandler.cpp +++ b/indra/newview/rlvhandler.cpp @@ -76,6 +76,9 @@ // Boost includes #include +// llappviewer.cpp +extern BOOL gDoDisconnect; + // ============================================================================ // Static variable initialization // @@ -164,7 +167,7 @@ void RlvHandler::cleanup() // // Clean up any restrictions that are still active // - RLV_ASSERT(LLApp::isQuitting()); // Several commands toggle debug settings but won't if they know the viewer is quitting + RLV_ASSERT(LLApp::isExiting() || gDoDisconnect); // Several commands toggle debug settings but won't if they know the viewer is quitting // Assume we have no way to predict how m_Objects will change so make a copy ahead of time uuid_vec_t idRlvObjects; @@ -263,35 +266,34 @@ bool RlvHandler::ownsBehaviour(const LLUUID& idObj, ERlvBehaviour eBhvr) const // Behaviour exception handling // -// Checked: 2009-10-04 (RLVa-1.0.4a) | Modified: RLVa-1.0.4a void RlvHandler::addException(const LLUUID& idObj, ERlvBehaviour eBhvr, const RlvExceptionOption& varOption) { - m_Exceptions.insert(std::pair(eBhvr, RlvException(idObj, eBhvr, varOption))); + m_Exceptions.insert(std::make_pair(eBhvr, RlvException(idObj, eBhvr, varOption))); } -// Checked: 2009-10-04 (RLVa-1.0.4c) | Modified: RLVa-1.0.4c -bool RlvHandler::isException(ERlvBehaviour eBhvr, const RlvExceptionOption& varOption, ERlvExceptionCheck typeCheck) const +bool RlvHandler::isException(ERlvBehaviour eBhvr, const RlvExceptionOption& varOption, ERlvExceptionCheck eCheckType) const { // We need to "strict check" exceptions only if: the restriction is actually in place *and* (isPermissive(eBhvr) == FALSE) - if (RLV_CHECK_DEFAULT == typeCheck) - typeCheck = ( (hasBehaviour(eBhvr)) && (!isPermissive(eBhvr)) ) ? RLV_CHECK_STRICT : RLV_CHECK_PERMISSIVE; + if (ERlvExceptionCheck::Default == eCheckType) + eCheckType = ( (hasBehaviour(eBhvr)) && (!isPermissive(eBhvr)) ) ? ERlvExceptionCheck::Strict : ERlvExceptionCheck::Permissive; uuid_vec_t objList; - if (RLV_CHECK_STRICT == typeCheck) + if (ERlvExceptionCheck::Strict == eCheckType) { // If we're "strict checking" then we need the UUID of every object that currently has 'eBhvr' restricted - for (rlv_object_map_t::const_iterator itObj = m_Objects.begin(); itObj != m_Objects.end(); ++itObj) - if (itObj->second.hasBehaviour(eBhvr, !hasBehaviour(RLV_BHVR_PERMISSIVE))) - objList.push_back(itObj->first); + for (const auto& objEntry : m_Objects) + { + if (objEntry.second.hasBehaviour(eBhvr, !hasBehaviour(RLV_BHVR_PERMISSIVE))) + objList.push_back(objEntry.first); + } } - for (rlv_exception_map_t::const_iterator itException = m_Exceptions.lower_bound(eBhvr), - endException = m_Exceptions.upper_bound(eBhvr); itException != endException; ++itException) + for (rlv_exception_map_t::const_iterator itException = m_Exceptions.lower_bound(eBhvr), endException = m_Exceptions.upper_bound(eBhvr); itException != endException; ++itException) { if (itException->second.varOption == varOption) { // For permissive checks we just return on the very first match - if (RLV_CHECK_PERMISSIVE == typeCheck) + if (ERlvExceptionCheck::Permissive == eCheckType) return true; // For strict checks we don't return until the list is empty (every object with 'eBhvr' restricted also contains the exception) @@ -305,19 +307,16 @@ bool RlvHandler::isException(ERlvBehaviour eBhvr, const RlvExceptionOption& varO return false; } -// Checked: 2009-10-04 (RLVa-1.0.4a) | Modified: RLVa-1.0.4a bool RlvHandler::isPermissive(ERlvBehaviour eBhvr) const { - return (RlvBehaviourDictionary::instance().getHasStrict(eBhvr)) - ? !((hasBehaviour(RLV_BHVR_PERMISSIVE)) || (isException(RLV_BHVR_PERMISSIVE, eBhvr, RLV_CHECK_PERMISSIVE))) + return (RlvBehaviourDictionary::instance().getHasStrict(eBhvr)) + ? !((hasBehaviour(RLV_BHVR_PERMISSIVE)) || (isException(RLV_BHVR_PERMISSIVE, eBhvr, ERlvExceptionCheck::Permissive))) : true; } -// Checked: 2009-10-04 (RLVa-1.0.4a) | Modified: RLVa-1.0.4a void RlvHandler::removeException(const LLUUID& idObj, ERlvBehaviour eBhvr, const RlvExceptionOption& varOption) { - for (rlv_exception_map_t::iterator itException = m_Exceptions.lower_bound(eBhvr), - endException = m_Exceptions.upper_bound(eBhvr); itException != endException; ++itException) + for (rlv_exception_map_t::iterator itException = m_Exceptions.lower_bound(eBhvr), endException = m_Exceptions.upper_bound(eBhvr); itException != endException; ++itException) { if ( (itException->second.idObject == idObj) && (itException->second.varOption == varOption) ) { @@ -512,6 +511,11 @@ ERlvCmdRet RlvHandler::processCommand(std::reference_wrapper r { RlvCommand rlvCmdRem(rlvCmd, RLV_TYPE_REMOVE); itObj->second.removeCommand(rlvCmdRem); + if (itObj->second.m_Commands.empty()) + { + RLV_DEBUGS << "\t- command list empty => removing " << idCurObj << RLV_ENDL; + m_Objects.erase(itObj); + } } // notifyBehaviourObservers(rlvCmd, !fFromObj); } @@ -637,11 +641,11 @@ bool RlvHandler::processIMQuery(const LLUUID& idSender, const std::string& strMe // If the user can't start an IM session terminate it (if one is open) - always notify the sender in this case if (!RlvActions::canStartIM(idSender, true)) { - RlvUtil::sendBusyMessage(idSender, RlvStrings::getString(RLV_STRING_STOPIM_ENDSESSION_REMOTE)); + RlvUtil::sendBusyMessage(idSender, RlvStrings::getString(RlvStringKeys::StopIm::EndSessionRemote)); if (RlvActions::hasOpenP2PSession(idSender)) { LLAvatarActions::endIM(idSender); - RlvUtil::notifyBlocked(RLV_STRING_STOPIM_ENDSESSION_LOCAL, LLSD().with("NAME", LLSLURL("agent", idSender, "about").getSLURLString()), true); + RlvUtil::notifyBlocked(RlvStringKeys::StopIm::EndSessionLocal, LLSD().with("NAME", LLSLURL("agent", idSender, "about").getSLURLString()), true); } return true; } @@ -649,7 +653,7 @@ bool RlvHandler::processIMQuery(const LLUUID& idSender, const std::string& strMe // User can start an IM session so we do nothing - notify and hide it from the user only if IM queries are enabled if (!RlvSettings::getEnableIMQuery()) return false; - RlvUtil::sendBusyMessage(idSender, RlvStrings::getString(RLV_STRING_STOPIM_NOSESSION)); + RlvUtil::sendBusyMessage(idSender, RlvStrings::getString(RlvStringKeys::StopIm::NoSession)); return true; } else if (RlvSettings::getEnableIMQuery()) @@ -780,7 +784,7 @@ void RlvHandler::onActiveGroupChanged() // Notify them about the change const LLSD sdArgs = LLSD().with("GROUP_SLURL", (m_idAgentGroup.notNull()) ? llformat("secondlife:///app/group/%s/about", m_idAgentGroup.asString().c_str()) : "(none)"); - RlvUtil::notifyBlocked(RLV_STRING_BLOCKED_GROUPCHANGE, sdArgs); + RlvUtil::notifyBlocked(RlvStringKeys::Blocked::GroupChange, sdArgs); setActiveGroup(m_idAgentGroup); } @@ -1254,7 +1258,7 @@ bool RlvHandler::filterChat(std::string& strUTF8Text, bool fFilterEmote) const } if (fFilter) - strUTF8Text = (gSavedSettings.getBOOL("RestrainedLoveShowEllipsis")) ? "..." : ""; + strUTF8Text = (gSavedSettings.get(RlvSettingNames::ShowEllipsis)) ? "..." : ""; return fFilter; } @@ -1534,7 +1538,7 @@ bool RlvHandler::setEnabled(bool fEnable) // Reset to show assertions if the viewer version changed if (gSavedSettings.getString("LastRunVersion") != gLastRunVersion) - gSavedSettings.setBOOL("RLVaShowAssertionFailures", TRUE); + gSavedSettings.set(RlvSettingNames::ShowAssertionFail, TRUE); } return m_fEnabled; @@ -1765,9 +1769,9 @@ ERlvCmdRet RlvBehaviourGenericHandler::onCommand(const Rlv return RLV_RET_FAILED_OPTION; if (RLV_TYPE_ADD == rlvCmd.getParamType()) - gRlvHandler.addException(rlvCmd.getObjectID(), rlvCmd.getBehaviourType(), idException); + RlvHandler::instance().addException(rlvCmd.getObjectID(), rlvCmd.getBehaviourType(), idException); else - gRlvHandler.removeException(rlvCmd.getObjectID(), rlvCmd.getBehaviourType(), idException); + RlvHandler::instance().removeException(rlvCmd.getObjectID(), rlvCmd.getBehaviourType(), idException); fRefCount = true; return RLV_RET_SUCCESS; @@ -1879,6 +1883,25 @@ ERlvCmdRet RlvBehaviourAddRemAttachHandler::onCommand(const RlvCommand& rlvCmd, return RLV_RET_SUCCESS; } +// Handles: @buy=n|y toggles +template<> template<> +void RlvBehaviourToggleHandler::onCommandToggle(ERlvBehaviour eBhvr, bool fHasBhvr) +{ + // Start or stop filtering opening the buy, buy contents and pay object floaters + if (fHasBhvr) + { + RLV_VERIFY(RlvUIEnabler::instance().addGenericFloaterFilter("buy_object", RlvStringKeys::Blocked::Generic)); + RLV_VERIFY(RlvUIEnabler::instance().addGenericFloaterFilter("buy_object_contents", RlvStringKeys::Blocked::Generic)); + RLV_VERIFY(RlvUIEnabler::instance().addGenericFloaterFilter("pay_object", RlvStringKeys::Blocked::Generic)); + } + else + { + RLV_VERIFY(RlvUIEnabler::instance().removeGenericFloaterFilter("buy_object")); + RLV_VERIFY(RlvUIEnabler::instance().removeGenericFloaterFilter("buy_object_contents")); + RLV_VERIFY(RlvUIEnabler::instance().removeGenericFloaterFilter("pay_object")); + } +} + // Handles: @detach[:]=n|y template<> template<> ERlvCmdRet RlvBehaviourHandler::onCommand(const RlvCommand& rlvCmd, bool& fRefCount) @@ -2012,9 +2035,28 @@ void RlvBehaviourToggleHandler::onCommandToggle(ERlvBehaviour eBh // Start or stop filtering opening the beacons floater if (fHasBhvr) - RlvUIEnabler::instance().addGenericFloaterFilter("beacons"); + { + RLV_VERIFY(RlvUIEnabler::instance().addGenericFloaterFilter("beacons")); + } else - RlvUIEnabler::instance().removeGenericFloaterFilter("beacons"); + { + RLV_VERIFY(RlvUIEnabler::instance().removeGenericFloaterFilter("beacons")); + } +} + +// Handles: @pay=n|y toggles +template<> template<> +void RlvBehaviourToggleHandler::onCommandToggle(ERlvBehaviour eBhvr, bool fHasBhvr) +{ + // Start or stop filtering opening the pay avatar floater + if (fHasBhvr) + { + RLV_VERIFY(RlvUIEnabler::instance().addGenericFloaterFilter("pay_resident", RlvStringKeys::Blocked::Generic)); + } + else + { + RLV_VERIFY(RlvUIEnabler::instance().removeGenericFloaterFilter("pay_resident")); + } } // Handles: @setoverlay=n|y toggles @@ -2357,11 +2399,11 @@ void RlvBehaviourToggleHandler::onCommandToggle(ERlvBehaviour e LLFloaterReg::const_instance_list_t envFloaters = LLFloaterReg::getFloaterList(strEnvFloaters[idxFloater]); for (LLFloater* pFloater : envFloaters) pFloater->closeFloater(); - RlvUIEnabler::instance().addGenericFloaterFilter(strEnvFloaters[idxFloater]); + RLV_VERIFY(RlvUIEnabler::instance().addGenericFloaterFilter(strEnvFloaters[idxFloater])); } else { - RlvUIEnabler::instance().removeGenericFloaterFilter(strEnvFloaters[idxFloater]); + RLV_VERIFY(RlvUIEnabler::instance().removeGenericFloaterFilter(strEnvFloaters[idxFloater])); } } @@ -2414,7 +2456,7 @@ ERlvCmdRet RlvBehaviourHandler::onCommand(const RlvComma template<> template<> void RlvBehaviourToggleHandler::onCommandToggle(ERlvBehaviour eBhvr, bool fHasBhvr) { - if (LLApp::isQuitting()) + if (LLApp::isExiting()) return; // Nothing to do if the viewer is shutting down // @@ -2466,13 +2508,13 @@ void RlvBehaviourToggleHandler::onCommandToggle(ERlvBehaviour // Modified for FIRE-8804 if (fHasBhvr) { - RlvUIEnabler::instance().addGenericFloaterFilter("inventory"); - RlvUIEnabler::instance().addGenericFloaterFilter("secondary_inventory"); + RLV_VERIFY(RlvUIEnabler::instance().addGenericFloaterFilter("inventory")); + RLV_VERIFY(RlvUIEnabler::instance().addGenericFloaterFilter("secondary_inventory")); } else { - RlvUIEnabler::instance().removeGenericFloaterFilter("inventory"); - RlvUIEnabler::instance().removeGenericFloaterFilter("secondary_inventory"); + RLV_VERIFY(RlvUIEnabler::instance().removeGenericFloaterFilter("inventory")); + RLV_VERIFY(RlvUIEnabler::instance().removeGenericFloaterFilter("secondary_inventory")); } } @@ -2480,7 +2522,7 @@ void RlvBehaviourToggleHandler::onCommandToggle(ERlvBehaviour template<> template<> void RlvBehaviourToggleHandler::onCommandToggle(ERlvBehaviour eBhvr, bool fHasBhvr) { - if (LLApp::isQuitting()) + if (LLApp::isExiting()) return; // Nothing to do if the viewer is shutting down // Update the shownames context @@ -2526,7 +2568,7 @@ template<> template<> ERlvCmdRet RlvBehaviourHandler::onCommand(const RlvCommand& rlvCmd, bool& fRefCount) { ERlvCmdRet eRet = RlvBehaviourGenericHandler::onCommand(rlvCmd, fRefCount); - if ( (RLV_RET_SUCCESS == eRet) && (rlvCmd.hasOption()) && (!LLApp::isQuitting()) ) + if ( (RLV_RET_SUCCESS == eRet) && (rlvCmd.hasOption()) && (!LLApp::isExiting()) ) { const LLUUID idAgent = RlvCommandOptionHelper::parseOption(rlvCmd.getOption()); @@ -2564,7 +2606,7 @@ ERlvCmdRet RlvBehaviourHandler::onCommand(const RlvCommand& template<> template<> void RlvBehaviourToggleHandler::onCommandToggle(ERlvBehaviour eBhvr, bool fHasBhvr) { - if (LLApp::isQuitting()) + if (LLApp::isExiting()) return; // Nothing to do if the viewer is shutting down // Update the shownames context @@ -2588,7 +2630,7 @@ ERlvCmdRet RlvBehaviourHandler::onCommand(const RlvComman template<> template<> void RlvBehaviourToggleHandler::onCommandToggle(ERlvBehaviour eBhvr, bool fHasBhvr) { - if (LLApp::isQuitting()) + if (LLApp::isExiting()) return; // Nothing to do if the viewer is shutting down // Refresh the nearby people list diff --git a/indra/newview/rlvhandler.h b/indra/newview/rlvhandler.h index 32eda85137..c5b20de417 100644 --- a/indra/newview/rlvhandler.h +++ b/indra/newview/rlvhandler.h @@ -77,7 +77,7 @@ public: // Returns TRUE if the specified behaviour has an added exception bool hasException(ERlvBehaviour eBhvr) const; // Returns TRUE if the specified option was added as an exception for the specified behaviour - bool isException(ERlvBehaviour eBhvr, const RlvExceptionOption& varOption, ERlvExceptionCheck typeCheck = RLV_CHECK_DEFAULT) const; + bool isException(ERlvBehaviour eBhvr, const RlvExceptionOption& varOption, ERlvExceptionCheck eCheckType = ERlvExceptionCheck::Default) const; // Returns TRUE if the specified behaviour should behave "permissive" (rather than "strict"/"secure") bool isPermissive(ERlvBehaviour eBhvr) const; @@ -235,6 +235,18 @@ public: typedef std::map rlv_object_map_t; typedef std::tuple rlv_blocked_object_t; typedef std::list rlv_blocked_object_list_t; + + struct RlvException + { + public: + LLUUID idObject; // UUID of the object that added the exception + ERlvBehaviour eBehaviour; // Behaviour the exception applies to + RlvExceptionOption varOption; // Exception data (type is dependent on eBehaviour) + + RlvException(const LLUUID& idObj, ERlvBehaviour eBhvr, const RlvExceptionOption& option) : idObject(idObj), eBehaviour(eBhvr), varOption(option) {} + private: + RlvException(); + }; typedef std::multimap rlv_exception_map_t; protected: rlv_object_map_t m_Objects; // Map of objects that have active restrictions (idObj -> RlvObject) diff --git a/indra/newview/rlvhelper.cpp b/indra/newview/rlvhelper.cpp index 71c4bd3720..e333350d68 100644 --- a/indra/newview/rlvhelper.cpp +++ b/indra/newview/rlvhelper.cpp @@ -1,6 +1,6 @@ /** * - * Copyright (c) 2009-2016, Kitty Barnett + * Copyright (c) 2009-2020, Kitty Barnett * * The source code in this file is provided to you under the terms of the * GNU Lesser General Public License, version 2.1, but WITHOUT ANY WARRANTY; @@ -93,6 +93,7 @@ RlvBehaviourDictionary::RlvBehaviourDictionary() addEntry(new RlvBehaviourInfo("attachallthis", RLV_BHVR_ATTACHTHIS, RLV_TYPE_ADDREM, RlvBehaviourInfo::FORCEWEAR_SUBTREE)); addEntry(new RlvBehaviourInfo("attachthis_except", RLV_BHVR_ATTACHTHISEXCEPT, RLV_TYPE_ADDREM, RlvBehaviourInfo::FORCEWEAR_NODE)); addEntry(new RlvBehaviourInfo("attachallthis_except", RLV_BHVR_ATTACHTHISEXCEPT, RLV_TYPE_ADDREM, RlvBehaviourInfo::FORCEWEAR_SUBTREE)); + addEntry(new RlvBehaviourGenericToggleProcessor("buy")); addEntry(new RlvBehaviourGenericProcessor("chatwhisper", RLV_BHVR_CHATWHISPER)); addEntry(new RlvBehaviourGenericProcessor("chatnormal", RLV_BHVR_CHATNORMAL)); addEntry(new RlvBehaviourGenericProcessor("chatshout", RLV_BHVR_CHATSHOUT)); @@ -110,6 +111,7 @@ RlvBehaviourDictionary::RlvBehaviourDictionary() addEntry(new RlvBehaviourGenericProcessor("interact", RLV_BHVR_INTERACT, RlvBehaviourInfo::BHVR_EXTENDED)); addEntry(new RlvBehaviourGenericProcessor("jump", RLV_BHVR_JUMP)); addEntry(new RlvBehaviourInfo("notify", RLV_BHVR_NOTIFY, RLV_TYPE_ADDREM)); + addEntry(new RlvBehaviourGenericToggleProcessor("pay")); addEntry(new RlvBehaviourGenericProcessor("permissive", RLV_BHVR_PERMISSIVE)); addEntry(new RlvBehaviourGenericProcessor("recvchat", RLV_BHVR_RECVCHAT, RlvBehaviourInfo::BHVR_STRICT)); addEntry(new RlvBehaviourGenericProcessor("recvchatfrom", RLV_BHVR_RECVCHATFROM, RlvBehaviourInfo::BHVR_STRICT)); diff --git a/indra/newview/rlvhelper.h b/indra/newview/rlvhelper.h index 9c8d015f76..68a41615d7 100644 --- a/indra/newview/rlvhelper.h +++ b/indra/newview/rlvhelper.h @@ -619,21 +619,6 @@ protected: boost::signals2::connection m_ConnCommand; }; -// ============================================================================ -// RlvException -// - -struct RlvException -{ -public: - LLUUID idObject; // UUID of the object that added the exception - ERlvBehaviour eBehaviour; // Behaviour the exception applies to - RlvExceptionOption varOption; // Exception data (type is dependent on eBehaviour) - - RlvException(const LLUUID& idObj, ERlvBehaviour eBhvr, const RlvExceptionOption& option) : idObject(idObj), eBehaviour(eBhvr), varOption(option) {} -private: - RlvException(); -}; // ============================================================================ // Various helper classes/timers/functors diff --git a/indra/newview/rlvinventory.cpp b/indra/newview/rlvinventory.cpp index 0f6c108f79..01915a7dd9 100644 --- a/indra/newview/rlvinventory.cpp +++ b/indra/newview/rlvinventory.cpp @@ -1,17 +1,17 @@ -/** +/** * - * Copyright (c) 2009-2014, Kitty Barnett - * - * The source code in this file is provided to you under the terms of the + * Copyright (c) 2009-2020, Kitty Barnett + * + * The source code in this file is provided to you under the terms of the * GNU Lesser General Public License, version 2.1, but WITHOUT ANY WARRANTY; - * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A - * PARTICULAR PURPOSE. Terms of the LGPL can be found in doc/LGPL-licence.txt + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A + * PARTICULAR PURPOSE. Terms of the LGPL can be found in doc/LGPL-licence.txt * in this distribution, or online at http://www.gnu.org/licenses/lgpl-2.1.txt - * + * * By copying, modifying or distributing this software, you acknowledge that - * you have read and understood your obligations described above, and agree to + * you have read and understood your obligations described above, and agree to * abide by those obligations. - * + * */ #include "llviewerprecompiledheaders.h" @@ -630,26 +630,18 @@ void RlvGiveToRLVOffer::moveAndRename(const LLUUID& idFolder, const LLUUID& idDe void RlvGiveToRLVTaskOffer::changed(U32 mask) { - if (mask & LLInventoryObserver::ADD) - { - LLMessageSystem* pMsg = gMessageSystem; - if ( (pMsg->getMessageName()) && (0 == strcmp(pMsg->getMessageName(), "BulkUpdateInventory")) ) - { - LLUUID idTransaction; - pMsg->getUUIDFast(_PREHASH_AgentData, _PREHASH_TransactionID, idTransaction); - if (m_idTransaction == idTransaction) + if ( (mask & LLInventoryObserver::ADD) && (gInventory.getTransactionId().notNull()) && (m_idTransaction == gInventory.getTransactionId()) ) + { // BulkUpdateInventory + const auto& idItems = gInventory.getAddedIDs(); + for (const LLUUID& idItem : idItems) + { + if (LLInventoryCategory* pCategory = gInventory.getCategory(idItem)) { - LLUUID idInvObject; - for (S32 idxBlock = 0, cntBlock = pMsg->getNumberOfBlocksFast(_PREHASH_FolderData); idxBlock < cntBlock; idxBlock++) - { - pMsg->getUUIDFast(_PREHASH_FolderData, _PREHASH_FolderID, idInvObject, idxBlock); - if ( (idInvObject.notNull()) && (std::find(m_Folders.begin(), m_Folders.end(), idInvObject) == m_Folders.end()) ) - m_Folders.push_back(idInvObject); - } - - done(); + if (std::find(m_Folders.begin(), m_Folders.end(), pCategory->getUUID()) == m_Folders.end()) + m_Folders.push_back(pCategory->getUUID()); } } + done(); } } diff --git a/indra/newview/rlvinventory.h b/indra/newview/rlvinventory.h index 570cafc1a3..482a308392 100644 --- a/indra/newview/rlvinventory.h +++ b/indra/newview/rlvinventory.h @@ -1,17 +1,17 @@ -/** +/** * - * Copyright (c) 2009-2014, Kitty Barnett - * - * The source code in this file is provided to you under the terms of the + * Copyright (c) 2009-2020, Kitty Barnett + * + * The source code in this file is provided to you under the terms of the * GNU Lesser General Public License, version 2.1, but WITHOUT ANY WARRANTY; - * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A - * PARTICULAR PURPOSE. Terms of the LGPL can be found in doc/LGPL-licence.txt + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A + * PARTICULAR PURPOSE. Terms of the LGPL can be found in doc/LGPL-licence.txt * in this distribution, or online at http://www.gnu.org/licenses/lgpl-2.1.txt - * + * * By copying, modifying or distributing this software, you acknowledge that - * you have read and understood your obligations described above, and agree to + * you have read and understood your obligations described above, and agree to * abide by those obligations. - * + * */ #ifndef RLV_INVENTORY_H diff --git a/indra/newview/rlvlocks.cpp b/indra/newview/rlvlocks.cpp index 8b09fd3e35..97b4d1afdc 100644 --- a/indra/newview/rlvlocks.cpp +++ b/indra/newview/rlvlocks.cpp @@ -628,7 +628,7 @@ void RlvAttachmentLockWatchdog::onAttach(const LLViewerObject* pAttachObj, const if ( (pAttachObj != *itAttachObj) && (gRlvAttachmentLocks.isLockedAttachment(*itAttachObj)) ) { // Fail if we encounter a non-detachable attachment (unless we're only replacing detachable attachments) - if (gSavedSettings.getBOOL("RLVaWearReplaceUnlocked")) + if (gSavedSettings.get(RlvSettingNames::WearReplaceUnlocked)) idsAttachObjExcept.push_back((*itAttachObj)->getID()); else fAttachAllowed = false; diff --git a/indra/newview/rlvui.cpp b/indra/newview/rlvui.cpp index 575a32677e..bed79ce4a1 100644 --- a/indra/newview/rlvui.cpp +++ b/indra/newview/rlvui.cpp @@ -76,7 +76,7 @@ RlvUIEnabler::RlvUIEnabler() // Checked: 2010-02-28 (RLVa-1.4.0a) | Added: RLVa-1.2.0a void RlvUIEnabler::onBehaviourToggle(ERlvBehaviour eBhvr, ERlvParamType eType) { - bool fQuitting = LLApp::isQuitting(); + bool fQuitting = LLApp::isExiting(); for (behaviour_handler_map_t::const_iterator itHandler = m_Handlers.lower_bound(eBhvr), endHandler = m_Handlers.upper_bound(eBhvr); itHandler != endHandler; ++itHandler) { @@ -181,9 +181,13 @@ void RlvUIEnabler::onToggleShowMinimap() // Start or stop filtering showing the mini-map floater if (!fEnable) - addGenericFloaterFilter("mini_map"); + { + RLV_VERIFY(addGenericFloaterFilter("mini_map")); + } else - removeGenericFloaterFilter("mini_map"); + { + RLV_VERIFY(removeGenericFloaterFilter("mini_map")); + } // Hide the mini-map floater if it's currently visible (or restore it if it was previously visible) static bool fPrevVisibile = false; @@ -228,9 +232,13 @@ void RlvUIEnabler::onToggleShowWorldMap() // Start or stop filtering opening the world map if (!fEnable) - addGenericFloaterFilter("world_map"); + { + RLV_VERIFY(addGenericFloaterFilter("world_map")); + } else - removeGenericFloaterFilter("world_map"); + { + RLV_VERIFY(removeGenericFloaterFilter("world_map")); + } } // Checked: 2010-08-22 (RLVa-1.2.1a) | Added: RLVa-1.2.1a @@ -285,31 +293,57 @@ void RlvUIEnabler::onUpdateLoginLastLocation(bool fQuitting) // ============================================================================ -// Checked: 2010-02-28 (RLVa-1.4.0a) | Added: RLVa-1.2.0a -void RlvUIEnabler::addGenericFloaterFilter(const std::string& strFloaterName) +#ifdef CATZNIP_STRINGVIEW +bool RlvUIEnabler::addGenericFloaterFilter(const std::string& strFloaterName, const boost::string_view& strRlvNotification) +#else +bool RlvUIEnabler::addGenericFloaterFilter(const std::string& strFloaterName, const std::string& strRlvNotification) +#endif // CATZNIP_STRINGVIEW { - m_FilteredFloaters.insert(strFloaterName); + return addGenericFloaterFilter(strFloaterName, [strRlvNotification]() { RlvUtil::notifyBlocked(strRlvNotification); }); +} + +bool RlvUIEnabler::addGenericFloaterFilter(const std::string& strFloaterName, const std::function& fn) +{ + // NOTE: we don't currently support multiple filters for the same floater (due to the need to remove the correct one at the end of it all) + if (m_FilteredFloaterMap.end() != m_FilteredFloaterMap.find(strFloaterName)) + return false; + + m_FilteredFloaterMap.insert(std::make_pair(strFloaterName, fn)); if (!m_ConnFloaterGeneric.connected()) + { m_ConnFloaterGeneric = LLFloaterReg::setValidateCallback(boost::bind(&RlvUIEnabler::filterFloaterGeneric, this, _1, _2)); + } + + return true; } -// Checked: 2010-02-28 (RLVa-1.4.0a) | Added: RLVa-1.2.0a -void RlvUIEnabler::removeGenericFloaterFilter(const std::string& strFloaterName) +bool RlvUIEnabler::removeGenericFloaterFilter(const std::string& strFloaterName) { - std::multiset::iterator itFloater = m_FilteredFloaters.find(strFloaterName); - RLV_ASSERT_DBG(itFloater != m_FilteredFloaters.end()); - m_FilteredFloaters.erase(itFloater); + auto itFloater = m_FilteredFloaterMap.find(strFloaterName); + if (m_FilteredFloaterMap.end() == itFloater) + return false; + + m_FilteredFloaterMap.erase(itFloater); RLV_ASSERT_DBG(m_ConnFloaterGeneric.connected()); - if (m_FilteredFloaters.empty()) + if (m_FilteredFloaterMap.empty()) m_ConnFloaterGeneric.disconnect(); + + return true; } -// Checked: 2010-02-28 (RLVa-1.4.0a) | Added: RLVa-1.2.0a -bool RlvUIEnabler::filterFloaterGeneric(const std::string& strName, const LLSD&) +bool RlvUIEnabler::filterFloaterGeneric(const std::string& strFloaterName, const LLSD&) { - return m_FilteredFloaters.end() == m_FilteredFloaters.find(strName); + auto itFloater = m_FilteredFloaterMap.find(strFloaterName); + if (m_FilteredFloaterMap.end() != itFloater) + { + if (itFloater->second) + itFloater->second(); + return false; + } + return true; + } // Checked: 2010-04-22 (RLVa-1.4.5) | Added: RLVa-1.2.0 diff --git a/indra/newview/rlvui.h b/indra/newview/rlvui.h index fc6d0ce477..2b3a0bf9ab 100644 --- a/indra/newview/rlvui.h +++ b/indra/newview/rlvui.h @@ -57,8 +57,13 @@ protected: * Floater and sidebar validation callbacks */ public: - void addGenericFloaterFilter(const std::string& strFloaterName); - void removeGenericFloaterFilter(const std::string& strFloaterName); +#ifdef CATZNIP_STRINGVIEW + bool addGenericFloaterFilter(const std::string& strFloaterName, const boost::string_view& strRlvNotification); +#else + bool addGenericFloaterFilter(const std::string& strFloaterName, const std::string& strRlvNotification); +#endif // CATZNIP_STRINGVIEW + bool addGenericFloaterFilter(const std::string& strFloaterName, const std::function& fn = nullptr); + bool removeGenericFloaterFilter(const std::string& strFloaterName); protected: bool filterFloaterGeneric(const std::string&, const LLSD&); @@ -88,7 +93,7 @@ protected: typedef std::multimap behaviour_handler_map_t; behaviour_handler_map_t m_Handlers; - std::multiset m_FilteredFloaters; + std::map> m_FilteredFloaterMap; }; // ============================================================================ diff --git a/indra/newview/skins/ansastorm/xui/de/panel_main_inventory.xml b/indra/newview/skins/ansastorm/xui/de/panel_main_inventory.xml index 1d9d75c805..cda2003bd7 100644 --- a/indra/newview/skins/ansastorm/xui/de/panel_main_inventory.xml +++ b/indra/newview/skins/ansastorm/xui/de/panel_main_inventory.xml @@ -99,7 +99,7 @@ - + diff --git a/indra/newview/skins/default/xui/da/floater_buy_currency.xml b/indra/newview/skins/default/xui/da/floater_buy_currency.xml index 3c0428b2b0..b7ac181dd4 100644 --- a/indra/newview/skins/default/xui/da/floater_buy_currency.xml +++ b/indra/newview/skins/default/xui/da/floater_buy_currency.xml @@ -60,8 +60,7 @@ objektet.