summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xdoc/contributions.txt1
-rw-r--r--indra/llcommon/llcoros.cpp45
-rw-r--r--indra/llcommon/llcoros.h3
-rw-r--r--indra/llui/llbutton.cpp8
-rw-r--r--indra/llui/llfloater.cpp4
-rw-r--r--indra/newview/llagent.cpp158
-rw-r--r--indra/newview/llagent.h10
-rw-r--r--indra/newview/llappviewer.cpp8
-rw-r--r--indra/newview/llappviewer.h1
-rw-r--r--indra/newview/llcommandhandler.cpp6
-rw-r--r--indra/newview/llconversationlog.cpp18
-rw-r--r--indra/newview/llfloaterpreference.cpp18
-rw-r--r--indra/newview/llfloaterpreference.h4
-rw-r--r--indra/newview/llfloatertos.cpp8
-rw-r--r--indra/newview/llinventoryfunctions.cpp14
-rw-r--r--indra/newview/llinventorymodel.cpp5
-rw-r--r--indra/newview/llmediactrl.cpp88
-rw-r--r--indra/newview/llmediactrl.h3
-rw-r--r--indra/newview/lloutfitgallery.cpp28
-rw-r--r--indra/newview/lloutfitgallery.h2
-rw-r--r--indra/newview/llpanelface.cpp13
-rw-r--r--indra/newview/llpanellogin.cpp10
-rw-r--r--indra/newview/llpanellogin.h6
-rw-r--r--indra/newview/llpanelvolume.cpp19
-rw-r--r--indra/newview/llpanelvolume.h1
-rw-r--r--indra/newview/llpreviewnotecard.cpp10
-rw-r--r--indra/newview/llpreviewnotecard.h1
-rw-r--r--indra/newview/llscriptfloater.cpp15
-rw-r--r--indra/newview/llscriptfloater.h1
-rw-r--r--indra/newview/llstartup.cpp2
-rw-r--r--indra/newview/lltexturecache.cpp138
-rw-r--r--indra/newview/lltexturecache.h3
-rw-r--r--indra/newview/llviewerdisplay.cpp3
-rw-r--r--indra/newview/llviewermessage.cpp8
-rw-r--r--indra/newview/llviewerregion.cpp1
-rw-r--r--indra/newview/llviewertexteditor.h3
-rw-r--r--indra/newview/llviewerwindow.cpp9
-rw-r--r--indra/newview/llvoavatar.cpp2
-rw-r--r--indra/newview/skins/default/xui/en/floater_preferences.xml6
-rw-r--r--indra/newview/skins/default/xui/en/floater_tos.xml4
-rw-r--r--indra/newview/skins/default/xui/en/notifications.xml3
41 files changed, 536 insertions, 154 deletions
diff --git a/doc/contributions.txt b/doc/contributions.txt
index 6f4e88e836..dabae001a3 100755
--- a/doc/contributions.txt
+++ b/doc/contributions.txt
@@ -215,6 +215,7 @@ Ansariel Hiller
MAINT-7028
MAINT-7059
MAINT-6519
+ MAINT-7899
Aralara Rajal
Arare Chantilly
CHUIBUG-191
diff --git a/indra/llcommon/llcoros.cpp b/indra/llcommon/llcoros.cpp
index 3ffce4810a..934f04287d 100644
--- a/indra/llcommon/llcoros.cpp
+++ b/indra/llcommon/llcoros.cpp
@@ -40,6 +40,10 @@
#include "stringize.h"
#include "llexception.h"
+#if LL_WINDOWS
+#include <excpt.h>
+#endif
+
namespace {
void no_op() {}
} // anonymous namespace
@@ -272,6 +276,43 @@ void LLCoros::setStackSize(S32 stacksize)
mStackSize = stacksize;
}
+#if LL_WINDOWS
+
+static const U32 STATUS_MSC_EXCEPTION = 0xE06D7363; // compiler specific
+
+U32 exception_filter(U32 code, struct _EXCEPTION_POINTERS *exception_infop)
+{
+ if (code == STATUS_MSC_EXCEPTION)
+ {
+ // C++ exception, go on
+ return EXCEPTION_CONTINUE_SEARCH;
+ }
+ else
+ {
+ // handle it
+ return EXCEPTION_EXECUTE_HANDLER;
+ }
+}
+
+void LLCoros::winlevel(const callable_t& callable)
+{
+ __try
+ {
+ callable();
+ }
+ __except (exception_filter(GetExceptionCode(), GetExceptionInformation()))
+ {
+ // convert to C++ styled exception
+ // Note: it might be better to use _se_set_translator
+ // if you want exception to inherit full callstack
+ char integer_string[32];
+ sprintf(integer_string, "SEH, code: %lu\n", GetExceptionCode());
+ throw std::exception(integer_string);
+ }
+}
+
+#endif
+
// Top-level wrapper around caller's coroutine callable. This function accepts
// the coroutine library's implicit coro::self& parameter and saves it, but
// does not pass it down to the caller's callable.
@@ -282,7 +323,11 @@ void LLCoros::toplevel(coro::self& self, CoroData* data, const callable_t& calla
// run the code the caller actually wants in the coroutine
try
{
+#if LL_WINDOWS
+ winlevel(callable);
+#else
callable();
+#endif
}
catch (const LLContinueError&)
{
diff --git a/indra/llcommon/llcoros.h b/indra/llcommon/llcoros.h
index bbe2d22af4..884d6b159c 100644
--- a/indra/llcommon/llcoros.h
+++ b/indra/llcommon/llcoros.h
@@ -182,6 +182,9 @@ private:
bool cleanup(const LLSD&);
struct CoroData;
static void no_cleanup(CoroData*);
+#if LL_WINDOWS
+ static void winlevel(const callable_t& callable);
+#endif
static void toplevel(coro::self& self, CoroData* data, const callable_t& callable);
static CoroData& get_CoroData(const std::string& caller);
diff --git a/indra/llui/llbutton.cpp b/indra/llui/llbutton.cpp
index 8c7df45884..510a2537b9 100644
--- a/indra/llui/llbutton.cpp
+++ b/indra/llui/llbutton.cpp
@@ -808,11 +808,12 @@ void LLButton::draw()
}
else
{
- imagep->draw(0, 0, (enabled ? mImageColor.get() : disabled_color) % alpha );
+ S32 y = getLocalRect().getHeight() - imagep->getHeight();
+ imagep->draw(0, y, (enabled ? mImageColor.get() : disabled_color) % alpha);
if (mCurGlowStrength > 0.01f)
{
gGL.setSceneBlendType(glow_type);
- imagep->drawSolid(0, 0, glow_color % (mCurGlowStrength * alpha));
+ imagep->drawSolid(0, y, glow_color % (mCurGlowStrength * alpha));
gGL.setSceneBlendType(LLRender::BT_ALPHA);
}
}
@@ -954,7 +955,8 @@ void LLButton::drawBorder(LLUIImage* imagep, const LLColor4& color, S32 size)
}
else
{
- imagep->drawBorder(0, 0, color, size);
+ S32 y = getLocalRect().getHeight() - imagep->getHeight();
+ imagep->drawBorder(0, y, color, size);
}
}
diff --git a/indra/llui/llfloater.cpp b/indra/llui/llfloater.cpp
index 3ece1c12bf..a245dd8f78 100644
--- a/indra/llui/llfloater.cpp
+++ b/indra/llui/llfloater.cpp
@@ -1145,11 +1145,11 @@ void LLFloater::handleReshape(const LLRect& new_rect, bool by_user)
{
setDocked( false, false);
}
- storeRectControl();
mPositioning = LLFloaterEnums::POSITIONING_RELATIVE;
LLRect screen_rect = calcScreenRect();
mPosition = LLCoordGL(screen_rect.getCenterX(), screen_rect.getCenterY()).convert();
- }
+ }
+ storeRectControl();
// gather all snapped dependents
for(handle_set_iter_t dependent_it = mDependents.begin();
diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp
index 8dd0b06ed2..f67bb22f5b 100644
--- a/indra/newview/llagent.cpp
+++ b/indra/newview/llagent.cpp
@@ -47,7 +47,9 @@
#include "llfloatercamera.h"
#include "llfloaterimcontainer.h"
#include "llfloaterperms.h"
+#include "llfloaterpreference.h"
#include "llfloaterreg.h"
+#include "llfloatersnapshot.h"
#include "llfloatertools.h"
#include "llgroupactions.h"
#include "llgroupmgr.h"
@@ -4334,15 +4336,145 @@ void LLAgent::sendAgentDataUpdateRequest()
void LLAgent::sendAgentUserInfoRequest()
{
- if(getID().isNull())
- return; // not logged in
- gMessageSystem->newMessageFast(_PREHASH_UserInfoRequest);
- gMessageSystem->nextBlockFast(_PREHASH_AgentData);
- gMessageSystem->addUUIDFast(_PREHASH_AgentID, getID());
- gMessageSystem->addUUIDFast(_PREHASH_SessionID, getSessionID());
- sendReliableMessage();
+ std::string cap;
+
+ if (getID().isNull())
+ return; // not logged in
+
+ if (mRegionp)
+ cap = mRegionp->getCapability("UserInfo");
+
+ if (!cap.empty())
+ {
+ LLCoros::instance().launch("requestAgentUserInfoCoro",
+ boost::bind(&LLAgent::requestAgentUserInfoCoro, this, cap));
+ }
+ else
+ {
+ sendAgentUserInfoRequestMessage();
+ }
}
+void LLAgent::requestAgentUserInfoCoro(std::string capurl)
+{
+ LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID);
+ LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t
+ httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("requestAgentUserInfoCoro", httpPolicy));
+ LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest);
+ LLCore::HttpOptions::ptr_t httpOpts(new LLCore::HttpOptions);
+ LLCore::HttpHeaders::ptr_t httpHeaders;
+
+ httpOpts->setFollowRedirects(true);
+
+ LLSD result = httpAdapter->getAndSuspend(httpRequest, capurl, httpOpts, httpHeaders);
+
+ LLSD httpResults = result[LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS];
+ LLCore::HttpStatus status = LLCoreHttpUtil::HttpCoroutineAdapter::getStatusFromLLSD(httpResults);
+
+ if (!status)
+ {
+ LL_WARNS("UserInfo") << "Failed to get user information." << LL_ENDL;
+ return;
+ }
+ else if (!result["success"].asBoolean())
+ {
+ LL_WARNS("UserInfo") << "Failed to get user information: " << result["message"] << LL_ENDL;
+ return;
+ }
+
+ bool im_via_email;
+ bool is_verified_email;
+ std::string email;
+ std::string dir_visibility;
+
+ im_via_email = result["im_via_email"].asBoolean();
+ is_verified_email = result["is_verified"].asBoolean();
+ email = result["email"].asString();
+ dir_visibility = result["directory_visibility"].asString();
+
+ // TODO: This should probably be changed. I'm not entirely comfortable
+ // having LLAgent interact directly with the UI in this way.
+ LLFloaterPreference::updateUserInfo(dir_visibility, im_via_email, is_verified_email);
+ LLFloaterSnapshot::setAgentEmail(email);
+}
+
+void LLAgent::sendAgentUpdateUserInfo(bool im_via_email, const std::string& directory_visibility)
+{
+ std::string cap;
+
+ if (getID().isNull())
+ return; // not logged in
+
+ if (mRegionp)
+ cap = mRegionp->getCapability("UserInfo");
+
+ if (!cap.empty())
+ {
+ LLCoros::instance().launch("updateAgentUserInfoCoro",
+ boost::bind(&LLAgent::updateAgentUserInfoCoro, this, cap, im_via_email, directory_visibility));
+ }
+ else
+ {
+ sendAgentUpdateUserInfoMessage(im_via_email, directory_visibility);
+ }
+}
+
+
+void LLAgent::updateAgentUserInfoCoro(std::string capurl, bool im_via_email, std::string directory_visibility)
+{
+ LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID);
+ LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t
+ httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("requestAgentUserInfoCoro", httpPolicy));
+ LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest);
+ LLCore::HttpOptions::ptr_t httpOpts(new LLCore::HttpOptions);
+ LLCore::HttpHeaders::ptr_t httpHeaders;
+
+ httpOpts->setFollowRedirects(true);
+ LLSD body(LLSDMap
+ ("dir_visibility", LLSD::String(directory_visibility))
+ ("im_via_email", LLSD::Boolean(im_via_email)));
+
+ LLSD result = httpAdapter->postAndSuspend(httpRequest, capurl, body, httpOpts, httpHeaders);
+
+ LLSD httpResults = result[LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS];
+ LLCore::HttpStatus status = LLCoreHttpUtil::HttpCoroutineAdapter::getStatusFromLLSD(httpResults);
+
+ if (!status)
+ {
+ LL_WARNS("UserInfo") << "Failed to set user information." << LL_ENDL;
+ }
+ else if (!result["success"].asBoolean())
+ {
+ LL_WARNS("UserInfo") << "Failed to set user information: " << result["message"] << LL_ENDL;
+ }
+}
+
+// deprecated:
+// May be removed when UserInfo cap propagates to all simhosts in grid
+void LLAgent::sendAgentUserInfoRequestMessage()
+{
+ gMessageSystem->newMessageFast(_PREHASH_UserInfoRequest);
+ gMessageSystem->nextBlockFast(_PREHASH_AgentData);
+ gMessageSystem->addUUIDFast(_PREHASH_AgentID, getID());
+ gMessageSystem->addUUIDFast(_PREHASH_SessionID, getSessionID());
+ sendReliableMessage();
+}
+
+void LLAgent::sendAgentUpdateUserInfoMessage(bool im_via_email, const std::string& directory_visibility)
+{
+ gMessageSystem->newMessageFast(_PREHASH_UpdateUserInfo);
+ gMessageSystem->nextBlockFast(_PREHASH_AgentData);
+ gMessageSystem->addUUIDFast(_PREHASH_AgentID, getID());
+ gMessageSystem->addUUIDFast(_PREHASH_SessionID, getSessionID());
+ gMessageSystem->nextBlockFast(_PREHASH_UserData);
+ gMessageSystem->addBOOLFast(_PREHASH_IMViaEMail, im_via_email);
+ gMessageSystem->addString("DirectoryVisibility", directory_visibility);
+ gAgent.sendReliableMessage();
+
+}
+// end deprecated
+//------
+
void LLAgent::observeFriends()
{
if(!mFriendObserver)
@@ -4410,18 +4542,6 @@ const void LLAgent::getTeleportSourceSLURL(LLSLURL& slurl) const
slurl = *mTeleportSourceSLURL;
}
-void LLAgent::sendAgentUpdateUserInfo(bool im_via_email, const std::string& directory_visibility )
-{
- gMessageSystem->newMessageFast(_PREHASH_UpdateUserInfo);
- gMessageSystem->nextBlockFast(_PREHASH_AgentData);
- gMessageSystem->addUUIDFast(_PREHASH_AgentID, getID());
- gMessageSystem->addUUIDFast(_PREHASH_SessionID, getSessionID());
- gMessageSystem->nextBlockFast(_PREHASH_UserData);
- gMessageSystem->addBOOLFast(_PREHASH_IMViaEMail, im_via_email);
- gMessageSystem->addString("DirectoryVisibility", directory_visibility);
- gAgent.sendReliableMessage();
-}
-
// static
void LLAgent::dumpGroupInfo()
{
diff --git a/indra/newview/llagent.h b/indra/newview/llagent.h
index b5da5e9062..4bb4d317e8 100644
--- a/indra/newview/llagent.h
+++ b/indra/newview/llagent.h
@@ -912,9 +912,17 @@ public:
void sendReliableMessage();
void sendAgentDataUpdateRequest();
void sendAgentUserInfoRequest();
- // IM to Email and Online visibility
+
+// IM to Email and Online visibility
void sendAgentUpdateUserInfo(bool im_to_email, const std::string& directory_visibility);
+private:
+ void requestAgentUserInfoCoro(std::string capurl);
+ void updateAgentUserInfoCoro(std::string capurl, bool im_via_email, std::string directory_visibility);
+ // DEPRECATED: may be removed when User Info cap propagates
+ void sendAgentUserInfoRequestMessage();
+ void sendAgentUpdateUserInfoMessage(bool im_via_email, const std::string& directory_visibility);
+
//--------------------------------------------------------------------
// Receive
//--------------------------------------------------------------------
diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index b7267fbdfe..3f4a111a9a 100644
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -693,7 +693,6 @@ LLAppViewer::LLAppViewer()
mSavePerAccountSettings(false), // don't save settings on logout unless login succeeded.
mQuitRequested(false),
mLogoutRequestSent(false),
- mYieldTime(-1),
mLastAgentControlFlags(0),
mLastAgentForceUpdate(0),
mMainloopTimeout(NULL),
@@ -1457,10 +1456,11 @@ bool LLAppViewer::frame()
LL_RECORD_BLOCK_TIME(FTM_SLEEP);
// yield some time to the os based on command line option
- if(mYieldTime >= 0)
+ static LLCachedControl<S32> yield_time(gSavedSettings, "YieldTime", -1);
+ if(yield_time >= 0)
{
LL_RECORD_BLOCK_TIME(FTM_YIELD);
- ms_sleep(mYieldTime);
+ ms_sleep(yield_time);
}
// yield cooperatively when not running as foreground window
@@ -2751,8 +2751,6 @@ bool LLAppViewer::initConfiguration()
}
}
- mYieldTime = gSavedSettings.getS32("YieldTime");
-
// Display splash screen. Must be after above check for previous
// crash as this dialog is always frontmost.
diff --git a/indra/newview/llappviewer.h b/indra/newview/llappviewer.h
index 520ff68a02..52d2bce42b 100644
--- a/indra/newview/llappviewer.h
+++ b/indra/newview/llappviewer.h
@@ -291,7 +291,6 @@ private:
bool mQuitRequested; // User wants to quit, may have modified documents open.
bool mLogoutRequestSent; // Disconnect message sent to simulator, no longer safe to send messages to the sim.
- S32 mYieldTime;
U32 mLastAgentControlFlags;
F32 mLastAgentForceUpdate;
struct SettingsFiles* mSettingsLocationList;
diff --git a/indra/newview/llcommandhandler.cpp b/indra/newview/llcommandhandler.cpp
index 5ea7efc045..76d965b1f1 100644
--- a/indra/newview/llcommandhandler.cpp
+++ b/indra/newview/llcommandhandler.cpp
@@ -134,7 +134,11 @@ bool LLCommandHandlerRegistry::dispatch(const std::string& cmd,
{
break;
}
-
+ //skip initial request from external browser before STATE_BROWSER_INIT
+ if (LLStartUp::getStartupState() == STATE_FIRST)
+ {
+ return true;
+ }
cur_time = LLTimer::getElapsedSeconds();
if (cur_time < last_throttle_time + THROTTLE_PERIOD)
{
diff --git a/indra/newview/llconversationlog.cpp b/indra/newview/llconversationlog.cpp
index 4e69896b69..9ccf9b98f7 100644
--- a/indra/newview/llconversationlog.cpp
+++ b/indra/newview/llconversationlog.cpp
@@ -196,8 +196,6 @@ LLConversationLog::LLConversationLog() :
keep_log_ctrlp->getSignal()->connect(boost::bind(&LLConversationLog::enableLogging, this, _2));
if (log_mode > 0)
{
- loadFromFile(getFileName());
-
enableLogging(log_mode);
}
}
@@ -483,16 +481,15 @@ bool LLConversationLog::saveToFile(const std::string& filename)
// examples of two file entries
// [1343221177] 0 1 0 John Doe| 7e4ec5be-783f-49f5-71dz-16c58c64c145 4ec62a74-c246-0d25-2af6-846beac2aa55 john.doe|
// [1343222639] 2 0 0 Ad-hoc Conference| c3g67c89-c479-4c97-b21d-32869bcfe8rc 68f1c33e-4135-3e3e-a897-8c9b23115c09 Ad-hoc Conference hash597394a0-9982-766d-27b8-c75560213b9a|
-
fprintf(fp, "[%lld] %d %d %d %s| %s %s %s|\n",
(S64)conv_it->getTime().value(),
(S32)conv_it->getConversationType(),
(S32)0,
(S32)conv_it->hasOfflineMessages(),
- conv_it->getConversationName().c_str(),
+ conv_it->getConversationName().c_str(),
participant_id.c_str(),
conversation_id.c_str(),
- conv_it->getHistoryFileName().c_str());
+ LLURI::escape(conv_it->getHistoryFileName()).c_str());
}
fclose(fp);
return true;
@@ -511,6 +508,7 @@ bool LLConversationLog::loadFromFile(const std::string& filename)
LL_WARNS() << "Couldn't open call log list" << filename << LL_ENDL;
return false;
}
+ bool purge_required = false;
char buffer[MAX_STRING];
char conv_name_buffer[MAX_STRING];
@@ -546,7 +544,7 @@ bool LLConversationLog::loadFromFile(const std::string& filename)
.conversation_name(conv_name_buffer)
.participant_id(LLUUID(part_id_buffer))
.session_id(LLUUID(conv_id_buffer))
- .history_filename(history_file_name);
+ .history_filename(LLURI::unescape(history_file_name));
LLConversation conversation(params);
@@ -555,6 +553,7 @@ bool LLConversationLog::loadFromFile(const std::string& filename)
// being over 30 days old should be purged from the conversation log text file on login.
if (conversation.isOlderThan(CONVERSATION_LIFETIME))
{
+ purge_required = true;
continue;
}
@@ -562,8 +561,11 @@ bool LLConversationLog::loadFromFile(const std::string& filename)
}
fclose(fp);
- LLFile::remove(filename);
- cache();
+ if(purge_required)
+ {
+ LLFile::remove(filename);
+ cache();
+ }
notifyObservers();
return true;
diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp
index 1f460c05ec..5222637039 100644
--- a/indra/newview/llfloaterpreference.cpp
+++ b/indra/newview/llfloaterpreference.cpp
@@ -1016,12 +1016,12 @@ void LLFloaterPreference::onBtnCancel(const LLSD& userdata)
}
// static
-void LLFloaterPreference::updateUserInfo(const std::string& visibility, bool im_via_email)
+void LLFloaterPreference::updateUserInfo(const std::string& visibility, bool im_via_email, bool is_verified_email)
{
LLFloaterPreference* instance = LLFloaterReg::findTypedInstance<LLFloaterPreference>("preferences");
if (instance)
{
- instance->setPersonalInfo(visibility, im_via_email);
+ instance->setPersonalInfo(visibility, im_via_email, is_verified_email);
}
}
@@ -1830,7 +1830,7 @@ bool LLFloaterPreference::moveTranscriptsAndLog()
return true;
}
-void LLFloaterPreference::setPersonalInfo(const std::string& visibility, bool im_via_email)
+void LLFloaterPreference::setPersonalInfo(const std::string& visibility, bool im_via_email, bool is_verified_email)
{
mGotPersonalInfo = true;
mOriginalIMViaEmail = im_via_email;
@@ -1855,8 +1855,16 @@ void LLFloaterPreference::setPersonalInfo(const std::string& visibility, bool im
getChildView("friends_online_notify_checkbox")->setEnabled(TRUE);
getChild<LLUICtrl>("online_visibility")->setValue(mOriginalHideOnlineStatus);
getChild<LLUICtrl>("online_visibility")->setLabelArg("[DIR_VIS]", mDirectoryVisibility);
- getChildView("send_im_to_email")->setEnabled(TRUE);
- getChild<LLUICtrl>("send_im_to_email")->setValue(im_via_email);
+ getChildView("send_im_to_email")->setEnabled(is_verified_email);
+
+ std::string tooltip;
+ if (!is_verified_email)
+ tooltip = getString("email_unverified_tooltip");
+
+ getChildView("send_im_to_email")->setToolTip(tooltip);
+
+ // *TODO: Show or hide verify email text here based on is_verified_email
+ getChild<LLUICtrl>("send_im_to_email")->setValue(im_via_email);
getChildView("favorites_on_login_check")->setEnabled(TRUE);
getChildView("log_path_button")->setEnabled(TRUE);
getChildView("chat_font_size")->setEnabled(TRUE);
diff --git a/indra/newview/llfloaterpreference.h b/indra/newview/llfloaterpreference.h
index 2bb2e7e9ff..444ad5a928 100644
--- a/indra/newview/llfloaterpreference.h
+++ b/indra/newview/llfloaterpreference.h
@@ -75,7 +75,7 @@ public:
/*virtual*/ void changed(const LLUUID& session_id, U32 mask) {};
// static data update, called from message handler
- static void updateUserInfo(const std::string& visibility, bool im_via_email);
+ static void updateUserInfo(const std::string& visibility, bool im_via_email, bool is_verified_email);
// refresh all the graphics preferences menus
static void refreshEnabledGraphics();
@@ -147,7 +147,7 @@ public:
void onClickLogPath();
bool moveTranscriptsAndLog();
void enableHistory();
- void setPersonalInfo(const std::string& visibility, bool im_via_email);
+ void setPersonalInfo(const std::string& visibility, bool im_via_email, bool is_verified_email);
void refreshEnabledState();
void onCommitWindowedMode();
void refresh(); // Refresh enable/disable
diff --git a/indra/newview/llfloatertos.cpp b/indra/newview/llfloatertos.cpp
index 1743d0fc69..4de34f13dd 100644
--- a/indra/newview/llfloatertos.cpp
+++ b/indra/newview/llfloatertos.cpp
@@ -75,7 +75,9 @@ BOOL LLFloaterTOS::postBuild()
// disable Agree to TOS radio button until the page has fully loaded
LLCheckBoxCtrl* tos_agreement = getChild<LLCheckBoxCtrl>("agree_chk");
- tos_agreement->setEnabled( false );
+ tos_agreement->setEnabled(false);
+ LLTextBox* tos_list = getChild<LLTextBox>("agree_list");
+ tos_list->setEnabled(false);
// hide the SL text widget if we're displaying TOS with using a browser widget.
LLUICtrl *editor = getChild<LLUICtrl>("tos_text");
@@ -150,6 +152,8 @@ void LLFloaterTOS::setSiteIsAlive( bool alive )
// but if the page is unavailable, we need to do this now
LLCheckBoxCtrl* tos_agreement = getChild<LLCheckBoxCtrl>("agree_chk");
tos_agreement->setEnabled( true );
+ LLTextBox* tos_list = getChild<LLTextBox>("agree_list");
+ tos_list->setEnabled(true);
}
}
#endif
@@ -230,6 +234,8 @@ void LLFloaterTOS::handleMediaEvent(LLPluginClassMedia* /*self*/, EMediaEvent ev
// enable Agree to TOS radio button now that page has loaded
LLCheckBoxCtrl * tos_agreement = getChild<LLCheckBoxCtrl>("agree_chk");
tos_agreement->setEnabled( true );
+ LLTextBox* tos_list = getChild<LLTextBox>("agree_list");
+ tos_list->setEnabled(true);
}
}
}
diff --git a/indra/newview/llinventoryfunctions.cpp b/indra/newview/llinventoryfunctions.cpp
index 67ddd79230..8b50e4248e 100644
--- a/indra/newview/llinventoryfunctions.cpp
+++ b/indra/newview/llinventoryfunctions.cpp
@@ -264,7 +264,9 @@ void update_marketplace_category(const LLUUID& cur_uuid, bool perform_consistenc
// is limited to 4.
// We also take care of degenerated cases so we don't update all folders in the inventory by mistake.
- if (cur_uuid.isNull())
+ if (cur_uuid.isNull()
+ || gInventory.getCategory(cur_uuid) == NULL
+ || gInventory.getCategory(cur_uuid)->getVersion() == LLViewerInventoryCategory::VERSION_UNKNOWN)
{
return;
}
@@ -275,9 +277,13 @@ void update_marketplace_category(const LLUUID& cur_uuid, bool perform_consistenc
{
// Retrieve the listing uuid this object is in
LLUUID listing_uuid = nested_parent_id(cur_uuid, depth);
+ LLViewerInventoryCategory* listing_cat = gInventory.getCategory(listing_uuid);
+ bool listing_cat_loaded = listing_cat != NULL && listing_cat->getVersion() != LLViewerInventoryCategory::VERSION_UNKNOWN;
// Verify marketplace data consistency for this listing
- if (perform_consistency_enforcement && LLMarketplaceData::instance().isListed(listing_uuid))
+ if (perform_consistency_enforcement
+ && listing_cat_loaded
+ && LLMarketplaceData::instance().isListed(listing_uuid))
{
LLUUID version_folder_uuid = LLMarketplaceData::instance().getVersionFolder(listing_uuid);
S32 version_depth = depth_nesting_in_marketplace(version_folder_uuid);
@@ -299,7 +305,9 @@ void update_marketplace_category(const LLUUID& cur_uuid, bool perform_consistenc
}
// Check if the count on hand needs to be updated on SLM
- if (perform_consistency_enforcement && (compute_stock_count(listing_uuid) != LLMarketplaceData::instance().getCountOnHand(listing_uuid)))
+ if (perform_consistency_enforcement
+ && listing_cat_loaded
+ && (compute_stock_count(listing_uuid) != LLMarketplaceData::instance().getCountOnHand(listing_uuid)))
{
LLMarketplaceData::instance().updateCountOnHand(listing_uuid,1);
}
diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp
index dc75e09ad9..054db2a3ec 100644
--- a/indra/newview/llinventorymodel.cpp
+++ b/indra/newview/llinventorymodel.cpp
@@ -2058,11 +2058,6 @@ bool LLInventoryModel::loadSkeleton(
// correct contents the next time the viewer opens the folder.
tcat->setVersion(NO_VERSION);
}
- else if (tcat->getPreferredType() == LLFolderType::FT_MARKETPLACE_STOCK)
- {
- // Do not trust stock folders being updated
- tcat->setVersion(NO_VERSION);
- }
else
{
cached_ids.insert(tcat->getUUID());
diff --git a/indra/newview/llmediactrl.cpp b/indra/newview/llmediactrl.cpp
index 00043d1e72..a8025906c7 100644
--- a/indra/newview/llmediactrl.cpp
+++ b/indra/newview/llmediactrl.cpp
@@ -805,44 +805,8 @@ void LLMediaCtrl::draw()
F32 max_u = ( F32 )media_plugin->getWidth() / ( F32 )media_plugin->getTextureWidth();
F32 max_v = ( F32 )media_plugin->getHeight() / ( F32 )media_plugin->getTextureHeight();
- LLRect r = getRect();
- S32 width, height;
- S32 x_offset = 0;
- S32 y_offset = 0;
-
- if(mStretchToFill)
- {
- if(mMaintainAspectRatio)
- {
- F32 media_aspect = (F32)(media_plugin->getWidth()) / (F32)(media_plugin->getHeight());
- F32 view_aspect = (F32)(r.getWidth()) / (F32)(r.getHeight());
- if(media_aspect > view_aspect)
- {
- // max width, adjusted height
- width = r.getWidth();
- height = llmin(llmax(ll_round(width / media_aspect), 0), r.getHeight());
- }
- else
- {
- // max height, adjusted width
- height = r.getHeight();
- width = llmin(llmax(ll_round(height * media_aspect), 0), r.getWidth());
- }
- }
- else
- {
- width = r.getWidth();
- height = r.getHeight();
- }
- }
- else
- {
- width = llmin(media_plugin->getWidth(), r.getWidth());
- height = llmin(media_plugin->getHeight(), r.getHeight());
- }
-
- x_offset = (r.getWidth() - width) / 2;
- y_offset = (r.getHeight() - height) / 2;
+ S32 x_offset, y_offset, width, height;
+ calcOffsetsAndSize(&x_offset, &y_offset, &width, &height);
// draw the browser
gGL.begin( LLRender::QUADS );
@@ -901,8 +865,56 @@ void LLMediaCtrl::draw()
////////////////////////////////////////////////////////////////////////////////
//
+void LLMediaCtrl::calcOffsetsAndSize(S32 *x_offset, S32 *y_offset, S32 *width, S32 *height)
+{
+ const LLRect &r = getRect();
+ *x_offset = *y_offset = 0;
+
+ if (mStretchToFill)
+ {
+ if (mMaintainAspectRatio && mMediaSource && mMediaSource->getMediaPlugin())
+ {
+ F32 media_aspect = (F32)(mMediaSource->getMediaPlugin()->getWidth()) / (F32)(mMediaSource->getMediaPlugin()->getHeight());
+ F32 view_aspect = (F32)(r.getWidth()) / (F32)(r.getHeight());
+ if (media_aspect > view_aspect)
+ {
+ // max width, adjusted height
+ *width = r.getWidth();
+ *height = llmin(llmax(ll_round(*width / media_aspect), 0), r.getHeight());
+ }
+ else
+ {
+ // max height, adjusted width
+ *height = r.getHeight();
+ *width = llmin(llmax(ll_round(*height * media_aspect), 0), r.getWidth());
+ }
+ }
+ else
+ {
+ *width = r.getWidth();
+ *height = r.getHeight();
+ }
+ }
+ else
+ {
+ *width = llmin(mMediaSource->getMediaPlugin()->getWidth(), r.getWidth());
+ *height = llmin(mMediaSource->getMediaPlugin()->getHeight(), r.getHeight());
+ }
+
+ *x_offset = (r.getWidth() - *width) / 2;
+ *y_offset = (r.getHeight() - *height) / 2;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+//
void LLMediaCtrl::convertInputCoords(S32& x, S32& y)
{
+ S32 x_offset, y_offset, width, height;
+ calcOffsetsAndSize(&x_offset, &y_offset, &width, &height);
+
+ x -= x_offset;
+ y -= y_offset;
+
bool coords_opengl = false;
if(mMediaSource && mMediaSource->hasMedia())
diff --git a/indra/newview/llmediactrl.h b/indra/newview/llmediactrl.h
index 125a67e23e..11400c8274 100644
--- a/indra/newview/llmediactrl.h
+++ b/indra/newview/llmediactrl.h
@@ -181,6 +181,9 @@ public:
protected:
void convertInputCoords(S32& x, S32& y);
+ private:
+ void calcOffsetsAndSize(S32 *x_offset, S32 *y_offset, S32 *width, S32 *height);
+
private:
void onVisibilityChanged ( const LLSD& new_visibility );
void onPopup(const LLSD& notification, const LLSD& response);
diff --git a/indra/newview/lloutfitgallery.cpp b/indra/newview/lloutfitgallery.cpp
index cca65f2ce1..c38d3ab140 100644
--- a/indra/newview/lloutfitgallery.cpp
+++ b/indra/newview/lloutfitgallery.cpp
@@ -72,6 +72,7 @@ LLOutfitGallery::LLOutfitGallery(const LLOutfitGallery::Params& p)
mItemsAddedCount(0),
mOutfitLinkPending(NULL),
mOutfitRenamePending(NULL),
+ mSnapshotFolderID(NULL),
mRowPanelHeight(p.row_panel_height),
mVerticalGap(p.vertical_gap),
mHorizontalGap(p.horizontal_gap),
@@ -1011,8 +1012,8 @@ void LLOutfitGallery::onTextureSelectionChanged(LLInventoryItem* itemp)
void LLOutfitGallery::loadPhotos()
{
//Iterate over inventory
- LLUUID textures = gInventory.findCategoryUUIDForType(LLFolderType::FT_TEXTURE);
- LLViewerInventoryCategory* textures_category = gInventory.getCategory(textures);
+ mSnapshotFolderID = gInventory.findUserDefinedCategoryUUIDForType(LLFolderType::FT_TEXTURE);
+ LLViewerInventoryCategory* textures_category = gInventory.getCategory(mSnapshotFolderID);
if (!textures_category)
return;
if (mTexturesObserver == NULL)
@@ -1022,12 +1023,26 @@ void LLOutfitGallery::loadPhotos()
}
// Start observing changes in "Textures" category.
- mTexturesObserver->addCategory(textures,
- boost::bind(&LLOutfitGallery::refreshTextures, this, textures));
-
+ mTexturesObserver->addCategory(mSnapshotFolderID,
+ boost::bind(&LLOutfitGallery::refreshTextures, this, mSnapshotFolderID));
+
textures_category->fetch();
}
+void LLOutfitGallery::updateSnapshotFolderObserver()
+{
+ if(mSnapshotFolderID != gInventory.findUserDefinedCategoryUUIDForType(LLFolderType::FT_TEXTURE))
+ {
+ if (gInventory.containsObserver(mTexturesObserver))
+ {
+ gInventory.removeObserver(mTexturesObserver);
+ }
+ delete mTexturesObserver;
+ mTexturesObserver = NULL;
+ loadPhotos();
+ }
+}
+
void LLOutfitGallery::refreshOutfit(const LLUUID& category_id)
{
LLViewerInventoryCategory* category = gInventory.getCategory(category_id);
@@ -1200,7 +1215,7 @@ void LLOutfitGallery::uploadPhoto(LLUUID outfit_id)
LLViewerInventoryCategory *outfit_cat = gInventory.getCategory(outfit_id);
if (!outfit_cat) return;
-
+ updateSnapshotFolderObserver();
checkRemovePhoto(outfit_id);
std::string upload_pending_name = outfit_id.asString();
std::string upload_pending_desc = "";
@@ -1372,6 +1387,7 @@ void LLOutfitGallery::onBeforeOutfitSnapshotSave()
if (!selected_outfit_id.isNull())
{
checkRemovePhoto(selected_outfit_id);
+ updateSnapshotFolderObserver();
}
}
diff --git a/indra/newview/lloutfitgallery.h b/indra/newview/lloutfitgallery.h
index b1ca850508..383924a7d6 100644
--- a/indra/newview/lloutfitgallery.h
+++ b/indra/newview/lloutfitgallery.h
@@ -130,6 +130,7 @@ protected:
private:
void loadPhotos();
void uploadPhoto(LLUUID outfit_id);
+ void updateSnapshotFolderObserver();
LLUUID getPhotoAssetId(const LLUUID& outfit_id);
LLUUID getDefaultPhoto();
void linkPhotoToOutfit(LLUUID outfit_id, LLUUID photo_id);
@@ -168,6 +169,7 @@ private:
LLPanel* mLastRowPanel;
LLUUID mOutfitLinkPending;
LLUUID mOutfitRenamePending;
+ LLUUID mSnapshotFolderID;
LLTextBox* mMessageTextBox;
bool mGalleryCreated;
int mRowCount;
diff --git a/indra/newview/llpanelface.cpp b/indra/newview/llpanelface.cpp
index a16259886d..7e75dca908 100644
--- a/indra/newview/llpanelface.cpp
+++ b/indra/newview/llpanelface.cpp
@@ -1623,6 +1623,15 @@ void LLPanelFace::updateShinyControls(bool is_setting_texture, bool mess_with_sh
}
}
}
+ else
+ {
+ if (shiny_texture_ID.isNull() && comboShiny && comboShiny->itemExists(USE_TEXTURE))
+ {
+ comboShiny->remove(SHINY_TEXTURE);
+ comboShiny->selectFirstItem();
+ }
+ }
+
LLComboBox* combo_matmedia = getChild<LLComboBox>("combobox matmedia");
LLRadioGroup* radio_mat_type = getChild<LLRadioGroup>("radio_material_type");
@@ -2368,8 +2377,8 @@ void LLPanelFace::onCommitPlanarAlign(LLUICtrl* ctrl, void* userdata)
void LLPanelFace::onTextureSelectionChanged(LLInventoryItem* itemp)
{
LL_DEBUGS("Materials") << "item asset " << itemp->getAssetUUID() << LL_ENDL;
- LLRadioGroup* radio_mat_type = getChild<LLRadioGroup>("radio_material_type");
- if(radio_mat_type)
+ LLRadioGroup* radio_mat_type = findChild<LLRadioGroup>("radio_material_type");
+ if(!radio_mat_type)
{
return;
}
diff --git a/indra/newview/llpanellogin.cpp b/indra/newview/llpanellogin.cpp
index a88c10521c..0bcbdf7e67 100644
--- a/indra/newview/llpanellogin.cpp
+++ b/indra/newview/llpanellogin.cpp
@@ -75,6 +75,7 @@
LLPanelLogin *LLPanelLogin::sInstance = NULL;
BOOL LLPanelLogin::sCapslockDidNotification = FALSE;
+BOOL LLPanelLogin::sCredentialSet = FALSE;
class LLLoginLocationAutoHandler : public LLCommandHandler
{
@@ -176,6 +177,7 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect,
setBackgroundOpaque(TRUE);
mPasswordModified = FALSE;
+
LLPanelLogin::sInstance = this;
LLView* login_holder = gViewerWindow->getLoginPanelHolder();
@@ -458,6 +460,7 @@ void LLPanelLogin::setFields(LLPointer<LLCredential> credential,
LL_WARNS() << "Attempted fillFields with no login view shown" << LL_ENDL;
return;
}
+ sCredentialSet = TRUE;
LL_INFOS("Credentials") << "Setting login fields to " << *credential << LL_ENDL;
LLSD identifier = credential->getIdentifier();
@@ -680,10 +683,8 @@ void LLPanelLogin::onUpdateStartSLURL(const LLSLURL& new_start_slurl)
}
if ( new_start_slurl.getLocationString().length() )
{
- if (location_combo->getCurrentIndex() == -1)
- {
- location_combo->setLabel(new_start_slurl.getLocationString());
- }
+
+ location_combo->setLabel(new_start_slurl.getLocationString());
sInstance->mLocationLength = new_start_slurl.getLocationString().length();
sInstance->updateLoginButtons();
}
@@ -862,6 +863,7 @@ void LLPanelLogin::onClickConnect(void *)
}
else
{
+ sCredentialSet = FALSE;
LLPointer<LLCredential> cred;
BOOL remember;
getFields(cred, remember);
diff --git a/indra/newview/llpanellogin.h b/indra/newview/llpanellogin.h
index 869f2f8d39..82ef048493 100644
--- a/indra/newview/llpanellogin.h
+++ b/indra/newview/llpanellogin.h
@@ -56,9 +56,11 @@ public:
void* callback_data);
static void setFields(LLPointer<LLCredential> credential, BOOL remember);
-
+
static void getFields(LLPointer<LLCredential>& credential, BOOL& remember);
+ static BOOL isCredentialSet() { return sCredentialSet; }
+
static BOOL areCredentialFieldsDirty();
static void setLocation(const LLSLURL& slurl);
static void autologinToLocation(const LLSLURL& slurl);
@@ -115,6 +117,8 @@ private:
static LLPanelLogin* sInstance;
static BOOL sCapslockDidNotification;
bool mFirstLoginThisInstall;
+
+ static BOOL sCredentialSet;
unsigned int mUsernameLength;
unsigned int mPasswordLength;
diff --git a/indra/newview/llpanelvolume.cpp b/indra/newview/llpanelvolume.cpp
index c9f8683e0e..b1895bfc9b 100644
--- a/indra/newview/llpanelvolume.cpp
+++ b/indra/newview/llpanelvolume.cpp
@@ -710,22 +710,20 @@ void LLPanelVolume::onLightCancelColor(const LLSD& data)
void LLPanelVolume::onLightCancelTexture(const LLSD& data)
{
LLTextureCtrl* LightTextureCtrl = getChild<LLTextureCtrl>("light texture control");
-
- if (LightTextureCtrl)
- {
- LightTextureCtrl->setImageAssetID(mLightSavedTexture);
- }
-
LLVOVolume *volobjp = (LLVOVolume *) mObject.get();
- if(volobjp)
+
+ if (volobjp && LightTextureCtrl)
{
// Cancel the light texture as requested
// NORSPEC-292
- //
+ //
+ // Texture picker triggers cancel both in case of actual cancel and in case of
+ // selection of "None" texture.
+ LLUUID tex_id = LightTextureCtrl->getImageAssetID();
bool is_spotlight = volobjp->isLightSpotlight();
- volobjp->setLightTextureID(mLightSavedTexture); //updates spotlight
+ volobjp->setLightTextureID(tex_id); //updates spotlight
- if (!is_spotlight && mLightSavedTexture.notNull())
+ if (!is_spotlight && tex_id.notNull())
{
LLVector3 spot_params = volobjp->getSpotLightParams();
getChild<LLUICtrl>("Light FOV")->setValue(spot_params.mV[0]);
@@ -769,7 +767,6 @@ void LLPanelVolume::onLightSelectTexture(const LLSD& data)
{
LLUUID id = LightTextureCtrl->getImageAssetID();
volobjp->setLightTextureID(id);
- mLightSavedTexture = id;
}
}
diff --git a/indra/newview/llpanelvolume.h b/indra/newview/llpanelvolume.h
index deb6b6f2a6..e3453ae99c 100644
--- a/indra/newview/llpanelvolume.h
+++ b/indra/newview/llpanelvolume.h
@@ -111,7 +111,6 @@ protected:
LLColor4 mLightSavedColor;
- LLUUID mLightSavedTexture;
LLPointer<LLViewerObject> mObject;
LLPointer<LLViewerObject> mRootObject;
diff --git a/indra/newview/llpreviewnotecard.cpp b/indra/newview/llpreviewnotecard.cpp
index 850c3b350d..d4a8bbdf45 100644
--- a/indra/newview/llpreviewnotecard.cpp
+++ b/indra/newview/llpreviewnotecard.cpp
@@ -163,6 +163,16 @@ BOOL LLPreviewNotecard::canClose()
}
}
+/* virtual */
+void LLPreviewNotecard::setObjectID(const LLUUID& object_id)
+{
+ LLPreview::setObjectID(object_id);
+
+ LLViewerTextEditor* editor = getChild<LLViewerTextEditor>("Notecard Editor");
+ editor->setNotecardObjectID(mObjectUUID);
+ editor->makePristine();
+}
+
const LLInventoryItem* LLPreviewNotecard::getDragItem()
{
LLViewerTextEditor* editor = getChild<LLViewerTextEditor>("Notecard Editor");
diff --git a/indra/newview/llpreviewnotecard.h b/indra/newview/llpreviewnotecard.h
index 017c4485ba..46a6d0ef50 100644
--- a/indra/newview/llpreviewnotecard.h
+++ b/indra/newview/llpreviewnotecard.h
@@ -47,6 +47,7 @@ public:
virtual ~LLPreviewNotecard();
bool saveItem();
+ void setObjectID(const LLUUID& object_id);
// llview
virtual void draw();
diff --git a/indra/newview/llscriptfloater.cpp b/indra/newview/llscriptfloater.cpp
index b2c450aa0c..da912ef3d4 100644
--- a/indra/newview/llscriptfloater.cpp
+++ b/indra/newview/llscriptfloater.cpp
@@ -349,8 +349,8 @@ void LLScriptFloater::hideToastsIfNeeded()
//////////////////////////////////////////////////////////////////////////
LLScriptFloaterManager::LLScriptFloaterManager()
+ : mDialogLimitationsSlot()
{
- gSavedSettings.getControl("ScriptDialogLimitations")->getCommitSignal()->connect(boost::bind(&clearScriptNotifications));
}
void LLScriptFloaterManager::onAddNotification(const LLUUID& notification_id)
@@ -361,6 +361,19 @@ void LLScriptFloaterManager::onAddNotification(const LLUUID& notification_id)
return;
}
+ if (!mDialogLimitationsSlot.connected())
+ {
+ LLPointer<LLControlVariable> cntrl_ptr = gSavedSettings.getControl("ScriptDialogLimitations");
+ if (cntrl_ptr.notNull())
+ {
+ mDialogLimitationsSlot = cntrl_ptr->getCommitSignal()->connect(boost::bind(&clearScriptNotifications));
+ }
+ else
+ {
+ LL_WARNS() << "Unable to set signal on setting 'ScriptDialogLimitations'" << LL_ENDL;
+ }
+ }
+
// get scripted Object's ID
LLUUID object_id = notification_id_to_object_id(notification_id);
diff --git a/indra/newview/llscriptfloater.h b/indra/newview/llscriptfloater.h
index 0192a8893e..3695b8a3e1 100644
--- a/indra/newview/llscriptfloater.h
+++ b/indra/newview/llscriptfloater.h
@@ -139,6 +139,7 @@ private:
typedef std::map<LLUUID, FloaterPositionInfo> floater_position_map_t;
floater_position_map_t mFloaterPositions;
+ boost::signals2::connection mDialogLimitationsSlot;
};
/**
diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp
index 8295ce029b..df1d2a3946 100644
--- a/indra/newview/llstartup.cpp
+++ b/indra/newview/llstartup.cpp
@@ -766,7 +766,7 @@ bool idle_startup()
// Show the login dialog
login_show();
// connect dialog is already shown, so fill in the names
- if (gUserCredential.notNull())
+ if (gUserCredential.notNull() && !LLPanelLogin::isCredentialSet())
{
LLPanelLogin::setFields( gUserCredential, gRememberPassword);
}
diff --git a/indra/newview/lltexturecache.cpp b/indra/newview/lltexturecache.cpp
index f0c28041d1..71d3731f93 100644
--- a/indra/newview/lltexturecache.cpp
+++ b/indra/newview/lltexturecache.cpp
@@ -53,6 +53,7 @@ const F32 TEXTURE_CACHE_PURGE_AMOUNT = .20f; // % amount to reduce the cache by
const F32 TEXTURE_CACHE_LRU_SIZE = .10f; // % amount for LRU list (low overhead to regenerate)
const S32 TEXTURE_FAST_CACHE_ENTRY_OVERHEAD = sizeof(S32) * 4; //w, h, c, level
const S32 TEXTURE_FAST_CACHE_ENTRY_SIZE = 16 * 16 * 4 + TEXTURE_FAST_CACHE_ENTRY_OVERHEAD;
+const F32 TEXTURE_LAZY_PURGE_TIME_LIMIT = .01f; // 10ms
class LLTextureCacheWorker : public LLWorkerClass
{
@@ -550,9 +551,11 @@ bool LLTextureCacheRemoteWorker::doWrite()
{
if ((mOffset != 0) // We currently do not support write offsets
|| (mDataSize <= 0) // Things will go badly wrong if mDataSize is nul or negative...
- || (mImageSize < mDataSize))
+ || (mImageSize < mDataSize)
+ || (mRawDiscardLevel < 0)
+ || (mRawImage->isBufferInvalid())) // decode failed or malfunctioned, don't write
{
- LL_WARNS() << "INIT state check failed" << LL_ENDL;
+ LL_WARNS() << "INIT state check failed for image: " << mID << " Size: " << mImageSize << " DataSize: " << mDataSize << " Discard:" << mRawDiscardLevel << LL_ENDL;
mDataSize = -1; // failed
done = true;
}
@@ -577,15 +580,12 @@ bool LLTextureCacheRemoteWorker::doWrite()
idx = mCache->setHeaderCacheEntry(mID, entry, mImageSize, mDataSize); // create the new entry.
if(idx >= 0)
{
- // (almost always) write to the fast cache.
- if (mRawImage->getDataSize())
+ // write to the fast cache.
+ if(!mCache->writeToFastCache(idx, mRawImage, mRawDiscardLevel))
{
- if(!mCache->writeToFastCache(idx, mRawImage, mRawDiscardLevel))
- {
- LL_WARNS() << "writeToFastCache failed" << LL_ENDL;
- mDataSize = -1; // failed
- done = true;
- }
+ LL_WARNS() << "writeToFastCache failed" << LL_ENDL;
+ mDataSize = -1; // failed
+ done = true;
}
}
}
@@ -1635,6 +1635,92 @@ void LLTextureCache::purgeAllTextures(bool purge_directories)
LL_INFOS() << "The entire texture cache is cleared." << LL_ENDL ;
}
+void LLTextureCache::purgeTexturesLazy(F32 time_limit)
+{
+ if (mReadOnly)
+ {
+ return;
+ }
+
+ if (!mThreaded)
+ {
+ // *FIX:Mani - watchdog off.
+ LLAppViewer::instance()->pauseMainloopTimeout();
+ }
+
+ // time_limit doesn't account for lock time
+ LLMutexLock lock(&mHeaderMutex);
+
+ if (mPurgeEntryList.empty())
+ {
+ // Read the entries list and form list of textures to purge
+ std::vector<Entry> entries;
+ U32 num_entries = openAndReadEntries(entries);
+ if (!num_entries)
+ {
+ return; // nothing to purge
+ }
+
+ // Use mTexturesSizeMap to collect UUIDs of textures with bodies
+ typedef std::set<std::pair<U32, S32> > time_idx_set_t;
+ std::set<std::pair<U32, S32> > time_idx_set;
+ for (size_map_t::iterator iter1 = mTexturesSizeMap.begin();
+ iter1 != mTexturesSizeMap.end(); ++iter1)
+ {
+ if (iter1->second > 0)
+ {
+ id_map_t::iterator iter2 = mHeaderIDMap.find(iter1->first);
+ if (iter2 != mHeaderIDMap.end())
+ {
+ S32 idx = iter2->second;
+ time_idx_set.insert(std::make_pair(entries[idx].mTime, idx));
+ }
+ else
+ {
+ LL_ERRS() << "mTexturesSizeMap / mHeaderIDMap corrupted." << LL_ENDL;
+ }
+ }
+ }
+
+ S64 cache_size = mTexturesSizeTotal;
+ S64 purged_cache_size = (sCacheMaxTexturesSize * (S64)((1.f - TEXTURE_CACHE_PURGE_AMOUNT) * 100)) / 100;
+ for (time_idx_set_t::iterator iter = time_idx_set.begin();
+ iter != time_idx_set.end(); ++iter)
+ {
+ S32 idx = iter->second;
+ if (cache_size >= purged_cache_size)
+ {
+ cache_size -= entries[idx].mBodySize;
+ mPurgeEntryList.push_back(std::pair<S32, Entry>(idx, entries[idx]));
+ }
+ else
+ {
+ break;
+ }
+ }
+ LL_DEBUGS() << "Formed Purge list of " << mPurgeEntryList.size() << " entries" << LL_ENDL;
+ }
+ else
+ {
+ // Remove collected entried
+ LLTimer timer;
+ while (!mPurgeEntryList.empty() && timer.getElapsedTimeF32() < time_limit)
+ {
+ S32 idx = mPurgeEntryList.back().first;
+ Entry entry = mPurgeEntryList.back().second;
+ mPurgeEntryList.pop_back();
+ // make sure record is still valid
+ id_map_t::iterator iter_header = mHeaderIDMap.find(entry.mID);
+ if (iter_header != mHeaderIDMap.end() && iter_header->second == idx)
+ {
+ std::string tex_filename = getTextureFileName(entry.mID);
+ removeEntry(idx, entry, tex_filename);
+ writeEntryToHeaderImmediately(idx, entry);
+ }
+ }
+ }
+}
+
void LLTextureCache::purgeTextures(bool validate)
{
if (mReadOnly)
@@ -1793,24 +1879,27 @@ S32 LLTextureCache::getHeaderCacheEntry(const LLUUID& id, Entry& entry)
S32 LLTextureCache::setHeaderCacheEntry(const LLUUID& id, Entry& entry, S32 imagesize, S32 datasize)
{
mHeaderMutex.lock();
- S32 idx = openAndReadEntry(id, entry, true);
+ S32 idx = openAndReadEntry(id, entry, true); // read or create
mHeaderMutex.unlock();
- if (idx >= 0)
- {
- updateEntry(idx, entry, imagesize, datasize);
- }
-
- if(idx < 0) // retry
+ if(idx < 0) // retry once
{
readHeaderCache(); // We couldn't write an entry, so refresh the LRU
-
+
mHeaderMutex.lock();
- llassert_always(!mLRU.empty() || mHeaderEntriesInfo.mEntries < sCacheMaxEntries);
+ idx = openAndReadEntry(id, entry, true);
mHeaderMutex.unlock();
+ }
- idx = setHeaderCacheEntry(id, entry, imagesize, datasize); // assert above ensures no inf. recursion
+ if (idx >= 0)
+ {
+ updateEntry(idx, entry, imagesize, datasize);
}
+ else
+ {
+ LL_WARNS() << "Failed to set cache entry for image: " << id << LL_ENDL;
+ }
+
return idx;
}
@@ -1888,11 +1977,10 @@ LLTextureCache::handle_t LLTextureCache::writeToCache(const LLUUID& id, U32 prio
}
if (mDoPurge)
{
- // NOTE: This may cause an occasional hiccup,
- // but it really needs to be done on the control thread
- // (i.e. here)
- purgeTextures(false);
- mDoPurge = FALSE;
+ // NOTE: Needs to be done on the control thread
+ // (i.e. here)
+ purgeTexturesLazy(TEXTURE_LAZY_PURGE_TIME_LIMIT);
+ mDoPurge = !mPurgeEntryList.empty();
}
LLMutexLock lock(&mWorkersMutex);
LLTextureCacheWorker* worker = new LLTextureCacheRemoteWorker(this, priority, id,
diff --git a/indra/newview/lltexturecache.h b/indra/newview/lltexturecache.h
index 95f9afc2bc..bcc27c6598 100644
--- a/indra/newview/lltexturecache.h
+++ b/indra/newview/lltexturecache.h
@@ -155,6 +155,7 @@ private:
void readHeaderCache();
void clearCorruptedCache();
void purgeAllTextures(bool purge_directories);
+ void purgeTexturesLazy(F32 time_limit);
void purgeTextures(bool validate);
LLAPRFile* openHeaderEntriesFile(bool readonly, S32 offset);
void closeHeaderEntriesFile();
@@ -225,6 +226,8 @@ private:
typedef std::map<S32, Entry> idx_entry_map_t;
idx_entry_map_t mUpdatedEntryMap;
+ typedef std::vector<std::pair<S32, Entry> > idx_entry_vector_t;
+ idx_entry_vector_t mPurgeEntryList;
// Statics
static F32 sHeaderCacheVersion;
diff --git a/indra/newview/llviewerdisplay.cpp b/indra/newview/llviewerdisplay.cpp
index bfa9fa03fa..6d4fc94b63 100644
--- a/indra/newview/llviewerdisplay.cpp
+++ b/indra/newview/llviewerdisplay.cpp
@@ -441,6 +441,7 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
gAgent.setTeleportMessage(
LLAgent::sTeleportProgressMessages["requesting"]);
gViewerWindow->setProgressString(LLAgent::sTeleportProgressMessages["requesting"]);
+ gViewerWindow->setProgressMessage(gAgent.mMOTD);
break;
case LLAgent::TELEPORT_REQUESTED:
@@ -518,6 +519,7 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
}
gViewerWindow->setProgressPercent( percent_done );
+ gViewerWindow->setProgressMessage(std::string());
}
else
if (gRestoreGL)
@@ -539,6 +541,7 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
gViewerWindow->setProgressPercent( percent_done );
}
+ gViewerWindow->setProgressMessage(std::string());
}
//////////////////////////
diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp
index 1ce18f5496..2144c7d481 100644
--- a/indra/newview/llviewermessage.cpp
+++ b/indra/newview/llviewermessage.cpp
@@ -5664,7 +5664,8 @@ static void process_money_balance_reply_extended(LLMessageSystem* msg)
args["NAME"] = source_slurl;
is_name_group = is_source_group;
name_id = source_id;
- if (!reason.empty())
+
+ if (!reason.empty() && !LLMuteList::getInstance()->isMuted(source_id))
{
message = LLTrans::getString("paid_you_ldollars" + gift_suffix, args);
}
@@ -7258,7 +7259,7 @@ void send_places_query(const LLUUID& query_id,
gAgent.sendReliableMessage();
}
-
+// Deprecated in favor of cap "UserInfo"
void process_user_info_reply(LLMessageSystem* msg, void**)
{
LLUUID agent_id;
@@ -7276,7 +7277,8 @@ void process_user_info_reply(LLMessageSystem* msg, void**)
std::string dir_visibility;
msg->getString( "UserData", "DirectoryVisibility", dir_visibility);
- LLFloaterPreference::updateUserInfo(dir_visibility, im_via_email);
+ // For Message based user info information the is_verified is assumed to be false.
+ LLFloaterPreference::updateUserInfo(dir_visibility, im_via_email, false);
LLFloaterSnapshot::setAgentEmail(email);
}
diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp
index 3fd2af87de..3f479802aa 100644
--- a/indra/newview/llviewerregion.cpp
+++ b/indra/newview/llviewerregion.cpp
@@ -2896,6 +2896,7 @@ void LLViewerRegionImpl::buildCapabilityNames(LLSD& capabilityNames)
capabilityNames.append("UpdateScriptAgent");
capabilityNames.append("UpdateScriptTask");
capabilityNames.append("UploadBakedTexture");
+ capabilityNames.append("UserInfo");
capabilityNames.append("ViewerAsset");
capabilityNames.append("ViewerMetrics");
capabilityNames.append("ViewerStartAuction");
diff --git a/indra/newview/llviewertexteditor.h b/indra/newview/llviewertexteditor.h
index 33cfca4f90..44f104dde1 100644
--- a/indra/newview/llviewertexteditor.h
+++ b/indra/newview/llviewertexteditor.h
@@ -71,7 +71,8 @@ public:
mObjectID = object_id;
mPreviewID = preview_id;
}
-
+ void setNotecardObjectID(const LLUUID& object_id){ mObjectID = object_id;}
+
void setASCIIEmbeddedText(const std::string& instr);
void setEmbeddedText(const std::string& instr);
std::string getEmbeddedText();
diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp
index b052a48424..7b4895b862 100644
--- a/indra/newview/llviewerwindow.cpp
+++ b/indra/newview/llviewerwindow.cpp
@@ -4379,6 +4379,8 @@ BOOL LLViewerWindow::saveImageNumbered(LLImageFormatted *image, BOOL force_picke
else
pick_type = LLFilePicker::FFSAVE_ALL; // ???
+ BOOL is_snapshot_name_loc_set = isSnapshotLocSet();
+
// Get a base file location if needed.
if (force_picker || !isSnapshotLocSet())
{
@@ -4427,7 +4429,12 @@ BOOL LLViewerWindow::saveImageNumbered(LLImageFormatted *image, BOOL force_picke
filepath = sSnapshotDir;
filepath += gDirUtilp->getDirDelimiter();
filepath += sSnapshotBaseName;
- filepath += llformat("_%.3d",i);
+
+ if (is_snapshot_name_loc_set)
+ {
+ filepath += llformat("_%.3d",i);
+ }
+
filepath += extension;
llstat stat_info;
diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp
index efcdb07176..cc708ea275 100644
--- a/indra/newview/llvoavatar.cpp
+++ b/indra/newview/llvoavatar.cpp
@@ -7025,7 +7025,7 @@ void LLVOAvatar::logMetricsTimerRecord(const std::string& phase_name, F32 elapse
record["elapsed"] = elapsed;
record["completed"] = completed;
U32 grid_x(0), grid_y(0);
- if (getRegion())
+ if (getRegion() && LLWorld::instance().isRegionListed(getRegion()))
{
record["central_bake_version"] = LLSD::Integer(getRegion()->getCentralBakeVersion());
grid_from_region_handle(getRegion()->getHandle(), &grid_x, &grid_y);
diff --git a/indra/newview/skins/default/xui/en/floater_preferences.xml b/indra/newview/skins/default/xui/en/floater_preferences.xml
index 5ca527ad20..845c1efe4d 100644
--- a/indra/newview/skins/default/xui/en/floater_preferences.xml
+++ b/indra/newview/skins/default/xui/en/floater_preferences.xml
@@ -11,6 +11,12 @@
single_instance="true"
title="PREFERENCES"
width="658">
+ <floater.string
+ name="email_unverified_tooltip">
+ Please verify your email to enable IM to Email by visiting
+https://accounts.secondlife.com/change_email/
+ </floater.string>
+
<button
follows="right|bottom"
height="23"
diff --git a/indra/newview/skins/default/xui/en/floater_tos.xml b/indra/newview/skins/default/xui/en/floater_tos.xml
index e3b49bf917..0d52a5652d 100644
--- a/indra/newview/skins/default/xui/en/floater_tos.xml
+++ b/indra/newview/skins/default/xui/en/floater_tos.xml
@@ -74,7 +74,9 @@
name="agree_list"
top_delta="15"
word_wrap="true"
- width="552">the Second Life Terms and Conditions, Privacy Policy, and Terms of Service, including the dispute resolution requirements.
+ width="552"
+ text_color="LabelTextColor"
+ text_readonly_color="LabelDisabledColor">the Second Life Terms and Conditions, Privacy Policy, and Terms of Service, including the dispute resolution requirements.
</text>
<button
enabled="false"
diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml
index ee1ff372a7..9af4b299de 100644
--- a/indra/newview/skins/default/xui/en/notifications.xml
+++ b/indra/newview/skins/default/xui/en/notifications.xml
@@ -3991,7 +3991,8 @@ http://secondlife.com/download.
<notification
icon="alertmodal.tga"
name="UpdaterServiceNotRunning"
- type="alertmodal">
+ type="alertmodal"
+ force_urls_external="true">
There is a required update for your Second Life Installation.
You may download this update from http://www.secondlife.com/downloads