merge 4.0.4-release and MAINT-5974
commit
950c41d184
1
.hgtags
1
.hgtags
|
|
@ -514,3 +514,4 @@ ae3297cdd03ab14f19f3811acbc4acd3eb600336 4.0.0-release
|
|||
759710a9acef61aaf7b69f4bc4a5a913de87ad8a 4.0.1-release
|
||||
e9d350764dfbf5a46229e627547ef5c1b1eeef00 4.0.2-release
|
||||
86dfba7ec4332c323025ebeacd8bf343ed0d8cfd 4.0.3-release
|
||||
0a5de9ec2cb868f367501024d8d6958c20869053 4.0.4-release
|
||||
|
|
|
|||
|
|
@ -335,7 +335,7 @@ Cinder Roxley
|
|||
STORM-2037
|
||||
STORM-2053
|
||||
STORM-2113
|
||||
STORM-2098
|
||||
STORM-2127
|
||||
Clara Young
|
||||
Coaldust Numbers
|
||||
VWR-1095
|
||||
|
|
|
|||
|
|
@ -229,6 +229,28 @@ LLSD llcoro::postAndSuspend(const LLSD& event, const LLEventPumpOrPumpName& requ
|
|||
return value;
|
||||
}
|
||||
|
||||
LLSD llcoro::suspendUntilEventOnWithTimeout(const LLEventPumpOrPumpName& suspendPumpOrName,
|
||||
F32 timeoutin, const LLSD &timeoutResult)
|
||||
{
|
||||
/**
|
||||
* The timeout pump is attached upstream of of the waiting pump and will
|
||||
* pass the timeout event through it. We CAN NOT attach downstream since
|
||||
* doing so will cause the suspendPump to fire any waiting events immediately
|
||||
* and they will be lost. This becomes especially problematic with the
|
||||
* LLEventTimeout(pump) constructor which will also attempt to fire those
|
||||
* events using the virtual listen_impl method in the not yet fully constructed
|
||||
* timeoutPump.
|
||||
*/
|
||||
LLEventTimeout timeoutPump;
|
||||
LLEventPump &suspendPump = suspendPumpOrName.getPump();
|
||||
|
||||
LLTempBoundListener timeoutListener(timeoutPump.listen(suspendPump.getName(),
|
||||
boost::bind(&LLEventPump::post, &suspendPump, _1)));
|
||||
|
||||
timeoutPump.eventAfter(timeoutin, timeoutResult);
|
||||
return llcoro::suspendUntilEventOn(suspendPump);
|
||||
}
|
||||
|
||||
namespace
|
||||
{
|
||||
|
||||
|
|
|
|||
|
|
@ -147,6 +147,11 @@ LLSD suspendUntilEventOn(const LLEventPumpOrPumpName& pump)
|
|||
return postAndSuspend(LLSD(), LLEventPumpOrPumpName(), pump);
|
||||
}
|
||||
|
||||
/// Suspend the coroutine until an event is fired on the identified pump
|
||||
/// or the timeout duration has elapsed. If the timeout duration
|
||||
/// elapses the specified LLSD is returned.
|
||||
LLSD suspendUntilEventOnWithTimeout(const LLEventPumpOrPumpName& suspendPumpOrName, F32 timeoutin, const LLSD &timeoutResult);
|
||||
|
||||
} // namespace llcoro
|
||||
|
||||
/// return type for two-pump variant of suspendUntilEventOn()
|
||||
|
|
|
|||
|
|
@ -39,9 +39,9 @@
|
|||
#include "llsdutil.h" // llsd_matches()
|
||||
|
||||
LLEventFilter::LLEventFilter(LLEventPump& source, const std::string& name, bool tweak):
|
||||
LLEventStream(name, tweak)
|
||||
LLEventStream(name, tweak),
|
||||
mSource(source.listen(getName(), boost::bind(&LLEventFilter::post, this, _1)))
|
||||
{
|
||||
source.listen(getName(), boost::bind(&LLEventFilter::post, this, _1));
|
||||
}
|
||||
|
||||
LLEventMatching::LLEventMatching(const LLSD& pattern):
|
||||
|
|
|
|||
|
|
@ -49,6 +49,9 @@ public:
|
|||
|
||||
/// Post an event to all listeners
|
||||
virtual bool post(const LLSD& event) = 0;
|
||||
|
||||
private:
|
||||
LLTempBoundListener mSource;
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
@ -181,11 +184,23 @@ protected:
|
|||
private:
|
||||
bool tick(const LLSD&);
|
||||
|
||||
LLBoundListener mMainloop;
|
||||
LLTempBoundListener mMainloop;
|
||||
Action mAction;
|
||||
};
|
||||
|
||||
/// Production implementation of LLEventTimoutBase
|
||||
/**
|
||||
* Production implementation of LLEventTimoutBase.
|
||||
*
|
||||
* @NOTE: Caution should be taken when using the LLEventTimeout(LLEventPump &)
|
||||
* constructor to ensure that the upstream event pump is not an LLEventMaildrop
|
||||
* or any other kind of store and forward pump which may have events outstanding.
|
||||
* Using this constructor will cause the upstream event pump to fire any pending
|
||||
* events and could result in the invocation of a virtual method before the timeout
|
||||
* has been fully constructed. The timeout should instead be connected upstream
|
||||
* from the event pump and attached using the listen method.
|
||||
* See llcoro::suspendUntilEventOnWithTimeout() for an example.
|
||||
*/
|
||||
|
||||
class LL_COMMON_API LLEventTimeout: public LLEventTimeoutBase
|
||||
{
|
||||
public:
|
||||
|
|
|
|||
|
|
@ -616,6 +616,12 @@ public:
|
|||
* a queue. Subsequent attaching listeners will receive stored events from the queue
|
||||
* until a listener indicates that the event has been handled. In order to receive
|
||||
* multiple events from a mail drop the listener must disconnect and reconnect.
|
||||
*
|
||||
* @NOTE: When using an LLEventMailDrop (or LLEventQueue) with a LLEventTimeout or
|
||||
* LLEventFilter attaching the filter downstream using Timeout's constructor will
|
||||
* cause the MailDrop to discharge any of it's stored events. The timeout should
|
||||
* instead be connected upstream using its listen() method.
|
||||
* See llcoro::suspendUntilEventOnWithTimeout() for an example.
|
||||
*/
|
||||
class LL_COMMON_API LLEventMailDrop : public LLEventStream
|
||||
{
|
||||
|
|
|
|||
|
|
@ -48,7 +48,6 @@
|
|||
|
||||
#include <curl/curl.h>
|
||||
#include <openssl/crypto.h>
|
||||
#include <boost/regex.hpp>
|
||||
|
||||
BOOL gBreak = false;
|
||||
BOOL gSent = false;
|
||||
|
|
@ -191,6 +190,7 @@ bool LLCrashLogger::readMinidump(std::string minidump_path)
|
|||
{
|
||||
minidump_stream.seekg(0, std::ios::end);
|
||||
length = (size_t)minidump_stream.tellg();
|
||||
LL_WARNS("CRASHREPORT") << "minidump length "<< length <<LL_ENDL;
|
||||
minidump_stream.seekg(0, std::ios::beg);
|
||||
|
||||
LLSD::Binary data;
|
||||
|
|
|
|||
|
|
@ -118,8 +118,10 @@ public:
|
|||
if (end_y < mBottom) clip_y = end_y - mBottom;
|
||||
// clip_? and delta_? should have same sign, since starting point is in rect
|
||||
// so ratios will be positive
|
||||
F32 ratio_x = ((F32)clip_x / (F32)delta_x);
|
||||
F32 ratio_y = ((F32)clip_y / (F32)delta_y);
|
||||
F32 ratio_x = 0;
|
||||
F32 ratio_y = 0;
|
||||
if (delta_x != 0) ratio_x = ((F32)clip_x / (F32)delta_x);
|
||||
if (delta_y != 0) ratio_y = ((F32)clip_y / (F32)delta_y);
|
||||
if (ratio_x > ratio_y)
|
||||
{
|
||||
// clip along x direction
|
||||
|
|
|
|||
|
|
@ -36,7 +36,8 @@
|
|||
static std::map<std::string, U32> DefaultPoolSizes =
|
||||
boost::assign::map_list_of
|
||||
(std::string("Upload"), 1)
|
||||
(std::string("AIS"), 25);
|
||||
(std::string("AIS"), 1);
|
||||
// *TODO: Rider for the moment keep AIS calls serialized otherwise the COF will tend to get out of sync.
|
||||
|
||||
#define DEFAULT_POOL_SIZE 5
|
||||
|
||||
|
|
|
|||
|
|
@ -41,14 +41,41 @@
|
|||
|
||||
#include "message.h" // for getting the port
|
||||
|
||||
using namespace LLCore;
|
||||
|
||||
using namespace LLCore;
|
||||
|
||||
namespace LLCoreHttpUtil
|
||||
{
|
||||
|
||||
const F32 HTTP_REQUEST_EXPIRY_SECS = 60.0f;
|
||||
|
||||
namespace
|
||||
{
|
||||
const std::string HTTP_LOGBODY_KEY("HTTPLogBodyOnError");
|
||||
|
||||
BoolSettingQuery_t mBoolSettingGet;
|
||||
BoolSettingUpdate_t mBoolSettingPut;
|
||||
|
||||
inline bool getBoolSetting(const std::string &keyname)
|
||||
{
|
||||
if (!mBoolSettingGet || mBoolSettingGet.empty())
|
||||
return(false);
|
||||
return mBoolSettingGet(HTTP_LOGBODY_KEY);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void setPropertyMethods(BoolSettingQuery_t queryfn, BoolSettingUpdate_t updatefn)
|
||||
{
|
||||
mBoolSettingGet = queryfn;
|
||||
mBoolSettingPut = updatefn;
|
||||
|
||||
if (mBoolSettingPut && !mBoolSettingPut.empty())
|
||||
{
|
||||
mBoolSettingPut(HTTP_LOGBODY_KEY, false, "Log the entire HTTP body in the case of an HTTP error.");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void logMessageSuccess(std::string logAuth, std::string url, std::string message)
|
||||
{
|
||||
|
|
@ -293,10 +320,11 @@ void HttpCoroHandler::onCompleted(LLCore::HttpHandle handle, LLCore::HttpRespons
|
|||
bas >> std::noskipws;
|
||||
bodyData.assign(std::istream_iterator<U8>(bas), std::istream_iterator<U8>());
|
||||
httpStatus["error_body"] = LLSD(bodyData);
|
||||
#if 1
|
||||
// commenting out, but keeping since this can be useful for debugging
|
||||
LL_WARNS() << "Returned body=" << std::endl << httpStatus["error_body"].asString() << LL_ENDL;
|
||||
#endif
|
||||
if (getBoolSetting(HTTP_LOGBODY_KEY))
|
||||
{
|
||||
// commenting out, but keeping since this can be useful for debugging
|
||||
LL_WARNS() << "Returned body=" << std::endl << httpStatus["error_body"].asString() << LL_ENDL;
|
||||
}
|
||||
}
|
||||
|
||||
mReplyPump.post(result);
|
||||
|
|
|
|||
|
|
@ -57,7 +57,14 @@
|
|||
///
|
||||
namespace LLCoreHttpUtil
|
||||
{
|
||||
extern const F32 HTTP_REQUEST_EXPIRY_SECS;
|
||||
/// Allow access to to the property settings methods.
|
||||
typedef boost::function<bool(const std::string &)> BoolSettingQuery_t;
|
||||
typedef boost::function<void(const std::string &, bool, const std::string &)> BoolSettingUpdate_t;
|
||||
|
||||
void setPropertyMethods(BoolSettingQuery_t queryfn, BoolSettingUpdate_t updatefn);
|
||||
|
||||
|
||||
extern const F32 HTTP_REQUEST_EXPIRY_SECS;
|
||||
|
||||
/// Attempt to convert a response object's contents to LLSD.
|
||||
/// It is expected that the response body will be of non-zero
|
||||
|
|
|
|||
|
|
@ -345,15 +345,11 @@ void LLGLSLShader::unloadInternal()
|
|||
GLhandleARB obj[1024];
|
||||
GLsizei count;
|
||||
|
||||
glGetAttachedObjectsARB(mProgramObject, 1024, &count, obj);
|
||||
glGetAttachedObjectsARB(mProgramObject, sizeof(obj)/sizeof(obj[0]), &count, obj);
|
||||
for (GLsizei i = 0; i < count; i++)
|
||||
{
|
||||
#if !LL_DARWIN
|
||||
if (glIsProgramARB(obj[i]))
|
||||
#endif
|
||||
{
|
||||
glDeleteObjectARB(obj[i]);
|
||||
}
|
||||
glDetachObjectARB(mProgramObject, obj[i]);
|
||||
glDeleteObjectARB(obj[i]);
|
||||
}
|
||||
|
||||
glDeleteObjectARB(mProgramObject);
|
||||
|
|
|
|||
|
|
@ -112,7 +112,8 @@ void LLGLTexture::setBoostLevel(S32 level)
|
|||
if(mBoostLevel != level)
|
||||
{
|
||||
mBoostLevel = level ;
|
||||
if(mBoostLevel != LLGLTexture::BOOST_NONE)
|
||||
if(mBoostLevel != LLGLTexture::BOOST_NONE
|
||||
&& mBoostLevel != LLGLTexture::BOOST_ICON)
|
||||
{
|
||||
setNoDelete() ;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -83,7 +83,12 @@ void LLIconCtrl::draw()
|
|||
|
||||
// virtual
|
||||
// value might be a string or a UUID
|
||||
void LLIconCtrl::setValue(const LLSD& value )
|
||||
void LLIconCtrl::setValue(const LLSD& value)
|
||||
{
|
||||
setValue(value, mPriority);
|
||||
}
|
||||
|
||||
void LLIconCtrl::setValue(const LLSD& value, S32 priority)
|
||||
{
|
||||
LLSD tvalue(value);
|
||||
if (value.isString() && LLUUID::validate(value.asString()))
|
||||
|
|
@ -94,11 +99,11 @@ void LLIconCtrl::setValue(const LLSD& value )
|
|||
LLUICtrl::setValue(tvalue);
|
||||
if (tvalue.isUUID())
|
||||
{
|
||||
mImagep = LLUI::getUIImageByID(tvalue.asUUID(), mPriority);
|
||||
mImagep = LLUI::getUIImageByID(tvalue.asUUID(), priority);
|
||||
}
|
||||
else
|
||||
{
|
||||
mImagep = LLUI::getUIImage(tvalue.asString(), mPriority);
|
||||
mImagep = LLUI::getUIImage(tvalue.asString(), priority);
|
||||
}
|
||||
|
||||
if(mImagep.notNull()
|
||||
|
|
|
|||
|
|
@ -59,6 +59,8 @@ protected:
|
|||
LLIconCtrl(const Params&);
|
||||
friend class LLUICtrlFactory;
|
||||
|
||||
void setValue(const LLSD& value, S32 priority);
|
||||
|
||||
public:
|
||||
virtual ~LLIconCtrl();
|
||||
|
||||
|
|
|
|||
|
|
@ -417,6 +417,7 @@ LLNotificationTemplate::LLNotificationTemplate(const LLNotificationTemplate::Par
|
|||
mExpireOption(p.expire_option),
|
||||
mURLOption(p.url.option),
|
||||
mURLTarget(p.url.target),
|
||||
mForceUrlsExternal(p.force_urls_external),
|
||||
mUnique(p.unique.isProvided()),
|
||||
mCombineBehavior(p.unique.combine),
|
||||
mPriority(p.priority),
|
||||
|
|
@ -748,6 +749,11 @@ S32 LLNotification::getURLOpenExternally() const
|
|||
return(mTemplatep? mTemplatep->mURLTarget == "_external": -1);
|
||||
}
|
||||
|
||||
bool LLNotification::getForceUrlsExternal() const
|
||||
{
|
||||
return (mTemplatep ? mTemplatep->mForceUrlsExternal : false);
|
||||
}
|
||||
|
||||
bool LLNotification::hasUniquenessConstraints() const
|
||||
{
|
||||
return (mTemplatep ? mTemplatep->mUnique : false);
|
||||
|
|
|
|||
|
|
@ -553,7 +553,8 @@ public:
|
|||
std::string getLabel() const;
|
||||
std::string getURL() const;
|
||||
S32 getURLOption() const;
|
||||
S32 getURLOpenExternally() const;
|
||||
S32 getURLOpenExternally() const; //for url responce option
|
||||
bool getForceUrlsExternal() const;
|
||||
bool canLogToChat() const;
|
||||
bool canLogToIM() const;
|
||||
bool canShowToast() const;
|
||||
|
|
|
|||
|
|
@ -177,7 +177,8 @@ struct LLNotificationTemplate
|
|||
Optional<bool> persist,
|
||||
log_to_im,
|
||||
show_toast,
|
||||
log_to_chat;
|
||||
log_to_chat,
|
||||
force_urls_external;
|
||||
Optional<std::string> functor,
|
||||
icon,
|
||||
label,
|
||||
|
|
@ -201,6 +202,7 @@ struct LLNotificationTemplate
|
|||
log_to_im("log_to_im", false),
|
||||
show_toast("show_toast", true),
|
||||
log_to_chat("log_to_chat", true),
|
||||
force_urls_external("force_urls_external", false),
|
||||
functor("functor"),
|
||||
icon("icon"),
|
||||
label("label"),
|
||||
|
|
@ -284,11 +286,16 @@ struct LLNotificationTemplate
|
|||
// that URL. Obsolete this and eliminate the buttons for affected
|
||||
// messages when we allow clickable URLs in the UI
|
||||
U32 mURLOption;
|
||||
|
||||
std::string mURLTarget;
|
||||
//This is a flag that tells if the url needs to open externally dispite
|
||||
|
||||
//This is a flag that tells if option url needs to open externally dispite
|
||||
//what the user setting is.
|
||||
|
||||
std::string mURLTarget;
|
||||
|
||||
// All links clicked inside notification will be opened in external browser
|
||||
// Note: Some notifications block and exit viewer, yet they provide a link
|
||||
// to click, we should be able to open such links in external browser.
|
||||
bool mForceUrlsExternal;
|
||||
|
||||
// does this notification persist across sessions? if so, it will be
|
||||
// serialized to disk on first receipt and read on startup
|
||||
bool mPersist;
|
||||
|
|
|
|||
|
|
@ -179,6 +179,18 @@ BOOL LLRadioGroup::setSelectedIndex(S32 index, BOOL from_event)
|
|||
return FALSE;
|
||||
}
|
||||
|
||||
if (index < -1)
|
||||
{
|
||||
// less then minimum value
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (index < 0 && mSelectedIndex >= 0 && !mAllowDeselect)
|
||||
{
|
||||
// -1 is "nothing selected"
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (mSelectedIndex >= 0)
|
||||
{
|
||||
LLRadioCtrl* old_radio_item = mRadioButtons[mSelectedIndex];
|
||||
|
|
|
|||
|
|
@ -164,6 +164,7 @@ LLTextBase::Params::Params()
|
|||
trusted_content("trusted_content", true),
|
||||
use_ellipses("use_ellipses", false),
|
||||
parse_urls("parse_urls", false),
|
||||
force_urls_external("force_urls_external", false),
|
||||
parse_highlights("parse_highlights", false)
|
||||
{
|
||||
addSynonym(track_end, "track_bottom");
|
||||
|
|
@ -216,6 +217,7 @@ LLTextBase::LLTextBase(const LLTextBase::Params &p)
|
|||
mWordWrap(p.wrap),
|
||||
mUseEllipses( p.use_ellipses ),
|
||||
mParseHTML(p.parse_urls),
|
||||
mForceUrlsExternal(p.force_urls_external),
|
||||
mParseHighlights(p.parse_highlights),
|
||||
mBGVisible(p.bg_visible),
|
||||
mScroller(NULL),
|
||||
|
|
@ -1938,7 +1940,7 @@ void LLTextBase::createUrlContextMenu(S32 x, S32 y, const std::string &in_url)
|
|||
registrar.add("Url.Open", boost::bind(&LLUrlAction::openURL, url));
|
||||
registrar.add("Url.OpenInternal", boost::bind(&LLUrlAction::openURLInternal, url));
|
||||
registrar.add("Url.OpenExternal", boost::bind(&LLUrlAction::openURLExternal, url));
|
||||
registrar.add("Url.Execute", boost::bind(&LLUrlAction::executeSLURL, url));
|
||||
registrar.add("Url.Execute", boost::bind(&LLUrlAction::executeSLURL, url, true));
|
||||
registrar.add("Url.Block", boost::bind(&LLUrlAction::blockObject, url));
|
||||
registrar.add("Url.Teleport", boost::bind(&LLUrlAction::teleportToLocation, url));
|
||||
registrar.add("Url.ShowProfile", boost::bind(&LLUrlAction::showProfile, url));
|
||||
|
|
@ -3228,7 +3230,15 @@ BOOL LLNormalTextSegment::handleMouseUp(S32 x, S32 y, MASK mask)
|
|||
// Only process the click if it's actually in this segment, not to the right of the end-of-line.
|
||||
if(mEditor.getSegmentAtLocalPos(x, y, false) == this)
|
||||
{
|
||||
LLUrlAction::clickAction(getStyle()->getLinkHREF(), mEditor.isContentTrusted());
|
||||
std::string url = getStyle()->getLinkHREF();
|
||||
if (!mEditor.mForceUrlsExternal)
|
||||
{
|
||||
LLUrlAction::clickAction(url, mEditor.isContentTrusted());
|
||||
}
|
||||
else if (!LLUrlAction::executeSLURL(url, mEditor.isContentTrusted()))
|
||||
{
|
||||
LLUrlAction::openURLExternal(url);
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -300,6 +300,7 @@ public:
|
|||
wrap,
|
||||
use_ellipses,
|
||||
parse_urls,
|
||||
force_urls_external,
|
||||
parse_highlights,
|
||||
clip,
|
||||
clip_partial,
|
||||
|
|
@ -655,6 +656,7 @@ protected:
|
|||
S32 mLineSpacingPixels; // padding between lines
|
||||
bool mBorderVisible;
|
||||
bool mParseHTML; // make URLs interactive
|
||||
bool mForceUrlsExternal; // URLs from this textbox will be opened in external browser
|
||||
bool mParseHighlights; // highlight user-defined keywords
|
||||
bool mWordWrap;
|
||||
bool mUseEllipses;
|
||||
|
|
|
|||
|
|
@ -1716,7 +1716,20 @@ void LLTextEditor::unindentLineBeforeCloseBrace()
|
|||
LLWString text = getWText();
|
||||
if( ' ' == text[ mCursorPos - 1 ] )
|
||||
{
|
||||
removeCharOrTab();
|
||||
S32 line = getLineNumFromDocIndex(mCursorPos, false);
|
||||
S32 line_start = getLineStart(line);
|
||||
|
||||
// Jump over spaces in the current line
|
||||
while ((' ' == text[line_start]) && (line_start < mCursorPos))
|
||||
{
|
||||
line_start++;
|
||||
}
|
||||
|
||||
// Make sure there is nothing but ' ' before the Brace we are unindenting
|
||||
if (line_start == mCursorPos)
|
||||
{
|
||||
removeCharOrTab();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1800,7 +1813,7 @@ BOOL LLTextEditor::handleUnicodeCharHere(llwchar uni_char)
|
|||
// Handle most keys only if the text editor is writeable.
|
||||
if( !mReadOnly )
|
||||
{
|
||||
if( '}' == uni_char )
|
||||
if( mAutoIndent && '}' == uni_char )
|
||||
{
|
||||
unindentLineBeforeCloseBrace();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -83,12 +83,13 @@ void LLUrlAction::openURLExternal(std::string url)
|
|||
}
|
||||
}
|
||||
|
||||
void LLUrlAction::executeSLURL(std::string url)
|
||||
bool LLUrlAction::executeSLURL(std::string url, bool trusted_content)
|
||||
{
|
||||
if (sExecuteSLURLCallback)
|
||||
{
|
||||
sExecuteSLURLCallback(url ,true);
|
||||
return sExecuteSLURLCallback(url, trusted_content);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
void LLUrlAction::clickAction(std::string url, bool trusted_content)
|
||||
|
|
|
|||
|
|
@ -57,7 +57,7 @@ public:
|
|||
static void openURLExternal(std::string url);
|
||||
|
||||
/// execute the given secondlife: SLURL
|
||||
static void executeSLURL(std::string url);
|
||||
static bool executeSLURL(std::string url, bool trusted_content = true);
|
||||
|
||||
/// if the Url specifies an SL location, teleport there
|
||||
static void teleportToLocation(std::string url);
|
||||
|
|
|
|||
|
|
@ -25,13 +25,69 @@
|
|||
*/
|
||||
|
||||
#import "llopenglview-objc.h"
|
||||
#include "llwindowmacosx-objc.h"
|
||||
#import "llwindowmacosx-objc.h"
|
||||
#import "llappdelegate-objc.h"
|
||||
|
||||
#pragma mark local functions
|
||||
|
||||
NativeKeyEventData extractKeyDataFromKeyEvent(NSEvent* theEvent)
|
||||
{
|
||||
NativeKeyEventData eventData;
|
||||
eventData.mKeyEvent = NativeKeyEventData::KEYUNKNOWN;
|
||||
eventData.mEventType = [theEvent type];
|
||||
eventData.mEventModifiers = [theEvent modifierFlags];
|
||||
eventData.mEventKeyCode = [theEvent keyCode];
|
||||
NSString *strEventChars = [theEvent characters];
|
||||
eventData.mEventChars = (strEventChars.length) ? [strEventChars characterAtIndex:0] : 0;
|
||||
NSString *strEventUChars = [theEvent charactersIgnoringModifiers];
|
||||
eventData.mEventUnmodChars = (strEventUChars.length) ? [strEventUChars characterAtIndex:0] : 0;
|
||||
eventData.mEventRepeat = [theEvent isARepeat];
|
||||
return eventData;
|
||||
}
|
||||
|
||||
NativeKeyEventData extractKeyDataFromModifierEvent(NSEvent* theEvent)
|
||||
{
|
||||
NativeKeyEventData eventData;
|
||||
eventData.mKeyEvent = NativeKeyEventData::KEYUNKNOWN;
|
||||
eventData.mEventType = [theEvent type];
|
||||
eventData.mEventModifiers = [theEvent modifierFlags];
|
||||
eventData.mEventKeyCode = [theEvent keyCode];
|
||||
return eventData;
|
||||
}
|
||||
|
||||
//---------------------------
|
||||
attributedStringInfo getSegments(NSAttributedString *str)
|
||||
{
|
||||
attributedStringInfo segments;
|
||||
segment_lengths seg_lengths;
|
||||
segment_standouts seg_standouts;
|
||||
NSRange effectiveRange;
|
||||
NSRange limitRange = NSMakeRange(0, [str length]);
|
||||
|
||||
while (limitRange.length > 0) {
|
||||
NSNumber *attr = [str attribute:NSUnderlineStyleAttributeName atIndex:limitRange.location longestEffectiveRange:&effectiveRange inRange:limitRange];
|
||||
limitRange = NSMakeRange(NSMaxRange(effectiveRange), NSMaxRange(limitRange) - NSMaxRange(effectiveRange));
|
||||
|
||||
if (effectiveRange.length <= 0)
|
||||
{
|
||||
effectiveRange.length = 1;
|
||||
}
|
||||
|
||||
if ([attr integerValue] == 2)
|
||||
{
|
||||
seg_lengths.push_back(effectiveRange.length);
|
||||
seg_standouts.push_back(true);
|
||||
} else
|
||||
{
|
||||
seg_lengths.push_back(effectiveRange.length);
|
||||
seg_standouts.push_back(false);
|
||||
}
|
||||
}
|
||||
segments.seg_lengths = seg_lengths;
|
||||
segments.seg_standouts = seg_standouts;
|
||||
return segments;
|
||||
}
|
||||
|
||||
#pragma mark class implementations
|
||||
|
||||
@implementation NSScreen (PointConversion)
|
||||
|
||||
|
|
@ -63,53 +119,6 @@
|
|||
|
||||
@end
|
||||
|
||||
void extractKeyDataFromEvent (NSEvent *theEvent, NativeKeyEventData * eventData)
|
||||
{
|
||||
eventData->mKeyEvent = NativeKeyEventData::KEYUNKNOWN;
|
||||
eventData->mEventType = [theEvent type];
|
||||
eventData->mEventModifiers = [theEvent modifierFlags];
|
||||
eventData->mEventKeyCode = [theEvent keyCode];
|
||||
NSString *strEventChars = [theEvent characters];
|
||||
eventData->mEventChars = (strEventChars.length) ? [strEventChars characterAtIndex:0] : 0;
|
||||
NSString *strEventUChars = [theEvent charactersIgnoringModifiers];
|
||||
eventData->mEventUnmodChars = (strEventUChars.length) ? [strEventUChars characterAtIndex:0] : 0;
|
||||
eventData->mEventRepeat = [theEvent isARepeat];
|
||||
|
||||
}
|
||||
|
||||
|
||||
attributedStringInfo getSegments(NSAttributedString *str)
|
||||
{
|
||||
attributedStringInfo segments;
|
||||
segment_lengths seg_lengths;
|
||||
segment_standouts seg_standouts;
|
||||
NSRange effectiveRange;
|
||||
NSRange limitRange = NSMakeRange(0, [str length]);
|
||||
|
||||
while (limitRange.length > 0) {
|
||||
NSNumber *attr = [str attribute:NSUnderlineStyleAttributeName atIndex:limitRange.location longestEffectiveRange:&effectiveRange inRange:limitRange];
|
||||
limitRange = NSMakeRange(NSMaxRange(effectiveRange), NSMaxRange(limitRange) - NSMaxRange(effectiveRange));
|
||||
|
||||
if (effectiveRange.length <= 0)
|
||||
{
|
||||
effectiveRange.length = 1;
|
||||
}
|
||||
|
||||
if ([attr integerValue] == 2)
|
||||
{
|
||||
seg_lengths.push_back(effectiveRange.length);
|
||||
seg_standouts.push_back(true);
|
||||
} else
|
||||
{
|
||||
seg_lengths.push_back(effectiveRange.length);
|
||||
seg_standouts.push_back(false);
|
||||
}
|
||||
}
|
||||
segments.seg_lengths = seg_lengths;
|
||||
segments.seg_standouts = seg_standouts;
|
||||
return segments;
|
||||
}
|
||||
|
||||
@implementation LLOpenGLView
|
||||
|
||||
// Force a high quality update after live resizing
|
||||
|
|
@ -341,6 +350,9 @@ attributedStringInfo getSegments(NSAttributedString *str)
|
|||
callRightMouseUp(mMousePos, [theEvent modifierFlags]);
|
||||
mSimulatedRightClick = false;
|
||||
} else {
|
||||
NSPoint mPoint = [theEvent locationInWindow];
|
||||
mMousePos[0] = mPoint.x;
|
||||
mMousePos[1] = mPoint.y;
|
||||
callLeftMouseUp(mMousePos, [theEvent modifierFlags]);
|
||||
}
|
||||
}
|
||||
|
|
@ -388,7 +400,7 @@ attributedStringInfo getSegments(NSAttributedString *str)
|
|||
NSPoint mPoint = [theEvent locationInWindow];
|
||||
mMousePos[0] = mPoint.x;
|
||||
mMousePos[1] = mPoint.y;
|
||||
callMouseMoved(mMousePos, 0);
|
||||
callMouseDragged(mMousePos, 0);
|
||||
}
|
||||
|
||||
- (void) otherMouseDown:(NSEvent *)theEvent
|
||||
|
|
@ -423,18 +435,14 @@ attributedStringInfo getSegments(NSAttributedString *str)
|
|||
|
||||
- (void) keyUp:(NSEvent *)theEvent
|
||||
{
|
||||
NativeKeyEventData eventData;
|
||||
|
||||
extractKeyDataFromEvent( theEvent, &eventData );
|
||||
NativeKeyEventData eventData = extractKeyDataFromKeyEvent(theEvent);
|
||||
eventData.mKeyEvent = NativeKeyEventData::KEYUP;
|
||||
callKeyUp(&eventData, [theEvent keyCode], [theEvent modifierFlags]);
|
||||
}
|
||||
|
||||
- (void) keyDown:(NSEvent *)theEvent
|
||||
{
|
||||
NativeKeyEventData eventData;
|
||||
|
||||
extractKeyDataFromEvent( theEvent, &eventData );
|
||||
NativeKeyEventData eventData = extractKeyDataFromKeyEvent(theEvent);
|
||||
eventData.mKeyEvent = NativeKeyEventData::KEYDOWN;
|
||||
|
||||
uint keycode = [theEvent keyCode];
|
||||
|
|
@ -472,9 +480,7 @@ attributedStringInfo getSegments(NSAttributedString *str)
|
|||
|
||||
- (void)flagsChanged:(NSEvent *)theEvent
|
||||
{
|
||||
NativeKeyEventData eventData;
|
||||
|
||||
extractKeyDataFromEvent( theEvent, &eventData );
|
||||
NativeKeyEventData eventData = extractKeyDataFromModifierEvent(theEvent);
|
||||
|
||||
mModifiers = [theEvent modifierFlags];
|
||||
callModifier([theEvent modifierFlags]);
|
||||
|
|
|
|||
|
|
@ -112,6 +112,10 @@ void LLWindowCallbacks::handleMouseMove(LLWindow *window, const LLCoordGL pos, M
|
|||
{
|
||||
}
|
||||
|
||||
void LLWindowCallbacks::handleMouseDragged(LLWindow *window, const LLCoordGL pos, MASK mask)
|
||||
{
|
||||
}
|
||||
|
||||
void LLWindowCallbacks::handleScrollWheel(LLWindow *window, S32 clicks)
|
||||
{
|
||||
}
|
||||
|
|
|
|||
|
|
@ -52,6 +52,7 @@ public:
|
|||
virtual BOOL handleActivate(LLWindow *window, BOOL activated);
|
||||
virtual BOOL handleActivateApp(LLWindow *window, BOOL activating);
|
||||
virtual void handleMouseMove(LLWindow *window, LLCoordGL pos, MASK mask);
|
||||
virtual void handleMouseDragged(LLWindow *window, LLCoordGL pos, MASK mask);
|
||||
virtual void handleScrollWheel(LLWindow *window, S32 clicks);
|
||||
virtual void handleResize(LLWindow *window, S32 width, S32 height);
|
||||
virtual void handleFocus(LLWindow *window);
|
||||
|
|
|
|||
|
|
@ -55,13 +55,13 @@ struct NativeKeyEventData {
|
|||
KEYCHAR
|
||||
};
|
||||
|
||||
EventType mKeyEvent;
|
||||
uint32_t mEventType;
|
||||
uint32_t mEventModifiers;
|
||||
uint32_t mEventKeyCode;
|
||||
uint32_t mEventChars;
|
||||
uint32_t mEventUnmodChars;
|
||||
bool mEventRepeat;
|
||||
EventType mKeyEvent = KEYUNKNOWN;
|
||||
uint32_t mEventType = 0;
|
||||
uint32_t mEventModifiers = 0;
|
||||
uint32_t mEventKeyCode = 0;
|
||||
uint32_t mEventChars = 0;
|
||||
uint32_t mEventUnmodChars = 0;
|
||||
bool mEventRepeat = false;
|
||||
};
|
||||
|
||||
typedef const NativeKeyEventData * NSKeyEventRef;
|
||||
|
|
@ -92,6 +92,7 @@ void setCrossCursor();
|
|||
void setNotAllowedCursor();
|
||||
void hideNSCursor();
|
||||
void showNSCursor();
|
||||
bool isCGCursorVisible();
|
||||
void hideNSCursorTillMove(bool hide);
|
||||
void requestUserAttention();
|
||||
long showAlert(std::string title, std::string text, int type);
|
||||
|
|
@ -133,6 +134,7 @@ void callLeftMouseUp(float *pos, unsigned int mask);
|
|||
void callDoubleClick(float *pos, unsigned int mask);
|
||||
void callResize(unsigned int width, unsigned int height);
|
||||
void callMouseMoved(float *pos, unsigned int mask);
|
||||
void callMouseDragged(float *pos, unsigned int mask);
|
||||
void callScrollMoved(float delta);
|
||||
void callMouseExit();
|
||||
void callWindowFocus();
|
||||
|
|
|
|||
|
|
@ -163,6 +163,11 @@ void showNSCursor()
|
|||
[NSCursor unhide];
|
||||
}
|
||||
|
||||
bool isCGCursorVisible()
|
||||
{
|
||||
return CGCursorIsVisible();
|
||||
}
|
||||
|
||||
void hideNSCursorTillMove(bool hide)
|
||||
{
|
||||
[NSCursor setHiddenUntilMouseMoves:hide];
|
||||
|
|
|
|||
|
|
@ -343,6 +343,18 @@ void callMouseMoved(float *pos, MASK mask)
|
|||
//gWindowImplementation->getCallbacks()->handleScrollWheel(gWindowImplementation, 0);
|
||||
}
|
||||
|
||||
void callMouseDragged(float *pos, MASK mask)
|
||||
{
|
||||
LLCoordGL outCoords;
|
||||
outCoords.mX = ll_round(pos[0]);
|
||||
outCoords.mY = ll_round(pos[1]);
|
||||
float deltas[2];
|
||||
gWindowImplementation->getMouseDeltas(deltas);
|
||||
outCoords.mX += deltas[0];
|
||||
outCoords.mY += deltas[1];
|
||||
gWindowImplementation->getCallbacks()->handleMouseDragged(gWindowImplementation, outCoords, gKeyboard->currentMask(TRUE));
|
||||
}
|
||||
|
||||
void callScrollMoved(float delta)
|
||||
{
|
||||
gWindowImplementation->getCallbacks()->handleScrollWheel(gWindowImplementation, delta);
|
||||
|
|
@ -1445,8 +1457,15 @@ void LLWindowMacOSX::updateCursor()
|
|||
mNextCursor = UI_CURSOR_WORKING;
|
||||
}
|
||||
|
||||
if(mCurrentCursor == mNextCursor)
|
||||
return;
|
||||
if(mCurrentCursor == mNextCursor)
|
||||
{
|
||||
if(mCursorHidden && mHideCursorPermanent && isCGCursorVisible())
|
||||
{
|
||||
hideNSCursor();
|
||||
adjustCursorDecouple();
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
// RN: replace multi-drag cursors with single versions
|
||||
if (mNextCursor == UI_CURSOR_ARROWDRAGMULTI)
|
||||
|
|
|
|||
|
|
@ -186,7 +186,6 @@ set(viewer_SOURCE_FILES
|
|||
lleventpoll.cpp
|
||||
llexpandabletextbox.cpp
|
||||
llexperiencelog.cpp
|
||||
llexperiencelog.cpp
|
||||
llexternaleditor.cpp
|
||||
llface.cpp
|
||||
llfacebookconnect.cpp
|
||||
|
|
@ -2170,6 +2169,10 @@ if (PACKAGE)
|
|||
VERBATIM)
|
||||
|
||||
add_custom_target(generate_breakpad_symbols DEPENDS "${VIEWER_SYMBOL_FILE}" "${VIEWER_BINARY_NAME}" "${VIEWER_COPY_MANIFEST}")
|
||||
add_dependencies(generate_breakpad_symbols "${VIEWER_BINARY_NAME}")
|
||||
if (WINDOWS OR LINUX)
|
||||
add_dependencies(generate_breakpad_symbols "${VIEWER_COPY_MANIFEST}")
|
||||
endif (WINDOWS OR LINUX)
|
||||
add_dependencies(llpackage generate_breakpad_symbols)
|
||||
endif(RELEASE_CRASH_REPORTING OR NON_RELEASE_CRASH_REPORTING)
|
||||
endif (PACKAGE)
|
||||
|
|
|
|||
|
|
@ -1 +1 @@
|
|||
4.0.4
|
||||
4.0.5
|
||||
|
|
|
|||
|
|
@ -4856,6 +4856,17 @@
|
|||
<key>Value</key>
|
||||
<integer>7</integer>
|
||||
</map>
|
||||
<key>InventoryTrashMaxCapacity</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Maximum capacity of the Trash folder. User will ve offered to clean it up when exceeded.</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>U32</string>
|
||||
<key>Value</key>
|
||||
<integer>5000</integer>
|
||||
</map>
|
||||
<key>MarketplaceListingsSortOrder</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
|
|
@ -7004,6 +7015,28 @@
|
|||
<key>Value</key>
|
||||
<integer>1</integer>
|
||||
</map>
|
||||
<key>NotifyMoneySpend</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Pop up notifications when spending L$</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>1</integer>
|
||||
</map>
|
||||
<key>NotifyMoneyReceived</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Pop up notifications when receiving L$</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>1</integer>
|
||||
</map>
|
||||
<key>NotifyTipDuration</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
|
|
@ -8171,6 +8204,17 @@
|
|||
<key>Value</key>
|
||||
<integer>256</integer>
|
||||
</map>
|
||||
<key>RegionCheckTextureHeights</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Don't allow user to set low heights greater than high</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>1</integer>
|
||||
</map>
|
||||
<key>RememberPassword</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
|
|
@ -14449,7 +14493,7 @@
|
|||
<key>Type</key>
|
||||
<string>U32</string>
|
||||
<key>Value</key>
|
||||
<integer>25</integer>
|
||||
<integer>1</integer>
|
||||
</map>
|
||||
<key>PoolSizeUpload</key>
|
||||
<map>
|
||||
|
|
|
|||
|
|
@ -98,7 +98,18 @@
|
|||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>1</integer>
|
||||
</map>
|
||||
</map>
|
||||
<key>NavigationBarRatio</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>The ratio between the width of Navigation layout panel and the width of whole Navigation layout stack</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>F32</string>
|
||||
<key>Value</key>
|
||||
<real>0.6</real>
|
||||
</map>
|
||||
<key>InstantMessageLogPath</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
|
|
|
|||
|
|
@ -36,6 +36,8 @@
|
|||
#include "llsecapi.h"
|
||||
#include <curl/curl.h>
|
||||
|
||||
#include "llcorehttputil.h"
|
||||
|
||||
// Here is where we begin to get our connection usage under control.
|
||||
// This establishes llcorehttp policy classes that, among other
|
||||
// things, limit the maximum number of connections to outside
|
||||
|
|
@ -138,6 +140,9 @@ LLAppCoreHttp::~LLAppCoreHttp()
|
|||
|
||||
void LLAppCoreHttp::init()
|
||||
{
|
||||
LLCoreHttpUtil::setPropertyMethods(
|
||||
boost::bind(&LLControlGroup::getBOOL, boost::ref(gSavedSettings), _1),
|
||||
boost::bind(&LLControlGroup::declareBOOL, boost::ref(gSavedSettings), _1, _2, _3, LLControlVariable::PERSIST_NONDFT));
|
||||
|
||||
LLCore::LLHttp::initialize();
|
||||
|
||||
|
|
|
|||
|
|
@ -65,7 +65,12 @@
|
|||
#pragma warning (disable:4702)
|
||||
#endif
|
||||
|
||||
#if 1
|
||||
namespace
|
||||
{
|
||||
const S32 BAKE_RETRY_MAX_COUNT = 5;
|
||||
const F32 BAKE_RETRY_TIMEOUT = 2.0F;
|
||||
}
|
||||
|
||||
// *TODO$: LLInventoryCallback should be deprecated to conform to the new boost::bind/coroutine model.
|
||||
// temp code in transition
|
||||
void doAppearanceCb(LLPointer<LLInventoryCallback> cb, LLUUID id)
|
||||
|
|
@ -73,8 +78,6 @@ void doAppearanceCb(LLPointer<LLInventoryCallback> cb, LLUUID id)
|
|||
if (cb.notNull())
|
||||
cb->fire(id);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
std::string self_av_string()
|
||||
{
|
||||
|
|
@ -2073,7 +2076,7 @@ void LLAppearanceMgr::updateCOF(const LLUUID& category, bool append)
|
|||
}
|
||||
const LLUUID& base_id = append ? getBaseOutfitUUID() : category;
|
||||
LLViewerInventoryCategory *base_cat = gInventory.getCategory(base_id);
|
||||
if (base_cat)
|
||||
if (base_cat && (base_cat->getPreferredType() == LLFolderType::FT_OUTFIT))
|
||||
{
|
||||
LLSD base_contents;
|
||||
base_contents["name"] = base_cat->getName();
|
||||
|
|
@ -3354,12 +3357,36 @@ LLSD LLAppearanceMgr::dumpCOF() const
|
|||
|
||||
void LLAppearanceMgr::requestServerAppearanceUpdate()
|
||||
{
|
||||
LLCoprocedureManager::CoProcedure_t proc = boost::bind(&LLAppearanceMgr::serverAppearanceUpdateCoro, this, _1);
|
||||
LLCoprocedureManager::instance().enqueueCoprocedure("AIS", "LLAppearanceMgr::serverAppearanceUpdateCoro", proc);
|
||||
if (!mOutstandingAppearanceBakeRequest)
|
||||
{
|
||||
#ifdef APPEARANCEBAKE_AS_IN_AIS_QUEUE
|
||||
mRerequestAppearanceBake = false;
|
||||
LLCoprocedureManager::CoProcedure_t proc = boost::bind(&LLAppearanceMgr::serverAppearanceUpdateCoro, this, _1);
|
||||
LLCoprocedureManager::instance().enqueueCoprocedure("AIS", "LLAppearanceMgr::serverAppearanceUpdateCoro", proc);
|
||||
#else
|
||||
LLCoros::instance().launch("serverAppearanceUpdateCoro",
|
||||
boost::bind(&LLAppearanceMgr::serverAppearanceUpdateCoro, this));
|
||||
|
||||
#endif
|
||||
}
|
||||
else
|
||||
{
|
||||
mRerequestAppearanceBake = true;
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef APPEARANCEBAKE_AS_IN_AIS_QUEUE
|
||||
void LLAppearanceMgr::serverAppearanceUpdateCoro(LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t &httpAdapter)
|
||||
#else
|
||||
void LLAppearanceMgr::serverAppearanceUpdateCoro()
|
||||
#endif
|
||||
{
|
||||
#ifndef APPEARANCEBAKE_AS_IN_AIS_QUEUE
|
||||
LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t httpAdapter(
|
||||
new LLCoreHttpUtil::HttpCoroutineAdapter("serverAppearanceUpdateCoro", LLCore::HttpRequest::DEFAULT_POLICY_ID));
|
||||
#endif
|
||||
|
||||
mRerequestAppearanceBake = false;
|
||||
if (!gAgent.getRegion())
|
||||
{
|
||||
LL_WARNS("Avatar") << "Region not set, cannot request server appearance update" << LL_ENDL;
|
||||
|
|
@ -3386,57 +3413,57 @@ void LLAppearanceMgr::serverAppearanceUpdateCoro(LLCoreHttpUtil::HttpCoroutineAd
|
|||
return;
|
||||
}
|
||||
|
||||
#if 0
|
||||
static int reqcount = 0;
|
||||
int r_count = ++reqcount;
|
||||
LL_WARNS("Avatar") << "START: Server Bake request #" << r_count << "!" << LL_ENDL;
|
||||
#endif
|
||||
|
||||
// If we have already received an update for this or higher cof version,
|
||||
// put a warning in the log but request anyway.
|
||||
S32 cofVersion = getCOFVersion();
|
||||
S32 lastRcv = gAgentAvatarp->mLastUpdateReceivedCOFVersion;
|
||||
S32 lastReq = gAgentAvatarp->mLastUpdateRequestCOFVersion;
|
||||
|
||||
LL_INFOS("Avatar") << "Requesting COF version " << cofVersion <<
|
||||
" (Last Received:" << lastRcv << ")" <<
|
||||
" (Last Requested:" << lastReq << ")" << LL_ENDL;
|
||||
|
||||
if ((cofVersion != LLViewerInventoryCategory::VERSION_UNKNOWN))
|
||||
{
|
||||
if (cofVersion < lastRcv)
|
||||
{
|
||||
LL_WARNS("Avatar") << "Have already received update for cof version " << lastRcv
|
||||
<< " but requesting for " << cofVersion << LL_ENDL;
|
||||
}
|
||||
if (lastReq > cofVersion)
|
||||
{
|
||||
LL_WARNS("Avatar") << "Request already in flight for cof version " << lastReq
|
||||
<< " but requesting for " << cofVersion << LL_ENDL;
|
||||
}
|
||||
}
|
||||
|
||||
// Actually send the request.
|
||||
LL_DEBUGS("Avatar") << "Will send request for cof_version " << cofVersion << LL_ENDL;
|
||||
|
||||
// LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter(
|
||||
// "UpdateAvatarAppearance", gAgent.getAgentPolicy()));
|
||||
|
||||
llcoro::suspend();
|
||||
S32 retryCount(0);
|
||||
bool bRetry;
|
||||
do
|
||||
{
|
||||
BoolSetter outstanding(mOutstandingAppearanceBakeRequest);
|
||||
|
||||
// If we have already received an update for this or higher cof version,
|
||||
// put a warning in the log and cancel the request.
|
||||
S32 cofVersion = getCOFVersion();
|
||||
S32 lastRcv = gAgentAvatarp->mLastUpdateReceivedCOFVersion;
|
||||
S32 lastReq = gAgentAvatarp->mLastUpdateRequestCOFVersion;
|
||||
|
||||
LL_INFOS("Avatar") << "Requesting COF version " << cofVersion <<
|
||||
" (Last Received:" << lastRcv << ")" <<
|
||||
" (Last Requested:" << lastReq << ")" << LL_ENDL;
|
||||
|
||||
if (cofVersion == LLViewerInventoryCategory::VERSION_UNKNOWN)
|
||||
{
|
||||
LL_WARNS("AVatar") << "COF version is unknown... not requesting until COF version is known." << LL_ENDL;
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (cofVersion < lastRcv)
|
||||
{
|
||||
LL_WARNS("Avatar") << "Have already received update for cof version " << lastRcv
|
||||
<< " but requesting for " << cofVersion << LL_ENDL;
|
||||
return;
|
||||
}
|
||||
if (lastReq > cofVersion)
|
||||
{
|
||||
LL_WARNS("Avatar") << "Request already in flight for cof version " << lastReq
|
||||
<< " but requesting for " << cofVersion << LL_ENDL;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// Actually send the request.
|
||||
LL_DEBUGS("Avatar") << "Will send request for cof_version " << cofVersion << LL_ENDL;
|
||||
|
||||
bRetry = false;
|
||||
LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest());
|
||||
|
||||
S32 reqCofVersion = getCOFVersion(); // Treat COF version (gets set by AISAPI as authoritative,
|
||||
// not what the bake request tells us to use).
|
||||
if (gSavedSettings.getBOOL("DebugForceAppearanceRequestFailure"))
|
||||
{
|
||||
reqCofVersion += 999;
|
||||
cofVersion += 999;
|
||||
LL_WARNS("Avatar") << "Forcing version failure on COF Baking" << LL_ENDL;
|
||||
}
|
||||
|
||||
LL_INFOS() << "Requesting bake for COF version " << reqCofVersion << LL_ENDL;
|
||||
LL_INFOS() << "Requesting bake for COF version " << cofVersion << LL_ENDL;
|
||||
|
||||
LLSD postData;
|
||||
if (gSavedSettings.getBOOL("DebugAvatarExperimentalServerAppearanceUpdate"))
|
||||
|
|
@ -3445,10 +3472,10 @@ void LLAppearanceMgr::serverAppearanceUpdateCoro(LLCoreHttpUtil::HttpCoroutineAd
|
|||
}
|
||||
else
|
||||
{
|
||||
postData["cof_version"] = reqCofVersion;
|
||||
postData["cof_version"] = cofVersion;
|
||||
}
|
||||
|
||||
gAgentAvatarp->mLastUpdateRequestCOFVersion = reqCofVersion;
|
||||
gAgentAvatarp->mLastUpdateRequestCOFVersion = cofVersion;
|
||||
|
||||
LLSD result = httpAdapter->postAndSuspend(httpRequest, url, postData);
|
||||
|
||||
|
|
@ -3466,14 +3493,30 @@ void LLAppearanceMgr::serverAppearanceUpdateCoro(LLCoreHttpUtil::HttpCoroutineAd
|
|||
// on multiple machines.
|
||||
if (result.has("expected"))
|
||||
{
|
||||
|
||||
S32 expectedCofVersion = result["expected"].asInteger();
|
||||
LL_WARNS("Avatar") << "Server expected " << expectedCofVersion << " as COF version" << LL_ENDL;
|
||||
|
||||
bRetry = true;
|
||||
// Wait for a 1/2 second before trying again. Just to keep from asking too quickly.
|
||||
llcoro::suspendUntilTimeout(0.5);
|
||||
if (++retryCount > BAKE_RETRY_MAX_COUNT)
|
||||
{
|
||||
LL_WARNS("Avatar") << "Bake retry count exceeded!" << LL_ENDL;
|
||||
break;
|
||||
}
|
||||
F32 timeout = pow(BAKE_RETRY_TIMEOUT, static_cast<float>(retryCount)) - 1.0;
|
||||
|
||||
LL_WARNS("Avatar") << "Server expected " << expectedCofVersion << " as COF version" << LL_ENDL;
|
||||
LL_WARNS("Avatar") << "Bake retry #" << retryCount << " in " << timeout << " seconds." << LL_ENDL;
|
||||
|
||||
llcoro::suspendUntilTimeout(timeout);
|
||||
bRetry = true;
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
LL_WARNS("Avatar") << "No retry attempted." << LL_ENDL;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
LL_DEBUGS("Avatar") << "succeeded" << LL_ENDL;
|
||||
|
|
@ -3484,10 +3527,11 @@ void LLAppearanceMgr::serverAppearanceUpdateCoro(LLCoreHttpUtil::HttpCoroutineAd
|
|||
|
||||
} while (bRetry);
|
||||
|
||||
#if 0
|
||||
LL_WARNS("Avatar") << "END: Server Bake request #" << r_count << "!" << LL_ENDL;
|
||||
#endif
|
||||
|
||||
if (mRerequestAppearanceBake)
|
||||
{ // A bake request came in while this one was still outstanding.
|
||||
// Requeue ourself for a later request.
|
||||
requestServerAppearanceUpdate();
|
||||
}
|
||||
}
|
||||
|
||||
/*static*/
|
||||
|
|
@ -3855,7 +3899,9 @@ LLAppearanceMgr::LLAppearanceMgr():
|
|||
mOutfitLocked(false),
|
||||
mInFlightCounter(0),
|
||||
mInFlightTimer(),
|
||||
mIsInUpdateAppearanceFromCOF(false)
|
||||
mIsInUpdateAppearanceFromCOF(false),
|
||||
mOutstandingAppearanceBakeRequest(false),
|
||||
mRerequestAppearanceBake(false)
|
||||
{
|
||||
LLOutfitObserver& outfit_observer = LLOutfitObserver::instance();
|
||||
// unlock outfit on save operation completed
|
||||
|
|
|
|||
|
|
@ -228,7 +228,12 @@ public:
|
|||
|
||||
|
||||
private:
|
||||
#ifdef APPEARANCEBAKE_AS_IN_AIS_QUEUE
|
||||
void serverAppearanceUpdateCoro(LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t &httpAdapter);
|
||||
#else
|
||||
void serverAppearanceUpdateCoro();
|
||||
#endif
|
||||
|
||||
static void debugAppearanceUpdateCOF(const LLSD& content);
|
||||
|
||||
std::string mAppearanceServiceURL;
|
||||
|
|
@ -255,6 +260,8 @@ private:
|
|||
bool mAttachmentInvLinkEnabled;
|
||||
bool mOutfitIsDirty;
|
||||
bool mIsInUpdateAppearanceFromCOF; // to detect recursive calls.
|
||||
bool mOutstandingAppearanceBakeRequest; // A bake request is outstanding. Do not overlap.
|
||||
bool mRerequestAppearanceBake;
|
||||
|
||||
/**
|
||||
* Lock for blocking operations on outfit until server reply or timeout exceed
|
||||
|
|
|
|||
|
|
@ -2755,7 +2755,7 @@ bool LLAppViewer::initConfiguration()
|
|||
//
|
||||
gWindowTitle = LLTrans::getString("APP_NAME");
|
||||
#if LL_DEBUG
|
||||
gWindowTitle += std::string(" [DEBUG]");
|
||||
gWindowTitle += std::string(" [DEBUG]");
|
||||
#endif
|
||||
if (!gArgs.empty())
|
||||
{
|
||||
|
|
|
|||
|
|
@ -564,7 +564,8 @@ namespace action_give_inventory
|
|||
static LLInventoryPanel* get_active_inventory_panel()
|
||||
{
|
||||
LLInventoryPanel* active_panel = LLInventoryPanel::getActiveInventoryPanel(FALSE);
|
||||
if (!active_panel)
|
||||
LLFloater* floater_appearance = LLFloaterReg::findInstance("appearance");
|
||||
if (!active_panel || (floater_appearance && floater_appearance->hasFocus()))
|
||||
{
|
||||
active_panel = get_outfit_editor_inventory_panel();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -196,7 +196,7 @@ LLAvatarIconCtrl::LLAvatarIconCtrl(const LLAvatarIconCtrl::Params& p)
|
|||
}
|
||||
else
|
||||
{
|
||||
LLIconCtrl::setValue(mDefaultIconName);
|
||||
LLIconCtrl::setValue(mDefaultIconName, LLViewerFetchedTexture::BOOST_UI);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -243,7 +243,7 @@ void LLAvatarIconCtrl::setValue(const LLSD& value)
|
|||
// *TODO: Consider getting avatar icon/badge directly from
|
||||
// People API, rather than sending AvatarPropertyRequest
|
||||
// messages. People API already hits the user table.
|
||||
LLIconCtrl::setValue(mDefaultIconName);
|
||||
LLIconCtrl::setValue(mDefaultIconName, LLViewerFetchedTexture::BOOST_UI);
|
||||
app->addObserver(mAvatarId, this);
|
||||
app->sendAvatarPropertiesRequest(mAvatarId);
|
||||
}
|
||||
|
|
@ -284,7 +284,7 @@ bool LLAvatarIconCtrl::updateFromCache()
|
|||
}
|
||||
else
|
||||
{
|
||||
LLIconCtrl::setValue(mDefaultIconName);
|
||||
LLIconCtrl::setValue(mDefaultIconName, LLViewerFetchedTexture::BOOST_UI);
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1813,7 +1813,7 @@ void LLDrawPoolAvatar::renderRigged(LLVOAvatar* avatar, U32 type, bool glow)
|
|||
LLViewerTexture* specular = NULL;
|
||||
if (LLPipeline::sImpostorRender)
|
||||
{
|
||||
specular = LLViewerTextureManager::findFetchedTexture(gBlackSquareID, TEX_LIST_DISCARD);
|
||||
specular = LLViewerTextureManager::findFetchedTexture(gBlackSquareID, TEX_LIST_STANDARD);
|
||||
llassert(NULL != specular);
|
||||
}
|
||||
else
|
||||
|
|
|
|||
|
|
@ -122,8 +122,6 @@ LLExpandableTextBox::LLTextBoxEx::LLTextBoxEx(const Params& p)
|
|||
void LLExpandableTextBox::LLTextBoxEx::reshape(S32 width, S32 height, BOOL called_from_parent)
|
||||
{
|
||||
LLTextEditor::reshape(width, height, called_from_parent);
|
||||
|
||||
hideOrShowExpandTextAsNeeded();
|
||||
}
|
||||
|
||||
void LLExpandableTextBox::LLTextBoxEx::setText(const LLStringExplicit& text,const LLStyle::Params& input_params)
|
||||
|
|
@ -298,6 +296,12 @@ void LLExpandableTextBox::updateTextBoxRect()
|
|||
|
||||
mTextBox->reshape(rc.getWidth(), rc.getHeight());
|
||||
mTextBox->setRect(rc);
|
||||
// *HACK
|
||||
// hideExpandText brakes text styles (replaces hyper-links with plain text), see ticket EXT-3290
|
||||
// Also text segments are not removed properly. Same issue at expandTextBox().
|
||||
// So set text again to make text box re-apply styles and clear segments.
|
||||
// *TODO Find a solution that does not involve text segment.
|
||||
mTextBox->setText(mText);
|
||||
}
|
||||
|
||||
S32 LLExpandableTextBox::recalculateTextDelta(S32 text_delta)
|
||||
|
|
@ -403,8 +407,6 @@ void LLExpandableTextBox::collapseTextBox()
|
|||
setRect(mCollapsedRect);
|
||||
|
||||
updateTextBoxRect();
|
||||
|
||||
gViewerWindow->removePopup(this);
|
||||
}
|
||||
|
||||
void LLExpandableTextBox::onFocusLost()
|
||||
|
|
@ -423,13 +425,19 @@ void LLExpandableTextBox::onTopLost()
|
|||
|
||||
void LLExpandableTextBox::updateTextShape()
|
||||
{
|
||||
// I guess this should be done on every reshape(),
|
||||
// but adding this code to reshape() currently triggers bug VWR-26455,
|
||||
// which makes the text virtually unreadable.
|
||||
llassert(!mExpanded);
|
||||
updateTextBoxRect();
|
||||
}
|
||||
|
||||
void LLExpandableTextBox::reshape(S32 width, S32 height, BOOL called_from_parent)
|
||||
{
|
||||
mExpanded = false;
|
||||
LLUICtrl::reshape(width, height, called_from_parent);
|
||||
updateTextBoxRect();
|
||||
|
||||
gViewerWindow->removePopup(this);
|
||||
}
|
||||
|
||||
void LLExpandableTextBox::setValue(const LLSD& value)
|
||||
{
|
||||
collapseTextBox();
|
||||
|
|
|
|||
|
|
@ -147,6 +147,7 @@ public:
|
|||
* *HACK: Update the inner textbox shape.
|
||||
*/
|
||||
void updateTextShape();
|
||||
virtual void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE);
|
||||
|
||||
/**
|
||||
* Draws text box, collapses text box if its expanded and its parent's position changed
|
||||
|
|
|
|||
|
|
@ -39,6 +39,7 @@
|
|||
|
||||
#include "llagent.h"
|
||||
#include "llagentaccess.h"
|
||||
#include "llappviewer.h"
|
||||
#include "llbutton.h"
|
||||
#include "llcheckboxctrl.h"
|
||||
#include "llcombobox.h"
|
||||
|
|
@ -475,31 +476,11 @@ BOOL LLPanelLandGeneral::postBuild()
|
|||
mBtnBuyLand = getChild<LLButton>("Buy Land...");
|
||||
mBtnBuyLand->setClickedCallback(onClickBuyLand, (void*)&BUY_PERSONAL_LAND);
|
||||
|
||||
// note: on region change this will not be re checked, should not matter on Agni as
|
||||
// 99% of the time all regions will return the same caps. In case of an erroneous setting
|
||||
// to enabled the floater will just throw an error when trying to get it's cap
|
||||
std::string url = gAgent.getRegion()->getCapability("LandResources");
|
||||
if (!url.empty())
|
||||
{
|
||||
mBtnScriptLimits = getChild<LLButton>("Scripts...");
|
||||
if(mBtnScriptLimits)
|
||||
{
|
||||
mBtnScriptLimits->setClickedCallback(onClickScriptLimits, this);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
mBtnScriptLimits = getChild<LLButton>("Scripts...");
|
||||
if(mBtnScriptLimits)
|
||||
{
|
||||
mBtnScriptLimits->setVisible(false);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
mBtnBuyGroupLand = getChild<LLButton>("Buy For Group...");
|
||||
mBtnBuyGroupLand->setClickedCallback(onClickBuyLand, (void*)&BUY_GROUP_LAND);
|
||||
|
||||
|
||||
|
||||
|
||||
mBtnBuyPass = getChild<LLButton>("Buy Pass...");
|
||||
mBtnBuyPass->setClickedCallback(onClickBuyPass, this);
|
||||
|
||||
|
|
@ -508,10 +489,36 @@ BOOL LLPanelLandGeneral::postBuild()
|
|||
|
||||
mBtnReclaimLand = getChild<LLButton>("Reclaim Land...");
|
||||
mBtnReclaimLand->setClickedCallback(onClickReclaim, NULL);
|
||||
|
||||
|
||||
mBtnStartAuction = getChild<LLButton>("Linden Sale...");
|
||||
mBtnStartAuction->setClickedCallback(onClickStartAuction, this);
|
||||
|
||||
mBtnScriptLimits = getChild<LLButton>("Scripts...");
|
||||
|
||||
if(gDisconnected)
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
// note: on region change this will not be re checked, should not matter on Agni as
|
||||
// 99% of the time all regions will return the same caps. In case of an erroneous setting
|
||||
// to enabled the floater will just throw an error when trying to get it's cap
|
||||
std::string url = gAgent.getRegion()->getCapability("LandResources");
|
||||
if (!url.empty())
|
||||
{
|
||||
if(mBtnScriptLimits)
|
||||
{
|
||||
mBtnScriptLimits->setClickedCallback(onClickScriptLimits, this);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if(mBtnScriptLimits)
|
||||
{
|
||||
mBtnScriptLimits->setVisible(false);
|
||||
}
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
|
@ -524,9 +531,58 @@ LLPanelLandGeneral::~LLPanelLandGeneral()
|
|||
// public
|
||||
void LLPanelLandGeneral::refresh()
|
||||
{
|
||||
mBtnStartAuction->setVisible(gAgent.isGodlike());
|
||||
mEditName->setEnabled(FALSE);
|
||||
mEditName->setText(LLStringUtil::null);
|
||||
|
||||
LLParcel *parcel = mParcel->getParcel();
|
||||
mEditDesc->setEnabled(FALSE);
|
||||
mEditDesc->setText(getString("no_selection_text"));
|
||||
|
||||
mTextSalePending->setText(LLStringUtil::null);
|
||||
mTextSalePending->setEnabled(FALSE);
|
||||
|
||||
mBtnDeedToGroup->setEnabled(FALSE);
|
||||
mBtnSetGroup->setEnabled(FALSE);
|
||||
mBtnStartAuction->setEnabled(FALSE);
|
||||
|
||||
mCheckDeedToGroup ->set(FALSE);
|
||||
mCheckDeedToGroup ->setEnabled(FALSE);
|
||||
mCheckContributeWithDeed->set(FALSE);
|
||||
mCheckContributeWithDeed->setEnabled(FALSE);
|
||||
|
||||
mTextOwner->setText(LLStringUtil::null);
|
||||
mContentRating->setText(LLStringUtil::null);
|
||||
mLandType->setText(LLStringUtil::null);
|
||||
mBtnProfile->setLabel(getString("profile_text"));
|
||||
mBtnProfile->setEnabled(FALSE);
|
||||
|
||||
mTextClaimDate->setText(LLStringUtil::null);
|
||||
mTextGroup->setText(LLStringUtil::null);
|
||||
mTextPrice->setText(LLStringUtil::null);
|
||||
|
||||
mSaleInfoForSale1->setVisible(FALSE);
|
||||
mSaleInfoForSale2->setVisible(FALSE);
|
||||
mSaleInfoForSaleObjects->setVisible(FALSE);
|
||||
mSaleInfoForSaleNoObjects->setVisible(FALSE);
|
||||
mSaleInfoNotForSale->setVisible(FALSE);
|
||||
mBtnSellLand->setVisible(FALSE);
|
||||
mBtnStopSellLand->setVisible(FALSE);
|
||||
|
||||
mTextPriceLabel->setText(LLStringUtil::null);
|
||||
mTextDwell->setText(LLStringUtil::null);
|
||||
|
||||
mBtnBuyLand->setEnabled(FALSE);
|
||||
mBtnScriptLimits->setEnabled(FALSE);
|
||||
mBtnBuyGroupLand->setEnabled(FALSE);
|
||||
mBtnReleaseLand->setEnabled(FALSE);
|
||||
mBtnReclaimLand->setEnabled(FALSE);
|
||||
mBtnBuyPass->setEnabled(FALSE);
|
||||
|
||||
if(gDisconnected)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
mBtnStartAuction->setVisible(gAgent.isGodlike());
|
||||
bool region_owner = false;
|
||||
LLViewerRegion* regionp = LLViewerParcelMgr::getInstance()->getSelectionRegion();
|
||||
if(regionp && (regionp->getOwner() == gAgent.getID()))
|
||||
|
|
@ -540,56 +596,8 @@ void LLPanelLandGeneral::refresh()
|
|||
mBtnReleaseLand->setVisible(TRUE);
|
||||
mBtnReclaimLand->setVisible(FALSE);
|
||||
}
|
||||
if (!parcel)
|
||||
{
|
||||
// nothing selected, disable panel
|
||||
mEditName->setEnabled(FALSE);
|
||||
mEditName->setText(LLStringUtil::null);
|
||||
|
||||
mEditDesc->setEnabled(FALSE);
|
||||
mEditDesc->setText(getString("no_selection_text"));
|
||||
|
||||
mTextSalePending->setText(LLStringUtil::null);
|
||||
mTextSalePending->setEnabled(FALSE);
|
||||
|
||||
mBtnDeedToGroup->setEnabled(FALSE);
|
||||
mBtnSetGroup->setEnabled(FALSE);
|
||||
mBtnStartAuction->setEnabled(FALSE);
|
||||
|
||||
mCheckDeedToGroup ->set(FALSE);
|
||||
mCheckDeedToGroup ->setEnabled(FALSE);
|
||||
mCheckContributeWithDeed->set(FALSE);
|
||||
mCheckContributeWithDeed->setEnabled(FALSE);
|
||||
|
||||
mTextOwner->setText(LLStringUtil::null);
|
||||
mContentRating->setText(LLStringUtil::null);
|
||||
mLandType->setText(LLStringUtil::null);
|
||||
mBtnProfile->setLabel(getString("profile_text"));
|
||||
mBtnProfile->setEnabled(FALSE);
|
||||
|
||||
mTextClaimDate->setText(LLStringUtil::null);
|
||||
mTextGroup->setText(LLStringUtil::null);
|
||||
mTextPrice->setText(LLStringUtil::null);
|
||||
|
||||
mSaleInfoForSale1->setVisible(FALSE);
|
||||
mSaleInfoForSale2->setVisible(FALSE);
|
||||
mSaleInfoForSaleObjects->setVisible(FALSE);
|
||||
mSaleInfoForSaleNoObjects->setVisible(FALSE);
|
||||
mSaleInfoNotForSale->setVisible(FALSE);
|
||||
mBtnSellLand->setVisible(FALSE);
|
||||
mBtnStopSellLand->setVisible(FALSE);
|
||||
|
||||
mTextPriceLabel->setText(LLStringUtil::null);
|
||||
mTextDwell->setText(LLStringUtil::null);
|
||||
|
||||
mBtnBuyLand->setEnabled(FALSE);
|
||||
mBtnScriptLimits->setEnabled(FALSE);
|
||||
mBtnBuyGroupLand->setEnabled(FALSE);
|
||||
mBtnReleaseLand->setEnabled(FALSE);
|
||||
mBtnReclaimLand->setEnabled(FALSE);
|
||||
mBtnBuyPass->setEnabled(FALSE);
|
||||
}
|
||||
else
|
||||
LLParcel *parcel = mParcel->getParcel();
|
||||
if (parcel)
|
||||
{
|
||||
// something selected, hooray!
|
||||
BOOL is_leased = (LLParcel::OS_LEASED == parcel->getOwnershipStatus());
|
||||
|
|
@ -1246,7 +1254,7 @@ void LLPanelLandObjects::refresh()
|
|||
mOwnerList->deleteAllItems();
|
||||
mOwnerList->setEnabled(FALSE);
|
||||
|
||||
if (!parcel)
|
||||
if (!parcel || gDisconnected)
|
||||
{
|
||||
mSWTotalObjects->setTextArg("[COUNT]", llformat("%d", 0));
|
||||
mSWTotalObjects->setTextArg("[TOTAL]", llformat("%d", 0));
|
||||
|
|
@ -1974,7 +1982,7 @@ void LLPanelLandOptions::refresh()
|
|||
refreshSearch();
|
||||
|
||||
LLParcel *parcel = mParcel->getParcel();
|
||||
if (!parcel)
|
||||
if (!parcel || gDisconnected)
|
||||
{
|
||||
mCheckEditObjects ->set(FALSE);
|
||||
mCheckEditObjects ->setEnabled(FALSE);
|
||||
|
|
@ -2154,7 +2162,7 @@ void LLPanelLandOptions::draw()
|
|||
void LLPanelLandOptions::refreshSearch()
|
||||
{
|
||||
LLParcel *parcel = mParcel->getParcel();
|
||||
if (!parcel)
|
||||
if (!parcel || gDisconnected)
|
||||
{
|
||||
mCheckShowDirectory->set(FALSE);
|
||||
mCheckShowDirectory->setEnabled(FALSE);
|
||||
|
|
@ -2419,7 +2427,7 @@ void LLPanelLandAccess::refresh()
|
|||
LLParcel *parcel = mParcel->getParcel();
|
||||
|
||||
// Display options
|
||||
if (parcel)
|
||||
if (parcel && !gDisconnected)
|
||||
{
|
||||
BOOL use_access_list = parcel->getParcelFlag(PF_USE_ACCESS_LIST);
|
||||
BOOL use_group = parcel->getParcelFlag(PF_USE_ACCESS_GROUP);
|
||||
|
|
@ -2599,7 +2607,7 @@ void LLPanelLandAccess::refresh_ui()
|
|||
getChildView("remove_banned")->setEnabled(FALSE);
|
||||
|
||||
LLParcel *parcel = mParcel->getParcel();
|
||||
if (parcel)
|
||||
if (parcel && !gDisconnected)
|
||||
{
|
||||
BOOL can_manage_allowed = LLViewerParcelMgr::isParcelModifiableByAgent(parcel, GP_LAND_MANAGE_ALLOWED);
|
||||
BOOL can_manage_banned = LLViewerParcelMgr::isParcelModifiableByAgent(parcel, GP_LAND_MANAGE_BANNED);
|
||||
|
|
@ -2945,7 +2953,7 @@ BOOL LLPanelLandCovenant::postBuild()
|
|||
void LLPanelLandCovenant::refresh()
|
||||
{
|
||||
LLViewerRegion* region = LLViewerParcelMgr::getInstance()->getSelectionRegion();
|
||||
if(!region) return;
|
||||
if(!region || gDisconnected) return;
|
||||
|
||||
LLTextBox* region_name = getChild<LLTextBox>("region_name_text");
|
||||
if (region_name)
|
||||
|
|
@ -3170,7 +3178,7 @@ void LLPanelLandExperiences::refreshPanel(LLPanelExperienceListEditor* panel, U3
|
|||
{
|
||||
return;
|
||||
}
|
||||
if (parcel == NULL)
|
||||
if (!parcel || gDisconnected)
|
||||
{
|
||||
// disable the panel
|
||||
panel->setEnabled(FALSE);
|
||||
|
|
|
|||
|
|
@ -338,25 +338,25 @@ BOOL LLFloaterModelPreview::postBuild()
|
|||
LLTextBox* text = getChild<LLTextBox>(lod_label_name[i]);
|
||||
if (text)
|
||||
{
|
||||
text->setMouseDownCallback(boost::bind(&LLModelPreview::setPreviewLOD, mModelPreview, i));
|
||||
text->setMouseDownCallback(boost::bind(&LLFloaterModelPreview::setPreviewLOD, this, i));
|
||||
}
|
||||
|
||||
text = getChild<LLTextBox>(lod_triangles_name[i]);
|
||||
if (text)
|
||||
{
|
||||
text->setMouseDownCallback(boost::bind(&LLModelPreview::setPreviewLOD, mModelPreview, i));
|
||||
text->setMouseDownCallback(boost::bind(&LLFloaterModelPreview::setPreviewLOD, this, i));
|
||||
}
|
||||
|
||||
text = getChild<LLTextBox>(lod_vertices_name[i]);
|
||||
if (text)
|
||||
{
|
||||
text->setMouseDownCallback(boost::bind(&LLModelPreview::setPreviewLOD, mModelPreview, i));
|
||||
text->setMouseDownCallback(boost::bind(&LLFloaterModelPreview::setPreviewLOD, this, i));
|
||||
}
|
||||
|
||||
text = getChild<LLTextBox>(lod_status_name[i]);
|
||||
if (text)
|
||||
{
|
||||
text->setMouseDownCallback(boost::bind(&LLModelPreview::setPreviewLOD, mModelPreview, i));
|
||||
text->setMouseDownCallback(boost::bind(&LLFloaterModelPreview::setPreviewLOD, this, i));
|
||||
}
|
||||
}
|
||||
std::string current_grid = LLGridManager::getInstance()->getGridId();
|
||||
|
|
@ -1363,6 +1363,14 @@ void LLFloaterModelPreview::setDetails(F32 x, F32 y, F32 z, F32 streaming_cost,
|
|||
childSetTextArg("import_dimensions", "[Z]", llformat("%.3f", z));
|
||||
}
|
||||
|
||||
void LLFloaterModelPreview::setPreviewLOD(S32 lod)
|
||||
{
|
||||
if (mModelPreview)
|
||||
{
|
||||
mModelPreview->setPreviewLOD(lod);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void LLModelPreview::rebuildUploadData()
|
||||
{
|
||||
|
|
|
|||
|
|
@ -95,6 +95,7 @@ public:
|
|||
static void setUploadAmount(S32 amount) { sUploadAmount = amount; }
|
||||
|
||||
void setDetails(F32 x, F32 y, F32 z, F32 streaming_cost, F32 physics_cost);
|
||||
void setPreviewLOD(S32 lod);
|
||||
|
||||
void onBrowseLOD(S32 lod);
|
||||
|
||||
|
|
|
|||
|
|
@ -233,6 +233,11 @@ BOOL LLFloaterRegionInfo::postBuild()
|
|||
panel->buildFromFile("panel_region_debug.xml");
|
||||
mTab->addTabPanel(panel);
|
||||
|
||||
if(gDisconnected)
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
if(!gAgent.getRegion()->getCapability("RegionExperiences").empty())
|
||||
{
|
||||
panel = new LLPanelRegionExperiences;
|
||||
|
|
@ -256,6 +261,11 @@ LLFloaterRegionInfo::~LLFloaterRegionInfo()
|
|||
|
||||
void LLFloaterRegionInfo::onOpen(const LLSD& key)
|
||||
{
|
||||
if(gDisconnected)
|
||||
{
|
||||
disableTabCtrls();
|
||||
return;
|
||||
}
|
||||
refreshFromRegion(gAgent.getRegion());
|
||||
requestRegionInfo();
|
||||
requestMeshRezInfo();
|
||||
|
|
@ -479,7 +489,16 @@ LLPanelRegionExperiences* LLFloaterRegionInfo::getPanelExperiences()
|
|||
return (LLPanelRegionExperiences*)tab->getChild<LLPanel>("Experiences");
|
||||
}
|
||||
|
||||
void LLFloaterRegionInfo::disableTabCtrls()
|
||||
{
|
||||
LLTabContainer* tab = getChild<LLTabContainer>("region_panels");
|
||||
|
||||
tab->getChild<LLPanel>("General")->setCtrlsEnabled(FALSE);
|
||||
tab->getChild<LLPanel>("Debug")->setCtrlsEnabled(FALSE);
|
||||
tab->getChild<LLPanel>("Terrain")->setCtrlsEnabled(FALSE);
|
||||
tab->getChild<LLPanel>("panel_env_info")->setCtrlsEnabled(FALSE);
|
||||
tab->getChild<LLPanel>("Estate")->setCtrlsEnabled(FALSE);
|
||||
}
|
||||
|
||||
void LLFloaterRegionInfo::onTabSelected(const LLSD& param)
|
||||
{
|
||||
|
|
@ -1160,6 +1179,22 @@ BOOL LLPanelRegionTerrainInfo::validateTextureSizes()
|
|||
return TRUE;
|
||||
}
|
||||
|
||||
BOOL LLPanelRegionTerrainInfo::validateTextureHeights()
|
||||
{
|
||||
for (S32 i = 0; i < CORNER_COUNT; ++i)
|
||||
{
|
||||
std::string low = llformat("height_start_spin_%d", i);
|
||||
std::string high = llformat("height_range_spin_%d", i);
|
||||
|
||||
if (getChild<LLUICtrl>(low)->getValue().asReal() > getChild<LLUICtrl>(high)->getValue().asReal())
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// LLPanelRegionTerrainInfo
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
|
@ -1192,6 +1227,9 @@ BOOL LLPanelRegionTerrainInfo::postBuild()
|
|||
childSetAction("upload_raw_btn", onClickUploadRaw, this);
|
||||
childSetAction("bake_terrain_btn", onClickBakeTerrain, this);
|
||||
|
||||
mAskedTextureHeights = false;
|
||||
mConfirmedTextureHeights = false;
|
||||
|
||||
return LLPanelRegionInfo::postBuild();
|
||||
}
|
||||
|
||||
|
|
@ -1274,6 +1312,21 @@ BOOL LLPanelRegionTerrainInfo::sendUpdate()
|
|||
return FALSE;
|
||||
}
|
||||
|
||||
// Check if terrain Elevation Ranges are correct
|
||||
if (gSavedSettings.getBOOL("RegionCheckTextureHeights") && !validateTextureHeights())
|
||||
{
|
||||
if (!mAskedTextureHeights)
|
||||
{
|
||||
LLNotificationsUtil::add("ConfirmTextureHeights", LLSD(), LLSD(), boost::bind(&LLPanelRegionTerrainInfo::callbackTextureHeights, this, _1, _2));
|
||||
mAskedTextureHeights = true;
|
||||
return FALSE;
|
||||
}
|
||||
else if (!mConfirmedTextureHeights)
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
LLTextureCtrl* texture_ctrl;
|
||||
std::string id_str;
|
||||
LLMessageSystem* msg = gMessageSystem;
|
||||
|
|
@ -1314,6 +1367,29 @@ BOOL LLPanelRegionTerrainInfo::sendUpdate()
|
|||
return TRUE;
|
||||
}
|
||||
|
||||
bool LLPanelRegionTerrainInfo::callbackTextureHeights(const LLSD& notification, const LLSD& response)
|
||||
{
|
||||
S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
|
||||
if (option == 0) // ok
|
||||
{
|
||||
mConfirmedTextureHeights = true;
|
||||
}
|
||||
else if (option == 1) // cancel
|
||||
{
|
||||
mConfirmedTextureHeights = false;
|
||||
}
|
||||
else if (option == 2) // don't ask
|
||||
{
|
||||
gSavedSettings.setBOOL("RegionCheckTextureHeights", FALSE);
|
||||
mConfirmedTextureHeights = true;
|
||||
}
|
||||
|
||||
onBtnSet();
|
||||
|
||||
mAskedTextureHeights = false;
|
||||
return false;
|
||||
}
|
||||
|
||||
// static
|
||||
void LLPanelRegionTerrainInfo::onClickDownloadRaw(void* data)
|
||||
{
|
||||
|
|
@ -3018,6 +3094,11 @@ bool LLPanelEnvironmentInfo::refreshFromRegion(LLViewerRegion* region)
|
|||
|
||||
void LLPanelEnvironmentInfo::refresh()
|
||||
{
|
||||
if(gDisconnected)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
populateWaterPresetsList();
|
||||
populateSkyPresetsList();
|
||||
populateDayCyclesList();
|
||||
|
|
|
|||
|
|
@ -113,6 +113,7 @@ private:
|
|||
|
||||
protected:
|
||||
void onTabSelected(const LLSD& param);
|
||||
void disableTabCtrls();
|
||||
void refreshFromRegion(LLViewerRegion* region);
|
||||
|
||||
// member data
|
||||
|
|
@ -240,6 +241,7 @@ public:
|
|||
void setEnvControls(bool available); // Whether environment settings are available for this region
|
||||
|
||||
BOOL validateTextureSizes();
|
||||
BOOL validateTextureHeights();
|
||||
|
||||
//static void onChangeAnything(LLUICtrl* ctrl, void* userData); // callback for any change, to enable commit button
|
||||
|
||||
|
|
@ -249,6 +251,11 @@ public:
|
|||
static void onClickUploadRaw(void*);
|
||||
static void onClickBakeTerrain(void*);
|
||||
bool callbackBakeTerrain(const LLSD& notification, const LLSD& response);
|
||||
bool callbackTextureHeights(const LLSD& notification, const LLSD& response);
|
||||
|
||||
private:
|
||||
bool mConfirmedTextureHeights;
|
||||
bool mAskedTextureHeights;
|
||||
};
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
|
|
|||
|
|
@ -69,7 +69,11 @@ void LLFloaterSidePanelContainer::closeFloater(bool app_quitting)
|
|||
LLSidepanelAppearance* panel_appearance = dynamic_cast<LLSidepanelAppearance*>(getPanel("appearance"));
|
||||
if ( panel_appearance )
|
||||
{
|
||||
panel_appearance->getWearable()->onClose();
|
||||
LLPanelEditWearable *edit_wearable_ptr = panel_appearance->getWearable();
|
||||
if (edit_wearable_ptr)
|
||||
{
|
||||
edit_wearable_ptr->onClose();
|
||||
}
|
||||
panel_appearance->showOutfitsInventoryPanel();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -183,10 +183,15 @@ void LLFloaterTopObjects::handleReply(LLMessageSystem *msg, void** data)
|
|||
msg->getU32("DataExtended", "TimeStamp", time_stamp, block);
|
||||
msg->getF32("DataExtended", "MonoScore", mono_score, block);
|
||||
msg->getS32("DataExtended", "PublicURLs", public_urls, block);
|
||||
if (msg->getSize("DataExtended", "ParcelName") > 0)
|
||||
|
||||
std::string parcel_name;
|
||||
F32 script_size = 0.f;
|
||||
msg->getString("DataExtended", "ParcelName", parcel_name, block);
|
||||
msg->getF32("DataExtended", "Size", script_size, block);
|
||||
if (parcel_name.size() > 0 || script_size > 0)
|
||||
{
|
||||
msg->getString("DataExtended", "ParcelName", parcel_buf, block);
|
||||
msg->getF32("DataExtended", "Size", script_memory, block);
|
||||
parcel_buf = parcel_name;
|
||||
script_memory = script_size;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -64,7 +64,8 @@ LLGroupIconCtrl::LLGroupIconCtrl(const LLGroupIconCtrl::Params& p)
|
|||
}
|
||||
else
|
||||
{
|
||||
LLIconCtrl::setValue(mDefaultIconName);
|
||||
//TODO: Consider implementing dedicated setDefault() function instead of passing priority for local file
|
||||
LLIconCtrl::setValue(mDefaultIconName, LLViewerFetchedTexture::BOOST_UI);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -73,6 +74,11 @@ LLGroupIconCtrl::~LLGroupIconCtrl()
|
|||
LLGroupMgr::getInstance()->removeObserver(this);
|
||||
}
|
||||
|
||||
void LLGroupIconCtrl::setIconId(const LLSD& value)
|
||||
{
|
||||
LLIconCtrl::setValue(value);
|
||||
}
|
||||
|
||||
void LLGroupIconCtrl::setValue(const LLSD& value)
|
||||
{
|
||||
if (value.isUUID())
|
||||
|
|
@ -91,7 +97,7 @@ void LLGroupIconCtrl::setValue(const LLSD& value)
|
|||
// Check if cache already contains image_id for that group
|
||||
if (!updateFromCache())
|
||||
{
|
||||
LLIconCtrl::setValue(mDefaultIconName);
|
||||
LLIconCtrl::setValue(mDefaultIconName, LLViewerFetchedTexture::BOOST_UI);
|
||||
gm->addObserver(this);
|
||||
gm->sendGroupPropertiesRequest(mGroupId);
|
||||
}
|
||||
|
|
@ -122,7 +128,7 @@ bool LLGroupIconCtrl::updateFromCache()
|
|||
}
|
||||
else
|
||||
{
|
||||
LLIconCtrl::setValue(mDefaultIconName);
|
||||
LLIconCtrl::setValue(mDefaultIconName, LLViewerFetchedTexture::BOOST_UI);
|
||||
}
|
||||
|
||||
if (mDrawTooltip && !group_data->mName.empty())
|
||||
|
|
|
|||
|
|
@ -66,6 +66,8 @@ public:
|
|||
*/
|
||||
virtual void setValue(const LLSD& value);
|
||||
|
||||
void setIconId(const LLSD& value);
|
||||
|
||||
// LLGroupMgrObserver observer trigger
|
||||
virtual void changed(LLGroupChange gc);
|
||||
|
||||
|
|
|
|||
|
|
@ -30,7 +30,7 @@
|
|||
|
||||
// libs
|
||||
#include "llbutton.h"
|
||||
#include "lliconctrl.h"
|
||||
#include "llgroupiconctrl.h"
|
||||
#include "llmenugl.h"
|
||||
#include "lltextbox.h"
|
||||
#include "lltextutil.h"
|
||||
|
|
@ -319,7 +319,7 @@ LLGroupListItem::~LLGroupListItem()
|
|||
//virtual
|
||||
BOOL LLGroupListItem::postBuild()
|
||||
{
|
||||
mGroupIcon = getChild<LLIconCtrl>("group_icon");
|
||||
mGroupIcon = getChild<LLGroupIconCtrl>("group_icon");
|
||||
mGroupNameBox = getChild<LLTextBox>("group_name");
|
||||
|
||||
mInfoBtn = getChild<LLButton>("info_btn");
|
||||
|
|
@ -381,7 +381,7 @@ void LLGroupListItem::setGroupIconID(const LLUUID& group_icon_id)
|
|||
{
|
||||
if (group_icon_id.notNull())
|
||||
{
|
||||
mGroupIcon->setValue(group_icon_id);
|
||||
mGroupIcon->setIconId(group_icon_id);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -83,7 +83,7 @@ private:
|
|||
};
|
||||
|
||||
class LLButton;
|
||||
class LLIconCtrl;
|
||||
class LLGroupIconCtrl;
|
||||
class LLTextBox;
|
||||
|
||||
class LLGroupListItem : public LLPanel
|
||||
|
|
@ -113,7 +113,7 @@ private:
|
|||
|
||||
LLTextBox* mGroupNameBox;
|
||||
LLUUID mGroupID;
|
||||
LLIconCtrl* mGroupIcon;
|
||||
LLGroupIconCtrl* mGroupIcon;
|
||||
LLButton* mInfoBtn;
|
||||
|
||||
std::string mGroupName;
|
||||
|
|
|
|||
|
|
@ -1958,6 +1958,7 @@ BOOL LLItemBridge::removeItem()
|
|||
}
|
||||
|
||||
LLNotifications::instance().forceResponse(params, 0);
|
||||
model->checkTrashOverflow();
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -44,6 +44,7 @@
|
|||
#include "llmarketplacefunctions.h"
|
||||
#include "llwindow.h"
|
||||
#include "llviewercontrol.h"
|
||||
#include "llviewernetwork.h"
|
||||
#include "llpreview.h"
|
||||
#include "llviewermessage.h"
|
||||
#include "llviewerfoldertype.h"
|
||||
|
|
@ -73,7 +74,8 @@ BOOL LLInventoryModel::sFirstTimeInViewer2 = TRUE;
|
|||
///----------------------------------------------------------------------------
|
||||
|
||||
//BOOL decompress_file(const char* src_filename, const char* dst_filename);
|
||||
static const char CACHE_FORMAT_STRING[] = "%s.inv";
|
||||
static const char PRODUCTION_CACHE_FORMAT_STRING[] = "%s.inv";
|
||||
static const char GRID_CACHE_FORMAT_STRING[] = "%s.%s.inv";
|
||||
static const char * const LOG_INV("Inventory");
|
||||
|
||||
struct InventoryIDPtrLess
|
||||
|
|
@ -759,6 +761,22 @@ void LLInventoryModel::collectDescendentsIf(const LLUUID& id,
|
|||
}
|
||||
}
|
||||
|
||||
U32 LLInventoryModel::getDescendentsCountRecursive(const LLUUID& id, U32 max_item_limit)
|
||||
{
|
||||
LLInventoryModel::cat_array_t cats;
|
||||
LLInventoryModel::item_array_t items;
|
||||
gInventory.collectDescendents(id, cats, items, LLInventoryModel::INCLUDE_TRASH);
|
||||
|
||||
U32 items_found = items.size() + cats.size();
|
||||
|
||||
for (U32 i = 0; i < cats.size() && items_found <= max_item_limit; ++i)
|
||||
{
|
||||
items_found += getDescendentsCountRecursive(cats[i]->getUUID(), max_item_limit - items_found);
|
||||
}
|
||||
|
||||
return items_found;
|
||||
}
|
||||
|
||||
void LLInventoryModel::addChangedMaskForLinks(const LLUUID& object_id, U32 mask)
|
||||
{
|
||||
const LLInventoryObject *obj = getObject(object_id);
|
||||
|
|
@ -1607,6 +1625,29 @@ bool LLInventoryModel::fetchDescendentsOf(const LLUUID& folder_id) const
|
|||
return cat->fetch();
|
||||
}
|
||||
|
||||
//static
|
||||
std::string LLInventoryModel::getInvCacheAddres(const LLUUID& owner_id)
|
||||
{
|
||||
std::string inventory_addr;
|
||||
std::string owner_id_str;
|
||||
owner_id.toString(owner_id_str);
|
||||
std::string path(gDirUtilp->getExpandedFilename(LL_PATH_CACHE, owner_id_str));
|
||||
if (LLGridManager::getInstance()->isInProductionGrid())
|
||||
{
|
||||
inventory_addr = llformat(PRODUCTION_CACHE_FORMAT_STRING, path.c_str());
|
||||
}
|
||||
else
|
||||
{
|
||||
// NOTE: The inventory cache filenames now include the grid name.
|
||||
// Add controls against directory traversal or problematic pathname lengths
|
||||
// if your viewer uses grid names from an untrusted source.
|
||||
const std::string& grid_id_str = LLGridManager::getInstance()->getGridId();
|
||||
const std::string& grid_id_lower = utf8str_tolower(grid_id_str);
|
||||
inventory_addr = llformat(GRID_CACHE_FORMAT_STRING, path.c_str(), grid_id_lower.c_str());
|
||||
}
|
||||
return inventory_addr;
|
||||
}
|
||||
|
||||
void LLInventoryModel::cache(
|
||||
const LLUUID& parent_folder_id,
|
||||
const LLUUID& agent_id)
|
||||
|
|
@ -1627,11 +1668,7 @@ void LLInventoryModel::cache(
|
|||
items,
|
||||
INCLUDE_TRASH,
|
||||
can_cache);
|
||||
std::string agent_id_str;
|
||||
std::string inventory_filename;
|
||||
agent_id.toString(agent_id_str);
|
||||
std::string path(gDirUtilp->getExpandedFilename(LL_PATH_CACHE, agent_id_str));
|
||||
inventory_filename = llformat(CACHE_FORMAT_STRING, path.c_str());
|
||||
std::string inventory_filename = getInvCacheAddres(agent_id);
|
||||
saveToFile(inventory_filename, categories, items);
|
||||
std::string gzip_filename(inventory_filename);
|
||||
gzip_filename.append(".gz");
|
||||
|
|
@ -1935,11 +1972,7 @@ bool LLInventoryModel::loadSkeleton(
|
|||
item_array_t items;
|
||||
item_array_t possible_broken_links;
|
||||
cat_set_t invalid_categories; // Used to mark categories that weren't successfully loaded.
|
||||
std::string owner_id_str;
|
||||
owner_id.toString(owner_id_str);
|
||||
std::string path(gDirUtilp->getExpandedFilename(LL_PATH_CACHE, owner_id_str));
|
||||
std::string inventory_filename;
|
||||
inventory_filename = llformat(CACHE_FORMAT_STRING, path.c_str());
|
||||
std::string inventory_filename = getInvCacheAddres(owner_id);
|
||||
const S32 NO_VERSION = LLViewerInventoryCategory::VERSION_UNKNOWN;
|
||||
std::string gzip_filename(inventory_filename);
|
||||
gzip_filename.append(".gz");
|
||||
|
|
@ -3320,6 +3353,7 @@ void LLInventoryModel::processMoveInventoryItem(LLMessageSystem* msg, void**)
|
|||
//----------------------------------------------------------------------------
|
||||
|
||||
// Trash: LLFolderType::FT_TRASH, "ConfirmEmptyTrash"
|
||||
// Trash: LLFolderType::FT_TRASH, "TrashIsFull" when trash exceeds maximum capacity
|
||||
// Lost&Found: LLFolderType::FT_LOST_AND_FOUND, "ConfirmEmptyLostAndFound"
|
||||
|
||||
bool LLInventoryModel::callbackEmptyFolderType(const LLSD& notification, const LLSD& response, LLFolderType::EType preferred_type)
|
||||
|
|
@ -3401,10 +3435,17 @@ void LLInventoryModel::removeCategory(const LLUUID& category_id)
|
|||
changeCategoryParent(cat, trash_id, TRUE);
|
||||
}
|
||||
}
|
||||
|
||||
checkTrashOverflow();
|
||||
}
|
||||
|
||||
void LLInventoryModel::removeObject(const LLUUID& object_id)
|
||||
{
|
||||
if(object_id.isNull())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
LLInventoryObject* obj = getObject(object_id);
|
||||
if (dynamic_cast<LLViewerInventoryItem*>(obj))
|
||||
{
|
||||
|
|
@ -3426,6 +3467,16 @@ void LLInventoryModel::removeObject(const LLUUID& object_id)
|
|||
}
|
||||
}
|
||||
|
||||
void LLInventoryModel::checkTrashOverflow()
|
||||
{
|
||||
static const U32 trash_max_capacity = gSavedSettings.getU32("InventoryTrashMaxCapacity");
|
||||
const LLUUID trash_id = findCategoryUUIDForType(LLFolderType::FT_TRASH);
|
||||
if (getDescendentsCountRecursive(trash_id, trash_max_capacity) >= trash_max_capacity)
|
||||
{
|
||||
gInventory.emptyFolderType("TrashIsFull", LLFolderType::FT_TRASH);
|
||||
}
|
||||
}
|
||||
|
||||
const LLUUID &LLInventoryModel::getRootFolderID() const
|
||||
{
|
||||
return mRootFolderID;
|
||||
|
|
|
|||
|
|
@ -164,7 +164,9 @@ public:
|
|||
bool loadSkeleton(const LLSD& options, const LLUUID& owner_id);
|
||||
void buildParentChildMap(); // brute force method to rebuild the entire parent-child relations
|
||||
void createCommonSystemCategories();
|
||||
|
||||
|
||||
static std::string getInvCacheAddres(const LLUUID& owner_id);
|
||||
|
||||
// Call on logout to save a terse representation.
|
||||
void cache(const LLUUID& parent_folder_id, const LLUUID& agent_id);
|
||||
private:
|
||||
|
|
@ -262,6 +264,9 @@ public:
|
|||
|
||||
// Follow parent chain to the top.
|
||||
bool getObjectTopmostAncestor(const LLUUID& object_id, LLUUID& result) const;
|
||||
|
||||
private:
|
||||
U32 getDescendentsCountRecursive(const LLUUID& id, U32 max_item_limit);
|
||||
|
||||
//--------------------------------------------------------------------
|
||||
// Find
|
||||
|
|
@ -403,6 +408,8 @@ public:
|
|||
/// removeItem() or removeCategory(), whichever is appropriate
|
||||
void removeObject(const LLUUID& object_id);
|
||||
|
||||
void checkTrashOverflow();
|
||||
|
||||
protected:
|
||||
void updateLinkedObjectsFromPurge(const LLUUID& baseobj_id);
|
||||
|
||||
|
|
|
|||
|
|
@ -306,6 +306,12 @@ void LLInventoryFetchItemsObserver::startFetch()
|
|||
continue;
|
||||
}
|
||||
|
||||
if ((*it).isNull())
|
||||
{
|
||||
LL_WARNS("Inventory") << "Skip fetching for a NULL uuid" << LL_ENDL;
|
||||
continue;
|
||||
}
|
||||
|
||||
// It's incomplete, so put it on the incomplete container, and
|
||||
// pack this on the message.
|
||||
mIncomplete.push_back(*it);
|
||||
|
|
|
|||
|
|
@ -1332,6 +1332,11 @@ void LLInventoryPanel::openInventoryPanelAndSetSelection(BOOL auto_open, const L
|
|||
}
|
||||
else
|
||||
{
|
||||
LLFloater* floater_inventory = LLFloaterReg::getInstance("inventory");
|
||||
if (floater_inventory)
|
||||
{
|
||||
floater_inventory->setFocus(TRUE);
|
||||
}
|
||||
active_panel->setSelection(obj_id, TAKE_FOCUS_YES);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -135,7 +135,7 @@ LLLocalBitmap::~LLLocalBitmap()
|
|||
}
|
||||
|
||||
// delete self from gimagelist
|
||||
LLViewerFetchedTexture* image = gTextureList.findImage(mWorldID, TEX_LIST_DISCARD);
|
||||
LLViewerFetchedTexture* image = gTextureList.findImage(mWorldID, TEX_LIST_STANDARD);
|
||||
gTextureList.deleteImage(image);
|
||||
|
||||
if (image)
|
||||
|
|
@ -207,7 +207,7 @@ bool LLLocalBitmap::updateSelf(EUpdateType optional_firstupdate)
|
|||
texture->setCachedRawImage(LL_LOCAL_DISCARD_LEVEL, raw_image);
|
||||
texture->ref();
|
||||
|
||||
gTextureList.addImage(texture, TEX_LIST_DISCARD);
|
||||
gTextureList.addImage(texture, TEX_LIST_STANDARD);
|
||||
|
||||
if (optional_firstupdate != UT_FIRSTUSE)
|
||||
{
|
||||
|
|
@ -215,7 +215,7 @@ bool LLLocalBitmap::updateSelf(EUpdateType optional_firstupdate)
|
|||
replaceIDs(old_id, mWorldID);
|
||||
|
||||
// remove old_id from gimagelist
|
||||
LLViewerFetchedTexture* image = gTextureList.findImage(old_id, TEX_LIST_DISCARD);
|
||||
LLViewerFetchedTexture* image = gTextureList.findImage(old_id, TEX_LIST_STANDARD);
|
||||
if (image != NULL)
|
||||
{
|
||||
gTextureList.deleteImage(image);
|
||||
|
|
@ -384,7 +384,7 @@ void LLLocalBitmap::replaceIDs(LLUUID old_id, LLUUID new_id)
|
|||
std::vector<LLViewerObject*> LLLocalBitmap::prepUpdateObjects(LLUUID old_id, U32 channel)
|
||||
{
|
||||
std::vector<LLViewerObject*> obj_list;
|
||||
LLViewerFetchedTexture* old_texture = gTextureList.findImage(old_id, TEX_LIST_DISCARD);
|
||||
LLViewerFetchedTexture* old_texture = gTextureList.findImage(old_id, TEX_LIST_STANDARD);
|
||||
|
||||
for(U32 face_iterator = 0; face_iterator < old_texture->getNumFaces(channel); face_iterator++)
|
||||
{
|
||||
|
|
@ -502,7 +502,7 @@ void LLLocalBitmap::updateUserPrims(LLUUID old_id, LLUUID new_id, U32 channel)
|
|||
|
||||
void LLLocalBitmap::updateUserSculpts(LLUUID old_id, LLUUID new_id)
|
||||
{
|
||||
LLViewerFetchedTexture* old_texture = gTextureList.findImage(old_id, TEX_LIST_DISCARD);
|
||||
LLViewerFetchedTexture* old_texture = gTextureList.findImage(old_id, TEX_LIST_STANDARD);
|
||||
for(U32 volume_iter = 0; volume_iter < old_texture->getNumVolumes(); volume_iter++)
|
||||
{
|
||||
LLVOVolume* volume_to_object = (*old_texture->getVolumeList())[volume_iter];
|
||||
|
|
|
|||
|
|
@ -2081,7 +2081,7 @@ BOOL LLManipScale::canAffectSelection()
|
|||
{
|
||||
LLViewerObject *root_object = (objectp == NULL) ? NULL : objectp->getRootEdit();
|
||||
return objectp->permModify() && objectp->permMove() && !objectp->isPermanentEnforced() &&
|
||||
((root_object == NULL) || !root_object->isPermanentEnforced()) &&
|
||||
(root_object == NULL || (!root_object->isPermanentEnforced() && !root_object->isSeat())) &&
|
||||
!objectp->isSeat();
|
||||
}
|
||||
} func;
|
||||
|
|
|
|||
|
|
@ -795,6 +795,15 @@ void LLMarketplaceData::getMerchantStatusCoro()
|
|||
log_SLM_infos("Get /merchant", httpCode, std::string("Merchant is not migrated"));
|
||||
setSLMStatus(MarketplaceStatusCodes::MARKET_PLACE_NOT_MIGRATED_MERCHANT);
|
||||
}
|
||||
else if (httpCode == HTTP_INTERNAL_ERROR)
|
||||
{
|
||||
// 499 includes timeout and ssl error - marketplace is down or having issues, we do not show it in this request according to MAINT-5938
|
||||
LL_WARNS("SLM") << "SLM Merchant Request failed with status: " << httpCode
|
||||
<< ", reason : " << status.toString()
|
||||
<< ", code : " << result["error_code"].asString()
|
||||
<< ", description : " << result["error_description"].asString() << LL_ENDL;
|
||||
LLMarketplaceData::instance().setSLMStatus(MarketplaceStatusCodes::MARKET_PLACE_CONNECTION_FAILURE);
|
||||
}
|
||||
else
|
||||
{
|
||||
std::string err_code = result["error_code"].asString();
|
||||
|
|
|
|||
|
|
@ -44,6 +44,7 @@
|
|||
#include "lllocationinputctrl.h"
|
||||
#include "llpaneltopinfobar.h"
|
||||
#include "llteleporthistory.h"
|
||||
#include "llresizebar.h"
|
||||
#include "llsearchcombobox.h"
|
||||
#include "llslurl.h"
|
||||
#include "llurlregistry.h"
|
||||
|
|
@ -267,7 +268,10 @@ LLNavigationBar::LLNavigationBar()
|
|||
mBtnForward(NULL),
|
||||
mBtnHome(NULL),
|
||||
mCmbLocation(NULL),
|
||||
mSaveToLocationHistory(false)
|
||||
mSaveToLocationHistory(false),
|
||||
mNavigationPanel(NULL),
|
||||
mFavoritePanel(NULL),
|
||||
mNavPanWidth(0)
|
||||
{
|
||||
buildFromFile( "panel_navigation_bar.xml");
|
||||
|
||||
|
|
@ -286,7 +290,7 @@ BOOL LLNavigationBar::postBuild()
|
|||
mBtnBack = getChild<LLPullButton>("back_btn");
|
||||
mBtnForward = getChild<LLPullButton>("forward_btn");
|
||||
mBtnHome = getChild<LLButton>("home_btn");
|
||||
|
||||
|
||||
mCmbLocation= getChild<LLLocationInputCtrl>("location_combo");
|
||||
|
||||
mBtnBack->setEnabled(FALSE);
|
||||
|
|
@ -318,6 +322,11 @@ BOOL LLNavigationBar::postBuild()
|
|||
|
||||
LLHints::registerHintTarget("nav_bar", getHandle());
|
||||
|
||||
mNavigationPanel = getChild<LLLayoutPanel>("navigation_layout_panel");
|
||||
mFavoritePanel = getChild<LLLayoutPanel>("favorites_layout_panel");
|
||||
mNavigationPanel->getResizeBar()->setResizeListener(boost::bind(&LLNavigationBar::onNavbarResized, this));
|
||||
mFavoritePanel->getResizeBar()->setResizeListener(boost::bind(&LLNavigationBar::onNavbarResized, this));
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
|
@ -356,7 +365,6 @@ BOOL LLNavigationBar::handleRightMouseDown(S32 x, S32 y, MASK mask)
|
|||
show_navbar_context_menu(this,x,y);
|
||||
handled = true;
|
||||
}
|
||||
|
||||
return handled;
|
||||
}
|
||||
|
||||
|
|
@ -365,6 +373,18 @@ void LLNavigationBar::onBackButtonClicked()
|
|||
LLTeleportHistory::getInstance()->goBack();
|
||||
}
|
||||
|
||||
void LLNavigationBar::onNavbarResized()
|
||||
{
|
||||
S32 new_nav_pan_width = mNavigationPanel->getRect().getWidth();
|
||||
if(mNavPanWidth != new_nav_pan_width)
|
||||
{
|
||||
S32 new_stack_width = new_nav_pan_width + mFavoritePanel->getRect().getWidth();
|
||||
F32 ratio = (F32)new_nav_pan_width / (F32)new_stack_width;
|
||||
gSavedPerAccountSettings.setF32("NavigationBarRatio", ratio);
|
||||
mNavPanWidth = new_nav_pan_width;
|
||||
}
|
||||
}
|
||||
|
||||
void LLNavigationBar::onBackOrForwardButtonHeldDown(LLUICtrl* ctrl, const LLSD& param)
|
||||
{
|
||||
if (param["count"].asInteger() == 0)
|
||||
|
|
@ -667,8 +687,18 @@ void LLNavigationBar::handleLoginComplete()
|
|||
LLTeleportHistory::getInstance()->handleLoginComplete();
|
||||
LLPanelTopInfoBar::instance().handleLoginComplete();
|
||||
mCmbLocation->handleLoginComplete();
|
||||
resizeLayoutPanel();
|
||||
}
|
||||
|
||||
void LLNavigationBar::resizeLayoutPanel()
|
||||
{
|
||||
LLRect nav_bar_rect = mNavigationPanel->getRect();
|
||||
|
||||
S32 nav_panel_width = (nav_bar_rect.getWidth() + mFavoritePanel->getRect().getWidth()) * gSavedPerAccountSettings.getF32("NavigationBarRatio");
|
||||
|
||||
nav_bar_rect.setLeftTopAndSize(nav_bar_rect.mLeft, nav_bar_rect.mTop, nav_panel_width, nav_bar_rect.getHeight());
|
||||
mNavigationPanel->handleReshape(nav_bar_rect,true);
|
||||
}
|
||||
void LLNavigationBar::invokeSearch(std::string search_text)
|
||||
{
|
||||
LLFloaterReg::showInstance("search", LLSD().with("category", "all").with("query", LLSD(search_text)));
|
||||
|
|
|
|||
|
|
@ -29,6 +29,7 @@
|
|||
|
||||
#include "llpanel.h"
|
||||
#include "llbutton.h"
|
||||
#include "lllayoutstack.h"
|
||||
|
||||
class LLLocationInputCtrl;
|
||||
class LLMenuGL;
|
||||
|
|
@ -108,6 +109,7 @@ private:
|
|||
void rebuildTeleportHistoryMenu();
|
||||
void showTeleportHistoryMenu(LLUICtrl* btn_ctrl);
|
||||
void invokeSearch(std::string search_text);
|
||||
void resizeLayoutPanel();
|
||||
// callbacks
|
||||
void onTeleportHistoryMenuItemClicked(const LLSD& userdata);
|
||||
void onTeleportHistoryChanged();
|
||||
|
|
@ -120,6 +122,7 @@ private:
|
|||
void onLocationPrearrange(const LLSD& data);
|
||||
void onTeleportFinished(const LLVector3d& global_agent_pos);
|
||||
void onTeleportFailed();
|
||||
void onNavbarResized();
|
||||
void onRegionNameResponse(
|
||||
std::string typed_location,
|
||||
std::string region_name,
|
||||
|
|
@ -135,6 +138,7 @@ private:
|
|||
}
|
||||
}
|
||||
|
||||
S32 mNavPanWidth;
|
||||
LLMenuGL* mTeleportHistoryMenu;
|
||||
LLPullButton* mBtnBack;
|
||||
LLPullButton* mBtnForward;
|
||||
|
|
@ -142,6 +146,8 @@ private:
|
|||
LLLocationInputCtrl* mCmbLocation;
|
||||
LLRect mDefaultNbRect;
|
||||
LLRect mDefaultFpRect;
|
||||
LLLayoutPanel* mNavigationPanel;
|
||||
LLLayoutPanel* mFavoritePanel;
|
||||
boost::signals2::connection mTeleportFailedConnection;
|
||||
boost::signals2::connection mTeleportFinishConnection;
|
||||
boost::signals2::connection mHistoryMenuConnection;
|
||||
|
|
|
|||
|
|
@ -2214,7 +2214,7 @@ void LLPanelFace::LLSelectedTE::getTexId(LLUUID& id, bool& identical)
|
|||
LLTextureEntry *te = object->getTE(te_index);
|
||||
if (te)
|
||||
{
|
||||
LLViewerTexture* tex = te->getID().notNull() ? gTextureList.findImage(te->getID(), TEX_LIST_DISCARD) : NULL;
|
||||
LLViewerTexture* tex = te->getID().notNull() ? gTextureList.findImage(te->getID(), TEX_LIST_STANDARD) : NULL;
|
||||
if(!tex)
|
||||
{
|
||||
tex = LLViewerFetchedTexture::sDefaultImagep;
|
||||
|
|
|
|||
|
|
@ -30,7 +30,7 @@
|
|||
|
||||
#include "lluictrlfactory.h"
|
||||
#include "roles_constants.h"
|
||||
|
||||
#include "llappviewer.h"
|
||||
#include "llagent.h"
|
||||
#include "llviewerregion.h"
|
||||
#include "llflatlistview.h"
|
||||
|
|
@ -67,7 +67,7 @@ BOOL LLPanelGroupExperiences::postBuild()
|
|||
|
||||
void LLPanelGroupExperiences::activate()
|
||||
{
|
||||
if (getGroupID() == LLUUID::null)
|
||||
if ((getGroupID() == LLUUID::null) || gDisconnected)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1080,28 +1080,25 @@ void LLPanelPermissions::setAllSaleInfo()
|
|||
|
||||
LLSaleInfo new_sale_info(sale_type, price);
|
||||
LLSelectMgr::getInstance()->selectionSetObjectSaleInfo(new_sale_info);
|
||||
|
||||
U8 old_click_action = 0;
|
||||
LLSelectMgr::getInstance()->selectionGetClickAction(&old_click_action);
|
||||
|
||||
if (old_sale_info.isForSale()
|
||||
&& !new_sale_info.isForSale()
|
||||
&& old_click_action == CLICK_ACTION_BUY)
|
||||
{
|
||||
// If turned off for-sale, make sure click-action buy is turned
|
||||
// off as well
|
||||
LLSelectMgr::getInstance()->
|
||||
selectionSetClickAction(CLICK_ACTION_TOUCH);
|
||||
}
|
||||
else if (new_sale_info.isForSale()
|
||||
&& !old_sale_info.isForSale()
|
||||
&& old_click_action == CLICK_ACTION_TOUCH)
|
||||
{
|
||||
// If just turning on for-sale, preemptively turn on one-click buy
|
||||
// unless user have a different click action set
|
||||
LLSelectMgr::getInstance()->
|
||||
selectionSetClickAction(CLICK_ACTION_BUY);
|
||||
}
|
||||
struct f : public LLSelectedObjectFunctor
|
||||
{
|
||||
virtual bool apply(LLViewerObject* object)
|
||||
{
|
||||
return object->getClickAction() == CLICK_ACTION_BUY
|
||||
|| object->getClickAction() == CLICK_ACTION_TOUCH;
|
||||
}
|
||||
} check_actions;
|
||||
|
||||
// Selection should only contain objects that are of target
|
||||
// action already or of action we are aiming to remove.
|
||||
bool default_actions = LLSelectMgr::getInstance()->getSelection()->applyToObjects(&check_actions);
|
||||
|
||||
if (default_actions && old_sale_info.isForSale() != new_sale_info.isForSale())
|
||||
{
|
||||
U8 new_click_action = new_sale_info.isForSale() ? CLICK_ACTION_BUY : CLICK_ACTION_TOUCH;
|
||||
LLSelectMgr::getInstance()->selectionSetClickAction(new_click_action);
|
||||
}
|
||||
}
|
||||
|
||||
struct LLSelectionPayable : public LLSelectedObjectFunctor
|
||||
|
|
|
|||
|
|
@ -123,9 +123,26 @@ void LLPersistentNotificationStorage::loadNotifications()
|
|||
|
||||
LLNotifications& instance = LLNotifications::instance();
|
||||
S32 processed_notifications = 0;
|
||||
std::vector<LLSD> notifications_array;
|
||||
for (LLSD::reverse_array_iterator notification_it = data.rbeginArray();
|
||||
notification_it != data.rendArray();
|
||||
++notification_it)
|
||||
{
|
||||
LLSD notification_params = *notification_it;
|
||||
notifications_array.push_back(notification_params);
|
||||
|
||||
++processed_notifications;
|
||||
if (processed_notifications >= gSavedSettings.getS32("MaxPersistentNotifications"))
|
||||
{
|
||||
LL_WARNS() << "Too many persistent notifications."
|
||||
<< " Processed " << gSavedSettings.getS32("MaxPersistentNotifications") << " of " << data.size() << " persistent notifications." << LL_ENDL;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
for (LLSD::reverse_array_iterator notification_it = notifications_array.rbegin();
|
||||
notification_it != notifications_array.rend();
|
||||
++notification_it)
|
||||
{
|
||||
LLSD notification_params = *notification_it;
|
||||
LLNotificationPtr notification(new LLNotification(notification_params));
|
||||
|
|
@ -143,14 +160,8 @@ void LLPersistentNotificationStorage::loadNotifications()
|
|||
// hide saved toasts so they don't confuse the user
|
||||
notification_channel->hideToast(notification->getID());
|
||||
}
|
||||
++processed_notifications;
|
||||
if (processed_notifications >= gSavedSettings.getS32("MaxPersistentNotifications"))
|
||||
{
|
||||
LL_WARNS() << "Too many persistent notifications."
|
||||
<< " Processed " << gSavedSettings.getS32("MaxPersistentNotifications") << " of " << data.size() << " persistent notifications." << LL_ENDL;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
LLNotifications::instance().getChannel("Persistent")->
|
||||
connectChanged(boost::bind(&LLPersistentNotificationStorage::onPersistentChannelChanged, this, _1));
|
||||
LL_INFOS("LLPersistentNotificationStorage") << "finished loading notifications" << LL_ENDL;
|
||||
|
|
|
|||
|
|
@ -198,7 +198,7 @@ void LLSidepanelAppearance::updateToVisibility(const LLSD &new_visibility)
|
|||
|
||||
if (is_outfit_edit_visible || is_wearable_edit_visible)
|
||||
{
|
||||
const LLViewerWearable *wearable_ptr = mEditWearable->getWearable();
|
||||
const LLViewerWearable *wearable_ptr = mEditWearable ? mEditWearable->getWearable() : NULL;
|
||||
if (!wearable_ptr)
|
||||
{
|
||||
LL_WARNS() << "Visibility change to invalid wearable" << LL_ENDL;
|
||||
|
|
|
|||
|
|
@ -718,7 +718,6 @@ void LLSurface::decompressDCTPatch(LLBitPack &bitpack, LLGroupHeader *gopp, BOOL
|
|||
<< " quant_wbits " << (S32)ph.quant_wbits
|
||||
<< " patchids " << (S32)ph.patchids
|
||||
<< LL_ENDL;
|
||||
LLAppViewer::instance()->badNetworkHandler();
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1491,6 +1491,7 @@ void LLTextureCache::readHeaderCache()
|
|||
new_entries.push_back(entry);
|
||||
}
|
||||
}
|
||||
mFreeList.clear(); // recreating list, no longer valid.
|
||||
llassert_always(new_entries.size() <= sCacheMaxEntries);
|
||||
mHeaderEntriesInfo.mEntries = new_entries.size();
|
||||
writeEntriesHeader();
|
||||
|
|
|
|||
|
|
@ -1393,7 +1393,7 @@ void LLTextureCtrl::setOnTextureSelectedCallback(texture_selected_callback cb)
|
|||
|
||||
void LLTextureCtrl::setImageAssetName(const std::string& name)
|
||||
{
|
||||
LLPointer<LLUIImage> imagep = LLUI::getUIImage(name);
|
||||
LLPointer<LLUIImage> imagep = LLUI::getUIImage(name, LLGLTexture::BOOST_PREVIEW);
|
||||
if(imagep)
|
||||
{
|
||||
LLViewerFetchedTexture* pTexture = dynamic_cast<LLViewerFetchedTexture*>(imagep->getImage().get());
|
||||
|
|
|
|||
|
|
@ -4450,7 +4450,7 @@ void LLTextureFetchDebugger::addHistoryEntry(LLTextureFetchWorker* worker)
|
|||
mRefetchedAllData += worker->mFormattedImage->getDataSize();
|
||||
|
||||
// refetch list only requests/creates normal images, so requesting ui='false'
|
||||
LLViewerFetchedTexture* tex = LLViewerTextureManager::findFetchedTexture(worker->mID, TEX_LIST_DISCARD);
|
||||
LLViewerFetchedTexture* tex = LLViewerTextureManager::findFetchedTexture(worker->mID, TEX_LIST_STANDARD);
|
||||
if(tex && mRefetchList[tex].begin() != mRefetchList[tex].end())
|
||||
{
|
||||
if(worker->mDecodedDiscard == mFetchingHistory[mRefetchList[tex][0]].mDecodedLevel)
|
||||
|
|
|
|||
|
|
@ -380,10 +380,6 @@ void LLToast::setVisible(BOOL show)
|
|||
{
|
||||
mTimer->start();
|
||||
}
|
||||
if (!getVisible())
|
||||
{
|
||||
LLModalDialog::setFrontmost(FALSE);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
|
|||
|
|
@ -181,6 +181,7 @@ LLToastAlertPanel::LLToastAlertPanel( LLNotificationPtr notification, bool modal
|
|||
params.wrap(true);
|
||||
params.follows.flags(FOLLOWS_LEFT | FOLLOWS_TOP);
|
||||
params.allow_scroll(true);
|
||||
params.force_urls_external(mNotification->getForceUrlsExternal());
|
||||
|
||||
LLTextBox * msg_box = LLUICtrlFactory::create<LLTextBox> (params);
|
||||
// Compute max allowable height for the dialog text, so we can allocate
|
||||
|
|
|
|||
|
|
@ -31,7 +31,7 @@
|
|||
#include "llfocusmgr.h"
|
||||
|
||||
#include "llbutton.h"
|
||||
#include "lliconctrl.h"
|
||||
#include "llgroupiconctrl.h"
|
||||
#include "llinventoryfunctions.h"
|
||||
#include "llinventoryicon.h"
|
||||
#include "llnotifications.h"
|
||||
|
|
@ -65,8 +65,10 @@ LLToastGroupNotifyPanel::LLToastGroupNotifyPanel(const LLNotificationPtr& notifi
|
|||
}
|
||||
|
||||
//group icon
|
||||
LLIconCtrl* pGroupIcon = getChild<LLIconCtrl>("group_icon", TRUE);
|
||||
pGroupIcon->setValue(groupData.mInsigniaID);
|
||||
LLGroupIconCtrl* pGroupIcon = getChild<LLGroupIconCtrl>("group_icon", TRUE);
|
||||
|
||||
// We should already have this data preloaded, so no sense in setting icon through setValue(group_id)
|
||||
pGroupIcon->setIconId(groupData.mInsigniaID);
|
||||
|
||||
//header title
|
||||
std::string from_name = payload["sender_name"].asString();
|
||||
|
|
|
|||
|
|
@ -1312,6 +1312,13 @@ void LLViewerMedia::getOpenIDCookieCoro(std::string url)
|
|||
if (parseRawCookie(sOpenIDCookie, cookie_name, cookie_value, cookie_path, httponly, secure) &&
|
||||
media_instance->getMediaPlugin())
|
||||
{
|
||||
// MAINT-5711 - inexplicably, the CEF setCookie function will no longer set the cookie if the
|
||||
// url and domain are not the same. This used to be my.sl.com and id.sl.com respectively and worked.
|
||||
// For now, we use the URL for the OpenID POST request since it will have the same authority
|
||||
// as the domain field.
|
||||
// (Feels like there must be a less dirty way to construct a URL from component LLURL parts)
|
||||
url = std::string(sOpenIDURL.mURI) + "://" + std::string(sOpenIDURL.mAuthority);
|
||||
|
||||
media_instance->getMediaPlugin()->setCookie(url, cookie_name, cookie_value, cookie_host, cookie_path, httponly, secure);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2322,6 +2322,20 @@ static void god_message_name_cb(const LLAvatarName& av_name, LLChat chat, std::s
|
|||
}
|
||||
}
|
||||
|
||||
const std::string NOT_ONLINE_MSG("User not online - message will be stored and delivered later.");
|
||||
const std::string NOT_ONLINE_INVENTORY("User not online - inventory has been saved.");
|
||||
void translate_if_needed(std::string& message)
|
||||
{
|
||||
if (message == NOT_ONLINE_MSG)
|
||||
{
|
||||
message = LLTrans::getString("not_online_msg");
|
||||
}
|
||||
else if (message == NOT_ONLINE_INVENTORY)
|
||||
{
|
||||
message = LLTrans::getString("not_online_inventory");
|
||||
}
|
||||
}
|
||||
|
||||
void process_improved_im(LLMessageSystem *msg, void **user_data)
|
||||
{
|
||||
LLUUID from_id;
|
||||
|
|
@ -2386,6 +2400,11 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
|
|||
chat.mFromID = from_id;
|
||||
chat.mFromName = name;
|
||||
chat.mSourceType = (from_id.isNull() || (name == std::string(SYSTEM_FROM))) ? CHAT_SOURCE_SYSTEM : CHAT_SOURCE_AGENT;
|
||||
|
||||
if (chat.mSourceType == CHAT_SOURCE_SYSTEM)
|
||||
{ // Translate server message if required (MAINT-6109)
|
||||
translate_if_needed(message);
|
||||
}
|
||||
|
||||
LLViewerObject *source = gObjectList.findObject(session_id); //Session ID is probably the wrong thing.
|
||||
if (source)
|
||||
|
|
@ -5558,6 +5577,10 @@ static void process_money_balance_reply_extended(LLMessageSystem* msg)
|
|||
bool you_paid_someone = (source_id == gAgentID);
|
||||
if (you_paid_someone)
|
||||
{
|
||||
if(!gSavedSettings.getBOOL("NotifyMoneySpend"))
|
||||
{
|
||||
return;
|
||||
}
|
||||
args["NAME"] = dest_slurl;
|
||||
is_name_group = is_dest_group;
|
||||
name_id = dest_id;
|
||||
|
|
@ -5595,6 +5618,10 @@ static void process_money_balance_reply_extended(LLMessageSystem* msg)
|
|||
}
|
||||
else {
|
||||
// ...someone paid you
|
||||
if(!gSavedSettings.getBOOL("NotifyMoneyReceived"))
|
||||
{
|
||||
return;
|
||||
}
|
||||
args["NAME"] = source_slurl;
|
||||
is_name_group = is_source_group;
|
||||
name_id = source_id;
|
||||
|
|
@ -7380,7 +7407,7 @@ void callback_load_url_name(const LLUUID& id, const std::string& full_name, bool
|
|||
args["URL"] = load_url_info["url"].asString();
|
||||
args["MESSAGE"] = load_url_info["message"].asString();;
|
||||
args["OBJECTNAME"] = load_url_info["object_name"].asString();
|
||||
args["NAME"] = owner_name;
|
||||
args["NAME_SLURL"] = LLSLURL(is_group ? "group" : "agent", id, "about").getSLURLString();
|
||||
|
||||
LLNotificationsUtil::add("LoadWebPage", args, load_url_info);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1201,6 +1201,12 @@ void LLOcclusionCullingGroup::doOcclusion(LLCamera* camera, const LLVector4a* sh
|
|||
bounds[0].add(*shift);
|
||||
}
|
||||
|
||||
F32 OCCLUSION_FUDGE_Z = SG_OCCLUSION_FUDGE; //<-- #Solution #2
|
||||
if (LLDrawPool::POOL_WATER == mSpatialPartition->mDrawableType)
|
||||
{
|
||||
OCCLUSION_FUDGE_Z = 1.;
|
||||
}
|
||||
|
||||
// Don't cull hole/edge water, unless we have the GL_ARB_depth_clamp extension
|
||||
if (earlyFail(camera, bounds))
|
||||
{
|
||||
|
|
@ -1260,7 +1266,7 @@ void LLOcclusionCullingGroup::doOcclusion(LLCamera* camera, const LLVector4a* sh
|
|||
shader->uniform3fv(LLShaderMgr::BOX_CENTER, 1, bounds[0].getF32ptr());
|
||||
shader->uniform3f(LLShaderMgr::BOX_SIZE, bounds[1][0]+SG_OCCLUSION_FUDGE,
|
||||
bounds[1][1]+SG_OCCLUSION_FUDGE,
|
||||
bounds[1][2]+SG_OCCLUSION_FUDGE);
|
||||
bounds[1][2]+OCCLUSION_FUDGE_Z);
|
||||
|
||||
if (!use_depth_clamp && mSpatialPartition->mDrawableType == LLDrawPool::POOL_VOIDWATER)
|
||||
{
|
||||
|
|
@ -1270,7 +1276,7 @@ void LLOcclusionCullingGroup::doOcclusion(LLCamera* camera, const LLVector4a* sh
|
|||
if (camera->getOrigin().isExactlyZero())
|
||||
{ //origin is invalid, draw entire box
|
||||
gPipeline.mCubeVB->drawRange(LLRender::TRIANGLE_FAN, 0, 7, 8, 0);
|
||||
gPipeline.mCubeVB->drawRange(LLRender::TRIANGLE_FAN, 0, 7, 8, b111*8);
|
||||
gPipeline.mCubeVB->drawRange(LLRender::TRIANGLE_FAN, 0, 7, 8, b111*8);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -1283,7 +1289,7 @@ void LLOcclusionCullingGroup::doOcclusion(LLCamera* camera, const LLVector4a* sh
|
|||
if (camera->getOrigin().isExactlyZero())
|
||||
{ //origin is invalid, draw entire box
|
||||
gPipeline.mCubeVB->drawRange(LLRender::TRIANGLE_FAN, 0, 7, 8, 0);
|
||||
gPipeline.mCubeVB->drawRange(LLRender::TRIANGLE_FAN, 0, 7, 8, b111*8);
|
||||
gPipeline.mCubeVB->drawRange(LLRender::TRIANGLE_FAN, 0, 7, 8, b111*8);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
|
|||
|
|
@ -716,7 +716,8 @@ void LLViewerTexture::setBoostLevel(S32 level)
|
|||
{
|
||||
mBoostLevel = level;
|
||||
if(mBoostLevel != LLViewerTexture::BOOST_NONE &&
|
||||
mBoostLevel != LLViewerTexture::BOOST_SELECTED)
|
||||
mBoostLevel != LLViewerTexture::BOOST_SELECTED &&
|
||||
mBoostLevel != LLViewerTexture::BOOST_ICON)
|
||||
{
|
||||
setNoDelete();
|
||||
}
|
||||
|
|
@ -3323,7 +3324,7 @@ LLViewerMediaTexture::LLViewerMediaTexture(const LLUUID& id, BOOL usemipmaps, LL
|
|||
|
||||
setCategory(LLGLTexture::MEDIA);
|
||||
|
||||
LLViewerTexture* tex = gTextureList.findImage(mID, TEX_LIST_DISCARD);
|
||||
LLViewerTexture* tex = gTextureList.findImage(mID, TEX_LIST_STANDARD);
|
||||
if(tex) //this media is a parcel media for tex.
|
||||
{
|
||||
tex->setParcelMedia(this);
|
||||
|
|
@ -3333,7 +3334,7 @@ LLViewerMediaTexture::LLViewerMediaTexture(const LLUUID& id, BOOL usemipmaps, LL
|
|||
//virtual
|
||||
LLViewerMediaTexture::~LLViewerMediaTexture()
|
||||
{
|
||||
LLViewerTexture* tex = gTextureList.findImage(mID, TEX_LIST_DISCARD);
|
||||
LLViewerTexture* tex = gTextureList.findImage(mID, TEX_LIST_STANDARD);
|
||||
if(tex) //this media is a parcel media for tex.
|
||||
{
|
||||
tex->setParcelMedia(NULL);
|
||||
|
|
@ -3388,7 +3389,7 @@ BOOL LLViewerMediaTexture::findFaces()
|
|||
|
||||
BOOL ret = TRUE;
|
||||
|
||||
LLViewerTexture* tex = gTextureList.findImage(mID, TEX_LIST_DISCARD);
|
||||
LLViewerTexture* tex = gTextureList.findImage(mID, TEX_LIST_STANDARD);
|
||||
if(tex) //this media is a parcel media for tex.
|
||||
{
|
||||
for (U32 ch = 0; ch < LLRender::NUM_TEXTURE_CHANNELS; ++ch)
|
||||
|
|
@ -3497,7 +3498,7 @@ void LLViewerMediaTexture::addFace(U32 ch, LLFace* facep)
|
|||
const LLTextureEntry* te = facep->getTextureEntry();
|
||||
if(te && te->getID().notNull())
|
||||
{
|
||||
LLViewerTexture* tex = gTextureList.findImage(te->getID(), TEX_LIST_DISCARD);
|
||||
LLViewerTexture* tex = gTextureList.findImage(te->getID(), TEX_LIST_STANDARD);
|
||||
if(tex)
|
||||
{
|
||||
mTextureList.push_back(tex);//increase the reference number by one for tex to avoid deleting it.
|
||||
|
|
@ -3526,7 +3527,7 @@ void LLViewerMediaTexture::removeFace(U32 ch, LLFace* facep)
|
|||
const LLTextureEntry* te = facep->getTextureEntry();
|
||||
if(te && te->getID().notNull())
|
||||
{
|
||||
LLViewerTexture* tex = gTextureList.findImage(te->getID(), TEX_LIST_DISCARD);
|
||||
LLViewerTexture* tex = gTextureList.findImage(te->getID(), TEX_LIST_STANDARD);
|
||||
if(tex)
|
||||
{
|
||||
for(std::list< LLPointer<LLViewerTexture> >::iterator iter = mTextureList.begin();
|
||||
|
|
@ -3635,10 +3636,10 @@ void LLViewerMediaTexture::switchTexture(U32 ch, LLFace* facep)
|
|||
const LLTextureEntry* te = facep->getTextureEntry();
|
||||
if(te)
|
||||
{
|
||||
LLViewerTexture* tex = te->getID().notNull() ? gTextureList.findImage(te->getID(), TEX_LIST_DISCARD) : NULL;
|
||||
LLViewerTexture* tex = te->getID().notNull() ? gTextureList.findImage(te->getID(), TEX_LIST_STANDARD) : NULL;
|
||||
if(!tex && te->getID() != mID)//try parcel media.
|
||||
{
|
||||
tex = gTextureList.findImage(mID, TEX_LIST_DISCARD);
|
||||
tex = gTextureList.findImage(mID, TEX_LIST_STANDARD);
|
||||
}
|
||||
if(!tex)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -72,20 +72,14 @@ static LLTrace::BlockTimerStatHandle FTM_PROCESS_IMAGES("Process Images");
|
|||
|
||||
ETexListType get_element_type(S32 priority)
|
||||
{
|
||||
// don't discard flag can be used in some cases, but it usually is not set yet
|
||||
if (priority == LLViewerFetchedTexture::BOOST_ICON
|
||||
|| priority == LLViewerFetchedTexture::BOOST_UI)
|
||||
{
|
||||
return TEX_LIST_UI;
|
||||
}
|
||||
return TEX_LIST_DISCARD;
|
||||
return (priority == LLViewerFetchedTexture::BOOST_ICON) ? TEX_LIST_SCALE : TEX_LIST_STANDARD;
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
LLTextureKey::LLTextureKey()
|
||||
: textureId(LLUUID::null),
|
||||
textureType(TEX_LIST_DISCARD)
|
||||
textureType(TEX_LIST_STANDARD)
|
||||
{
|
||||
}
|
||||
|
||||
|
|
@ -189,7 +183,7 @@ void LLViewerTextureList::doPreloadImages()
|
|||
LLPointer<LLViewerFetchedTexture> img_blak_square(new LLViewerFetchedTexture(img_blak_square_tex, FTT_DEFAULT, FALSE));
|
||||
gBlackSquareID = img_blak_square->getID();
|
||||
img_blak_square->setUnremovable(TRUE);
|
||||
addImage(img_blak_square, TEX_LIST_DISCARD);
|
||||
addImage(img_blak_square, TEX_LIST_STANDARD);
|
||||
}
|
||||
|
||||
static std::string get_texture_list_name()
|
||||
|
|
@ -456,11 +450,17 @@ LLViewerFetchedTexture* LLViewerTextureList::getImageFromUrl(const std::string&
|
|||
|
||||
if (boost_priority != 0)
|
||||
{
|
||||
if (boost_priority == LLViewerFetchedTexture::BOOST_UI
|
||||
|| boost_priority == LLViewerFetchedTexture::BOOST_ICON)
|
||||
if (boost_priority == LLViewerFetchedTexture::BOOST_UI)
|
||||
{
|
||||
imagep->dontDiscard();
|
||||
}
|
||||
if (boost_priority == LLViewerFetchedTexture::BOOST_ICON)
|
||||
{
|
||||
// Agent and group Icons are downloadable content, nothing manages
|
||||
// icon deletion yet, so they should not persist
|
||||
imagep->dontDiscard();
|
||||
imagep->forceActive();
|
||||
}
|
||||
imagep->setBoostLevel(boost_priority);
|
||||
}
|
||||
}
|
||||
|
|
@ -560,11 +560,17 @@ LLViewerFetchedTexture* LLViewerTextureList::createImage(const LLUUID &image_id,
|
|||
|
||||
if (boost_priority != 0)
|
||||
{
|
||||
if (boost_priority == LLViewerFetchedTexture::BOOST_UI
|
||||
|| boost_priority == LLViewerFetchedTexture::BOOST_ICON)
|
||||
if (boost_priority == LLViewerFetchedTexture::BOOST_UI)
|
||||
{
|
||||
imagep->dontDiscard();
|
||||
}
|
||||
if (boost_priority == LLViewerFetchedTexture::BOOST_ICON)
|
||||
{
|
||||
// Agent and group Icons are downloadable content, nothing manages
|
||||
// icon deletion yet, so they should not persist.
|
||||
imagep->dontDiscard();
|
||||
imagep->forceActive();
|
||||
}
|
||||
imagep->setBoostLevel(boost_priority);
|
||||
}
|
||||
else
|
||||
|
|
@ -585,7 +591,7 @@ LLViewerFetchedTexture* LLViewerTextureList::createImage(const LLUUID &image_id,
|
|||
|
||||
void LLViewerTextureList::findTexturesByID(const LLUUID &image_id, std::vector<LLViewerFetchedTexture*> &output)
|
||||
{
|
||||
LLTextureKey search_key(image_id, TEX_LIST_DISCARD);
|
||||
LLTextureKey search_key(image_id, TEX_LIST_STANDARD);
|
||||
uuid_map_t::iterator iter = mUUIDMap.lower_bound(search_key);
|
||||
while (iter != mUUIDMap.end() && iter->first.textureId == image_id)
|
||||
{
|
||||
|
|
@ -1591,14 +1597,14 @@ void LLViewerTextureList::processImageNotInDatabase(LLMessageSystem *msg,void **
|
|||
LLUUID image_id;
|
||||
msg->getUUIDFast(_PREHASH_ImageID, _PREHASH_ID, image_id);
|
||||
|
||||
LLViewerFetchedTexture* image = gTextureList.findImage( image_id, TEX_LIST_DISCARD);
|
||||
LLViewerFetchedTexture* image = gTextureList.findImage( image_id, TEX_LIST_STANDARD);
|
||||
if( image )
|
||||
{
|
||||
LL_WARNS() << "Image not in db" << LL_ENDL;
|
||||
image->setIsMissingAsset();
|
||||
}
|
||||
|
||||
image = gTextureList.findImage(image_id, TEX_LIST_UI);
|
||||
image = gTextureList.findImage(image_id, TEX_LIST_SCALE);
|
||||
if (image)
|
||||
{
|
||||
LL_WARNS() << "Icon not in db" << LL_ENDL;
|
||||
|
|
|
|||
|
|
@ -61,8 +61,8 @@ typedef void (*LLImageCallback)(BOOL success,
|
|||
|
||||
enum ETexListType
|
||||
{
|
||||
TEX_LIST_DISCARD = 0,
|
||||
TEX_LIST_UI
|
||||
TEX_LIST_STANDARD = 0,
|
||||
TEX_LIST_SCALE
|
||||
};
|
||||
|
||||
struct LLTextureKey
|
||||
|
|
|
|||
|
|
@ -1036,7 +1036,16 @@ BOOL LLViewerWindow::handleAnyMouseClick(LLWindow *window, LLCoordGL pos, MASK
|
|||
|
||||
BOOL LLViewerWindow::handleMouseDown(LLWindow *window, LLCoordGL pos, MASK mask)
|
||||
{
|
||||
BOOL down = TRUE;
|
||||
mAllowMouseDragging = FALSE;
|
||||
if (!mMouseDownTimer.getStarted())
|
||||
{
|
||||
mMouseDownTimer.start();
|
||||
}
|
||||
else
|
||||
{
|
||||
mMouseDownTimer.reset();
|
||||
}
|
||||
BOOL down = TRUE;
|
||||
return handleAnyMouseClick(window,pos,mask,LLMouseHandler::CLICK_LEFT,down);
|
||||
}
|
||||
|
||||
|
|
@ -1055,7 +1064,11 @@ BOOL LLViewerWindow::handleDoubleClick(LLWindow *window, LLCoordGL pos, MASK ma
|
|||
|
||||
BOOL LLViewerWindow::handleMouseUp(LLWindow *window, LLCoordGL pos, MASK mask)
|
||||
{
|
||||
BOOL down = FALSE;
|
||||
if (mMouseDownTimer.getStarted())
|
||||
{
|
||||
mMouseDownTimer.stop();
|
||||
}
|
||||
BOOL down = FALSE;
|
||||
return handleAnyMouseClick(window,pos,mask,LLMouseHandler::CLICK_LEFT,down);
|
||||
}
|
||||
|
||||
|
|
@ -1287,6 +1300,22 @@ void LLViewerWindow::handleMouseMove(LLWindow *window, LLCoordGL pos, MASK mask
|
|||
}
|
||||
}
|
||||
|
||||
void LLViewerWindow::handleMouseDragged(LLWindow *window, LLCoordGL pos, MASK mask)
|
||||
{
|
||||
if (mMouseDownTimer.getStarted())
|
||||
{
|
||||
if (mMouseDownTimer.getElapsedTimeF32() > 0.1)
|
||||
{
|
||||
mAllowMouseDragging = TRUE;
|
||||
mMouseDownTimer.stop();
|
||||
}
|
||||
}
|
||||
if(mAllowMouseDragging || !LLToolCamera::getInstance()->hasMouseCapture())
|
||||
{
|
||||
handleMouseMove(window, pos, mask);
|
||||
}
|
||||
}
|
||||
|
||||
void LLViewerWindow::handleMouseLeave(LLWindow *window)
|
||||
{
|
||||
// Note: we won't get this if we have captured the mouse.
|
||||
|
|
@ -1616,6 +1645,8 @@ LLViewerWindow::LLViewerWindow(const Params& p)
|
|||
mMiddleMouseDown(FALSE),
|
||||
mRightMouseDown(FALSE),
|
||||
mMouseInWindow( FALSE ),
|
||||
mAllowMouseDragging(TRUE),
|
||||
mMouseDownTimer(),
|
||||
mLastMask( MASK_NONE ),
|
||||
mToolStored( NULL ),
|
||||
mHideCursorPermanent( FALSE ),
|
||||
|
|
@ -4950,6 +4981,13 @@ void LLViewerWindow::stopGL(BOOL save_state)
|
|||
|
||||
gGLManager.mIsDisabled = TRUE;
|
||||
stop_glerror();
|
||||
|
||||
//unload shader's
|
||||
while (LLGLSLShader::sInstances.size())
|
||||
{
|
||||
LLGLSLShader* shader = *(LLGLSLShader::sInstances.begin());
|
||||
shader->unload();
|
||||
}
|
||||
|
||||
LL_INFOS() << "Remaining allocated texture memory: " << LLImageGL::sGlobalTextureMemory.value() << " bytes" << LL_ENDL;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -193,6 +193,7 @@ public:
|
|||
/*virtual*/ BOOL handleMiddleMouseUp(LLWindow *window, LLCoordGL pos, MASK mask);
|
||||
/*virtual*/ LLWindowCallbacks::DragNDropResult handleDragNDrop(LLWindow *window, LLCoordGL pos, MASK mask, LLWindowCallbacks::DragNDropAction action, std::string data);
|
||||
void handleMouseMove(LLWindow *window, LLCoordGL pos, MASK mask);
|
||||
void handleMouseDragged(LLWindow *window, LLCoordGL pos, MASK mask);
|
||||
/*virtual*/ void handleMouseLeave(LLWindow *window);
|
||||
/*virtual*/ void handleResize(LLWindow *window, S32 x, S32 y);
|
||||
/*virtual*/ void handleFocus(LLWindow *window);
|
||||
|
|
@ -463,6 +464,8 @@ private:
|
|||
|
||||
BOOL mMouseInWindow; // True if the mouse is over our window or if we have captured the mouse.
|
||||
BOOL mFocusCycleMode;
|
||||
BOOL mAllowMouseDragging;
|
||||
LLFrameTimer mMouseDownTimer;
|
||||
typedef std::set<LLHandle<LLView> > view_handle_set_t;
|
||||
view_handle_set_t mMouseHoverViews;
|
||||
|
||||
|
|
|
|||
|
|
@ -1989,7 +1989,7 @@ LLViewerFetchedTexture *LLVOAvatar::getBakedTextureImage(const U8 te, const LLUU
|
|||
uuid == IMG_INVISIBLE)
|
||||
{
|
||||
// Should already exist, don't need to find it on sim or baked-texture host.
|
||||
result = gTextureList.findImage(uuid, TEX_LIST_DISCARD);
|
||||
result = gTextureList.findImage(uuid, TEX_LIST_STANDARD);
|
||||
}
|
||||
if (!result)
|
||||
{
|
||||
|
|
@ -4261,7 +4261,7 @@ bool LLVOAvatar::allTexturesCompletelyDownloaded(std::set<LLUUID>& ids) const
|
|||
{
|
||||
for (std::set<LLUUID>::const_iterator it = ids.begin(); it != ids.end(); ++it)
|
||||
{
|
||||
LLViewerFetchedTexture *imagep = gTextureList.findImage(*it, TEX_LIST_DISCARD);
|
||||
LLViewerFetchedTexture *imagep = gTextureList.findImage(*it, TEX_LIST_STANDARD);
|
||||
if (imagep && imagep->getDiscardLevel()!=0)
|
||||
{
|
||||
return false;
|
||||
|
|
@ -4333,7 +4333,7 @@ S32Bytes LLVOAvatar::totalTextureMemForUUIDS(std::set<LLUUID>& ids)
|
|||
S32Bytes result(0);
|
||||
for (std::set<LLUUID>::const_iterator it = ids.begin(); it != ids.end(); ++it)
|
||||
{
|
||||
LLViewerFetchedTexture *imagep = gTextureList.findImage(*it, TEX_LIST_DISCARD);
|
||||
LLViewerFetchedTexture *imagep = gTextureList.findImage(*it, TEX_LIST_STANDARD);
|
||||
if (imagep)
|
||||
{
|
||||
result += imagep->getTextureMemory();
|
||||
|
|
@ -4421,7 +4421,7 @@ void LLVOAvatar::releaseOldTextures()
|
|||
{
|
||||
if (new_texture_ids.find(*it) == new_texture_ids.end())
|
||||
{
|
||||
LLViewerFetchedTexture *imagep = gTextureList.findImage(*it, TEX_LIST_DISCARD);
|
||||
LLViewerFetchedTexture *imagep = gTextureList.findImage(*it, TEX_LIST_STANDARD);
|
||||
if (imagep)
|
||||
{
|
||||
current_texture_mem += imagep->getTextureMemory();
|
||||
|
|
@ -7935,6 +7935,13 @@ void LLVOAvatar::dumpArchetypeXML(const std::string& prefix, bool group_by_weara
|
|||
// show the cloned params inside the wearables as well.
|
||||
gAgentAvatarp->dumpWearableInfo(outfile);
|
||||
}
|
||||
LLSD args;
|
||||
args["PATH"] = fullpath;
|
||||
LLNotificationsUtil::add("AppearanceToXMLSaved", args);
|
||||
}
|
||||
else
|
||||
{
|
||||
LLNotificationsUtil::add("AppearanceToXMLFailed");
|
||||
}
|
||||
// File will close when handle goes out of scope
|
||||
}
|
||||
|
|
|
|||
|
|
@ -657,19 +657,25 @@ void LLVoiceClient::keyDown(KEY key, MASK mask)
|
|||
return;
|
||||
}
|
||||
|
||||
if(!mPTTIsMiddleMouse && LLAgent::isActionAllowed("speak"))
|
||||
if (!mPTTIsMiddleMouse && LLAgent::isActionAllowed("speak") && (key == mPTTKey))
|
||||
{
|
||||
bool down = (mPTTKey != KEY_NONE) && gKeyboard->getKeyDown(mPTTKey);
|
||||
if (down) { inputUserControlState(down); }
|
||||
bool down = gKeyboard->getKeyDown(mPTTKey);
|
||||
if (down)
|
||||
{
|
||||
inputUserControlState(down);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
void LLVoiceClient::keyUp(KEY key, MASK mask)
|
||||
{
|
||||
if(!mPTTIsMiddleMouse)
|
||||
if (!mPTTIsMiddleMouse && (key == mPTTKey))
|
||||
{
|
||||
bool down = (mPTTKey != KEY_NONE) && gKeyboard->getKeyDown(mPTTKey);
|
||||
if (down) { inputUserControlState(down); }
|
||||
bool down = gKeyboard->getKeyDown(mPTTKey);
|
||||
if (!down)
|
||||
{
|
||||
inputUserControlState(down);
|
||||
}
|
||||
}
|
||||
}
|
||||
void LLVoiceClient::middleMouseState(bool down)
|
||||
|
|
|
|||
|
|
@ -80,39 +80,49 @@
|
|||
extern LLMenuBarGL* gMenuBarView;
|
||||
extern void handle_voice_morphing_subscribe();
|
||||
|
||||
const F32 VOLUME_SCALE_VIVOX = 0.01f;
|
||||
namespace {
|
||||
const F32 VOLUME_SCALE_VIVOX = 0.01f;
|
||||
|
||||
const F32 SPEAKING_TIMEOUT = 1.f;
|
||||
const F32 SPEAKING_TIMEOUT = 1.f;
|
||||
|
||||
static const std::string VOICE_SERVER_TYPE = "Vivox";
|
||||
static const std::string VOICE_SERVER_TYPE = "Vivox";
|
||||
|
||||
// Don't retry connecting to the daemon more frequently than this:
|
||||
const F32 CONNECT_THROTTLE_SECONDS = 1.0f;
|
||||
// Don't retry connecting to the daemon more frequently than this:
|
||||
const F32 CONNECT_THROTTLE_SECONDS = 1.0f;
|
||||
|
||||
// Don't send positional updates more frequently than this:
|
||||
const F32 UPDATE_THROTTLE_SECONDS = 0.5f;
|
||||
// Don't send positional updates more frequently than this:
|
||||
const F32 UPDATE_THROTTLE_SECONDS = 0.5f;
|
||||
|
||||
const F32 LOGIN_RETRY_SECONDS = 10.0f;
|
||||
const int MAX_LOGIN_RETRIES = 12;
|
||||
const F32 LOGIN_ATTEMPT_TIMEOUT = 5.0f;
|
||||
const int LOGIN_RETRY_MAX = 5;
|
||||
const F32 LOGIN_RETRY_TIMEOUT = 4.0f;
|
||||
|
||||
// Cosine of a "trivially" small angle
|
||||
const F32 MINUSCULE_ANGLE_COS = 0.999f;
|
||||
const int PROVISION_RETRY_MAX = 5;
|
||||
const F32 PROVISION_RETRY_TIMEOUT = 2.0;
|
||||
|
||||
// Defines the maximum number of times(in a row) "stateJoiningSession" case for spatial channel is reached in stateMachine()
|
||||
// which is treated as normal. The is the number of frames to wait for a channel join before giving up. This was changed
|
||||
// from the original count of 50 for two reason. Modern PCs have higher frame rates and sometimes the SLVoice process
|
||||
// backs up processing join requests. There is a log statement that records when channel joins take longer than 100 frames.
|
||||
const int MAX_NORMAL_JOINING_SPATIAL_NUM = 1500;
|
||||
// Cosine of a "trivially" small angle
|
||||
const F32 MINUSCULE_ANGLE_COS = 0.999f;
|
||||
|
||||
// How often to check for expired voice fonts in seconds
|
||||
const F32 VOICE_FONT_EXPIRY_INTERVAL = 10.f;
|
||||
// Time of day at which Vivox expires voice font subscriptions.
|
||||
// Used to replace the time portion of received expiry timestamps.
|
||||
static const std::string VOICE_FONT_EXPIRY_TIME = "T05:00:00Z";
|
||||
const F32 SESSION_JOIN_TIMEOUT = 10.0f;
|
||||
|
||||
// Maximum length of capture buffer recordings in seconds.
|
||||
const F32 CAPTURE_BUFFER_MAX_TIME = 10.f;
|
||||
// Defines the maximum number of times(in a row) "stateJoiningSession" case for spatial channel is reached in stateMachine()
|
||||
// which is treated as normal. The is the number of frames to wait for a channel join before giving up. This was changed
|
||||
// from the original count of 50 for two reason. Modern PCs have higher frame rates and sometimes the SLVoice process
|
||||
// backs up processing join requests. There is a log statement that records when channel joins take longer than 100 frames.
|
||||
const int MAX_NORMAL_JOINING_SPATIAL_NUM = 1500;
|
||||
|
||||
// How often to check for expired voice fonts in seconds
|
||||
const F32 VOICE_FONT_EXPIRY_INTERVAL = 10.f;
|
||||
// Time of day at which Vivox expires voice font subscriptions.
|
||||
// Used to replace the time portion of received expiry timestamps.
|
||||
static const std::string VOICE_FONT_EXPIRY_TIME = "T05:00:00Z";
|
||||
|
||||
// Maximum length of capture buffer recordings in seconds.
|
||||
const F32 CAPTURE_BUFFER_MAX_TIME = 10.f;
|
||||
|
||||
const int ERROR_VIVOX_OBJECT_NOT_FOUND = 1001;
|
||||
const int ERROR_VIVOX_NOT_LOGGED_IN = 1007;
|
||||
}
|
||||
|
||||
static int scale_mic_volume(float volume)
|
||||
{
|
||||
|
|
@ -129,8 +139,6 @@ static int scale_speaker_volume(float volume)
|
|||
|
||||
}
|
||||
|
||||
const int ERROR_VIVOX_OBJECT_NOT_FOUND = 1001;
|
||||
const int ERROR_VIVOX_NOT_LOGGED_IN = 1007;
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
|
@ -546,7 +554,7 @@ void LLVivoxVoiceClient::voiceControlCoro()
|
|||
// if we hit this and mRelogRequested is true, that indicates
|
||||
// that we attempted to relog into Vivox and were rejected.
|
||||
// Rather than just quit out of voice, we will tear it down (above)
|
||||
// and then reconstruct the voice connecino from scratch.
|
||||
// and then reconstruct the voice connecion from scratch.
|
||||
if (mRelogRequested)
|
||||
{
|
||||
while (isGatewayRunning())
|
||||
|
|
@ -784,13 +792,15 @@ bool LLVivoxVoiceClient::provisionVoiceAccount()
|
|||
|
||||
if (status == LLCore::HttpStatus(404))
|
||||
{
|
||||
if (++retryCount > 5)
|
||||
if (++retryCount > PROVISION_RETRY_MAX)
|
||||
{
|
||||
LL_WARNS("Voice") << "Could not access voice provision cap after 5 attempts." << LL_ENDL;
|
||||
LL_WARNS("Voice") << "Could not access voice provision cap after " << PROVISION_RETRY_MAX << " attempts." << LL_ENDL;
|
||||
return false;
|
||||
}
|
||||
LL_WARNS("Voice") << "Provision CAP 404. Retrying in 1.0" << LL_ENDL;
|
||||
llcoro::suspendUntilTimeout(1.0);
|
||||
|
||||
F32 timeout = pow(PROVISION_RETRY_TIMEOUT, static_cast<float>(retryCount));
|
||||
LL_WARNS("Voice") << "Provision CAP 404. Retrying in " << timeout << " seconds." << LL_ENDL;
|
||||
llcoro::suspendUntilTimeout(timeout);
|
||||
|
||||
continue;
|
||||
}
|
||||
|
|
@ -888,38 +898,42 @@ bool LLVivoxVoiceClient::breakVoiceConnection(bool corowait)
|
|||
|
||||
bool LLVivoxVoiceClient::loginToVivox()
|
||||
{
|
||||
int loginRetryCount(0);
|
||||
LLEventPump &voicePump = LLEventPumps::instance().obtain("vivoxClientPump");
|
||||
|
||||
LLSD timeoutResult(LLSDMap("login", "timeout"));
|
||||
|
||||
int loginRetryCount(0);
|
||||
|
||||
bool response_ok(false);
|
||||
bool account_login(false);
|
||||
bool send_login(true);
|
||||
|
||||
do
|
||||
{
|
||||
|
||||
mIsLoggingIn = true;
|
||||
if (send_login)
|
||||
loginSendMessage();
|
||||
|
||||
send_login = false;
|
||||
|
||||
LLSD result = llcoro::suspendUntilEventOn(voicePump);
|
||||
LLSD result = llcoro::suspendUntilEventOnWithTimeout(voicePump, LOGIN_ATTEMPT_TIMEOUT, timeoutResult);
|
||||
LL_DEBUGS("Voice") << "event=" << ll_pretty_print_sd(result) << LL_ENDL;
|
||||
|
||||
if (result.has("login"))
|
||||
{
|
||||
std::string loginresp = result["login"];
|
||||
|
||||
if (loginresp == "retry")
|
||||
if ((loginresp == "retry") || (loginresp == "timeout"))
|
||||
{
|
||||
if (!loginRetryCount)
|
||||
if ((!loginRetryCount) && (loginresp != "timeout"))
|
||||
{ // on first retry notify user
|
||||
notifyStatusObservers(LLVoiceClientStatusObserver::STATUS_LOGIN_RETRY);
|
||||
}
|
||||
|
||||
if ((++loginRetryCount > MAX_LOGIN_RETRIES) || (!result["login_retry"]))
|
||||
if ((++loginRetryCount > LOGIN_RETRY_MAX) || (loginresp == "timeout"))
|
||||
{
|
||||
LL_WARNS("Voice") << "too many login retries, giving up." << LL_ENDL;
|
||||
LL_WARNS("Voice") << "too many login retries or timeout connecting, giving up." << LL_ENDL;
|
||||
LLSD args;
|
||||
std::stringstream errs;
|
||||
errs << mVoiceAccountServerURI << "\n:UDP: 3478, 3479, 5060, 5062, 12000-17000";
|
||||
|
|
@ -942,8 +956,10 @@ bool LLVivoxVoiceClient::loginToVivox()
|
|||
account_login = false;
|
||||
send_login = true;
|
||||
|
||||
LL_INFOS("Voice") << "will retry login in " << LOGIN_RETRY_SECONDS << " seconds." << LL_ENDL;
|
||||
llcoro::suspendUntilTimeout(LOGIN_RETRY_SECONDS);
|
||||
F32 timeout = pow(LOGIN_RETRY_TIMEOUT, static_cast<float>(loginRetryCount)) - 1.0f;
|
||||
|
||||
LL_INFOS("Voice") << "will retry login in " << timeout << " seconds." << LL_ENDL;
|
||||
llcoro::suspendUntilTimeout(timeout);
|
||||
}
|
||||
else if (loginresp == "failed")
|
||||
{
|
||||
|
|
@ -982,7 +998,6 @@ bool LLVivoxVoiceClient::loginToVivox()
|
|||
|
||||
void LLVivoxVoiceClient::logoutOfVivox(bool wait)
|
||||
{
|
||||
LLEventPump &voicePump = LLEventPumps::instance().obtain("vivoxClientPump");
|
||||
|
||||
if (!mIsLoggedIn)
|
||||
return;
|
||||
|
|
@ -995,7 +1010,10 @@ void LLVivoxVoiceClient::logoutOfVivox(bool wait)
|
|||
|
||||
if (wait)
|
||||
{
|
||||
LLSD result = llcoro::suspendUntilEventOn(voicePump);
|
||||
LLEventPump &voicePump = LLEventPumps::instance().obtain("vivoxClientPump");
|
||||
LLSD timeoutResult(LLSDMap("lougout", "timeout"));
|
||||
|
||||
LLSD result = llcoro::suspendUntilEventOnWithTimeout(voicePump, LOGIN_ATTEMPT_TIMEOUT, timeoutResult);
|
||||
|
||||
LL_DEBUGS("Voice") << "event=" << ll_pretty_print_sd(result) << LL_ENDL;
|
||||
|
||||
|
|
@ -1169,6 +1187,7 @@ bool LLVivoxVoiceClient::addAndJoinSession(const sessionStatePtr_t &nextSession)
|
|||
|
||||
if (!mVoiceEnabled && mIsInitialized)
|
||||
{
|
||||
LL_DEBUGS("Voice") << "Voice no longer enabled. Exiting." << LL_ENDL;
|
||||
mIsJoiningSession = false;
|
||||
// User bailed out during connect -- jump straight to teardown.
|
||||
terminateAudioSession(true);
|
||||
|
|
@ -1177,6 +1196,7 @@ bool LLVivoxVoiceClient::addAndJoinSession(const sessionStatePtr_t &nextSession)
|
|||
}
|
||||
else if (mSessionTerminateRequested)
|
||||
{
|
||||
LL_DEBUGS("Voice") << "Terminate requested" << LL_ENDL;
|
||||
if (mAudioSession && !mAudioSession->mHandle.empty())
|
||||
{
|
||||
// Only allow direct exits from this state in p2p calls (for cancelling an invite).
|
||||
|
|
@ -1194,15 +1214,17 @@ bool LLVivoxVoiceClient::addAndJoinSession(const sessionStatePtr_t &nextSession)
|
|||
bool added(true);
|
||||
bool joined(false);
|
||||
|
||||
LLSD timeoutResult(LLSDMap("session", "timeout"));
|
||||
|
||||
// It appears that I need to wait for BOTH the SessionGroup.AddSession response and the SessionStateChangeEvent with state 4
|
||||
// before continuing from this state. They can happen in either order, and if I don't wait for both, things can get stuck.
|
||||
// For now, the SessionGroup.AddSession response handler sets mSessionHandle and the SessionStateChangeEvent handler transitions to stateSessionJoined.
|
||||
// This is a cheap way to make sure both have happened before proceeding.
|
||||
do
|
||||
{
|
||||
result = llcoro::suspendUntilEventOn(voicePump);
|
||||
result = llcoro::suspendUntilEventOnWithTimeout(voicePump, SESSION_JOIN_TIMEOUT, timeoutResult);
|
||||
|
||||
LL_DEBUGS("Voice") << "event=" << ll_pretty_print_sd(result) << LL_ENDL;
|
||||
LL_INFOS("Voice") << "event=" << ll_pretty_print_sd(result) << LL_ENDL;
|
||||
if (result.has("session"))
|
||||
{
|
||||
if (result.has("handle"))
|
||||
|
|
@ -1215,14 +1237,15 @@ bool LLVivoxVoiceClient::addAndJoinSession(const sessionStatePtr_t &nextSession)
|
|||
}
|
||||
|
||||
std::string message = result["session"].asString();
|
||||
|
||||
if ((message == "added") || (message == "created"))
|
||||
added = true;
|
||||
else if (message == "joined")
|
||||
joined = true;
|
||||
else if ((message == "failed") || (message == "removed"))
|
||||
else if ((message == "failed") || (message == "removed") || (message == "timeout"))
|
||||
{ // we will get a removed message if a voice call is declined.
|
||||
|
||||
if (message == "failed")
|
||||
if (message == "failed")
|
||||
{
|
||||
int reason = result["reason"].asInteger();
|
||||
LL_WARNS("Voice") << "Add and join failed for reason " << reason << LL_ENDL;
|
||||
|
|
@ -1230,7 +1253,7 @@ bool LLVivoxVoiceClient::addAndJoinSession(const sessionStatePtr_t &nextSession)
|
|||
if ((reason == ERROR_VIVOX_NOT_LOGGED_IN) ||
|
||||
(reason == ERROR_VIVOX_OBJECT_NOT_FOUND))
|
||||
{
|
||||
LL_INFOS("Voice") << "Requesting reprovision and login." << LL_ENDL;
|
||||
LL_DEBUGS("Voice") << "Requesting reprovision and login." << LL_ENDL;
|
||||
requestRelog();
|
||||
}
|
||||
|
||||
|
|
@ -1472,11 +1495,9 @@ bool LLVivoxVoiceClient::runSession(const sessionStatePtr_t &session)
|
|||
notifyParticipantObservers();
|
||||
notifyVoiceFontObservers();
|
||||
|
||||
LLSD timeoutEvent = LLSD::emptyMap();
|
||||
timeoutEvent["timeout"] = LLSD::Boolean(true);
|
||||
LLSD timeoutEvent(LLSDMap("timeout", LLSD::Boolean(true)));
|
||||
|
||||
LLEventPump &voicePump = LLEventPumps::instance().obtain("vivoxClientPump");
|
||||
LLEventTimeout timeout(voicePump);
|
||||
mIsInChannel = true;
|
||||
mMuteMicDirty = true;
|
||||
|
||||
|
|
@ -1528,8 +1549,7 @@ bool LLVivoxVoiceClient::runSession(const sessionStatePtr_t &session)
|
|||
sendLocalAudioUpdates();
|
||||
|
||||
mIsInitialized = true;
|
||||
timeout.eventAfter(UPDATE_THROTTLE_SECONDS, timeoutEvent);
|
||||
LLSD result = llcoro::suspendUntilEventOn(timeout);
|
||||
LLSD result = llcoro::suspendUntilEventOnWithTimeout(voicePump, UPDATE_THROTTLE_SECONDS, timeoutEvent);
|
||||
if (!result.has("timeout")) // logging the timeout event spams the log
|
||||
LL_DEBUGS("Voice") << "event=" << ll_pretty_print_sd(result) << LL_ENDL;
|
||||
if (result.has("session"))
|
||||
|
|
@ -1627,22 +1647,19 @@ void LLVivoxVoiceClient::recordingAndPlaybackMode()
|
|||
|
||||
int LLVivoxVoiceClient::voiceRecordBuffer()
|
||||
{
|
||||
LLSD timeoutResult;
|
||||
timeoutResult["recplay"] = LLSD::String("stop");
|
||||
LLSD timeoutResult(LLSDMap("recplay", "stop"));
|
||||
|
||||
LL_INFOS("Voice") << "Recording voice buffer" << LL_ENDL;
|
||||
|
||||
LLEventPump &voicePump = LLEventPumps::instance().obtain("vivoxClientPump");
|
||||
LLEventTimeout timeout(voicePump);
|
||||
timeout.eventAfter(CAPTURE_BUFFER_MAX_TIME, timeoutResult);
|
||||
LLSD result;
|
||||
|
||||
captureBufferRecordStartSendMessage();
|
||||
|
||||
notifyVoiceFontObservers();
|
||||
|
||||
do
|
||||
{
|
||||
result = llcoro::suspendUntilEventOn(voicePump);
|
||||
result = llcoro::suspendUntilEventOnWithTimeout(voicePump, CAPTURE_BUFFER_MAX_TIME, timeoutResult);
|
||||
LL_DEBUGS("Voice") << "event=" << ll_pretty_print_sd(result) << LL_ENDL;
|
||||
} while (!result.has("recplay"));
|
||||
|
||||
|
|
@ -1660,14 +1677,11 @@ int LLVivoxVoiceClient::voiceRecordBuffer()
|
|||
|
||||
int LLVivoxVoiceClient::voicePlaybackBuffer()
|
||||
{
|
||||
LLSD timeoutResult;
|
||||
timeoutResult["recplay"] = LLSD::String("stop");
|
||||
LLSD timeoutResult(LLSDMap("recplay", "stop"));
|
||||
|
||||
LL_INFOS("Voice") << "Playing voice buffer" << LL_ENDL;
|
||||
|
||||
LLEventPump &voicePump = LLEventPumps::instance().obtain("vivoxClientPump");
|
||||
LLEventTimeout timeout(voicePump);
|
||||
timeout.eventAfter(CAPTURE_BUFFER_MAX_TIME, timeoutResult);
|
||||
LLSD result;
|
||||
|
||||
do
|
||||
|
|
@ -1682,7 +1696,7 @@ int LLVivoxVoiceClient::voicePlaybackBuffer()
|
|||
// Update UI, should really use a separate callback.
|
||||
notifyVoiceFontObservers();
|
||||
|
||||
result = llcoro::suspendUntilEventOn(voicePump);
|
||||
result = llcoro::suspendUntilEventOnWithTimeout(voicePump, CAPTURE_BUFFER_MAX_TIME, timeoutResult);
|
||||
LL_DEBUGS("Voice") << "event=" << ll_pretty_print_sd(result) << LL_ENDL;
|
||||
} while (!result.has("recplay"));
|
||||
|
||||
|
|
@ -2902,11 +2916,9 @@ void LLVivoxVoiceClient::sessionCreateResponse(std::string &requestId, int statu
|
|||
session->mErrorStatusString = statusString;
|
||||
if(session == mAudioSession)
|
||||
{
|
||||
LLSD vivoxevent = LLSD::emptyMap();
|
||||
|
||||
vivoxevent["handle"] = LLSD::String(sessionHandle);
|
||||
vivoxevent["session"] = LLSD::String("failed");
|
||||
vivoxevent["reason"] = LLSD::Integer(statusCode);
|
||||
LLSD vivoxevent(LLSDMap("handle", LLSD::String(sessionHandle))
|
||||
("session", "failed")
|
||||
("reason", LLSD::Integer(statusCode)));
|
||||
|
||||
LLEventPumps::instance().post("vivoxClientPump", vivoxevent);
|
||||
}
|
||||
|
|
@ -2923,10 +2935,8 @@ void LLVivoxVoiceClient::sessionCreateResponse(std::string &requestId, int statu
|
|||
{
|
||||
setSessionHandle(session, sessionHandle);
|
||||
}
|
||||
LLSD vivoxevent = LLSD::emptyMap();
|
||||
|
||||
vivoxevent["handle"] = LLSD::String(sessionHandle);
|
||||
vivoxevent["session"] = LLSD::String("created");
|
||||
LLSD vivoxevent(LLSDMap("handle", LLSD::String(sessionHandle))
|
||||
("session", "created"));
|
||||
|
||||
LLEventPumps::instance().post("vivoxClientPump", vivoxevent);
|
||||
}
|
||||
|
|
@ -2950,10 +2960,8 @@ void LLVivoxVoiceClient::sessionGroupAddSessionResponse(std::string &requestId,
|
|||
session->mErrorStatusString = statusString;
|
||||
if(session == mAudioSession)
|
||||
{
|
||||
LLSD vivoxevent = LLSD::emptyMap();
|
||||
|
||||
vivoxevent["handle"] = LLSD::String(sessionHandle);
|
||||
vivoxevent["session"] = LLSD::String("failed");
|
||||
LLSD vivoxevent(LLSDMap("handle", LLSD::String(sessionHandle))
|
||||
("session", "failed"));
|
||||
|
||||
LLEventPumps::instance().post("vivoxClientPump", vivoxevent);
|
||||
}
|
||||
|
|
@ -2971,10 +2979,8 @@ void LLVivoxVoiceClient::sessionGroupAddSessionResponse(std::string &requestId,
|
|||
setSessionHandle(session, sessionHandle);
|
||||
}
|
||||
|
||||
LLSD vivoxevent = LLSD::emptyMap();
|
||||
|
||||
vivoxevent["handle"] = LLSD::String(sessionHandle);
|
||||
vivoxevent["session"] = LLSD::String("added");
|
||||
LLSD vivoxevent(LLSDMap("handle", LLSD::String(sessionHandle))
|
||||
("session", "added"));
|
||||
|
||||
LLEventPumps::instance().post("vivoxClientPump", vivoxevent);
|
||||
|
||||
|
|
@ -3019,9 +3025,7 @@ void LLVivoxVoiceClient::logoutResponse(int statusCode, std::string &statusStrin
|
|||
LL_WARNS("Voice") << "Account.Logout response failure: " << statusString << LL_ENDL;
|
||||
// Should this ever fail? do we care if it does?
|
||||
}
|
||||
LLSD vivoxevent = LLSD::emptyMap();
|
||||
|
||||
vivoxevent["logout"] = LLSD::Boolean(true);
|
||||
LLSD vivoxevent(LLSDMap("logout", LLSD::Boolean(true)));
|
||||
|
||||
LLEventPumps::instance().post("vivoxClientPump", vivoxevent);
|
||||
}
|
||||
|
|
@ -3036,9 +3040,7 @@ void LLVivoxVoiceClient::connectorShutdownResponse(int statusCode, std::string &
|
|||
|
||||
mConnected = false;
|
||||
|
||||
LLSD vivoxevent = LLSD::emptyMap();
|
||||
|
||||
vivoxevent["connector"] = LLSD::Boolean(false);
|
||||
LLSD vivoxevent(LLSDMap("connector", LLSD::Boolean(false)));
|
||||
|
||||
LLEventPumps::instance().post("vivoxClientPump", vivoxevent);
|
||||
}
|
||||
|
|
@ -3146,10 +3148,8 @@ void LLVivoxVoiceClient::joinedAudioSession(const sessionStatePtr_t &session)
|
|||
// This is the session we're joining.
|
||||
if(mIsJoiningSession)
|
||||
{
|
||||
LLSD vivoxevent = LLSD::emptyMap();
|
||||
|
||||
vivoxevent["handle"] = LLSD::String(session->mHandle);
|
||||
vivoxevent["session"] = LLSD::String("joined");
|
||||
LLSD vivoxevent(LLSDMap("handle", LLSD::String(session->mHandle))
|
||||
("session", "joined"));
|
||||
|
||||
LLEventPumps::instance().post("vivoxClientPump", vivoxevent);
|
||||
|
||||
|
|
@ -3292,10 +3292,8 @@ void LLVivoxVoiceClient::leftAudioSession(const sessionStatePtr_t &session)
|
|||
{
|
||||
if (mAudioSession == session)
|
||||
{
|
||||
LLSD vivoxevent = LLSD::emptyMap();
|
||||
|
||||
vivoxevent["handle"] = LLSD::String(session->mHandle);
|
||||
vivoxevent["session"] = LLSD::String("removed");
|
||||
LLSD vivoxevent(LLSDMap("handle", LLSD::String(session->mHandle))
|
||||
("session", "removed"));
|
||||
|
||||
LLEventPumps::instance().post("vivoxClientPump", vivoxevent);
|
||||
}
|
||||
|
|
@ -6150,9 +6148,7 @@ void LLVivoxVoiceClient::accountGetSessionFontsResponse(int statusCode, const st
|
|||
{
|
||||
// *TODO: We seem to get multiple events of this type. Should figure a way to advance only after
|
||||
// receiving the last one.
|
||||
LLSD result = LLSD::emptyMap();
|
||||
|
||||
result["voice_fonts"] = LLSD::Boolean(true);
|
||||
LLSD result(LLSDMap("voice_fonts", LLSD::Boolean(true)));
|
||||
|
||||
LLEventPumps::instance().post("vivoxClientPump", result);
|
||||
}
|
||||
|
|
@ -6325,8 +6321,7 @@ void LLVivoxVoiceClient::recordPreviewBuffer()
|
|||
|
||||
mCaptureBufferRecording = true;
|
||||
|
||||
LLSD result;
|
||||
result["recplay"] = "record";
|
||||
LLSD result(LLSDMap("recplay", "record"));
|
||||
LLEventPumps::instance().post("vivoxClientPump", result);
|
||||
}
|
||||
|
||||
|
|
@ -6349,8 +6344,7 @@ void LLVivoxVoiceClient::playPreviewBuffer(const LLUUID& effect_id)
|
|||
mPreviewVoiceFont = effect_id;
|
||||
mCaptureBufferPlaying = true;
|
||||
|
||||
LLSD result;
|
||||
result["recplay"] = "playback";
|
||||
LLSD result(LLSDMap("recplay", "playback"));
|
||||
LLEventPumps::instance().post("vivoxClientPump", result);
|
||||
}
|
||||
|
||||
|
|
@ -6359,8 +6353,7 @@ void LLVivoxVoiceClient::stopPreviewBuffer()
|
|||
mCaptureBufferRecording = false;
|
||||
mCaptureBufferPlaying = false;
|
||||
|
||||
LLSD result;
|
||||
result["recplay"] = "quit";
|
||||
LLSD result(LLSDMap("recplay", "quit"));
|
||||
LLEventPumps::instance().post("vivoxClientPump", result);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1426,7 +1426,7 @@ Hvis du ikke forlader regionen, vil du blive logget af.
|
|||
|
||||
[MESSAGE]
|
||||
|
||||
Fra objekt: <nolink>[OBJECTNAME]</nolink>, ejer: [NAME]?
|
||||
Fra objekt: <nolink>[OBJECTNAME]</nolink>, ejer: [NAME_SLURL]?
|
||||
<form name="form">
|
||||
<button name="Gotopage" text="Gå til side"/>
|
||||
<button name="Cancel" text="Afbryd"/>
|
||||
|
|
|
|||
|
|
@ -3002,7 +3002,7 @@ Wenn Sie in dieser Region bleiben, werden Sie abgemeldet.
|
|||
|
||||
[MESSAGE]
|
||||
|
||||
Von Objekt: <nolink>[OBJECTNAME]</nolink>, Eigentümer: [NAME]
|
||||
Von Objekt: <nolink>[OBJECTNAME]</nolink>, Eigentümer: [NAME_SLURL]
|
||||
<form name="form">
|
||||
<button name="Gotopage" text="Zur Seite"/>
|
||||
<button name="Cancel" text="Abbrechen"/>
|
||||
|
|
|
|||
|
|
@ -570,8 +570,7 @@
|
|||
left="0"
|
||||
top="0"
|
||||
help_topic="land_covenant_tab"
|
||||
name="land_covenant_panel"
|
||||
word_wrap="true">
|
||||
name="land_covenant_panel">
|
||||
<panel.string
|
||||
name="can_resell"
|
||||
word_wrap="true">
|
||||
|
|
@ -1076,7 +1075,7 @@
|
|||
name="Autoreturn"
|
||||
top_pad="0"
|
||||
width="412"
|
||||
wrap="true">
|
||||
word_wrap="true">
|
||||
Auto return other Residents' objects (minutes, 0 for off):
|
||||
</text>
|
||||
<line_editor
|
||||
|
|
@ -1461,7 +1460,7 @@ Only large parcels can be listed in search.
|
|||
top="150"
|
||||
name="allow_label5"
|
||||
width="205"
|
||||
wrap="true">
|
||||
word_wrap="true">
|
||||
Avatars on other parcels can see and chat with avatars on this parcel
|
||||
</text>
|
||||
<check_box
|
||||
|
|
|
|||
|
|
@ -3573,6 +3573,19 @@ Do you really want to bake the current terrain, make it the center for terrain r
|
|||
yestext="OK"/>
|
||||
</notification>
|
||||
|
||||
<notification
|
||||
icon="alertmodal.tga"
|
||||
name="ConfirmTextureHeights"
|
||||
type="alertmodal">
|
||||
You're about to use low values greater than high ones for Elevation Ranges. Proceed?
|
||||
<tag>confirm</tag>
|
||||
<usetemplate
|
||||
name="yesnocancelbuttons"
|
||||
yestext="Ok"
|
||||
notext="Cancel"
|
||||
canceltext="Don't ask"/>
|
||||
</notification>
|
||||
|
||||
<notification
|
||||
icon="alertmodal.tga"
|
||||
name="MaxAllowedAgentOnRegion"
|
||||
|
|
@ -3852,9 +3865,10 @@ We have downloaded an update to your [APP_NAME] installation.
|
|||
</notification>
|
||||
|
||||
<notification
|
||||
icon="alertmodal.tga"
|
||||
name="RequiredUpdateDownloadedVerboseDialog"
|
||||
type="alertmodal">
|
||||
icon="alertmodal.tga"
|
||||
name="RequiredUpdateDownloadedVerboseDialog"
|
||||
type="alertmodal"
|
||||
force_urls_external="true">
|
||||
We have downloaded a required software update.
|
||||
Version [VERSION] [[INFO_URL] Information about this update]
|
||||
|
||||
|
|
@ -3866,9 +3880,10 @@ We must restart [APP_NAME] to install the update.
|
|||
</notification>
|
||||
|
||||
<notification
|
||||
icon="alertmodal.tga"
|
||||
name="RequiredUpdateDownloadedDialog"
|
||||
type="alertmodal">
|
||||
icon="alertmodal.tga"
|
||||
name="RequiredUpdateDownloadedDialog"
|
||||
type="alertmodal"
|
||||
force_urls_external="true">
|
||||
We must restart [APP_NAME] to install the update.
|
||||
[[INFO_URL] Information about this update]
|
||||
<tag>confirm</tag>
|
||||
|
|
@ -3908,9 +3923,10 @@ see [[INFO_URL] Information about this update]
|
|||
</notification>
|
||||
|
||||
<notification
|
||||
icon="alertmodal.tga"
|
||||
name="OtherChannelRequiredUpdateDownloadedVerboseDialog"
|
||||
type="alertmodal">
|
||||
icon="alertmodal.tga"
|
||||
name="OtherChannelRequiredUpdateDownloadedVerboseDialog"
|
||||
type="alertmodal"
|
||||
force_urls_external="true">
|
||||
We have downloaded a required software update.
|
||||
Version [VERSION]
|
||||
This experimental viewer has been replaced by a [NEW_CHANNEL] viewer;
|
||||
|
|
@ -3924,9 +3940,10 @@ We must restart [APP_NAME] to install the update.
|
|||
</notification>
|
||||
|
||||
<notification
|
||||
icon="alertmodal.tga"
|
||||
name="OtherChannelRequiredUpdateDownloadedDialog"
|
||||
type="alertmodal">
|
||||
icon="alertmodal.tga"
|
||||
name="OtherChannelRequiredUpdateDownloadedDialog"
|
||||
type="alertmodal"
|
||||
force_urls_external="true">
|
||||
We must restart [APP_NAME] to install the update.
|
||||
This experimental viewer has been replaced by a [NEW_CHANNEL] viewer;
|
||||
see [[INFO_URL] Information about this update]
|
||||
|
|
@ -5946,6 +5963,18 @@ Are you sure you want to permanently delete the contents of your Trash?
|
|||
yestext="OK"/>
|
||||
</notification>
|
||||
|
||||
<notification
|
||||
icon="alertmodal.tga"
|
||||
name="TrashIsFull"
|
||||
type="alertmodal">
|
||||
Your trash is overflowing. This may cause problems logging in.
|
||||
<tag>confirm</tag>
|
||||
<usetemplate
|
||||
name="okcancelbuttons"
|
||||
notext="I will empty trash later"
|
||||
yestext="Empty trash now"/>
|
||||
</notification>
|
||||
|
||||
<notification
|
||||
icon="alertmodal.tga"
|
||||
name="ConfirmClearBrowserCache"
|
||||
|
|
@ -7493,8 +7522,8 @@ Load web page [URL] ?
|
|||
|
||||
[MESSAGE]
|
||||
|
||||
From object: <nolink>[OBJECTNAME]</nolink>, owner: [NAME]
|
||||
<tag>confirm</tag>
|
||||
From object: <nolink>[OBJECTNAME]</nolink>, owner: [NAME_SLURL]
|
||||
<tag>confirm</tag>
|
||||
<form name="form">
|
||||
<button
|
||||
index="0"
|
||||
|
|
@ -8234,15 +8263,15 @@ Are you sure you want to close all IMs?
|
|||
name="AttachmentSaved" type="notifytip">
|
||||
Attachment has been saved.
|
||||
</notification>
|
||||
|
||||
<notification
|
||||
icon="notifytip.tga"
|
||||
name="PresetNotSaved"
|
||||
type="notifytip">
|
||||
Error saving preset [NAME].
|
||||
|
||||
<notification icon="notify.tga" persist="true"
|
||||
name="AppearanceToXMLSaved" type="notify">
|
||||
Appearance has been saved to XML to [PATH]
|
||||
</notification>
|
||||
|
||||
<notification
|
||||
|
||||
<notification icon="notifytip.tga"
|
||||
name="AppearanceToXMLFailed" type="notifytip">
|
||||
Failed to save appearance to XML.
|
||||
icon="notifytip.tga"
|
||||
name="PresetNotDeleted"
|
||||
type="notifytip">
|
||||
|
|
|
|||
|
|
@ -27,7 +27,7 @@
|
|||
top="0"
|
||||
visible="false"
|
||||
width="320" />
|
||||
<icon
|
||||
<group_icon
|
||||
height="20"
|
||||
image_name="Generic_Group"
|
||||
name="group_icon"
|
||||
|
|
|
|||
|
|
@ -27,7 +27,7 @@
|
|||
name="header"
|
||||
top="0"
|
||||
width="305">
|
||||
<icon
|
||||
<group_icon
|
||||
follows="all"
|
||||
height="20"
|
||||
layout="topleft"
|
||||
|
|
|
|||
|
|
@ -21,12 +21,12 @@
|
|||
Tell me:
|
||||
</text>
|
||||
<check_box
|
||||
control_name="NotifyMoneyChange"
|
||||
control_name="NotifyMoneySpend"
|
||||
height="16"
|
||||
label="When I spend or get L$"
|
||||
label="When I spend L$"
|
||||
layout="topleft"
|
||||
left_delta="50"
|
||||
name="notify_money_change_checkbox"
|
||||
name="notify_money_spend_checkbox"
|
||||
top_pad="4"
|
||||
width="300" />
|
||||
<check_box
|
||||
|
|
@ -34,10 +34,18 @@
|
|||
height="16"
|
||||
label="When my friends log in or out"
|
||||
layout="topleft"
|
||||
left_delta="0"
|
||||
name="friends_online_notify_checkbox"
|
||||
top_pad="4"
|
||||
width="300" />
|
||||
left_delta="150"
|
||||
name="friends_online_notify_checkbox"
|
||||
width="300" />
|
||||
<check_box
|
||||
control_name="NotifyMoneyReceived"
|
||||
height="16"
|
||||
label="When I get L$"
|
||||
layout="topleft"
|
||||
left_delta="-150"
|
||||
top_pad="4"
|
||||
name="notify_money_received_checkbox"
|
||||
width="300" />
|
||||
<text
|
||||
type="string"
|
||||
length="1"
|
||||
|
|
|
|||
|
|
@ -323,6 +323,7 @@
|
|||
function="Pref.PrefLoad"
|
||||
parameter="graphic"/>
|
||||
</button>
|
||||
min_val="0.125"
|
||||
|
||||
<button
|
||||
follows="top|left"
|
||||
|
|
|
|||
|
|
@ -105,9 +105,6 @@
|
|||
<action description="Always allow 'Create Objects'"
|
||||
longdescription="Members in a Role with this Ability can create objects on a group-owned parcel, even if it's turned off in About Land > Options tab."
|
||||
name="land allow create" value="25" />
|
||||
<action description="Always allow 'Create Landmark'"
|
||||
longdescription="Members in a Role with this Ability can landmark a group-owned parcel, even if it's turned off in About Land > Options tab."
|
||||
name="land allow landmark" value="26" />
|
||||
<action description="Allow 'Set Home to Here' on group land"
|
||||
longdescription="Members in a Role with this Ability can use World menu > Landmarks > Set Home to Here on a parcel deeded to this group."
|
||||
name="land allow set home" value="28" />
|
||||
|
|
|
|||
|
|
@ -3538,6 +3538,8 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
|
|||
<string name="IM_unblock_only_groups_friends">To see this message, you must uncheck 'Only friends and groups can call or IM me' in Preferences/Privacy.</string>
|
||||
<string name="OnlineStatus">Online</string>
|
||||
<string name="OfflineStatus">Offline</string>
|
||||
<string name="not_online_msg">User not online - message will be stored and delivered later.</string>
|
||||
<string name="not_online_inventory">User not online - inventory has been saved.</string>
|
||||
|
||||
<!-- voice calls -->
|
||||
<string name="answered_call">Your call has been answered</string>
|
||||
|
|
|
|||
|
|
@ -2996,7 +2996,7 @@ Si permaneces en esta región serás desconectado.
|
|||
|
||||
[MESSAGE]
|
||||
|
||||
Del objeto: <nolink>[OBJECTNAME]</nolink>, propietario: [NAME]
|
||||
Del objeto: <nolink>[OBJECTNAME]</nolink>, propietario: [NAME_SLURL]
|
||||
<form name="form">
|
||||
<button name="Gotopage" text="Cargar"/>
|
||||
<button name="Cancel" text="Cancelar"/>
|
||||
|
|
|
|||
|
|
@ -2988,7 +2988,7 @@ Si vous restez dans cette région, vous serez déconnecté(e).
|
|||
|
||||
[MESSAGE]
|
||||
|
||||
Venant de l'objet : <nolink>[OBJECTNAME]</nolink>, propriétaire : [NAME]
|
||||
Venant de l'objet : <nolink>[OBJECTNAME]</nolink>, propriétaire : [NAME_SLURL]
|
||||
<form name="form">
|
||||
<button name="Gotopage" text="Charger"/>
|
||||
<button name="Cancel" text="Annuler"/>
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue