Merge branch 'master' into DRTVWR-519
commit
38faec3b11
|
|
@ -76,9 +76,9 @@
|
|||
<key>archive</key>
|
||||
<map>
|
||||
<key>hash</key>
|
||||
<string>d670d00aa732b97d105d287b62582762</string>
|
||||
<string>9b8bcc3be6dbe40a04c9c81c313f70dc</string>
|
||||
<key>url</key>
|
||||
<string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/55065/512118/apr_suite-1.4.5.539073-darwin64-539073.tar.bz2</string>
|
||||
<string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/68333/658209/apr_suite-1.4.5.548882-darwin64-548882.tar.bz2</string>
|
||||
</map>
|
||||
<key>name</key>
|
||||
<string>darwin64</string>
|
||||
|
|
@ -112,9 +112,9 @@
|
|||
<key>archive</key>
|
||||
<map>
|
||||
<key>hash</key>
|
||||
<string>83b4a047db5f7ee462753d91e6277cba</string>
|
||||
<string>6bdf460c18ee004b41a46afc80041a92</string>
|
||||
<key>url</key>
|
||||
<string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/55143/512317/apr_suite-1.4.5.539073-windows-539073.tar.bz2</string>
|
||||
<string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/68334/658225/apr_suite-1.4.5.548882-windows-548882.tar.bz2</string>
|
||||
</map>
|
||||
<key>name</key>
|
||||
<string>windows</string>
|
||||
|
|
@ -124,16 +124,16 @@
|
|||
<key>archive</key>
|
||||
<map>
|
||||
<key>hash</key>
|
||||
<string>b3bbf168b39e25c08cc1febddeb33332</string>
|
||||
<string>83104bfa4dabb77cd70d185e38a95b49</string>
|
||||
<key>url</key>
|
||||
<string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/55139/512304/apr_suite-1.4.5.539073-windows64-539073.tar.bz2</string>
|
||||
<string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/68332/658215/apr_suite-1.4.5.548882-windows64-548882.tar.bz2</string>
|
||||
</map>
|
||||
<key>name</key>
|
||||
<string>windows64</string>
|
||||
</map>
|
||||
</map>
|
||||
<key>version</key>
|
||||
<string>1.4.5.539073</string>
|
||||
<string>1.4.5.548882</string>
|
||||
</map>
|
||||
<key>boost</key>
|
||||
<map>
|
||||
|
|
@ -3906,9 +3906,9 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>
|
|||
<array>
|
||||
<string>-G</string>
|
||||
<string>${AUTOBUILD_WIN_CMAKE_GEN|NOTWIN}</string>
|
||||
<string>-DUNATTENDED:BOOL=ON</string>
|
||||
<string>-DINSTALL_PROPRIETARY=FALSE</string>
|
||||
<string>-DUSE_KDU=FALSE</string>
|
||||
<string>-DOPENAL:BOOL=ON</string>
|
||||
</array>
|
||||
</map>
|
||||
<key>name</key>
|
||||
|
|
@ -3979,6 +3979,7 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>
|
|||
<string>-DUNATTENDED:BOOL=ON</string>
|
||||
<string>-DINSTALL_PROPRIETARY=FALSE</string>
|
||||
<string>-DUSE_KDU=FALSE</string>
|
||||
<string>-DOPENAL:BOOL=ON</string>
|
||||
</array>
|
||||
</map>
|
||||
<key>name</key>
|
||||
|
|
|
|||
|
|
@ -258,6 +258,8 @@ Beansy Twine
|
|||
Benja Kepler
|
||||
VWR-746
|
||||
Benjamin Bigdipper
|
||||
Beq Janus
|
||||
BUG-227094
|
||||
Beth Walcher
|
||||
Bezilon Kasei
|
||||
Biancaluce Robbiani
|
||||
|
|
@ -829,6 +831,7 @@ Khyota Wulluf
|
|||
Kimar Coba
|
||||
Kithrak Kirkorian
|
||||
Kitty Barnett
|
||||
BUG-228665
|
||||
VWR-19699
|
||||
STORM-288
|
||||
STORM-799
|
||||
|
|
@ -1301,6 +1304,7 @@ Shyotl Kuhr
|
|||
MAINT-2334
|
||||
MAINT-6913
|
||||
STORM-2143
|
||||
SL-11625
|
||||
Siana Gearz
|
||||
STORM-960
|
||||
STORM-1088
|
||||
|
|
@ -1340,6 +1344,7 @@ Sovereign Engineer
|
|||
MAINT-7343
|
||||
SL-11079
|
||||
OPEN-343
|
||||
SL-11625
|
||||
SpacedOut Frye
|
||||
VWR-34
|
||||
VWR-45
|
||||
|
|
@ -1445,6 +1450,8 @@ Thickbrick Sleaford
|
|||
STORM-956
|
||||
STORM-1147
|
||||
STORM-1325
|
||||
Thoys Pan
|
||||
SL-12396
|
||||
Thraxis Epsilon
|
||||
SVC-371
|
||||
VWR-383
|
||||
|
|
|
|||
|
|
@ -82,6 +82,10 @@ if(WINDOWS)
|
|||
set(release_files ${release_files} fmod.dll)
|
||||
endif (FMODSTUDIO)
|
||||
|
||||
if (OPENAL)
|
||||
list(APPEND release_files openal32.dll alut.dll)
|
||||
endif (OPENAL)
|
||||
|
||||
#*******************************
|
||||
# Copy MS C runtime dlls, required for packaging.
|
||||
if (MSVC80)
|
||||
|
|
|
|||
|
|
@ -60,6 +60,10 @@ if (FMODSTUDIO)
|
|||
endif (FMODSTUDIO)
|
||||
|
||||
if (OPENAL)
|
||||
include_directories(
|
||||
${OPENAL_LIBRARIES}
|
||||
)
|
||||
|
||||
list(APPEND llaudio_SOURCE_FILES
|
||||
llaudioengine_openal.cpp
|
||||
lllistener_openal.cpp
|
||||
|
|
|
|||
|
|
@ -55,7 +55,7 @@ LLAudioEngine_OpenAL::~LLAudioEngine_OpenAL()
|
|||
bool LLAudioEngine_OpenAL::init(const S32 num_channels, void* userdata, const std::string &app_title)
|
||||
{
|
||||
mWindGen = NULL;
|
||||
LLAudioEngine::init(num_channels, userdata);
|
||||
LLAudioEngine::init(num_channels, userdata, app_title);
|
||||
|
||||
if(!alutInit(NULL, NULL))
|
||||
{
|
||||
|
|
|
|||
|
|
@ -1007,11 +1007,20 @@ CURLcode HttpOpRequest::curlSslCtxCallback(CURL *curl, void *sslctx, void *userd
|
|||
{
|
||||
HttpOpRequest::ptr_t op(HttpOpRequest::fromHandle<HttpOpRequest>(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
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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<CoprocQueue_t> CoprocQueuePtr;
|
||||
typedef std::map<LLUUID, LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t> 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<std::string, LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t> 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");
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
|
@ -276,6 +279,8 @@ void LLCoprocedureManager::close(const std::string &pool)
|
|||
LLCoprocedurePool::LLCoprocedurePool(const std::string &poolName, size_t size):
|
||||
mPoolName(poolName),
|
||||
mPoolSize(size),
|
||||
mActiveCoprocsCount(0),
|
||||
mPending(0),
|
||||
mPendingCoprocs(boost::make_shared<CoprocQueue_t>(DEFAULT_QUEUE_SIZE)),
|
||||
mHTTPPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID),
|
||||
mCoroMapping()
|
||||
|
|
@ -401,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;
|
||||
|
||||
|
|
@ -410,19 +414,25 @@ 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;
|
||||
}
|
||||
|
||||
LL_DEBUGS("CoProcMgr") << "Finished coprocedure(" << coproc->mName << ")" << " in pool \"" << mPoolName << "\"" << LL_ENDL;
|
||||
|
||||
mActiveCoprocs.erase(itActive);
|
||||
mActiveCoprocsCount--;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -85,15 +85,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()
|
||||
|
|
@ -122,7 +122,7 @@ void LLExperienceCache::cleanup()
|
|||
{
|
||||
cache_stream << (*this);
|
||||
}
|
||||
mShutdown = true;
|
||||
sShutdown = true;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
|
@ -344,7 +344,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);
|
||||
|
|
@ -398,8 +398,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();
|
||||
|
|
@ -410,7 +408,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.)
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -655,6 +655,37 @@ void LLAccordionCtrl::onScrollPosChangeCallback(S32, LLScrollbar*)
|
|||
{
|
||||
updateLayout(getRect().getWidth(),getRect().getHeight());
|
||||
}
|
||||
|
||||
// virtual
|
||||
void LLAccordionCtrl::onUpdateScrollToChild(const LLUICtrl *cntrl)
|
||||
{
|
||||
if (mScrollbar && mScrollbar->getVisible())
|
||||
{
|
||||
// same as scrollToShowRect
|
||||
LLRect rect;
|
||||
cntrl->localRectToOtherView(cntrl->getLocalRect(), &rect, this);
|
||||
|
||||
// Translate to parent coordinatess to check if we are in visible rectangle
|
||||
rect.translate(getRect().mLeft, getRect().mBottom);
|
||||
|
||||
if (!getRect().contains(rect))
|
||||
{
|
||||
// for accordition's scroll, height is in pixels
|
||||
// Back to local coords and calculate position for scroller
|
||||
S32 bottom = mScrollbar->getDocPos() - rect.mBottom + getRect().mBottom;
|
||||
S32 top = mScrollbar->getDocPos() - rect.mTop + getRect().mTop;
|
||||
|
||||
S32 scroll_pos = llclamp(mScrollbar->getDocPos(),
|
||||
bottom, // min vertical scroll
|
||||
top); // max vertical scroll
|
||||
|
||||
mScrollbar->setDocPos(scroll_pos);
|
||||
}
|
||||
}
|
||||
|
||||
LLUICtrl::onUpdateScrollToChild(cntrl);
|
||||
}
|
||||
|
||||
void LLAccordionCtrl::onOpen (const LLSD& key)
|
||||
{
|
||||
for(size_t i=0;i<mAccordionTabs.size();++i)
|
||||
|
|
|
|||
|
|
@ -111,6 +111,7 @@ public:
|
|||
void draw();
|
||||
|
||||
void onScrollPosChangeCallback(S32, LLScrollbar*);
|
||||
virtual void onUpdateScrollToChild(const LLUICtrl * cntrl);
|
||||
|
||||
void onOpen (const LLSD& key);
|
||||
S32 notifyParent(const LLSD& info);
|
||||
|
|
|
|||
|
|
@ -452,6 +452,35 @@ void LLAccordionCtrlTab::onVisibilityChange(BOOL new_visibility)
|
|||
notifyParent(LLSD().with("child_visibility_change", new_visibility));
|
||||
}
|
||||
|
||||
// virtual
|
||||
void LLAccordionCtrlTab::onUpdateScrollToChild(const LLUICtrl *cntrl)
|
||||
{
|
||||
if (mScrollbar && mScrollbar->getVisible())
|
||||
{
|
||||
LLRect rect;
|
||||
cntrl->localRectToOtherView(cntrl->getLocalRect(), &rect, this);
|
||||
|
||||
// Translate to parent coordinatess to check if we are in visible rectangle
|
||||
rect.translate(getRect().mLeft, getRect().mBottom);
|
||||
|
||||
if (!getRect().contains(rect))
|
||||
{
|
||||
// for accordition's scroll, height is in pixels
|
||||
// Back to local coords and calculate position for scroller
|
||||
S32 bottom = mScrollbar->getDocPos() - rect.mBottom + getRect().mBottom;
|
||||
S32 top = mScrollbar->getDocPos() - rect.mTop + getRect().mTop;
|
||||
|
||||
S32 scroll_pos = llclamp(mScrollbar->getDocPos(),
|
||||
bottom, // min vertical scroll
|
||||
top); // max vertical scroll
|
||||
|
||||
mScrollbar->setDocPos(scroll_pos);
|
||||
}
|
||||
}
|
||||
|
||||
LLUICtrl::onUpdateScrollToChild(cntrl);
|
||||
}
|
||||
|
||||
BOOL LLAccordionCtrlTab::handleMouseDown(S32 x, S32 y, MASK mask)
|
||||
{
|
||||
if(mCollapsible && mHeaderVisible && mCanOpenClose)
|
||||
|
|
|
|||
|
|
@ -159,6 +159,7 @@ public:
|
|||
* Raises notifyParent event with "child_visibility_change" = new_visibility
|
||||
*/
|
||||
void onVisibilityChange(BOOL new_visibility);
|
||||
virtual void onUpdateScrollToChild(const LLUICtrl * cntrl);
|
||||
|
||||
// Changes expand/collapse state and triggers expand/collapse callbacks
|
||||
virtual BOOL handleMouseDown(S32 x, S32 y, MASK mask);
|
||||
|
|
|
|||
|
|
@ -56,6 +56,14 @@ void LLBadgeOwner::initBadgeParams(const LLBadge::Params& p)
|
|||
}
|
||||
}
|
||||
|
||||
void LLBadgeOwner::reshapeBadge(const LLRect& new_rect)
|
||||
{
|
||||
if (mBadge)
|
||||
{
|
||||
mBadge->setShape(new_rect);
|
||||
}
|
||||
}
|
||||
|
||||
void LLBadgeOwner::setBadgeVisibility(bool visible)
|
||||
{
|
||||
if (mBadge)
|
||||
|
|
|
|||
|
|
@ -46,6 +46,7 @@ public:
|
|||
bool hasBadgeHolderParent() const { return mHasBadgeHolderParent; };
|
||||
void setBadgeVisibility(bool visible);
|
||||
void setDrawBadgeAtTop(bool draw_at_top);
|
||||
void reshapeBadge(const LLRect& new_rect);
|
||||
|
||||
private:
|
||||
|
||||
|
|
|
|||
|
|
@ -514,6 +514,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)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -158,6 +158,8 @@ public:
|
|||
BOOL setCurrentByIndex( S32 index );
|
||||
S32 getCurrentIndex() const;
|
||||
|
||||
void setEnabledByValue(const LLSD& value, BOOL enabled);
|
||||
|
||||
void createLineEditor(const Params&);
|
||||
|
||||
//========================================================================
|
||||
|
|
|
|||
|
|
@ -2151,6 +2151,7 @@ void LLLineEditor::clear()
|
|||
void LLLineEditor::onTabInto()
|
||||
{
|
||||
selectAll();
|
||||
LLUICtrl::onTabInto();
|
||||
}
|
||||
|
||||
//virtual
|
||||
|
|
|
|||
|
|
@ -509,6 +509,7 @@ void LLMultiSliderCtrl::onTabInto()
|
|||
{
|
||||
mEditor->onTabInto();
|
||||
}
|
||||
LLF32UICtrl::onTabInto();
|
||||
}
|
||||
|
||||
void LLMultiSliderCtrl::reportInvalidData()
|
||||
|
|
|
|||
|
|
@ -255,7 +255,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();
|
||||
}
|
||||
}
|
||||
|
|
@ -448,11 +448,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);
|
||||
}
|
||||
|
||||
|
|
@ -1398,8 +1398,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", "",
|
||||
|
|
@ -1455,7 +1461,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;
|
||||
|
|
@ -1489,12 +1495,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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1533,7 +1539,7 @@ void addPathIfExists(const std::string& new_path, std::vector<std::string>& 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.
|
||||
|
|
@ -1604,7 +1610,7 @@ bool LLNotifications::loadTemplates()
|
|||
mTemplates[notification.name] = LLNotificationTemplatePtr(new LLNotificationTemplate(notification));
|
||||
}
|
||||
|
||||
LL_INFOS() << "...done" << LL_ENDL;
|
||||
LL_INFOS("Notifications") << "...done" << LL_ENDL;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
|
@ -1832,7 +1838,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 << "\" "
|
||||
|
|
@ -1877,7 +1883,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);
|
||||
}
|
||||
|
|
@ -1888,7 +1894,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);
|
||||
}
|
||||
|
|
@ -1900,7 +1906,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;
|
||||
}
|
||||
|
|
@ -1961,7 +1967,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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -957,6 +957,7 @@ public:
|
|||
|
||||
private:
|
||||
/*virtual*/ void initSingleton();
|
||||
/*virtual*/ void cleanupSingleton();
|
||||
|
||||
void loadPersistentNotifications();
|
||||
|
||||
|
|
@ -1069,6 +1070,7 @@ public:
|
|||
LLPersistentNotificationChannel()
|
||||
: LLNotificationChannel("Persistent", "Visible", ¬ificationFilter)
|
||||
{}
|
||||
virtual ~LLPersistentNotificationChannel() {}
|
||||
|
||||
typedef std::vector<LLNotificationPtr> history_list_t;
|
||||
history_list_t::iterator beginHistory() { sortHistory(); return mHistory.begin(); }
|
||||
|
|
|
|||
|
|
@ -479,6 +479,7 @@ void LLSliderCtrl::onTabInto()
|
|||
{
|
||||
mEditor->onTabInto();
|
||||
}
|
||||
LLF32UICtrl::onTabInto();
|
||||
}
|
||||
|
||||
void LLSliderCtrl::reportInvalidData()
|
||||
|
|
|
|||
|
|
@ -442,7 +442,8 @@ void LLSpinCtrl::setAllowEdit(BOOL allow_edit)
|
|||
|
||||
void LLSpinCtrl::onTabInto()
|
||||
{
|
||||
mEditor->onTabInto();
|
||||
mEditor->onTabInto();
|
||||
LLF32UICtrl::onTabInto();
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -1017,7 +1017,38 @@ BOOL LLTextBase::handleMouseDown(S32 x, S32 y, MASK mask)
|
|||
// handle triple click
|
||||
if (!mTripleClickTimer.hasExpired())
|
||||
{
|
||||
selectAll();
|
||||
S32 real_line = getLineNumFromDocIndex(mCursorPos, false);
|
||||
S32 line_start = -1;
|
||||
S32 line_end = -1;
|
||||
for (line_list_t::const_iterator it = mLineInfoList.begin(), end_it = mLineInfoList.end();
|
||||
it != end_it;
|
||||
++it)
|
||||
{
|
||||
if (it->mLineNum < real_line)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if (it->mLineNum > real_line)
|
||||
{
|
||||
break;
|
||||
}
|
||||
if (line_start == -1)
|
||||
{
|
||||
line_start = it->mDocIndexStart;
|
||||
}
|
||||
line_end = it->mDocIndexEnd;
|
||||
line_end = llclamp(line_end, 0, getLength());
|
||||
}
|
||||
|
||||
if (line_start == -1)
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
mSelectionEnd = line_start;
|
||||
mSelectionStart = line_end;
|
||||
setCursorPos(line_start);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -721,8 +721,9 @@ void LLUICtrl::resetDirty()
|
|||
}
|
||||
|
||||
// virtual
|
||||
void LLUICtrl::onTabInto()
|
||||
void LLUICtrl::onTabInto()
|
||||
{
|
||||
onUpdateScrollToChild(this);
|
||||
}
|
||||
|
||||
// virtual
|
||||
|
|
|
|||
|
|
@ -645,6 +645,16 @@ void LLView::onVisibilityChange ( BOOL new_visibility )
|
|||
}
|
||||
}
|
||||
|
||||
// virtual
|
||||
void LLView::onUpdateScrollToChild(const LLUICtrl * cntrl)
|
||||
{
|
||||
LLView* parent_view = getParent();
|
||||
if (parent_view)
|
||||
{
|
||||
parent_view->onUpdateScrollToChild(cntrl);
|
||||
}
|
||||
}
|
||||
|
||||
// virtual
|
||||
void LLView::translate(S32 x, S32 y)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -301,6 +301,7 @@ public:
|
|||
virtual BOOL setLabelArg( const std::string& key, const LLStringExplicit& text );
|
||||
|
||||
virtual void onVisibilityChange ( BOOL new_visibility );
|
||||
virtual void onUpdateScrollToChild(const LLUICtrl * cntrl);
|
||||
|
||||
void pushVisible(BOOL visible) { mLastVisible = mVisible; setVisible(visible); }
|
||||
void popVisible() { setVisible(mLastVisible); }
|
||||
|
|
|
|||
|
|
@ -359,10 +359,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]);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1618,6 +1618,10 @@ if (WINDOWS)
|
|||
# causes those systems to run in a Windows 8 compatibility mode, which works.
|
||||
LIST(APPEND viewer_SOURCE_FILES windows.manifest)
|
||||
endif (ADDRESS_SIZE EQUAL 64)
|
||||
|
||||
if (OPENAL)
|
||||
LIST(APPEND viewer_LIBRARIES ${OPENAL_LIBRARIES})
|
||||
endif (OPENAL)
|
||||
endif (WINDOWS)
|
||||
|
||||
# Add the xui files. This is handy for searching for xui elements
|
||||
|
|
@ -1719,6 +1723,12 @@ if (FMODSTUDIO)
|
|||
endif (FMODSTUDIO)
|
||||
|
||||
set_source_files_properties(llstartup.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})
|
||||
|
|
@ -1841,6 +1851,13 @@ 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
|
||||
)
|
||||
endif (OPENAL)
|
||||
|
||||
add_custom_command(
|
||||
OUTPUT ${CMAKE_CFG_INTDIR}/copy_touched.bat
|
||||
COMMAND ${PYTHON_EXECUTABLE}
|
||||
|
|
@ -1851,6 +1868,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}"
|
||||
|
|
@ -1913,6 +1931,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}"
|
||||
|
|
@ -2060,6 +2079,7 @@ if (LINUX)
|
|||
--artwork=${ARTWORK_DIR}
|
||||
"--bugsplat=${BUGSPLAT_DB}"
|
||||
"--fmodstudio=${FMODSTUDIO}"
|
||||
"--openal=${OPENAL}"
|
||||
--build=${CMAKE_CURRENT_BINARY_DIR}
|
||||
--buildtype=${CMAKE_BUILD_TYPE}
|
||||
"--channel=${VIEWER_CHANNEL}"
|
||||
|
|
@ -2087,6 +2107,7 @@ if (LINUX)
|
|||
--artwork=${ARTWORK_DIR}
|
||||
"--bugsplat=${BUGSPLAT_DB}"
|
||||
"--fmodstudio=${FMODSTUDIO}"
|
||||
"--openal=${OPENAL}"
|
||||
--build=${CMAKE_CURRENT_BINARY_DIR}
|
||||
--buildtype=${CMAKE_BUILD_TYPE}
|
||||
"--channel=${VIEWER_CHANNEL}"
|
||||
|
|
@ -2164,6 +2185,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}
|
||||
|
|
@ -2199,6 +2221,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}"
|
||||
|
|
|
|||
|
|
@ -1 +1 @@
|
|||
6.4.8
|
||||
6.4.9
|
||||
|
|
|
|||
|
|
@ -14376,7 +14376,7 @@
|
|||
<key>VoiceCallsFriendsOnly</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Only accept voice calls from residents on your friends list</string>
|
||||
<string>(Deprecated) Only accept voice calls from residents on your friends list</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
|
|
|
|||
|
|
@ -220,6 +220,17 @@
|
|||
<key>Value</key>
|
||||
<integer>1</integer>
|
||||
</map>
|
||||
<key>VoiceCallsFriendsOnly</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Only accept voice calls and receive IMs from residents on your friends list</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
<key>VoiceEffectDefault</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
|
|
|
|||
|
|
@ -867,9 +867,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)
|
||||
{
|
||||
// We've changed regions, we're now going to change our agent coordinate frame.
|
||||
|
|
|
|||
|
|
@ -354,6 +354,18 @@ void LLAgentCamera::resetView(BOOL reset_camera, BOOL change_camera)
|
|||
resetPanDiff();
|
||||
resetOrbitDiff();
|
||||
mHUDTargetZoom = 1.f;
|
||||
|
||||
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.
|
||||
|
|
|
|||
|
|
@ -522,20 +522,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<X509_STORE_CTX *>(appdata);
|
||||
LLCore::HttpStatus result;
|
||||
LLPointer<LLCertificateStore> store = gSecAPIHandler->getCertificateStore("");
|
||||
LLPointer<LLCertificateChain> chain = gSecAPIHandler->getCertificateChain(ctx);
|
||||
LLSD validation_params = LLSD::emptyMap();
|
||||
LLURI uri(url);
|
||||
LLCore::HttpStatus result;
|
||||
try
|
||||
{
|
||||
X509_STORE_CTX *ctx = static_cast<X509_STORE_CTX *>(appdata);
|
||||
LLPointer<LLCertificateStore> store = gSecAPIHandler->getCertificateStore("");
|
||||
LLPointer<LLCertificateChain> 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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -294,6 +294,7 @@ struct AttachmentInfo
|
|||
std::vector<AttachmentInfo> info{
|
||||
AttachmentInfo(metadata.logFilePathname, "text/plain"),
|
||||
AttachmentInfo(metadata.userSettingsPathname, "text/xml"),
|
||||
AttachmentInfo(metadata.accountSettingsPathname, "text/xml"),
|
||||
AttachmentInfo(metadata.staticDebugPathname, "text/xml")
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -3582,6 +3582,10 @@ void LLAppearanceMgr::serverAppearanceUpdateCoro(LLCoreHttpUtil::HttpCoroutineAd
|
|||
}
|
||||
|
||||
llcoro::suspend();
|
||||
if (LLApp::isQuitting())
|
||||
{
|
||||
return;
|
||||
}
|
||||
S32 retryCount(0);
|
||||
bool bRetry;
|
||||
do
|
||||
|
|
@ -3645,6 +3649,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);
|
||||
|
||||
|
|
@ -3680,6 +3689,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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -3077,8 +3077,9 @@ 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();
|
||||
|
||||
boost::regex regex("\\.(secondlife|lindenlab)\\..*");
|
||||
info["HOSTNAME"] = boost::regex_replace(gAgent.getRegion()->getHost().getHostName(), regex, "");
|
||||
info["SERVER_VERSION"] = gLastVersionChannel;
|
||||
LLSLURL slurl;
|
||||
LLAgentUI::buildSLURL(slurl);
|
||||
|
|
@ -3942,6 +3943,7 @@ static LLNotificationFunctorRegistration finish_quit_reg("ConfirmQuit", finish_q
|
|||
|
||||
void LLAppViewer::userQuit()
|
||||
{
|
||||
LL_INFOS() << "User requested quit" << LL_ENDL;
|
||||
if (gDisconnected
|
||||
|| !gViewerWindow
|
||||
|| !gViewerWindow->getProgressView()
|
||||
|
|
@ -4617,13 +4619,14 @@ void LLAppViewer::idle()
|
|||
{
|
||||
return;
|
||||
}
|
||||
|
||||
gViewerWindow->updateUI();
|
||||
|
||||
if (gTeleportDisplay)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
gViewerWindow->updateUI();
|
||||
|
||||
///////////////////////////////////////
|
||||
// Agent and camera movement
|
||||
//
|
||||
|
|
|
|||
|
|
@ -52,10 +52,12 @@ LLAppViewerListener::LLAppViewerListener(const LLAppViewerGetter& getter):
|
|||
|
||||
void LLAppViewerListener::requestQuit(const LLSD& event)
|
||||
{
|
||||
LL_INFOS() << "Listener requested quit" << LL_ENDL;
|
||||
mAppViewerGetter()->requestQuit();
|
||||
}
|
||||
|
||||
void LLAppViewerListener::forceQuit(const LLSD& event)
|
||||
{
|
||||
LL_INFOS() << "Listener requested force quit" << LL_ENDL;
|
||||
mAppViewerGetter()->forceQuit();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -41,6 +41,7 @@ struct CrashMetadata
|
|||
{
|
||||
std::string logFilePathname;
|
||||
std::string userSettingsPathname;
|
||||
std::string accountSettingsPathname;
|
||||
std::string staticDebugPathname;
|
||||
std::string OSInfo;
|
||||
std::string agentFullname;
|
||||
|
|
|
|||
|
|
@ -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");
|
||||
|
|
|
|||
|
|
@ -139,6 +139,9 @@ namespace
|
|||
{
|
||||
// user name, when we have it
|
||||
sBugSplatSender->setDefaultUserName(WCSTR(gAgentAvatarp->getFullname()));
|
||||
|
||||
sBugSplatSender->sendAdditionalFile(
|
||||
WCSTR(gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, "settings_per_account.xml")));
|
||||
}
|
||||
|
||||
// LL_ERRS message, when there is one
|
||||
|
|
|
|||
|
|
@ -1092,6 +1092,10 @@ void LLScriptChiclet::onMenuItemClicked(const LLSD& user_data)
|
|||
{
|
||||
LLScriptFloaterManager::instance().removeNotification(getSessionId());
|
||||
}
|
||||
else if ("close all" == action)
|
||||
{
|
||||
LLIMWellWindow::getInstance()->closeAll();
|
||||
}
|
||||
}
|
||||
|
||||
void LLScriptChiclet::createPopupMenu()
|
||||
|
|
|
|||
|
|
@ -347,6 +347,13 @@ void LLFloaterCompileQueue::processExperienceIdResults(LLSD result, LLUUID paren
|
|||
bool LLFloaterCompileQueue::processScript(LLHandle<LLFloaterCompileQueue> hfloater,
|
||||
const LLPointer<LLViewerObject> &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<LLFloaterCompileQueue> floater(hfloater);
|
||||
// Dereferencing floater may fail. If they do they throw LLExeceptionStaleHandle.
|
||||
|
|
@ -381,6 +388,8 @@ bool LLFloaterCompileQueue::processScript(LLHandle<LLFloaterCompileQueue> 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;
|
||||
|
|
@ -404,6 +413,12 @@ bool LLFloaterCompileQueue::processScript(LLHandle<LLFloaterCompileQueue> hfloat
|
|||
|
||||
}
|
||||
|
||||
if (!gAssetStorage)
|
||||
{
|
||||
// viewer likely is shutting down
|
||||
return true;
|
||||
}
|
||||
|
||||
{
|
||||
HandleScriptUserData userData(pump.getName());
|
||||
|
||||
|
|
@ -468,6 +483,8 @@ bool LLFloaterCompileQueue::processScript(LLHandle<LLFloaterCompileQueue> 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;
|
||||
|
|
@ -797,6 +814,7 @@ void LLFloaterScriptQueue::objectScriptProcessingQueueCoro(std::string action, L
|
|||
// but offers no guarantee of doing so.
|
||||
llcoro::suspend();
|
||||
}
|
||||
floater.check();
|
||||
}
|
||||
|
||||
floater->addStringMessage("Done");
|
||||
|
|
|
|||
|
|
@ -482,6 +482,10 @@ bool LLConversationLog::saveToFile(const std::string& filename)
|
|||
conv_it->getSessionID().toString(conversation_id);
|
||||
conv_it->getParticipantID().toString(participant_id);
|
||||
|
||||
bool is_adhoc = (conv_it->getConversationType() == LLIMModel::LLIMSession::ADHOC_SESSION);
|
||||
std::string conv_name = is_adhoc ? conv_it->getConversationName() : LLURI::escape(conv_it->getConversationName());
|
||||
std::string file_name = is_adhoc ? conv_it->getHistoryFileName() : LLURI::escape(conv_it->getHistoryFileName());
|
||||
|
||||
// examples of two file entries
|
||||
// [1343221177] 0 1 0 John Doe| 7e4ec5be-783f-49f5-71dz-16c58c64c145 4ec62a74-c246-0d25-2af6-846beac2aa55 john.doe|
|
||||
// [1343222639] 2 0 0 Ad-hoc Conference| c3g67c89-c479-4c97-b21d-32869bcfe8rc 68f1c33e-4135-3e3e-a897-8c9b23115c09 Ad-hoc Conference hash597394a0-9982-766d-27b8-c75560213b9a|
|
||||
|
|
@ -490,10 +494,10 @@ bool LLConversationLog::saveToFile(const std::string& filename)
|
|||
(S32)conv_it->getConversationType(),
|
||||
(S32)0,
|
||||
(S32)conv_it->hasOfflineMessages(),
|
||||
LLURI::escape(conv_it->getConversationName()).c_str(),
|
||||
conv_name.c_str(),
|
||||
participant_id.c_str(),
|
||||
conversation_id.c_str(),
|
||||
LLURI::escape(conv_it->getHistoryFileName()).c_str());
|
||||
file_name.c_str());
|
||||
}
|
||||
fclose(fp);
|
||||
return true;
|
||||
|
|
@ -541,14 +545,18 @@ bool LLConversationLog::loadFromFile(const std::string& filename)
|
|||
conv_id_buffer,
|
||||
history_file_name);
|
||||
|
||||
bool is_adhoc = ((SessionType)stype == LLIMModel::LLIMSession::ADHOC_SESSION);
|
||||
std::string conv_name = is_adhoc ? conv_name_buffer : LLURI::unescape(conv_name_buffer);
|
||||
std::string file_name = is_adhoc ? history_file_name : LLURI::unescape(history_file_name);
|
||||
|
||||
ConversationParams params;
|
||||
params.time(LLUnits::Seconds::fromValue(time))
|
||||
.conversation_type((SessionType)stype)
|
||||
.has_offline_ims(has_offline_ims)
|
||||
.conversation_name(LLURI::unescape(conv_name_buffer))
|
||||
.conversation_name(conv_name)
|
||||
.participant_id(LLUUID(part_id_buffer))
|
||||
.session_id(LLUUID(conv_id_buffer))
|
||||
.history_filename(LLURI::unescape(history_file_name));
|
||||
.history_filename(file_name);
|
||||
|
||||
LLConversation conversation(params);
|
||||
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
};
|
||||
|
|
|
|||
|
|
@ -314,11 +314,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);
|
||||
|
|
|
|||
|
|
@ -1741,11 +1741,16 @@ void LLDrawPoolAvatar::getRiggedGeometry(
|
|||
LLVolume* volume,
|
||||
const LLVolumeFace& vol_face)
|
||||
{
|
||||
face->setGeomIndex(0);
|
||||
face->setIndicesIndex(0);
|
||||
|
||||
//rigged faces do not batch textures
|
||||
face->setTextureIndex(255);
|
||||
face->setGeomIndex(0);
|
||||
face->setIndicesIndex(0);
|
||||
|
||||
if (face->getTextureIndex() != FACE_DO_NOT_BATCH_TEXTURES)
|
||||
{
|
||||
face->setDrawInfo(NULL);
|
||||
}
|
||||
|
||||
//rigged faces do not batch textures
|
||||
face->setTextureIndex(FACE_DO_NOT_BATCH_TEXTURES);
|
||||
|
||||
if (buffer.isNull() || buffer->getTypeMask() != data_mask || !buffer->isWriteable())
|
||||
{
|
||||
|
|
|
|||
|
|
@ -153,7 +153,7 @@ void LLFace::init(LLDrawable* drawablep, LLViewerObject* objp)
|
|||
}
|
||||
|
||||
mTEOffset = -1;
|
||||
mTextureIndex = 255;
|
||||
mTextureIndex = FACE_DO_NOT_BATCH_TEXTURES;
|
||||
|
||||
setDrawable(drawablep);
|
||||
mVObjp = objp;
|
||||
|
|
@ -184,6 +184,7 @@ void LLFace::destroy()
|
|||
if(mTexture[i].notNull())
|
||||
{
|
||||
mTexture[i]->removeFace(i, this) ;
|
||||
mTexture[i] = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -203,7 +204,6 @@ void LLFace::destroy()
|
|||
{
|
||||
mDrawPoolp->removeFace(this);
|
||||
}
|
||||
|
||||
mDrawPoolp = NULL;
|
||||
}
|
||||
|
||||
|
|
@ -212,7 +212,7 @@ void LLFace::destroy()
|
|||
delete mTextureMatrix;
|
||||
mTextureMatrix = NULL;
|
||||
|
||||
if (mDrawablep.notNull())
|
||||
if (mDrawablep)
|
||||
{
|
||||
LLSpatialGroup* group = mDrawablep->getSpatialGroup();
|
||||
if (group)
|
||||
|
|
@ -224,7 +224,7 @@ void LLFace::destroy()
|
|||
}
|
||||
|
||||
setDrawInfo(NULL);
|
||||
|
||||
|
||||
mDrawablep = NULL;
|
||||
mVObjp = NULL;
|
||||
}
|
||||
|
|
@ -456,13 +456,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;
|
||||
}
|
||||
|
|
@ -535,7 +535,7 @@ void LLFace::updateCenterAgent()
|
|||
|
||||
void LLFace::renderSelected(LLViewerTexture *imagep, const LLColor4& color)
|
||||
{
|
||||
if (mDrawablep->getSpatialGroup() == NULL)
|
||||
if (mDrawablep == NULL || mDrawablep->getSpatialGroup() == NULL)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
|
@ -543,7 +543,7 @@ void LLFace::renderSelected(LLViewerTexture *imagep, const LLColor4& color)
|
|||
mDrawablep->getSpatialGroup()->rebuildGeom();
|
||||
mDrawablep->getSpatialGroup()->rebuildMesh();
|
||||
|
||||
if(mDrawablep.isNull() || mVertexBuffer.isNull())
|
||||
if(mVertexBuffer.isNull())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
|
@ -1539,7 +1539,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;
|
||||
|
|
@ -2072,7 +2072,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;
|
||||
|
|
@ -2673,7 +2673,7 @@ S32 LLFace::renderElements(const U16 *index_array) const
|
|||
|
||||
S32 LLFace::renderIndexed()
|
||||
{
|
||||
if(mDrawablep.isNull() || mDrawPoolp == NULL)
|
||||
if(mDrawablep == NULL || mDrawPoolp == NULL)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -52,6 +52,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<LLFace, 16>
|
||||
{
|
||||
|
|
@ -279,8 +280,13 @@ private:
|
|||
LLXformMatrix* mXform;
|
||||
|
||||
LLPointer<LLViewerTexture> mTexture[LLRender::NUM_TEXTURE_CHANNELS];
|
||||
|
||||
LLPointer<LLDrawable> 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<LLViewerObject> mVObjp;
|
||||
S32 mTEOffset;
|
||||
|
||||
|
|
|
|||
|
|
@ -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<LLUICtrl>("buy_btn")->setCommitCallback( boost::bind(&LLFloaterBuyCurrencyUI::onClickBuy, this));
|
||||
getChild<LLUICtrl>("cancel_btn")->setCommitCallback( boost::bind(&LLFloaterBuyCurrencyUI::onClickCancel, this));
|
||||
getChild<LLUICtrl>("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<LLTextBox>("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)
|
||||
{
|
||||
|
|
@ -278,14 +259,6 @@ void LLFloaterBuyCurrencyUI::onClickCancel()
|
|||
LLStatusBar::sendMoneyBalanceRequest();
|
||||
}
|
||||
|
||||
void LLFloaterBuyCurrencyUI::onClickErrorWeb()
|
||||
{
|
||||
LLWeb::loadURL(mManager.errorURI());
|
||||
closeFloater();
|
||||
// Update L$ balance
|
||||
LLStatusBar::sendMoneyBalanceRequest();
|
||||
}
|
||||
|
||||
// static
|
||||
void LLFloaterBuyCurrency::buyCurrency()
|
||||
{
|
||||
|
|
|
|||
|
|
@ -84,10 +84,7 @@ BOOL LLFloaterConversationPreview::postBuild()
|
|||
file = "chat";
|
||||
}
|
||||
mChatHistoryFileName = file;
|
||||
if (mIsGroup)
|
||||
{
|
||||
mChatHistoryFileName += GROUP_CHAT_SUFFIX;
|
||||
}
|
||||
|
||||
LLStringUtil::format_map_t args;
|
||||
args["[NAME]"] = name;
|
||||
std::string title = getString("Title", args);
|
||||
|
|
|
|||
|
|
@ -35,6 +35,7 @@
|
|||
|
||||
#include "llagent.h"
|
||||
#include "llbutton.h"
|
||||
#include "llcheckboxctrl.h"
|
||||
#include "llcombobox.h"
|
||||
#include "lldrawable.h"
|
||||
#include "lldrawpoolavatar.h"
|
||||
|
|
@ -115,8 +116,14 @@ BOOL LLFloaterImagePreview::postBuild()
|
|||
mSculptedPreview = new LLImagePreviewSculpted(256, 256);
|
||||
mSculptedPreview->setPreviewTarget(mRawImagep, 2.0f);
|
||||
|
||||
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<LLCheckBoxCtrl>("lossless_check");
|
||||
check_box->setEnabled(TRUE);
|
||||
check_box->setControlVariable(gSavedSettings.getControl("LosslessJ2CUpload"));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
|
|||
|
|
@ -455,7 +455,7 @@ void LLFloaterIMContainer::idleUpdate()
|
|||
while (current_participant_model != end_participant_model)
|
||||
{
|
||||
LLConversationItemParticipant* participant_model = dynamic_cast<LLConversationItemParticipant*>(*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++;
|
||||
|
|
@ -1409,12 +1409,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)
|
||||
|
|
@ -1480,11 +1489,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;
|
||||
|
|
@ -1854,7 +1863,7 @@ LLConversationViewParticipant* LLFloaterIMContainer::createConversationViewParti
|
|||
return LLUICtrlFactory::create<LLConversationViewParticipant>(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())
|
||||
|
|
@ -1874,7 +1883,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());
|
||||
}
|
||||
|
|
@ -1884,7 +1893,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()
|
||||
|
|
|
|||
|
|
@ -164,7 +164,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();
|
||||
|
|
|
|||
|
|
@ -66,6 +66,11 @@ void LLFloaterLoadPrefPreset::onOpen(const LLSD& key)
|
|||
|
||||
EDefaultOptions option = DEFAULT_TOP;
|
||||
LLPresetsManager::getInstance()->setPresetNamesInComboBox(mSubdirectory, combo, option);
|
||||
std::string preset_graphic_active = gSavedSettings.getString("PresetGraphicActive");
|
||||
if (!preset_graphic_active.empty())
|
||||
{
|
||||
combo->setSimple(preset_graphic_active);
|
||||
}
|
||||
}
|
||||
|
||||
void LLFloaterLoadPrefPreset::onPresetsListChange()
|
||||
|
|
@ -74,6 +79,11 @@ void LLFloaterLoadPrefPreset::onPresetsListChange()
|
|||
|
||||
EDefaultOptions option = DEFAULT_TOP;
|
||||
LLPresetsManager::getInstance()->setPresetNamesInComboBox(mSubdirectory, combo, option);
|
||||
std::string preset_graphic_active = gSavedSettings.getString("PresetGraphicActive");
|
||||
if (!preset_graphic_active.empty())
|
||||
{
|
||||
combo->setSimple(preset_graphic_active);
|
||||
}
|
||||
}
|
||||
|
||||
void LLFloaterLoadPrefPreset::onBtnCancel()
|
||||
|
|
|
|||
|
|
@ -178,7 +178,6 @@ void LLFloaterPermsDefault::sendInitialPerms()
|
|||
if(!mCapSent)
|
||||
{
|
||||
updateCap();
|
||||
setCapSent(true);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -240,7 +239,7 @@ 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)
|
||||
if ((reason != previousReason) && mCapSent)
|
||||
{
|
||||
previousReason = reason;
|
||||
LLSD args;
|
||||
|
|
|
|||
|
|
@ -1094,6 +1094,7 @@ void LLFloaterPreference::onBtnCancel(const LLSD& userdata)
|
|||
if (userdata.asString() == "closeadvanced")
|
||||
{
|
||||
LLFloaterReg::hideInstance("prefs_graphics_advanced");
|
||||
updateMaxComplexity();
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -1926,6 +1927,8 @@ void LLFloaterPreference::setPersonalInfo(const std::string& visibility, bool im
|
|||
getChildView("log_path_button")->setEnabled(TRUE);
|
||||
getChildView("chat_font_size")->setEnabled(TRUE);
|
||||
getChildView("conversation_log_combo")->setEnabled(TRUE);
|
||||
getChild<LLUICtrl>("voice_call_friends_only_check")->setEnabled(TRUE);
|
||||
getChild<LLUICtrl>("voice_call_friends_only_check")->setValue(gSavedPerAccountSettings.getBOOL("VoiceCallsFriendsOnly"));
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -2034,6 +2037,14 @@ void LLFloaterPreference::updateMaxComplexity()
|
|||
LLAvatarComplexityControls::updateMax(
|
||||
getChild<LLSliderCtrl>("IndirectMaxComplexity"),
|
||||
getChild<LLTextBox>("IndirectMaxComplexityText"));
|
||||
|
||||
LLFloaterPreferenceGraphicsAdvanced* floater_graphics_advanced = LLFloaterReg::findTypedInstance<LLFloaterPreferenceGraphicsAdvanced>("prefs_graphics_advanced");
|
||||
if (floater_graphics_advanced)
|
||||
{
|
||||
LLAvatarComplexityControls::updateMax(
|
||||
floater_graphics_advanced->getChild<LLSliderCtrl>("IndirectMaxComplexity"),
|
||||
floater_graphics_advanced->getChild<LLTextBox>("IndirectMaxComplexityText"));
|
||||
}
|
||||
}
|
||||
|
||||
bool LLFloaterPreference::loadFromFilename(const std::string& filename, std::map<std::string, std::string> &label_map)
|
||||
|
|
@ -2081,6 +2092,14 @@ void LLFloaterPreferenceGraphicsAdvanced::updateMaxComplexity()
|
|||
LLAvatarComplexityControls::updateMax(
|
||||
getChild<LLSliderCtrl>("IndirectMaxComplexity"),
|
||||
getChild<LLTextBox>("IndirectMaxComplexityText"));
|
||||
|
||||
LLFloaterPreference* floater_preferences = LLFloaterReg::findTypedInstance<LLFloaterPreference>("preferences");
|
||||
if (floater_preferences)
|
||||
{
|
||||
LLAvatarComplexityControls::updateMax(
|
||||
floater_preferences->getChild<LLSliderCtrl>("IndirectMaxComplexity"),
|
||||
floater_preferences->getChild<LLTextBox>("IndirectMaxComplexityText"));
|
||||
}
|
||||
}
|
||||
|
||||
void LLFloaterPreference::onChangeMaturity()
|
||||
|
|
@ -2554,9 +2573,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");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -2659,7 +2682,6 @@ class LLPanelPreferencePrivacy : public LLPanelPreference
|
|||
public:
|
||||
LLPanelPreferencePrivacy()
|
||||
{
|
||||
mAccountIndependentSettings.push_back("VoiceCallsFriendsOnly");
|
||||
mAccountIndependentSettings.push_back("AutoDisengageMic");
|
||||
}
|
||||
|
||||
|
|
@ -2916,6 +2938,7 @@ void LLFloaterPreferenceGraphicsAdvanced::onClickCloseBtn(bool app_quitting)
|
|||
{
|
||||
instance->cancel();
|
||||
}
|
||||
updateMaxComplexity();
|
||||
}
|
||||
|
||||
LLFloaterPreferenceProxy::~LLFloaterPreferenceProxy()
|
||||
|
|
|
|||
|
|
@ -928,7 +928,7 @@ void LLFloaterReporter::takeNewSnapshot()
|
|||
|
||||
// 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);
|
||||
|
|
|
|||
|
|
@ -86,7 +86,10 @@ void LLFloaterSavePrefPreset::onBtnSave()
|
|||
{
|
||||
std::string name = mPresetCombo->getSimple();
|
||||
|
||||
if ((name == LLTrans::getString(PRESETS_DEFAULT)) || (name == PRESETS_DEFAULT))
|
||||
std::string upper_name(name);
|
||||
LLStringUtil::toUpper(upper_name);
|
||||
|
||||
if ((name == LLTrans::getString(PRESETS_DEFAULT)) || (upper_name == PRESETS_DEFAULT_UPPER))
|
||||
{
|
||||
LLNotificationsUtil::add("DefaultPresetNotSaved");
|
||||
}
|
||||
|
|
|
|||
|
|
@ -947,7 +947,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)
|
||||
|
|
@ -1053,7 +1053,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;
|
||||
|
|
@ -1119,13 +1119,22 @@ void LLGroupMgr::processGroupPropertiesReply(LLMessageSystem* msg, void** data)
|
|||
group_datap->mGroupPropertiesDataComplete = true;
|
||||
group_datap->mChanged = TRUE;
|
||||
|
||||
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)
|
||||
|
|
@ -1186,7 +1195,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;
|
||||
}
|
||||
|
|
@ -1210,7 +1219,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)
|
||||
|
|
@ -1271,7 +1280,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);
|
||||
}
|
||||
|
|
@ -1323,7 +1332,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)
|
||||
|
|
@ -1356,7 +1365,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);
|
||||
}
|
||||
}
|
||||
|
|
@ -1368,7 +1377,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;
|
||||
|
|
@ -1384,7 +1393,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);
|
||||
|
|
@ -1404,7 +1413,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);
|
||||
|
|
@ -1488,6 +1497,28 @@ LLGroupMgrGroupData* LLGroupMgr::createGroupData(const LLUUID& id)
|
|||
return group_datap;
|
||||
}
|
||||
|
||||
bool LLGroupMgr::hasPendingPropertyRequest(const LLUUID & id)
|
||||
{
|
||||
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;
|
||||
}
|
||||
|
||||
void LLGroupMgr::notifyObservers(LLGroupChange gc)
|
||||
{
|
||||
for (group_map_t::iterator gi = mGroups.begin(); gi != mGroups.end(); ++gi)
|
||||
|
|
@ -1566,10 +1597,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);
|
||||
|
||||
|
||||
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");
|
||||
|
|
@ -1582,7 +1620,7 @@ void LLGroupMgr::sendGroupPropertiesRequest(const LLUUID& 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())
|
||||
{
|
||||
|
|
@ -1604,7 +1642,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())
|
||||
{
|
||||
|
|
@ -1625,7 +1663,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())
|
||||
|
|
@ -1635,7 +1673,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;
|
||||
|
|
@ -1659,7 +1697,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();
|
||||
|
|
@ -1678,7 +1716,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");
|
||||
|
|
@ -1737,7 +1775,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;
|
||||
|
|
@ -1766,7 +1804,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;
|
||||
|
|
@ -2313,7 +2351,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())
|
||||
|
|
@ -2328,7 +2366,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();
|
||||
|
|
@ -2362,7 +2400,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
|
||||
|
|
@ -2403,7 +2441,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
|
||||
|
|
|
|||
|
|
@ -448,6 +448,8 @@ private:
|
|||
void notifyObserver(const LLUUID& group_id, LLGroupChange gc);
|
||||
void addGroup(LLGroupMgrGroupData* group_datap);
|
||||
LLGroupMgrGroupData* createGroupData(const LLUUID &id);
|
||||
bool hasPendingPropertyRequest(const LLUUID& id);
|
||||
void addPendingPropertyRequest(const LLUUID& id);
|
||||
|
||||
typedef std::multimap<LLUUID,LLGroupMgrObserver*> observer_multimap_t;
|
||||
observer_multimap_t mObservers;
|
||||
|
|
@ -455,6 +457,10 @@ private:
|
|||
typedef std::map<LLUUID, LLGroupMgrGroupData*> group_map_t;
|
||||
group_map_t mGroups;
|
||||
|
||||
const U64MicrosecondsImplicit MIN_GROUP_PROPERTY_REQUEST_FREQ = 100000;//100ms between requests should be enough to avoid spamming.
|
||||
typedef std::map<LLUUID, U64MicrosecondsImplicit> properties_request_map_t;
|
||||
properties_request_map_t mPropRequests;
|
||||
|
||||
typedef std::set<LLParticularGroupObserver*> observer_set_t;
|
||||
typedef std::map<LLUUID,observer_set_t> observer_map_t;
|
||||
observer_map_t mParticularObservers;
|
||||
|
|
|
|||
|
|
@ -415,7 +415,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())
|
||||
|
|
@ -432,18 +433,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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -92,7 +92,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);
|
||||
|
|
|
|||
|
|
@ -450,7 +450,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;
|
||||
BOOL accept_im_from_only_friend = gSavedSettings.getBOOL("VoiceCallsFriendsOnly");
|
||||
BOOL accept_im_from_only_friend = gSavedPerAccountSettings.getBOOL("VoiceCallsFriendsOnly");
|
||||
BOOL is_linden = chat.mSourceType != CHAT_SOURCE_OBJECT &&
|
||||
LLMuteList::getInstance()->isLinden(name);
|
||||
|
||||
|
|
@ -1164,7 +1164,7 @@ void LLIMProcessing::processNewMessage(LLUUID from_id,
|
|||
{
|
||||
return;
|
||||
}
|
||||
else if (gSavedSettings.getBOOL("VoiceCallsFriendsOnly") && (LLAvatarTracker::instance().getBuddyInfo(from_id) == NULL))
|
||||
else if (gSavedPerAccountSettings.getBOOL("VoiceCallsFriendsOnly") && (LLAvatarTracker::instance().getBuddyInfo(from_id) == NULL))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -515,6 +515,7 @@ LLIMModel::LLIMModel()
|
|||
{
|
||||
addNewMsgCallback(boost::bind(&LLFloaterIMSession::newIMCallback, _1));
|
||||
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)
|
||||
|
|
@ -2683,7 +2684,7 @@ void LLIMMgr::addMessage(
|
|||
}
|
||||
bool skip_message = false;
|
||||
bool from_linden = LLMuteList::getInstance()->isLinden(from);
|
||||
if (gSavedSettings.getBOOL("VoiceCallsFriendsOnly") && !from_linden)
|
||||
if (gSavedPerAccountSettings.getBOOL("VoiceCallsFriendsOnly") && !from_linden)
|
||||
{
|
||||
// Evaluate if we need to skip this message when that setting is true (default is false)
|
||||
skip_message = (LLAvatarTracker::instance().getBuddyInfo(other_participant_id) == NULL); // Skip non friends...
|
||||
|
|
@ -2742,7 +2743,7 @@ void LLIMMgr::addMessage(
|
|||
}
|
||||
|
||||
//Play sound for new conversations
|
||||
if (!gAgent.isDoNotDisturb() && (gSavedSettings.getBOOL("PlaySoundNewConversation") == TRUE))
|
||||
if (!skip_message & !gAgent.isDoNotDisturb() && (gSavedSettings.getBOOL("PlaySoundNewConversation") == TRUE))
|
||||
{
|
||||
make_ui_sound("UISndNewIncomingIMSession");
|
||||
}
|
||||
|
|
@ -3072,7 +3073,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));
|
||||
if (isRejectGroupCall || isRejectNonFriendCall || gAgent.isDoNotDisturb())
|
||||
{
|
||||
if (gAgent.isDoNotDisturb() && !isRejectGroupCall && !isRejectNonFriendCall)
|
||||
|
|
|
|||
|
|
@ -4101,12 +4101,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);
|
||||
|
|
|
|||
|
|
@ -192,10 +192,15 @@ bool LLInventoryFilter::checkFolder(const LLUUID& folder_id) const
|
|||
// when applying a filter, matching folders get their contents downloaded first
|
||||
// but make sure we are not interfering with pre-download
|
||||
if (isNotDefault()
|
||||
&& !gInventory.isCategoryComplete(folder_id)
|
||||
&& LLStartUp::getStartupState() > STATE_WEARABLES_WAIT)
|
||||
{
|
||||
LLInventoryModelBackgroundFetch::instance().start(folder_id);
|
||||
{
|
||||
LLViewerInventoryCategory* cat = gInventory.getCategory(folder_id);
|
||||
if (!cat || (cat->getVersion() == LLViewerInventoryCategory::VERSION_UNKNOWN))
|
||||
{
|
||||
// At the moment background fetch only cares about VERSION_UNKNOWN,
|
||||
// so do not check isCategoryComplete that compares descendant count
|
||||
LLInventoryModelBackgroundFetch::instance().start(folder_id);
|
||||
}
|
||||
}
|
||||
|
||||
// Marketplace folder filtering
|
||||
|
|
@ -287,21 +292,34 @@ bool LLInventoryFilter::checkAgainstFilterType(const LLFolderViewModelItemInvent
|
|||
// Pass if this item's type is of the correct filter type
|
||||
if (filterTypes & FILTERTYPE_OBJECT)
|
||||
{
|
||||
|
||||
// If it has no type, pass it, unless it's a link.
|
||||
if (object_type == LLInventoryType::IT_NONE)
|
||||
{
|
||||
if (object && object->getIsLinkType())
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
else if ((1LL << object_type & mFilterOps.mFilterObjectTypes) == U64(0))
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
switch (object_type)
|
||||
{
|
||||
case LLInventoryType::IT_NONE:
|
||||
// If it has no type, pass it, unless it's a link.
|
||||
if (object && object->getIsLinkType())
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
break;
|
||||
case LLInventoryType::IT_UNKNOWN:
|
||||
{
|
||||
// Unknows are only shown when we show every type.
|
||||
// Unknows are 255 and won't fit in 64 bits.
|
||||
if (mFilterOps.mFilterObjectTypes != 0xffffffffffffffffULL)
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
break;
|
||||
}
|
||||
default:
|
||||
if ((1LL << object_type & mFilterOps.mFilterObjectTypes) == U64(0))
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if(filterTypes & FILTERTYPE_WORN)
|
||||
{
|
||||
if (!get_is_item_worn(object_id))
|
||||
|
|
@ -426,18 +444,32 @@ bool LLInventoryFilter::checkAgainstFilterType(const LLInventoryItem* item) cons
|
|||
// Pass if this item's type is of the correct filter type
|
||||
if (filterTypes & FILTERTYPE_OBJECT)
|
||||
{
|
||||
// If it has no type, pass it, unless it's a link.
|
||||
if (object_type == LLInventoryType::IT_NONE)
|
||||
{
|
||||
if (item && item->getIsLinkType())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else if ((1LL << object_type & mFilterOps.mFilterObjectTypes) == U64(0))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
switch (object_type)
|
||||
{
|
||||
case LLInventoryType::IT_NONE:
|
||||
// If it has no type, pass it, unless it's a link.
|
||||
if (item && item->getIsLinkType())
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
break;
|
||||
case LLInventoryType::IT_UNKNOWN:
|
||||
{
|
||||
// Unknows are only shown when we show every type.
|
||||
// Unknows are 255 and won't fit in 64 bits.
|
||||
if (mFilterOps.mFilterObjectTypes != 0xffffffffffffffffULL)
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
break;
|
||||
}
|
||||
default:
|
||||
if ((1LL << object_type & mFilterOps.mFilterObjectTypes) == U64(0))
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
|
|
|||
|
|
@ -1755,41 +1755,7 @@ LLInventoryRecentItemsPanel::LLInventoryRecentItemsPanel( const Params& params)
|
|||
|
||||
/************************************************************************/
|
||||
/* Asset Pre-Filtered Inventory Panel related class */
|
||||
/* Exchanges filter's flexibility for speed of generation and */
|
||||
/* improved performance */
|
||||
/************************************************************************/
|
||||
class LLAssetFilteredInventoryPanel : public LLInventoryPanel
|
||||
{
|
||||
public:
|
||||
struct Params
|
||||
: public LLInitParam::Block<Params, LLInventoryPanel::Params>
|
||||
{
|
||||
Mandatory<std::string> filter_asset_type;
|
||||
|
||||
Params() : filter_asset_type("filter_asset_type") {}
|
||||
};
|
||||
|
||||
void initFromParams(const Params& p);
|
||||
protected:
|
||||
LLAssetFilteredInventoryPanel(const Params& p) : LLInventoryPanel(p) {}
|
||||
friend class LLUICtrlFactory;
|
||||
public:
|
||||
~LLAssetFilteredInventoryPanel() {}
|
||||
|
||||
/*virtual*/ BOOL handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
|
||||
EDragAndDropType cargo_type,
|
||||
void* cargo_data,
|
||||
EAcceptance* accept,
|
||||
std::string& tooltip_msg) override;
|
||||
|
||||
protected:
|
||||
/*virtual*/ LLFolderViewItem* buildNewViews(const LLUUID& id) override;
|
||||
/*virtual*/ void itemChanged(const LLUUID& item_id, U32 mask, const LLInventoryObject* model_item) override;
|
||||
|
||||
private:
|
||||
LLAssetType::EType mAssetType;
|
||||
};
|
||||
|
||||
|
||||
void LLAssetFilteredInventoryPanel::initFromParams(const Params& p)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -338,4 +338,42 @@ private:
|
|||
bool mViewsInitialized; // Views have been generated
|
||||
};
|
||||
|
||||
/************************************************************************/
|
||||
/* Asset Pre-Filtered Inventory Panel related class */
|
||||
/* Exchanges filter's flexibility for speed of generation and */
|
||||
/* improved performance */
|
||||
/************************************************************************/
|
||||
|
||||
class LLAssetFilteredInventoryPanel : public LLInventoryPanel
|
||||
{
|
||||
public:
|
||||
struct Params
|
||||
: public LLInitParam::Block<Params, LLInventoryPanel::Params>
|
||||
{
|
||||
Mandatory<std::string> filter_asset_type;
|
||||
|
||||
Params() : filter_asset_type("filter_asset_type") {}
|
||||
};
|
||||
|
||||
void initFromParams(const Params& p);
|
||||
protected:
|
||||
LLAssetFilteredInventoryPanel(const Params& p) : LLInventoryPanel(p) {}
|
||||
friend class LLUICtrlFactory;
|
||||
public:
|
||||
~LLAssetFilteredInventoryPanel() {}
|
||||
|
||||
/*virtual*/ BOOL handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
|
||||
EDragAndDropType cargo_type,
|
||||
void* cargo_data,
|
||||
EAcceptance* accept,
|
||||
std::string& tooltip_msg) override;
|
||||
|
||||
protected:
|
||||
/*virtual*/ LLFolderViewItem* buildNewViews(const LLUUID& id) override;
|
||||
/*virtual*/ void itemChanged(const LLUUID& item_id, U32 mask, const LLInventoryObject* model_item) override;
|
||||
|
||||
private:
|
||||
LLAssetType::EType mAssetType;
|
||||
};
|
||||
|
||||
#endif // LL_LLINVENTORYPANEL_H
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
@ -154,8 +171,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)
|
||||
|
|
|
|||
|
|
@ -69,9 +69,10 @@ protected:
|
|||
typedef std::map<LLUUID, LLLandmark*> landmark_list_t;
|
||||
landmark_list_t mList;
|
||||
|
||||
typedef std::set<LLUUID> landmark_bad_list_t;
|
||||
landmark_bad_list_t mBadList;
|
||||
|
||||
typedef std::set<LLUUID> landmark_uuid_list_t;
|
||||
landmark_uuid_list_t mBadList;
|
||||
landmark_uuid_list_t mWaitList;
|
||||
|
||||
typedef std::map<LLUUID,F32> landmark_requested_list_t;
|
||||
landmark_requested_list_t mRequestedList;
|
||||
|
||||
|
|
|
|||
|
|
@ -761,8 +761,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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -95,6 +95,7 @@ private:
|
|||
|
||||
LLVector3 mMouseDown;
|
||||
LLVector3 mMouseCur;
|
||||
LLVector3 mAgentSelfAtAxis; // Own agent uses separate rotation method
|
||||
F32 mRadiusMeters;
|
||||
|
||||
LLVector3 mCenterToCam;
|
||||
|
|
|
|||
|
|
@ -1551,7 +1551,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;
|
||||
|
|
@ -1645,7 +1645,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 cache
|
||||
return true;
|
||||
|
|
@ -1792,7 +1792,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;
|
||||
|
|
@ -1800,30 +1800,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)
|
||||
|
|
@ -1869,7 +1878,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)
|
||||
|
|
@ -1914,18 +1923,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;
|
||||
}
|
||||
}
|
||||
|
||||
{
|
||||
|
|
@ -1947,19 +1963,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;
|
||||
}
|
||||
}
|
||||
|
||||
{
|
||||
|
|
@ -1974,7 +1997,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;
|
||||
|
||||
|
|
@ -1991,8 +2014,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<LLVolume> 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))
|
||||
{
|
||||
|
|
@ -2031,7 +2065,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,
|
||||
|
|
@ -3140,15 +3174,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
|
||||
|
|
@ -3428,7 +3468,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 cache for caching
|
||||
LLDiskCache file(mMeshID, LLAssetType::AT_MESH, LLDiskCache::WRITE);
|
||||
|
|
|
|||
|
|
@ -56,6 +56,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;
|
||||
|
||||
|
|
@ -335,11 +337,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);
|
||||
LLSD& getMeshHeader(const LLUUID& mesh_id);
|
||||
|
||||
void notifyLoadedMeshes();
|
||||
|
|
|
|||
|
|
@ -1047,6 +1047,7 @@ void LLOutfitGallery::updateSnapshotFolderObserver()
|
|||
void LLOutfitGallery::refreshOutfit(const LLUUID& category_id)
|
||||
{
|
||||
LLViewerInventoryCategory* category = gInventory.getCategory(category_id);
|
||||
if (category)
|
||||
{
|
||||
bool photo_loaded = false;
|
||||
LLInventoryModel::cat_array_t sub_cat_array;
|
||||
|
|
|
|||
|
|
@ -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<LLUUID>& result)
|
||||
|
|
|
|||
|
|
@ -60,6 +60,8 @@ public:
|
|||
void setExperienceList(const LLSD& experiences);
|
||||
void getExperienceIdsList(std::vector<LLUUID>& result);
|
||||
|
||||
void sortExperiencesList();
|
||||
|
||||
LLExperienceItem* getSelectedExperienceItem();
|
||||
void removeExperiences( const LLSD& ids );
|
||||
void removeExperience( const LLUUID& id);
|
||||
|
|
|
|||
|
|
@ -1109,6 +1109,7 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)
|
|||
|
||||
bool enabled = (editable && isIdenticalPlanarTexgen());
|
||||
childSetValue("checkbox planar align", align_planar && enabled);
|
||||
childSetVisible("checkbox planar align", enabled);
|
||||
childSetEnabled("checkbox planar align", enabled);
|
||||
childSetEnabled("button align textures", enabled && LLSelectMgr::getInstance()->getSelection()->getObjectCount() > 1);
|
||||
|
||||
|
|
|
|||
|
|
@ -36,12 +36,15 @@
|
|||
#include "llpanellandmarks.h"
|
||||
#include "llplacesinventorybridge.h"
|
||||
#include "llviewerfoldertype.h"
|
||||
#include "llsdserialize.h"
|
||||
|
||||
|
||||
#define DEBUGGING_FRESHNESS 0
|
||||
|
||||
const LLColor4U DEFAULT_WHITE(255, 255, 255);
|
||||
|
||||
const std::string NEW_INBOX_FILENAME("inbox_new_items.xml");
|
||||
|
||||
//
|
||||
// statics
|
||||
//
|
||||
|
|
@ -57,7 +60,9 @@ static LLDefaultChildRegistry::Register<LLInboxFolderViewItem> r3("inbox_folder_
|
|||
|
||||
LLInboxInventoryPanel::LLInboxInventoryPanel(const LLInboxInventoryPanel::Params& p)
|
||||
: LLInventoryPanel(p)
|
||||
{}
|
||||
{
|
||||
LLInboxNewItemsStorage::getInstance()->load();
|
||||
}
|
||||
|
||||
LLInboxInventoryPanel::~LLInboxInventoryPanel()
|
||||
{}
|
||||
|
|
@ -127,7 +132,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();
|
||||
}
|
||||
|
|
@ -145,6 +150,12 @@ void LLInboxFolderViewFolder::draw()
|
|||
setBadgeVisibility(mFresh);
|
||||
|
||||
LLFolderViewFolder::draw();
|
||||
|
||||
if (mFresh)
|
||||
{
|
||||
reshapeBadge(getRect());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
BOOL LLInboxFolderViewFolder::handleMouseDown( S32 x, S32 y, MASK mask )
|
||||
|
|
@ -167,11 +178,12 @@ void LLInboxFolderViewFolder::selectItem()
|
|||
|
||||
void LLInboxFolderViewFolder::computeFreshness()
|
||||
{
|
||||
LLFolderViewModelItemInventory* view_model = static_cast<LLFolderViewModelItemInventory*>(getViewModelItem());
|
||||
const U32 last_expansion_utc = gSavedPerAccountSettings.getU32("LastInventoryInboxActivity");
|
||||
|
||||
if (last_expansion_utc > 0)
|
||||
{
|
||||
mFresh = (static_cast<LLFolderViewModelItemInventory*>(getViewModelItem())->getCreationDate() > last_expansion_utc);
|
||||
mFresh = (view_model->getCreationDate() > last_expansion_utc) || LLInboxNewItemsStorage::getInstance()->isItemFresh(view_model->getUUID());
|
||||
|
||||
#if DEBUGGING_FRESHNESS
|
||||
if (mFresh)
|
||||
|
|
@ -184,6 +196,11 @@ void LLInboxFolderViewFolder::computeFreshness()
|
|||
{
|
||||
mFresh = true;
|
||||
}
|
||||
|
||||
if (mFresh)
|
||||
{
|
||||
LLInboxNewItemsStorage::getInstance()->addFreshItem(view_model->getUUID());
|
||||
}
|
||||
}
|
||||
|
||||
void LLInboxFolderViewFolder::deFreshify()
|
||||
|
|
@ -191,6 +208,7 @@ void LLInboxFolderViewFolder::deFreshify()
|
|||
mFresh = false;
|
||||
|
||||
gSavedPerAccountSettings.setU32("LastInventoryInboxActivity", time_corrected());
|
||||
LLInboxNewItemsStorage::getInstance()->removeItem(static_cast<LLFolderViewModelItemInventory*>(getViewModelItem())->getUUID());
|
||||
}
|
||||
|
||||
//
|
||||
|
|
@ -271,5 +289,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<LLUUID>::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
|
||||
|
|
|
|||
|
|
@ -113,4 +113,23 @@ protected:
|
|||
bool mFresh;
|
||||
};
|
||||
|
||||
class LLInboxNewItemsStorage : public LLSingleton<LLInboxNewItemsStorage>
|
||||
, public LLDestroyClass<LLInboxNewItemsStorage>
|
||||
{
|
||||
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<LLUUID> mNewItemsIDs;
|
||||
};
|
||||
|
||||
#endif //LL_INBOXINVENTORYPANEL_H
|
||||
|
|
|
|||
|
|
@ -55,6 +55,7 @@ LLPanelOutfitsInventory::LLPanelOutfitsInventory() :
|
|||
mMyOutfitsPanel(NULL),
|
||||
mCurrentOutfitPanel(NULL),
|
||||
mActivePanel(NULL),
|
||||
mAppearanceTabs(NULL),
|
||||
mInitialized(false)
|
||||
{
|
||||
gAgentWearables.addLoadedCallback(boost::bind(&LLPanelOutfitsInventory::onWearablesLoaded, this));
|
||||
|
|
@ -312,6 +313,7 @@ void LLPanelOutfitsInventory::initTabPanels()
|
|||
|
||||
void LLPanelOutfitsInventory::onTabChange()
|
||||
{
|
||||
if (!mAppearanceTabs) return;
|
||||
mActivePanel = dynamic_cast<LLPanelAppearanceTab*>(mAppearanceTabs->getCurrentPanel());
|
||||
if (!mActivePanel) return;
|
||||
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
@ -1141,7 +1144,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
|
||||
|
|
@ -1401,6 +1404,10 @@ bool LLPanelPrimMediaControls::shouldVolumeSliderBeVisible()
|
|||
return mVolumeSliderVisible > 0;
|
||||
}
|
||||
|
||||
bool LLPanelPrimMediaControls::isZoomDistExceeding()
|
||||
{
|
||||
return (gAgentCamera.getCameraPositionGlobal() - mZoomedCameraPos).normalize() >= EXCEEDING_ZOOM_DISTANCE;
|
||||
}
|
||||
|
||||
void LLPanelPrimMediaControls::clearFaceOnFade()
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -43,9 +43,8 @@ static LLDefaultChildRegistry::Register<LLPlacesInventoryPanel> r("places_invent
|
|||
static const LLPlacesInventoryBridgeBuilder PLACES_INVENTORY_BUILDER;
|
||||
|
||||
LLPlacesInventoryPanel::LLPlacesInventoryPanel(const Params& p) :
|
||||
LLInventoryPanel(p),
|
||||
LLAssetFilteredInventoryPanel(p),
|
||||
mSavedFolderState(NULL)
|
||||
|
||||
{
|
||||
mInvFVBridgeBuilder = &PLACES_INVENTORY_BUILDER;
|
||||
mSavedFolderState = new LLSaveFolderState();
|
||||
|
|
|
|||
|
|
@ -32,14 +32,16 @@
|
|||
class LLLandmarksPanel;
|
||||
class LLFolderView;
|
||||
|
||||
class LLPlacesInventoryPanel : public LLInventoryPanel
|
||||
class LLPlacesInventoryPanel : public LLAssetFilteredInventoryPanel
|
||||
{
|
||||
public:
|
||||
struct Params
|
||||
: public LLInitParam::Block<Params, LLInventoryPanel::Params>
|
||||
: public LLInitParam::Block<Params, LLAssetFilteredInventoryPanel::Params>
|
||||
{
|
||||
Params()
|
||||
{}
|
||||
{
|
||||
filter_asset_type = "landmark";
|
||||
}
|
||||
};
|
||||
|
||||
LLPlacesInventoryPanel(const Params& p);
|
||||
|
|
|
|||
|
|
@ -33,6 +33,7 @@
|
|||
#include <map>
|
||||
|
||||
static const std::string PRESETS_DEFAULT = "Default";
|
||||
static const std::string PRESETS_DEFAULT_UPPER = "DEFAULT";
|
||||
static const std::string PRESETS_DIR = "presets";
|
||||
static const std::string PRESETS_GRAPHIC = "graphic";
|
||||
static const std::string PRESETS_CAMERA = "camera";
|
||||
|
|
|
|||
|
|
@ -404,28 +404,30 @@ void LLProgressView::initLogos()
|
|||
// with no internal paddings so it gets additional padding
|
||||
icon_width = 77;
|
||||
icon_height = 21;
|
||||
S32 pad_y = 4;
|
||||
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
|
||||
#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 //LL_HAVOK
|
||||
|
||||
// 108x41
|
||||
icon_width = 74;
|
||||
|
|
@ -545,6 +547,7 @@ void LLProgressView::onCancelButtonClicked(void*)
|
|||
// cancel is pressed while teleporting inside region (EXT-4911)
|
||||
if (LLStartUp::getStartupState() < STATE_STARTED)
|
||||
{
|
||||
LL_INFOS() << "User requesting quit during login" << LL_ENDL;
|
||||
LLAppViewer::instance()->requestQuit();
|
||||
}
|
||||
else
|
||||
|
|
|
|||
|
|
@ -154,3 +154,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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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()));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -924,9 +924,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));
|
||||
}
|
||||
|
|
|
|||
|
|
@ -303,6 +303,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
|
||||
|
|
@ -3910,11 +3931,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;
|
||||
}
|
||||
|
|
@ -5130,18 +5151,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<LLSelectNode*> nodes_to_send;
|
||||
|
||||
|
|
@ -6851,51 +6881,26 @@ void LLSelectMgr::pauseAssociatedAvatars()
|
|||
|
||||
mSelectedObjects->mSelectType = getSelectTypeForObject(object);
|
||||
|
||||
bool is_attached = false;
|
||||
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());
|
||||
}
|
||||
mPauseRequests.push_back(gAgentAvatarp->requestPause());
|
||||
}
|
||||
else
|
||||
{
|
||||
// Is a regular attachment. Pause the avatar it's attached to.
|
||||
mPauseRequests.push_back(gAgentAvatarp->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());
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -458,6 +458,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
|
||||
|
|
@ -725,7 +732,7 @@ public:
|
|||
|
||||
LLPermissions* findObjectPermissions(const LLViewerObject* object);
|
||||
|
||||
BOOL isSelfAvatarSelected();
|
||||
BOOL isMovableAvatarSelected();
|
||||
|
||||
void selectDelete(); // Delete on simulator
|
||||
void selectForceDelete(); // just delete, no into trash
|
||||
|
|
|
|||
|
|
@ -3448,7 +3448,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)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -916,9 +916,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
|
||||
|
||||
|
|
@ -1097,6 +1097,8 @@ bool idle_startup()
|
|||
// Its either downloading or declined.
|
||||
// If optional was skipped this case shouldn't
|
||||
// be reached.
|
||||
|
||||
LL_INFOS("LLStartup") << "Forcing a quit due to update." << LL_ENDL;
|
||||
LLLoginInstance::getInstance()->disconnect();
|
||||
LLAppViewer::instance()->forceQuit();
|
||||
}
|
||||
|
|
@ -1117,7 +1119,24 @@ bool idle_startup()
|
|||
{
|
||||
// This was a certificate error, so grab the certificate
|
||||
// and throw up the appropriate dialog.
|
||||
LLPointer<LLCertificate> certificate = gSecAPIHandler->getCertificate(response["certificate"]);
|
||||
LLPointer<LLCertificate> 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);
|
||||
|
|
|
|||
|
|
@ -139,17 +139,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);
|
||||
}
|
||||
|
||||
|
|
@ -346,7 +346,7 @@ BOOL LLFloaterTexturePicker::postBuild()
|
|||
}
|
||||
mTentativeLabel = getChild<LLTextBox>("Multiple");
|
||||
|
||||
mResolutionLabel = getChild<LLTextBox>("unknown");
|
||||
mResolutionLabel = getChild<LLTextBox>("size_lbl");
|
||||
|
||||
|
||||
childSetAction("Default",LLFloaterTexturePicker::onBtnSetToDefault,this);
|
||||
|
|
@ -362,9 +362,9 @@ BOOL LLFloaterTexturePicker::postBuild()
|
|||
|
||||
mInventoryPanel = getChild<LLInventoryPanel>("inventory panel");
|
||||
|
||||
mModeSelector = getChild<LLRadioGroup>("mode_selection");
|
||||
mModeSelector = getChild<LLComboBox>("mode_selection");
|
||||
mModeSelector->setCommitCallback(onModeSelect, this);
|
||||
mModeSelector->setSelectedIndex(0, 0);
|
||||
mModeSelector->selectByValue(0);
|
||||
|
||||
if(mInventoryPanel)
|
||||
{
|
||||
|
|
@ -755,7 +755,7 @@ void LLFloaterTexturePicker::onSelectionChange(const std::deque<LLFolderViewItem
|
|||
void LLFloaterTexturePicker::onModeSelect(LLUICtrl* ctrl, void *userdata)
|
||||
{
|
||||
LLFloaterTexturePicker* self = (LLFloaterTexturePicker*) userdata;
|
||||
int index = self->mModeSelector->getSelectedIndex();
|
||||
int index = self->mModeSelector->getValue().asInteger();
|
||||
|
||||
self->getChild<LLButton>("Default")->setVisible(index == 0 ? TRUE : FALSE);
|
||||
self->getChild<LLButton>("Blank")->setVisible(index == 0 ? TRUE : FALSE);
|
||||
|
|
@ -1082,7 +1082,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)
|
||||
|
|
@ -1090,18 +1090,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);
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue