summaryrefslogtreecommitdiff
path: root/indra
diff options
context:
space:
mode:
Diffstat (limited to 'indra')
-rw-r--r--indra/llui/llcheckboxctrl.cpp64
-rw-r--r--indra/llui/llcheckboxctrl.h17
-rw-r--r--indra/llui/lltextbase.h2
-rw-r--r--indra/newview/VIEWER_VERSION.txt2
-rw-r--r--indra/newview/llappviewer.cpp15
-rw-r--r--indra/newview/llappviewer.h4
-rw-r--r--indra/newview/llfloaterforgetuser.cpp294
-rw-r--r--indra/newview/llfloaterforgetuser.h12
-rw-r--r--indra/newview/llimprocessing.cpp6
-rw-r--r--indra/newview/llpanellogin.cpp108
-rw-r--r--indra/newview/llpanelobjectinventory.cpp9
-rw-r--r--indra/newview/llsecapi.h4
-rw-r--r--indra/newview/llsechandler_basic.cpp13
-rw-r--r--indra/newview/llsechandler_basic.h4
-rw-r--r--indra/newview/llselectmgr.cpp2
-rw-r--r--indra/newview/llstartup.cpp9
-rw-r--r--indra/newview/llstartup.h1
-rw-r--r--indra/newview/llviewerobject.cpp1
-rw-r--r--indra/newview/llvoavatar.cpp50
-rw-r--r--indra/newview/llvoavatar.h2
-rw-r--r--indra/newview/pipeline.cpp20
-rw-r--r--indra/newview/skins/default/xui/de/floater_merchant_outbox.xml32
-rw-r--r--indra/newview/skins/default/xui/de/panel_outbox_inventory.xml2
-rw-r--r--indra/newview/skins/default/xui/en/floater_forget_user.xml2
-rw-r--r--indra/newview/skins/default/xui/en/notifications.xml36
-rw-r--r--indra/newview/skins/default/xui/en/panel_login.xml10
-rw-r--r--indra/newview/skins/default/xui/en/panel_preferences_sound.xml4
-rw-r--r--indra/newview/skins/default/xui/es/floater_merchant_outbox.xml32
-rw-r--r--indra/newview/skins/default/xui/es/panel_outbox_inventory.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/floater_merchant_outbox.xml32
-rw-r--r--indra/newview/skins/default/xui/fr/panel_outbox_inventory.xml2
-rw-r--r--indra/newview/skins/default/xui/it/floater_about_land.xml2
-rw-r--r--indra/newview/skins/default/xui/it/floater_merchant_outbox.xml32
-rw-r--r--indra/newview/skins/default/xui/it/panel_outbox_inventory.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/floater_merchant_outbox.xml32
-rw-r--r--indra/newview/skins/default/xui/ja/panel_outbox_inventory.xml2
-rw-r--r--indra/newview/skins/default/xui/pl/floater_merchant_outbox.xml29
-rw-r--r--indra/newview/skins/default/xui/pl/panel_outbox_inventory.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/floater_about_land.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/floater_merchant_outbox.xml32
-rw-r--r--indra/newview/skins/default/xui/pt/panel_outbox_inventory.xml2
-rw-r--r--indra/newview/skins/default/xui/ru/floater_about_land.xml2
-rw-r--r--indra/newview/skins/default/xui/ru/floater_merchant_outbox.xml32
-rw-r--r--indra/newview/skins/default/xui/ru/panel_outbox_inventory.xml2
-rw-r--r--indra/newview/skins/default/xui/tr/floater_merchant_outbox.xml32
-rw-r--r--indra/newview/skins/default/xui/tr/panel_outbox_inventory.xml2
-rw-r--r--indra/newview/skins/default/xui/zh/floater_merchant_outbox.xml32
-rw-r--r--indra/newview/skins/default/xui/zh/panel_outbox_inventory.xml2
-rw-r--r--indra/newview/tests/llsecapi_test.cpp1
49 files changed, 575 insertions, 460 deletions
diff --git a/indra/llui/llcheckboxctrl.cpp b/indra/llui/llcheckboxctrl.cpp
index eee6339caf..6a51c4240b 100644
--- a/indra/llui/llcheckboxctrl.cpp
+++ b/indra/llui/llcheckboxctrl.cpp
@@ -47,10 +47,18 @@ static LLDefaultChildRegistry::Register<LLCheckBoxCtrl> r("check_box");
template class LLCheckBoxCtrl* LLView::getChild<class LLCheckBoxCtrl>(
const std::string& name, BOOL recurse) const;
+void LLCheckBoxCtrl::WordWrap::declareValues()
+{
+ declare("none", EWordWrap::WRAP_NONE);
+ declare("down", EWordWrap::WRAP_DOWN);
+ declare("up", EWordWrap::WRAP_UP);
+}
+
LLCheckBoxCtrl::Params::Params()
: initial_value("initial_value", false),
label_text("label_text"),
check_button("check_button"),
+ word_wrap("word_wrap", EWordWrap::WRAP_NONE),
radio_style("radio_style")
{}
@@ -59,14 +67,14 @@ LLCheckBoxCtrl::LLCheckBoxCtrl(const LLCheckBoxCtrl::Params& p)
: LLUICtrl(p),
mTextEnabledColor(p.label_text.text_color()),
mTextDisabledColor(p.label_text.text_readonly_color()),
- mFont(p.font())
+ mFont(p.font()),
+ mWordWrap(p.word_wrap)
{
mViewModel->setValue(LLSD(p.initial_value));
mViewModel->resetDirty();
static LLUICachedControl<S32> llcheckboxctrl_spacing ("UICheckboxctrlSpacing", 0);
static LLUICachedControl<S32> llcheckboxctrl_hpad ("UICheckboxctrlHPad", 0);
static LLUICachedControl<S32> llcheckboxctrl_vpad ("UICheckboxctrlVPad", 0);
- static LLUICachedControl<S32> llcheckboxctrl_btn_size ("UICheckboxctrlBtnSize", 0);
// must be big enough to hold all children
setUseBoundingRect(TRUE);
@@ -85,20 +93,47 @@ LLCheckBoxCtrl::LLCheckBoxCtrl(const LLCheckBoxCtrl::Params& p)
{
tbparams.font(p.font);
}
- mLabel = LLUICtrlFactory::create<LLTextBox> (tbparams);
+
+ mLabel = LLUICtrlFactory::create<LLTextBox>(tbparams);
+ if (mWordWrap != WRAP_NONE)
+ {
+ // Not setWordWrap(mWordWrap != WRAP_NONE) because there might be some old lurking code that sets it manually
+ mLabel->setWordWrap(true);
+ S32 new_width = getRect().getWidth() - p.check_button.rect().getWidth() - llcheckboxctrl_hpad;
+ LLRect label_rect = mLabel->getRect();
+ label_rect.mRight = label_rect.mLeft + new_width;
+ mLabel->setRect(label_rect);
+ }
mLabel->reshapeToFitText();
- addChild(mLabel);
LLRect label_rect = mLabel->getRect();
+ if (mLabel->getLineCount() > 1)
+ {
+ if (mWordWrap == WRAP_DOWN)
+ {
+ // reshapeToFitText uses LLView::reshape() which always reshapes
+ // from bottom to top, but we want to extend the bottom
+ // Note: might be better idea to use getRect().mTop of LLCheckBoxCtrl (+pad) as top point of new rect
+ S32 delta = ll_round((F32)mLabel->getFont()->getLineHeight() * mLabel->getLineSpacingMult()) - label_rect.getHeight();
+ label_rect.translate(0, delta);
+ mLabel->setRect(label_rect);
+ }
+ // else
+ // WRAP_UP is essentially done by reshapeToFitText() (extends from bottom to top)
+ // howhever it doesn't respect rect of checkbox
+ // todo: this should be fixed, but there are at least couple checkboxes that use this feature as is.
+ }
+
+ addChild(mLabel);
// Button
- // Note: button cover the label by extending all the way to the right.
+ // Note: button cover the label by extending all the way to the right and down.
LLRect btn_rect = p.check_button.rect();
btn_rect.setOriginAndSize(
btn_rect.mLeft,
- btn_rect.mBottom,
+ llmin(btn_rect.mBottom, label_rect.mBottom),
llmax(btn_rect.mRight, label_rect.mRight - btn_rect.mLeft),
- llmax( label_rect.getHeight(), btn_rect.mTop));
+ llmax(label_rect.getHeight(), btn_rect.mTop));
std::string active_true_id, active_false_id;
std::string inactive_true_id, inactive_false_id;
@@ -152,17 +187,26 @@ void LLCheckBoxCtrl::clear()
void LLCheckBoxCtrl::reshape(S32 width, S32 height, BOOL called_from_parent)
{
-
+ S32 label_top = mLabel->getRect().mTop;
mLabel->reshapeToFitText();
LLRect label_rect = mLabel->getRect();
+ if (label_top != label_rect.mTop && mWordWrap == WRAP_DOWN)
+ {
+ // reshapeToFitText uses LLView::reshape() which always reshapes
+ // from bottom to top, but we want to extend the bottom so
+ // reposition control
+ S32 delta = label_top - label_rect.mTop;
+ label_rect.translate(0, delta);
+ mLabel->setRect(label_rect);
+ }
// Button
- // Note: button cover the label by extending all the way to the right.
+ // Note: button cover the label by extending all the way to the right and down.
LLRect btn_rect = mButton->getRect();
btn_rect.setOriginAndSize(
btn_rect.mLeft,
- btn_rect.mBottom,
+ llmin(btn_rect.mBottom, label_rect.mBottom),
llmax(btn_rect.getWidth(), label_rect.mRight - btn_rect.mLeft),
llmax(label_rect.mTop - btn_rect.mBottom, btn_rect.getHeight()));
mButton->setShape(btn_rect);
diff --git a/indra/llui/llcheckboxctrl.h b/indra/llui/llcheckboxctrl.h
index 07ae9c3b18..eb5bd5b6da 100644
--- a/indra/llui/llcheckboxctrl.h
+++ b/indra/llui/llcheckboxctrl.h
@@ -50,6 +50,19 @@ class LLCheckBoxCtrl
, public ll::ui::SearchableControl
{
public:
+
+ enum EWordWrap
+ {
+ WRAP_NONE,
+ WRAP_UP,
+ WRAP_DOWN
+ };
+
+ struct WordWrap : public LLInitParam::TypeValuesHelper<EWordWrap, WordWrap>
+ {
+ static void declareValues();
+ };
+
struct Params
: public LLInitParam::Block<Params, LLUICtrl::Params>
{
@@ -58,6 +71,8 @@ public:
Optional<LLTextBox::Params> label_text;
Optional<LLButton::Params> check_button;
+ Optional<EWordWrap, WordWrap> word_wrap;
+
Ignored radio_style;
Params();
@@ -129,6 +144,8 @@ protected:
LLUIColor mTextEnabledColor;
LLUIColor mTextDisabledColor;
+
+ EWordWrap mWordWrap; // off, shifts text up, shifts text down
};
// Build time optimization, generate once in .cpp file
diff --git a/indra/llui/lltextbase.h b/indra/llui/lltextbase.h
index 4239cdf43c..058b804714 100644
--- a/indra/llui/lltextbase.h
+++ b/indra/llui/lltextbase.h
@@ -441,6 +441,8 @@ public:
S32 getVPad() { return mVPad; }
S32 getHPad() { return mHPad; }
+ F32 getLineSpacingMult() { return mLineSpacingMult; }
+ S32 getLineSpacingPixels() { return mLineSpacingPixels; } // only for multiline
S32 getDocIndexFromLocalCoord( S32 local_x, S32 local_y, BOOL round, bool hit_past_end_of_line = true) const;
LLRect getLocalRectFromDocIndex(S32 pos) const;
diff --git a/indra/newview/VIEWER_VERSION.txt b/indra/newview/VIEWER_VERSION.txt
index b98d1d3fa7..c44315e3f0 100644
--- a/indra/newview/VIEWER_VERSION.txt
+++ b/indra/newview/VIEWER_VERSION.txt
@@ -1 +1 @@
-6.3.5
+6.3.7
diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index bf6ba38de2..b1470860fe 100644
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -673,7 +673,8 @@ LLAppViewer::LLAppViewer()
mReportedCrash(false),
mNumSessions(0),
mPurgeCache(false),
- mPurgeOnExit(false),
+ mPurgeCacheOnExit(false),
+ mPurgeUserDataOnExit(false),
mSecondInstance(false),
mSavedFinalSnapshot(false),
mSavePerAccountSettings(false), // don't save settings on logout unless login succeeded.
@@ -1956,7 +1957,7 @@ bool LLAppViewer::cleanup()
LLConversationLog::instance().cache();
}
- if (mPurgeOnExit)
+ if (mPurgeCacheOnExit)
{
LL_INFOS() << "Purging all cache files on exit" << LL_ENDL;
gDirUtilp->deleteFilesInDir(gDirUtilp->getExpandedFilename(LL_PATH_CACHE,""), "*.*");
@@ -1997,6 +1998,14 @@ bool LLAppViewer::cleanup()
}
}
+ if (mPurgeUserDataOnExit)
+ {
+ // Ideally we should not save anything from this session since it is going to be purged now,
+ // but this is a very 'rare' case (user deleting himself), not worth overcomplicating 'save&cleanup' code
+ std::string user_path = gDirUtilp->getOSUserAppDir() + gDirUtilp->getDirDelimiter() + LLStartUp::getUserId();
+ gDirUtilp->deleteDirAndContents(user_path);
+ }
+
// Delete workers first
// shotdown all worker threads before deleting them in case of co-dependencies
mAppCoreHttp.requestStop();
@@ -4471,7 +4480,7 @@ void LLAppViewer::badNetworkHandler()
// Flush all of our caches on exit in the case of disconnect due to
// invalid packets.
- mPurgeOnExit = TRUE;
+ mPurgeCacheOnExit = TRUE;
std::ostringstream message;
message <<
diff --git a/indra/newview/llappviewer.h b/indra/newview/llappviewer.h
index 788fe6a19b..1298ba51e2 100644
--- a/indra/newview/llappviewer.h
+++ b/indra/newview/llappviewer.h
@@ -190,6 +190,7 @@ public:
void addOnIdleCallback(const boost::function<void()>& cb); // add a callback to fire (once) when idle
+ void purgeUserDataOnExit() { mPurgeUserDataOnExit = true; }
void purgeCache(); // Clear the local cache.
void purgeCacheImmediate(); //clear local cache immediately.
S32 updateTextureThreads(F32 max_time);
@@ -281,7 +282,8 @@ private:
std::string mSerialNumber;
bool mPurgeCache;
- bool mPurgeOnExit;
+ bool mPurgeCacheOnExit;
+ bool mPurgeUserDataOnExit;
LLViewerJoystick* joystick;
bool mSavedFinalSnapshot;
diff --git a/indra/newview/llfloaterforgetuser.cpp b/indra/newview/llfloaterforgetuser.cpp
index 363951041a..97b022699f 100644
--- a/indra/newview/llfloaterforgetuser.cpp
+++ b/indra/newview/llfloaterforgetuser.cpp
@@ -29,11 +29,15 @@
#include "llfloaterforgetuser.h"
+#include "llappviewer.h"
#include "llcheckboxctrl.h"
#include "llfavoritesbar.h"
+#include "llnotificationsutil.h"
#include "llpanellogin.h" // for helper function getUserName() and to repopulate list if nessesary
#include "llscrolllistctrl.h"
#include "llsecapi.h"
+#include "llstartup.h"
+#include "llviewercontrol.h"
#include "llviewernetwork.h"
@@ -54,55 +58,66 @@ LLFloaterForgetUser::~LLFloaterForgetUser()
BOOL LLFloaterForgetUser::postBuild()
{
- // Note, storage works per grid, whatever is selected currently in login screen or logged in.
- // Since login screen can change grid, store the value.
- mGrid = LLGridManager::getInstance()->getGrid();
+ mScrollList = getChild<LLScrollListCtrl>("user_list");
- LLScrollListCtrl *scroll_list = getChild<LLScrollListCtrl>("user_list");
- if (gSecAPIHandler->hasCredentialMap("login_list", mGrid))
- {
- LLSecAPIHandler::credential_map_t credencials;
- gSecAPIHandler->loadCredentialMap("login_list", mGrid, credencials);
- LLSecAPIHandler::credential_map_t::iterator cr_iter = credencials.begin();
- LLSecAPIHandler::credential_map_t::iterator cr_end = credencials.end();
- while (cr_iter != cr_end)
+ bool show_grid_marks = gSavedSettings.getBOOL("ForceShowGrid");
+ show_grid_marks |= !LLGridManager::getInstance()->isInProductionGrid();
+
+ std::map<std::string, std::string> known_grids = LLGridManager::getInstance()->getKnownGrids();
+
+ if (!show_grid_marks)
+ {
+ // Figure out if there are records for more than one grid in storage
+ for (std::map<std::string, std::string>::iterator grid_iter = known_grids.begin();
+ grid_iter != known_grids.end();
+ grid_iter++)
{
- if (cr_iter->second.notNull()) // basic safety
+ if (!grid_iter->first.empty()
+ && grid_iter->first != MAINGRID) // a workaround since 'mIsInProductionGrid' might not be set
{
- LLScrollListItem::Params item_params;
- item_params.value(cr_iter->first);
- item_params.columns.add()
- .value(LLPanelLogin::getUserName(cr_iter->second))
- .column("user")
- .font(LLFontGL::getFontSansSerifSmall());
- scroll_list->addRow(item_params, ADD_BOTTOM);
+ if (!gSecAPIHandler->emptyCredentialMap("login_list", grid_iter->first))
+ {
+ show_grid_marks = true;
+ break;
+ }
+
+ // "Legacy" viewer support
+ LLPointer<LLCredential> cred = gSecAPIHandler->loadCredential(grid_iter->first);
+ if (cred.notNull())
+ {
+ const LLSD &ident = cred->getIdentifier();
+ if (ident.isMap() && ident.has("type"))
+ {
+ show_grid_marks = true;
+ break;
+ }
+ }
}
- cr_iter++;
}
- scroll_list->selectFirstItem();
+ }
+
+ mUserGridsCount.clear();
+ if (!show_grid_marks)
+ {
+ // just load maingrid
+ loadGridToList(MAINGRID, false);
}
else
{
- LLPointer<LLCredential> cred = gSecAPIHandler->loadCredential(mGrid);
- if (cred.notNull())
+ for (std::map<std::string, std::string>::iterator grid_iter = known_grids.begin();
+ grid_iter != known_grids.end();
+ grid_iter++)
{
- const LLSD &ident = cred->getIdentifier();
- if (ident.isMap() && ident.has("type"))
+ if (!grid_iter->first.empty())
{
- LLScrollListItem::Params item_params;
- item_params.value(cred->userID());
- item_params.columns.add()
- .value(LLPanelLogin::getUserName(cred))
- .column("user")
- .font(LLFontGL::getFontSansSerifSmall());
- scroll_list->addRow(item_params, ADD_BOTTOM);
- scroll_list->selectFirstItem();
+ loadGridToList(grid_iter->first, true);
}
}
}
- bool enable_button = scroll_list->getFirstSelectedIndex() != -1;
+ mScrollList->selectFirstItem();
+ bool enable_button = mScrollList->getFirstSelectedIndex() != -1;
LLCheckBoxCtrl *chk_box = getChild<LLCheckBoxCtrl>("delete_data");
chk_box->setEnabled(enable_button);
chk_box->set(FALSE);
@@ -115,36 +130,88 @@ BOOL LLFloaterForgetUser::postBuild()
void LLFloaterForgetUser::onForgetClicked()
{
- mLoginPanelDirty = true;
LLScrollListCtrl *scroll_list = getChild<LLScrollListCtrl>("user_list");
- std::string user_key = scroll_list->getSelectedValue();
+ LLSD user_data = scroll_list->getSelectedValue();
+ const std::string user_id = user_data["user_id"];
- // remove creds
- gSecAPIHandler->removeFromCredentialMap("login_list", mGrid, user_key);
+ LLCheckBoxCtrl *chk_box = getChild<LLCheckBoxCtrl>("delete_data");
+ BOOL delete_data = chk_box->getValue();
- LLPointer<LLCredential> cred = gSecAPIHandler->loadCredential(mGrid);
- if (cred.notNull() && cred->userID() == user_key)
+ if (delete_data && mUserGridsCount[user_id] > 1)
{
- gSecAPIHandler->deleteCredential(cred);
+ // more than 1 grid uses this id
+ LLNotificationsUtil::add("LoginRemoveMultiGridUserData", LLSD(), LLSD(), boost::bind(&LLFloaterForgetUser::onConfirmForget, this, _1, _2));
+ return;
}
- // Clean data
- LLCheckBoxCtrl *chk_box = getChild<LLCheckBoxCtrl>("delete_data");
- BOOL delete_data = chk_box->getValue();
- if (delete_data)
+ processForgetUser();
+}
+
+bool LLFloaterForgetUser::onConfirmForget(const LLSD& notification, const LLSD& response)
+{
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
+ if (option == 0)
{
- // key is edentical to one we use for name of user's folder
- std::string user_path = gDirUtilp->getOSUserAppDir() + gDirUtilp->getDirDelimiter() + user_key;
- gDirUtilp->deleteDirAndContents(user_path);
+ processForgetUser();
+ }
+ return false;
+}
- // Clean favorites, label is edentical to username
- LLFavoritesOrderStorage::removeFavoritesRecordOfUser(scroll_list->getSelectedItemLabel(), mGrid);
+// static
+bool LLFloaterForgetUser::onConfirmLogout(const LLSD& notification, const LLSD& response, const std::string &fav_id, const std::string &grid)
+{
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
+ if (option == 0)
+ {
+ // Remove creds
+ gSecAPIHandler->removeFromCredentialMap("login_list", grid, LLStartUp::getUserId());
- // Note: we do not clean user-related files from cache because there are id dependent (inventory)
- // files and cache has separate cleaning mechanism either way.
- // Also this only cleans user from current grid, not all of them.
+ LLPointer<LLCredential> cred = gSecAPIHandler->loadCredential(grid);
+ if (cred.notNull() && cred->userID() == LLStartUp::getUserId())
+ {
+ gSecAPIHandler->deleteCredential(cred);
+ }
+
+ // Clean favorites
+ LLFavoritesOrderStorage::removeFavoritesRecordOfUser(fav_id, grid);
+
+ // mark data for removal
+ LLAppViewer::instance()->purgeUserDataOnExit();
+ LLAppViewer::instance()->requestQuit();
}
+ return false;
+}
+void LLFloaterForgetUser::processForgetUser()
+{
+ LLScrollListCtrl *scroll_list = getChild<LLScrollListCtrl>("user_list");
+ LLCheckBoxCtrl *chk_box = getChild<LLCheckBoxCtrl>("delete_data");
+ BOOL delete_data = chk_box->getValue();
+ LLSD user_data = scroll_list->getSelectedValue();
+ const std::string user_id = user_data["user_id"];
+ const std::string grid = user_data["grid"];
+ const std::string user_name = user_data["label"]; // for favorites
+
+ if (delete_data && user_id == LLStartUp::getUserId() && LLStartUp::getStartupState() > STATE_LOGIN_WAIT)
+ {
+ // we can't delete data for user that is currently logged in
+ // we need to pass grid because we are deleting data universal to grids, but specific grid's user
+ LLNotificationsUtil::add("LoginCantRemoveCurUsername", LLSD(), LLSD(), boost::bind(onConfirmLogout, _1, _2, user_name, grid));
+ return;
+ }
+
+ // key is used for name of user's folder and in credencials
+ // user_name is edentical to favorite's username
+ forgetUser(user_id, user_name, grid, delete_data);
+ mLoginPanelDirty = true;
+ if (delete_data)
+ {
+ mUserGridsCount[user_id] = 0; //no data left to care about
+ }
+ else
+ {
+ mUserGridsCount[user_id]--;
+ }
// Update UI
scroll_list->deleteSelectedItems();
@@ -157,4 +224,125 @@ void LLFloaterForgetUser::onForgetClicked()
}
}
+//static
+void LLFloaterForgetUser::forgetUser(const std::string &userid, const std::string &fav_id, const std::string &grid, bool delete_data)
+{
+ // Remove creds
+ gSecAPIHandler->removeFromCredentialMap("login_list", grid, userid);
+
+ LLPointer<LLCredential> cred = gSecAPIHandler->loadCredential(grid);
+ if (cred.notNull() && cred->userID() == userid)
+ {
+ gSecAPIHandler->deleteCredential(cred);
+ }
+
+ // Clean data
+ if (delete_data)
+ {
+ std::string user_path = gDirUtilp->getOSUserAppDir() + gDirUtilp->getDirDelimiter() + userid;
+ gDirUtilp->deleteDirAndContents(user_path);
+
+ // Clean favorites
+ LLFavoritesOrderStorage::removeFavoritesRecordOfUser(fav_id, grid);
+
+ // Note: we do not clean user-related files from cache because there are id dependent (inventory)
+ // files and cache has separate cleaning mechanism either way.
+ // Also this only cleans user from current grid, not all of them.
+ }
+}
+
+void LLFloaterForgetUser::loadGridToList(const std::string &grid, bool show_grid_name)
+{
+ std::string grid_label;
+ if (show_grid_name)
+ {
+ grid_label = LLGridManager::getInstance()->getGridId(grid); //login id (shortened label)
+ }
+ if (gSecAPIHandler->hasCredentialMap("login_list", grid))
+ {
+ LLSecAPIHandler::credential_map_t credencials;
+ gSecAPIHandler->loadCredentialMap("login_list", grid, credencials);
+
+ LLSecAPIHandler::credential_map_t::iterator cr_iter = credencials.begin();
+ LLSecAPIHandler::credential_map_t::iterator cr_end = credencials.end();
+ while (cr_iter != cr_end)
+ {
+ if (cr_iter->second.notNull()) // basic safety
+ {
+ std::string user_label = LLPanelLogin::getUserName(cr_iter->second);
+ LLSD user_data;
+ user_data["user_id"] = cr_iter->first;
+ user_data["label"] = user_label;
+ user_data["grid"] = grid;
+
+ if (show_grid_name)
+ {
+ user_label += " (" + grid_label + ")";
+ }
+
+ LLScrollListItem::Params item_params;
+ item_params.value(user_data);
+ item_params.columns.add()
+ .value(user_label)
+ .column("user")
+ .font(LLFontGL::getFontSansSerifSmall());
+ mScrollList->addRow(item_params, ADD_BOTTOM);
+
+ // Add one to grid count
+ std::map<std::string, S32>::iterator found = mUserGridsCount.find(cr_iter->first);
+ if (found != mUserGridsCount.end())
+ {
+ found->second++;
+ }
+ else
+ {
+ mUserGridsCount[cr_iter->first] = 1;
+ }
+ }
+ cr_iter++;
+ }
+ }
+ else
+ {
+ // "Legacy" viewer support
+ LLPointer<LLCredential> cred = gSecAPIHandler->loadCredential(grid);
+ if (cred.notNull())
+ {
+ const LLSD &ident = cred->getIdentifier();
+ if (ident.isMap() && ident.has("type"))
+ {
+ std::string user_label = LLPanelLogin::getUserName(cred);
+ LLSD user_data;
+ user_data["user_id"] = cred->userID();
+ user_data["label"] = user_label;
+ user_data["grid"] = grid;
+
+ if (show_grid_name)
+ {
+ user_label += " (" + grid_label + ")";
+ }
+
+ LLScrollListItem::Params item_params;
+ item_params.value(user_data);
+ item_params.columns.add()
+ .value(user_label)
+ .column("user")
+ .font(LLFontGL::getFontSansSerifSmall());
+ mScrollList->addRow(item_params, ADD_BOTTOM);
+
+ // Add one to grid count
+ std::map<std::string, S32>::iterator found = mUserGridsCount.find(cred->userID());
+ if (found != mUserGridsCount.end())
+ {
+ found->second++;
+ }
+ else
+ {
+ mUserGridsCount[cred->userID()] = 1;
+ }
+ }
+ }
+ }
+}
+
diff --git a/indra/newview/llfloaterforgetuser.h b/indra/newview/llfloaterforgetuser.h
index 119aece2d1..801fcbb412 100644
--- a/indra/newview/llfloaterforgetuser.h
+++ b/indra/newview/llfloaterforgetuser.h
@@ -29,6 +29,8 @@
#include "llfloater.h"
+class LLScrollListCtrl;
+
class LLFloaterForgetUser : public LLFloater
{
public:
@@ -39,8 +41,16 @@ public:
void onForgetClicked();
private:
+ bool onConfirmForget(const LLSD& notification, const LLSD& response);
+ static bool onConfirmLogout(const LLSD& notification, const LLSD& response, const std::string &favorites_id, const std::string &grid);
+ void processForgetUser();
+ static void forgetUser(const std::string &userid, const std::string &fav_id, const std::string &grid, bool delete_data);
+ void loadGridToList(const std::string &grid, bool show_grid_name);
+
+ LLScrollListCtrl *mScrollList;
+
bool mLoginPanelDirty;
- std::string mGrid;
+ std::map<std::string, S32> mUserGridsCount;
};
#endif
diff --git a/indra/newview/llimprocessing.cpp b/indra/newview/llimprocessing.cpp
index 9633683771..6da7bbe263 100644
--- a/indra/newview/llimprocessing.cpp
+++ b/indra/newview/llimprocessing.cpp
@@ -1569,6 +1569,12 @@ void LLIMProcessing::requestOfflineMessagesCoro(std::string url)
return;
}
+ if (gAgent.getRegion() == NULL)
+ {
+ LL_WARNS("Messaging") << "Region null while attempting to load messages." << LL_ENDL;
+ return;
+ }
+
LL_INFOS("Messaging") << "Processing offline messages." << LL_ENDL;
std::vector<U8> data;
diff --git a/indra/newview/llpanellogin.cpp b/indra/newview/llpanellogin.cpp
index 4fd39d1211..224cec9650 100644
--- a/indra/newview/llpanellogin.cpp
+++ b/indra/newview/llpanellogin.cpp
@@ -549,18 +549,20 @@ void LLPanelLogin::populateFields(LLPointer<LLCredential> credential, bool remem
LL_WARNS() << "Attempted fillFields with no login view shown" << LL_ENDL;
return;
}
- LLUICtrl* remember_check = sInstance->getChild<LLUICtrl>("remember_check");
- remember_check->setValue(remember_psswrd);
if (sInstance->mFirstLoginThisInstall)
{
+ LLUICtrl* remember_check = sInstance->getChild<LLUICtrl>("remember_check");
+ remember_check->setValue(remember_psswrd);
// no list to populate
setFields(credential);
}
else
{
sInstance->getChild<LLUICtrl>("remember_name")->setValue(remember_user);
+ LLUICtrl* remember_password = sInstance->getChild<LLUICtrl>("remember_password");
+ remember_password->setValue(remember_psswrd);
+ remember_password->setEnabled(remember_user);
sInstance->populateUserList(credential);
- remember_check->setEnabled(remember_user);
}
}
@@ -610,15 +612,19 @@ void LLPanelLogin::setFields(LLPointer<LLCredential> credential)
login_id += " ";
login_id += lastname;
}
- sInstance->getChild<LLComboBox>("username_combo")->setLabel(login_id);
+ sInstance->getChild<LLComboBox>("username_combo")->setLabel(login_id);
+ sInstance->mUsernameLength = login_id.length();
}
else if(identifier.has("type") && (std::string)identifier["type"] == "account")
{
- sInstance->getChild<LLComboBox>("username_combo")->setLabel((std::string)identifier["account_name"]);
+ std::string login_id = identifier["account_name"].asString();
+ sInstance->getChild<LLComboBox>("username_combo")->setLabel(login_id);
+ sInstance->mUsernameLength = login_id.length();
}
else
{
- sInstance->getChild<LLComboBox>("username_combo")->setLabel(std::string());
+ sInstance->getChild<LLComboBox>("username_combo")->setLabel(std::string());
+ sInstance->mUsernameLength = 0;
}
sInstance->addFavoritesToStartLocation();
@@ -642,7 +648,8 @@ void LLPanelLogin::setFields(LLPointer<LLCredential> credential)
}
else
{
- sInstance->getChild<LLUICtrl>("password_edit")->setValue(std::string());
+ sInstance->getChild<LLUICtrl>("password_edit")->setValue(std::string());
+ sInstance->mPasswordLength = 0;
}
}
@@ -660,7 +667,7 @@ void LLPanelLogin::getFields(LLPointer<LLCredential>& credential,
LLSD identifier = LLSD::emptyMap();
LLSD authenticator = LLSD::emptyMap();
- std::string username = sInstance->getChild<LLComboBox>("username_combo")->getValue().asString();
+ std::string username = sInstance->getChild<LLComboBox>("username_combo")->getSimple();
std::string password = sInstance->getChild<LLUICtrl>("password_edit")->getValue().asString();
LLStringUtil::trim(username);
@@ -742,13 +749,14 @@ void LLPanelLogin::getFields(LLPointer<LLCredential>& credential,
}
}
credential = gSecAPIHandler->createCredential(LLGridManager::getInstance()->getGrid(), identifier, authenticator);
- remember_psswrd = sInstance->getChild<LLUICtrl>("remember_check")->getValue();
if (!sInstance->mFirstLoginThisInstall)
{
+ remember_psswrd = sInstance->getChild<LLUICtrl>("remember_password")->getValue();
remember_user = sInstance->getChild<LLUICtrl>("remember_name")->getValue();
}
else
{
+ remember_psswrd = sInstance->getChild<LLUICtrl>("remember_check")->getValue();
remember_user = remember_psswrd; // on panel_login_first "remember_check" is named as 'remember me'
}
}
@@ -763,11 +771,8 @@ BOOL LLPanelLogin::areCredentialFieldsDirty()
}
else
{
- std::string username = sInstance->getChild<LLUICtrl>("username_combo")->getValue().asString();
- LLStringUtil::trim(username);
- std::string password = sInstance->getChild<LLUICtrl>("password_edit")->getValue().asString();
LLComboBox* combo = sInstance->getChild<LLComboBox>("username_combo");
- if(combo && combo->isDirty())
+ if (combo && combo->getCurrentIndex() == -1 && !combo->getValue().asString().empty())
{
return true;
}
@@ -1079,6 +1084,7 @@ void LLPanelLogin::onUserNameTextEnty(void*)
{
sInstance->mPasswordModified = true;
sInstance->getChild<LLUICtrl>("password_edit")->setValue(std::string());
+ sInstance->mPasswordLength = 0;
sInstance->addFavoritesToStartLocation(); //will call updateLoginButtons()
}
@@ -1112,14 +1118,22 @@ void LLPanelLogin::onUserListCommit(void*)
}
// static
+// At the moment only happens if !mFirstLoginThisInstall
void LLPanelLogin::onRememberUserCheck(void*)
{
- if (sInstance)
+ if (sInstance && !sInstance->mFirstLoginThisInstall)
{
LLCheckBoxCtrl* remember_name(sInstance->getChild<LLCheckBoxCtrl>("remember_name"));
- LLCheckBoxCtrl* remember_psswrd(sInstance->getChild<LLCheckBoxCtrl>("remember_check"));
+ LLCheckBoxCtrl* remember_psswrd(sInstance->getChild<LLCheckBoxCtrl>("remember_password"));
+ LLComboBox* user_combo(sInstance->getChild<LLComboBox>("username_combo"));
bool remember = remember_name->getValue().asBoolean();
+ if (user_combo->getCurrentIndex() != -1 && !remember)
+ {
+ remember = true;
+ remember_name->setValue(true);
+ LLNotificationsUtil::add("LoginCantRemoveUsername");
+ }
remember_psswrd->setEnabled(remember);
}
}
@@ -1148,8 +1162,32 @@ void LLPanelLogin::updateServer()
try
{
// if they've selected another grid, we should load the credentials
- // for that grid and set them to the UI.
- if(!sInstance->areCredentialFieldsDirty())
+ // for that grid and set them to the UI. But if there were any modifications to
+ // fields, modifications should carry over.
+ // Not sure if it should carry over password but it worked like this before login changes
+ // Example: you started typing in and found that your are under wrong grid,
+ // you switch yet don't lose anything
+ if (sInstance->areCredentialFieldsDirty())
+ {
+ // save modified creds
+ LLComboBox* user_combo = sInstance->getChild<LLComboBox>("username_combo");
+ LLLineEditor* pswd_edit = sInstance->getChild<LLLineEditor>("password_edit");
+ std::string username = user_combo->getSimple();
+ LLStringUtil::trim(username);
+ std::string password = pswd_edit->getValue().asString();
+
+ // populate dropbox and setFields
+ // Note: following call is related to initializeLoginInfo()
+ LLPointer<LLCredential> credential = gSecAPIHandler->loadCredential(LLGridManager::getInstance()->getGrid());
+ sInstance->populateUserList(credential);
+
+ // restore creds
+ user_combo->setTextEntry(username);
+ pswd_edit->setValue(password);
+ sInstance->mUsernameLength = username.length();
+ sInstance->mPasswordLength = password.length();
+ }
+ else
{
// populate dropbox and setFields
// Note: following call is related to initializeLoginInfo()
@@ -1185,12 +1223,17 @@ void LLPanelLogin::updateLoginButtons()
login_btn->setEnabled(mUsernameLength != 0 && mPasswordLength != 0);
- if (!mFirstLoginThisInstall)
- {
- LLComboBox* user_combo = getChild<LLComboBox>("username_combo");
- LLCheckBoxCtrl* remember_name = getChild<LLCheckBoxCtrl>("remember_name");
- remember_name->setEnabled(user_combo->getCurrentIndex() == -1);
- }
+ if (!mFirstLoginThisInstall)
+ {
+ LLComboBox* user_combo = getChild<LLComboBox>("username_combo");
+ LLCheckBoxCtrl* remember_name = getChild<LLCheckBoxCtrl>("remember_name");
+ if (user_combo->getCurrentIndex() != -1)
+ {
+ remember_name->setValue(true);
+ LLCheckBoxCtrl* remember_pass = getChild<LLCheckBoxCtrl>("remember_password");
+ remember_pass->setEnabled(TRUE);
+ } // Note: might be good idea to do "else remember_name->setValue(mRememberedState)" but it might behave 'weird' to user
+ }
}
void LLPanelLogin::populateUserList(LLPointer<LLCredential> credential)
@@ -1198,6 +1241,10 @@ void LLPanelLogin::populateUserList(LLPointer<LLCredential> credential)
LLComboBox* user_combo = getChild<LLComboBox>("username_combo");
user_combo->removeall();
user_combo->clear();
+ user_combo->setValue(std::string());
+ getChild<LLUICtrl>("password_edit")->setValue(std::string());
+ mUsernameLength = 0;
+ mPasswordLength = 0;
if (gSecAPIHandler->hasCredentialMap("login_list", LLGridManager::getInstance()->getGrid()))
{
@@ -1218,8 +1265,8 @@ void LLPanelLogin::populateUserList(LLPointer<LLCredential> credential)
if (credential.isNull() || !user_combo->setSelectedByValue(LLSD(credential->userID()), true))
{
- // selection failed, just deselect whatever might be selected
- user_combo->setValue(std::string());
+ // selection failed, fields will be mepty
+ updateLoginButtons();
}
else
{
@@ -1233,9 +1280,18 @@ void LLPanelLogin::populateUserList(LLPointer<LLCredential> credential)
const LLSD &ident = credential->getIdentifier();
if (ident.isMap() && ident.has("type"))
{
- user_combo->add(LLPanelLogin::getUserName(credential), credential->userID(), ADD_BOTTOM, TRUE);
+ // this llsd might hold invalid credencial (failed login), so
+ // do not add to the list, just set field.
setFields(credential);
}
+ else
+ {
+ updateLoginButtons();
+ }
+ }
+ else
+ {
+ updateLoginButtons();
}
}
}
diff --git a/indra/newview/llpanelobjectinventory.cpp b/indra/newview/llpanelobjectinventory.cpp
index 6702dae4d6..7756b92a3a 100644
--- a/indra/newview/llpanelobjectinventory.cpp
+++ b/indra/newview/llpanelobjectinventory.cpp
@@ -1561,12 +1561,13 @@ void LLPanelObjectInventory::refresh()
//LL_INFOS() << "LLPanelObjectInventory::refresh()" << LL_ENDL;
BOOL has_inventory = FALSE;
const BOOL non_root_ok = TRUE;
- LLSelectNode* node = LLSelectMgr::getInstance()->getSelection()->getFirstRootNode(NULL, non_root_ok);
- if(node)
+ LLObjectSelectionHandle selection = LLSelectMgr::getInstance()->getSelection();
+ LLSelectNode* node = selection->getFirstRootNode(NULL, non_root_ok);
+ if(node && node->mValid)
{
LLViewerObject* object = node->getObject();
- if(object && ((LLSelectMgr::getInstance()->getSelection()->getRootObjectCount() == 1)
- || (LLSelectMgr::getInstance()->getSelection()->getObjectCount() == 1)))
+ if(object && ((selection->getRootObjectCount() == 1)
+ || (selection->getObjectCount() == 1)))
{
// determine if we need to make a request. Start with a
// default based on if we have inventory at all.
diff --git a/indra/newview/llsecapi.h b/indra/newview/llsecapi.h
index c0f0a367c7..69b6b32923 100644
--- a/indra/newview/llsecapi.h
+++ b/indra/newview/llsecapi.h
@@ -491,6 +491,10 @@ public:
virtual bool hasCredentialMap(const std::string& storage,
const std::string& grid)=0;
+ // returns true if map is empty or does not exist
+ virtual bool emptyCredentialMap(const std::string& storage,
+ const std::string& grid)=0;
+
// load map of credentials from specific storage
typedef std::map<std::string, LLPointer<LLCredential> > credential_map_t;
virtual void loadCredentialMap(const std::string& storage,
diff --git a/indra/newview/llsechandler_basic.cpp b/indra/newview/llsechandler_basic.cpp
index a8bb54a90e..55e49100c3 100644
--- a/indra/newview/llsechandler_basic.cpp
+++ b/indra/newview/llsechandler_basic.cpp
@@ -1664,6 +1664,19 @@ bool LLSecAPIBasicHandler::hasCredentialMap(const std::string& storage, const st
return credential.isMap();
}
+// returns true if map is empty or does not exist
+bool LLSecAPIBasicHandler::emptyCredentialMap(const std::string& storage, const std::string& grid)
+{
+ if (storage == DEFAULT_CREDENTIAL_STORAGE)
+ {
+ LL_ERRS() << "Storing maps in default, single-items storage is not allowed" << LL_ENDL;
+ }
+
+ LLSD credential = getProtectedData(storage, grid);
+
+ return !credential.isMap() || credential.size() == 0;
+}
+
// Load map of credentials from specified credential store, given the grid
void LLSecAPIBasicHandler::loadCredentialMap(const std::string& storage, const std::string& grid, credential_map_t& credential_map)
{
diff --git a/indra/newview/llsechandler_basic.h b/indra/newview/llsechandler_basic.h
index 426b5d392a..0bc7f5230f 100644
--- a/indra/newview/llsechandler_basic.h
+++ b/indra/newview/llsechandler_basic.h
@@ -293,6 +293,10 @@ public:
virtual bool hasCredentialMap(const std::string& storage,
const std::string& grid);
+ // returns true if map is empty or does not exist
+ virtual bool emptyCredentialMap(const std::string& storage,
+ const std::string& grid);
+
// load map of credentials from specific storage
virtual void loadCredentialMap(const std::string& storage,
const std::string& grid,
diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp
index f849fecaf6..aee6bcb05e 100644
--- a/indra/newview/llselectmgr.cpp
+++ b/indra/newview/llselectmgr.cpp
@@ -5426,7 +5426,7 @@ void LLSelectMgr::processObjectProperties(LLMessageSystem* msg, void** user_data
}
else
{
- if (node->mInventorySerial != inv_serial)
+ if (node->mInventorySerial != inv_serial && node->getObject())
{
node->getObject()->dirtyInventory();
}
diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp
index 08012686f9..684d3bd421 100644
--- a/indra/newview/llstartup.cpp
+++ b/indra/newview/llstartup.cpp
@@ -2715,6 +2715,15 @@ std::string& LLStartUp::getInitialOutfitName()
return sInitialOutfit;
}
+std::string LLStartUp::getUserId()
+{
+ if (gUserCredential.isNull())
+ {
+ return "";
+ }
+ return gUserCredential->userID();
+}
+
// Loads a bitmap to display during load
void init_start_screen(S32 location_id)
{
diff --git a/indra/newview/llstartup.h b/indra/newview/llstartup.h
index db37207022..5ce74b8fae 100644
--- a/indra/newview/llstartup.h
+++ b/indra/newview/llstartup.h
@@ -115,6 +115,7 @@ public:
static void saveInitialOutfit();
static std::string& getInitialOutfitName();
+ static std::string getUserId();
static bool dispatchURL();
// if we have a SLURL or sim string ("Ahern/123/45") that started
diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp
index 05230c17e0..fe3e4cdd61 100644
--- a/indra/newview/llviewerobject.cpp
+++ b/indra/newview/llviewerobject.cpp
@@ -2987,6 +2987,7 @@ void LLViewerObject::fetchInventoryFromServer()
if (!isInventoryPending())
{
delete mInventory;
+ mInventory = NULL;
// Results in processTaskInv
LLMessageSystem* msg = gMessageSystem;
diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp
index af4d1a28b5..8f6733886a 100644
--- a/indra/newview/llvoavatar.cpp
+++ b/indra/newview/llvoavatar.cpp
@@ -197,6 +197,8 @@ const F32 NAMETAG_VERT_OFFSET_WEIGHT = 0.17f;
const U32 LLVOAvatar::VISUAL_COMPLEXITY_UNKNOWN = 0;
const F64 HUD_OVERSIZED_TEXTURE_DATA_SIZE = 1024 * 1024;
+const F32 MAX_TEXTURE_WAIT_TIME_SEC = 60;
+
enum ERenderName
{
RENDER_NAME_NEVER,
@@ -663,6 +665,7 @@ LLVOAvatar::LLVOAvatar(const LLUUID& id,
mFullyLoadedInitialized(FALSE),
mVisualComplexity(VISUAL_COMPLEXITY_UNKNOWN),
mLoadedCallbacksPaused(FALSE),
+ mLoadedCallbackTextures(0),
mRenderUnloadedAvatar(LLCachedControl<bool>(gSavedSettings, "RenderUnloadedAvatar", false)),
mLastRezzedStatus(-1),
mIsEditingAppearance(FALSE),
@@ -5336,6 +5339,7 @@ void LLVOAvatar::checkTextureLoading()
if(mCallbackTextureList.empty()) //when is self or no callbacks. Note: this list for self is always empty.
{
mLoadedCallbacksPaused = pause ;
+ mLoadedCallbackTextures = 0;
return ; //nothing to check.
}
@@ -5343,7 +5347,9 @@ void LLVOAvatar::checkTextureLoading()
{
return ; //have not been invisible for enough time.
}
-
+
+ mLoadedCallbackTextures = pause ? mCallbackTextureList.size() : 0;
+
for(LLLoadedCallbackEntry::source_callback_list_t::iterator iter = mCallbackTextureList.begin();
iter != mCallbackTextureList.end(); ++iter)
{
@@ -5364,9 +5370,14 @@ void LLVOAvatar::checkTextureLoading()
tex->unpauseLoadedCallbacks(&mCallbackTextureList) ;
tex->addTextureStats(START_AREA); //jump start the fetching again
+
+ if (tex->isFullyLoaded())
+ {
+ mLoadedCallbackTextures++; // consider it loaded
+ }
}
- }
- }
+ }
+ }
if(!pause)
{
@@ -7808,9 +7819,17 @@ BOOL LLVOAvatar::updateIsFullyLoaded()
{
S32 rez_status = getRezzedStatus();
bool loading = getIsCloud();
- if (mFirstFullyVisible && !mIsControlAvatar && rez_status < 3)
- {
- loading = ((rez_status < 2) || !isFullyBaked());
+ if (mFirstFullyVisible && !mIsControlAvatar)
+ {
+ loading = ((rez_status < 2)
+ // Wait at least 60s for unfinished textures to finish on first load,
+ // don't wait forever, it might fail. Even if it will eventually load by
+ // itself and update mLoadedCallbackTextures (or fail and clean the list),
+ // avatars are more time-sensitive than textures and can't wait that long.
+ || (mLoadedCallbackTextures < mCallbackTextureList.size() && mLastTexCallbackAddedTime.getElapsedTimeF32() < MAX_TEXTURE_WAIT_TIME_SEC)
+ || !mPendingAttachment.empty()
+ || (rez_status < 3 && !isFullyBaked())
+ );
}
updateRezzedStatusTimers(rez_status);
updateRuthTimer(loading);
@@ -8194,6 +8213,14 @@ void LLVOAvatar::updateMeshTextures()
}
baked_img->setLoadedCallback(onBakedTextureLoaded, SWITCH_TO_BAKED_DISCARD, FALSE, FALSE, new LLUUID( mID ),
src_callback_list, paused );
+ if (!baked_img->isFullyLoaded() && !paused)
+ {
+ mLastTexCallbackAddedTime.reset();
+ }
+ else
+ {
+ mLoadedCallbackTextures++; // consider it loaded
+ }
// this could add paused texture callbacks
mLoadedCallbacksPaused |= paused;
@@ -8587,7 +8614,14 @@ void LLVOAvatar::onFirstTEMessageReceived()
LL_DEBUGS("Avatar") << avString() << "layer_baked, setting onInitialBakedTextureLoaded as callback" << LL_ENDL;
image->setLoadedCallback( onInitialBakedTextureLoaded, MAX_DISCARD_LEVEL, FALSE, FALSE, new LLUUID( mID ),
src_callback_list, paused );
-
+ if (!image->isFullyLoaded() && !paused)
+ {
+ mLastTexCallbackAddedTime.reset();
+ }
+ else
+ {
+ mLoadedCallbackTextures++; // consider it loaded
+ }
// this could add paused texture callbacks
mLoadedCallbacksPaused |= paused;
}
@@ -10360,7 +10394,7 @@ void LLVOAvatar::calculateUpdateRenderComplexity()
// Diagnostic list of all textures on our avatar
static std::set<LLUUID> all_textures;
- if (mVisualComplexityStale)
+ if (mVisualComplexityStale)
{
U32 cost = VISUAL_COMPLEXITY_UNKNOWN;
LLVOVolume::texture_cost_t textures;
diff --git a/indra/newview/llvoavatar.h b/indra/newview/llvoavatar.h
index e352a6c1fa..3526142ff5 100644
--- a/indra/newview/llvoavatar.h
+++ b/indra/newview/llvoavatar.h
@@ -629,6 +629,8 @@ protected:
LLLoadedCallbackEntry::source_callback_list_t mCallbackTextureList ;
BOOL mLoadedCallbacksPaused;
+ S32 mLoadedCallbackTextures; // count of fully loaded textures filled from mCallbackTextureList
+ LLFrameTimer mLastTexCallbackAddedTime;
std::set<LLUUID> mTextureIDs;
//--------------------------------------------------------------------
// Local Textures
diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp
index e28272e10b..bec33790bd 100644
--- a/indra/newview/pipeline.cpp
+++ b/indra/newview/pipeline.cpp
@@ -8685,10 +8685,24 @@ void LLPipeline::renderDeferredLighting()
}
const LLViewerObject *vobj = drawablep->getVObj();
- if((vobj && vobj->getAvatar() && (vobj->getAvatar()->isTooComplex() || vobj->getAvatar()->isInMuteList()))
- || (vobj && dist_vec(vobj->getPosition(), LLViewerCamera::getInstance()->getOrigin()) > RenderFarClip))
+ if (vobj)
{
- continue;
+ LLVOAvatar *av = vobj->getAvatar();
+ if (av)
+ {
+ if (av->isTooComplex() || av->isInMuteList() || dist_vec(av->getPosition(), LLViewerCamera::getInstance()->getOrigin()) > RenderFarClip)
+ {
+ continue;
+ }
+ }
+ else
+ {
+ const LLViewerObject *root_obj = drawablep->getParent() ? drawablep->getParent()->getVObj() : vobj;
+ if (root_obj && dist_vec(root_obj->getPosition(), LLViewerCamera::getInstance()->getOrigin()) > RenderFarClip)
+ {
+ continue;
+ }
+ }
}
LLVector4a center;
diff --git a/indra/newview/skins/default/xui/de/floater_merchant_outbox.xml b/indra/newview/skins/default/xui/de/floater_merchant_outbox.xml
deleted file mode 100644
index 4070dee84c..0000000000
--- a/indra/newview/skins/default/xui/de/floater_merchant_outbox.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_merchant_outbox" title="HÄNDLER-OUTBOX">
- <string name="OutboxFolderCount1">
- 1 Ordner
- </string>
- <string name="OutboxFolderCountN">
- [NUM] Ordner
- </string>
- <string name="OutboxImporting">
- Ordner übertragen...
- </string>
- <string name="OutboxInitializing">
- Initialisieren...
- </string>
- <panel label="" name="panel_1">
- <panel name="panel_2">
- <panel name="outbox_inventory_placeholder_panel">
- <text name="outbox_inventory_placeholder_title">
- Laden...
- </text>
- </panel>
- </panel>
- <panel name="panel_3">
- <panel name="outbox_generic_drag_target">
- <text name="text_1">
- Artikel hierher ziehen, um Ordner zu erstellen
- </text>
- </panel>
- <button label="In Marktplatz übertragen" name="outbox_import_btn" tool_tip="In meinen Marktplatz-Laden verschieben"/>
- </panel>
- </panel>
-</floater>
diff --git a/indra/newview/skins/default/xui/de/panel_outbox_inventory.xml b/indra/newview/skins/default/xui/de/panel_outbox_inventory.xml
deleted file mode 100644
index 4006022ffc..0000000000
--- a/indra/newview/skins/default/xui/de/panel_outbox_inventory.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<outbox_inventory_panel name="inventory_outbox" tool_tip="Legen Sie Artikel hier ab, um sie zum Verkauf in Ihrem Laden vorzubereiten"/>
diff --git a/indra/newview/skins/default/xui/en/floater_forget_user.xml b/indra/newview/skins/default/xui/en/floater_forget_user.xml
index 86228d49ee..a9ec1b74a3 100644
--- a/indra/newview/skins/default/xui/en/floater_forget_user.xml
+++ b/indra/newview/skins/default/xui/en/floater_forget_user.xml
@@ -35,5 +35,5 @@
name="delete_data"
top_pad="5"
width="260"
- tool_tip="Deletes local files: chat history, last session screenshot, browser cookies, teleport history, toolbar settings, e t c"/>
+ tool_tip="Deletes local files: chat history, last session screenshot, browser cookies, teleport history, toolbar settings, e t c. Some of local files are shared between grids."/>
</floater>
diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml
index 1c72aec700..e3776cdc1a 100644
--- a/indra/newview/skins/default/xui/en/notifications.xml
+++ b/indra/newview/skins/default/xui/en/notifications.xml
@@ -3552,6 +3552,26 @@ If this is your first time using [SECOND_LIFE], you will need to create an accou
<notification
icon="alertmodal.tga"
+ name="LoginCantRemoveUsername"
+ type="alertmodal">
+ <tag>fail</tag>
+Already remembered user can be forgotten from Me &gt; Preferences &gt; Advanced &gt; Remembered Usernames.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="LoginCantRemoveCurUsername"
+ type="alertmodal">
+ <tag>confirm</tag>
+Forgetting the logged-in user requires you to log out.
+ <usetemplate
+ name="okcancelbuttons"
+ notext="Cancel"
+ yestext="Confirm and log out"/>
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
name="LoginPacketNeverReceived"
type="alertmodal">
<tag>fail</tag>
@@ -3605,6 +3625,18 @@ You can either check your Internet connection and try again in a few minutes or
<notification
icon="alertmodal.tga"
+ name="LoginRemoveMultiGridUserData"
+ type="alertmodal">
+ <tag>confirm</tag>
+Local Data you are deleting is shared between multiple grids, are you sure you want to delete it?
+ <usetemplate
+ name="okcancelbuttons"
+ notext="Cancel"
+ yestext="Confirm"/>
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
name="WelcomeChooseSex"
type="alertmodal">
Your character will appear in a moment.
@@ -6062,7 +6094,7 @@ Would you like to turn off Do Not Disturb before completing this transaction?
name="ParcelPlayingMedia"
persist="false"
type="notify">
-This land has media:
+This location plays media:
[URL]
Would you like to play it?
<tag>confirm</tag>
@@ -6080,7 +6112,7 @@ Would you like to play it?
ignore="Ignore Media"
index="0"
name="No"
- text="Ignore"/>
+ text="Don't play"/>
</form>
</notification>
diff --git a/indra/newview/skins/default/xui/en/panel_login.xml b/indra/newview/skins/default/xui/en/panel_login.xml
index 766406e1d8..ade004f9d0 100644
--- a/indra/newview/skins/default/xui/en/panel_login.xml
+++ b/indra/newview/skins/default/xui/en/panel_login.xml
@@ -33,7 +33,7 @@
auto_resize="false"
follows="left|right|top"
name="ui_container"
- width="1000"
+ width="1011"
left="0"
top="0"
height="172">
@@ -135,10 +135,11 @@
bottom_delta="21"
height="24"
label="Remember me"
+ word_wrap="down"
check_button.bottom="3"
name="remember_name"
tool_tip="Already remembered user can be forgotten from Me &gt; Preferences &gt; Advanced &gt; Remembered Usernames."
- width="145" />
+ width="198" />
<check_box
control_name="RememberPassword"
follows="left|top"
@@ -148,9 +149,10 @@
left="408"
bottom_delta="0"
label="Remember password"
+ word_wrap="down"
check_button.bottom="3"
- name="remember_check"
- width="145" />
+ name="remember_password"
+ width="165" />
<combo_box
allow_text_entry="false"
font="SansSerifTiny"
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_sound.xml b/indra/newview/skins/default/xui/en/panel_preferences_sound.xml
index 90f2ca2713..c2defdd772 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_sound.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_sound.xml
@@ -344,11 +344,11 @@
name="media_auto_play_combo"
width="100">
<item
- label="Disabled"
+ label="No"
name="autoplay_disabled"
value="0"/>
<item
- label="Enabled"
+ label="Yes"
name="autoplay_enabled"
value="1"/>
<item
diff --git a/indra/newview/skins/default/xui/es/floater_merchant_outbox.xml b/indra/newview/skins/default/xui/es/floater_merchant_outbox.xml
deleted file mode 100644
index b74c5fca5c..0000000000
--- a/indra/newview/skins/default/xui/es/floater_merchant_outbox.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_merchant_outbox" title="BUZÓN DE SALIDA DE COMERCIANTE">
- <string name="OutboxFolderCount1">
- 1 carpeta
- </string>
- <string name="OutboxFolderCountN">
- [NUM] carpetas
- </string>
- <string name="OutboxImporting">
- Enviando carpetas...
- </string>
- <string name="OutboxInitializing">
- Inicializando...
- </string>
- <panel label="" name="panel_1">
- <panel name="panel_2">
- <panel name="outbox_inventory_placeholder_panel">
- <text name="outbox_inventory_placeholder_title">
- Cargando...
- </text>
- </panel>
- </panel>
- <panel name="panel_3">
- <panel name="outbox_generic_drag_target">
- <text name="text_1">
- Arrastra aquí artículos para crear carpetas
- </text>
- </panel>
- <button label="Enviar al Mercado" name="outbox_import_btn" tool_tip="Poner en el escaparate de Mi Mercado"/>
- </panel>
- </panel>
-</floater>
diff --git a/indra/newview/skins/default/xui/es/panel_outbox_inventory.xml b/indra/newview/skins/default/xui/es/panel_outbox_inventory.xml
deleted file mode 100644
index 9e2f3c3adc..0000000000
--- a/indra/newview/skins/default/xui/es/panel_outbox_inventory.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<outbox_inventory_panel name="inventory_outbox" tool_tip="Arrastra y coloca aquí los objetos que desees preparar para venderlos en tu tienda"/>
diff --git a/indra/newview/skins/default/xui/fr/floater_merchant_outbox.xml b/indra/newview/skins/default/xui/fr/floater_merchant_outbox.xml
deleted file mode 100644
index 0f657e9e5b..0000000000
--- a/indra/newview/skins/default/xui/fr/floater_merchant_outbox.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_merchant_outbox" title="BOÎTE D&apos;ENVOI VENDEUR">
- <string name="OutboxFolderCount1">
- 1 dossier
- </string>
- <string name="OutboxFolderCountN">
- [NUM] dossiers
- </string>
- <string name="OutboxImporting">
- Envoi de dossiers...
- </string>
- <string name="OutboxInitializing">
- Initialisation...
- </string>
- <panel label="" name="panel_1">
- <panel name="panel_2">
- <panel name="outbox_inventory_placeholder_panel">
- <text name="outbox_inventory_placeholder_title">
- Chargement...
- </text>
- </panel>
- </panel>
- <panel name="panel_3">
- <panel name="outbox_generic_drag_target">
- <text name="text_1">
- Faites glisser des éléments ici pour créer des dossiers
- </text>
- </panel>
- <button label="Envoyer vers la Place du marché" name="outbox_import_btn" tool_tip="Vers ma vitrine de la Place du marché"/>
- </panel>
- </panel>
-</floater>
diff --git a/indra/newview/skins/default/xui/fr/panel_outbox_inventory.xml b/indra/newview/skins/default/xui/fr/panel_outbox_inventory.xml
deleted file mode 100644
index d947dbceb8..0000000000
--- a/indra/newview/skins/default/xui/fr/panel_outbox_inventory.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<outbox_inventory_panel name="inventory_outbox" tool_tip="Glisser-déposer des articles ici afin de les préparer à la vente sur votre vitrine."/>
diff --git a/indra/newview/skins/default/xui/it/floater_about_land.xml b/indra/newview/skins/default/xui/it/floater_about_land.xml
index 50e2d1a8de..70909b1f7c 100644
--- a/indra/newview/skins/default/xui/it/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/it/floater_about_land.xml
@@ -371,7 +371,7 @@ Solamente terreni più grandi possono essere abilitati nella ricerca.
Gli avatar di altri lotti possono vedere gli avatar che si trovano in questo lotto e chattare con loro
</text>
<check_box label="Vedi avatar" top="170" name="SeeAvatarsCheck" tool_tip="Consente ad avatar in altri lotti di vedere e chattare con avatar in questo lotto e viceversa."/>
- <text name="landing_point">
+ <text name="landing_point" width="225">
Punto di atterraggio: [LANDING]
</text>
<button label="Imposta" label_selected="Imposta" name="Set" tool_tip="Imposta il punto di atterraggio dove arrivano i visitatori. Impostalo nel punto dove si trova il tuo avatar in questo terreno." width="60"/>
diff --git a/indra/newview/skins/default/xui/it/floater_merchant_outbox.xml b/indra/newview/skins/default/xui/it/floater_merchant_outbox.xml
deleted file mode 100644
index 7a1f7f0a0c..0000000000
--- a/indra/newview/skins/default/xui/it/floater_merchant_outbox.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_merchant_outbox" title="CASELLA IN USCITA DEL RIVENDITORE">
- <string name="OutboxFolderCount1">
- 1 cartella
- </string>
- <string name="OutboxFolderCountN">
- [NUM] cartelle
- </string>
- <string name="OutboxImporting">
- Invio cartelle...
- </string>
- <string name="OutboxInitializing">
- Inizializzazione...
- </string>
- <panel label="" name="panel_1">
- <panel name="panel_2">
- <panel name="outbox_inventory_placeholder_panel">
- <text name="outbox_inventory_placeholder_title">
- Caricamento in corso...
- </text>
- </panel>
- </panel>
- <panel name="panel_3">
- <panel name="outbox_generic_drag_target">
- <text name="text_1">
- Trascina elementi qui per creare cartelle
- </text>
- </panel>
- <button label="Invia a Marketplace" name="outbox_import_btn" tool_tip="Push su negozio Marketplace"/>
- </panel>
- </panel>
-</floater>
diff --git a/indra/newview/skins/default/xui/it/panel_outbox_inventory.xml b/indra/newview/skins/default/xui/it/panel_outbox_inventory.xml
deleted file mode 100644
index af5e05336e..0000000000
--- a/indra/newview/skins/default/xui/it/panel_outbox_inventory.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<outbox_inventory_panel name="inventory_outbox" tool_tip="Trascina gli oggetti qui per prepararli per la vendita nel tuo negozio"/>
diff --git a/indra/newview/skins/default/xui/ja/floater_merchant_outbox.xml b/indra/newview/skins/default/xui/ja/floater_merchant_outbox.xml
deleted file mode 100644
index 2edb3c624c..0000000000
--- a/indra/newview/skins/default/xui/ja/floater_merchant_outbox.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_merchant_outbox" title="マーチャントアウトボックス">
- <string name="OutboxFolderCount1">
- 1 個のフォルダ
- </string>
- <string name="OutboxFolderCountN">
- [NUM] 個のフォルダ
- </string>
- <string name="OutboxImporting">
- フォルダを送信中...
- </string>
- <string name="OutboxInitializing">
- 初期化中...
- </string>
- <panel label="" name="panel_1">
- <panel name="panel_2">
- <panel name="outbox_inventory_placeholder_panel">
- <text name="outbox_inventory_placeholder_title">
- ロード中...
- </text>
- </panel>
- </panel>
- <panel name="panel_3">
- <panel name="outbox_generic_drag_target">
- <text name="text_1">
- ここにアイテムをドラッグして、フォルダを作成する
- </text>
- </panel>
- <button label="マーケットプレイスに送信" name="outbox_import_btn" tool_tip="自分のマーケットプレイス店頭に移動"/>
- </panel>
- </panel>
-</floater>
diff --git a/indra/newview/skins/default/xui/ja/panel_outbox_inventory.xml b/indra/newview/skins/default/xui/ja/panel_outbox_inventory.xml
deleted file mode 100644
index 1a14283113..0000000000
--- a/indra/newview/skins/default/xui/ja/panel_outbox_inventory.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<outbox_inventory_panel name="inventory_outbox" tool_tip="アイテムをここにドラッグアンドドロップすると、あなたの店頭に並びます"/>
diff --git a/indra/newview/skins/default/xui/pl/floater_merchant_outbox.xml b/indra/newview/skins/default/xui/pl/floater_merchant_outbox.xml
deleted file mode 100644
index 9cc88ba288..0000000000
--- a/indra/newview/skins/default/xui/pl/floater_merchant_outbox.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<floater name="floater_merchant_outbox" title="SKRZYNKA NADAWCZA KUPCA">
- <string name="OutboxFolderCountN">
- Folderów: [NUM]
- </string>
- <string name="OutboxImporting">
- Wysyłanie folderów...
- </string>
- <string name="OutboxInitializing">
- Inicjalizacja...
- </string>
- <panel name="panel_1">
- <panel name="panel_2">
- <panel name="outbox_inventory_placeholder_panel">
- <text name="outbox_inventory_placeholder_title">
- Ładowanie...
- </text>
- </panel>
- </panel>
- <panel name="panel_3">
- <panel name="outbox_generic_drag_target">
- <text name="text_1">
- Przeciągaj tu przedmioty by tworzyć foldery
- </text>
- </panel>
- <button label="Wyślij na Marketplace" tool_tip="Wyślij na witrynę Marketplace" name="outbox_import_btn" />
- </panel>
- </panel>
-</floater>
diff --git a/indra/newview/skins/default/xui/pl/panel_outbox_inventory.xml b/indra/newview/skins/default/xui/pl/panel_outbox_inventory.xml
deleted file mode 100644
index 01d0455215..0000000000
--- a/indra/newview/skins/default/xui/pl/panel_outbox_inventory.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<inventory_panel name="inventory_outbox" tool_tip="Przeciągnij i upuść tutaj przedmioty, aby przygotować je do sprzedaży na Twojej witrynie Marketplace" />
diff --git a/indra/newview/skins/default/xui/pt/floater_about_land.xml b/indra/newview/skins/default/xui/pt/floater_about_land.xml
index 96e54bb9bc..0e7d0798c7 100644
--- a/indra/newview/skins/default/xui/pt/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/pt/floater_about_land.xml
@@ -366,7 +366,7 @@ Apenas lotes maiores podem ser listados na busca.
Avatares em outros lotes podem ver e conversar com avatares neste lote
</text>
<check_box label="Ver avatares" name="SeeAvatarsCheck" top="170" tool_tip="Permite que os avatares em outros lotes vejam e batam papo com avatares neste lote. Você poderá vê-los e conversar com eles."/>
- <text name="landing_point">
+ <text name="landing_point" width="225">
Ponto de Aterrissagem: [LANDING]
</text>
<button label="Definir" label_selected="Definir" name="Set" tool_tip="Define o ponto de aterrissagem de visitantes. Define para o ponto em que seu avatar se encontra neste lote."/>
diff --git a/indra/newview/skins/default/xui/pt/floater_merchant_outbox.xml b/indra/newview/skins/default/xui/pt/floater_merchant_outbox.xml
deleted file mode 100644
index 3beada1fc0..0000000000
--- a/indra/newview/skins/default/xui/pt/floater_merchant_outbox.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_merchant_outbox" title="CAIXA DE SAÍDA DO LOJISTA">
- <string name="OutboxFolderCount1">
- 1 pasta
- </string>
- <string name="OutboxFolderCountN">
- [NUM] pasta(s)
- </string>
- <string name="OutboxImporting">
- Enviando pastas...
- </string>
- <string name="OutboxInitializing">
- Iniciando...
- </string>
- <panel label="" name="panel_1">
- <panel name="panel_2">
- <panel name="outbox_inventory_placeholder_panel">
- <text name="outbox_inventory_placeholder_title">
- Carregando...
- </text>
- </panel>
- </panel>
- <panel name="panel_3">
- <panel name="outbox_generic_drag_target">
- <text name="text_1">
- Arraste itens para cá para criar pastas
- </text>
- </panel>
- <button label="Enviar para Mercado" name="outbox_import_btn" tool_tip="Enviar para a frente da minha loja do mercado"/>
- </panel>
- </panel>
-</floater>
diff --git a/indra/newview/skins/default/xui/pt/panel_outbox_inventory.xml b/indra/newview/skins/default/xui/pt/panel_outbox_inventory.xml
deleted file mode 100644
index 442622035a..0000000000
--- a/indra/newview/skins/default/xui/pt/panel_outbox_inventory.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<outbox_inventory_panel name="inventory_outbox" tool_tip="Arraste e solte os itens aqui para prepará-los para venda na frente da sua loja"/>
diff --git a/indra/newview/skins/default/xui/ru/floater_about_land.xml b/indra/newview/skins/default/xui/ru/floater_about_land.xml
index 222572b4bf..fb17896551 100644
--- a/indra/newview/skins/default/xui/ru/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/ru/floater_about_land.xml
@@ -364,7 +364,7 @@
Аватары с других участков могут видеть аватары на этом участке и общаться с ними
</text>
<check_box label="Видны аватары" left="262" name="SeeAvatarsCheck" tool_tip="Аватары с других участков смогут видеть аватары на этом участке и общаться с ними в чате, а вы также сможете видеть их и общаться с ними."/>
- <text name="landing_point">
+ <text name="landing_point" width="225">
В точку телепортации: [LANDING]
</text>
<button label="Задать" label_selected="Задать" name="Set" tool_tip="Установить точку телепортации, в которую будут прибывать посетители, Ставится в месте вашего аватара на этом участке."/>
diff --git a/indra/newview/skins/default/xui/ru/floater_merchant_outbox.xml b/indra/newview/skins/default/xui/ru/floater_merchant_outbox.xml
deleted file mode 100644
index 1d3ff3f5ed..0000000000
--- a/indra/newview/skins/default/xui/ru/floater_merchant_outbox.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_merchant_outbox" title="ТОРГОВЫЕ ИСХОДЯЩИЕ">
- <string name="OutboxFolderCount1">
- 1 папка
- </string>
- <string name="OutboxFolderCountN">
- [NUM] папки
- </string>
- <string name="OutboxImporting">
- Отправка папок....
- </string>
- <string name="OutboxInitializing">
- Инициализация...
- </string>
- <panel label="" name="panel_1">
- <panel name="panel_2">
- <panel name="outbox_inventory_placeholder_panel">
- <text name="outbox_inventory_placeholder_title">
- Загрузка...
- </text>
- </panel>
- </panel>
- <panel name="panel_3">
- <panel name="outbox_generic_drag_target">
- <text name="text_1">
- Перетаскивайте предметы для создания папок
- </text>
- </panel>
- <button label="Отправить в торговый центр" name="outbox_import_btn" tool_tip="Выставить на витрину моего магазина"/>
- </panel>
- </panel>
-</floater>
diff --git a/indra/newview/skins/default/xui/ru/panel_outbox_inventory.xml b/indra/newview/skins/default/xui/ru/panel_outbox_inventory.xml
deleted file mode 100644
index 0095d48af9..0000000000
--- a/indra/newview/skins/default/xui/ru/panel_outbox_inventory.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<outbox_inventory_panel name="inventory_outbox" tool_tip="Перетащите вещи сюда, чтобы подготовить их для размещения на витрине вашего магазина"/>
diff --git a/indra/newview/skins/default/xui/tr/floater_merchant_outbox.xml b/indra/newview/skins/default/xui/tr/floater_merchant_outbox.xml
deleted file mode 100644
index e5643f3bf6..0000000000
--- a/indra/newview/skins/default/xui/tr/floater_merchant_outbox.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_merchant_outbox" title="SATICI GİDEN KUTUSU">
- <string name="OutboxFolderCount1">
- 1 klasör
- </string>
- <string name="OutboxFolderCountN">
- [NUM] klasör
- </string>
- <string name="OutboxImporting">
- Klasörler gönderiliyor...
- </string>
- <string name="OutboxInitializing">
- Başlatılıyor...
- </string>
- <panel label="" name="panel_1">
- <panel name="panel_2">
- <panel name="outbox_inventory_placeholder_panel">
- <text name="outbox_inventory_placeholder_title">
- Yükleniyor...
- </text>
- </panel>
- </panel>
- <panel name="panel_3">
- <panel name="outbox_generic_drag_target">
- <text name="text_1">
- Klasör oluşturmak için öğeleri buraya sürükleyin
- </text>
- </panel>
- <button label="Pazaryerine Gönder" name="outbox_import_btn" tool_tip="Pazaryeri Vitrinime Gönder"/>
- </panel>
- </panel>
-</floater>
diff --git a/indra/newview/skins/default/xui/tr/panel_outbox_inventory.xml b/indra/newview/skins/default/xui/tr/panel_outbox_inventory.xml
deleted file mode 100644
index a947eee150..0000000000
--- a/indra/newview/skins/default/xui/tr/panel_outbox_inventory.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<outbox_inventory_panel name="inventory_outbox" tool_tip="Öğeleri vitrininizde satışa hazırlamak için sürükleyip buraya bırakın"/>
diff --git a/indra/newview/skins/default/xui/zh/floater_merchant_outbox.xml b/indra/newview/skins/default/xui/zh/floater_merchant_outbox.xml
deleted file mode 100644
index e6a70a7724..0000000000
--- a/indra/newview/skins/default/xui/zh/floater_merchant_outbox.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_merchant_outbox" title="商家發件匣">
- <string name="OutboxFolderCount1">
- 1 個資料夾
- </string>
- <string name="OutboxFolderCountN">
- [NUM] 個資料夾
- </string>
- <string name="OutboxImporting">
- 正在傳送資料夾…
- </string>
- <string name="OutboxInitializing">
- 正在初始化…
- </string>
- <panel label="" name="panel_1">
- <panel name="panel_2">
- <panel name="outbox_inventory_placeholder_panel">
- <text name="outbox_inventory_placeholder_title">
- 載入中…
- </text>
- </panel>
- </panel>
- <panel name="panel_3">
- <panel name="outbox_generic_drag_target">
- <text name="text_1">
- 把物項拖曳到這裡,可建立資料夾
- </text>
- </panel>
- <button label="送往第二人生購物市集" name="outbox_import_btn" tool_tip="推到我第二人生購物市集的店面"/>
- </panel>
- </panel>
-</floater>
diff --git a/indra/newview/skins/default/xui/zh/panel_outbox_inventory.xml b/indra/newview/skins/default/xui/zh/panel_outbox_inventory.xml
deleted file mode 100644
index 8de0bb0e4d..0000000000
--- a/indra/newview/skins/default/xui/zh/panel_outbox_inventory.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<outbox_inventory_panel name="inventory_outbox" tool_tip="將物項拖曳並置放到這裡,準備在你的商店出售"/>
diff --git a/indra/newview/tests/llsecapi_test.cpp b/indra/newview/tests/llsecapi_test.cpp
index a1005c654c..caa3016d2e 100644
--- a/indra/newview/tests/llsecapi_test.cpp
+++ b/indra/newview/tests/llsecapi_test.cpp
@@ -69,6 +69,7 @@ LLPointer<LLCredential> LLSecAPIBasicHandler::loadCredential(const std::string&
void LLSecAPIBasicHandler::saveCredential(LLPointer<LLCredential> cred, bool save_authenticator) {}
void LLSecAPIBasicHandler::deleteCredential(LLPointer<LLCredential> cred) {}
bool LLSecAPIBasicHandler::hasCredentialMap(const std::string& storage, const std::string& grid) { return false; }
+bool LLSecAPIBasicHandler::emptyCredentialMap(const std::string& storage, const std::string& grid) { return false; }
void LLSecAPIBasicHandler::loadCredentialMap(const std::string& storage, const std::string& grid, credential_map_t& credential_map) {}
LLPointer<LLCredential> LLSecAPIBasicHandler::loadFromCredentialMap(const std::string& storage, const std::string& grid, const std::string& userkey) { return NULL; }
void LLSecAPIBasicHandler::addToCredentialMap(const std::string& storage, LLPointer<LLCredential> cred, bool save_authenticator) {}