diff options
Diffstat (limited to 'indra/newview')
36 files changed, 1131 insertions, 213 deletions
| diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 7c01731282..43aa67e949 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -798,6 +798,61 @@        <key>Value</key>        <integer>5</integer>      </map> +    <key>Socks5ProxyEnabled</key> +    <map> +      <key>Comment</key> +      <string>Use Socks5 Proxy</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map> +    <key>HttpProxyType</key> +    <map> +      <key>Comment</key> +      <string>Proxy type to use for HTTP operations</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>Socks</string> +    </map> +    <key>Socks5ProxyHost</key> +    <map> +      <key>Comment</key> +      <string>Socks 5 Proxy Host</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string></string> +    </map> +    <key>Socks5ProxyPort</key> +    <map> +      <key>Comment</key> +      <string>Socks 5 Proxy Port</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>U32</string> +      <key>Value</key> +      <integer>1080</integer> +    </map> +    <key>Socks5AuthType</key> +    <map> +      <key>Comment</key> +      <string>Selected Auth mechanism for Socks5</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>None</string> +    </map>      <key>BuildAxisDeadZone0</key>      <map>        <key>Comment</key> @@ -3993,7 +4048,7 @@        <key>Type</key>        <string>String</string>        <key>Value</key> -      <string>http://search-beta.secondlife.com/viewer/[CATEGORY]/?q=[QUERY]</string> +      <string>http://search.secondlife.com/viewer/[CATEGORY]/?q=[QUERY]</string>      </map>      <key>WebProfileURL</key>      <map> diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index d12b971bde..6a808b5daf 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -137,6 +137,7 @@  #include "lltoolmgr.h"  #include "llassetstorage.h"  #include "llpolymesh.h" +#include "llproxy.h"  #include "llaudioengine.h"  #include "llstreamingaudio.h"  #include "llviewermenu.h" @@ -321,6 +322,41 @@ static std::string gLaunchFileOnQuit;  // Used on Win32 for other apps to identify our window (eg, win_setup)  const char* const VIEWER_WINDOW_CLASSNAME = "Second Life"; +//-- LLDeferredTaskList ------------------------------------------------------ + +/** + * A list of deferred tasks. + * + * We sometimes need to defer execution of some code until the viewer gets idle, + * e.g. removing an inventory item from within notifyObservers() may not work out. + * + * Tasks added to this list will be executed in the next LLAppViewer::idle() iteration. + * All tasks are executed only once. + */ +class LLDeferredTaskList: public LLSingleton<LLDeferredTaskList> +{ +	LOG_CLASS(LLDeferredTaskList); + +	friend class LLAppViewer; +	typedef boost::signals2::signal<void()> signal_t; + +	void addTask(const signal_t::slot_type& cb) +	{ +		mSignal.connect(cb); +	} + +	void run() +	{ +		if (!mSignal.empty()) +		{ +			mSignal(); +			mSignal.disconnect_all_slots(); +		} +	} + +	signal_t mSignal; +}; +  //----------------------------------------------------------------------------  // List of entries from strings.xml to always replace @@ -731,6 +767,23 @@ bool LLAppViewer::init()      initThreads();  	LL_INFOS("InitInfo") << "Threads initialized." << LL_ENDL ; +	// Initialize settings early so that the defaults for ignorable dialogs are +	// picked up and then correctly re-saved after launching the updater (STORM-1268). +	LLUI::settings_map_t settings_map; +	settings_map["config"] = &gSavedSettings; +	settings_map["ignores"] = &gWarningSettings; +	settings_map["floater"] = &gSavedSettings; // *TODO: New settings file +	settings_map["account"] = &gSavedPerAccountSettings; + +	LLUI::initClass(settings_map, +		LLUIImageList::getInstance(), +		ui_audio_callback, +		&LLUI::sGLScaleFactor); +	LL_INFOS("InitInfo") << "UI initialized." << LL_ENDL ; + +	LLNotifications::instance(); +	LL_INFOS("InitInfo") << "Notifications initialized." << LL_ENDL ; +      writeSystemInfo();  	// Initialize updater service (now that we have an io pump) @@ -772,19 +825,8 @@ bool LLAppViewer::init()  	{  		LLError::setPrintLocation(true);  	} -	 -	// Widget construction depends on LLUI being initialized -	LLUI::settings_map_t settings_map; -	settings_map["config"] = &gSavedSettings; -	settings_map["ignores"] = &gWarningSettings; -	settings_map["floater"] = &gSavedSettings; // *TODO: New settings file -	settings_map["account"] = &gSavedPerAccountSettings; -	LLUI::initClass(settings_map, -		LLUIImageList::getInstance(), -		ui_audio_callback, -		&LLUI::sGLScaleFactor); -	 +  	// Setup paths and LLTrans after LLUI::initClass has been called  	LLUI::setupPaths();  	LLTransUtil::parseStrings("strings.xml", default_trans_args);		 @@ -1840,6 +1882,8 @@ bool LLAppViewer::cleanup()  		LLWeb::loadURLExternal( gLaunchFileOnQuit, false );  		llinfos << "File launched." << llendflush;  	} +	llinfos << "Cleaning up LLProxy." << llendl; +	LLProxy::cleanupClass();  	LLMainLoopRepeater::instance().stop(); @@ -3820,6 +3864,11 @@ bool LLAppViewer::initCache()  	}  } +void LLAppViewer::addOnIdleCallback(const boost::function<void()>& cb) +{ +	LLDeferredTaskList::instance().addTask(cb); +} +  void LLAppViewer::purgeCache()  {  	LL_INFOS("AppCache") << "Purging Cache and Texture Cache..." << LL_ENDL; @@ -4413,6 +4462,9 @@ void LLAppViewer::idle()  			gAudiop->idle(max_audio_decode_time);  		}  	} + +	// Execute deferred tasks. +	LLDeferredTaskList::instance().run();  	// Handle shutdown process, for example,   	// wait for floaters to close, send quit message, diff --git a/indra/newview/llappviewer.h b/indra/newview/llappviewer.h index 61ee6a7cf1..32115e0e7b 100644 --- a/indra/newview/llappviewer.h +++ b/indra/newview/llappviewer.h @@ -164,6 +164,8 @@ public:  	login_completed_signal_t mOnLoginCompleted;  	boost::signals2::connection setOnLoginCompletedCallback( const login_completed_signal_t::slot_type& cb ) { return mOnLoginCompleted.connect(cb); }  +	void addOnIdleCallback(const boost::function<void()>& cb); // add a callback to fire (once) when idle +  	void purgeCache(); // Clear the local cache.   	// mute/unmute the system's master audio diff --git a/indra/newview/lldrawpoolbump.cpp b/indra/newview/lldrawpoolbump.cpp index 6f71c54f79..0742250b0b 100644 --- a/indra/newview/lldrawpoolbump.cpp +++ b/indra/newview/lldrawpoolbump.cpp @@ -155,6 +155,7 @@ void LLStandardBumpmap::addstandard()  			LLViewerTextureManager::getFetchedTexture(LLUUID(bump_image_id));	  		gStandardBumpmapList[LLStandardBumpmap::sStandardBumpmapCount].mImage->setBoostLevel(LLViewerTexture::BOOST_BUMP) ;  		gStandardBumpmapList[LLStandardBumpmap::sStandardBumpmapCount].mImage->setLoadedCallback(LLBumpImageList::onSourceStandardLoaded, 0, TRUE, FALSE, NULL, NULL ); +		gStandardBumpmapList[LLStandardBumpmap::sStandardBumpmapCount].mImage->forceToSaveRawImage(0) ;  		LLStandardBumpmap::sStandardBumpmapCount++;  	} @@ -1078,6 +1079,7 @@ LLViewerTexture* LLBumpImageList::getBrightnessDarknessImage(LLViewerFetchedText  			{  				src_image->setBoostLevel(LLViewerTexture::BOOST_BUMP) ;  				src_image->setLoadedCallback( callback_func, 0, TRUE, FALSE, new LLUUID(src_image->getID()), NULL ); +				src_image->forceToSaveRawImage(0) ;  			}  		}  	} diff --git a/indra/newview/llfloaterpostcard.cpp b/indra/newview/llfloaterpostcard.cpp index dd0b1d999c..3bcbb987f7 100644 --- a/indra/newview/llfloaterpostcard.cpp +++ b/indra/newview/llfloaterpostcard.cpp @@ -137,9 +137,9 @@ void LLFloaterPostcard::draw()  		// first set the max extents of our preview  		rect.translate(-rect.mLeft, -rect.mBottom); -		rect.mLeft += 280; +		rect.mLeft += 320;  		rect.mRight -= 10; -		rect.mTop -= 20; +		rect.mTop -= 27;  		rect.mBottom = rect.mTop - 130;  		// then fix the aspect ratio diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp index 5fd262a720..d65928e385 100755 --- a/indra/newview/llfloaterpreference.cpp +++ b/indra/newview/llfloaterpreference.cpp @@ -105,6 +105,7 @@  #include "llviewermedia.h"  #include "llpluginclassmedia.h"  #include "llteleporthistorystorage.h" +#include "llproxy.h"  #include "lllogininstance.h"        // to check if logged in yet  #include "llsdserialize.h" @@ -158,7 +159,7 @@ BOOL LLVoiceSetKeyDialog::handleKeyHere(KEY key, MASK mask)  {  	BOOL result = TRUE; -	if(key == 'Q' && mask == MASK_CONTROL) +	if (key == 'Q' && mask == MASK_CONTROL)  	{  		result = FALSE;  	} @@ -333,16 +334,17 @@ LLFloaterPreference::LLFloaterPreference(const LLSD& key)  	mCommitCallbackRegistrar.add("Pref.ClickEnablePopup",		boost::bind(&LLFloaterPreference::onClickEnablePopup, this));  	mCommitCallbackRegistrar.add("Pref.ClickDisablePopup",		boost::bind(&LLFloaterPreference::onClickDisablePopup, this));	  	mCommitCallbackRegistrar.add("Pref.LogPath",				boost::bind(&LLFloaterPreference::onClickLogPath, this)); -	mCommitCallbackRegistrar.add("Pref.HardwareSettings",       boost::bind(&LLFloaterPreference::onOpenHardwareSettings, this));	 -	mCommitCallbackRegistrar.add("Pref.HardwareDefaults",       boost::bind(&LLFloaterPreference::setHardwareDefaults, this));	 -	mCommitCallbackRegistrar.add("Pref.VertexShaderEnable",     boost::bind(&LLFloaterPreference::onVertexShaderEnable, this));	 -	mCommitCallbackRegistrar.add("Pref.WindowedMod",            boost::bind(&LLFloaterPreference::onCommitWindowedMode, this));	 -	mCommitCallbackRegistrar.add("Pref.UpdateSliderText",       boost::bind(&LLFloaterPreference::onUpdateSliderText,this, _1,_2));	 -	mCommitCallbackRegistrar.add("Pref.QualityPerformance",     boost::bind(&LLFloaterPreference::onChangeQuality, this, _2));	 +	mCommitCallbackRegistrar.add("Pref.HardwareSettings",		boost::bind(&LLFloaterPreference::onOpenHardwareSettings, this)); +	mCommitCallbackRegistrar.add("Pref.HardwareDefaults",		boost::bind(&LLFloaterPreference::setHardwareDefaults, this)); +	mCommitCallbackRegistrar.add("Pref.VertexShaderEnable",		boost::bind(&LLFloaterPreference::onVertexShaderEnable, this)); +	mCommitCallbackRegistrar.add("Pref.WindowedMod",			boost::bind(&LLFloaterPreference::onCommitWindowedMode, this)); +	mCommitCallbackRegistrar.add("Pref.UpdateSliderText",		boost::bind(&LLFloaterPreference::onUpdateSliderText,this, _1,_2)); +	mCommitCallbackRegistrar.add("Pref.QualityPerformance",		boost::bind(&LLFloaterPreference::onChangeQuality, this, _2));  	mCommitCallbackRegistrar.add("Pref.applyUIColor",			boost::bind(&LLFloaterPreference::applyUIColor, this ,_1, _2));  	mCommitCallbackRegistrar.add("Pref.getUIColor",				boost::bind(&LLFloaterPreference::getUIColor, this ,_1, _2));  	mCommitCallbackRegistrar.add("Pref.MaturitySettings",		boost::bind(&LLFloaterPreference::onChangeMaturity, this));  	mCommitCallbackRegistrar.add("Pref.BlockList",				boost::bind(&LLFloaterPreference::onClickBlockList, this)); +	mCommitCallbackRegistrar.add("Pref.Proxy",					boost::bind(&LLFloaterPreference::onClickProxySettings, this));  	sSkin = gSavedSettings.getString("SkinCurrent"); @@ -457,7 +459,7 @@ BOOL LLFloaterPreference::postBuild()  void LLFloaterPreference::onBusyResponseChanged()  {  	// set "BusyResponseChanged" TRUE if user edited message differs from default, FALSE otherwise -	if(LLTrans::getString("BusyModeResponseDefault") != getChild<LLUICtrl>("busy_response")->getValue().asString()) +	if (LLTrans::getString("BusyModeResponseDefault") != getChild<LLUICtrl>("busy_response")->getValue().asString())  	{  		gSavedPerAccountSettings.setBOOL("BusyResponseChanged", TRUE );  	} @@ -539,7 +541,7 @@ void LLFloaterPreference::apply()  	LLViewerMedia::setCookiesEnabled(getChild<LLUICtrl>("cookies_enabled")->getValue()); -	if(hasChild("web_proxy_enabled") &&hasChild("web_proxy_editor") && hasChild("web_proxy_port")) +	if (hasChild("web_proxy_enabled") &&hasChild("web_proxy_editor") && hasChild("web_proxy_port"))  	{  		bool proxy_enable = getChild<LLUICtrl>("web_proxy_enabled")->getValue();  		std::string proxy_address = getChild<LLUICtrl>("web_proxy_editor")->getValue(); @@ -552,13 +554,13 @@ void LLFloaterPreference::apply()  	gSavedSettings.setBOOL("PlainTextChatHistory", getChild<LLUICtrl>("plain_text_chat_history")->getValue().asBoolean()); -	if(mGotPersonalInfo) +	if (mGotPersonalInfo)  	{   //		gSavedSettings.setString("BusyModeResponse2", std::string(wstring_to_utf8str(busy_response)));  		bool new_im_via_email = getChild<LLUICtrl>("send_im_to_email")->getValue().asBoolean();  		bool new_hide_online = getChild<LLUICtrl>("online_visibility")->getValue().asBoolean();		 -		if((new_im_via_email != mOriginalIMViaEmail) +		if ((new_im_via_email != mOriginalIMViaEmail)  			||(new_hide_online != mOriginalHideOnlineStatus))  		{  			// This hack is because we are representing several different 	  @@ -566,13 +568,13 @@ void LLFloaterPreference::apply()  			// can only select between 2 values, we represent it as a 	   			// checkbox. This breaks down a little bit for liaisons, but 	   			// works out in the end. 	  -			if(new_hide_online != mOriginalHideOnlineStatus) 	  -			{ 	  -				if(new_hide_online) mDirectoryVisibility = VISIBILITY_HIDDEN; +			if (new_hide_online != mOriginalHideOnlineStatus) +			{ +				if (new_hide_online) mDirectoryVisibility = VISIBILITY_HIDDEN;  				else mDirectoryVisibility = VISIBILITY_DEFAULT;  			 //Update showonline value, otherwise multiple applys won't work  				mOriginalHideOnlineStatus = new_hide_online; -			} 	  +			}  			gAgent.sendAgentUpdateUserInfo(new_im_via_email,mDirectoryVisibility);  		}  	} @@ -616,6 +618,11 @@ void LLFloaterPreference::cancel()  		updateDoubleClickControls();  		mDoubleClickActionDirty = false;  	} +	LLFloaterPreferenceProxy * advanced_proxy_settings = LLFloaterReg::findTypedInstance<LLFloaterPreferenceProxy>("prefs_proxy"); +	if (advanced_proxy_settings) +	{ +		advanced_proxy_settings->cancel(); +	}  }  void LLFloaterPreference::onOpen(const LLSD& key) @@ -799,7 +806,7 @@ void LLFloaterPreference::onBtnCancel()  void LLFloaterPreference::updateUserInfo(const std::string& visibility, bool im_via_email, const std::string& email)  {  	LLFloaterPreference* instance = LLFloaterReg::findTypedInstance<LLFloaterPreference>("preferences"); -	if(instance) +	if (instance)  	{  		instance->setPersonalInfo(visibility, im_via_email, email);	  	} @@ -809,7 +816,7 @@ void LLFloaterPreference::updateUserInfo(const std::string& visibility, bool im_  void LLFloaterPreference::refreshEnabledGraphics()  {  	LLFloaterPreference* instance = LLFloaterReg::findTypedInstance<LLFloaterPreference>("preferences"); -	if(instance) +	if (instance)  	{  		instance->refresh();  		//instance->refreshEnabledState(); @@ -1096,7 +1103,7 @@ void LLFloaterPreference::disableUnavailableSettings()  	LLCheckBoxCtrl* ctrl_dof = getChild<LLCheckBoxCtrl>("UseDoF");  	// if vertex shaders off, disable all shader related products -	if(!LLFeatureManager::getInstance()->isFeatureAvailable("VertexShaderEnable")) +	if (!LLFeatureManager::getInstance()->isFeatureAvailable("VertexShaderEnable"))  	{  		ctrl_shader_enable->setEnabled(FALSE);  		ctrl_shader_enable->setValue(FALSE); @@ -1127,7 +1134,7 @@ void LLFloaterPreference::disableUnavailableSettings()  	}  	// disabled windlight -	if(!LLFeatureManager::getInstance()->isFeatureAvailable("WindLightUseAtmosShaders")) +	if (!LLFeatureManager::getInstance()->isFeatureAvailable("WindLightUseAtmosShaders"))  	{  		ctrl_wind_light->setEnabled(FALSE);  		ctrl_wind_light->setValue(FALSE); @@ -1164,28 +1171,28 @@ void LLFloaterPreference::disableUnavailableSettings()  	}  	// disabled deferred SSAO -	if(!LLFeatureManager::getInstance()->isFeatureAvailable("RenderDeferredSSAO")) +	if (!LLFeatureManager::getInstance()->isFeatureAvailable("RenderDeferredSSAO"))  	{  		ctrl_ssao->setEnabled(FALSE);  		ctrl_ssao->setValue(FALSE);  	}  	// disabled deferred shadows -	if(!LLFeatureManager::getInstance()->isFeatureAvailable("RenderShadowDetail")) +	if (!LLFeatureManager::getInstance()->isFeatureAvailable("RenderShadowDetail"))  	{  		ctrl_shadows->setEnabled(FALSE);  		ctrl_shadows->setValue(0);  	}  	// disabled reflections -	if(!LLFeatureManager::getInstance()->isFeatureAvailable("RenderReflectionDetail")) +	if (!LLFeatureManager::getInstance()->isFeatureAvailable("RenderReflectionDetail"))  	{  		ctrl_reflections->setEnabled(FALSE);  		ctrl_reflections->setValue(FALSE);  	}  	// disabled av -	if(!LLFeatureManager::getInstance()->isFeatureAvailable("RenderAvatarVP")) +	if (!LLFeatureManager::getInstance()->isFeatureAvailable("RenderAvatarVP"))  	{  		ctrl_avatar_vp->setEnabled(FALSE);  		ctrl_avatar_vp->setValue(FALSE); @@ -1208,14 +1215,14 @@ void LLFloaterPreference::disableUnavailableSettings()  	}  	// disabled cloth -	if(!LLFeatureManager::getInstance()->isFeatureAvailable("RenderAvatarCloth")) +	if (!LLFeatureManager::getInstance()->isFeatureAvailable("RenderAvatarCloth"))  	{  		ctrl_avatar_cloth->setEnabled(FALSE);  		ctrl_avatar_cloth->setValue(FALSE);  	}  	// disabled impostors -	if(!LLFeatureManager::getInstance()->isFeatureAvailable("RenderUseImpostors")) +	if (!LLFeatureManager::getInstance()->isFeatureAvailable("RenderUseImpostors"))  	{  		ctrl_avatar_impostors->setEnabled(FALSE);  		ctrl_avatar_impostors->setValue(FALSE); @@ -1381,12 +1388,12 @@ void LLFloaterPreference::setPersonalInfo(const std::string& visibility, bool im  	mOriginalIMViaEmail = im_via_email;  	mDirectoryVisibility = visibility; -	if(visibility == VISIBILITY_DEFAULT) +	if (visibility == VISIBILITY_DEFAULT)  	{  		mOriginalHideOnlineStatus = false;  		getChildView("online_visibility")->setEnabled(TRUE); 	   	} -	else if(visibility == VISIBILITY_HIDDEN) +	else if (visibility == VISIBILITY_HIDDEN)  	{  		mOriginalHideOnlineStatus = true;  		getChildView("online_visibility")->setEnabled(TRUE); 	  @@ -1434,7 +1441,7 @@ void LLFloaterPreference::onUpdateSliderText(LLUICtrl* ctrl, const LLSD& name)  {  	std::string ctrl_name = name.asString(); -	if((ctrl_name =="" )|| !hasChild(ctrl_name, true)) +	if ((ctrl_name =="" )|| !hasChild(ctrl_name, true))  		return;  	LLTextBox* text_box = getChild<LLTextBox>(name.asString()); @@ -1444,7 +1451,7 @@ void LLFloaterPreference::onUpdateSliderText(LLUICtrl* ctrl, const LLSD& name)  void LLFloaterPreference::updateSliderText(LLSliderCtrl* ctrl, LLTextBox* text_box)  { -	if(text_box == NULL || ctrl== NULL) +	if (text_box == NULL || ctrl== NULL)  		return;  	// get range and points when text should change @@ -1457,7 +1464,7 @@ void LLFloaterPreference::updateSliderText(LLSliderCtrl* ctrl, LLTextBox* text_b  	F32 highPoint = min + (2.0f * range / 3.0f);  	// choose the right text -	if(value < midPoint) +	if (value < midPoint)  	{  		text_box->setText(LLTrans::getString("GraphicsQualityLow"));  	}  @@ -1541,6 +1548,11 @@ void LLFloaterPreference::updateDoubleClickSettings()  	}  } +void LLFloaterPreference::onClickProxySettings() +{ +	LLFloaterReg::showInstance("prefs_proxy"); +} +  void LLFloaterPreference::updateDoubleClickControls()  {  	// check is one of double-click actions settings enabled @@ -1637,7 +1649,7 @@ BOOL LLPanelPreference::postBuild()  {  	////////////////////// PanelVoice /////////////////// -	if(hasChild("voice_unavailable")) +	if (hasChild("voice_unavailable"))  	{  		BOOL voice_disabled = gSavedSettings.getBOOL("CmdLineDisableVoice");  		getChildView("voice_unavailable")->setVisible( voice_disabled); @@ -1659,7 +1671,7 @@ BOOL LLPanelPreference::postBuild()  	} -	if(hasChild("online_visibility") && hasChild("send_im_to_email")) +	if (hasChild("online_visibility") && hasChild("send_im_to_email"))  	{  		getChild<LLUICtrl>("email_address")->setValue(getString("log_in_to_change") );  //		getChild<LLUICtrl>("busy_response")->setValue(getString("log_in_to_change"));		 @@ -1788,7 +1800,7 @@ void LLPanelPreference::cancel()  		 iter != mSavedColors.end(); ++iter)  	{  		LLColorSwatchCtrl* color_swatch = findChild<LLColorSwatchCtrl>(iter->first); -		if(color_swatch) +		if (color_swatch)  		{  			color_swatch->set(iter->second);  			color_swatch->onCommit(); @@ -1832,7 +1844,7 @@ void LLPanelPreferenceGraphics::draw()  	LLButton* button_apply = findChild<LLButton>("Apply"); -	if(button_apply && button_apply->getVisible()) +	if (button_apply && button_apply->getVisible())  	{  		bool enable = hasDirtyChilds(); @@ -1852,7 +1864,7 @@ bool LLPanelPreferenceGraphics::hasDirtyChilds()  		LLUICtrl* ctrl = dynamic_cast<LLUICtrl*>(curview);  		if (ctrl)  		{ -			if(ctrl->isDirty()) +			if (ctrl->isDirty())  				return true;  		}  		// Push children onto the end of the work stack @@ -1908,3 +1920,188 @@ void LLPanelPreferenceGraphics::setHardwareDefaults()  	resetDirtyChilds();  	LLPanelPreference::setHardwareDefaults();  } + +LLFloaterPreferenceProxy::LLFloaterPreferenceProxy(const LLSD& key) +	: LLFloater(key), +	  mSocksSettingsDirty(false) +{ +	mCommitCallbackRegistrar.add("Proxy.OK",                boost::bind(&LLFloaterPreferenceProxy::onBtnOk, this)); +	mCommitCallbackRegistrar.add("Proxy.Cancel",            boost::bind(&LLFloaterPreferenceProxy::onBtnCancel, this)); +	mCommitCallbackRegistrar.add("Proxy.Change",            boost::bind(&LLFloaterPreferenceProxy::onChangeSocksSettings, this)); +} + +LLFloaterPreferenceProxy::~LLFloaterPreferenceProxy() +{ +} + +BOOL LLFloaterPreferenceProxy::postBuild() +{ +	LLRadioGroup* socksAuth = getChild<LLRadioGroup>("socks5_auth_type"); +	if (!socksAuth) +	{ +		return FALSE; +	} +	if (socksAuth->getSelectedValue().asString() == "None") +	{ +		getChild<LLLineEditor>("socks5_username")->setEnabled(false); +		getChild<LLLineEditor>("socks5_password")->setEnabled(false); +	} +	else +	{ +		// Populate the SOCKS 5 credential fields with protected values. +		LLPointer<LLCredential> socks_cred = gSecAPIHandler->loadCredential("SOCKS5"); +		getChild<LLLineEditor>("socks5_username")->setValue(socks_cred->getIdentifier()["username"].asString()); +		getChild<LLLineEditor>("socks5_password")->setValue(socks_cred->getAuthenticator()["creds"].asString()); +	} + +	center(); +	return TRUE; +} + +void LLFloaterPreferenceProxy::onOpen(const LLSD& key) +{ +	saveSettings(); +} + +void LLFloaterPreferenceProxy::onClose(bool app_quitting) +{ +	if (mSocksSettingsDirty) +	{ + +		// If the user plays with the Socks proxy settings after login, it's only fair we let them know +		// it will not be updated until next restart. +		if (LLStartUp::getStartupState()>STATE_LOGIN_WAIT) +		{ +			LLNotifications::instance().add("ChangeProxySettings", LLSD(), LLSD()); +			mSocksSettingsDirty = false; // we have notified the user now be quiet again +		} +	} +} + +void LLFloaterPreferenceProxy::saveSettings() +{ +	// Save the value of all controls in the hierarchy +	mSavedValues.clear(); +	std::list<LLView*> view_stack; +	view_stack.push_back(this); +	while(!view_stack.empty()) +	{ +		// Process view on top of the stack +		LLView* curview = view_stack.front(); +		view_stack.pop_front(); + +		LLUICtrl* ctrl = dynamic_cast<LLUICtrl*>(curview); +		if (ctrl) +		{ +			LLControlVariable* control = ctrl->getControlVariable(); +			if (control) +			{ +				mSavedValues[control] = control->getValue(); +			} +		} + +		// Push children onto the end of the work stack +		for (child_list_t::const_iterator iter = curview->getChildList()->begin(); +				iter != curview->getChildList()->end(); ++iter) +		{ +			view_stack.push_back(*iter); +		} +	} +} + +void LLFloaterPreferenceProxy::onBtnOk() +{ +	// commit any outstanding text entry +	if (hasFocus()) +	{ +		LLUICtrl* cur_focus = dynamic_cast<LLUICtrl*>(gFocusMgr.getKeyboardFocus()); +		if (cur_focus && cur_focus->acceptsTextInput()) +		{ +			cur_focus->onCommit(); +		} +	} + +	// Save SOCKS proxy credentials securely if password auth is enabled +	LLRadioGroup* socksAuth = getChild<LLRadioGroup>("socks5_auth_type"); +	if (socksAuth->getSelectedValue().asString() == "UserPass") +	{ +		LLSD socks_id = LLSD::emptyMap(); +		socks_id["type"] = "SOCKS5"; +		socks_id["username"] = getChild<LLLineEditor>("socks5_username")->getValue().asString(); + +		LLSD socks_authenticator = LLSD::emptyMap(); +		socks_authenticator["type"] = "SOCKS5"; +		socks_authenticator["creds"] = getChild<LLLineEditor>("socks5_password")->getValue().asString(); + +		// Using "SOCKS5" as the "grid" argument since the same proxy +		// settings will be used for all grids and because there is no +		// way to specify the type of credential. +		LLPointer<LLCredential> socks_cred = gSecAPIHandler->createCredential("SOCKS5", socks_id, socks_authenticator); +		gSecAPIHandler->saveCredential(socks_cred, true); +	} +	else +	{ +		// Clear SOCKS5 credentials since they are no longer needed. +		LLPointer<LLCredential> socks_cred = new LLCredential("SOCKS5"); +		gSecAPIHandler->deleteCredential(socks_cred); +	} + +	closeFloater(false); +} + +void LLFloaterPreferenceProxy::onBtnCancel() +{ +	if (hasFocus()) +	{ +		LLUICtrl* cur_focus = dynamic_cast<LLUICtrl*>(gFocusMgr.getKeyboardFocus()); +		if (cur_focus && cur_focus->acceptsTextInput()) +		{ +			cur_focus->onCommit(); +		} +		refresh(); +	} + +	cancel(); +} + +void LLFloaterPreferenceProxy::cancel() +{ + +	for (control_values_map_t::iterator iter =  mSavedValues.begin(); +			iter !=  mSavedValues.end(); ++iter) +	{ +		LLControlVariable* control = iter->first; +		LLSD ctrl_value = iter->second; +		control->set(ctrl_value); +	} + +	closeFloater(); +} + +void LLFloaterPreferenceProxy::onChangeSocksSettings()  +{ +	mSocksSettingsDirty = true; + +	LLRadioGroup* socksAuth = getChild<LLRadioGroup>("socks5_auth_type"); +	if (socksAuth->getSelectedValue().asString() == "None") +	{ +		getChild<LLLineEditor>("socks5_username")->setEnabled(false); +		getChild<LLLineEditor>("socks5_password")->setEnabled(false); +	} +	else +	{ +		getChild<LLLineEditor>("socks5_username")->setEnabled(true); +		getChild<LLLineEditor>("socks5_password")->setEnabled(true); +	} + +	// Check for invalid states for the other HTTP proxy radio +	LLRadioGroup* otherHttpProxy = getChild<LLRadioGroup>("other_http_proxy_type"); +	if ((otherHttpProxy->getSelectedValue().asString() == "Socks" && +			getChild<LLCheckBoxCtrl>("socks_proxy_enabled")->get() == FALSE )||( +					otherHttpProxy->getSelectedValue().asString() == "Web" && +					getChild<LLCheckBoxCtrl>("web_proxy_enabled")->get() == FALSE ) ) +	{ +		otherHttpProxy->selectFirstItem(); +	} + +}; diff --git a/indra/newview/llfloaterpreference.h b/indra/newview/llfloaterpreference.h index 61f2c78640..ef9bc2dd53 100644 --- a/indra/newview/llfloaterpreference.h +++ b/indra/newview/llfloaterpreference.h @@ -156,6 +156,7 @@ public:  	void applyResolution();  	void onChangeMaturity();  	void onClickBlockList(); +	void onClickProxySettings();  	void applyUIColor(LLUICtrl* ctrl, const LLSD& param);  	void getUIColor(LLUICtrl* ctrl, const LLSD& param); @@ -229,4 +230,33 @@ protected:  }; +class LLFloaterPreferenceProxy : public LLFloater +{ +public:  +	LLFloaterPreferenceProxy(const LLSD& key); +	~LLFloaterPreferenceProxy(); + +	/// show off our menu +	static void show(); +	void cancel(); +	 +protected: +	BOOL postBuild(); +	void onOpen(const LLSD& key); +	void onClose(bool app_quitting); +	void saveSettings(); +	void onBtnOk(); +	void onBtnCancel(); + +	void onChangeSocksSettings(); + +private: +	 +	bool mSocksSettingsDirty; +	typedef std::map<LLControlVariable*, LLSD> control_values_map_t; +	control_values_map_t mSavedValues; + +}; + +  #endif  // LL_LLPREFERENCEFLOATER_H diff --git a/indra/newview/llfolderview.cpp b/indra/newview/llfolderview.cpp index 6461a5525e..ec162e00eb 100644 --- a/indra/newview/llfolderview.cpp +++ b/indra/newview/llfolderview.cpp @@ -1912,9 +1912,20 @@ BOOL LLFolderView::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,  	// when drop is not handled by child, it should be handled  	// by the folder which is the hierarchy root. -	if (!handled && getListener()->getUUID().notNull()) +	if (!handled)  	{ -		LLFolderViewFolder::handleDragAndDrop(x, y, mask, drop, cargo_type, cargo_data, accept, tooltip_msg); +		if (getListener()->getUUID().notNull()) +		{ +			LLFolderViewFolder::handleDragAndDrop(x, y, mask, drop, cargo_type, cargo_data, accept, tooltip_msg); +		} +		else +		{ +			if (!mFolders.empty()) +			{ +				// dispatch to last folder as a hack to support "Contents" folder in object inventory +				handled = mFolders.back()->handleDragAndDropFromChild(mask,drop,cargo_type,cargo_data,accept,tooltip_msg); +			} +		}  	}  	if (handled) diff --git a/indra/newview/llloginhandler.cpp b/indra/newview/llloginhandler.cpp index 48be251611..9b4f146332 100644 --- a/indra/newview/llloginhandler.cpp +++ b/indra/newview/llloginhandler.cpp @@ -30,13 +30,13 @@  // viewer includes  #include "llsecapi.h" -#include "lllogininstance.h"        // to check if logged in yet -#include "llpanellogin.h"			// save_password_to_disk() +#include "lllogininstance.h"		// to check if logged in yet +#include "llpanellogin.h"  #include "llstartup.h"				// getStartupState()  #include "llslurl.h"  #include "llviewercontrol.h"		// gSavedSettings  #include "llviewernetwork.h"		// EGridInfo -#include "llviewerwindow.h"                    // getWindow() +#include "llviewerwindow.h"			// getWindow()  // library includes  #include "llmd5.h" diff --git a/indra/newview/lllogininstance.cpp b/indra/newview/lllogininstance.cpp index b20f89aa7c..f00d6087f9 100644 --- a/indra/newview/lllogininstance.cpp +++ b/indra/newview/lllogininstance.cpp @@ -568,7 +568,7 @@ void LLLoginInstance::constructAuthParams(LLPointer<LLCredential> user_credentia  	else  	{  		requested_options.append("basic-mode"); -		requested_options.append("inventory-basic"); +		//requested_options.append("inventory-basic");  	}  #endif diff --git a/indra/newview/llpanellogin.h b/indra/newview/llpanellogin.h index b29b3af7ca..4078eedc77 100644 --- a/indra/newview/llpanellogin.h +++ b/indra/newview/llpanellogin.h @@ -113,7 +113,4 @@ private:  	static BOOL		sCapslockDidNotification;  }; -std::string load_password_from_disk(void); -void save_password_to_disk(const char* hashed_password); -  #endif diff --git a/indra/newview/llsecapi.h b/indra/newview/llsecapi.h index 8e4c2c56c6..0935a0005b 100644 --- a/indra/newview/llsecapi.h +++ b/indra/newview/llsecapi.h @@ -286,8 +286,8 @@ bool operator!=(const LLCertificateVector::iterator& _lhs, const LLCertificateVe  #define CRED_AUTHENTICATOR_TYPE_HASH   "hash"  //  // LLCredential - interface for credentials providing the following functionality: -// * persistance of credential information based on grid (for saving username/password) -// * serialization to an OGP identifier/authenticator pair +// * Persistence of credential information based on grid (for saving username/password) +// * Serialization to an OGP identifier/authenticator pair  //   class LLCredential  : public LLRefCount  { diff --git a/indra/newview/llsechandler_basic.cpp b/indra/newview/llsechandler_basic.cpp index 904bb03270..8d64c8c04f 100644 --- a/indra/newview/llsechandler_basic.cpp +++ b/indra/newview/llsechandler_basic.cpp @@ -1005,6 +1005,8 @@ void LLBasicCertificateStore::validate(int validation_policy,  									   LLPointer<LLCertificateChain> cert_chain,  									   const LLSD& validation_params)  { +	// If --no-verify-ssl-cert was passed on the command line, stop right now. +	if (gSavedSettings.getBOOL("NoVerifySSLCert")) return;  	if(cert_chain->size() < 1)  	{ diff --git a/indra/newview/llspatialpartition.cpp b/indra/newview/llspatialpartition.cpp index e23b431457..fd17781a2e 100644 --- a/indra/newview/llspatialpartition.cpp +++ b/indra/newview/llspatialpartition.cpp @@ -523,6 +523,11 @@ void LLSpatialGroup::clearDrawMap()  	mDrawMap.clear();  } +BOOL LLSpatialGroup::isHUDGroup()  +{ +	return mSpatialPartition && mSpatialPartition->isHUDPartition() ;  +} +  BOOL LLSpatialGroup::isRecentlyVisible() const  {  	return (LLDrawable::getCurrentFrame() - mVisible[LLViewerCamera::sCurCameraID]) < LLDrawable::getMinVisFrameRange() ; @@ -4155,6 +4160,10 @@ void LLSpatialGroup::drawObjectBox(LLColor4 col)  	drawBox(mObjectBounds[0], size);  } +bool LLSpatialPartition::isHUDPartition()  +{  +	return mPartitionType == LLViewerRegion::PARTITION_HUD ; +}   BOOL LLSpatialPartition::isVisible(const LLVector3& v)  { diff --git a/indra/newview/llspatialpartition.h b/indra/newview/llspatialpartition.h index 54d5d36f6e..11955540c6 100644 --- a/indra/newview/llspatialpartition.h +++ b/indra/newview/llspatialpartition.h @@ -282,6 +282,7 @@ public:  	LLSpatialGroup(OctreeNode* node, LLSpatialPartition* part); +	BOOL isHUDGroup() ;  	BOOL isDead()							{ return isState(DEAD); }  	BOOL isState(U32 state) const;	  	BOOL isOcclusionState(U32 state) const	{ return mOcclusionState[LLViewerCamera::sCurCameraID] & state ? TRUE : FALSE; } @@ -470,6 +471,7 @@ public:  	S32 cull(LLCamera &camera, std::vector<LLDrawable *>* results = NULL, BOOL for_select = FALSE); // Cull on arbitrary frustum  	BOOL isVisible(const LLVector3& v); +	bool isHUDPartition() ;  	virtual LLSpatialBridge* asBridge() { return NULL; }  	virtual BOOL isBridge() { return asBridge() != NULL; } diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp index 7991233ace..749acea6c1 100644 --- a/indra/newview/llstartup.cpp +++ b/indra/newview/llstartup.cpp @@ -126,6 +126,7 @@  #include "llpanelgroupnotices.h"  #include "llpreview.h"  #include "llpreviewscript.h" +#include "llproxy.h"  #include "llproductinforequest.h"  #include "llsecondlifeurls.h"  #include "llselectmgr.h" @@ -386,6 +387,14 @@ bool idle_startup()  			LLNotificationsUtil::add(gViewerWindow->getInitAlert());  		} +		//------------------------------------------------- +		// Init the SOCKS 5 proxy if the user has configured +		// one. We need to do this early in case the user +		// is using SOCKS for HTTP so we get the login +		// screen and HTTP tables via SOCKS. +		//------------------------------------------------- +		LLStartUp::startLLProxy(); +  		gSavedSettings.setS32("LastFeatureVersion", LLFeatureManager::getInstance()->getVersion());  		gSavedSettings.setS32("LastGPUClass", LLFeatureManager::getInstance()->getGPUClass()); @@ -591,7 +600,7 @@ bool idle_startup()  		}  		LL_INFOS("AppInit") << "Message System Initialized." << LL_ENDL; -		 +  		//-------------------------------------------------  		// Init audio, which may be needed for prefs dialog  		// or audio cues in connection UI. @@ -800,7 +809,21 @@ bool idle_startup()  	if (STATE_LOGIN_CLEANUP == LLStartUp::getStartupState())  	{ -		//reset the values that could have come in from a slurl +		// Post login screen, we should see if any settings have changed that may +		// require us to either start/stop or change the socks proxy. As various communications +		// past this point may require the proxy to be up. +		if (!LLStartUp::startLLProxy()) +		{ +			// Proxy start up failed, we should now bail the state machine +			// startLLProxy() will have reported an error to the user +			// already, so we just go back to the login screen. The user +			// could then change the preferences to fix the issue. + +			LLStartUp::setStartupState(STATE_LOGIN_SHOW); +			return FALSE; +		} + +		// reset the values that could have come in from a slurl  		// DEV-42215: Make sure they're not empty -- gUserCredential  		// might already have been set from gSavedSettings, and it's too bad  		// to overwrite valid values with empty strings. @@ -2556,22 +2579,32 @@ void init_start_screen(S32 location_id)  	else if(!start_image_bmp->load(temp_str) )  	{  		LL_WARNS("AppInit") << "Bitmap load failed" << LL_ENDL; -		return; +		gStartTexture = NULL;  	} +	else +	{ +		gStartImageWidth = start_image_bmp->getWidth(); +		gStartImageHeight = start_image_bmp->getHeight(); -	gStartImageWidth = start_image_bmp->getWidth(); -	gStartImageHeight = start_image_bmp->getHeight(); +		LLPointer<LLImageRaw> raw = new LLImageRaw; +		if (!start_image_bmp->decode(raw, 0.0f)) +		{ +			LL_WARNS("AppInit") << "Bitmap decode failed" << LL_ENDL; +			gStartTexture = NULL; +		} +		else +		{ +			raw->expandToPowerOfTwo(); +			gStartTexture = LLViewerTextureManager::getLocalTexture(raw.get(), FALSE) ; +		} +	} -	LLPointer<LLImageRaw> raw = new LLImageRaw; -	if (!start_image_bmp->decode(raw, 0.0f)) +	if(gStartTexture.isNull())  	{ -		LL_WARNS("AppInit") << "Bitmap decode failed" << LL_ENDL; -		gStartTexture = NULL; -		return; +		gStartTexture = LLViewerTexture::sBlackImagep ; +		gStartImageWidth = gStartTexture->getWidth() ; +		gStartImageHeight = gStartTexture->getHeight() ;  	} - -	raw->expandToPowerOfTwo(); -	gStartTexture = LLViewerTextureManager::getLocalTexture(raw.get(), FALSE) ;  } @@ -2758,6 +2791,171 @@ void LLStartUp::setStartSLURL(const LLSLURL& slurl)      }  } +/** + * Read all proxy configuration settings and set up both the HTTP proxy and + * SOCKS proxy as needed. + * + * Any errors that are encountered will result in showing the user a notification. + * When an error is encountered, + * + * @return Returns true if setup was successful, false if an error was encountered. + */ +bool LLStartUp::startLLProxy() +{ +	bool proxy_ok = true; +	std::string httpProxyType = gSavedSettings.getString("HttpProxyType"); + +	// Set up SOCKS proxy (if needed) +	if (gSavedSettings.getBOOL("Socks5ProxyEnabled")) +	{	 +		// Determine and update LLProxy with the saved authentication system +		std::string auth_type = gSavedSettings.getString("Socks5AuthType"); + +		if (auth_type.compare("UserPass") == 0) +		{ +			LLPointer<LLCredential> socks_cred = gSecAPIHandler->loadCredential("SOCKS5"); +			std::string socks_user = socks_cred->getIdentifier()["username"].asString(); +			std::string socks_password = socks_cred->getAuthenticator()["creds"].asString(); + +			bool ok = LLProxy::getInstance()->setAuthPassword(socks_user, socks_password); + +			if (!ok) +			{ +				LLNotificationsUtil::add("SOCKS_BAD_CREDS"); +				proxy_ok = false; +			} +		} +		else if (auth_type.compare("None") == 0) +		{ +			LLProxy::getInstance()->setAuthNone(); +		} +		else +		{ +			LL_WARNS("Proxy") << "Invalid SOCKS 5 authentication type."<< LL_ENDL; + +			// Unknown or missing setting. +			gSavedSettings.setString("Socks5AuthType", "None"); + +			// Clear the SOCKS credentials. +			LLPointer<LLCredential> socks_cred = new LLCredential("SOCKS5"); +			gSecAPIHandler->deleteCredential(socks_cred); + +			LLProxy::getInstance()->setAuthNone(); +		} + +		if (proxy_ok) +		{ +			// Start the proxy and check for errors +			// If status != SOCKS_OK, stopSOCKSProxy() will already have been called when startSOCKSProxy() returns. +			LLHost socks_host; +			socks_host.setHostByName(gSavedSettings.getString("Socks5ProxyHost")); +			socks_host.setPort(gSavedSettings.getU32("Socks5ProxyPort")); +			int status = LLProxy::getInstance()->startSOCKSProxy(socks_host); + +			if (status != SOCKS_OK) +			{ +				LLSD subs; +				subs["HOST"] = gSavedSettings.getString("Socks5ProxyHost"); +				subs["PORT"] = (S32)gSavedSettings.getU32("Socks5ProxyPort"); + +				std::string error_string; + +				switch(status) +				{ +					case SOCKS_CONNECT_ERROR: // TCP Fail +						error_string = "SOCKS_CONNECT_ERROR"; +						break; + +					case SOCKS_NOT_PERMITTED: // SOCKS 5 server rule set refused connection +						error_string = "SOCKS_NOT_PERMITTED"; +						break; + +					case SOCKS_NOT_ACCEPTABLE: // Selected authentication is not acceptable to server +						error_string = "SOCKS_NOT_ACCEPTABLE"; +						break; + +					case SOCKS_AUTH_FAIL: // Authentication failed +						error_string = "SOCKS_AUTH_FAIL"; +						break; + +					case SOCKS_UDP_FWD_NOT_GRANTED: // UDP forward request failed +						error_string = "SOCKS_UDP_FWD_NOT_GRANTED"; +						break; + +					case SOCKS_HOST_CONNECT_FAILED: // Failed to open a TCP channel to the socks server +						error_string = "SOCKS_HOST_CONNECT_FAILED"; +						break; + +					case SOCKS_INVALID_HOST: // Improperly formatted host address or port. +						error_string = "SOCKS_INVALID_HOST"; +						break; + +					default: +						error_string = "SOCKS_UNKNOWN_STATUS"; // Something strange happened, +						LL_WARNS("Proxy") << "Unknown return from LLProxy::startProxy(): " << status << LL_ENDL; +						break; +				} + +				LLNotificationsUtil::add(error_string, subs); +				proxy_ok = false; +			} +		} +	} +	else +	{ +		LLProxy::getInstance()->stopSOCKSProxy(); // ensure no UDP proxy is running and it's all cleaned up +	} + +	if (proxy_ok) +	{ +		// Determine the HTTP proxy type (if any) +		if ((httpProxyType.compare("Web") == 0) && gSavedSettings.getBOOL("BrowserProxyEnabled")) +		{ +			LLHost http_host; +			http_host.setHostByName(gSavedSettings.getString("BrowserProxyAddress")); +			http_host.setPort(gSavedSettings.getS32("BrowserProxyPort")); +			if (!LLProxy::getInstance()->enableHTTPProxy(http_host, LLPROXY_HTTP)) +			{ +				LLSD subs; +				subs["HOST"] = http_host.getIPString(); +				subs["PORT"] = (S32)http_host.getPort(); +				LLNotificationsUtil::add("PROXY_INVALID_HTTP_HOST", subs); +				proxy_ok = false; +			} +		} +		else if ((httpProxyType.compare("Socks") == 0) && gSavedSettings.getBOOL("Socks5ProxyEnabled")) +		{ +			LLHost socks_host; +			socks_host.setHostByName(gSavedSettings.getString("Socks5ProxyHost")); +			socks_host.setPort(gSavedSettings.getU32("Socks5ProxyPort")); +			if (!LLProxy::getInstance()->enableHTTPProxy(socks_host, LLPROXY_SOCKS)) +			{ +				LLSD subs; +				subs["HOST"] = socks_host.getIPString(); +				subs["PORT"] = (S32)socks_host.getPort(); +				LLNotificationsUtil::add("PROXY_INVALID_SOCKS_HOST", subs); +				proxy_ok = false; +			} +		} +		else if (httpProxyType.compare("None") == 0) +		{ +			LLProxy::getInstance()->disableHTTPProxy(); +		} +		else +		{ +			LL_WARNS("Proxy") << "Invalid other HTTP proxy configuration."<< LL_ENDL; + +			// Set the missing or wrong configuration back to something valid. +			gSavedSettings.setString("HttpProxyType", "None"); +			LLProxy::getInstance()->disableHTTPProxy(); + +			// Leave proxy_ok alone, since this isn't necessarily fatal. +		} +	} + +	return proxy_ok; +} +  bool login_alert_done(const LLSD& notification, const LLSD& response)  {  	LLPanelLogin::giveFocus(); diff --git a/indra/newview/llstartup.h b/indra/newview/llstartup.h index b3d9ef1dcc..99a644eb9c 100644 --- a/indra/newview/llstartup.h +++ b/indra/newview/llstartup.h @@ -113,6 +113,8 @@ public:  	static void setStartSLURL(const LLSLURL& slurl);   	static LLSLURL& getStartSLURL() { return sStartSLURL; }  +	static bool startLLProxy(); // Initialize the SOCKS 5 proxy +  private:  	static LLSLURL sStartSLURL; diff --git a/indra/newview/llviewerfloaterreg.cpp b/indra/newview/llviewerfloaterreg.cpp index dd0989d608..fecc6d91bd 100644 --- a/indra/newview/llviewerfloaterreg.cpp +++ b/indra/newview/llviewerfloaterreg.cpp @@ -232,6 +232,7 @@ void LLViewerFloaterReg::registerFloaters()  	LLFloaterReg::add("postcard", "floater_postcard.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterPostcard>);  	LLFloaterReg::add("preferences", "floater_preferences.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterPreference>); +	LLFloaterReg::add("prefs_proxy", "floater_preferences_proxy.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterPreferenceProxy>);  	LLFloaterReg::add("prefs_hardware_settings", "floater_hardware_settings.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterHardwareSettings>);  	LLFloaterReg::add("perm_prefs", "floater_perm_prefs.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterPerms>);  	LLFloaterReg::add("pref_joystick", "floater_joystick.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterJoystick>); diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index 321d02aaf1..64aeb750c6 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -1049,48 +1049,26 @@ void start_new_inventory_observer()  class LLDiscardAgentOffer : public LLInventoryFetchItemsObserver  {  	LOG_CLASS(LLDiscardAgentOffer); +  public:  	LLDiscardAgentOffer(const LLUUID& folder_id, const LLUUID& object_id) :  		LLInventoryFetchItemsObserver(object_id),  		mFolderID(folder_id),  		mObjectID(object_id) {} -	virtual ~LLDiscardAgentOffer() {} +  	virtual void done()  	{  		LL_DEBUGS("Messaging") << "LLDiscardAgentOffer::done()" << LL_ENDL; -		const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH); -		bool notify = false; -		if(trash_id.notNull() && mObjectID.notNull()) -		{ -			LLInventoryModel::update_list_t update; -			LLInventoryModel::LLCategoryUpdate old_folder(mFolderID, -1); -			update.push_back(old_folder); -			LLInventoryModel::LLCategoryUpdate new_folder(trash_id, 1); -			update.push_back(new_folder); -			gInventory.accountForUpdate(update); -			gInventory.moveObject(mObjectID, trash_id); -			LLInventoryObject* obj = gInventory.getObject(mObjectID); -			if(obj) -			{ -				// no need to restamp since this is already a freshly -				// stamped item. -				obj->updateParentOnServer(FALSE); -				notify = true; -			} -		} -		else -		{ -			LL_WARNS("Messaging") << "DiscardAgentOffer unable to find: " -					<< (trash_id.isNull() ? "trash " : "") -					<< (mObjectID.isNull() ? "object" : "") << LL_ENDL; -		} + +		// We're invoked from LLInventoryModel::notifyObservers(). +		// If we now try to remove the inventory item, it will cause a nested +		// notifyObservers() call, which won't work. +		// So defer moving the item to trash until viewer gets idle (in a moment). +		LLAppViewer::instance()->addOnIdleCallback(boost::bind(&LLInventoryModel::removeItem, &gInventory, mObjectID));  		gInventory.removeObserver(this); -		if(notify) -		{ -			gInventory.notifyObservers(); -		}  		delete this;  	} +  protected:  	LLUUID mFolderID;  	LLUUID mObjectID; @@ -1495,7 +1473,7 @@ bool LLOfferInfo::inventory_offer_callback(const LLSD& notification, const LLSD&  	LLChat chat;  	std::string log_message;  	S32 button = LLNotificationsUtil::getSelectedOption(notification, response); -	 +  	LLInventoryObserver* opener = NULL;  	LLViewerInventoryCategory* catp = NULL;  	catp = (LLViewerInventoryCategory*)gInventory.getCategory(mObjectID); @@ -1527,7 +1505,7 @@ bool LLOfferInfo::inventory_offer_callback(const LLSD& notification, const LLSD&  	// TODO: when task inventory offers can also be handled the new way, migrate the code that sets these strings here:  	from_string = chatHistory_string = mFromName; -	bool busy=FALSE; +	bool busy = gAgent.getBusy();  	switch(button)  	{ @@ -1586,9 +1564,6 @@ bool LLOfferInfo::inventory_offer_callback(const LLSD& notification, const LLSD&  		}  		break; -	case IOR_BUSY: -		//Busy falls through to decline.  Says to make busy message. -		busy=TRUE;  	case IOR_MUTE:  		// MUTE falls through to decline  	case IOR_DECLINE: @@ -1734,7 +1709,7 @@ bool LLOfferInfo::inventory_task_offer_callback(const LLSD& notification, const  		from_string = chatHistory_string = mFromName;  	} -	bool busy=FALSE; +	bool busy = gAgent.getBusy();  	switch(button)  	{ @@ -1780,9 +1755,6 @@ bool LLOfferInfo::inventory_task_offer_callback(const LLSD& notification, const  		}	// end switch (mIM)  			break; -		case IOR_BUSY: -			//Busy falls through to decline.  Says to make busy message. -			busy=TRUE;  		case IOR_MUTE:  			// MUTE falls through to decline  		case IOR_DECLINE: @@ -2667,7 +2639,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)  			{  				// Until throttling is implemented, busy mode should reject inventory instead of silently  				// accepting it.  SEE SL-39554 -				info->forceResponse(IOR_BUSY); +				info->forceResponse(IOR_DECLINE);  			}  			else  			{ diff --git a/indra/newview/llviewermessage.h b/indra/newview/llviewermessage.h index 9d09d9c01a..d8acd99953 100644 --- a/indra/newview/llviewermessage.h +++ b/indra/newview/llviewermessage.h @@ -57,7 +57,6 @@ enum InventoryOfferResponse  	IOR_ACCEPT,  	IOR_DECLINE,  	IOR_MUTE, -	IOR_BUSY,  	IOR_SHOW  }; diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp index db2dc531db..17f908d73f 100644 --- a/indra/newview/llviewerregion.cpp +++ b/indra/newview/llviewerregion.cpp @@ -1193,6 +1193,7 @@ LLViewerRegion::eCacheUpdateResult LLViewerRegion::cacheFullUpdate(LLViewerObjec  	eCacheUpdateResult result = CACHE_UPDATE_ADDED;  	if (mImpl->mCacheMap.size() > MAX_OBJECT_CACHE_ENTRIES)  	{ +		delete mImpl->mCacheMap.begin()->second ;  		mImpl->mCacheMap.erase(mImpl->mCacheMap.begin());  		result = CACHE_UPDATE_REPLACED; diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp index 5fcc57bc91..70509f9a9f 100644 --- a/indra/newview/llviewertexture.cpp +++ b/indra/newview/llviewertexture.cpp @@ -66,6 +66,7 @@  // statics  LLPointer<LLViewerTexture>        LLViewerTexture::sNullImagep = NULL; +LLPointer<LLViewerTexture>        LLViewerTexture::sBlackImagep = NULL;  LLPointer<LLViewerFetchedTexture> LLViewerFetchedTexture::sMissingAssetImagep = NULL;  LLPointer<LLViewerFetchedTexture> LLViewerFetchedTexture::sWhiteImagep = NULL;  LLPointer<LLViewerFetchedTexture> LLViewerFetchedTexture::sDefaultImagep = NULL; @@ -295,17 +296,23 @@ LLViewerFetchedTexture* LLViewerTextureManager::getFetchedTextureFromHost(const  void LLViewerTextureManager::init()  { -	LLPointer<LLImageRaw> raw = new LLImageRaw(1,1,3); -	raw->clear(0x77, 0x77, 0x77, 0xFF); -	LLViewerTexture::sNullImagep = LLViewerTextureManager::getLocalTexture(raw.get(), TRUE) ; - -#if 1 -	LLPointer<LLViewerFetchedTexture> imagep = LLViewerTextureManager::getFetchedTexture(IMG_DEFAULT); -	LLViewerFetchedTexture::sDefaultImagep = imagep; +	{ +		LLPointer<LLImageRaw> raw = new LLImageRaw(1,1,3); +		raw->clear(0x77, 0x77, 0x77, 0xFF); +		LLViewerTexture::sNullImagep = LLViewerTextureManager::getLocalTexture(raw.get(), TRUE) ; +	}  	const S32 dim = 128;  	LLPointer<LLImageRaw> image_raw = new LLImageRaw(dim,dim,3);  	U8* data = image_raw->getData(); +	 +	memset(data, 0, dim * dim * 3) ; +	LLViewerTexture::sBlackImagep = LLViewerTextureManager::getLocalTexture(image_raw.get(), TRUE) ; + +#if 1 +	LLPointer<LLViewerFetchedTexture> imagep = LLViewerTextureManager::getFetchedTexture(IMG_DEFAULT); +	LLViewerFetchedTexture::sDefaultImagep = imagep; +	  	for (S32 i = 0; i<dim; i++)  	{  		for (S32 j = 0; j<dim; j++) @@ -359,6 +366,7 @@ void LLViewerTextureManager::cleanup()  	LLImageGL::sDefaultGLTexture = NULL ;  	LLViewerTexture::sNullImagep = NULL; +	LLViewerTexture::sBlackImagep = NULL;  	LLViewerFetchedTexture::sDefaultImagep = NULL;	  	LLViewerFetchedTexture::sSmokeImagep = NULL;  	LLViewerFetchedTexture::sMissingAssetImagep = NULL; diff --git a/indra/newview/llviewertexture.h b/indra/newview/llviewertexture.h index c5b8c8923a..de528927b4 100644 --- a/indra/newview/llviewertexture.h +++ b/indra/newview/llviewertexture.h @@ -330,6 +330,7 @@ public:  	static BOOL sUseTextureAtlas ;  	static LLPointer<LLViewerTexture> sNullImagep; // Null texture for non-textured objects. +	static LLPointer<LLViewerTexture> sBlackImagep;	// Texture to show NOTHING (pure black)  }; diff --git a/indra/newview/llvocache.cpp b/indra/newview/llvocache.cpp index f0b5b50feb..6d457434b5 100644 --- a/indra/newview/llvocache.cpp +++ b/indra/newview/llvocache.cpp @@ -621,16 +621,20 @@ void LLVOCache::readFromCache(U64 handle, const LLUUID& id, LLVOCacheEntry::voca  				S32 num_entries;  				success = check_read(&apr_file, &num_entries, sizeof(S32)) ; -				for (S32 i = 0; success && i < num_entries; i++) +				if(success)  				{ -					LLVOCacheEntry* entry = new LLVOCacheEntry(&apr_file); -					if (!entry->getLocalID()) +					for (S32 i = 0; i < num_entries; i++)  					{ -						llwarns << "Aborting cache file load for " << filename << ", cache file corruption!" << llendl; -						delete entry ; -						success = false ; +						LLVOCacheEntry* entry = new LLVOCacheEntry(&apr_file); +						if (!entry->getLocalID()) +						{ +							llwarns << "Aborting cache file load for " << filename << ", cache file corruption!" << llendl; +							delete entry ; +							success = false ; +							break ; +						} +						cache_entry_map[entry->getLocalID()] = entry;  					} -					cache_entry_map[entry->getLocalID()] = entry;  				}  			}  		}		 diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp index eb3ed3c379..528c7acbc8 100755 --- a/indra/newview/llvovolume.cpp +++ b/indra/newview/llvovolume.cpp @@ -4490,6 +4490,7 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std::  		std::sort(faces.begin(), faces.end(), LLFace::CompareDistanceGreater());  	} +	bool hud_group = group->isHUDGroup() ;  	std::vector<LLFace*>::iterator face_iter = faces.begin();  	LLSpatialGroup::buffer_map_t buffer_map; @@ -4760,7 +4761,7 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std::  					registerFace(group, facep, LLRenderPass::PASS_INVISI_SHINY);  					registerFace(group, facep, LLRenderPass::PASS_INVISIBLE);  				} -				else if (LLPipeline::sRenderDeferred) +				else if (LLPipeline::sRenderDeferred && !hud_group)  				{ //deferred rendering  					if (te->getFullbright())  					{ //register in post deferred fullbright shiny pass @@ -4798,7 +4799,7 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std::  				else if (fullbright || bake_sunlight)  				{ //fullbright  					registerFace(group, facep, LLRenderPass::PASS_FULLBRIGHT); -					if (LLPipeline::sRenderDeferred && LLPipeline::sRenderBump && te->getBumpmap()) +					if (LLPipeline::sRenderDeferred && !hud_group && LLPipeline::sRenderBump && te->getBumpmap())  					{ //if this is the deferred render and a bump map is present, register in post deferred bump  						registerFace(group, facep, LLRenderPass::PASS_POST_BUMP);  					} @@ -4824,7 +4825,7 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std::  			}  			//not sure why this is here, and looks like it might cause bump mapped objects to get rendered redundantly -- davep 5/11/2010 -			if (!is_alpha && !LLPipeline::sRenderDeferred) +			if (!is_alpha && (hud_group || !LLPipeline::sRenderDeferred))  			{  				llassert((mask & LLVertexBuffer::MAP_NORMAL) || fullbright);  				facep->setPoolType((fullbright) ? LLDrawPool::POOL_FULLBRIGHT : LLDrawPool::POOL_SIMPLE); diff --git a/indra/newview/llxmlrpctransaction.cpp b/indra/newview/llxmlrpctransaction.cpp index bd1d2ed7a7..f483ba5af8 100644 --- a/indra/newview/llxmlrpctransaction.cpp +++ b/indra/newview/llxmlrpctransaction.cpp @@ -306,19 +306,8 @@ void LLXMLRPCTransaction::Impl::init(XMLRPC_REQUEST request, bool useGzip)  		mCurlRequest = new LLCurlEasyRequest();  	}  	mErrorCert = NULL; -	 -	if (gSavedSettings.getBOOL("BrowserProxyEnabled")) -	{ -		mProxyAddress = gSavedSettings.getString("BrowserProxyAddress"); -		S32 port = gSavedSettings.getS32 ( "BrowserProxyPort" ); - -		// tell curl about the settings -		mCurlRequest->setoptString(CURLOPT_PROXY, mProxyAddress); -		mCurlRequest->setopt(CURLOPT_PROXYPORT, port); -		mCurlRequest->setopt(CURLOPT_PROXYTYPE, CURLPROXY_HTTP); -	} -//	mCurlRequest->setopt(CURLOPT_VERBOSE, 1); // usefull for debugging +//	mCurlRequest->setopt(CURLOPT_VERBOSE, 1); // useful for debugging  	mCurlRequest->setopt(CURLOPT_NOSIGNAL, 1);  	mCurlRequest->setWriteCallback(&curlDownloadCallback, (void*)this);  	BOOL vefifySSLCert = !gSavedSettings.getBOOL("NoVerifySSLCert"); diff --git a/indra/newview/skins/default/xui/en/floater_postcard.xml b/indra/newview/skins/default/xui/en/floater_postcard.xml index 8da35e9d7f..c756661ffc 100644 --- a/indra/newview/skins/default/xui/en/floater_postcard.xml +++ b/indra/newview/skins/default/xui/en/floater_postcard.xml @@ -7,11 +7,11 @@   height="380"   layout="topleft"   min_height="380" - min_width="450" + min_width="490"   name="Postcard"   help_topic="postcard"   title="EMAIL SNAPSHOT" - width="450"> + width="490">      <floater.string       name="default_subject">          Postcard from [SECOND_LIFE]. @@ -40,7 +40,7 @@       follows="left|top"       height="20"       layout="topleft" -     left_delta="108" +     left_delta="148"       name="to_form"       top_delta="-4"       width="150" /> @@ -59,7 +59,7 @@       follows="left|top"       height="20"       layout="topleft" -     left_delta="108" +     left_delta="148"       name="from_form"       top_delta="-4"       width="150" /> @@ -78,7 +78,7 @@       follows="left|top"       height="20"       layout="topleft" -     left_delta="108" +     left_delta="148"       max_length_bytes="100"       name="name_form"       top_delta="-4" @@ -99,7 +99,7 @@       height="20"       label="Type your subject here."       layout="topleft" -     left_delta="108" +     left_delta="148"       max_length_bytes="100"       name="subject_form"       top_delta="-4" diff --git a/indra/newview/skins/default/xui/en/floater_preferences_proxy.xml b/indra/newview/skins/default/xui/en/floater_preferences_proxy.xml new file mode 100644 index 0000000000..449731ab89 --- /dev/null +++ b/indra/newview/skins/default/xui/en/floater_preferences_proxy.xml @@ -0,0 +1,273 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<floater + legacy_header_height="18" + height="500" + layout="topleft" + name="Proxy Settings Floater" + help_topic="proxysettings" + title="Proxy Settings" + width="500"> +	<check_box +	 control_name="BrowserProxyEnabled" +	 top="38" +	 enabled="true" +	 follows="left|top" +	 height="14" +	 initial_value="false" +	 commit_callback.function="Proxy.Change" +	 label="Use HTTP Proxy for Web pages" +	 left="22" +	 mouse_opaque="true" +	 name="web_proxy_enabled" +	 radio_style="false" +	 width="400" +	 top_pad="5" /> +	<text +	 type="string" +	 length="1" +	 follows="left|top" +	 height="10" +	 left_delta="23" +	 layout="topleft" +	 name="Proxy location" +	 top_pad="10" +	 width="300"> +	    HTTP Proxy: +	</text> +	<line_editor +	 control_name="BrowserProxyAddress" +	 enabled_control="BrowserProxyEnabled" +	 follows="left|top" +	 font="SansSerif" +	 height="23" +	 layout="topleft" +	 left_delta="0" +	 name="web_proxy_editor" +	 tool_tip="The DNS name or IP address of the HTTP proxy you would like to use." +	 top_pad="4" +	 width="200" /> +	<spinner +	 control_name="BrowserProxyPort" +	 enabled_control="BrowserProxyEnabled" +     decimal_digits="0" +	 follows="left|top" +	 height="23" +	 increment="1" +	 initial_value="80" +	 label="Port number:" +	 label_width="95" +	 layout="topleft" +	 left_delta="210" +	 max_val="12000" +	 min_val="10" +	 name="web_proxy_port" +	 top_delta="0" +	 tool_tip="The port of the HTTP proxy you would like to use." +	 width="145" /> +	<check_box +	 control_name="Socks5ProxyEnabled" +	 height="16" +	 label="Use SOCKS 5 Proxy for UDP traffic" +	 layout="topleft" +	 left="22" +	 name="socks_proxy_enabled" +	 top_pad="32" +	 width="256" +	 commit_callback.function="Proxy.Change" /> +	<text +	 type="string" +	 length="1" +	 follows="left|top" +	 height="10" +	 layout="topleft" +	 left_delta="23" +	 name="Proxy location" +	 top_pad="10" +	 width="300"> +	    SOCKS 5 Proxy: +	</text> +	<line_editor +	 control_name="Socks5ProxyHost" +	 enabled_control="Socks5ProxyEnabled" +	 follows="left|top" +	 font="SansSerif" +	 height="23" +	 layout="topleft" +	 left_delta="0" +	 name="socks_proxy_editor" +	 tool_tip="The DNS name or IP address of the SOCKS 5 proxy you would like to use." +	 top_pad="4" +	 width="200" +	 commit_callback.function="Proxy.Change" /> +	<spinner +	 control_name="Socks5ProxyPort" +	 enabled_control="Socks5ProxyEnabled" +	 decimal_digits="0" +	 follows="left|top" +	 height="23" +	 increment="1" +	 initial_value="80" +	 label="Port number:" +	 label_width="95" +	 layout="topleft" +	 left_delta="210" +	 max_val="12000" +	 min_val="10" +	 name="socks_proxy_port" +	 top_delta="0" +	 width="145" +	 tool_tip="The port of the SOCKS 5 proxy you would like to use." +	 commit_callback.function="Proxy.Change" /> +	<text +	 type="string" +	 length="1" +	 follows="left|top" +	 height="10" +	 layout="topleft" +	 left="40" +	 name="Proxy location" +	 top_pad="15" +	 width="300"> +	    SOCKS Authentication: +	</text> +	<radio_group +	 control_name="Socks5AuthType" +	 enabled_control="Socks5ProxyEnabled" +	 height="50" +	 layout="topleft" +	 name="socks5_auth_type" +	 top_pad="10" +	 width="120" +	 commit_callback.function="Proxy.Change" > +		<radio_item +		 height="16" +		 label="No Authentication" +		 layout="topleft" +		 name="Socks5NoAuth" +		 value="None" +		 tool_tip="Socks5 proxy requires no authentication." +		 width="120" /> +		<radio_item +		 height="16" +		 label="Username/Password" +		 layout="topleft" +		 name="Socks5UserPass" +		 value="UserPass" +		 tool_tip="Socks5 proxy requires username/password authentication." +		 width="120" /> +	</radio_group> +	<text +	 type="string" +	 length="1" +	 follows="left|top" +	 height="10" +	 layout="topleft" +	 left_delta="20" +	 top_delta="50" +	 width="200"> +	    Username: +	</text> +	<text +	 type="string" +	 length="1" +	 follows="left|top" +	 height="10" +	 left_pad="15" +	 layout="topleft" +	 width="200"> +	    Password: +	</text> +	<line_editor +	 follows="left|top" +	 font="SansSerif" +	 height="23" +	 layout="topleft" +	 left="60" +	 name="socks5_username" +	 tool_tip="The username used to authenticate with your SOCKS 5 server" +	 top_pad="4" +	 width="200" +	 commit_callback.function="Proxy.Change" /> +	<line_editor +	 follows="left|top" +	 font="SansSerif" +	 height="23" +	 layout="topleft" +	 left_pad="15" +	 name="socks5_password" +	 tool_tip="The password used to authenticate with your SOCKS 5 server" +	 top_delta="0" +	 width="200" +	 is_password="true" +	 commit_callback.function="Proxy.Change" /> +	<text +	 type="string" +	 length="1" +	 follows="left|top" +	 height="10" +	 layout="topleft" +	 left="25" +	 name="Proxy location" +	 top_pad="18" +	 width="300"> +	   Other HTTP traffic proxy: +	</text> +	<radio_group +	 control_name="HttpProxyType" +	 name="other_http_proxy_type" +	 height="60" +	 layout="topleft" +	 top_pad="9" +	 width="120" +	 left_delta="15"  +	 commit_callback.function="Proxy.Change" > +		<radio_item +		 height="16" +		 label="Do not proxy" +		 layout="topleft" +		 name="OtherNoProxy" +		 value="None" +		 width="120" +		 tool_tip="Non-web HTTP traffic will NOT be sent to any proxy."/> +		<radio_item +		 height="16" +		 label="Use HTTP Proxy" +		 layout="topleft" +		 name="OtherHTTPProxy" +		 value="Web" +		 width="120" +		 enabled_control="BrowserProxyEnabled" +		 tool_tip="Non-web HTTP will be sent through the configured Web proxy." /> +		<radio_item +		 height="16" +		 label="Use SOCKS 5 Proxy" +		 layout="topleft" +		 name="OtherSocksProxy" +		 value="Socks" +		 width="120" +		 enabled_control="Socks5ProxyEnabled" +		 tool_tip="Non-web HTTP traffic will be sent through the configured Socks 5 proxy."/> +	</radio_group> +	<button +	 follows="left|top" +	 height="22" +	 label="OK" +	 label_selected="OK" +	 layout="topleft" +	 left="282" +	 name="OK" +	 top_pad="36" +	 width="90" +	 commit_callback.function="Proxy.OK" /> +	<button +	 follows="left|top" +	 height="22" +	 label="Cancel" +	 label_selected="Cancel" +	 layout="topleft" +	 left_pad="10" +	 name="Cancel" +	 top_delta="0" +	 width="90" +	 commit_callback.function="Proxy.Cancel" /> +</floater> diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index c9ccd44b83..104bcaf7d0 100644 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -7157,6 +7157,138 @@ Click and drag anywhere on the world to rotate your view    </notification>    <notification +   icon="alertmodal.tga" +   name="SOCKS_NOT_PERMITTED" +   type="alertmodal"> +	The SOCKS 5 proxy "[HOST]:[PORT]" refused the connection, not allowed by rule set. +	<tag>fail</tag> +   <usetemplate +     name="okbutton" +     yestext="OK"/> +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="SOCKS_CONNECT_ERROR" +   type="alertmodal"> +	The SOCKS 5 proxy "[HOST]:[PORT]" refused the connection, could not open TCP channel. +	<tag>fail</tag> +   <usetemplate +     name="okbutton" +     yestext="OK"/>	  +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="SOCKS_NOT_ACCEPTABLE" +   type="alertmodal"> +	The SOCKS 5 proxy "[HOST]:[PORT]" refused the selected authentication system. +	<tag>fail</tag> +   <usetemplate +     name="okbutton" +     yestext="OK"/> +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="SOCKS_AUTH_FAIL" +   type="alertmodal"> +	The SOCKS 5 proxy "[HOST]:[PORT]" reported your credentials are invalid. +	<tag>fail</tag> +   <usetemplate +     name="okbutton" +     yestext="OK"/> +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="SOCKS_UDP_FWD_NOT_GRANTED" +   type="alertmodal"> +	The SOCKS 5 proxy "[HOST]:[PORT]" refused the UDP associate request. +	<tag>fail</tag> +   <usetemplate +     name="okbutton" +     yestext="OK"/> +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="SOCKS_HOST_CONNECT_FAILED" +   type="alertmodal"> +	Could not connect to SOCKS 5 proxy server "[HOST]:[PORT]". +	<tag>fail</tag> +   <usetemplate +     name="okbutton" +     yestext="OK"/> +  </notification> +   +  <notification +   icon="alertmodal.tga" +   name="SOCKS_UNKNOWN_STATUS" +   type="alertmodal"> +	Unknown proxy error with server "[HOST]:[PORT]". +	<tag>fail</tag> +   <usetemplate +     name="okbutton" +     yestext="OK"/> +  </notification> +   +  <notification +   icon="alertmodal.tga" +   name="SOCKS_INVALID_HOST" +   type="alertmodal"> +	Invalid SOCKS proxy address or port "[HOST]:[PORT]". +	<tag>fail</tag> +   <usetemplate +     name="okbutton" +     yestext="OK"/> +  </notification> +   +  <notification +   icon="alertmodal.tga" +   name="SOCKS_BAD_CREDS" +   type="alertmodal"> +	Invalid SOCKS 5 username or password. +	<tag>fail</tag> +   <usetemplate +     name="okbutton" +     yestext="OK"/> +  </notification> +   +  <notification +   icon="alertmodal.tga" +   name="PROXY_INVALID_HTTP_HOST" +   type="alertmodal"> +    Invalid HTTP proxy address or port "[HOST]:[PORT]". +	<tag>fail</tag> +   <usetemplate +     name="okbutton" +     yestext="OK"/> +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="PROXY_INVALID_SOCKS_HOST" +   type="alertmodal"> +	Invalid SOCKS proxy address or port "[HOST]:[PORT]". +	<tag>fail</tag> +   <usetemplate +     name="okbutton" +     yestext="OK"/> +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="ChangeProxySettings" +   type="alert"> +	Proxy settings take effect after you restart [APP_NAME]. +	<tag>fail</tag> +   <usetemplate +     name="okbutton" +     yestext="OK"/> +  </notification> + +  <notification    name="AuthRequest"    type="browser">  The site at '<nolink>[HOST_NAME]</nolink>' in realm '[REALM]' requires a user name and password. diff --git a/indra/newview/skins/default/xui/en/panel_cof_wearables.xml b/indra/newview/skins/default/xui/en/panel_cof_wearables.xml index 9e70706603..beea53437a 100644 --- a/indra/newview/skins/default/xui/en/panel_cof_wearables.xml +++ b/indra/newview/skins/default/xui/en/panel_cof_wearables.xml @@ -52,7 +52,7 @@               multi_select="true"               name="list_attachments"               top="0" -             width="311"/> +			 width="311" />          </accordion_tab>          <accordion_tab           layout="topleft" diff --git a/indra/newview/skins/default/xui/en/panel_login.xml b/indra/newview/skins/default/xui/en/panel_login.xml index 0bc1be666e..83f1bff91f 100644 --- a/indra/newview/skins/default/xui/en/panel_login.xml +++ b/indra/newview/skins/default/xui/en/panel_login.xml @@ -117,12 +117,13 @@ label="Remember password"    name="connect_btn"    top="35"    width="90" /> +  <!-- Utf code in label is a filled up-pointing triangle -->    <menu_button    left_pad="5"    top="35"    width="80"    height="23" -  label="Mode ▲" +  label="Mode ▲"    name="mode_menu"      tool_tip="Select your mode. Choose Basic for fast, easy exploration and chat. Choose Advanced to access more features."    menu_filename="menu_mode_change.xml" diff --git a/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml index 30be5bc853..47236c1a48 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml @@ -139,7 +139,7 @@       height="16"       label="Add datestamp to log file name."       layout="topleft" -     left_detla="5" +     left_delta="5"       name="logfile_name_datestamp"       top_pad="10"       width="350"/> diff --git a/indra/newview/skins/default/xui/en/panel_preferences_setup.xml b/indra/newview/skins/default/xui/en/panel_preferences_setup.xml index e639f0dc9d..a7078ce2e1 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_setup.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_setup.xml @@ -70,7 +70,7 @@     layout="topleft"     left="77"     name="connection_port_enabled" -   top_pad="20" +   top_pad="10"     width="256">      <check_box.commit_callback       function="Notification.Show" @@ -79,7 +79,7 @@    <spinner     control_name="ConnectionPort"     enabled_control="ConnectionPortEnabled" - decimal_digits="0" +   decimal_digits="0"     follows="left|top"     height="23"     increment="1" @@ -195,60 +195,6 @@      name="media_popup_enabled"      width="400"                 top_pad="5"/> -  <check_box -    top_delta="4" -    enabled="true" -    follows="left|top" -    height="14" -    initial_value="false" -    control_name="BrowserProxyEnabled" -    label="Enable Web Proxy" -    left_delta="0" -    mouse_opaque="true" -    name="web_proxy_enabled" -    radio_style="false" -    width="400"           top_pad="5"/> -  <text -   type="string" -   length="1" -   follows="left|top" -   height="10" -   layout="topleft" -   left_delta="20" -   name="Proxy location" -   top_delta="16" -   width="300"> -    Proxy location: -  </text> -  <line_editor -   control_name="BrowserProxyAddress" -   enabled_control="BrowserProxyEnabled" - follows="left|top" -   font="SansSerif" -   height="23" -   layout="topleft" -   left_delta="0" -   name="web_proxy_editor" -   tool_tip="The name or IP address of the proxy you would like to use" -   top_pad="4" -   width="200" /> -  <spinner -   control_name="BrowserProxyPort" -   enabled_control="BrowserProxyEnabled" - decimal_digits="0" -   follows="left|top" -   height="23" -   increment="1" -   initial_value="80" -   label="Port number:" -   label_width="95" -   layout="topleft" -   left_delta="210" -   max_val="12000" -   min_val="10" -   name="web_proxy_port" -   top_delta="0" -   width="145" />    <text       type="string"       length="1" @@ -286,4 +232,31 @@           name="Install_manual"           value="0" />    </combo_box> +  <text +     type="string" +     length="1" +     follows="left|top" +     height="10" +     layout="topleft" +     left="30" +     name="Proxy Settings:" +     mouse_opaque="false" +     top_pad="5" +     width="300"> +		Proxy Settings: +  </text> +  <button +	label="Adjust proxy settings" +    follows="left|top" +    height="23" +	width="140"  +    label_selected="Browse" +    layout="topleft" +    left_delta="50" +    name="set_proxy" +    top_pad="5" +    > +		<button.commit_callback +		  function="Pref.Proxy" /> +  </button>  </panel> diff --git a/indra/newview/skins/default/xui/en/panel_region_terrain.xml b/indra/newview/skins/default/xui/en/panel_region_terrain.xml index bbb8b40594..5d060c0a0d 100644 --- a/indra/newview/skins/default/xui/en/panel_region_terrain.xml +++ b/indra/newview/skins/default/xui/en/panel_region_terrain.xml @@ -193,7 +193,7 @@      </text>      <text         follows="left|top" -       height="20" +       height="60"         layout="topleft"         left_delta="0"         name="height_text_lbl11" diff --git a/indra/newview/skins/default/xui/en/panel_status_bar.xml b/indra/newview/skins/default/xui/en/panel_status_bar.xml index 23ad0e9528..f25a73da38 100644 --- a/indra/newview/skins/default/xui/en/panel_status_bar.xml +++ b/indra/newview/skins/default/xui/en/panel_status_bar.xml @@ -77,15 +77,16 @@       top="0"       width="55" />    </panel> +  <!-- UTF 9660 code in label below is a down-pointing filled-in triangle -->    <menu_button       follows="right|top"          image_color="0 0 0 0"      hover_glow_amount="0"      left_pad="5" -    top="0" +    top="2"      width="55"      height="18" -    label="Mode ▼" +    label="Mode ▼"      tool_tip="Select your mode. Choose Basic for fast, easy exploration and chat. Choose Advanced to access more features."      menu_filename="menu_mode_change.xml"      /> diff --git a/indra/newview/tests/llsechandler_basic_test.cpp b/indra/newview/tests/llsechandler_basic_test.cpp index daa10819fc..0235400976 100644 --- a/indra/newview/tests/llsechandler_basic_test.cpp +++ b/indra/newview/tests/llsechandler_basic_test.cpp @@ -86,6 +86,9 @@ std::string LLControlGroup::getString(const std::string& name)  	return "";  } +// Stub for --no-verify-ssl-cert +BOOL LLControlGroup::getBOOL(const std::string& name) { return FALSE; } +  LLSD LLCredential::getLoginParams()  {  	LLSD result = LLSD::emptyMap(); | 
