diff options
35 files changed, 495 insertions, 311 deletions
| @@ -458,7 +458,6 @@ a314f1c94374ab1f6633dd2983f7090a68663eb2 3.5.2-beta4  9b1b6f33aa5394b27bb652b31b5cb81ef6060370 3.5.2-release  a277b841729f2a62ba1e34acacc964bc13c1ad6f 3.5.3-release  fb1630153bac5552046ea914af3f14deabc1def8 3.6.0-materials-beta1 -69429d81ae4dd321eda2607901ef0a0fde71b54c 3.6.0-release -69429d81ae4dd321eda2607901ef0a0fde71b54c 3.6.0-release  0a56f33ad6aa112032b14a41dad759ad377bdde9 3.6.0-release +83357f31d8dbf048a8bfdc323f363bf4d588aca1 CHOP-951-a  75cf8e855ae1af6895a35da475314c2b5acf1850 3.6.1-release diff --git a/indra/llvfs/lldir.h b/indra/llvfs/lldir.h index cc10ed5bbd..e02bf552aa 100755 --- a/indra/llvfs/lldir.h +++ b/indra/llvfs/lldir.h @@ -32,7 +32,7 @@  #define MAX_PATH MAXPATHLEN  #endif -// these numbers *may* get serialized (really??), so we need to be explicit +// these numbers are read from settings_files.xml, so we need to be explicit  typedef enum ELLPath  {  	LL_PATH_NONE = 0, diff --git a/indra/llxml/llcontrol.cpp b/indra/llxml/llcontrol.cpp index 666c03e9ff..6e11a5f6f3 100755 --- a/indra/llxml/llcontrol.cpp +++ b/indra/llxml/llcontrol.cpp @@ -136,10 +136,10 @@ LLControlVariable::LLControlVariable(const std::string& name, eControlType type,  	: mName(name),  	  mComment(comment),  	  mType(type), -	  mPersist(persist), +	  mPersist(persist? PERSIST_YES : PERSIST_NO),  	  mHideFromSettingsEditor(hidefromsettingseditor)  { -	if (mPersist && mComment.empty()) +	if (persist && mComment.empty())  	{  		llerrs << "Must supply a comment for control " << mName << llendl;  	} @@ -262,7 +262,12 @@ void LLControlVariable::setDefaultValue(const LLSD& value)  void LLControlVariable::setPersist(bool state)  { -	mPersist = state; +	mPersist = state? PERSIST_YES : PERSIST_NO; +} + +void LLControlVariable::forcePersist() +{ +	mPersist = PERSIST_ALWAYS;  }  void LLControlVariable::setHiddenFromSettingsEditor(bool hide) @@ -292,10 +297,29 @@ void LLControlVariable::resetToDefault(bool fire_signal)  	}  } -bool LLControlVariable::isSaveValueDefault() -{  -    return (mValues.size() ==  1)  -        || ((mValues.size() > 1) && llsd_compare(mValues[1], mValues[0])); +bool LLControlVariable::shouldSave(bool nondefault_only) +{ +	// This method is used to decide whether we should save a given +	// variable. Two of the three values of mPersist are easy. +	if (mPersist == PERSIST_NO) +		return false; + +	if (mPersist == PERSIST_ALWAYS) +		return true; + +	// PERSIST_YES +	// If caller doesn't need us to filter, just save. +	if (! nondefault_only) +		return true; + +	// PERSIST_YES, but caller only wants us to save this variable if its +	// value differs from default. +	if (isDefault())                // never been altered +		return false; + +	// We've set at least one other value: compare it to default. Save only if +	// they differ. +	return ! llsd_compare(getSaveValue(), getDefault());  }  LLSD LLControlVariable::getSaveValue() const @@ -355,7 +379,7 @@ std::string LLControlGroup::typeEnumToString(eControlType typeenum)  	return mTypeString[typeenum];  } -BOOL LLControlGroup::declareControl(const std::string& name, eControlType type, const LLSD initial_val, const std::string& comment, BOOL persist, BOOL hidefromsettingseditor) +LLControlVariable* LLControlGroup::declareControl(const std::string& name, eControlType type, const LLSD initial_val, const std::string& comment, BOOL persist, BOOL hidefromsettingseditor)  {  	LLControlVariable* existing_control = getControl(name);  	if (existing_control) @@ -374,66 +398,66 @@ BOOL LLControlGroup::declareControl(const std::string& name, eControlType type,  		{  			llwarns << "Control named " << name << " already exists, ignoring new declaration." << llendl;  		} - 		return TRUE; + 		return existing_control;  	}  	// if not, create the control and add it to the name table  	LLControlVariable* control = new LLControlVariable(name, type, initial_val, comment, persist, hidefromsettingseditor);  	mNameTable[name] = control;	 -	return TRUE; +	return control;  } -BOOL LLControlGroup::declareU32(const std::string& name, const U32 initial_val, const std::string& comment, BOOL persist) +LLControlVariable* LLControlGroup::declareU32(const std::string& name, const U32 initial_val, const std::string& comment, BOOL persist)  {  	return declareControl(name, TYPE_U32, (LLSD::Integer) initial_val, comment, persist);  } -BOOL LLControlGroup::declareS32(const std::string& name, const S32 initial_val, const std::string& comment, BOOL persist) +LLControlVariable* LLControlGroup::declareS32(const std::string& name, const S32 initial_val, const std::string& comment, BOOL persist)  {  	return declareControl(name, TYPE_S32, initial_val, comment, persist);  } -BOOL LLControlGroup::declareF32(const std::string& name, const F32 initial_val, const std::string& comment, BOOL persist) +LLControlVariable* LLControlGroup::declareF32(const std::string& name, const F32 initial_val, const std::string& comment, BOOL persist)  {  	return declareControl(name, TYPE_F32, initial_val, comment, persist);  } -BOOL LLControlGroup::declareBOOL(const std::string& name, const BOOL initial_val, const std::string& comment, BOOL persist) +LLControlVariable* LLControlGroup::declareBOOL(const std::string& name, const BOOL initial_val, const std::string& comment, BOOL persist)  {  	return declareControl(name, TYPE_BOOLEAN, initial_val, comment, persist);  } -BOOL LLControlGroup::declareString(const std::string& name, const std::string& initial_val, const std::string& comment, BOOL persist) +LLControlVariable* LLControlGroup::declareString(const std::string& name, const std::string& initial_val, const std::string& comment, BOOL persist)  {  	return declareControl(name, TYPE_STRING, initial_val, comment, persist);  } -BOOL LLControlGroup::declareVec3(const std::string& name, const LLVector3 &initial_val, const std::string& comment, BOOL persist) +LLControlVariable* LLControlGroup::declareVec3(const std::string& name, const LLVector3 &initial_val, const std::string& comment, BOOL persist)  {  	return declareControl(name, TYPE_VEC3, initial_val.getValue(), comment, persist);  } -BOOL LLControlGroup::declareVec3d(const std::string& name, const LLVector3d &initial_val, const std::string& comment, BOOL persist) +LLControlVariable* LLControlGroup::declareVec3d(const std::string& name, const LLVector3d &initial_val, const std::string& comment, BOOL persist)  {  	return declareControl(name, TYPE_VEC3D, initial_val.getValue(), comment, persist);  } -BOOL LLControlGroup::declareRect(const std::string& name, const LLRect &initial_val, const std::string& comment, BOOL persist) +LLControlVariable* LLControlGroup::declareRect(const std::string& name, const LLRect &initial_val, const std::string& comment, BOOL persist)  {  	return declareControl(name, TYPE_RECT, initial_val.getValue(), comment, persist);  } -BOOL LLControlGroup::declareColor4(const std::string& name, const LLColor4 &initial_val, const std::string& comment, BOOL persist ) +LLControlVariable* LLControlGroup::declareColor4(const std::string& name, const LLColor4 &initial_val, const std::string& comment, BOOL persist )  {  	return declareControl(name, TYPE_COL4, initial_val.getValue(), comment, persist);  } -BOOL LLControlGroup::declareColor3(const std::string& name, const LLColor3 &initial_val, const std::string& comment, BOOL persist ) +LLControlVariable* LLControlGroup::declareColor3(const std::string& name, const LLColor3 &initial_val, const std::string& comment, BOOL persist )  {  	return declareControl(name, TYPE_COL3, initial_val.getValue(), comment, persist);  } -BOOL LLControlGroup::declareLLSD(const std::string& name, const LLSD &initial_val, const std::string& comment, BOOL persist ) +LLControlVariable* LLControlGroup::declareLLSD(const std::string& name, const LLSD &initial_val, const std::string& comment, BOOL persist )  {  	return declareControl(name, TYPE_LLSD, initial_val, comment, persist);  } @@ -805,21 +829,12 @@ U32 LLControlGroup::saveToFile(const std::string& filename, BOOL nondefault_only  		{  			llwarns << "Tried to save invalid control: " << iter->first << llendl;  		} - -		if( control && control->isPersisted() ) +		else if( control->shouldSave(nondefault_only) )  		{ -			if (!(nondefault_only && (control->isSaveValueDefault()))) -			{ -				settings[iter->first]["Type"] = typeEnumToString(control->type()); -				settings[iter->first]["Comment"] = control->getComment(); -				settings[iter->first]["Value"] = control->getSaveValue(); -				++num_saved; -			} -			else -			{ -				// Debug spam -				// llinfos << "Skipping " << control->getName() << llendl; -			} +			settings[iter->first]["Type"] = typeEnumToString(control->type()); +			settings[iter->first]["Comment"] = control->getComment(); +			settings[iter->first]["Value"] = control->getSaveValue(); +			++num_saved;  		}  	}  	llofstream file; @@ -887,6 +902,8 @@ U32 LLControlGroup::loadFromFile(const std::string& filename, bool set_default_v  		LLControlVariable* existing_control = getControl(name);  		if(existing_control)  		{ +			// set_default_values is true when we're loading the initial, +			// immutable files from app_settings, e.g. settings.xml.  			if(set_default_values)  			{  				// Override all previously set properties of this control. @@ -908,6 +925,9 @@ U32 LLControlGroup::loadFromFile(const std::string& filename, bool set_default_v  			}  			else if(existing_control->isPersisted())  			{ +				// save_values is specifically false for (e.g.) +				// SessionSettingsFile and UserSessionSettingsFile -- in other +				// words, for a file that's supposed to be transient.  				existing_control->setValue(control_map["Value"], save_values);  			}  			// *NOTE: If not persisted and not setting defaults,  @@ -915,15 +935,47 @@ U32 LLControlGroup::loadFromFile(const std::string& filename, bool set_default_v  		}  		else  		{ -			declareControl(name,  +			// We've never seen this control before. Either we're loading up +			// the initial set of default settings files (set_default_values) +			// -- or we're loading user settings last saved by a viewer that +			// supports a superset of the variables we know. +			LLControlVariable* control = declareControl(name,   						   typeStringToEnum(control_map["Type"].asString()),   						   control_map["Value"],   						   control_map["Comment"].asString(),   						   persist,  						   hidefromsettingseditor  						   ); +			// CHOP-962: if we're loading an unrecognized user setting, make +			// sure we save it later. If you try an experimental viewer, tweak +			// a new setting, briefly revert to an old viewer, then return to +			// the new one, we don't want the old viewer to discard the +			// setting you changed. +			if (! set_default_values) +			{ +				// Using forcePersist() insists that saveToFile() (which calls +				// LLControlVariable::shouldSave()) must save this control +				// variable regardless of its value. We can safely set this +				// LLControlVariable persistent because the 'persistent' flag +				// is not itself persisted! +				control->forcePersist(); +				// We want to mention unrecognized user settings variables +				// (e.g. from a newer version of the viewer) in the log. But +				// we also arrive here for Boolean variables generated by +				// the notifications subsystem when the user checks "Don't +				// show me this again." These aren't declared in settings.xml; +				// they're actually named for the notification they suppress. +				// We don't want to mention those. Apologies, this is a bit of +				// a hack: we happen to know that user settings go into an +				// LLControlGroup whose name is "Global". +				if (getKey() == "Global") +				{ +					LL_INFOS("LLControlGroup") << "preserving unrecognized " << getKey() +											   << " settings variable " << name << LL_ENDL; +				} +			}  		} -		 +  		++validitems;  	} diff --git a/indra/llxml/llcontrol.h b/indra/llxml/llcontrol.h index ee7d1d50b7..5d6ac33780 100755 --- a/indra/llxml/llcontrol.h +++ b/indra/llxml/llcontrol.h @@ -101,13 +101,19 @@ public:  	typedef boost::signals2::signal<void(LLControlVariable* control, const LLSD&, const LLSD&)> commit_signal_t;  private: +	enum +	{ +		PERSIST_NO,                 // don't save this var +		PERSIST_YES,                // save this var if differs from default +		PERSIST_ALWAYS              // save this var even if has default value +	} mPersist; +  	std::string		mName;  	std::string		mComment;  	eControlType	mType; -	bool			mPersist;  	bool			mHideFromSettingsEditor;  	std::vector<LLSD> mValues; -	 +  	commit_signal_t mCommitSignal;  	validate_signal_t mValidateSignal; @@ -131,8 +137,8 @@ public:  	validate_signal_t* getValidateSignal() { return &mValidateSignal; }  	bool isDefault() { return (mValues.size() == 1); } -	bool isSaveValueDefault(); -	bool isPersisted() { return mPersist; } +	bool shouldSave(bool nondefault_only); +	bool isPersisted() { return mPersist != PERSIST_NO; }  	bool isHiddenFromSettingsEditor() { return mHideFromSettingsEditor; }  	LLSD get()			const	{ return getValue(); }  	LLSD getValue()		const	{ return mValues.back(); } @@ -142,7 +148,8 @@ public:  	void set(const LLSD& val)	{ setValue(val); }  	void setValue(const LLSD& value, bool saved_value = TRUE);  	void setDefaultValue(const LLSD& value); -	void setPersist(bool state); +	void setPersist(bool state);    // persist or not depending on value +	void forcePersist();            // always persist regardless of value  	void setHiddenFromSettingsEditor(bool hide);  	void setComment(const std::string& comment); @@ -207,19 +214,19 @@ public:  		virtual void apply(const std::string& name, LLControlVariable* control) = 0;  	};  	void applyToAll(ApplyFunctor* func); -	 -	BOOL declareControl(const std::string& name, eControlType type, const LLSD initial_val, const std::string& comment, BOOL persist, BOOL hidefromsettingseditor = FALSE); -	BOOL declareU32(const std::string& name, U32 initial_val, const std::string& comment, BOOL persist = TRUE); -	BOOL declareS32(const std::string& name, S32 initial_val, const std::string& comment, BOOL persist = TRUE); -	BOOL declareF32(const std::string& name, F32 initial_val, const std::string& comment, BOOL persist = TRUE); -	BOOL declareBOOL(const std::string& name, BOOL initial_val, const std::string& comment, BOOL persist = TRUE); -	BOOL declareString(const std::string& name, const std::string &initial_val, const std::string& comment, BOOL persist = TRUE); -	BOOL declareVec3(const std::string& name, const LLVector3 &initial_val,const std::string& comment,  BOOL persist = TRUE); -	BOOL declareVec3d(const std::string& name, const LLVector3d &initial_val, const std::string& comment, BOOL persist = TRUE); -	BOOL declareRect(const std::string& name, const LLRect &initial_val, const std::string& comment, BOOL persist = TRUE); -	BOOL declareColor4(const std::string& name, const LLColor4 &initial_val, const std::string& comment, BOOL persist = TRUE); -	BOOL declareColor3(const std::string& name, const LLColor3 &initial_val, const std::string& comment, BOOL persist = TRUE); -	BOOL declareLLSD(const std::string& name, const LLSD &initial_val, const std::string& comment, BOOL persist = TRUE); + +	LLControlVariable* declareControl(const std::string& name, eControlType type, const LLSD initial_val, const std::string& comment, BOOL persist, BOOL hidefromsettingseditor = FALSE); +	LLControlVariable* declareU32(const std::string& name, U32 initial_val, const std::string& comment, BOOL persist = TRUE); +	LLControlVariable* declareS32(const std::string& name, S32 initial_val, const std::string& comment, BOOL persist = TRUE); +	LLControlVariable* declareF32(const std::string& name, F32 initial_val, const std::string& comment, BOOL persist = TRUE); +	LLControlVariable* declareBOOL(const std::string& name, BOOL initial_val, const std::string& comment, BOOL persist = TRUE); +	LLControlVariable* declareString(const std::string& name, const std::string &initial_val, const std::string& comment, BOOL persist = TRUE); +	LLControlVariable* declareVec3(const std::string& name, const LLVector3 &initial_val,const std::string& comment,  BOOL persist = TRUE); +	LLControlVariable* declareVec3d(const std::string& name, const LLVector3d &initial_val, const std::string& comment, BOOL persist = TRUE); +	LLControlVariable* declareRect(const std::string& name, const LLRect &initial_val, const std::string& comment, BOOL persist = TRUE); +	LLControlVariable* declareColor4(const std::string& name, const LLColor4 &initial_val, const std::string& comment, BOOL persist = TRUE); +	LLControlVariable* declareColor3(const std::string& name, const LLColor3 &initial_val, const std::string& comment, BOOL persist = TRUE); +	LLControlVariable* declareLLSD(const std::string& name, const LLSD &initial_val, const std::string& comment, BOOL persist = TRUE);  	std::string getString(const std::string& name);  	std::string getText(const std::string& name); diff --git a/indra/llxml/tests/llcontrol_test.cpp b/indra/llxml/tests/llcontrol_test.cpp index ede81956ec..c273773c9b 100755 --- a/indra/llxml/tests/llcontrol_test.cpp +++ b/indra/llxml/tests/llcontrol_test.cpp @@ -128,7 +128,11 @@ namespace tut  	template<> template<>  	void control_group_t::test<3>()  	{ -		int results = mCG->loadFromFile(mTestConfigFile.c_str()); +		// Pass default_values = true. This tells loadFromFile() we're loading +		// a default settings file that declares variables, rather than a user +		// settings file. When loadFromFile() encounters an unrecognized user +		// settings variable, it forcibly preserves it (CHOP-962). +		int results = mCG->loadFromFile(mTestConfigFile.c_str(), true);  		LLControlVariable* control = mCG->getControl("TestSetting");  		LLSD new_value = 13;  		control->setValue(new_value, FALSE); diff --git a/indra/newview/app_settings/cmd_line.xml b/indra/newview/app_settings/cmd_line.xml index 7ab7787d77..74117dbd85 100755 --- a/indra/newview/app_settings/cmd_line.xml +++ b/indra/newview/app_settings/cmd_line.xml @@ -22,7 +22,8 @@      <map>        <key>count</key>        <integer>1</integer> -      <!-- Special case. Not mapped to a setting. --> +      <key>map-to</key> +      <string>CmdLineChannel</string>      </map>      <key>console</key> @@ -96,6 +97,8 @@  0 - low, 1 - medium, 2 - high, 3 - ultra</string>        <key>count</key>        <integer>1</integer> +      <key>map-to</key> +      <string>RenderQualityPerformance</string>      </map>      <key>grid</key> @@ -370,7 +373,8 @@        <boolean>true</boolean>        <key>last_option</key>        <boolean>true</boolean> -      <!-- Special case. Not mapped to a setting. --> +      <key>map-to</key> +      <string>CmdLineLoginLocation</string>      </map>      <key>url</key> @@ -381,7 +385,8 @@        <integer>1</integer>        <key>last_option</key>        <boolean>true</boolean> -      <!-- Special case. Not mapped to a setting. --> +      <key>map-to</key> +      <string>CmdLineLoginLocation</string>      </map>      <key>usersessionsettings</key> diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 344079b640..4c8860ffe7 100755 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -126,6 +126,17 @@        <key>Value</key>        <integer>1</integer>      </map> +    <key>AnalyzePerformance</key> +    <map> +      <key>Comment</key> +      <string>Request performance analysis for a particular viewer run</string> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>AnimateTextures</key>      <map>        <key>Comment</key> @@ -1738,6 +1749,17 @@        <key>Value</key>        <integer>0</integer>      </map> +    <key>CmdLineChannel</key> +    <map> +      <key>Comment</key> +      <string>Command line specified channel name</string> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string /> +    </map>      <key>CmdLineDisableVoice</key>      <map>        <key>Comment</key> @@ -1784,6 +1806,17 @@          <string />        </array>      </map> +    <key>CmdLineLoginLocation</key> +    <map> +      <key>Comment</key> +      <string>Startup destination requested on command line</string> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string/> +    </map>      <key>ConnectAsGod</key>      <map>        <key>Comment</key> @@ -1916,6 +1949,17 @@        <key>Value</key>        <integer>262144</integer>      </map> +    <key>CrashOnStartup</key> +    <map> +      <key>Comment</key> +      <string>User-requested crash on viewer startup</string> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>CreateToolCopyCenters</key>      <map>        <key>Comment</key> @@ -2158,6 +2202,17 @@        <key>Value</key>        <integer>0</integer>      </map> +    <key>DebugSession</key> +    <map> +      <key>Comment</key> +      <string>Request debugging for a particular viewer session</string> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>DebugShowColor</key>      <map>        <key>Comment</key> @@ -2972,6 +3027,17 @@        <key>Value</key>        <integer>0</integer>      </map> +    <key>DisableCrashLogger</key> +    <map> +      <key>Comment</key> +      <string>Do not send crash report to Linden server</string> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>DisableMouseWarp</key>      <map>        <key>Comment</key> @@ -5217,6 +5283,28 @@        <key>Value</key>        <integer>0</integer>      </map> +    <key>LogMetrics</key> +    <map> +      <key>Comment</key> +      <string>Log viewer metrics</string> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string/> +    </map> +    <key>LogPerformance</key> +    <map> +      <key>Comment</key> +      <string>Log performance analysis for a particular viewer run</string> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>LogTextureNetworkTraffic</key>      <map>        <key>Comment</key> @@ -6394,6 +6482,17 @@        <key>Value</key>        <integer>0</integer>      </map> +    <key>NoQuickTime</key> +    <map> +      <key>Comment</key> +      <string>Disable QuickTime for a particular viewer run</string> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>NoVerifySSLCert</key>      <map>        <key>Comment</key> @@ -9642,6 +9741,17 @@        <key>Value</key>        <integer>1</integer>      </map> +    <key>ReplaySession</key> +    <map> +      <key>Comment</key> +      <string>Request replay of previously-recorded pilot file</string> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>RotateRight</key>      <map>        <key>Comment</key> @@ -12858,12 +12968,13 @@      <key>UserLoginInfo</key>      <map>        <key>Comment</key> -      <string>Users loging data.</string> +      <string>User login data.</string>        <key>Persist</key>        <integer>1</integer>        <key>Type</key>        <string>LLSD</string>        <key>Value</key> +      <string/>      </map>      <key>VFSOldSize</key>      <map> diff --git a/indra/newview/app_settings/settings_files.xml b/indra/newview/app_settings/settings_files.xml index bfc09286e3..4a9e522a96 100755 --- a/indra/newview/app_settings/settings_files.xml +++ b/indra/newview/app_settings/settings_files.xml @@ -4,6 +4,9 @@      <file name="Global"            file_name="settings.xml"            required="true"/> +    <file name="Global" +          file_name="settings_install.xml" +          required="false"/>      <file name="PerAccount"            file_name="settings_per_account.xml"            required="true"/> diff --git a/indra/newview/linux_tools/wrapper.sh b/indra/newview/linux_tools/wrapper.sh index d8440eebf1..c23401d5a6 100755 --- a/indra/newview/linux_tools/wrapper.sh +++ b/indra/newview/linux_tools/wrapper.sh @@ -121,37 +121,21 @@ export SAVED_LD_LIBRARY_PATH="${LD_LIBRARY_PATH}"  export LD_LIBRARY_PATH="$PWD/lib:${LD_LIBRARY_PATH}" -# Have to deal specially with gridargs.dat; typical contents look like: -# --channel "Second Life Test"  --settings settings_test.xml -# Simply embedding $(<etc/gridargs.dat) into a command line treats each of -# Second, Life and Developer as separate args -- no good. We need bash to -# process quotes using eval. -# First, check if we have been instructed to skip reading in gridargs.dat: -skip_gridargs=false -argnum=0 +# Copy "$@" to ARGS array specifically to delete the --skip-gridargs switch. +# The gridargs.dat file is no more, but we still want to avoid breaking +# scripts that invoke this one with --skip-gridargs. +ARGS=()  for ARG in "$@"; do -    if [ "--skip-gridargs" == "$ARG" ]; then -        skip_gridargs=true -    else -        ARGS[$argnum]="$ARG" -        argnum=$(($argnum+1)) +    if [ "--skip-gridargs" != "$ARG" ]; then +        ARGS[${#ARGS[*]}]="$ARG"      fi  done -# Second, read it without scanning, then scan that string. Break quoted words -# into a bash array. Note that if gridargs.dat is empty, or contains only -# whitespace, the resulting gridargs array will be empty -- zero entries -- -# therefore "${gridargs[@]}" entirely vanishes from the command line below, -# just as we want. -if ! $skip_gridargs ; then -    eval gridargs=("$(<etc/gridargs.dat)") -fi -  # Run the program.  # Don't quote $LL_WRAPPER because, if empty, it should simply vanish from the -# command line. But DO quote "$@": preserve separate args as individually -# quoted. Similar remarks about the contents of gridargs. -$LL_WRAPPER bin/do-not-directly-run-secondlife-bin "${gridargs[@]}" "${ARGS[@]}" +# command line. But DO quote "${ARGS[@]}": preserve separate args as +# individually quoted. +$LL_WRAPPER bin/do-not-directly-run-secondlife-bin "${ARGS[@]}"  LL_RUN_ERR=$?  # Handle any resulting errors diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index f92274dbbd..37f1f11451 100755 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -2311,13 +2311,6 @@ bool LLAppViewer::initConfiguration()  {	  	//Load settings files list  	std::string settings_file_list = gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "settings_files.xml"); -	//LLControlGroup settings_control("SettingsFiles"); -	//llinfos << "Loading settings file list " << settings_file_list << llendl; -	//if (0 == settings_control.loadFromFile(settings_file_list)) -	//{ - //       llerrs << "Cannot load default configuration file " << settings_file_list << llendl; -	//} -  	LLXMLNodePtr root;  	BOOL success  = LLXMLNode::parseFile(settings_file_list, root, NULL);  	if (!success) @@ -2376,9 +2369,7 @@ bool LLAppViewer::initConfiguration()  	{  		c->setValue(true, false);  	} -#endif -#ifndef	LL_RELEASE_FOR_DOWNLOAD  	gSavedSettings.setBOOL("QAMode", TRUE );  	gSavedSettings.setS32("WatchdogEnabled", 0);  #endif @@ -2472,7 +2463,7 @@ bool LLAppViewer::initConfiguration()  	// Register the core crash option as soon as we can  	// if we want gdb post-mortem on cores we need to be up and running  	// ASAP or we might miss init issue etc. -	if(clp.hasOption("disablecrashlogger")) +	if(gSavedSettings.getBOOL("DisableCrashLogger"))  	{  		llwarns << "Crashes will be handled by system, stack trace logs and crash logger are both disabled" << llendl;  		LLAppViewer::instance()->disableCrashlogger(); @@ -2545,91 +2536,44 @@ bool LLAppViewer::initConfiguration()          }      } -    if(clp.hasOption("channel")) -    { -		LLVersionInfo::resetChannel(clp.getOption("channel")[0]); +	std::string CmdLineChannel(gSavedSettings.getString("CmdLineChannel")); +	if(! CmdLineChannel.empty()) +	{ +		LLVersionInfo::resetChannel(CmdLineChannel);  	}  	// If we have specified crash on startup, set the global so we'll trigger the crash at the right time -	if(clp.hasOption("crashonstartup")) -	{ -		gCrashOnStartup = TRUE; -	} +	gCrashOnStartup = gSavedSettings.getBOOL("CrashOnStartup"); -	if (clp.hasOption("logperformance")) +	if (gSavedSettings.getBOOL("LogPerformance"))  	{  		LLFastTimer::sLog = TRUE;  		LLFastTimer::sLogName = std::string("performance");		  	} -	 -	if (clp.hasOption("logmetrics")) - 	{ - 		LLFastTimer::sMetricLog = TRUE ; -		// '--logmetrics' can be specified with a named test metric argument so the data gathering is done only on that test -		// In the absence of argument, every metric is gathered (makes for a rather slow run and hard to decipher report...) -		std::string test_name = clp.getOption("logmetrics")[0]; + +	std::string test_name(gSavedSettings.getString("LogMetrics")); +	if (! test_name.empty()) +	{ +		LLFastTimer::sMetricLog = TRUE ; +		// '--logmetrics' is specified with a named test metric argument so the data gathering is done only on that test +		// In the absence of argument, every metric would be gathered (makes for a rather slow run and hard to decipher report...)  		llinfos << "'--logmetrics' argument : " << test_name << llendl; -		if (test_name == "") -		{ -			llwarns << "No '--logmetrics' argument given, will output all metrics to " << DEFAULT_METRIC_NAME << llendl; -			LLFastTimer::sLogName = DEFAULT_METRIC_NAME; -		} -		else -		{ -			LLFastTimer::sLogName = test_name; -		} +		LLFastTimer::sLogName = test_name;   	}  	if (clp.hasOption("graphicslevel"))  	{ -		const LLCommandLineParser::token_vector_t& value = clp.getOption("graphicslevel"); -        if(value.size() != 1) -        { -			llwarns << "Usage: -graphicslevel <0-3>" << llendl; -        } -        else -        { -			std::string detail = value.front(); -			mForceGraphicsDetail = TRUE; -			 -			switch (detail.c_str()[0]) -			{ -				case '0':  -					gSavedSettings.setU32("RenderQualityPerformance", 0);		 -					break; -				case '1':  -					gSavedSettings.setU32("RenderQualityPerformance", 1);		 -					break; -				case '2':  -					gSavedSettings.setU32("RenderQualityPerformance", 2);		 -					break; -				case '3':  -					gSavedSettings.setU32("RenderQualityPerformance", 3);		 -					break; -				default: -					mForceGraphicsDetail = FALSE; -					llwarns << "Usage: -graphicslevel <0-3>" << llendl; -					break; -			} -        } -	} - -	if (clp.hasOption("analyzeperformance")) -	{ -		LLFastTimerView::sAnalyzePerformance = TRUE; +		// User explicitly requested --graphicslevel on the command line. +		// We expect this switch has already set RenderQualityPerformance. +		// Check that value for validity; if valid, we'll engage it later. +		mForceGraphicsDetail = +			LLFeatureManager::instance().isValidGraphicsLevel(gSavedSettings.getU32("RenderQualityPerformance"));  	} -	if (clp.hasOption("replaysession")) -	{ -		gAgentPilot.setReplaySession(TRUE); -	} +	LLFastTimerView::sAnalyzePerformance = gSavedSettings.getBOOL("AnalyzePerformance"); +	gAgentPilot.setReplaySession(gSavedSettings.getBOOL("ReplaySession")); -	if (clp.hasOption("nonotifications")) -	{ -		gSavedSettings.getControl("IgnoreAllNotifications")->setValue(true, false); -	} -	 -	if (clp.hasOption("debugsession")) +	if (gSavedSettings.getBOOL("DebugSession"))  	{  		gDebugSession = TRUE;  		gDebugGL = TRUE; @@ -2654,20 +2598,16 @@ bool LLAppViewer::initConfiguration()      // What can happen is that someone can use IE (or potentially       // other browsers) and do the rough equivalent of command       // injection and steal passwords. Phoenix. SL-55321 -    if(clp.hasOption("url")) -    { -		LLStartUp::setStartSLURL(LLSLURL(clp.getOption("url")[0])); -		if(LLStartUp::getStartSLURL().getType() == LLSLURL::LOCATION)  -		{   -			LLGridManager::getInstance()->setGridChoice(LLStartUp::getStartSLURL().getGrid()); -			 -		}   -    } -    else if(clp.hasOption("slurl")) -    { -		LLSLURL start_slurl(clp.getOption("slurl")[0]); +	std::string CmdLineLoginLocation(gSavedSettings.getString("CmdLineLoginLocation")); +	if(! CmdLineLoginLocation.empty()) +	{ +		LLSLURL start_slurl(CmdLineLoginLocation);  		LLStartUp::setStartSLURL(start_slurl); -    } +		if(start_slurl.getType() == LLSLURL::LOCATION)  +		{   +			LLGridManager::getInstance()->setGridChoice(start_slurl.getGrid()); +		} +	}  	const LLControlVariable* skinfolder = gSavedSettings.getControl("SkinCurrent");  	if(skinfolder && LLStringUtil::null != skinfolder->getValue().asString()) @@ -2810,9 +2750,8 @@ bool LLAppViewer::initConfiguration()  		LL_DEBUGS("AppInit")<<"set start from NextLoginLocation: "<<nextLoginLocation<<LL_ENDL;  		LLStartUp::setStartSLURL(LLSLURL(nextLoginLocation));  	} -	else if (   (   clp.hasOption("login") || clp.hasOption("autologin")) -			 && !clp.hasOption("url") -			 && !clp.hasOption("slurl")) +	else if ((clp.hasOption("login") || clp.hasOption("autologin")) +			 && gSavedSettings.getString("CmdLineLoginLocation").empty())  	{  		// If automatic login from command line with --login switch  		// init StartSLURL location. diff --git a/indra/newview/llappviewermacosx.cpp b/indra/newview/llappviewermacosx.cpp index 4d340cafa9..c7b437598c 100755 --- a/indra/newview/llappviewermacosx.cpp +++ b/indra/newview/llappviewermacosx.cpp @@ -148,28 +148,13 @@ bool LLAppViewerMacOSX::initParseCommandLine(LLCommandLineParser& clp)  	// The next two lines add the support for parsing the mac -psn_XXX arg.  	clp.addOptionDesc("psn", NULL, 1, "MacOSX process serial number");  	clp.setCustomParser(parse_psn); -	 -    // First read in the args from arguments txt. -    const char* filename = "arguments.txt"; -	llifstream ifs(filename, llifstream::binary); -	if (!ifs.is_open()) -	{ -		llwarns << "Unable to open file" << filename << llendl; -		return false; -	} -	 -	if(clp.parseCommandLineFile(ifs) == false) -	{ -		return false; -	} -	// Then parse the user's command line, so that any --url arg can appear last -	// Succesive calls to clp.parse... will NOT override earlier options.  +	// parse the user's command line  	if(clp.parseCommandLine(gArgC, gArgV) == false)  	{  		return false;  	} -    	 +  	// Get the user's preferred language string based on the Mac OS localization mechanism.  	// To add a new localization:  		// go to the "Resources" section of the project diff --git a/indra/newview/llcommandlineparser.cpp b/indra/newview/llcommandlineparser.cpp index 17d403bbe1..7adc6b8c5e 100755 --- a/indra/newview/llcommandlineparser.cpp +++ b/indra/newview/llcommandlineparser.cpp @@ -39,13 +39,17 @@  #include <boost/program_options.hpp>  #include <boost/bind.hpp> -#include<boost/tokenizer.hpp> +#include <boost/tokenizer.hpp> +#include <boost/assign/list_of.hpp>  #if _MSC_VER  #   pragma warning(pop)  #endif  #include "llsdserialize.h" +#include "llerror.h" +#include <string> +#include <set>  #include <iostream>  #include <sstream> @@ -63,6 +67,18 @@ namespace po = boost::program_options;  // This could be good or bad, and probably won't matter for most use cases.  namespace   { +    // List of command-line switches that can't map-to settings variables. +    // Going forward, we want every new command-line switch to map-to some +    // settings variable. This list is used to validate that. +    const std::set<std::string> unmapped_options = boost::assign::list_of +        ("help") +        ("set") +        ("setdefault") +        ("settings") +        ("sessionsettings") +        ("usersessionsettings") +    ; +      po::options_description gOptionsDesc;      po::positional_options_description gPositionalOptions;  	po::variables_map gVariableMap; @@ -561,9 +577,35 @@ void LLControlGroupCLP::configure(const std::string& config_filename, LLControlG              }              boost::function1<void, const token_vector_t&> callback; -            if(option_params.has("map-to") && (NULL != controlGroup)) +            if (! option_params.has("map-to")) +            { +                // If this option isn't mapped to a settings variable, is it +                // one of the ones for which that's unreasonable, or did +                // someone carelessly add a new option? (Make all these +                // configuration errors fatal so a maintainer will catch them +                // right away.) +                std::set<std::string>::const_iterator found = unmapped_options.find(long_name); +                if (found == unmapped_options.end()) +                { +                    llerrs << "New command-line option " << long_name +                           << " should map-to a variable in settings.xml" << llendl; +                } +            } +            else                    // option specifies map-to              {                  std::string controlName = option_params["map-to"].asString(); +                if (! controlGroup) +                { +                    llerrs << "Must pass gSavedSettings to LLControlGroupCLP::configure() for " +                           << long_name << " (map-to " << controlName << ")" << llendl; +                } + +                if (! controlGroup->getControl(controlName)) +                { +                    llerrs << "Option " << long_name << " specifies map-to " << controlName +                           << " which does not exist" << llendl; +                } +                  callback = boost::bind(setControlValueCB, _1,                                          controlName, controlGroup);              } diff --git a/indra/newview/llfeaturemanager.cpp b/indra/newview/llfeaturemanager.cpp index ddb9d3bc43..9d292ce7bb 100755 --- a/indra/newview/llfeaturemanager.cpp +++ b/indra/newview/llfeaturemanager.cpp @@ -30,6 +30,7 @@  #include <fstream>  #include <boost/regex.hpp> +#include <boost/assign/list_of.hpp>  #include "llfeaturemanager.h"  #include "lldir.h" @@ -52,6 +53,8 @@  #include "llboost.h"  #include "llweb.h"  #include "llviewershadermgr.h" +#include "llstring.h" +#include "stringize.h"  #if LL_WINDOWS  #include "lldxhardware.h" @@ -187,6 +190,55 @@ void LLFeatureList::dump()  	LL_DEBUGS("RenderInit") << LL_ENDL;  } +static const std::vector<std::string> sGraphicsLevelNames = boost::assign::list_of +	("Low") +	("LowMid") +	("Mid") +	("MidHigh") +	("High") +	("HighUltra") +	("Ultra") +; + +U32 LLFeatureManager::getMaxGraphicsLevel() const +{ +	return sGraphicsLevelNames.size() - 1; +} + +bool LLFeatureManager::isValidGraphicsLevel(U32 level) const +{ +	return (level <= getMaxGraphicsLevel()); +} + +std::string LLFeatureManager::getNameForGraphicsLevel(U32 level) const +{ +	if (isValidGraphicsLevel(level)) +	{ +		return sGraphicsLevelNames[level]; +	} +	return STRINGIZE("Invalid graphics level " << level << ", valid are 0 .. " +					 << getMaxGraphicsLevel()); +} + +S32 LLFeatureManager::getGraphicsLevelForName(const std::string& name) const +{ +	const std::string FixedFunction("FixedFunction"); +	std::string rname(name); +	if (LLStringUtil::endsWith(rname, FixedFunction)) +	{ +		// chop off any "FixedFunction" suffix +		rname = rname.substr(0, rname.length() - FixedFunction.length()); +	} +	for (S32 i(0), iend(getMaxGraphicsLevel()); i <= iend; ++i) +	{ +		if (sGraphicsLevelNames[i] == rname) +		{ +			return i; +		} +	} +	return -1; +} +  LLFeatureList *LLFeatureManager::findMask(const std::string& name)  {  	if (mMaskList.count(name)) @@ -620,7 +672,7 @@ void LLFeatureManager::applyRecommendedSettings()  {  	// apply saved settings  	// cap the level at 2 (high) -	S32 level = llmax(GPU_CLASS_0, llmin(mGPUClass, GPU_CLASS_5)); +	U32 level = llmax(GPU_CLASS_0, llmin(mGPUClass, GPU_CLASS_5));  	llinfos << "Applying Recommended Features" << llendl; @@ -696,62 +748,33 @@ void LLFeatureManager::applyFeatures(bool skipFeatures)  	}  } -void LLFeatureManager::setGraphicsLevel(S32 level, bool skipFeatures) +void LLFeatureManager::setGraphicsLevel(U32 level, bool skipFeatures)  {  	LLViewerShaderMgr::sSkipReload = true;  	applyBaseMasks(); -	 -	switch (level) + +	// if we're passed an invalid level, default to "Low" +	std::string features(isValidGraphicsLevel(level)? getNameForGraphicsLevel(level) : "Low"); +	if (features == "Low")  	{ -		case 0:  #if LL_DARWIN -			// This Mac-specific change is to insure that we force 'Basic Shaders' for all Mac -			// systems which support them instead of falling back to fixed-function unnecessarily -			// MAINT-2157 -			// -			if (gGLManager.mGLVersion < 2.1f) -			{ -				maskFeatures("LowFixedFunction");			 -			} -			else -			{ //same as low, but with "Basic Shaders" enabled -				maskFeatures("Low"); -			} +		// This Mac-specific change is to insure that we force 'Basic Shaders' for all Mac +		// systems which support them instead of falling back to fixed-function unnecessarily +		// MAINT-2157 +		if (gGLManager.mGLVersion < 2.1f)  #else -			if (gGLManager.mGLVersion < 3.f || gGLManager.mIsIntel) -			{ //only use fixed function by default if GL version < 3.0 or this is an intel graphics chip -				maskFeatures("LowFixedFunction");			 -			} -			else -			{ //same as low, but with "Basic Shaders" enabled -				maskFeatures("Low"); -			} +		// only use fixed function by default if GL version < 3.0 or this is an intel graphics chip +		if (gGLManager.mGLVersion < 3.f || gGLManager.mIsIntel)  #endif -			break; -		case 1: -			maskFeatures("LowMid"); -			break; -		case 2: -			maskFeatures("Mid"); -			break; -		case 3: -			maskFeatures("MidHigh"); -			break; -		case 4: -			maskFeatures("High"); -			break; -		case 5: -			maskFeatures("HighUltra"); -			break; -		case 6: -			maskFeatures("Ultra"); -			break; -		default: -			maskFeatures("Low"); -			break; +		{ +            // same as Low, but with "Basic Shaders" disabled +			features = "LowFixedFunction"; +		}  	} +	maskFeatures(features); +  	applyFeatures(skipFeatures);  	LLViewerShaderMgr::sSkipReload = false; diff --git a/indra/newview/llfeaturemanager.h b/indra/newview/llfeaturemanager.h index ad72c16743..3b8d251236 100755 --- a/indra/newview/llfeaturemanager.h +++ b/indra/newview/llfeaturemanager.h @@ -134,8 +134,18 @@ public:  	// skipFeatures forces skipping of mostly hardware settings  	// that we don't want to change when we change graphics  	// settings -	void setGraphicsLevel(S32 level, bool skipFeatures); -	 +	void setGraphicsLevel(U32 level, bool skipFeatures); + +	// What 'level' values are valid to pass to setGraphicsLevel()? +	// 0 is the low end... +	U32 getMaxGraphicsLevel() const; +	bool isValidGraphicsLevel(U32 level) const; + +	// setGraphicsLevel() levels have names. +	std::string getNameForGraphicsLevel(U32 level) const; +	// returns -1 for unrecognized name (hence S32 rather than U32) +	S32 getGraphicsLevelForName(const std::string& name) const; +  	void applyBaseMasks();  	void applyRecommendedSettings(); diff --git a/indra/newview/llfloaterabout.cpp b/indra/newview/llfloaterabout.cpp index 83fb887d81..163f294d2a 100755 --- a/indra/newview/llfloaterabout.cpp +++ b/indra/newview/llfloaterabout.cpp @@ -33,8 +33,10 @@  // Viewer includes  #include "llagent.h" +#include "llagentui.h"  #include "llappviewer.h"   #include "llsecondlifeurls.h" +#include "llslurl.h"  #include "llvoiceclient.h"  #include "lluictrlfactory.h"  #include "llviewertexteditor.h" @@ -250,12 +252,16 @@ LLSD LLFloaterAbout::getInfo()  	LLViewerRegion* region = gAgent.getRegion();  	if (region)  	{ -		const LLVector3d &pos = gAgent.getPositionGlobal(); +		LLVector3d pos = gAgent.getPositionGlobal();  		info["POSITION"] = ll_sd_from_vector3d(pos); +		info["POSITION_LOCAL"] = ll_sd_from_vector3(gAgent.getPosAgentFromGlobal(pos));  		info["REGION"] = gAgent.getRegion()->getName();  		info["HOSTNAME"] = gAgent.getRegion()->getHost().getHostName();  		info["HOSTIP"] = gAgent.getRegion()->getHost().getString();  		info["SERVER_VERSION"] = gLastVersionChannel; +		LLSLURL slurl; +		LLAgentUI::buildSLURL(slurl); +		info["SLURL"] = slurl.getSLURLString();  	}  	// CPU diff --git a/indra/newview/skins/default/xui/da/floater_about.xml b/indra/newview/skins/default/xui/da/floater_about.xml index fc8bc33096..9206690c8f 100755 --- a/indra/newview/skins/default/xui/da/floater_about.xml +++ b/indra/newview/skins/default/xui/da/floater_about.xml @@ -8,7 +8,7 @@  		Bygget med [COMPILER] version [COMPILER_VERSION]  	</floater.string>  	<floater.string name="AboutPosition"> -		Du er ved [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1] i regionen [REGION] lokaliseret ved <nolink>[HOSTNAME]</nolink> ([HOSTIP]) +		Du er ved [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1] i regionen [REGION] lokaliseret ved <nolink>[HOSTNAME]</nolink> ([HOSTIP])  [SERVER_VERSION]  [SERVER_RELEASE_NOTES_URL]  	</floater.string> diff --git a/indra/newview/skins/default/xui/de/floater_about.xml b/indra/newview/skins/default/xui/de/floater_about.xml index 4387a61963..5245467183 100755 --- a/indra/newview/skins/default/xui/de/floater_about.xml +++ b/indra/newview/skins/default/xui/de/floater_about.xml @@ -8,7 +8,7 @@  		Kompiliert mit [COMPILER] version [COMPILER_VERSION]  	</floater.string>  	<floater.string name="AboutPosition"> -		Sie befinden sich in [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1] in [REGION] auf <nolink>[HOSTNAME]</nolink> ([HOSTIP]) +		Sie befinden sich in [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1] in [REGION] auf <nolink>[HOSTNAME]</nolink> ([HOSTIP])  [SERVER_VERSION]  [SERVER_RELEASE_NOTES_URL]  	</floater.string> diff --git a/indra/newview/skins/default/xui/en/floater_about.xml b/indra/newview/skins/default/xui/en/floater_about.xml index 63eb87f27a..703015af20 100755 --- a/indra/newview/skins/default/xui/en/floater_about.xml +++ b/indra/newview/skins/default/xui/en/floater_about.xml @@ -22,7 +22,9 @@ Built with [COMPILER] version [COMPILER_VERSION]  </floater.string>    <floater.string       name="AboutPosition"> -You are at [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1] in [REGION] located at <nolink>[HOSTNAME]</nolink> ([HOSTIP]) +You are at [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1] in [REGION] located at <nolink>[HOSTNAME]</nolink> ([HOSTIP]) +SLURL: <nolink>[SLURL]</nolink> +(global coordinates [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1])  [SERVER_VERSION]  [SERVER_RELEASE_NOTES_URL] diff --git a/indra/newview/skins/default/xui/es/floater_about.xml b/indra/newview/skins/default/xui/es/floater_about.xml index 3696c7e12c..7ca1e3721f 100755 --- a/indra/newview/skins/default/xui/es/floater_about.xml +++ b/indra/newview/skins/default/xui/es/floater_about.xml @@ -8,7 +8,7 @@  		Compilado con [COMPILER], versión [COMPILER_VERSION]  	</floater.string>  	<floater.string name="AboutPosition"> -		Estás en la posición [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1], de [REGION], alojada en <nolink>[HOSTNAME]</nolink> ([HOSTIP]) +		Estás en la posición [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1], de [REGION], alojada en <nolink>[HOSTNAME]</nolink> ([HOSTIP])  [SERVER_VERSION]  [SERVER_RELEASE_NOTES_URL]  	</floater.string> diff --git a/indra/newview/skins/default/xui/fr/floater_about.xml b/indra/newview/skins/default/xui/fr/floater_about.xml index a659cb4245..d45bdccf3e 100755 --- a/indra/newview/skins/default/xui/fr/floater_about.xml +++ b/indra/newview/skins/default/xui/fr/floater_about.xml @@ -8,7 +8,7 @@  		Compilé avec [COMPILER] version [COMPILER_VERSION]  	</floater.string>  	<floater.string name="AboutPosition"> -		Vous êtes à [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1] dans [REGION], se trouvant à <nolink>[HOSTNAME]</nolink> ([HOSTIP]) +		Vous êtes à [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1] dans [REGION], se trouvant à <nolink>[HOSTNAME]</nolink> ([HOSTIP])  [SERVER_VERSION]  [SERVER_RELEASE_NOTES_URL]  	</floater.string> diff --git a/indra/newview/skins/default/xui/it/floater_about.xml b/indra/newview/skins/default/xui/it/floater_about.xml index c672511fc5..b0fb585fa2 100755 --- a/indra/newview/skins/default/xui/it/floater_about.xml +++ b/indra/newview/skins/default/xui/it/floater_about.xml @@ -8,7 +8,7 @@  		Generato con [COMPILER] versione [COMPILER_VERSION]  	</floater.string>  	<floater.string name="AboutPosition"> -		Tu sei  [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1] in [REGION] che si trova a <nolink>[HOSTNAME]</nolink> ([HOSTIP]) +		Tu sei  [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1] in [REGION] che si trova a <nolink>[HOSTNAME]</nolink> ([HOSTIP])  [SERVER_VERSION]  [SERVER_RELEASE_NOTES_URL]  	</floater.string> diff --git a/indra/newview/skins/default/xui/ja/floater_about.xml b/indra/newview/skins/default/xui/ja/floater_about.xml index 6d5df75645..eae52c98ec 100755 --- a/indra/newview/skins/default/xui/ja/floater_about.xml +++ b/indra/newview/skins/default/xui/ja/floater_about.xml @@ -8,7 +8,7 @@  		コンパイラー [COMPILER] [COMPILER_VERSION] バージョン  	</floater.string>  	<floater.string name="AboutPosition"> -		あなたの現在地は、[POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1] の [REGION] です。位置は <nolink>[HOSTNAME]</nolink> です。([HOSTIP]) +		あなたの現在地は、[POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1] の [REGION] です。位置は <nolink>[HOSTNAME]</nolink> です。([HOSTIP])  [SERVER_VERSION]  [SERVER_RELEASE_NOTES_URL]  	</floater.string> diff --git a/indra/newview/skins/default/xui/pl/floater_about.xml b/indra/newview/skins/default/xui/pl/floater_about.xml index 409429ffaa..61a72ff27d 100755 --- a/indra/newview/skins/default/xui/pl/floater_about.xml +++ b/indra/newview/skins/default/xui/pl/floater_about.xml @@ -8,7 +8,7 @@  		Buduj z [COMPILER] wersją [COMPILER_VERSION]  	</floater.string>  	<floater.string name="AboutPosition"> -		Położenie [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1] w [REGION] zlokalizowanym w <nolink>[HOSTNAME]</nolink> ([HOSTIP]) +		Położenie [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1] w [REGION] zlokalizowanym w <nolink>[HOSTNAME]</nolink> ([HOSTIP])  [SERVER_VERSION]  [SERVER_RELEASE_NOTES_URL]  	</floater.string> diff --git a/indra/newview/skins/default/xui/pt/floater_about.xml b/indra/newview/skins/default/xui/pt/floater_about.xml index 299f88b22a..d089266342 100755 --- a/indra/newview/skins/default/xui/pt/floater_about.xml +++ b/indra/newview/skins/default/xui/pt/floater_about.xml @@ -7,7 +7,7 @@  		Construído com [COMPILER] versão [COMPILER_VERSION]  	</floater.string>  	<floater.string name="AboutPosition"> -		Você está em [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1] em [REGION] localizado em [HOSTNAME]</nolink>([HOSTIP]) +		Você está em [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1] em [REGION] localizado em [HOSTNAME]</nolink>([HOSTIP])  [SERVER_VERSION]  [SERVER_RELEASE_NOTES_URL]  	</floater.string> diff --git a/indra/newview/skins/default/xui/ru/floater_about.xml b/indra/newview/skins/default/xui/ru/floater_about.xml index bb6266ac9a..2b2b3cf453 100755 --- a/indra/newview/skins/default/xui/ru/floater_about.xml +++ b/indra/newview/skins/default/xui/ru/floater_about.xml @@ -8,7 +8,7 @@  		Использован компилятор [COMPILER], версия [COMPILER_VERSION]  	</floater.string>  	<floater.string name="AboutPosition"> -		Вы в точке [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1] в регионе «[REGION]», расположенном на <nolink>[HOSTNAME]</nolink> ([HOSTIP]) +		Вы в точке [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1] в регионе «[REGION]», расположенном на <nolink>[HOSTNAME]</nolink> ([HOSTIP])  [SERVER_VERSION]  [SERVER_RELEASE_NOTES_URL]  	</floater.string> diff --git a/indra/newview/skins/default/xui/tr/floater_about.xml b/indra/newview/skins/default/xui/tr/floater_about.xml index 9cc9c7a220..4dcf6200c6 100755 --- a/indra/newview/skins/default/xui/tr/floater_about.xml +++ b/indra/newview/skins/default/xui/tr/floater_about.xml @@ -8,7 +8,7 @@  		[COMPILER] [COMPILER_VERSION] sürümü ile oluşturuldu  	</floater.string>  	<floater.string name="AboutPosition"> -		<nolink>[HOSTNAME]</nolink> ([HOSTIP]) üzerinde bulunan [REGION] içerisinde [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1] konumundasınız +		<nolink>[HOSTNAME]</nolink> ([HOSTIP]) üzerinde bulunan [REGION] içerisinde [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1] konumundasınız  [SERVER_VERSION]  [SERVER_RELEASE_NOTES_URL]  	</floater.string> diff --git a/indra/newview/skins/default/xui/zh/floater_about.xml b/indra/newview/skins/default/xui/zh/floater_about.xml index 643881e416..1193243c7e 100755 --- a/indra/newview/skins/default/xui/zh/floater_about.xml +++ b/indra/newview/skins/default/xui/zh/floater_about.xml @@ -8,7 +8,7 @@  		以 [COMPILER_VERSION] 版本 [COMPILER] 建置  	</floater.string>  	<floater.string name="AboutPosition"> -		你的方位是 [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1],地區名:[REGION],主機:<nolink>[HOSTNAME]</nolink> ([HOSTIP]) +		你的方位是 [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1],地區名:[REGION],主機:<nolink>[HOSTNAME]</nolink> ([HOSTIP])  [SERVER_VERSION]  [SERVER_RELEASE_NOTES_URL]  	</floater.string> diff --git a/indra/newview/tests/llagentaccess_test.cpp b/indra/newview/tests/llagentaccess_test.cpp index 3ba25f3c10..1f379ead32 100755 --- a/indra/newview/tests/llagentaccess_test.cpp +++ b/indra/newview/tests/llagentaccess_test.cpp @@ -49,10 +49,10 @@ LLControlGroup::~LLControlGroup()  }  // Implementation of just the LLControlGroup methods we requre -BOOL LLControlGroup::declareU32(const std::string& name, U32 initial_val, const std::string& comment, BOOL persist) +LLControlVariable* LLControlGroup::declareU32(const std::string& name, U32 initial_val, const std::string& comment, BOOL persist)  {  	test_preferred_maturity = initial_val; -	return true; +	return NULL;  }  void LLControlGroup::setU32(const std::string& name, U32 val) diff --git a/indra/newview/tests/lllogininstance_test.cpp b/indra/newview/tests/lllogininstance_test.cpp index f038112fd0..4768d9351e 100755 --- a/indra/newview/tests/lllogininstance_test.cpp +++ b/indra/newview/tests/lllogininstance_test.cpp @@ -175,8 +175,8 @@ F32 LLControlGroup::getF32(const std::string& name) { return 0.0f; }  U32 LLControlGroup::saveToFile(const std::string& filename, BOOL nondefault_only) { return 1; }  void LLControlGroup::setString(const std::string& name, const std::string& val) {}  std::string LLControlGroup::getString(const std::string& name) { return "test_string"; } -BOOL LLControlGroup::declareBOOL(const std::string& name, BOOL initial_val, const std::string& comment, BOOL persist) { return TRUE; } -BOOL LLControlGroup::declareString(const std::string& name, const std::string &initial_val, const std::string& comment, BOOL persist) { return TRUE; } +LLControlVariable* LLControlGroup::declareBOOL(const std::string& name, BOOL initial_val, const std::string& comment, BOOL persist) { return NULL; } +LLControlVariable* LLControlGroup::declareString(const std::string& name, const std::string &initial_val, const std::string& comment, BOOL persist) { return NULL; }  #include "lluicolortable.h"  void LLUIColorTable::saveUserSettings(void)const {} diff --git a/indra/newview/tests/llsecapi_test.cpp b/indra/newview/tests/llsecapi_test.cpp index 703603e2db..05bac0e23b 100755 --- a/indra/newview/tests/llsecapi_test.cpp +++ b/indra/newview/tests/llsecapi_test.cpp @@ -39,10 +39,10 @@  LLControlGroup::LLControlGroup(const std::string& name)  : LLInstanceTracker<LLControlGroup, std::string>(name) {}  LLControlGroup::~LLControlGroup() {} -BOOL LLControlGroup::declareString(const std::string& name, +LLControlVariable* LLControlGroup::declareString(const std::string& name,                                     const std::string& initial_val,                                     const std::string& comment, -                                   BOOL persist) {return TRUE;} +                                   BOOL persist) {return NULL;}  void LLControlGroup::setString(const std::string& name, const std::string& val){}  std::string LLControlGroup::getString(const std::string& name)  { diff --git a/indra/newview/tests/llsechandler_basic_test.cpp b/indra/newview/tests/llsechandler_basic_test.cpp index 0235400976..3fbb45f8b4 100755 --- a/indra/newview/tests/llsechandler_basic_test.cpp +++ b/indra/newview/tests/llsechandler_basic_test.cpp @@ -71,10 +71,10 @@ std::string gLastName;  LLControlGroup::LLControlGroup(const std::string& name)  : LLInstanceTracker<LLControlGroup, std::string>(name) {}  LLControlGroup::~LLControlGroup() {} -BOOL LLControlGroup::declareString(const std::string& name, +LLControlVariable* LLControlGroup::declareString(const std::string& name,                                     const std::string& initial_val,                                     const std::string& comment, -                                   BOOL persist) {return TRUE;} +                                   BOOL persist) {return NULL;}  void LLControlGroup::setString(const std::string& name, const std::string& val){}  std::string LLControlGroup::getString(const std::string& name)  { diff --git a/indra/newview/tests/llslurl_test.cpp b/indra/newview/tests/llslurl_test.cpp index 09343ef227..a3735388df 100755 --- a/indra/newview/tests/llslurl_test.cpp +++ b/indra/newview/tests/llslurl_test.cpp @@ -37,10 +37,10 @@  LLControlGroup::LLControlGroup(const std::string& name)  : LLInstanceTracker<LLControlGroup, std::string>(name) {}  LLControlGroup::~LLControlGroup() {} -BOOL LLControlGroup::declareString(const std::string& name, +LLControlVariable* LLControlGroup::declareString(const std::string& name,                                     const std::string& initial_val,                                     const std::string& comment, -                                   BOOL persist) {return TRUE;} +                                   BOOL persist) {return NULL;}  void LLControlGroup::setString(const std::string& name, const std::string& val){}  std::string gCmdLineLoginURI; diff --git a/indra/newview/tests/llviewerhelputil_test.cpp b/indra/newview/tests/llviewerhelputil_test.cpp index 710881d811..8e9cc7111b 100755 --- a/indra/newview/tests/llviewerhelputil_test.cpp +++ b/indra/newview/tests/llviewerhelputil_test.cpp @@ -49,10 +49,10 @@ static std::string gOS;  LLControlGroup::LLControlGroup(const std::string& name)  	: LLInstanceTracker<LLControlGroup, std::string>(name) {}  LLControlGroup::~LLControlGroup() {} -BOOL LLControlGroup::declareString(const std::string& name, +LLControlVariable* LLControlGroup::declareString(const std::string& name,  				   const std::string& initial_val,  				   const std::string& comment, -				   BOOL persist) {return TRUE;} +				   BOOL persist) {return NULL;}  void LLControlGroup::setString(const std::string& name, const std::string& val){}  std::string LLControlGroup::getString(const std::string& name)  { diff --git a/indra/newview/tests/llviewernetwork_test.cpp b/indra/newview/tests/llviewernetwork_test.cpp index a1e97ea17e..f80c02475d 100755 --- a/indra/newview/tests/llviewernetwork_test.cpp +++ b/indra/newview/tests/llviewernetwork_test.cpp @@ -37,10 +37,10 @@  LLControlGroup::LLControlGroup(const std::string& name)  : LLInstanceTracker<LLControlGroup, std::string>(name) {}  LLControlGroup::~LLControlGroup() {} -BOOL LLControlGroup::declareString(const std::string& name, +LLControlVariable* LLControlGroup::declareString(const std::string& name,                                     const std::string& initial_val,                                     const std::string& comment, -                                   BOOL persist) {return TRUE;} +                                   BOOL persist) {return NULL;}  void LLControlGroup::setString(const std::string& name, const std::string& val){}  std::string gCmdLineLoginURI; diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index 53a3e732ca..206f81cdc2 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -34,9 +34,15 @@ import tarfile  import time  import random  viewer_dir = os.path.dirname(__file__) -# add llmanifest library to our path so we don't have to muck with PYTHONPATH -sys.path.append(os.path.join(viewer_dir, '../lib/python/indra/util')) -from llmanifest import LLManifest, main, proper_windows_path, path_ancestors +# Add indra/lib/python to our path so we don't have to muck with PYTHONPATH. +# Put it FIRST because some of our build hosts have an ancient install of +# indra.util.llmanifest under their system Python! +sys.path.insert(0, os.path.join(viewer_dir, os.pardir, "lib", "python")) +from indra.util.llmanifest import LLManifest, main, proper_windows_path, path_ancestors +try: +    from llbase import llsd +except ImportError: +    from indra.base import llsd  class ViewerManifest(LLManifest):      def is_packaging_viewer(self): @@ -99,6 +105,21 @@ class ViewerManifest(LLManifest):                      self.path("dictionaries")                      self.end_prefix(pkgdir) +                # CHOP-955: If we have "sourceid" in the build process +                # environment, generate it into settings_install.xml. +                try: +                    sourceid = os.environ["sourceid"] +                except KeyError: +                    # no sourceid, no settings_install.xml file +                    pass +                else: +                    # Single-entry subset of the LLSD content of settings.xml +                    content = dict(sourceid=dict(Comment='Identify referring agency to Linden web servers', +                                                 Persist=1, +                                                 Type='String', +                                                 Value=sourceid)) +                    self.put_in_file(llsd.format_pretty_xml(content), "settings_install.xml") +                  self.end_prefix("app_settings")              if self.prefix(src="character"): @@ -196,24 +217,26 @@ class ViewerManifest(LLManifest):          """ Convenience function that returns the command-line flags          for the grid""" -        # Set command line flags relating to the target grid -        grid_flags = '' -        if not self.default_grid(): -            grid_flags = "--grid %(grid)s "\ -                         "--helperuri http://preview-%(grid)s.secondlife.com/helpers/" %\ -                           {'grid':self.grid()} - -        # Deal with settings  -        setting_flags = '' -        if not self.default_channel() or not self.default_grid(): -            if self.default_grid(): -                setting_flags = '--settings settings_%s.xml'\ -                                % self.channel_lowerword() -            else: -                setting_flags = '--settings settings_%s_%s.xml'\ -                                % (self.grid(), self.channel_lowerword()) -                                                 -        return " ".join((grid_flags, setting_flags)).strip() +        # The original role of this method seems to have been to build a +        # grid-specific viewer: one that would, on launch, preselect a +        # particular grid. (Apparently that dates back to when the protocol +        # between viewer and simulator required them to be updated in +        # lockstep, so that "the beta grid" required "a beta viewer.") But +        # those viewer command-line switches no longer work without tweaking +        # user_settings/grids.xml. In fact, going forward, it's unclear what +        # use case that would address. + +        # This method also set a channel-specific (or grid-and-channel- +        # specific) user_settings/settings_something.xml file. It has become +        # clear that saving user settings in a channel-specific file causes +        # more problems (confusion) than it solves, so we've discontinued that. + +        # In fact we now avoid forcing viewer command-line switches at all, +        # instead introducing a settings_install.xml file. Command-line +        # switches don't aggregate well; for instance the generated --channel +        # switch actually prevented the user specifying --channel on the +        # command line. Settings files have well-defined override semantics. +        return None      def extract_names(self,src):          try: @@ -529,8 +552,7 @@ class WindowsManifest(ViewerManifest):              'final_exe' : self.final_exe(),              'grid':self.args['grid'],              'grid_caps':self.args['grid'].upper(), -            # escape quotes becase NSIS doesn't handle them well -            'flags':self.flags_list().replace('"', '$\\"'), +            'flags':'',              'channel':self.channel(),              'channel_oneword':self.channel_oneword(),              'channel_unique':self.channel_unique(), @@ -757,9 +779,6 @@ class DarwinManifest(ViewerManifest):                      self.end_prefix("llplugin") -                # command line arguments for connecting to the proper grid -                self.put_in_file(self.flags_list(), 'arguments.txt') -                  self.end_prefix("Resources")              self.end_prefix("Contents") @@ -805,10 +824,6 @@ class DarwinManifest(ViewerManifest):                                   'bundle': self.get_dst_prefix()                  }) -        channel_standin = 'Second Life Viewer'  # hah, our default channel is not usable on its own -        if not self.default_channel(): -            channel_standin = self.channel() -          imagename="SecondLife_" + '_'.join(self.args['version'])          # MBW -- If the mounted volume name changes, it breaks the .DS_Store's background image and icon positioning. @@ -926,9 +941,6 @@ class LinuxManifest(ViewerManifest):              self.path("install.sh")              self.end_prefix("linux_tools") -        # Create an appropriate gridargs.dat for this package, denoting required grid. -        self.put_in_file(self.flags_list(), 'etc/gridargs.dat') -          if self.prefix(src="", dst="bin"):              self.path("secondlife-bin","do-not-directly-run-secondlife-bin")              self.path("../linux_crash_logger/linux-crash-logger","linux-crash-logger.bin") | 
