diff options
| author | Andrey Lihatskiy <alihatskiy@productengine.com> | 2020-01-28 21:42:31 +0200 | 
|---|---|---|
| committer | Andrey Lihatskiy <alihatskiy@productengine.com> | 2020-01-28 21:42:31 +0200 | 
| commit | b304adc02e518a0ba8c5feae642b656c53cbc44a (patch) | |
| tree | 9a3a84bce34fcaaaf74182bdb64c238e1f193e4e | |
| parent | f89c9e9b20a13acd8f6af76699259cab4c74d5db (diff) | |
| parent | 9a3f1f6a3c4506ae08c7af7f92f11da40d80ef00 (diff) | |
Merge branch 'master' into DRTVWR-499
51 files changed, 692 insertions, 495 deletions
| diff --git a/.clang-format b/.clang-format new file mode 100644 index 0000000000..0b19cae838 --- /dev/null +++ b/.clang-format @@ -0,0 +1,119 @@ +--- +Language:        Cpp +# BasedOnStyle:  Microsoft +AccessModifierOffset: -2 +AlignAfterOpenBracket: Align +AlignConsecutiveMacros: false +AlignConsecutiveAssignments: false +AlignConsecutiveDeclarations: false +AlignEscapedNewlines: Right +AlignOperands:   true +AlignTrailingComments: true +AllowAllArgumentsOnNextLine: true +AllowAllConstructorInitializersOnNextLine: true +AllowAllParametersOfDeclarationOnNextLine: true +AllowShortBlocksOnASingleLine: Always +AllowShortCaseLabelsOnASingleLine: false +AllowShortFunctionsOnASingleLine: All +AllowShortLambdasOnASingleLine: All +AllowShortIfStatementsOnASingleLine: Never +AllowShortLoopsOnASingleLine: false +AlwaysBreakAfterDefinitionReturnType: None +AlwaysBreakAfterReturnType: None +AlwaysBreakBeforeMultilineStrings: false +AlwaysBreakTemplateDeclarations: MultiLine +BinPackArguments: true +BinPackParameters: true +BreakBeforeBinaryOperators: None +BreakBeforeBraces: Allman +BreakBeforeInheritanceComma: false +BreakInheritanceList: BeforeColon +BreakBeforeTernaryOperators: true +BreakConstructorInitializersBeforeComma: false +BreakConstructorInitializers: BeforeColon +BreakAfterJavaFieldAnnotations: false +BreakStringLiterals: true +ColumnLimit:     120 +CommentPragmas:  '^ IWYU pragma:' +CompactNamespaces: false +ConstructorInitializerAllOnOneLineOrOnePerLine: false +ConstructorInitializerIndentWidth: 4 +ContinuationIndentWidth: 4 +Cpp11BracedListStyle: true +DeriveLineEnding: true +DerivePointerAlignment: false +DisableFormat:   false +ExperimentalAutoDetectBinPacking: false +FixNamespaceComments: true +ForEachMacros: +  - foreach +  - Q_FOREACH +  - BOOST_FOREACH +IncludeBlocks:   Preserve +IncludeCategories: +  - Regex:           '^"(llvm|llvm-c|clang|clang-c)/' +    Priority:        2 +    SortPriority:    0 +  - Regex:           '^(<|"(gtest|gmock|isl|json)/)' +    Priority:        3 +    SortPriority:    0 +  - Regex:           '.*' +    Priority:        1 +    SortPriority:    0 +IncludeIsMainRegex: '(Test)?$' +IncludeIsMainSourceRegex: '' +IndentCaseLabels: false +IndentGotoLabels: true +IndentPPDirectives: None +IndentWidth:     4 +IndentWrappedFunctionNames: false +JavaScriptQuotes: Leave +JavaScriptWrapImports: true +KeepEmptyLinesAtTheStartOfBlocks: true +MacroBlockBegin: '' +MacroBlockEnd:   '' +MaxEmptyLinesToKeep: 1 +NamespaceIndentation: None +ObjCBinPackProtocolList: Auto +ObjCBlockIndentWidth: 2 +ObjCSpaceAfterProperty: false +ObjCSpaceBeforeProtocolList: true +PenaltyBreakAssignment: 2 +PenaltyBreakBeforeFirstCallParameter: 19 +PenaltyBreakComment: 300 +PenaltyBreakFirstLessLess: 120 +PenaltyBreakString: 1000 +PenaltyBreakTemplateDeclaration: 10 +PenaltyExcessCharacter: 1000000 +PenaltyReturnTypeOnItsOwnLine: 1000 +PointerAlignment: Right +ReflowComments:  true +SortIncludes:    false +SortUsingDeclarations: true +SpaceAfterCStyleCast: true +SpaceAfterLogicalNot: false +SpaceAfterTemplateKeyword: true +SpaceBeforeAssignmentOperators: true +SpaceBeforeCpp11BracedList: false +SpaceBeforeCtorInitializerColon: true +SpaceBeforeInheritanceColon: true +SpaceBeforeParens: ControlStatements +SpaceBeforeRangeBasedForLoopColon: true +SpaceInEmptyBlock: false +SpaceInEmptyParentheses: false +SpacesBeforeTrailingComments: 1 +SpacesInAngles:  false +SpacesInContainerLiterals: true +SpacesInCStyleCastParentheses: false +SpacesInParentheses: false +SpacesInSquareBrackets: false +SpaceBeforeSquareBrackets: false +Standard:        Latest +StatementMacros: +  - Q_UNUSED +  - QT_REQUIRE_VERSION +TabWidth:        4 +UseCRLF:         false +UseTab:          Never +... + diff --git a/.hgignore b/.gitignore index 0d672e6ebc..27b629a578 100755 --- a/.hgignore +++ b/.gitignore @@ -1,45 +1,56 @@ -syntax: glob - -# WinMerge temp files +# By extension +*.DS_Store  *.bak -# Compiled python bytecode +*.diff +*.orig  *.pyc -# Emacs temp files +*.rej +*.swp  *~ -.*.swp -#OSX image cache file -*.DS_Store -#*.orig + +# Specific paths and/or names  LICENSES -indra/.distcc -build-linux-*  build-darwin-* -build-vc80/ -build-vc100/ -build-vc120/ -build-vc120-32/ -build-vc120-64/ -indra/build-vc[0-9]* +build-linux-* +build-stamp +build-vc120* +build-vc150* +configure-stamp +debian/files +debian/secondlife-appearance-utility* +debian/secondlife-viewer* +indra/.distcc  indra/CMakeFiles +indra/build-vc[0-9]*  indra/lib/mono/1.0/*.dll  indra/lib/mono/indra/*.dll  indra/lib/mono/indra/*.exe  indra/lib/mono/indra/*.pdb  indra/lib/python/eventlet/ +indra/lib/python/mulib.*  indra/llwindow/glh/glh_linear.h  indra/newview/app_settings/dictionaries  indra/newview/app_settings/mozilla  indra/newview/app_settings/mozilla-runtime-*  indra/newview/app_settings/mozilla_debug  indra/newview/app_settings/static_*.db2 +indra/newview/avatar_icons_cache.txt +indra/newview/avatar_lad.log  indra/newview/browser_profile  indra/newview/character +indra/newview/dbghelp.dll +indra/newview/filters.xml  indra/newview/fmod.dll  indra/newview/fmod.log  indra/newview/mozilla-theme  indra/newview/mozilla-universal-darwin.tgz -indra/newview/res/ll_icon.* +indra/newview/pilot.txt +indra/newview/pilot.xml  indra/newview/res-sdl/ll_icon.* +indra/newview/res/ll_icon.* +indra/newview/search_history.txt +indra/newview/teleport_history.txt +indra/newview/typed_locations.txt  indra/newview/vivox-runtime  indra/server-linux-*  indra/temp @@ -47,36 +58,15 @@ indra/test/linden_file.dat  indra/test_apps/llmediatest/dependencies/i686-win32  indra/test_apps/terrain_mule/*.dll  indra/viewer-linux-* +indra/web/dataservice/lib/shared/vault.* +indra/web/dataservice/locale.* +indra/web/dataservice/vendor.*  indra/web/doc/asset-upload/plugins/lsl_compiler/lslc  indra/web/doc/asset-upload/plugins/verify-notecard  indra/web/doc/asset-upload/plugins/verify-texture  installed.xml  libraries  tarfile_tmp -debian/secondlife-viewer* -debian/secondlife-appearance-utility* -debian/files -build-stamp -configure-stamp -^indra/lib/python/mulib.* -^web/locale.* -^web/secondlife.com.* -^web/config.* -^indra/web/dataservice/locale.* -^indra/web/dataservice/lib/shared/vault.* -^indra/web/dataservice/vendor.* -glob:indra/newview/dbghelp.dll -glob:*.cpp.orig -glob:*.cpp.bak -glob:*.h.bak -glob:*.h.orig -glob:indra/newview/typed_locations.txt -glob:indra/newview/teleport_history.txt -glob:indra/newview/search_history.txt -glob:indra/newview/filters.xml -glob:indra/newview/avatar_icons_cache.txt -glob:indra/newview/avatar_lad.log -glob:*.diff -indra/newview/pilot.txt -indra/newview/pilot.xml -*.rej +web/config.* +web/locale.* +web/secondlife.com.*
\ No newline at end of file @@ -556,3 +556,4 @@ ece699718f163921717bb95a6131e94af4c4138f 6.3.1-release  07f5d5bc9faebb45695853d40a9549773db816c0 6.3.2-release  d9a4bd15e2c852953d6c8e84d6f3b7ca442c0e7f 6.3.3-release  4033b3f57e76f087235145a3016886ccdc87ffa3 6.3.4-release +27ca5834bfe9b80e82db5ea42f08b7eb990b722a 6.3.5-release diff --git a/autobuild.xml b/autobuild.xml index b182b7ae5d..1f1db48bdc 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -3427,7 +3427,7 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>      <key>package_description</key>      <map>        <key>canonical_repo</key> -      <string>https://bitbucket.org/lindenlab/viewer-release</string> +      <string>https://bitbucket.org/lindenlab/viewer</string>        <key>copyright</key>        <string>Copyright (c) 2014, Linden Research, Inc.</string>        <key>description</key> @@ -259,6 +259,23 @@ then      export additional_packages=  fi +begin_section "select viewer channel" +# Look for a branch-specific viewer_channel setting +#    changeset_branch is set in the sling-buildscripts +viewer_build_branch=$(echo -n "${changeset_branch:-$(repo_branch ${BUILDSCRIPTS_SRC:-$(pwd)})}" | tr -Cs 'A-Za-z0-9_' '_' | sed -E 's/^_+//; s/_+$//') +if [ -n "$viewer_build_branch" ]  +then +    branch_viewer_channel_var="${viewer_build_branch}_viewer_channel" +    if [ -n "${!branch_viewer_channel_var}" ] +    then +        viewer_channel="${!branch_viewer_channel_var}" +        record_event "Overriding viewer_channel for branch '$changeset_branch' to '$viewer_channel'" +    else +        record_event "No branch-specific viewer_channel for branch '$viewer_build_branch'; to set a branch build channel set '$branch_viewer_channel_var'" +    fi +fi +end_section "select viewer channel" +  python_cmd "$helpers/codeticket.py" addinput "Viewer Channel" "${viewer_channel}"  initialize_version # provided by buildscripts build.sh; sets version id 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 bbb726ddb0..b232a8c3bb 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -671,7 +671,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. @@ -1949,7 +1950,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,""), "*.*"); @@ -1990,6 +1991,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(); @@ -4461,7 +4470,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/llpanellogin.cpp b/indra/newview/llpanellogin.cpp index 4fd39d1211..7ef3685cdb 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,15 @@ 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); +		} // 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 +1239,8 @@ void LLPanelLogin::populateUserList(LLPointer<LLCredential> credential)      LLComboBox* user_combo = getChild<LLComboBox>("username_combo");      user_combo->removeall();      user_combo->clear(); +    mUsernameLength = 0; +    mPasswordLength = 0;      if (gSecAPIHandler->hasCredentialMap("login_list", LLGridManager::getInstance()->getGrid()))      { @@ -1220,6 +1263,8 @@ void LLPanelLogin::populateUserList(LLPointer<LLCredential> credential)          {              // selection failed, just deselect whatever might be selected              user_combo->setValue(std::string()); +            getChild<LLUICtrl>("password_edit")->setValue(std::string()); +            updateLoginButtons();          }          else          { @@ -1236,6 +1281,14 @@ void LLPanelLogin::populateUserList(LLPointer<LLCredential> credential)                  user_combo->add(LLPanelLogin::getUserName(credential), credential->userID(), ADD_BOTTOM, TRUE);                  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/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 > Preferences > Advanced > 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 > Preferences > Advanced > 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'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) {} | 
