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
name
darwin
@@ -60,9 +60,9 @@
archive
name
linux64
@@ -292,9 +292,9 @@
archive
name
darwin64
@@ -328,9 +328,9 @@
archive
name
windows
@@ -340,16 +340,16 @@
archive
name
windows64
version
- 1.4.5.539073
+ 1.4.5.548882
boost
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(" LLSD/Binary ?>");
+ std::string deprecated_header(" LLSD/Binary ?>");
- 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.
-
+
Kan ikke købe
-
-
+
diff --git a/indra/newview/skins/default/xui/da/floater_texture_ctrl.xml b/indra/newview/skins/default/xui/da/floater_texture_ctrl.xml
index 9e3c0c6d1d..7a1cb1c294 100644
--- a/indra/newview/skins/default/xui/da/floater_texture_ctrl.xml
+++ b/indra/newview/skins/default/xui/da/floater_texture_ctrl.xml
@@ -6,7 +6,7 @@
Flere teksturer
-
+
Størrelse:
[DIMENSIONS]
diff --git a/indra/newview/skins/default/xui/de/floater_buy_currency.xml b/indra/newview/skins/default/xui/de/floater_buy_currency.xml
index 65926c088c..eb94df1cad 100644
--- a/indra/newview/skins/default/xui/de/floater_buy_currency.xml
+++ b/indra/newview/skins/default/xui/de/floater_buy_currency.xml
@@ -59,8 +59,7 @@
-
+
Kaufabbruch
-
-
+
diff --git a/indra/newview/skins/default/xui/de/floater_texture_ctrl.xml b/indra/newview/skins/default/xui/de/floater_texture_ctrl.xml
index 1d89785c58..7c63e05550 100644
--- a/indra/newview/skins/default/xui/de/floater_texture_ctrl.xml
+++ b/indra/newview/skins/default/xui/de/floater_texture_ctrl.xml
@@ -9,12 +9,12 @@
Mehrere Texturen
-
-
-
-
-
-
+
+
+
+
+
+
Größe:
[DIMENSIONS]
diff --git a/indra/newview/skins/default/xui/de/menu_script_chiclet.xml b/indra/newview/skins/default/xui/de/menu_script_chiclet.xml
index 3256aa1a87..97587d6413 100644
--- a/indra/newview/skins/default/xui/de/menu_script_chiclet.xml
+++ b/indra/newview/skins/default/xui/de/menu_script_chiclet.xml
@@ -1,4 +1,5 @@
diff --git a/indra/newview/skins/default/xui/de/menu_viewer.xml b/indra/newview/skins/default/xui/de/menu_viewer.xml
index a0e555720f..4fb611dcfa 100644
--- a/indra/newview/skins/default/xui/de/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/de/menu_viewer.xml
@@ -252,6 +252,7 @@
+
diff --git a/indra/newview/skins/default/xui/de/notifications.xml b/indra/newview/skins/default/xui/de/notifications.xml
index df69a6c32b..663c645aa0 100644
--- a/indra/newview/skins/default/xui/de/notifications.xml
+++ b/indra/newview/skins/default/xui/de/notifications.xml
@@ -1523,6 +1523,11 @@ Sie können sich später noch umentscheiden.
Konnte nicht zu [SLURL] teleportieren, da dieser Standort sich auf einem anderen Grid ([GRID]) befindet. Sie befinden sich im Moment auf dem Grid ([CURRENT_GRID]). Bitte schließen Sie Ihren Viewer und versuchen Sie es erneut.
+
+ Keine Verbindung zum Server möglich.
+[REASON]
+
+
Eine Verbindung zum Server konnte nicht hergestellt werden.
[REASON]
diff --git a/indra/newview/skins/default/xui/de/panel_main_inventory.xml b/indra/newview/skins/default/xui/de/panel_main_inventory.xml
index 081db49dad..d8990fe940 100644
--- a/indra/newview/skins/default/xui/de/panel_main_inventory.xml
+++ b/indra/newview/skins/default/xui/de/panel_main_inventory.xml
@@ -34,7 +34,7 @@
-
+
diff --git a/indra/newview/skins/default/xui/de/panel_preferences_crashreports.xml b/indra/newview/skins/default/xui/de/panel_preferences_crashreports.xml
index 8269fd66e2..6ad598117b 100644
--- a/indra/newview/skins/default/xui/de/panel_preferences_crashreports.xml
+++ b/indra/newview/skins/default/xui/de/panel_preferences_crashreports.xml
@@ -2,7 +2,7 @@
-
+
(enthält Benutzername)
diff --git a/indra/newview/skins/default/xui/de/strings.xml b/indra/newview/skins/default/xui/de/strings.xml
index 0f5dfc21f8..e849caacea 100644
--- a/indra/newview/skins/default/xui/de/strings.xml
+++ b/indra/newview/skins/default/xui/de/strings.xml
@@ -42,7 +42,7 @@
Build-Konfiguration [BUILD_CONFIG]
- Sie befinden sich an [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1] in [REGION] auf <nolink>[HOSTNAME]</nolink> ([HOSTIP])
+ Sie befinden sich an [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1] in [REGION] auf <nolink>[HOSTNAME]</nolink>
SLURL: <nolink>[SLURL]</nolink>
(globale Koordinaten [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1])
[SERVER_VERSION]
@@ -195,9 +195,15 @@ Voice-Serverversion: [VOICE_VERSION]
In der Zertifikatskette des Servers befanden sich zu viele Zertifikate. Bitte kontaktieren Sie Ihren Grid-Administrator.
+
+ Das Zertifikat konnte nicht geladen werden. Bitte kontaktieren Sie Ihren Grid-Administrator.
+
Die Zertifikatsunterschrift des Gridservers konnte nicht bestätigt werden. Bitte kontaktieren Sie Ihren Grid-Administrator.
+
+ Fehler beim Allokieren von Speicher für OpenSSL zum Laden des Zertifikats.
+
Netzwerkfehler: Verbindung konnte nicht hergestellt werden. Bitte überprüfen Sie Ihre Netzwerkverbindung.
diff --git a/indra/newview/skins/default/xui/en/floater_buy_currency.xml b/indra/newview/skins/default/xui/en/floater_buy_currency.xml
index 47a119e97a..f804d6640c 100644
--- a/indra/newview/skins/default/xui/en/floater_buy_currency.xml
+++ b/indra/newview/skins/default/xui/en/floater_buy_currency.xml
@@ -13,6 +13,10 @@
name="buy_currency">
Buy L$ [LINDENS] for approx. [LOCALAMOUNT]
+
+ Unable to Buy
+
-
-
- Unable to Buy
-
-
-
-
diff --git a/indra/newview/skins/default/xui/en/floater_image_preview.xml b/indra/newview/skins/default/xui/en/floater_image_preview.xml
index 3d98b279f5..d7d4aa91cc 100644
--- a/indra/newview/skins/default/xui/en/floater_image_preview.xml
+++ b/indra/newview/skins/default/xui/en/floater_image_preview.xml
@@ -120,8 +120,8 @@
Try saving image as 24 bit Targa (.tga).
diff --git a/indra/newview/skins/default/xui/en/floater_texture_ctrl.xml b/indra/newview/skins/default/xui/en/floater_texture_ctrl.xml
index fa012f1ea7..8a734faac0 100644
--- a/indra/newview/skins/default/xui/en/floater_texture_ctrl.xml
+++ b/indra/newview/skins/default/xui/en/floater_texture_ctrl.xml
@@ -48,42 +48,27 @@
-
-
+
-
+
-
+
-
+ value="2" />
+
Size:
[DIMENSIONS]
@@ -349,7 +334,7 @@
label="OK"
label_selected="OK"
layout="topleft"
- left="95"
+ left="176"
top="-30"
name="Select"
width="100" />
@@ -372,5 +357,5 @@
left="5"
name="apply_immediate_check"
top_delta="0"
- width="120" />
+ width="150" />
diff --git a/indra/newview/skins/default/xui/en/fonts.xml b/indra/newview/skins/default/xui/en/fonts.xml
index 7c89da320b..07deb458d3 100644
--- a/indra/newview/skins/default/xui/en/fonts.xml
+++ b/indra/newview/skins/default/xui/en/fonts.xml
@@ -12,6 +12,7 @@
ArialUni.ttf
msyh.ttc
Cambria.ttc
+ micross.ttf
ヒラギノ角ゴシック W3.ttc
@@ -25,6 +26,7 @@
华文细黑.ttf
PingFang.ttc
STIXGeneral.otf
+ Thonburi.ttc
diff --git a/indra/newview/skins/default/xui/en/menu_avatar_icon.xml b/indra/newview/skins/default/xui/en/menu_avatar_icon.xml
index 5d2be22297..edc8b22199 100644
--- a/indra/newview/skins/default/xui/en/menu_avatar_icon.xml
+++ b/indra/newview/skins/default/xui/en/menu_avatar_icon.xml
@@ -115,6 +115,7 @@
layout="topleft"
name="Pay">
+
+
-
+
+
+
+
+
diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml
index 1581cee980..3dae878da6 100644
--- a/indra/newview/skins/default/xui/en/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/en/menu_viewer.xml
@@ -2394,6 +2394,16 @@
function="ToggleControl"
parameter="RestrainedLoveShowEllipsis" />
+
+
+
+
diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml
index 4b4cb7ff3c..76eea3d753 100644
--- a/indra/newview/skins/default/xui/en/notifications.xml
+++ b/indra/newview/skins/default/xui/en/notifications.xml
@@ -1342,6 +1342,18 @@ There was a problem uploading a report screenshot due to the following reason: [
You must agree to the Terms and Conditions, Privacy Policy, and Terms of Service to continue logging into [CURRENT_GRID].
+
+[TITLE]
+[MESSAGE]
+ fail
+
+
+
+
+Could not connect to the server.
+[REASON]
+ fail
+
+
+
diff --git a/indra/newview/skins/default/xui/en/panel_outfits_inventory.xml b/indra/newview/skins/default/xui/en/panel_outfits_inventory.xml
index 024171ecde..f889a785ac 100644
--- a/indra/newview/skins/default/xui/en/panel_outfits_inventory.xml
+++ b/indra/newview/skins/default/xui/en/panel_outfits_inventory.xml
@@ -32,7 +32,6 @@
name="appearance_tabs"
tab_position="top"
halign="center"
- hide_scroll_arrows="true"
top="8"
right="-1">
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml
index 0d353be18a..4a590ce130 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml
@@ -95,7 +95,7 @@
top_pad="3"
width="350" />
top="5"
follows="left|top|right"
layout="topleft"
- width="303"
+ width="307"
height="33"
name="panel_currentlook"
>
@@ -118,14 +118,14 @@ width="333">
name="Filter"
search_button_visible="true"
top_pad="10"
- width="303" />
+ width="307" />
Build Configuration [BUILD_CONFIG]
-You are at [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1] in [REGION] located at <nolink>[HOSTNAME]</nolink> ([HOSTIP])
+You are at [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1] in [REGION] located at <nolink>[HOSTNAME]</nolink>
SLURL: <nolink>[SLURL]</nolink>
(global coordinates [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1])
[SERVER_VERSION]
@@ -124,7 +124,9 @@ Voice Server Version: [VOICE_VERSION]
The certificate returned by the Grid appears to be expired. Please check your system clock, or contact your Grid administrator.
The certificate returned by the server could not be used for SSL. Please contact your Grid administrator.
Too many certificates were in the servers Certificate chain. Please contact your Grid administrator.
+ Could not load certificate. Please contact your Grid administrator.
The certificate signature returned by the Grid server could not be verified. Please contact your Grid administrator.
+ Failed to allocate openssl memory for certificate.
Network error: Could not establish connection, please check your network connection.
Login failed.
diff --git a/indra/newview/skins/default/xui/es/floater_buy_currency.xml b/indra/newview/skins/default/xui/es/floater_buy_currency.xml
index dbff3fcf0e..086150dd57 100644
--- a/indra/newview/skins/default/xui/es/floater_buy_currency.xml
+++ b/indra/newview/skins/default/xui/es/floater_buy_currency.xml
@@ -60,8 +60,7 @@ no el objeto.
-
+
No se pudo hacer la compra
-
-
+
diff --git a/indra/newview/skins/default/xui/es/floater_texture_ctrl.xml b/indra/newview/skins/default/xui/es/floater_texture_ctrl.xml
index 791bdb9197..8ebe4f2784 100644
--- a/indra/newview/skins/default/xui/es/floater_texture_ctrl.xml
+++ b/indra/newview/skins/default/xui/es/floater_texture_ctrl.xml
@@ -9,12 +9,12 @@
Texturas múltiples
-
-
-
-
-
-
+
+
+
+
+
+
Tamaño:
[DIMENSIONS]
diff --git a/indra/newview/skins/default/xui/es/strings.xml b/indra/newview/skins/default/xui/es/strings.xml
index 31d56eb862..3f6282cc6e 100644
--- a/indra/newview/skins/default/xui/es/strings.xml
+++ b/indra/newview/skins/default/xui/es/strings.xml
@@ -44,7 +44,7 @@
Compilado con [COMPILER], versión [COMPILER_VERSION]
- Estás en la posición [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1], de [REGION], alojada en <nolink>[HOSTNAME]</nolink> ([HOSTIP])
+ Estás en la posición [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1], de [REGION], alojada en <nolink>[HOSTNAME]</nolink>
SLURL: <nolink>[SLURL]</nolink>
(coordenadas globales [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1])
[SERVER_VERSION]
diff --git a/indra/newview/skins/default/xui/fr/floater_buy_currency.xml b/indra/newview/skins/default/xui/fr/floater_buy_currency.xml
index c295172abf..55b0d1825a 100644
--- a/indra/newview/skins/default/xui/fr/floater_buy_currency.xml
+++ b/indra/newview/skins/default/xui/fr/floater_buy_currency.xml
@@ -60,8 +60,7 @@ le Lindex...
-
+
Achat impossible
-
-
+
diff --git a/indra/newview/skins/default/xui/fr/floater_phototools.xml b/indra/newview/skins/default/xui/fr/floater_phototools.xml
index 460b5ab734..fde691f09f 100644
--- a/indra/newview/skins/default/xui/fr/floater_phototools.xml
+++ b/indra/newview/skins/default/xui/fr/floater_phototools.xml
@@ -99,7 +99,7 @@
-
+
@@ -115,24 +115,24 @@
- Rés. Omb.
+ Résolution
- Clarté Omb.
+ Clarté
- Flou Omb.
+ Flou
- Adouc. Omb.
+ Adoucir.
@@ -147,7 +147,7 @@
- Bias. Omb.
+ Bias.
@@ -159,7 +159,7 @@
-
+
@@ -169,7 +169,7 @@
- Échelle max.
+ Éch. max.
@@ -207,7 +207,7 @@
- Angle de vue
+ Ang. de vue
@@ -319,7 +319,7 @@
- Nb Particules
+ Nb Part.
@@ -329,7 +329,7 @@
- Qual. Terrain
+ Qual. Terr.
@@ -356,11 +356,11 @@
- Vig. Quantité
+ Vig. Quant.
- Vig. Puissance
+ Vig. Puiss.
@@ -372,9 +372,9 @@
-
+
-
+
@@ -476,7 +476,7 @@
- Gauche/Droite
+ Gauche/Dte
@@ -493,7 +493,7 @@
- Avant/Arrière
+ Avant/Arr.
@@ -503,7 +503,7 @@
- Balancement
+ Balance
@@ -574,7 +574,7 @@
- Sensibilité de la souris
+ Sensibilité
diff --git a/indra/newview/skins/default/xui/fr/floater_texture_ctrl.xml b/indra/newview/skins/default/xui/fr/floater_texture_ctrl.xml
index ee58eacbf0..25e6b5697c 100644
--- a/indra/newview/skins/default/xui/fr/floater_texture_ctrl.xml
+++ b/indra/newview/skins/default/xui/fr/floater_texture_ctrl.xml
@@ -9,14 +9,13 @@
Textures multiples
-
-
-
-
-
-
- Taille:
-[DIMENSIONS]
+
+
+
+
+
+
+ Taille: [DIMENSIONS]
@@ -49,5 +48,5 @@
-
+
diff --git a/indra/newview/skins/default/xui/fr/panel_outfit_edit.xml b/indra/newview/skins/default/xui/fr/panel_outfit_edit.xml
index 23b3caba2d..f91347d453 100644
--- a/indra/newview/skins/default/xui/fr/panel_outfit_edit.xml
+++ b/indra/newview/skins/default/xui/fr/panel_outfit_edit.xml
@@ -5,6 +5,19 @@
(NA)
(inconnu)
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -21,9 +34,11 @@
+ Complexité : [WEIGHT]
+ Complexité : [WEIGHT]
diff --git a/indra/newview/skins/default/xui/fr/panel_outfit_gallery.xml b/indra/newview/skins/default/xui/fr/panel_outfit_gallery.xml
new file mode 100644
index 0000000000..3407498b6a
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/panel_outfit_gallery.xml
@@ -0,0 +1,25 @@
+
+
+
+ Photo de la tenue "[OUTFIT_NAME]"
+
+
+ Vous n'avez pas encore de tenues. Essayez [secondlife:///app/search/all/ la recherche].
+
+
+ Vous n'avez pas trouvé ce que vous cherchiez ? Essayez le [secondlife:///app/search/all/[SEARCH_TERM] la recherche].
+
+
+ Recherche...
+
+
+
+
+ [COUNT] tenues
+
+
+ Complexité : [WEIGHT]
+
+
+
+
diff --git a/indra/newview/skins/default/xui/fr/panel_outfit_gallery_item.xml b/indra/newview/skins/default/xui/fr/panel_outfit_gallery_item.xml
new file mode 100644
index 0000000000..6ff4bb219e
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/panel_outfit_gallery_item.xml
@@ -0,0 +1,14 @@
+
+
+
+ (porté)
+
+
+
+ Summer hipster, Pierce Pierce Pierce Pierce
+
+
+ (porté)
+
+
+
diff --git a/indra/newview/skins/default/xui/fr/panel_outfit_snapshot_inventory.xml b/indra/newview/skins/default/xui/fr/panel_outfit_snapshot_inventory.xml
new file mode 100644
index 0000000000..75ce125992
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/panel_outfit_snapshot_inventory.xml
@@ -0,0 +1,12 @@
+
+
+
+ Inventaire
+
+
+ Le téléchargement d'une image dans votre inventaire coûte L$[UPLOAD_COST].
+Les frais sont fonction de votre niveau d'abonnement. Les niveaux supérieurs sont soumis à des frais moins élevés.
+
+
+
+
\ No newline at end of file
diff --git a/indra/newview/skins/default/xui/fr/panel_outfits_inventory.xml b/indra/newview/skins/default/xui/fr/panel_outfits_inventory.xml
index 096b88af5d..718c1a081e 100644
--- a/indra/newview/skins/default/xui/fr/panel_outfits_inventory.xml
+++ b/indra/newview/skins/default/xui/fr/panel_outfits_inventory.xml
@@ -2,6 +2,7 @@
Porter la tenue sélectionnée
Porter les objets sélectionnés
+ Portés ([COUNT]/[MAX] Att.)
diff --git a/indra/newview/skins/default/xui/fr/panel_outfits_list.xml b/indra/newview/skins/default/xui/fr/panel_outfits_list.xml
index 7e2a235829..dc7253e5c4 100644
--- a/indra/newview/skins/default/xui/fr/panel_outfits_list.xml
+++ b/indra/newview/skins/default/xui/fr/panel_outfits_list.xml
@@ -6,7 +6,8 @@
- [COUNT] Tenues
+ [COUNT] tenues
+ Complexité : [WEIGHT]
diff --git a/indra/newview/skins/default/xui/fr/panel_outfits_wearing.xml b/indra/newview/skins/default/xui/fr/panel_outfits_wearing.xml
index 1752f9dfdf..c33c0c5718 100644
--- a/indra/newview/skins/default/xui/fr/panel_outfits_wearing.xml
+++ b/indra/newview/skins/default/xui/fr/panel_outfits_wearing.xml
@@ -1,13 +1,14 @@
- Aucun élément attaché porté.
+ Aucun élément porté.
-
-
+
+
+ Complexité: [WEIGHT]
diff --git a/indra/newview/skins/default/xui/fr/strings.xml b/indra/newview/skins/default/xui/fr/strings.xml
index f964c6277b..322c131f35 100644
--- a/indra/newview/skins/default/xui/fr/strings.xml
+++ b/indra/newview/skins/default/xui/fr/strings.xml
@@ -36,7 +36,7 @@
Compilé avec [COMPILER] version [COMPILER_VERSION]
- Vous êtes à [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1] dans [REGION], se trouvant à <nolink>[HOSTNAME]</nolink> ([HOSTIP])
+ Vous êtes à [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1] dans [REGION], se trouvant à <nolink>[HOSTNAME]</nolink>
SLURL : <nolink>[SLURL]</nolink>
(coordonnées globales [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1])
[SERVER_VERSION]
diff --git a/indra/newview/skins/default/xui/it/floater_texture_ctrl.xml b/indra/newview/skins/default/xui/it/floater_texture_ctrl.xml
index 5f44a1448b..d03e88e738 100644
--- a/indra/newview/skins/default/xui/it/floater_texture_ctrl.xml
+++ b/indra/newview/skins/default/xui/it/floater_texture_ctrl.xml
@@ -9,12 +9,12 @@
Texture multiple
-
-
-
-
-
-
+
+
+
+
+
+
Dimensioni:
[DIMENSIONS]
diff --git a/indra/newview/skins/default/xui/it/strings.xml b/indra/newview/skins/default/xui/it/strings.xml
index 0f65812e26..ff860431b8 100644
--- a/indra/newview/skins/default/xui/it/strings.xml
+++ b/indra/newview/skins/default/xui/it/strings.xml
@@ -31,7 +31,7 @@
Configurazione build [BUILD_CONFIG]
- Tu sei a [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1] in [REGION] che si trova su <nolink>[HOSTNAME]</nolink> ([HOSTIP])
+ Tu sei a [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1] in [REGION] che si trova su <nolink>[HOSTNAME]</nolink>
SLURL: <nolink>[SLURL]</nolink>
(coordinate globali [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1])
[SERVER_VERSION]
diff --git a/indra/newview/skins/default/xui/ja/floater_buy_currency.xml b/indra/newview/skins/default/xui/ja/floater_buy_currency.xml
index a472f163e3..ac2db917cc 100644
--- a/indra/newview/skins/default/xui/ja/floater_buy_currency.xml
+++ b/indra/newview/skins/default/xui/ja/floater_buy_currency.xml
@@ -59,8 +59,7 @@
-
+
購入できません
-
-
+
diff --git a/indra/newview/skins/default/xui/ja/floater_texture_ctrl.xml b/indra/newview/skins/default/xui/ja/floater_texture_ctrl.xml
index 2e0e636ff3..106faec23f 100644
--- a/indra/newview/skins/default/xui/ja/floater_texture_ctrl.xml
+++ b/indra/newview/skins/default/xui/ja/floater_texture_ctrl.xml
@@ -9,12 +9,12 @@
複数のテクスチャ
-
-
-
-
-
-
+
+
+
+
+
+
サイズ:
[DIMENSIONS]
diff --git a/indra/newview/skins/default/xui/pl/floater_texture_ctrl.xml b/indra/newview/skins/default/xui/pl/floater_texture_ctrl.xml
index d42f2cd808..a15b81ad0f 100644
--- a/indra/newview/skins/default/xui/pl/floater_texture_ctrl.xml
+++ b/indra/newview/skins/default/xui/pl/floater_texture_ctrl.xml
@@ -9,12 +9,12 @@
Wiele tekstur
-
-
-
-
-
-
+
+
+
+
+
+
Rozmiar:
[DIMENSIONS]
diff --git a/indra/newview/skins/default/xui/pl/menu_viewer.xml b/indra/newview/skins/default/xui/pl/menu_viewer.xml
index 35e2ee028c..4136ad27e3 100644
--- a/indra/newview/skins/default/xui/pl/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/pl/menu_viewer.xml
@@ -273,6 +273,7 @@
+
diff --git a/indra/newview/skins/default/xui/pl/panel_outfit_edit.xml b/indra/newview/skins/default/xui/pl/panel_outfit_edit.xml
index 97ec0eb03d..6d7c930e45 100644
--- a/indra/newview/skins/default/xui/pl/panel_outfit_edit.xml
+++ b/indra/newview/skins/default/xui/pl/panel_outfit_edit.xml
@@ -16,6 +16,7 @@
+
diff --git a/indra/newview/skins/default/xui/pl/strings.xml b/indra/newview/skins/default/xui/pl/strings.xml
index 98ad751c84..78bfcf1b63 100644
--- a/indra/newview/skins/default/xui/pl/strings.xml
+++ b/indra/newview/skins/default/xui/pl/strings.xml
@@ -31,7 +31,7 @@
Konfiguracja budowania: [BUILD_CONFIG]
-Położenie [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1] w [REGION] zlokalizowanym w <nolink>[HOSTNAME]</nolink> ([HOSTIP])
+Położenie [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1] w [REGION] zlokalizowanym w <nolink>[HOSTNAME]</nolink>
SLURL: <nolink>[SLURL]</nolink>
(koordynaty globalne [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1])
[SERVER_VERSION]
diff --git a/indra/newview/skins/default/xui/pt/floater_buy_currency.xml b/indra/newview/skins/default/xui/pt/floater_buy_currency.xml
index 513400954b..c740b90472 100644
--- a/indra/newview/skins/default/xui/pt/floater_buy_currency.xml
+++ b/indra/newview/skins/default/xui/pt/floater_buy_currency.xml
@@ -59,8 +59,7 @@
-
+
Transação incompleta
-
-
+
diff --git a/indra/newview/skins/default/xui/pt/floater_texture_ctrl.xml b/indra/newview/skins/default/xui/pt/floater_texture_ctrl.xml
index 5cc70f0e9b..e71a243032 100644
--- a/indra/newview/skins/default/xui/pt/floater_texture_ctrl.xml
+++ b/indra/newview/skins/default/xui/pt/floater_texture_ctrl.xml
@@ -9,12 +9,12 @@
Multiplas texturas
-
-
-
-
-
-
+
+
+
+
+
+
Tamanho:
[DIMENSÕES]
diff --git a/indra/newview/skins/default/xui/pt/strings.xml b/indra/newview/skins/default/xui/pt/strings.xml
index ea3c67ef58..0001d0a29f 100644
--- a/indra/newview/skins/default/xui/pt/strings.xml
+++ b/indra/newview/skins/default/xui/pt/strings.xml
@@ -36,7 +36,7 @@
Construído com [COMPILER] versão [COMPILER_VERSION]
- Você está em [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1] em [REGION] localizado em <nolink>[HOSTNAME]</nolink> ([HOSTIP])
+ Você está em [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1] em [REGION] localizado em <nolink>[HOSTNAME]</nolink>
SLURL: <nolink>[SLURL]</nolink>
(coordenadas globais [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1])
[SERVER_VERSION]
diff --git a/indra/newview/skins/default/xui/ru/floater_about_land.xml b/indra/newview/skins/default/xui/ru/floater_about_land.xml
index ad9d2eca68..89496c5ebc 100644
--- a/indra/newview/skins/default/xui/ru/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/ru/floater_about_land.xml
@@ -63,7 +63,7 @@
Участок не выбран.
- [wkday,datetime,local], [day,datetime,local] [mth,datetime,local] [year,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local]
+ [wkday,datetime,slt], [day,datetime,slt] [mth,datetime,slt] [year,datetime,slt] [hour,datetime,slt]:[min,datetime,slt]:[second,datetime,slt]
UUID участка не может быть исправлен.
diff --git a/indra/newview/skins/default/xui/ru/floater_camera.xml b/indra/newview/skins/default/xui/ru/floater_camera.xml
index 57aefd540c..1f963749fd 100644
--- a/indra/newview/skins/default/xui/ru/floater_camera.xml
+++ b/indra/newview/skins/default/xui/ru/floater_camera.xml
@@ -33,5 +33,4 @@
-
\ No newline at end of file
diff --git a/indra/newview/skins/default/xui/ru/floater_inspect.xml b/indra/newview/skins/default/xui/ru/floater_inspect.xml
index 10177eb0ea..fbd614afd9 100644
--- a/indra/newview/skins/default/xui/ru/floater_inspect.xml
+++ b/indra/newview/skins/default/xui/ru/floater_inspect.xml
@@ -1,7 +1,7 @@
- [wkday,datetime,local], [day,datetime,local] [mth,datetime,local] [year,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local]
+ [wkday,datetime,slt], [day,datetime,slt] [mth,datetime,slt] [year,datetime,slt] [hour,datetime,slt]:[min,datetime,slt]:[second,datetime,slt]
(Группа)
diff --git a/indra/newview/skins/default/xui/ru/floater_phototools.xml b/indra/newview/skins/default/xui/ru/floater_phototools.xml
index 519d00f935..8bd590704d 100644
--- a/indra/newview/skins/default/xui/ru/floater_phototools.xml
+++ b/indra/newview/skins/default/xui/ru/floater_phototools.xml
@@ -9,8 +9,8 @@
-
+
diff --git a/indra/newview/skins/default/xui/ru/floater_texture_ctrl.xml b/indra/newview/skins/default/xui/ru/floater_texture_ctrl.xml
index c94ae53b75..7e34e23bf8 100644
--- a/indra/newview/skins/default/xui/ru/floater_texture_ctrl.xml
+++ b/indra/newview/skins/default/xui/ru/floater_texture_ctrl.xml
@@ -13,12 +13,12 @@
-
-
-
-
-
-
+
+
+
+
+
+
Размер:
[DIMENSIONS]
diff --git a/indra/newview/skins/default/xui/ru/menu_fs_chat_options.xml b/indra/newview/skins/default/xui/ru/menu_fs_chat_options.xml
index 88d5a70520..e1c451fad9 100644
--- a/indra/newview/skins/default/xui/ru/menu_fs_chat_options.xml
+++ b/indra/newview/skins/default/xui/ru/menu_fs_chat_options.xml
@@ -4,6 +4,7 @@
+
diff --git a/indra/newview/skins/default/xui/ru/menu_viewer.xml b/indra/newview/skins/default/xui/ru/menu_viewer.xml
index 2a70884839..0f7393670a 100644
--- a/indra/newview/skins/default/xui/ru/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/ru/menu_viewer.xml
@@ -305,14 +305,14 @@
-
+
-
-
+
+
-
+
diff --git a/indra/newview/skins/default/xui/ru/notifications.xml b/indra/newview/skins/default/xui/ru/notifications.xml
index 16a8061b1f..5fdf6c6a79 100644
--- a/indra/newview/skins/default/xui/ru/notifications.xml
+++ b/indra/newview/skins/default/xui/ru/notifications.xml
@@ -2364,6 +2364,7 @@
+ [QUESTION]
Этим действием загружается [COUNT] предметов на общую стоимость L$[COST]. Вы хотите продолжить загрузку?
-
+
+
+
+ Текущий баланс [BALANCE] L$ недостаточен для загрузки [COUNT] элементов общей стоимостью [COST] L$.
Выбранные файлы не могут быть загружены группой.
@@ -4039,7 +4043,7 @@ URL: [AUDIOURL]
Фантомный режим выключен.
- Блокировка движения включена.
+ Блокировка движения включена. Для отключения используйте меню Аватар > Движение > Заблокировать перемещение.
Блокировка движения выключена.
diff --git a/indra/newview/skins/default/xui/ru/panel_fs_contacts_groups.xml b/indra/newview/skins/default/xui/ru/panel_fs_contacts_groups.xml
index d60e6a699a..032df9dd1b 100644
--- a/indra/newview/skins/default/xui/ru/panel_fs_contacts_groups.xml
+++ b/indra/newview/skins/default/xui/ru/panel_fs_contacts_groups.xml
@@ -1,7 +1,7 @@
-
+
diff --git a/indra/newview/skins/default/xui/ru/panel_preferences_firestorm.xml b/indra/newview/skins/default/xui/ru/panel_preferences_firestorm.xml
index 82e1c8f9a7..02abb15dc8 100644
--- a/indra/newview/skins/default/xui/ru/panel_preferences_firestorm.xml
+++ b/indra/newview/skins/default/xui/ru/panel_preferences_firestorm.xml
@@ -33,6 +33,8 @@
+
diff --git a/indra/newview/skins/default/xui/ru/strings.xml b/indra/newview/skins/default/xui/ru/strings.xml
index 7732a63a77..b1ad6fa654 100644
--- a/indra/newview/skins/default/xui/ru/strings.xml
+++ b/indra/newview/skins/default/xui/ru/strings.xml
@@ -51,7 +51,7 @@
Конфигурация сборки [BUILD_CONFIG]
- Вы в точке [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1] в регионе [REGION], расположенном на <nolink>[HOSTNAME]</nolink> ([HOSTIP])
+ Вы в точке [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1] в регионе [REGION], расположенном на <nolink>[HOSTNAME]</nolink>
SLURL: <nolink>[SLURL]</nolink>
(глобальные координаты [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1])
[SERVER_VERSION]
@@ -5375,7 +5375,7 @@ http://www.firestormviewer.org/support за помощь в решении эт
Удалить выбранные объекты?
- Удалить выбранные объект?
+ Удалить выбранный объект?
Для этого комплекта одежды нет вещей
@@ -7017,4 +7017,7 @@ ID объекта: [INSPECTING_KEY]
Картинка для Комплекта
+
+ (Неизвестный скрипт)
+
diff --git a/indra/newview/skins/default/xui/tr/floater_buy_currency.xml b/indra/newview/skins/default/xui/tr/floater_buy_currency.xml
index d90985dcff..33c4b2287f 100644
--- a/indra/newview/skins/default/xui/tr/floater_buy_currency.xml
+++ b/indra/newview/skins/default/xui/tr/floater_buy_currency.xml
@@ -59,8 +59,7 @@
-
+
Satın Alınamıyor
-
-
+
diff --git a/indra/newview/skins/default/xui/tr/floater_texture_ctrl.xml b/indra/newview/skins/default/xui/tr/floater_texture_ctrl.xml
index 7bf5d6a081..941f8a289a 100644
--- a/indra/newview/skins/default/xui/tr/floater_texture_ctrl.xml
+++ b/indra/newview/skins/default/xui/tr/floater_texture_ctrl.xml
@@ -9,12 +9,12 @@
Birden çok doku
-
-
-
-
-
-
+
+
+
+
+
+
Büyüklük:
[DIMENSIONS]
diff --git a/indra/newview/skins/default/xui/tr/strings.xml b/indra/newview/skins/default/xui/tr/strings.xml
index 106c635b38..1064909e01 100644
--- a/indra/newview/skins/default/xui/tr/strings.xml
+++ b/indra/newview/skins/default/xui/tr/strings.xml
@@ -48,7 +48,7 @@
[COMPILER] [COMPILER_VERSION] sürümü ile oluşturuldu
- <nolink>[HOSTNAME]</nolink> ([HOSTIP]) üzerinde bulunan [REGION] içerisinde [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1] konumundasınız
+ <nolink>[HOSTNAME]</nolink> üzerinde bulunan [REGION] içerisinde [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1] konumundasınız
SLURL: <nolink>[SLURL]</nolink>
(küresel koordinatlar [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1])
[SERVER_VERSION]
diff --git a/indra/newview/skins/default/xui/zh/floater_buy_currency.xml b/indra/newview/skins/default/xui/zh/floater_buy_currency.xml
index fcf2800728..41c8c26ccc 100644
--- a/indra/newview/skins/default/xui/zh/floater_buy_currency.xml
+++ b/indra/newview/skins/default/xui/zh/floater_buy_currency.xml
@@ -59,8 +59,7 @@
-
+
無法購買
-
-
+
diff --git a/indra/newview/skins/default/xui/zh/floater_texture_ctrl.xml b/indra/newview/skins/default/xui/zh/floater_texture_ctrl.xml
index de43666043..522467983e 100644
--- a/indra/newview/skins/default/xui/zh/floater_texture_ctrl.xml
+++ b/indra/newview/skins/default/xui/zh/floater_texture_ctrl.xml
@@ -9,12 +9,12 @@
多重材質
-
-
-
-
-
-
+
+
+
+
+
+
尺寸:
[DIMENSIONS]
diff --git a/indra/newview/skins/default/xui/zh/strings.xml b/indra/newview/skins/default/xui/zh/strings.xml
index 6fab0ae22c..8c9869b61f 100644
--- a/indra/newview/skins/default/xui/zh/strings.xml
+++ b/indra/newview/skins/default/xui/zh/strings.xml
@@ -48,7 +48,7 @@
以 [COMPILER_VERSION] 版本 [COMPILER] 建置
- 你的方位是 [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1],地區名:[REGION],主機:<nolink>[HOSTNAME]</nolink> ([HOSTIP])
+ 你的方位是 [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1],地區名:[REGION],主機:<nolink>[HOSTNAME]</nolink>
第二人生URL:<nolink>[SLURL]</nolink>
(全域坐標:[POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1])
[SERVER_VERSION]
diff --git a/indra/newview/tests/llsechandler_basic_test.cpp b/indra/newview/tests/llsechandler_basic_test.cpp
index 63967fae37..e5d226a2a4 100644
--- a/indra/newview/tests/llsechandler_basic_test.cpp
+++ b/indra/newview/tests/llsechandler_basic_test.cpp
@@ -124,6 +124,14 @@ S32 LLMachineID::getUniqueID(unsigned char *unique_id, size_t len)
S32 LLMachineID::init() { return 1; }
+LLCertException::LLCertException(const LLSD& cert_data, const std::string& msg)
+ : LLException(msg),
+ mCertData(cert_data)
+{
+ LL_WARNS("SECAPI") << "Certificate Error: " << msg << LL_ENDL;
+}
+
+
// -------------------------------------------------------------------------------------------
// TUT
// -------------------------------------------------------------------------------------------
diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py
index a2c95da968..bdd6101ea5 100755
--- a/indra/newview/viewer_manifest.py
+++ b/indra/newview/viewer_manifest.py
@@ -594,8 +594,8 @@ class WindowsManifest(ViewerManifest):
else:
self.path("fmod.dll")
- # Get openal dll if needed
- if self.args.get('openal') == 'ON':
+ if self.args['openal'] == 'ON':
+ # Get openal dll
self.path("OpenAL32.dll")
self.path("alut.dll")
@@ -2150,7 +2150,6 @@ class Linux_i686_Manifest(LinuxManifest):
print "Skipping libfmod.so - not found"
pass
-
# Vivox runtimes
with self.prefix(src=relpkgdir, dst="bin"):
self.path("SLVoice")
@@ -2248,6 +2247,7 @@ if __name__ == "__main__":
print('%s \\\n%s' %
(sys.executable,
' '.join((("'%s'" % arg) if ' ' in arg else arg) for arg in sys.argv)))
+ # fmodstudio and openal can be used simultaneously and controled by environment
extra_arguments = [
dict(name='bugsplat', description="""BugSplat database to which to post crashes,
if BugSplat crash reporting is desired""", default=''),