From 5ba57500f0df4cb6808a9d588dcb4c00dd5da4d6 Mon Sep 17 00:00:00 2001
From: Armin Weatherwax
Date: Thu, 26 Aug 2010 14:58:21 +0200
Subject: Katharine Berry: Allow loading of windlight parameters from arbitrary
 XML streams.

---
 linden/indra/newview/llwlparammanager.cpp | 76 +++++++++++++++++++++++++------
 linden/indra/newview/llwlparammanager.h   |  4 ++
 2 files changed, 65 insertions(+), 15 deletions(-)

(limited to 'linden/indra')

diff --git a/linden/indra/newview/llwlparammanager.cpp b/linden/indra/newview/llwlparammanager.cpp
index cf6744f..5f80283 100644
--- a/linden/indra/newview/llwlparammanager.cpp
+++ b/linden/indra/newview/llwlparammanager.cpp
@@ -159,6 +159,66 @@ void LLWLParamManager::loadPresets(const std::string& file_name)
 
 }
 
+bool LLWLParamManager::loadPresetXML(const std::string& name, std::istream& preset_stream, bool check_if_real /* = false */)
+{
+	LLSD paramsData(LLSD::emptyMap());
+	
+	LLPointer<LLSDParser> parser = new LLSDXMLParser();
+	
+	if(parser->parse(preset_stream, paramsData, LLSDSerialize::SIZE_UNLIMITED) == LLSDParser::PARSE_FAILURE)
+	{
+		return false;
+	}
+	
+	if(check_if_real)
+	{
+		static const char* expected_windlight_settings[] = {
+			"ambient",
+			"blue_density",
+			"blue_horizon",
+			"cloud_color",
+			"cloud_pos_density1",
+			"cloud_pos_density2",
+			"cloud_scale",
+			"cloud_scroll_rate",
+			"cloud_shadow",
+			"density_multiplier",
+			"distance_multiplier",
+			"east_angle",
+			"enable_cloud_scroll",
+			"gamma",
+			"glow",
+			"haze_density",
+			"haze_horizon",
+			"lightnorm",
+			"max_y",
+			"star_brightness",
+			"sun_angle",
+			"sunlight_color"
+		};
+		static S32 expected_count = LL_ARRAY_SIZE(expected_windlight_settings);
+		for(S32 i = 0; i < expected_count; ++i)
+		{
+			if(!paramsData.has(expected_windlight_settings[i]))
+			{
+				LL_WARNS("WindLight") << "Attempted to load WindLight param set without " << expected_windlight_settings[i] << LL_ENDL;
+				return false;
+			}
+		}
+	}
+	
+	std::map<std::string, LLWLParamSet>::iterator mIt = mParamList.find(name);
+	if(mIt == mParamList.end())
+	{
+		addParamSet(name, paramsData);
+	}
+	else 
+	{
+		setParamSet(name, paramsData);
+	}
+	return true;
+}
+ 
 void LLWLParamManager::savePresets(const std::string & fileName)
 {
 	//Nobody currently calls me, but if they did, then its reasonable to write the data out to the user's folder
@@ -211,21 +271,7 @@ void LLWLParamManager::loadPreset(const std::string & name,bool propagate)
 
 	if (presetsXML)
 	{
-		LLSD paramsData(LLSD::emptyMap());
-
-		LLPointer<LLSDParser> parser = new LLSDXMLParser();
-
-		parser->parse(presetsXML, paramsData, LLSDSerialize::SIZE_UNLIMITED);
-
-		std::map<std::string, LLWLParamSet>::iterator mIt = mParamList.find(name);
-		if(mIt == mParamList.end())
-		{
-			addParamSet(name, paramsData);
-		}
-		else 
-		{
-			setParamSet(name, paramsData);
-		}
+		loadPresetXML(name, presetsXML);
 		presetsXML.close();
 	} 
 	else 
diff --git a/linden/indra/newview/llwlparammanager.h b/linden/indra/newview/llwlparammanager.h
index 6b6300c..141af3c 100644
--- a/linden/indra/newview/llwlparammanager.h
+++ b/linden/indra/newview/llwlparammanager.h
@@ -145,6 +145,10 @@ public:
 	/// load an individual preset into the sky
 	void loadPreset(const std::string & name,bool propogate=true);
 
+	/// load an individual preset into the sky from an LLSD stream
+	/// Returns whether the stream was actually reasonable XML to load from.
+	bool loadPresetXML(const std::string& name, std::istream& preset_stream, bool check_if_real=false);
+
 	/// save the parameter presets to file
 	void savePreset(const std::string & name);
 
-- 
cgit v1.1