From ec637e2b8c089efc16bbb9faae0a1e3cf939db41 Mon Sep 17 00:00:00 2001
From: Melanie <melanie@t-data.com>
Date: Wed, 31 Mar 2010 04:20:20 +0100
Subject: [PATCH 1/7] Committing the LightShare code, which was developed by
 TomMeta of Meta7. This allows scripts to set WindLight parameters for clients
 connecting to a region. Currently, this is only supported by the Meta7
 viewer.

---
 .../Client/MXP/ClientStack/MXPClientView.cs   |   2 +-
 .../ClientStack/SirikataClientView.cs         |   2 +-
 .../VWoHTTP/ClientStack/VWHClientView.cs      |   2 +-
 OpenSim/Data/MSSQL/MSSQLLegacyRegionData.cs   |  13 +-
 OpenSim/Data/MySQL/MySQLLegacyRegionData.cs   | 199 ++++++++++++
 OpenSim/Data/Null/NullDataStore.cs            |  11 +-
 OpenSim/Data/SQLite/SQLiteRegionData.cs       |  13 +-
 OpenSim/Framework/IClientAPI.cs               |   2 +-
 OpenSim/Framework/RegionInfo.cs               | 305 +++++++++++++++++-
 .../ClientStack/LindenUDP/LLClientView.cs     |   7 +-
 .../Examples/SimpleModule/MyNpcCharacter.cs   |   2 +-
 .../Framework/Interfaces/IRegionDataStore.cs  |   2 +
 .../Region/Framework/Scenes/EventManager.cs   |  24 +-
 OpenSim/Region/Framework/Scenes/Scene.cs      |  13 +
 .../Framework/Scenes/Tests/SceneTests.cs      |  11 +-
 .../Server/IRCClientView.cs                   |   2 +-
 .../OptionalModules/World/NPC/NPCAvatar.cs    |   2 +-
 ...Region.ScriptEngine.Shared.Api.Runtime.mdp |   2 +
 OpenSim/Tests/Common/Mock/TestClient.cs       |   2 +-
 19 files changed, 597 insertions(+), 19 deletions(-)

diff --git a/OpenSim/Client/MXP/ClientStack/MXPClientView.cs b/OpenSim/Client/MXP/ClientStack/MXPClientView.cs
index 2dec72d1e0..17bd7959c7 100644
--- a/OpenSim/Client/MXP/ClientStack/MXPClientView.cs
+++ b/OpenSim/Client/MXP/ClientStack/MXPClientView.cs
@@ -930,7 +930,7 @@ namespace OpenSim.Client.MXP.ClientStack
             // Need to translate to MXP somehow
         }
 
-        public void SendGenericMessage(string method, List<string> message)
+        public void SendGenericMessage(string method, List<byte[]> message)
         {
             // Need to translate to MXP somehow
         }
diff --git a/OpenSim/Client/Sirikata/ClientStack/SirikataClientView.cs b/OpenSim/Client/Sirikata/ClientStack/SirikataClientView.cs
index 9cb21720ec..4ecbaf917f 100644
--- a/OpenSim/Client/Sirikata/ClientStack/SirikataClientView.cs
+++ b/OpenSim/Client/Sirikata/ClientStack/SirikataClientView.cs
@@ -503,7 +503,7 @@ namespace OpenSim.Client.Sirikata.ClientStack
             throw new System.NotImplementedException();
         }
 
-        public void SendGenericMessage(string method, List<string> message)
+        public void SendGenericMessage(string method, List<byte[]> message)
         {
             throw new System.NotImplementedException();
         }
diff --git a/OpenSim/Client/VWoHTTP/ClientStack/VWHClientView.cs b/OpenSim/Client/VWoHTTP/ClientStack/VWHClientView.cs
index a427dd3b81..1da746ad2b 100644
--- a/OpenSim/Client/VWoHTTP/ClientStack/VWHClientView.cs
+++ b/OpenSim/Client/VWoHTTP/ClientStack/VWHClientView.cs
@@ -509,7 +509,7 @@ namespace OpenSim.Client.VWoHTTP.ClientStack
             throw new System.NotImplementedException();
         }
 
-        public void SendGenericMessage(string method, List<string> message)
+        public void SendGenericMessage(string method, List<byte[]> message)
         {
             throw new System.NotImplementedException();
         }
diff --git a/OpenSim/Data/MSSQL/MSSQLLegacyRegionData.cs b/OpenSim/Data/MSSQL/MSSQLLegacyRegionData.cs
index c849f38af8..d6cb91f27f 100644
--- a/OpenSim/Data/MSSQL/MSSQLLegacyRegionData.cs
+++ b/OpenSim/Data/MSSQL/MSSQLLegacyRegionData.cs
@@ -691,7 +691,16 @@ VALUES
                 cmd.ExecuteNonQuery();
             }
         }
-
+        public RegionLightShareData LoadRegionWindlightSettings(UUID regionUUID)
+        {
+            //This connector doesn't support the windlight module yet
+            //Return default LL windlight settings
+            return new RegionLightShareData();
+        }
+        public void StoreRegionWindlightSettings(RegionLightShareData wl)
+        {
+            //This connector doesn't support the windlight module yet
+        }
         /// <summary>
         /// Loads the settings of a region.
         /// </summary>
@@ -718,7 +727,7 @@ VALUES
                 }
             }
 
-            //If comes here then there is now region setting for that region
+            //If we reach this point then there are new region settings for that region
             regionSettings = new RegionSettings();
             regionSettings.RegionUUID = regionUUID;
             regionSettings.OnSave += StoreRegionSettings;
diff --git a/OpenSim/Data/MySQL/MySQLLegacyRegionData.cs b/OpenSim/Data/MySQL/MySQLLegacyRegionData.cs
index a06eec3db9..a395ddc3e7 100644
--- a/OpenSim/Data/MySQL/MySQLLegacyRegionData.cs
+++ b/OpenSim/Data/MySQL/MySQLLegacyRegionData.cs
@@ -711,6 +711,102 @@ namespace OpenSim.Data.MySQL
             }
         }
 
+        public RegionLightShareData LoadRegionWindlightSettings(UUID regionUUID)
+        {
+            RegionLightShareData nWP = new RegionLightShareData();
+            nWP.OnSave += StoreRegionWindlightSettings;
+
+            using (MySqlConnection dbcon = new MySqlConnection(m_connectionString))
+            {
+                dbcon.Open();
+
+                string command = "select * from `regionwindlight` where region_id = ?regionID";
+
+                using(MySqlCommand cmd = new MySqlCommand(command))
+                {
+                    cmd.Connection = dbcon;
+
+                    cmd.Parameters.AddWithValue("?regionID", regionUUID.ToString());
+
+                    IDataReader result = ExecuteReader(cmd);
+                    if (!result.Read())
+                    {
+                        //No result, so store our default windlight profile and return it
+                        nWP.regionID = regionUUID;
+                        StoreRegionWindlightSettings(nWP);
+                        return nWP;
+                    }
+                    else
+                    {
+                        UUID.TryParse(result["region_id"].ToString(), out nWP.regionID);
+                        nWP.waterColor.X = Convert.ToSingle(result["water_color_r"]);
+                        nWP.waterColor.Y = Convert.ToSingle(result["water_color_g"]);
+                        nWP.waterColor.Z = Convert.ToSingle(result["water_color_b"]);
+                        nWP.waterFogDensityExponent = Convert.ToSingle(result["water_fog_density_exponent"]);
+                        nWP.underwaterFogModifier = Convert.ToSingle(result["underwater_fog_modifier"]);
+                        nWP.reflectionWaveletScale.X = Convert.ToSingle(result["reflection_wavelet_scale_1"]);
+                        nWP.reflectionWaveletScale.Y = Convert.ToSingle(result["reflection_wavelet_scale_2"]);
+                        nWP.reflectionWaveletScale.Z = Convert.ToSingle(result["reflection_wavelet_scale_3"]);
+                        nWP.fresnelScale = Convert.ToSingle(result["fresnel_scale"]);
+                        nWP.fresnelOffset = Convert.ToSingle(result["fresnel_offset"]);
+                        nWP.refractScaleAbove = Convert.ToSingle(result["refract_scale_above"]);
+                        nWP.refractScaleBelow = Convert.ToSingle(result["refract_scale_below"]);
+                        nWP.blurMultiplier = Convert.ToSingle(result["blur_multiplier"]);
+                        nWP.bigWaveDirection.X = Convert.ToSingle(result["big_wave_direction_x"]);
+                        nWP.bigWaveDirection.Y = Convert.ToSingle(result["big_wave_direction_y"]);
+                        nWP.littleWaveDirection.X = Convert.ToSingle(result["little_wave_direction_x"]);
+                        nWP.littleWaveDirection.Y = Convert.ToSingle(result["little_wave_direction_y"]);
+                        UUID.TryParse(result["normal_map_texture"].ToString(), out nWP.normalMapTexture);
+                        nWP.horizon.X = Convert.ToSingle(result["horizon_r"]);
+                        nWP.horizon.Y = Convert.ToSingle(result["horizon_g"]);
+                        nWP.horizon.Z = Convert.ToSingle(result["horizon_b"]);
+                        nWP.horizon.W = Convert.ToSingle(result["horizon_i"]);
+                        nWP.hazeHorizon = Convert.ToSingle(result["haze_horizon"]);
+                        nWP.blueDensity.X = Convert.ToSingle(result["blue_density_r"]);
+                        nWP.blueDensity.Y = Convert.ToSingle(result["blue_density_g"]);
+                        nWP.blueDensity.Z = Convert.ToSingle(result["blue_density_b"]);
+                        nWP.blueDensity.W = Convert.ToSingle(result["blue_density_i"]);
+                        nWP.hazeDensity = Convert.ToSingle(result["haze_density"]);
+                        nWP.densityMultiplier = Convert.ToSingle(result["density_multiplier"]);
+                        nWP.distanceMultiplier = Convert.ToSingle(result["distance_multiplier"]);
+                        nWP.maxAltitude = Convert.ToUInt16(result["max_altitude"]);
+                        nWP.sunMoonColor.X = Convert.ToSingle(result["sun_moon_color_r"]);
+                        nWP.sunMoonColor.Y = Convert.ToSingle(result["sun_moon_color_g"]);
+                        nWP.sunMoonColor.Z = Convert.ToSingle(result["sun_moon_color_b"]);
+                        nWP.sunMoonColor.W = Convert.ToSingle(result["sun_moon_color_i"]);
+                        nWP.sunMoonPosition = Convert.ToSingle(result["sun_moon_position"]);
+                        nWP.ambient.X = Convert.ToSingle(result["ambient_r"]);
+                        nWP.ambient.Y = Convert.ToSingle(result["ambient_g"]);
+                        nWP.ambient.Z = Convert.ToSingle(result["ambient_b"]);
+                        nWP.ambient.W = Convert.ToSingle(result["ambient_i"]);
+                        nWP.eastAngle = Convert.ToSingle(result["east_angle"]);
+                        nWP.sunGlowFocus = Convert.ToSingle(result["sun_glow_focus"]);
+                        nWP.sunGlowSize = Convert.ToSingle(result["sun_glow_size"]);
+                        nWP.sceneGamma = Convert.ToSingle(result["scene_gamma"]);
+                        nWP.starBrightness = Convert.ToSingle(result["star_brightness"]);
+                        nWP.cloudColor.X = Convert.ToSingle(result["cloud_color_r"]);
+                        nWP.cloudColor.Y = Convert.ToSingle(result["cloud_color_g"]);
+                        nWP.cloudColor.Z = Convert.ToSingle(result["cloud_color_b"]);
+                        nWP.cloudColor.W = Convert.ToSingle(result["cloud_color_i"]);
+                        nWP.cloudXYDensity.X = Convert.ToSingle(result["cloud_x"]);
+                        nWP.cloudXYDensity.Y = Convert.ToSingle(result["cloud_y"]);
+                        nWP.cloudXYDensity.Z = Convert.ToSingle(result["cloud_density"]);
+                        nWP.cloudCoverage = Convert.ToSingle(result["cloud_coverage"]);
+                        nWP.cloudScale = Convert.ToSingle(result["cloud_scale"]);
+                        nWP.cloudDetailXYDensity.X = Convert.ToSingle(result["cloud_detail_x"]);
+                        nWP.cloudDetailXYDensity.Y = Convert.ToSingle(result["cloud_detail_y"]);
+                        nWP.cloudDetailXYDensity.Z = Convert.ToSingle(result["cloud_detail_density"]);
+                        nWP.cloudScrollX = Convert.ToSingle(result["cloud_scroll_x"]);
+                        nWP.cloudScrollXLock = Convert.ToBoolean(result["cloud_scroll_x_lock"]);
+                        nWP.cloudScrollY = Convert.ToSingle(result["cloud_scroll_y"]);
+                        nWP.cloudScrollYLock = Convert.ToBoolean(result["cloud_scroll_y_lock"]);
+                        nWP.drawClassicClouds = Convert.ToBoolean(result["draw_classic_clouds"]);
+                    }
+                }
+            }
+            return nWP;
+        }
+
         public RegionSettings LoadRegionSettings(UUID regionUUID)
         {
             RegionSettings rs = null;
@@ -749,6 +845,109 @@ namespace OpenSim.Data.MySQL
             return rs;
         }
 
+        public void StoreRegionWindlightSettings(RegionLightShareData wl)
+        {
+            using (MySqlConnection dbcon = new MySqlConnection(m_connectionString))
+            {
+                dbcon.Open();
+
+                using (MySqlCommand cmd = dbcon.CreateCommand())
+                {
+                    cmd.CommandText = "REPLACE INTO `regionwindlight` (`region_id`, `water_color_r`, `water_color_g`, ";
+                    cmd.CommandText += "`water_color_b`, `water_fog_density_exponent`, `underwater_fog_modifier`, ";
+                    cmd.CommandText += "`reflection_wavelet_scale_1`, `reflection_wavelet_scale_2`, `reflection_wavelet_scale_3`, ";
+                    cmd.CommandText += "`fresnel_scale`, `fresnel_offset`, `refract_scale_above`, `refract_scale_below`, ";
+                    cmd.CommandText += "`blur_multiplier`, `big_wave_direction_x`, `big_wave_direction_y`, `little_wave_direction_x`, ";
+                    cmd.CommandText += "`little_wave_direction_y`, `normal_map_texture`, `horizon_r`, `horizon_g`, `horizon_b`, ";
+                    cmd.CommandText += "`horizon_i`, `haze_horizon`, `blue_density_r`, `blue_density_g`, `blue_density_b`, ";
+                    cmd.CommandText += "`blue_density_i`, `haze_density`, `density_multiplier`, `distance_multiplier`, `max_altitude`, ";
+                    cmd.CommandText += "`sun_moon_color_r`, `sun_moon_color_g`, `sun_moon_color_b`, `sun_moon_color_i`, `sun_moon_position`, ";
+                    cmd.CommandText += "`ambient_r`, `ambient_g`, `ambient_b`, `ambient_i`, `east_angle`, `sun_glow_focus`, `sun_glow_size`, ";
+                    cmd.CommandText += "`scene_gamma`, `star_brightness`, `cloud_color_r`, `cloud_color_g`, `cloud_color_b`, `cloud_color_i`, ";
+                    cmd.CommandText += "`cloud_x`, `cloud_y`, `cloud_density`, `cloud_coverage`, `cloud_scale`, `cloud_detail_x`, ";
+                    cmd.CommandText += "`cloud_detail_y`, `cloud_detail_density`, `cloud_scroll_x`, `cloud_scroll_x_lock`, `cloud_scroll_y`, ";
+                    cmd.CommandText += "`cloud_scroll_y_lock`, `draw_classic_clouds`) VALUES (?region_id, ?water_color_r, ";
+                    cmd.CommandText += "?water_color_g, ?water_color_b, ?water_fog_density_exponent, ?underwater_fog_modifier, ?reflection_wavelet_scale_1, ";
+                    cmd.CommandText += "?reflection_wavelet_scale_2, ?reflection_wavelet_scale_3, ?fresnel_scale, ?fresnel_offset, ?refract_scale_above, ";
+                    cmd.CommandText += "?refract_scale_below, ?blur_multiplier, ?big_wave_direction_x, ?big_wave_direction_y, ?little_wave_direction_x, ";
+                    cmd.CommandText += "?little_wave_direction_y, ?normal_map_texture, ?horizon_r, ?horizon_g, ?horizon_b, ?horizon_i, ?haze_horizon, ";
+                    cmd.CommandText += "?blue_density_r, ?blue_density_g, ?blue_density_b, ?blue_density_i, ?haze_density, ?density_multiplier, ";
+                    cmd.CommandText += "?distance_multiplier, ?max_altitude, ?sun_moon_color_r, ?sun_moon_color_g, ?sun_moon_color_b, ";
+                    cmd.CommandText += "?sun_moon_color_i, ?sun_moon_position, ?ambient_r, ?ambient_g, ?ambient_b, ?ambient_i, ?east_angle, ";
+                    cmd.CommandText += "?sun_glow_focus, ?sun_glow_size, ?scene_gamma, ?star_brightness, ?cloud_color_r, ?cloud_color_g, ";
+                    cmd.CommandText += "?cloud_color_b, ?cloud_color_i, ?cloud_x, ?cloud_y, ?cloud_density, ?cloud_coverage, ?cloud_scale, ";
+                    cmd.CommandText += "?cloud_detail_x, ?cloud_detail_y, ?cloud_detail_density, ?cloud_scroll_x, ?cloud_scroll_x_lock, ";
+                    cmd.CommandText += "?cloud_scroll_y, ?cloud_scroll_y_lock, ?draw_classic_clouds)";
+
+                    cmd.Parameters.AddWithValue("region_id", wl.regionID);
+                    cmd.Parameters.AddWithValue("water_color_r", wl.waterColor.X);
+                    cmd.Parameters.AddWithValue("water_color_g", wl.waterColor.Y);
+                    cmd.Parameters.AddWithValue("water_color_b", wl.waterColor.Z);
+                    cmd.Parameters.AddWithValue("water_fog_density_exponent", wl.waterFogDensityExponent);
+                    cmd.Parameters.AddWithValue("underwater_fog_modifier", wl.underwaterFogModifier);
+                    cmd.Parameters.AddWithValue("reflection_wavelet_scale_1", wl.reflectionWaveletScale.X);
+                    cmd.Parameters.AddWithValue("reflection_wavelet_scale_2", wl.reflectionWaveletScale.Y);
+                    cmd.Parameters.AddWithValue("reflection_wavelet_scale_3", wl.reflectionWaveletScale.Z);
+                    cmd.Parameters.AddWithValue("fresnel_scale", wl.fresnelScale);
+                    cmd.Parameters.AddWithValue("fresnel_offset", wl.fresnelOffset);
+                    cmd.Parameters.AddWithValue("refract_scale_above", wl.refractScaleAbove);
+                    cmd.Parameters.AddWithValue("refract_scale_below", wl.refractScaleBelow);
+                    cmd.Parameters.AddWithValue("blur_multiplier", wl.blurMultiplier);
+                    cmd.Parameters.AddWithValue("big_wave_direction_x", wl.bigWaveDirection.X);
+                    cmd.Parameters.AddWithValue("big_wave_direction_y", wl.bigWaveDirection.Y);
+                    cmd.Parameters.AddWithValue("little_wave_direction_x", wl.littleWaveDirection.X);
+                    cmd.Parameters.AddWithValue("little_wave_direction_y", wl.littleWaveDirection.Y);
+                    cmd.Parameters.AddWithValue("normal_map_texture", wl.normalMapTexture);
+                    cmd.Parameters.AddWithValue("horizon_r", wl.horizon.X);
+                    cmd.Parameters.AddWithValue("horizon_g", wl.horizon.Y);
+                    cmd.Parameters.AddWithValue("horizon_b", wl.horizon.Z);
+                    cmd.Parameters.AddWithValue("horizon_i", wl.horizon.W);
+                    cmd.Parameters.AddWithValue("haze_horizon", wl.hazeHorizon);
+                    cmd.Parameters.AddWithValue("blue_density_r", wl.blueDensity.X);
+                    cmd.Parameters.AddWithValue("blue_density_g", wl.blueDensity.Y);
+                    cmd.Parameters.AddWithValue("blue_density_b", wl.blueDensity.Z);
+                    cmd.Parameters.AddWithValue("blue_density_i", wl.blueDensity.W);
+                    cmd.Parameters.AddWithValue("haze_density", wl.hazeDensity);
+                    cmd.Parameters.AddWithValue("density_multiplier", wl.densityMultiplier);
+                    cmd.Parameters.AddWithValue("distance_multiplier", wl.distanceMultiplier);
+                    cmd.Parameters.AddWithValue("max_altitude", wl.maxAltitude);
+                    cmd.Parameters.AddWithValue("sun_moon_color_r", wl.sunMoonColor.X);
+                    cmd.Parameters.AddWithValue("sun_moon_color_g", wl.sunMoonColor.Y);
+                    cmd.Parameters.AddWithValue("sun_moon_color_b", wl.sunMoonColor.Z);
+                    cmd.Parameters.AddWithValue("sun_moon_color_i", wl.sunMoonColor.W);
+                    cmd.Parameters.AddWithValue("sun_moon_position", wl.sunMoonPosition);
+                    cmd.Parameters.AddWithValue("ambient_r", wl.ambient.X);
+                    cmd.Parameters.AddWithValue("ambient_g", wl.ambient.Y);
+                    cmd.Parameters.AddWithValue("ambient_b", wl.ambient.Z);
+                    cmd.Parameters.AddWithValue("ambient_i", wl.ambient.W);
+                    cmd.Parameters.AddWithValue("east_angle", wl.eastAngle);
+                    cmd.Parameters.AddWithValue("sun_glow_focus", wl.sunGlowFocus);
+                    cmd.Parameters.AddWithValue("sun_glow_size", wl.sunGlowSize);
+                    cmd.Parameters.AddWithValue("scene_gamma", wl.sceneGamma);
+                    cmd.Parameters.AddWithValue("star_brightness", wl.starBrightness);
+                    cmd.Parameters.AddWithValue("cloud_color_r", wl.cloudColor.X);
+                    cmd.Parameters.AddWithValue("cloud_color_g", wl.cloudColor.Y);
+                    cmd.Parameters.AddWithValue("cloud_color_b", wl.cloudColor.Z);
+                    cmd.Parameters.AddWithValue("cloud_color_i", wl.cloudColor.W);
+                    cmd.Parameters.AddWithValue("cloud_x", wl.cloudXYDensity.X);
+                    cmd.Parameters.AddWithValue("cloud_y", wl.cloudXYDensity.Y);
+                    cmd.Parameters.AddWithValue("cloud_density", wl.cloudXYDensity.Z);
+                    cmd.Parameters.AddWithValue("cloud_coverage", wl.cloudCoverage);
+                    cmd.Parameters.AddWithValue("cloud_scale", wl.cloudScale);
+                    cmd.Parameters.AddWithValue("cloud_detail_x", wl.cloudDetailXYDensity.X);
+                    cmd.Parameters.AddWithValue("cloud_detail_y", wl.cloudDetailXYDensity.Y);
+                    cmd.Parameters.AddWithValue("cloud_detail_density", wl.cloudDetailXYDensity.Z);
+                    cmd.Parameters.AddWithValue("cloud_scroll_x", wl.cloudScrollX);
+                    cmd.Parameters.AddWithValue("cloud_scroll_x_lock", wl.cloudScrollXLock);
+                    cmd.Parameters.AddWithValue("cloud_scroll_y", wl.cloudScrollY);
+                    cmd.Parameters.AddWithValue("cloud_scroll_y_lock", wl.cloudScrollYLock);
+                    cmd.Parameters.AddWithValue("draw_classic_clouds", wl.drawClassicClouds);
+                    
+                    ExecuteNonQuery(cmd);
+                }
+            }
+        }
+
         public void StoreRegionSettings(RegionSettings rs)
         {
             lock (m_dbLock)
diff --git a/OpenSim/Data/Null/NullDataStore.cs b/OpenSim/Data/Null/NullDataStore.cs
index 427fa0a334..3ba44bb54b 100644
--- a/OpenSim/Data/Null/NullDataStore.cs
+++ b/OpenSim/Data/Null/NullDataStore.cs
@@ -50,7 +50,16 @@ namespace OpenSim.Data.Null
         public void StoreRegionSettings(RegionSettings rs)
         {
         }
-
+        public RegionLightShareData LoadRegionWindlightSettings(UUID regionUUID)
+        {
+            //This connector doesn't support the windlight module yet
+            //Return default LL windlight settings
+            return new RegionLightShareData();
+        }
+        public void StoreRegionWindlightSettings(RegionLightShareData wl)
+        {
+            //This connector doesn't support the windlight module yet
+        }
         public RegionSettings LoadRegionSettings(UUID regionUUID)
         {
             return null;
diff --git a/OpenSim/Data/SQLite/SQLiteRegionData.cs b/OpenSim/Data/SQLite/SQLiteRegionData.cs
index 5a4ee2ab72..d2ba9ae298 100644
--- a/OpenSim/Data/SQLite/SQLiteRegionData.cs
+++ b/OpenSim/Data/SQLite/SQLiteRegionData.cs
@@ -272,7 +272,16 @@ namespace OpenSim.Data.SQLite
                 Commit();
             }
         }
-
+        public RegionLightShareData LoadRegionWindlightSettings(UUID regionUUID)
+        {
+            //This connector doesn't support the windlight module yet
+            //Return default LL windlight settings
+            return new RegionLightShareData();
+        }
+        public void StoreRegionWindlightSettings(RegionLightShareData wl)
+        {
+            //This connector doesn't support the windlight module yet
+        }
         public RegionSettings LoadRegionSettings(UUID regionUUID)
         {
             lock (ds)
@@ -320,7 +329,7 @@ namespace OpenSim.Data.SQLite
             {
                 foreach (SceneObjectPart prim in obj.Children.Values)
                 {
-                    m_log.Info("[REGION DB]: Adding obj: " + obj.UUID + " to region: " + regionUUID);
+//                    m_log.Info("[REGION DB]: Adding obj: " + obj.UUID + " to region: " + regionUUID);
                     addPrim(prim, obj.UUID, regionUUID);
                 }
             }
diff --git a/OpenSim/Framework/IClientAPI.cs b/OpenSim/Framework/IClientAPI.cs
index 4f6f709adf..4577758a34 100644
--- a/OpenSim/Framework/IClientAPI.cs
+++ b/OpenSim/Framework/IClientAPI.cs
@@ -1150,7 +1150,7 @@ namespace OpenSim.Framework
 
         void SendInstantMessage(GridInstantMessage im);
 
-        void SendGenericMessage(string method, List<string> message);
+        void SendGenericMessage(string method, List<byte[]> message);
 
         void SendLayerData(float[] map);
         void SendLayerData(int px, int py, float[] map);
diff --git a/OpenSim/Framework/RegionInfo.cs b/OpenSim/Framework/RegionInfo.cs
index 5d63da7b14..5eacd73de8 100644
--- a/OpenSim/Framework/RegionInfo.cs
+++ b/OpenSim/Framework/RegionInfo.cs
@@ -36,8 +36,295 @@ using OpenMetaverse;
 using OpenMetaverse.StructuredData;
 using OpenSim.Framework.Console;
 
+
 namespace OpenSim.Framework
-{
+{
+    public class RegionLightShareData : ICloneable
+    {
+        public UUID regionID = UUID.Zero;
+        public Vector3 waterColor = new Vector3(4.0f,38.0f,64.0f);
+        public float waterFogDensityExponent = 4.0f;
+        public float underwaterFogModifier = 0.25f;
+        public Vector3 reflectionWaveletScale = new Vector3(2.0f,2.0f,2.0f);
+        public float fresnelScale = 0.40f;
+        public float fresnelOffset = 0.50f;
+        public float refractScaleAbove = 0.03f;
+        public float refractScaleBelow = 0.20f;
+        public float blurMultiplier = 0.040f;
+        public Vector2 bigWaveDirection = new Vector2(1.05f,-0.42f);
+        public Vector2 littleWaveDirection = new Vector2(1.11f,-1.16f);
+        public UUID normalMapTexture = new UUID("822ded49-9a6c-f61c-cb89-6df54f42cdf4");
+        public Vector4 horizon = new Vector4(0.25f, 0.25f, 0.32f, 0.32f);
+        public float hazeHorizon = 0.19f;
+        public Vector4 blueDensity = new Vector4(0.12f, 0.22f, 0.38f, 0.38f);
+        public float hazeDensity = 0.70f;
+        public float densityMultiplier = 0.18f;
+        public float distanceMultiplier = 0.8f;
+        public UInt16 maxAltitude = 1605;
+        public Vector4 sunMoonColor = new Vector4(0.24f, 0.26f, 0.30f, 0.30f);
+        public float sunMoonPosition = 0.317f;
+        public Vector4 ambient = new Vector4(0.35f,0.35f,0.35f,0.35f);
+        public float eastAngle = 0.0f;
+        public float sunGlowFocus = 0.10f;
+        public float sunGlowSize = 1.75f;
+        public float sceneGamma = 1.0f;
+        public float starBrightness = 0.0f;
+        public Vector4 cloudColor = new Vector4(0.41f, 0.41f, 0.41f, 0.41f);
+        public Vector3 cloudXYDensity = new Vector3(1.00f, 0.53f, 1.00f);
+        public float cloudCoverage = 0.27f;
+        public float cloudScale = 0.42f;
+        public Vector3 cloudDetailXYDensity = new Vector3(1.00f, 0.53f, 0.12f);
+        public float cloudScrollX = 0.20f;
+        public bool cloudScrollXLock = false;
+        public float cloudScrollY = 0.01f;
+        public bool cloudScrollYLock = false;
+        public bool drawClassicClouds = true;
+
+        public delegate void SaveDelegate(RegionLightShareData wl);
+        public event SaveDelegate OnSave;
+        public void Save()
+        {
+            if (OnSave != null)
+                OnSave(this);
+        }
+        public object Clone()
+        {
+            return this.MemberwiseClone();      // call clone method
+        }
+
+    }
+
+    [Serializable]
+    public class SimpleRegionInfo
+    {
+        // private static readonly log4net.ILog m_log
+        //     = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
+
+        /// <summary>
+        /// The port by which http communication occurs with the region (most noticeably, CAPS communication)
+        /// </summary>
+        public uint HttpPort
+        {
+            get { return m_httpPort; }
+            set { m_httpPort = value; }
+        }
+        protected uint m_httpPort;
+
+        /// <summary>
+        /// A well-formed URI for the host region server (namely "http://" + ExternalHostName)
+        /// </summary>
+        public string ServerURI
+        {
+            get { return m_serverURI; }
+            set { m_serverURI = value; }
+        }
+        protected string m_serverURI;
+
+        public string RegionName
+        {
+            get { return m_regionName; }
+            set { m_regionName = value; }
+        }
+        protected string m_regionName = String.Empty;
+
+        protected bool Allow_Alternate_Ports;
+        public bool m_allow_alternate_ports;
+        protected string m_externalHostName;
+
+        protected IPEndPoint m_internalEndPoint;
+        protected uint? m_regionLocX;
+        protected uint? m_regionLocY;
+        protected uint m_remotingPort;
+        public UUID RegionID = UUID.Zero;
+        public string RemotingAddress;
+        public UUID ScopeID = UUID.Zero;
+
+        public SimpleRegionInfo()
+        {
+        }
+
+        public SimpleRegionInfo(uint regionLocX, uint regionLocY, IPEndPoint internalEndPoint, string externalUri)
+        {
+            m_regionLocX = regionLocX;
+            m_regionLocY = regionLocY;
+
+            m_internalEndPoint = internalEndPoint;
+            m_externalHostName = externalUri;
+        }
+
+        public SimpleRegionInfo(uint regionLocX, uint regionLocY, string externalUri, uint port)
+        {
+            m_regionLocX = regionLocX;
+            m_regionLocY = regionLocY;
+
+            m_externalHostName = externalUri;
+
+            m_internalEndPoint = new IPEndPoint(IPAddress.Parse("0.0.0.0"), (int) port);
+        }
+
+        public SimpleRegionInfo(RegionInfo ConvertFrom)
+        {
+            m_regionName = ConvertFrom.RegionName;
+            m_regionLocX = ConvertFrom.RegionLocX;
+            m_regionLocY = ConvertFrom.RegionLocY;
+            m_internalEndPoint = ConvertFrom.InternalEndPoint;
+            m_externalHostName = ConvertFrom.ExternalHostName;
+            m_remotingPort = ConvertFrom.RemotingPort;
+            m_httpPort = ConvertFrom.HttpPort;
+            m_allow_alternate_ports = ConvertFrom.m_allow_alternate_ports;
+            RemotingAddress = ConvertFrom.RemotingAddress;
+            RegionID = UUID.Zero;
+            ServerURI = ConvertFrom.ServerURI;
+        }
+
+        public uint RemotingPort
+        {
+            get { return m_remotingPort; }
+            set { m_remotingPort = value; }
+        }
+
+        /// <value>
+        /// This accessor can throw all the exceptions that Dns.GetHostAddresses can throw.
+        ///
+        /// XXX Isn't this really doing too much to be a simple getter, rather than an explict method?
+        /// </value>
+        public IPEndPoint ExternalEndPoint
+        {
+            get
+            {
+                // Old one defaults to IPv6
+                //return new IPEndPoint(Dns.GetHostAddresses(m_externalHostName)[0], m_internalEndPoint.Port);
+
+                IPAddress ia = null;
+                // If it is already an IP, don't resolve it - just return directly
+                if (IPAddress.TryParse(m_externalHostName, out ia))
+                    return new IPEndPoint(ia, m_internalEndPoint.Port);
+
+                // Reset for next check
+                ia = null;
+                try
+                {
+                    foreach (IPAddress Adr in Dns.GetHostAddresses(m_externalHostName))
+                    {
+                        if (ia == null)
+                            ia = Adr;
+
+                        if (Adr.AddressFamily == AddressFamily.InterNetwork)
+                        {
+                            ia = Adr;
+                            break;
+                        }
+                    }
+                }
+                catch (SocketException e)
+                {
+                    throw new Exception(
+                        "Unable to resolve local hostname " + m_externalHostName + " innerException of type '" +
+                        e + "' attached to this exception", e);
+                }
+
+                return new IPEndPoint(ia, m_internalEndPoint.Port);
+            }
+
+            set { m_externalHostName = value.ToString(); }
+        }
+
+        public string ExternalHostName
+        {
+            get { return m_externalHostName; }
+            set { m_externalHostName = value; }
+        }
+
+        public IPEndPoint InternalEndPoint
+        {
+            get { return m_internalEndPoint; }
+            set { m_internalEndPoint = value; }
+        }
+
+        public uint RegionLocX
+        {
+            get { return m_regionLocX.Value; }
+            set { m_regionLocX = value; }
+        }
+
+        public uint RegionLocY
+        {
+            get { return m_regionLocY.Value; }
+            set { m_regionLocY = value; }
+        }
+
+        public ulong RegionHandle
+        {
+            get { return Util.UIntsToLong((RegionLocX * (uint) Constants.RegionSize), (RegionLocY * (uint) Constants.RegionSize)); }
+        }
+
+        public int getInternalEndPointPort()
+        {
+            return m_internalEndPoint.Port;
+        }
+
+        public Dictionary<string, object> ToKeyValuePairs()
+        {
+            Dictionary<string, object> kvp = new Dictionary<string, object>();
+            kvp["uuid"] = RegionID.ToString();
+            kvp["locX"] = RegionLocX.ToString();
+            kvp["locY"] = RegionLocY.ToString();
+            kvp["external_ip_address"] = ExternalEndPoint.Address.ToString();
+            kvp["external_port"] = ExternalEndPoint.Port.ToString();
+            kvp["external_host_name"] = ExternalHostName;
+            kvp["http_port"] = HttpPort.ToString();
+            kvp["internal_ip_address"] = InternalEndPoint.Address.ToString();
+            kvp["internal_port"] = InternalEndPoint.Port.ToString();
+            kvp["alternate_ports"] = m_allow_alternate_ports.ToString();
+            kvp["server_uri"] = ServerURI;
+
+            return kvp;
+        }
+
+        public SimpleRegionInfo(Dictionary<string, object> kvp)
+        {
+            if ((kvp["external_ip_address"] != null) && (kvp["external_port"] != null))
+            {
+                int port = 0;
+                Int32.TryParse((string)kvp["external_port"], out port);
+                IPEndPoint ep = new IPEndPoint(IPAddress.Parse((string)kvp["external_ip_address"]), port);
+                ExternalEndPoint = ep;
+            }
+            else
+                ExternalEndPoint = new IPEndPoint(IPAddress.Parse("0.0.0.0"), 0);
+
+            if (kvp["external_host_name"] != null)
+                ExternalHostName = (string)kvp["external_host_name"];
+
+            if (kvp["http_port"] != null)
+            {
+                UInt32 port = 0;
+                UInt32.TryParse((string)kvp["http_port"], out port);
+                HttpPort = port;
+            }
+
+            if ((kvp["internal_ip_address"] != null) && (kvp["internal_port"] != null))
+            {
+                int port = 0;
+                Int32.TryParse((string)kvp["internal_port"], out port);
+                IPEndPoint ep = new IPEndPoint(IPAddress.Parse((string)kvp["internal_ip_address"]), port);
+                InternalEndPoint = ep;
+            }
+            else
+                InternalEndPoint = new IPEndPoint(IPAddress.Parse("0.0.0.0"), 0);
+
+            if (kvp["alternate_ports"] != null)
+            {
+                bool alts = false;
+                Boolean.TryParse((string)kvp["alternate_ports"], out alts);
+                m_allow_alternate_ports = alts;
+            }
+
+            if (kvp["server_uri"] != null)
+                ServerURI = (string)kvp["server_uri"];
+        }
+    }
+
     public class RegionInfo
     {
         // private static readonly log4net.ILog m_log
@@ -69,6 +356,7 @@ namespace OpenSim.Framework
         private bool m_clampPrimSize = false;
         private int m_objectCapacity = 0;
         private string m_regionType = String.Empty;
+        private RegionLightShareData m_windlight = new RegionLightShareData();
         protected uint m_httpPort;
         protected string m_serverURI;
         protected string m_regionName = String.Empty;
@@ -207,6 +495,21 @@ namespace OpenSim.Framework
             set { m_regionSettings = value; }
         }
 
+        public RegionLightShareData WindlightSettings
+        {
+            get
+            {
+                if (m_windlight == null)
+                {
+                    m_windlight = new RegionLightShareData();
+                }
+
+                return m_windlight;
+            }
+
+            set { m_windlight = value; }
+        }
+
         public int NonphysPrimMax
         {
             get { return m_nonphysPrimMax; }
diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs
index 9ba99d69f6..25f6ef0835 100644
--- a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs
+++ b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs
@@ -845,17 +845,18 @@ namespace OpenSim.Region.ClientStack.LindenUDP
             }
         }
 
-        public void SendGenericMessage(string method, List<string> message)
+        public void SendGenericMessage(string method, List<byte[]> message)
         {
             GenericMessagePacket gmp = new GenericMessagePacket();
             gmp.MethodData.Method = Util.StringToBytes256(method);
             gmp.ParamList = new GenericMessagePacket.ParamListBlock[message.Count];
             int i = 0;
-            foreach (string val in message)
+            foreach (byte[] val in message)
             {
                 gmp.ParamList[i] = new GenericMessagePacket.ParamListBlock();
-                gmp.ParamList[i++].Parameter = Util.StringToBytes256(val);
+                gmp.ParamList[i++].Parameter = val;
             }
+
             OutPacket(gmp, ThrottleOutPacketType.Task);
         }
 
diff --git a/OpenSim/Region/Examples/SimpleModule/MyNpcCharacter.cs b/OpenSim/Region/Examples/SimpleModule/MyNpcCharacter.cs
index d052f38a2c..8d27f9cf29 100644
--- a/OpenSim/Region/Examples/SimpleModule/MyNpcCharacter.cs
+++ b/OpenSim/Region/Examples/SimpleModule/MyNpcCharacter.cs
@@ -460,7 +460,7 @@ namespace OpenSim.Region.Examples.SimpleModule
             
         }
 
-        public void SendGenericMessage(string method, List<string> message)
+        public void SendGenericMessage(string method, List<byte[]> message)
         {
 
         }
diff --git a/OpenSim/Region/Framework/Interfaces/IRegionDataStore.cs b/OpenSim/Region/Framework/Interfaces/IRegionDataStore.cs
index 78bd622fdd..3e8e19670c 100644
--- a/OpenSim/Region/Framework/Interfaces/IRegionDataStore.cs
+++ b/OpenSim/Region/Framework/Interfaces/IRegionDataStore.cs
@@ -103,6 +103,8 @@ namespace OpenSim.Region.Framework.Interfaces
 
         void StoreRegionSettings(RegionSettings rs);
         RegionSettings LoadRegionSettings(UUID regionUUID);
+        RegionLightShareData LoadRegionWindlightSettings(UUID regionUUID);
+        void StoreRegionWindlightSettings(RegionLightShareData wl);
 
         void Shutdown();
     }
diff --git a/OpenSim/Region/Framework/Scenes/EventManager.cs b/OpenSim/Region/Framework/Scenes/EventManager.cs
index dc9ae19f85..ef125cd357 100644
--- a/OpenSim/Region/Framework/Scenes/EventManager.cs
+++ b/OpenSim/Region/Framework/Scenes/EventManager.cs
@@ -206,7 +206,11 @@ namespace OpenSim.Region.Framework.Scenes
         public event OnMakeChildAgentDelegate OnMakeChildAgent;
 
         public delegate void OnMakeRootAgentDelegate(ScenePresence presence);
+        public delegate void OnSaveNewWindlightProfileDelegate();
+        public delegate void OnSendNewWindlightProfileTargetedDelegate(RegionLightShareData wl, UUID user);
         public event OnMakeRootAgentDelegate OnMakeRootAgent;
+        public event OnSendNewWindlightProfileTargetedDelegate OnSendNewWindlightProfileTargeted;
+        public event OnSaveNewWindlightProfileDelegate OnSaveNewWindlightProfile;
 
         /// <summary>
         /// Triggered when an object or attachment enters a scene
@@ -1216,6 +1220,24 @@ namespace OpenSim.Region.Framework.Scenes
             }
         }
 
+        public void TriggerOnSendNewWindlightProfileTargeted(RegionLightShareData wl, UUID user)
+        {
+            OnSendNewWindlightProfileTargetedDelegate handlerSendNewWindlightProfileTargeted = OnSendNewWindlightProfileTargeted;
+            if (handlerSendNewWindlightProfileTargeted != null)
+            {
+                handlerSendNewWindlightProfileTargeted(wl, user);
+            }
+        }
+
+        public void TriggerOnSaveNewWindlightProfile()
+        {
+            OnSaveNewWindlightProfileDelegate handlerSaveNewWindlightProfile = OnSaveNewWindlightProfile;
+            if (handlerSaveNewWindlightProfile != null)
+            {
+                handlerSaveNewWindlightProfile();
+            }
+        }
+
         public void TriggerOnMakeRootAgent(ScenePresence presence)
         {
             OnMakeRootAgentDelegate handlerMakeRootAgent = OnMakeRootAgent;
@@ -1992,4 +2014,4 @@ namespace OpenSim.Region.Framework.Scenes
             }
         }
     }
-}
\ No newline at end of file
+}
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index 0085df3834..fc915a38b4 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -1715,6 +1715,19 @@ namespace OpenSim.Region.Framework.Scenes
             m_storageManager.DataStore.StoreTerrain(Heightmap.GetDoubles(), RegionInfo.RegionID);
         }
 
+        public void StoreWindlightProfile(RegionLightShareData wl)
+        {
+            m_regInfo.WindlightSettings = wl;
+            m_storageManager.DataStore.StoreRegionWindlightSettings(wl);
+            m_eventManager.TriggerOnSaveNewWindlightProfile();
+        }
+
+        public void LoadWindlightProfile()
+        {
+            m_regInfo.WindlightSettings = m_storageManager.DataStore.LoadRegionWindlightSettings(RegionInfo.RegionID);
+            m_eventManager.TriggerOnSaveNewWindlightProfile();
+        }
+
         /// <summary>
         /// Loads the World heightmap
         /// </summary>
diff --git a/OpenSim/Region/Framework/Scenes/Tests/SceneTests.cs b/OpenSim/Region/Framework/Scenes/Tests/SceneTests.cs
index c77220ca1e..8b2d387618 100644
--- a/OpenSim/Region/Framework/Scenes/Tests/SceneTests.cs
+++ b/OpenSim/Region/Framework/Scenes/Tests/SceneTests.cs
@@ -101,7 +101,16 @@ namespace OpenSim.Region.Framework.Scenes.Tests
                 {
                     throw new NotImplementedException();
                 }
-
+                public RegionLightShareData LoadRegionWindlightSettings(UUID regionUUID)
+                {
+                    //This connector doesn't support the windlight module yet
+                    //Return default LL windlight settings
+                    return new RegionLightShareData();
+                }
+                public void StoreRegionWindlightSettings(RegionLightShareData wl)
+                {
+                    //This connector doesn't support the windlight module yet
+                }
                 public RegionSettings LoadRegionSettings(UUID regionUUID)
                 {
                     return null;
diff --git a/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs b/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs
index 18859463a8..f5b148f69d 100644
--- a/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs
+++ b/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs
@@ -964,7 +964,7 @@ namespace OpenSim.Region.OptionalModules.Agent.InternetRelayClientView.Server
             // TODO
         }
 
-        public void SendGenericMessage(string method, List<string> message)
+        public void SendGenericMessage(string method, List<byte[]> message)
         {
             
         }
diff --git a/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs b/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs
index 77958eb003..338c04b271 100644
--- a/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs
+++ b/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs
@@ -550,7 +550,7 @@ namespace OpenSim.Region.OptionalModules.World.NPC
             
         }
 
-        public void SendGenericMessage(string method, List<string> message)
+        public void SendGenericMessage(string method, List<byte[]> message)
         {
 
         }
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OpenSim.Region.ScriptEngine.Shared.Api.Runtime.mdp b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OpenSim.Region.ScriptEngine.Shared.Api.Runtime.mdp
index 98bbc68965..23138efc4a 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OpenSim.Region.ScriptEngine.Shared.Api.Runtime.mdp
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OpenSim.Region.ScriptEngine.Shared.Api.Runtime.mdp
@@ -17,6 +17,8 @@
     <excludeFiles />
   </DeploymentInformation>
   <Contents>
+    <File name="./CM_Constants.cs" subtype="Code" buildaction="Compile" dependson="" data="" />
+    <File name="./CM_Stub.cs" subtype="Code" buildaction="Compile" dependson="" data="" />
     <File name="./Executor.cs" subtype="Code" buildaction="Compile" dependson="" data="" />
     <File name="./LSL_Constants.cs" subtype="Code" buildaction="Compile" dependson="" data="" />
     <File name="./LSL_Stub.cs" subtype="Code" buildaction="Compile" dependson="" data="" />
diff --git a/OpenSim/Tests/Common/Mock/TestClient.cs b/OpenSim/Tests/Common/Mock/TestClient.cs
index 5fff279973..f015db2c84 100644
--- a/OpenSim/Tests/Common/Mock/TestClient.cs
+++ b/OpenSim/Tests/Common/Mock/TestClient.cs
@@ -518,7 +518,7 @@ namespace OpenSim.Tests.Common.Mock
 
         }
 
-        public void SendGenericMessage(string method, List<string> message)
+        public void SendGenericMessage(string method, List<byte[]> message)
         {
 
         }

From d315fce2ffb378c73efe3c768b1c9fe5959f2e11 Mon Sep 17 00:00:00 2001
From: Melanie <melanie@t-data.com>
Date: Wed, 31 Mar 2010 04:22:51 +0100
Subject: [PATCH 2/7] Adding the configuration example

---
 bin/OpenSim.ini.example | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/bin/OpenSim.ini.example b/bin/OpenSim.ini.example
index 1a67292102..24573185d1 100644
--- a/bin/OpenSim.ini.example
+++ b/bin/OpenSim.ini.example
@@ -768,6 +768,12 @@
     ; default is 1000
     cloud_update_rate = 1000
 
+[LightShare]
+
+    ; This enables the transmission of Windlight scenes to supporting clients, such as the Meta7 viewer.
+    ; It has no ill effect on viewers which do not support server-side windlight settings.
+    ; Currently we only have support for MySQL databases.
+    enable_windlight = false;
 
 [Trees]
     ; Enable this to allow the tree module to manage your sim trees, including growing, reproducing and dying

From 19ae5e5dbb3ae12907305a7fad4cd2f4952ae94c Mon Sep 17 00:00:00 2001
From: Melanie <melanie@t-data.com>
Date: Wed, 31 Mar 2010 04:23:51 +0100
Subject: [PATCH 3/7] Adding the LightShare module and scripting API. This code
 was written by TomMeta and was contributed by Meta7.

---
 .../LightShare/LightShareModule.cs            | 274 ++++++++++
 .../Shared/Api/Implementation/CM_Api.cs       | 477 ++++++++++++++++++
 .../Shared/Api/Interface/ICM_Api.cs           |  21 +
 .../Shared/Api/Runtime/CM_Constants.cs        |  77 +++
 .../Shared/Api/Runtime/CM_Stub.cs             |  76 +++
 5 files changed, 925 insertions(+)
 create mode 100644 OpenSim/Region/CoreModules/LightShare/LightShareModule.cs
 create mode 100644 OpenSim/Region/ScriptEngine/Shared/Api/Implementation/CM_Api.cs
 create mode 100644 OpenSim/Region/ScriptEngine/Shared/Api/Interface/ICM_Api.cs
 create mode 100644 OpenSim/Region/ScriptEngine/Shared/Api/Runtime/CM_Constants.cs
 create mode 100644 OpenSim/Region/ScriptEngine/Shared/Api/Runtime/CM_Stub.cs

diff --git a/OpenSim/Region/CoreModules/LightShare/LightShareModule.cs b/OpenSim/Region/CoreModules/LightShare/LightShareModule.cs
new file mode 100644
index 0000000000..77d6e9a4bc
--- /dev/null
+++ b/OpenSim/Region/CoreModules/LightShare/LightShareModule.cs
@@ -0,0 +1,274 @@
+/*
+ * Copyright (c) Thomas Grimshaw and Magne Metaverse Research
+ *  
+ * This module is not open source. All rights reserved.
+ * Unauthorised copying, distribution or public display is prohibited.
+ *
+ */
+
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Reflection;
+using OpenMetaverse;
+using log4net;
+using Nini.Config;
+using OpenSim.Data;
+using OpenSim.Framework;
+using OpenSim.Region.CoreModules.Framework.InterfaceCommander;
+using OpenSim.Region.Framework.Interfaces;
+using OpenSim.Region.Framework.Scenes;
+
+
+namespace OpenSim.Region.CoreModules.World.LightShare
+{
+    public class LightShareModule : IRegionModule, ICommandableModule
+    {
+        private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
+        private readonly Commander m_commander = new Commander("windlight");
+        private Scene m_scene;
+        private static bool m_enableWindlight;
+
+        #region ICommandableModule Members
+
+        public ICommander CommandInterface
+        {
+            get { return m_commander; }
+        }
+
+        #endregion
+
+        #region IRegionModule Members
+
+        public static bool EnableWindlight
+        {
+            get
+            {
+                return m_enableWindlight;
+            }
+            set
+            {
+            }
+        }
+
+        public void Initialise(Scene scene, IConfigSource config)
+        {
+            m_scene = scene;
+            m_scene.RegisterModuleInterface<IRegionModule>(this);
+            m_scene.EventManager.OnPluginConsole += EventManager_OnPluginConsole;
+            
+            // ini file settings
+            try
+            {
+                m_enableWindlight = config.Configs["LightShare"].GetBoolean("enable_windlight", false);
+            }
+            catch (Exception)
+            {
+                m_log.Debug("[WINDLIGHT]: ini failure for enable_windlight - using default");
+            }
+
+            if (m_enableWindlight)
+            {
+                m_scene.EventManager.OnMakeRootAgent += EventManager_OnMakeRootAgent;
+                m_scene.EventManager.OnSaveNewWindlightProfile += EventManager_OnSaveNewWindlightProfile;
+                m_scene.EventManager.OnSendNewWindlightProfileTargeted += EventManager_OnSendNewWindlightProfileTargeted;
+            }
+
+            InstallCommands();
+
+            m_log.Debug("[WINDLIGHT]: Initialised windlight module");
+        }
+
+        private List<byte[]> compileWindlightSettings(RegionLightShareData wl)
+        {
+            byte[] mBlock = new Byte[249];
+            int pos = 0;
+
+            wl.waterColor.ToBytes(mBlock, 0); pos += 12;
+            Utils.FloatToBytes(wl.waterFogDensityExponent).CopyTo(mBlock, pos); pos += 4;
+            Utils.FloatToBytes(wl.underwaterFogModifier).CopyTo(mBlock, pos); pos += 4;
+            wl.reflectionWaveletScale.ToBytes(mBlock, pos); pos += 12;
+            Utils.FloatToBytes(wl.fresnelScale).CopyTo(mBlock, pos); pos += 4;
+            Utils.FloatToBytes(wl.fresnelOffset).CopyTo(mBlock, pos); pos += 4;
+            Utils.FloatToBytes(wl.refractScaleAbove).CopyTo(mBlock, pos); pos += 4;
+            Utils.FloatToBytes(wl.refractScaleBelow).CopyTo(mBlock, pos); pos += 4;
+            Utils.FloatToBytes(wl.blurMultiplier).CopyTo(mBlock, pos); pos += 4;
+            wl.bigWaveDirection.ToBytes(mBlock, pos); pos += 8;
+            wl.littleWaveDirection.ToBytes(mBlock, pos); pos += 8;
+            wl.normalMapTexture.ToBytes(mBlock, pos); pos += 16;
+            wl.horizon.ToBytes(mBlock, pos); pos += 16;
+            Utils.FloatToBytes(wl.hazeHorizon).CopyTo(mBlock, pos); pos += 4;
+            wl.blueDensity.ToBytes(mBlock, pos); pos += 16;
+            Utils.FloatToBytes(wl.hazeDensity).CopyTo(mBlock, pos); pos += 4;
+            Utils.FloatToBytes(wl.densityMultiplier).CopyTo(mBlock, pos); pos += 4;
+            Utils.FloatToBytes(wl.distanceMultiplier).CopyTo(mBlock, pos); pos += 4;
+            wl.sunMoonColor.ToBytes(mBlock, pos); pos += 16;
+            Utils.FloatToBytes(wl.sunMoonPosition).CopyTo(mBlock, pos); pos += 4;
+            wl.ambient.ToBytes(mBlock, pos); pos += 16;
+            Utils.FloatToBytes(wl.eastAngle).CopyTo(mBlock, pos); pos += 4;
+            Utils.FloatToBytes(wl.sunGlowFocus).CopyTo(mBlock, pos); pos += 4;
+            Utils.FloatToBytes(wl.sunGlowSize).CopyTo(mBlock, pos); pos += 4;
+            Utils.FloatToBytes(wl.sceneGamma).CopyTo(mBlock, pos); pos += 4;
+            Utils.FloatToBytes(wl.starBrightness).CopyTo(mBlock, pos); pos += 4;
+            wl.cloudColor.ToBytes(mBlock, pos); pos += 16;
+            wl.cloudXYDensity.ToBytes(mBlock, pos); pos += 12;
+            Utils.FloatToBytes(wl.cloudCoverage).CopyTo(mBlock, pos); pos += 4;
+            Utils.FloatToBytes(wl.cloudScale).CopyTo(mBlock, pos); pos += 4;
+            wl.cloudDetailXYDensity.ToBytes(mBlock, pos); pos += 12;
+            Utils.FloatToBytes(wl.cloudScrollX).CopyTo(mBlock, pos); pos += 4;
+            Utils.FloatToBytes(wl.cloudScrollY).CopyTo(mBlock, pos); pos += 4;
+            Utils.UInt16ToBytes(wl.maxAltitude).CopyTo(mBlock, pos); pos += 2;
+            mBlock[pos] = Convert.ToByte(wl.cloudScrollXLock); pos++;
+            mBlock[pos] = Convert.ToByte(wl.cloudScrollYLock); pos++;
+            mBlock[pos] = Convert.ToByte(wl.drawClassicClouds); pos++;
+            List<byte[]> param = new List<byte[]>();
+            param.Add(mBlock);
+            return param;
+        }
+        public void SendProfileToClient(ScenePresence presence)
+        {
+            IClientAPI client = presence.ControllingClient;
+            if (m_enableWindlight)
+            {
+                if (presence.IsChildAgent == false)
+                {
+                    List<byte[]> param = compileWindlightSettings(m_scene.RegionInfo.WindlightSettings);
+                    client.SendGenericMessage("Windlight", param);
+                }
+            }
+            else
+            {
+                //We probably don't want to spam chat with this.. probably
+                //m_log.Debug("[WINDLIGHT]: Module disabled");
+            }
+        }
+        public void SendProfileToClient(ScenePresence presence, RegionLightShareData wl)
+        {
+            IClientAPI client = presence.ControllingClient;
+            if (m_enableWindlight)
+            {
+                if (presence.IsChildAgent == false)
+                {
+                    List<byte[]> param = compileWindlightSettings(wl);
+                    client.SendGenericMessage("Windlight", param);
+                }
+            }
+            else
+            {
+                //We probably don't want to spam chat with this.. probably
+                //m_log.Debug("[WINDLIGHT]: Module disabled");
+            }
+        }
+        private void EventManager_OnMakeRootAgent(ScenePresence presence)
+        {
+            m_log.Debug("[WINDLIGHT]: Sending windlight scene to new client");
+            SendProfileToClient(presence);
+        }
+        private void EventManager_OnSendNewWindlightProfileTargeted(RegionLightShareData wl, UUID pUUID)
+        {
+            ScenePresence Sc;
+            if (m_scene.TryGetScenePresence(pUUID,out Sc))
+            {
+                SendProfileToClient(Sc,wl);
+            }
+        }
+        private void EventManager_OnSaveNewWindlightProfile()
+        {
+            m_scene.ForEachScenePresence(SendProfileToClient);
+        }
+
+        public void PostInitialise()
+        {
+
+        }
+
+        public void Close()
+        {
+        }
+
+        public string Name
+        {
+            get { return "LightShareModule"; }
+        }
+
+        public bool IsSharedModule
+        {
+            get { return false; }
+        }
+
+        #endregion
+
+        #region events
+
+        #endregion
+
+        #region ICommandableModule Members
+
+        private void InstallCommands()
+        {
+            Command wlload = new Command("load", CommandIntentions.COMMAND_NON_HAZARDOUS, HandleLoad, "Load windlight profile from the database and broadcast");
+            Command wlenable = new Command("enable", CommandIntentions.COMMAND_NON_HAZARDOUS, HandleEnable, "Enable the windlight plugin");
+            Command wldisable = new Command("disable", CommandIntentions.COMMAND_NON_HAZARDOUS, HandleDisable, "Enable the windlight plugin");
+
+            m_commander.RegisterCommand("load", wlload);
+            m_commander.RegisterCommand("enable", wlenable);
+            m_commander.RegisterCommand("disable", wldisable);
+
+            m_scene.RegisterModuleCommander(m_commander);
+        }
+
+        private void HandleLoad(Object[] args)
+        {
+            if (!m_enableWindlight)
+            {
+                m_log.InfoFormat("[WINDLIGHT]: Cannot load windlight profile, module disabled. Use 'windlight enable' first.");
+            }
+            else
+            {
+                m_log.InfoFormat("[WINDLIGHT]: Loading Windlight profile from database");
+                m_scene.LoadWindlightProfile();
+                m_log.InfoFormat("[WINDLIGHT]: Load complete");
+            }
+        }
+
+        private void HandleDisable(Object[] args)
+        {
+            m_log.InfoFormat("[WINDLIGHT]: Plugin now disabled");
+            m_enableWindlight=false;
+        }
+
+        private void HandleEnable(Object[] args)
+        {
+            m_log.InfoFormat("[WINDLIGHT]: Plugin now enabled");
+            m_enableWindlight = true;
+        }
+
+        /// <summary>
+        /// Processes commandline input. Do not call directly.
+        /// </summary>
+        /// <param name="args">Commandline arguments</param>
+        private void EventManager_OnPluginConsole(string[] args)
+        {
+            if (args[0] == "windlight")
+            {
+                if (args.Length == 1)
+                {
+                    m_commander.ProcessConsoleCommand("add", new string[0]);
+                    return;
+                }
+
+                string[] tmpArgs = new string[args.Length - 2];
+                int i;
+                for (i = 2; i < args.Length; i++)
+                {
+                    tmpArgs[i - 2] = args[i];
+                }
+
+                m_commander.ProcessConsoleCommand(args[1], tmpArgs);
+            }
+        }
+        #endregion
+
+    }
+}
+
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/CM_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/CM_Api.cs
new file mode 100644
index 0000000000..4e8a3c4b60
--- /dev/null
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/CM_Api.cs
@@ -0,0 +1,477 @@
+using System;
+using System.Reflection;
+using System.Collections;
+using System.Collections.Generic;
+using System.Runtime.Remoting.Lifetime;
+using OpenMetaverse;
+using Nini.Config;
+using OpenSim;
+using OpenSim.Framework;
+using OpenSim.Region.CoreModules.World.LightShare;
+using OpenSim.Region.Framework.Interfaces;
+using OpenSim.Region.Framework.Scenes;
+using OpenSim.Region.ScriptEngine.Shared;
+using OpenSim.Region.ScriptEngine.Shared.Api.Plugins;
+using OpenSim.Region.ScriptEngine.Shared.ScriptBase;
+using OpenSim.Region.ScriptEngine.Interfaces;
+using OpenSim.Region.ScriptEngine.Shared.Api.Interfaces;
+
+using LSL_Float = OpenSim.Region.ScriptEngine.Shared.LSL_Types.LSLFloat;
+using LSL_Integer = OpenSim.Region.ScriptEngine.Shared.LSL_Types.LSLInteger;
+using LSL_Key = OpenSim.Region.ScriptEngine.Shared.LSL_Types.LSLString;
+using LSL_List = OpenSim.Region.ScriptEngine.Shared.LSL_Types.list;
+using LSL_Rotation = OpenSim.Region.ScriptEngine.Shared.LSL_Types.Quaternion;
+using LSL_String = OpenSim.Region.ScriptEngine.Shared.LSL_Types.LSLString;
+using LSL_Vector = OpenSim.Region.ScriptEngine.Shared.LSL_Types.Vector3;
+
+namespace OpenSim.Region.ScriptEngine.Shared.Api
+{
+    [Serializable]
+    public class CM_Api : MarshalByRefObject, ICM_Api, IScriptApi
+    {
+        internal IScriptEngine m_ScriptEngine;
+        internal SceneObjectPart m_host;
+        internal uint m_localID;
+        internal UUID m_itemID;
+        internal bool m_CMFunctionsEnabled = false;
+        internal IScriptModuleComms m_comms = null;
+
+        public void Initialize(IScriptEngine ScriptEngine, SceneObjectPart host, uint localID, UUID itemID)
+        {
+            m_ScriptEngine = ScriptEngine;
+            m_host = host;
+            m_localID = localID;
+            m_itemID = itemID;
+
+            if (m_ScriptEngine.Config.GetBoolean("AllowCareminsterFunctions", false))
+                m_CMFunctionsEnabled = true;
+
+            m_comms = m_ScriptEngine.World.RequestModuleInterface<IScriptModuleComms>();
+            if (m_comms == null)
+                m_CMFunctionsEnabled = false;
+        }
+
+        public override Object InitializeLifetimeService()
+        {
+            ILease lease = (ILease)base.InitializeLifetimeService();
+
+            if (lease.CurrentState == LeaseState.Initial)
+            {
+                lease.InitialLeaseTime = TimeSpan.FromMinutes(0);
+                //                lease.RenewOnCallTime = TimeSpan.FromSeconds(10.0);
+                //                lease.SponsorshipTimeout = TimeSpan.FromMinutes(1.0);
+            }
+            return lease;
+        }
+
+        public Scene World
+        {
+            get { return m_ScriptEngine.World; }
+        }
+
+        //
+        //Dumps an error message on the debug console.
+        //
+
+        internal void CMShoutError(string message)
+        {
+            if (message.Length > 1023)
+                message = message.Substring(0, 1023);
+
+            World.SimChat(Utils.StringToBytes(message),
+                          ChatTypeEnum.Shout, ScriptBaseClass.DEBUG_CHANNEL, m_host.ParentGroup.RootPart.AbsolutePosition, m_host.Name, m_host.UUID, true);
+
+            IWorldComm wComm = m_ScriptEngine.World.RequestModuleInterface<IWorldComm>();
+            wComm.DeliverMessage(ChatTypeEnum.Shout, ScriptBaseClass.DEBUG_CHANNEL, m_host.Name, m_host.UUID, message);
+        }
+
+        /// <summary>
+        /// Get the current Windlight scene
+        /// </summary>
+        /// <returns>List of windlight parameters</returns>
+        public LSL_List cmGetWindlightScene(LSL_List rules)
+        {
+            if (!m_CMFunctionsEnabled)
+            {
+                CMShoutError("Careminster functions are not enabled.");
+                return new LSL_List();
+            }
+            m_host.AddScriptLPS(1);
+            RegionLightShareData wl = m_host.ParentGroup.Scene.RegionInfo.WindlightSettings;
+
+            LSL_List values = new LSL_List();
+            int idx = 0;
+            while (idx < rules.Length)
+            {
+                uint rule = (uint)rules.GetLSLIntegerItem(idx);
+                LSL_List toadd = new LSL_List();
+
+                switch (rule)
+                {
+                    case (int)ScriptBaseClass.WL_AMBIENT:
+                        toadd.Add(new LSL_Rotation(wl.ambient.X, wl.ambient.Y, wl.ambient.Z, wl.ambient.W));
+                        break;
+                    case (int)ScriptBaseClass.WL_BIG_WAVE_DIRECTION:
+                        toadd.Add(new LSL_Vector(wl.bigWaveDirection.X, wl.bigWaveDirection.Y, 0.0f));
+                        break;
+                    case (int)ScriptBaseClass.WL_BLUE_DENSITY:
+                        toadd.Add(new LSL_Rotation(wl.blueDensity.X, wl.blueDensity.Y, wl.blueDensity.Z, wl.blueDensity.W));
+                        break;
+                    case (int)ScriptBaseClass.WL_BLUR_MULTIPLIER:
+                        toadd.Add(new LSL_Float(wl.blurMultiplier));
+                        break;
+                    case (int)ScriptBaseClass.WL_CLOUD_COLOR:
+                        toadd.Add(new LSL_Rotation(wl.cloudColor.X, wl.cloudColor.Y, wl.cloudColor.Z, wl.cloudColor.W));
+                        break;
+                    case (int)ScriptBaseClass.WL_CLOUD_COVERAGE:
+                        toadd.Add(new LSL_Float(wl.cloudCoverage));
+                        break;
+                    case (int)ScriptBaseClass.WL_CLOUD_DETAIL_XY_DENSITY:
+                        toadd.Add(new LSL_Vector(wl.cloudDetailXYDensity.X, wl.cloudDetailXYDensity.Y, wl.cloudDetailXYDensity.Z));
+                        break;
+                    case (int)ScriptBaseClass.WL_CLOUD_SCALE:
+                        toadd.Add(new LSL_Float(wl.cloudScale));
+                        break;
+                    case (int)ScriptBaseClass.WL_CLOUD_SCROLL_X:
+                        toadd.Add(new LSL_Float(wl.cloudScrollX));
+                        break;
+                    case (int)ScriptBaseClass.WL_CLOUD_SCROLL_X_LOCK:
+                        toadd.Add(new LSL_Integer(wl.cloudScrollXLock ? 1 : 0));
+                        break;
+                    case (int)ScriptBaseClass.WL_CLOUD_SCROLL_Y:
+                        toadd.Add(new LSL_Float(wl.cloudScrollY));
+                        break;
+                    case (int)ScriptBaseClass.WL_CLOUD_SCROLL_Y_LOCK:
+                        toadd.Add(new LSL_Integer(wl.cloudScrollYLock ? 1 : 0));
+                        break;
+                    case (int)ScriptBaseClass.WL_CLOUD_XY_DENSITY:
+                        toadd.Add(new LSL_Vector(wl.cloudXYDensity.X, wl.cloudXYDensity.Y, wl.cloudXYDensity.Z));
+                        break;
+                    case (int)ScriptBaseClass.WL_DENSITY_MULTIPLIER:
+                        toadd.Add(new LSL_Float(wl.densityMultiplier));
+                        break;
+                    case (int)ScriptBaseClass.WL_DISTANCE_MULTIPLIER:
+                        toadd.Add(new LSL_Float(wl.distanceMultiplier));
+                        break;
+                    case (int)ScriptBaseClass.WL_DRAW_CLASSIC_CLOUDS:
+                        toadd.Add(new LSL_Integer(wl.drawClassicClouds ? 1 : 0));
+                        break;
+                    case (int)ScriptBaseClass.WL_EAST_ANGLE:
+                        toadd.Add(new LSL_Float(wl.eastAngle));
+                        break;
+                    case (int)ScriptBaseClass.WL_FRESNEL_OFFSET:
+                        toadd.Add(new LSL_Float(wl.fresnelOffset));
+                        break;
+                    case (int)ScriptBaseClass.WL_FRESNEL_SCALE:
+                        toadd.Add(new LSL_Float(wl.fresnelScale));
+                        break;
+                    case (int)ScriptBaseClass.WL_HAZE_DENSITY:
+                        toadd.Add(new LSL_Float(wl.hazeDensity));
+                        break;
+                    case (int)ScriptBaseClass.WL_HAZE_HORIZON:
+                        toadd.Add(new LSL_Float(wl.hazeHorizon));
+                        break;
+                    case (int)ScriptBaseClass.WL_HORIZON:
+                        toadd.Add(new LSL_Rotation(wl.horizon.X, wl.horizon.Y, wl.horizon.Z, wl.horizon.W));
+                        break;
+                    case (int)ScriptBaseClass.WL_LITTLE_WAVE_DIRECTION:
+                        toadd.Add(new LSL_Vector(wl.littleWaveDirection.X, wl.littleWaveDirection.Y, 0.0f));
+                        break;
+                    case (int)ScriptBaseClass.WL_MAX_ALTITUDE:
+                        toadd.Add(new LSL_Integer(wl.maxAltitude));
+                        break;
+                    case (int)ScriptBaseClass.WL_NORMAL_MAP_TEXTURE:
+                        toadd.Add(new LSL_Key(wl.normalMapTexture.ToString()));
+                        break;
+                    case (int)ScriptBaseClass.WL_REFLECTION_WAVELET_SCALE:
+                        toadd.Add(new LSL_Vector(wl.reflectionWaveletScale.X, wl.reflectionWaveletScale.Y, wl.reflectionWaveletScale.Z));
+                        break;
+                    case (int)ScriptBaseClass.WL_REFRACT_SCALE_ABOVE:
+                        toadd.Add(new LSL_Float(wl.refractScaleAbove));
+                        break;
+                    case (int)ScriptBaseClass.WL_REFRACT_SCALE_BELOW:
+                        toadd.Add(new LSL_Float(wl.refractScaleBelow));
+                        break;
+                    case (int)ScriptBaseClass.WL_SCENE_GAMMA:
+                        toadd.Add(new LSL_Float(wl.sceneGamma));
+                        break;
+                    case (int)ScriptBaseClass.WL_STAR_BRIGHTNESS:
+                        toadd.Add(new LSL_Float(wl.starBrightness));
+                        break;
+                    case (int)ScriptBaseClass.WL_SUN_GLOW_FOCUS:
+                        toadd.Add(new LSL_Float(wl.sunGlowFocus));
+                        break;
+                    case (int)ScriptBaseClass.WL_SUN_GLOW_SIZE:
+                        toadd.Add(new LSL_Float(wl.sunGlowSize));
+                        break;
+                    case (int)ScriptBaseClass.WL_SUN_MOON_COLOR:
+                        toadd.Add(new LSL_Rotation(wl.sunMoonColor.X, wl.sunMoonColor.Y, wl.sunMoonColor.Z, wl.sunMoonColor.W));
+                        break;
+                    case (int)ScriptBaseClass.WL_UNDERWATER_FOG_MODIFIER:
+                        toadd.Add(new LSL_Float(wl.underwaterFogModifier));
+                        break;
+                    case (int)ScriptBaseClass.WL_WATER_COLOR:
+                        toadd.Add(new LSL_Vector(wl.waterColor.X, wl.waterColor.Y, wl.waterColor.Z));
+                        break;
+                    case (int)ScriptBaseClass.WL_WATER_FOG_DENSITY_EXPONENT:
+                        toadd.Add(new LSL_Float(wl.waterFogDensityExponent));
+                        break;
+                }
+
+                if (toadd.Length > 0)
+                {
+                    values.Add(rule);
+                    values.Add(toadd.Data[0]);
+                }
+                idx++;
+            }
+
+
+            return values;
+
+        }
+
+        private RegionLightShareData getWindlightProfileFromRules(LSL_List rules)
+        {
+            RegionLightShareData wl = (RegionLightShareData)m_host.ParentGroup.Scene.RegionInfo.WindlightSettings.Clone();
+
+            LSL_List values = new LSL_List();
+            int idx = 0;
+            while (idx < rules.Length)
+            {
+                uint rule = (uint)rules.GetLSLIntegerItem(idx);
+                LSL_Types.Quaternion iQ;
+                LSL_Types.Vector3 iV;
+                switch (rule)
+                {
+                    case (int)ScriptBaseClass.WL_SUN_MOON_POSITION:
+                        idx++;
+                        wl.sunMoonPosition = (float)rules.GetLSLFloatItem(idx);
+                        break;
+                    case (int)ScriptBaseClass.WL_AMBIENT:
+                        idx++;
+                        iQ = rules.GetQuaternionItem(idx);
+                        wl.ambient = new Vector4((float)iQ.x, (float)iQ.y, (float)iQ.z, (float)iQ.s);
+                        break;
+                    case (int)ScriptBaseClass.WL_BIG_WAVE_DIRECTION:
+                        idx++;
+                        iV = rules.GetVector3Item(idx);
+                        wl.bigWaveDirection = new Vector2((float)iV.x, (float)iV.y);
+                        break;
+                    case (int)ScriptBaseClass.WL_BLUE_DENSITY:
+                        idx++;
+                        iQ = rules.GetQuaternionItem(idx);
+                        wl.blueDensity = new Vector4((float)iQ.x, (float)iQ.y, (float)iQ.z, (float)iQ.s);
+                        break;
+                    case (int)ScriptBaseClass.WL_BLUR_MULTIPLIER:
+                        idx++;
+                        wl.blurMultiplier = (float)rules.GetLSLFloatItem(idx);
+                        break;
+                    case (int)ScriptBaseClass.WL_CLOUD_COLOR:
+                        idx++;
+                        iQ = rules.GetQuaternionItem(idx);
+                        wl.cloudColor = new Vector4((float)iQ.x, (float)iQ.y, (float)iQ.z, (float)iQ.s);
+                        break;
+                    case (int)ScriptBaseClass.WL_CLOUD_COVERAGE:
+                        idx++;
+                        wl.cloudCoverage = (float)rules.GetLSLFloatItem(idx);
+                        break;
+                    case (int)ScriptBaseClass.WL_CLOUD_DETAIL_XY_DENSITY:
+                        idx++;
+                        iV = rules.GetVector3Item(idx);
+                        wl.cloudDetailXYDensity = new Vector3((float)iV.x, (float)iV.y, (float)iV.z);
+                        break;
+                    case (int)ScriptBaseClass.WL_CLOUD_SCALE:
+                        idx++;
+                        wl.cloudScale = (float)rules.GetLSLFloatItem(idx);
+                        break;
+                    case (int)ScriptBaseClass.WL_CLOUD_SCROLL_X:
+                        idx++;
+                        wl.cloudScrollX = (float)rules.GetLSLFloatItem(idx);
+                        break;
+                    case (int)ScriptBaseClass.WL_CLOUD_SCROLL_X_LOCK:
+                        idx++;
+                        wl.cloudScrollXLock = rules.GetLSLIntegerItem(idx).value == 1 ? true : false;
+                        break;
+                    case (int)ScriptBaseClass.WL_CLOUD_SCROLL_Y:
+                        idx++;
+                        wl.cloudScrollY = (float)rules.GetLSLFloatItem(idx);
+                        break;
+                    case (int)ScriptBaseClass.WL_CLOUD_SCROLL_Y_LOCK:
+                        idx++;
+                        wl.cloudScrollYLock = rules.GetLSLIntegerItem(idx).value == 1 ? true : false;
+                        break;
+                    case (int)ScriptBaseClass.WL_CLOUD_XY_DENSITY:
+                        idx++;
+                        iV = rules.GetVector3Item(idx);
+                        wl.cloudXYDensity = new Vector3((float)iV.x, (float)iV.y, (float)iV.z);
+                        break;
+                    case (int)ScriptBaseClass.WL_DENSITY_MULTIPLIER:
+                        idx++;
+                        wl.densityMultiplier = (float)rules.GetLSLFloatItem(idx);
+                        break;
+                    case (int)ScriptBaseClass.WL_DISTANCE_MULTIPLIER:
+                        idx++;
+                        wl.distanceMultiplier = (float)rules.GetLSLFloatItem(idx);
+                        break;
+                    case (int)ScriptBaseClass.WL_DRAW_CLASSIC_CLOUDS:
+                        idx++;
+                        wl.drawClassicClouds = rules.GetLSLIntegerItem(idx).value == 1 ? true : false;
+                        break;
+                    case (int)ScriptBaseClass.WL_EAST_ANGLE:
+                        idx++;
+                        wl.eastAngle = (float)rules.GetLSLFloatItem(idx);
+                        break;
+                    case (int)ScriptBaseClass.WL_FRESNEL_OFFSET:
+                        idx++;
+                        wl.fresnelOffset = (float)rules.GetLSLFloatItem(idx);
+                        break;
+                    case (int)ScriptBaseClass.WL_FRESNEL_SCALE:
+                        idx++;
+                        wl.fresnelScale = (float)rules.GetLSLFloatItem(idx);
+                        break;
+                    case (int)ScriptBaseClass.WL_HAZE_DENSITY:
+                        idx++;
+                        wl.hazeDensity = (float)rules.GetLSLFloatItem(idx);
+                        break;
+                    case (int)ScriptBaseClass.WL_HAZE_HORIZON:
+                        idx++;
+                        wl.hazeHorizon = (float)rules.GetLSLFloatItem(idx);
+                        break;
+                    case (int)ScriptBaseClass.WL_HORIZON:
+                        idx++;
+                        iQ = rules.GetQuaternionItem(idx);
+                        wl.horizon = new Vector4((float)iQ.x, (float)iQ.y, (float)iQ.z, (float)iQ.s);
+                        break;
+                    case (int)ScriptBaseClass.WL_LITTLE_WAVE_DIRECTION:
+                        idx++;
+                        iV = rules.GetVector3Item(idx);
+                        wl.littleWaveDirection = new Vector2((float)iV.x, (float)iV.y);
+                        break;
+                    case (int)ScriptBaseClass.WL_MAX_ALTITUDE:
+                        idx++;
+                        wl.maxAltitude = (ushort)rules.GetLSLIntegerItem(idx).value;
+                        break;
+                    case (int)ScriptBaseClass.WL_NORMAL_MAP_TEXTURE:
+                        idx++;
+                        wl.normalMapTexture = new UUID(rules.GetLSLStringItem(idx).m_string);
+                        break;
+                    case (int)ScriptBaseClass.WL_REFLECTION_WAVELET_SCALE:
+                        idx++;
+                        iV = rules.GetVector3Item(idx);
+                        wl.reflectionWaveletScale = new Vector3((float)iV.x, (float)iV.y, (float)iV.z);
+                        break;
+                    case (int)ScriptBaseClass.WL_REFRACT_SCALE_ABOVE:
+                        idx++;
+                        wl.refractScaleAbove = (float)rules.GetLSLFloatItem(idx);
+                        break;
+                    case (int)ScriptBaseClass.WL_REFRACT_SCALE_BELOW:
+                        idx++;
+                        wl.refractScaleBelow = (float)rules.GetLSLFloatItem(idx);
+                        break;
+                    case (int)ScriptBaseClass.WL_SCENE_GAMMA:
+                        idx++;
+                        wl.sceneGamma = (float)rules.GetLSLFloatItem(idx);
+                        break;
+                    case (int)ScriptBaseClass.WL_STAR_BRIGHTNESS:
+                        idx++;
+                        wl.starBrightness = (float)rules.GetLSLFloatItem(idx);
+                        break;
+                    case (int)ScriptBaseClass.WL_SUN_GLOW_FOCUS:
+                        idx++;
+                        wl.sunGlowFocus = (float)rules.GetLSLFloatItem(idx);
+                        break;
+                    case (int)ScriptBaseClass.WL_SUN_GLOW_SIZE:
+                        idx++;
+                        wl.sunGlowSize = (float)rules.GetLSLFloatItem(idx);
+                        break;
+                    case (int)ScriptBaseClass.WL_SUN_MOON_COLOR:
+                        idx++;
+                        iQ = rules.GetQuaternionItem(idx);
+                        wl.sunMoonColor = new Vector4((float)iQ.x, (float)iQ.y, (float)iQ.z, (float)iQ.s);
+                        break;
+                    case (int)ScriptBaseClass.WL_UNDERWATER_FOG_MODIFIER:
+                        idx++;
+                        wl.underwaterFogModifier = (float)rules.GetLSLFloatItem(idx);
+                        break;
+                    case (int)ScriptBaseClass.WL_WATER_COLOR:
+                        idx++;
+                        iV = rules.GetVector3Item(idx);
+                        wl.waterColor = new Vector3((float)iV.x, (float)iV.y, (float)iV.z);
+                        break;
+                    case (int)ScriptBaseClass.WL_WATER_FOG_DENSITY_EXPONENT:
+                        idx++;
+                        wl.waterFogDensityExponent = (float)rules.GetLSLFloatItem(idx);
+                        break;
+                }
+                idx++;
+            }
+            return wl;
+        }
+        /// <summary>
+        /// Set the current Windlight scene
+        /// </summary>
+        /// <param name="rules"></param>
+        /// <returns>success: true or false</returns>
+        public int cmSetWindlightScene(LSL_List rules)
+        {
+            if (!m_CMFunctionsEnabled)
+            {
+                CMShoutError("Careminster functions are not enabled.");
+                return 0;
+            }
+            if (!World.RegionInfo.EstateSettings.IsEstateManager(m_host.OwnerID) && World.GetScenePresence(m_host.OwnerID).GodLevel < 200)
+            {
+                CMShoutError("cmSetWindlightScene can only be used by estate managers or owners.");
+                return 0;
+            }
+            int success = 0;
+            m_host.AddScriptLPS(1);
+            if (LightShareModule.EnableWindlight)
+            {
+                RegionLightShareData wl = getWindlightProfileFromRules(rules);
+                m_host.ParentGroup.Scene.StoreWindlightProfile(wl);
+                success = 1;
+            }
+            else
+            {
+                CMShoutError("Windlight module is disabled");
+                return 0;
+            }
+            return success;
+        }
+        /// <summary>
+        /// Set the current Windlight scene to a target avatar
+        /// </summary>
+        /// <param name="rules"></param>
+        /// <returns>success: true or false</returns>
+        public int cmSetWindlightSceneTargeted(LSL_List rules, LSL_Key target)
+        {
+            if (!m_CMFunctionsEnabled)
+            {
+                CMShoutError("Careminster functions are not enabled.");
+                return 0;
+            }
+            if (!World.RegionInfo.EstateSettings.IsEstateManager(m_host.OwnerID) && World.GetScenePresence(m_host.OwnerID).GodLevel < 200)
+            {
+                CMShoutError("cmSetWindlightSceneTargeted can only be used by estate managers or owners.");
+                return 0;
+            }
+            int success = 0;
+            m_host.AddScriptLPS(1);
+            if (LightShareModule.EnableWindlight)
+            { 
+                RegionLightShareData wl = getWindlightProfileFromRules(rules);
+                World.EventManager.TriggerOnSendNewWindlightProfileTargeted(wl, new UUID(target.m_string));
+                success = 1;
+            }
+            else
+            {
+                CMShoutError("Windlight module is disabled");
+                return 0;
+            }
+            return success;
+        }
+        
+    }
+}
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/ICM_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/ICM_Api.cs
new file mode 100644
index 0000000000..ef990a1567
--- /dev/null
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/ICM_Api.cs
@@ -0,0 +1,21 @@
+using System.Collections;
+using OpenSim.Region.ScriptEngine.Interfaces;
+
+using key = OpenSim.Region.ScriptEngine.Shared.LSL_Types.LSLString;
+using rotation = OpenSim.Region.ScriptEngine.Shared.LSL_Types.Quaternion;
+using vector = OpenSim.Region.ScriptEngine.Shared.LSL_Types.Vector3;
+using LSL_List = OpenSim.Region.ScriptEngine.Shared.LSL_Types.list;
+using LSL_String = OpenSim.Region.ScriptEngine.Shared.LSL_Types.LSLString;
+using LSL_Integer = OpenSim.Region.ScriptEngine.Shared.LSL_Types.LSLInteger;
+using LSL_Float = OpenSim.Region.ScriptEngine.Shared.LSL_Types.LSLFloat;
+
+namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces
+{
+    public interface ICM_Api
+    {
+        // Windlight Functions
+        LSL_List cmGetWindlightScene(LSL_List rules);
+        int cmSetWindlightScene(LSL_List rules);
+        int cmSetWindlightSceneTargeted(LSL_List rules, key target);
+    }
+}
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/CM_Constants.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/CM_Constants.cs
new file mode 100644
index 0000000000..522c020647
--- /dev/null
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/CM_Constants.cs
@@ -0,0 +1,77 @@
+/*
+ * Copyright (c) Contributors, http://opensimulator.org/
+ * See CONTRIBUTORS.TXT for a full list of copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in the
+ *       documentation and/or other materials provided with the distribution.
+ *     * Neither the name of the OpenSimulator Project nor the
+ *       names of its contributors may be used to endorse or promote products
+ *       derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+using System;
+using vector = OpenSim.Region.ScriptEngine.Shared.LSL_Types.Vector3;
+using rotation = OpenSim.Region.ScriptEngine.Shared.LSL_Types.Quaternion;
+using LSLInteger = OpenSim.Region.ScriptEngine.Shared.LSL_Types.LSLInteger;
+
+namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
+{
+    public partial class ScriptBaseClass
+    {
+        // Constants for cmWindlight*
+        public const int WL_WATER_COLOR = 0;
+        public const int WL_WATER_FOG_DENSITY_EXPONENT = 1;
+        public const int WL_UNDERWATER_FOG_MODIFIER = 2;
+        public const int WL_REFLECTION_WAVELET_SCALE = 3;
+        public const int WL_FRESNEL_SCALE = 4;
+        public const int WL_FRESNEL_OFFSET = 5;
+        public const int WL_REFRACT_SCALE_ABOVE = 6;
+        public const int WL_REFRACT_SCALE_BELOW = 7;
+        public const int WL_BLUR_MULTIPLIER = 8;
+        public const int WL_BIG_WAVE_DIRECTION = 9;
+        public const int WL_LITTLE_WAVE_DIRECTION = 10;
+        public const int WL_NORMAL_MAP_TEXTURE = 11;
+        public const int WL_HORIZON = 12;
+        public const int WL_HAZE_HORIZON = 13;
+        public const int WL_BLUE_DENSITY = 14;
+        public const int WL_HAZE_DENSITY = 15;
+        public const int WL_DENSITY_MULTIPLIER = 16;
+        public const int WL_DISTANCE_MULTIPLIER = 17;
+        public const int WL_MAX_ALTITUDE = 18;
+        public const int WL_SUN_MOON_COLOR = 19;
+        public const int WL_AMBIENT = 20;
+        public const int WL_EAST_ANGLE = 21;
+        public const int WL_SUN_GLOW_FOCUS = 22;
+        public const int WL_SUN_GLOW_SIZE = 23;
+        public const int WL_SCENE_GAMMA = 24;
+        public const int WL_STAR_BRIGHTNESS = 25;
+        public const int WL_CLOUD_COLOR = 26;
+        public const int WL_CLOUD_XY_DENSITY = 27;
+        public const int WL_CLOUD_COVERAGE = 28;
+        public const int WL_CLOUD_SCALE = 29;
+        public const int WL_CLOUD_DETAIL_XY_DENSITY = 30;
+        public const int WL_CLOUD_SCROLL_X = 31;
+        public const int WL_CLOUD_SCROLL_Y = 32;
+        public const int WL_CLOUD_SCROLL_Y_LOCK = 33;
+        public const int WL_CLOUD_SCROLL_X_LOCK = 34;
+        public const int WL_DRAW_CLASSIC_CLOUDS = 35;
+        public const int WL_SUN_MOON_POSITION = 36;
+
+    }
+}
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/CM_Stub.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/CM_Stub.cs
new file mode 100644
index 0000000000..5bc3a88483
--- /dev/null
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/CM_Stub.cs
@@ -0,0 +1,76 @@
+/*
+ * Copyright (c) Contributors, http://opensimulator.org/
+ * See CONTRIBUTORS.TXT for a full list of copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in the
+ *       documentation and/or other materials provided with the distribution.
+ *     * Neither the name of the OpenSimulator Project nor the
+ *       names of its contributors may be used to endorse or promote products
+ *       derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+using System;
+using System.Runtime.Remoting.Lifetime;
+using System.Threading;
+using System.Reflection;
+using System.Collections;
+using System.Collections.Generic;
+using OpenSim.Framework;
+using OpenSim.Region.Framework.Interfaces;
+using OpenSim.Region.ScriptEngine.Interfaces;
+using OpenSim.Region.ScriptEngine.Shared.Api.Interfaces;
+using integer = OpenSim.Region.ScriptEngine.Shared.LSL_Types.LSLInteger;
+using vector = OpenSim.Region.ScriptEngine.Shared.LSL_Types.Vector3;
+using rotation = OpenSim.Region.ScriptEngine.Shared.LSL_Types.Quaternion;
+using key = OpenSim.Region.ScriptEngine.Shared.LSL_Types.LSLString;
+using LSL_List = OpenSim.Region.ScriptEngine.Shared.LSL_Types.list;
+using LSL_String = OpenSim.Region.ScriptEngine.Shared.LSL_Types.LSLString;
+using LSL_Float = OpenSim.Region.ScriptEngine.Shared.LSL_Types.LSLFloat;
+using LSL_Integer = OpenSim.Region.ScriptEngine.Shared.LSL_Types.LSLInteger;
+
+namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
+{
+    public partial class ScriptBaseClass : MarshalByRefObject
+    {
+        public ICM_Api m_CM_Functions;
+
+        public void ApiTypeCM(IScriptApi api)
+        {
+            if (!(api is ICM_Api))
+                return;
+
+            m_CM_Functions = (ICM_Api)api;
+        }
+
+        public LSL_List cmGetWindlightScene(LSL_List rules)
+        {
+            return m_CM_Functions.cmGetWindlightScene(rules);
+        }
+
+        public int cmSetWindlightScene(LSL_List rules)
+        {
+            return m_CM_Functions.cmSetWindlightScene(rules);
+        }
+
+        public int cmSetWindlightSceneTargeted(LSL_List rules, key target)
+        {
+            return m_CM_Functions.cmSetWindlightSceneTargeted(rules, target);
+        }
+    }
+}

From 21519d33112396f1df08bcdf951b8d6b5a12ad72 Mon Sep 17 00:00:00 2001
From: Melanie <melanie@t-data.com>
Date: Wed, 31 Mar 2010 13:33:18 +0100
Subject: [PATCH 4/7] Add missing licenses. Change relicensed LightShare module
 to proper BSD licensing.

---
 .../LightShare/LightShareModule.cs            | 27 ++++++++++++++---
 .../Shared/Api/Implementation/CM_Api.cs       | 29 ++++++++++++++++++-
 .../Shared/Api/Interface/ICM_Api.cs           | 29 ++++++++++++++++++-
 3 files changed, 79 insertions(+), 6 deletions(-)

diff --git a/OpenSim/Region/CoreModules/LightShare/LightShareModule.cs b/OpenSim/Region/CoreModules/LightShare/LightShareModule.cs
index 77d6e9a4bc..e6cab1d381 100644
--- a/OpenSim/Region/CoreModules/LightShare/LightShareModule.cs
+++ b/OpenSim/Region/CoreModules/LightShare/LightShareModule.cs
@@ -1,9 +1,28 @@
 /*
- * Copyright (c) Thomas Grimshaw and Magne Metaverse Research
- *  
- * This module is not open source. All rights reserved.
- * Unauthorised copying, distribution or public display is prohibited.
+ * Copyright (c) Contributors, http://opensimulator.org/
+ * See CONTRIBUTORS.TXT for a full list of copyright holders.
  *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in the
+ *       documentation and/or other materials provided with the distribution.
+ *     * Neither the name of the OpenSimulator Project nor the
+ *       names of its contributors may be used to endorse or promote products
+ *       derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
 using System;
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/CM_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/CM_Api.cs
index 4e8a3c4b60..880ca1bb7d 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/CM_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/CM_Api.cs
@@ -1,4 +1,31 @@
-using System;
+/*
+ * Copyright (c) Contributors, http://opensimulator.org/
+ * See CONTRIBUTORS.TXT for a full list of copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in the
+ *       documentation and/or other materials provided with the distribution.
+ *     * Neither the name of the OpenSimulator Project nor the
+ *       names of its contributors may be used to endorse or promote products
+ *       derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+using System;
 using System.Reflection;
 using System.Collections;
 using System.Collections.Generic;
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/ICM_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/ICM_Api.cs
index ef990a1567..f5570ecec7 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/ICM_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/ICM_Api.cs
@@ -1,4 +1,31 @@
-using System.Collections;
+/*
+ * Copyright (c) Contributors, http://opensimulator.org/
+ * See CONTRIBUTORS.TXT for a full list of copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in the
+ *       documentation and/or other materials provided with the distribution.
+ *     * Neither the name of the OpenSimulator Project nor the
+ *       names of its contributors may be used to endorse or promote products
+ *       derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+using System.Collections;
 using OpenSim.Region.ScriptEngine.Interfaces;
 
 using key = OpenSim.Region.ScriptEngine.Shared.LSL_Types.LSLString;

From 08ba34da0325e3ed2a839cff62f2020742e887e7 Mon Sep 17 00:00:00 2001
From: Diva Canto <diva@metaverseink.com>
Date: Wed, 31 Mar 2010 21:30:44 -0700
Subject: [PATCH 5/7] First attempt at fixing mantis #4641. It's better but
 there are now some issues with permissions. (looks like my commit is going to
 touch CM files, I'm going to let it do it - eof only)

---
 .../Communications/Osp/OspResolver.cs         |  5 +++-
 OpenSim/Framework/RegionInfo.cs               | 12 ++++-----
 .../Framework/Library/LibraryModule.cs        | 25 ++++++++++++++++---
 .../Shared/Api/Interface/ICM_Api.cs           |  2 +-
 .../Shared/Api/Runtime/CM_Constants.cs        |  2 +-
 .../Shared/Api/Runtime/CM_Stub.cs             | 10 ++++----
 6 files changed, 38 insertions(+), 18 deletions(-)

diff --git a/OpenSim/Framework/Communications/Osp/OspResolver.cs b/OpenSim/Framework/Communications/Osp/OspResolver.cs
index 2e55f53b25..24ea64d87f 100644
--- a/OpenSim/Framework/Communications/Osp/OspResolver.cs
+++ b/OpenSim/Framework/Communications/Osp/OspResolver.cs
@@ -139,6 +139,9 @@ namespace OpenSim.Framework.Communications.Osp
         /// </returns>
         protected static UUID ResolveOspaName(string name, IUserAccountService userService)
         {
+            if (userService == null)
+                return UUID.Zero;
+
             int nameSeparatorIndex = name.IndexOf(OSPA_NAME_VALUE_SEPARATOR);
             
             if (nameSeparatorIndex < 0)
@@ -149,7 +152,7 @@ namespace OpenSim.Framework.Communications.Osp
             
             string firstName = name.Remove(nameSeparatorIndex).TrimEnd();
             string lastName = name.Substring(nameSeparatorIndex + 1).TrimStart();
-            
+
             UserAccount account = userService.GetUserAccount(UUID.Zero, firstName, lastName);
             if (account != null)
                 return account.PrincipalID;
diff --git a/OpenSim/Framework/RegionInfo.cs b/OpenSim/Framework/RegionInfo.cs
index 5eacd73de8..ad988165eb 100644
--- a/OpenSim/Framework/RegionInfo.cs
+++ b/OpenSim/Framework/RegionInfo.cs
@@ -38,7 +38,7 @@ using OpenSim.Framework.Console;
 
 
 namespace OpenSim.Framework
-{
+{
     public class RegionLightShareData : ICloneable
     {
         public UUID regionID = UUID.Zero;
@@ -86,11 +86,11 @@ namespace OpenSim.Framework
         {
             if (OnSave != null)
                 OnSave(this);
-        }
-        public object Clone()
-        {
-            return this.MemberwiseClone();      // call clone method
-        }
+        }
+        public object Clone()
+        {
+            return this.MemberwiseClone();      // call clone method
+        }
 
     }
 
diff --git a/OpenSim/Region/CoreModules/Framework/Library/LibraryModule.cs b/OpenSim/Region/CoreModules/Framework/Library/LibraryModule.cs
index e37da9fdee..36dae6ba9f 100644
--- a/OpenSim/Region/CoreModules/Framework/Library/LibraryModule.cs
+++ b/OpenSim/Region/CoreModules/Framework/Library/LibraryModule.cs
@@ -173,11 +173,11 @@ namespace OpenSim.Region.CoreModules.Framework.Library
                 m_log.InfoFormat("[LIBRARY MODULE]: Loading library archive {0} ({1})...", iarFileName, simpleName);
                 simpleName = GetInventoryPathFromName(simpleName);
 
+                InventoryArchiveReadRequest archread = new InventoryArchiveReadRequest(m_MockScene, uinfo, simpleName, iarFileName);
                 try
                 {
-                    InventoryArchiveReadRequest archread = new InventoryArchiveReadRequest(m_MockScene, uinfo, simpleName, iarFileName);
                     List<InventoryNodeBase> nodes = archread.Execute();
-                    if (nodes.Count == 0)
+                    if (nodes != null && nodes.Count == 0)
                     {
                         // didn't find the subfolder with the given name; place it on the top
                         m_log.InfoFormat("[LIBRARY MODULE]: Didn't find {0} in library. Placing archive on the top level", simpleName);
@@ -185,16 +185,33 @@ namespace OpenSim.Region.CoreModules.Framework.Library
                         archread = new InventoryArchiveReadRequest(m_MockScene, uinfo, "/", iarFileName);
                         archread.Execute();
                     }
-                    archread.Close();
+                    foreach (InventoryNodeBase node in nodes)
+                        FixPerms(node);
                 }
                 catch (Exception e)
                 {
-                    m_log.DebugFormat("[LIBRARY MODULE]: Exception when processing archive {0}: {1}", iarFileName, e.Message);
+                    m_log.DebugFormat("[LIBRARY MODULE]: Exception when processing archive {0}: {1}", iarFileName, e.StackTrace);
+                }
+                finally
+                {
+                    archread.Close();
                 }
             }
 
         }
 
+        private void FixPerms(InventoryNodeBase node)
+        {
+            if (node is InventoryItemBase)
+            {
+                InventoryItemBase item = (InventoryItemBase)node;
+                item.BasePermissions = 0x7FFFFFFF;
+                item.EveryOnePermissions = 0x7FFFFFFF;
+                item.CurrentPermissions = 0x7FFFFFFF;
+                item.NextPermissions = 0x7FFFFFFF;
+            }
+        }
+
         private void DumpLibrary()
         {
             InventoryFolderImpl lib = m_Library.LibraryRootFolder;
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/ICM_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/ICM_Api.cs
index f5570ecec7..f13b6e50e3 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/ICM_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/ICM_Api.cs
@@ -42,7 +42,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces
     {
         // Windlight Functions
         LSL_List cmGetWindlightScene(LSL_List rules);
-        int cmSetWindlightScene(LSL_List rules);
+        int cmSetWindlightScene(LSL_List rules);
         int cmSetWindlightSceneTargeted(LSL_List rules, key target);
     }
 }
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/CM_Constants.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/CM_Constants.cs
index 522c020647..f94ef4a679 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/CM_Constants.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/CM_Constants.cs
@@ -70,7 +70,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
         public const int WL_CLOUD_SCROLL_Y = 32;
         public const int WL_CLOUD_SCROLL_Y_LOCK = 33;
         public const int WL_CLOUD_SCROLL_X_LOCK = 34;
-        public const int WL_DRAW_CLASSIC_CLOUDS = 35;
+        public const int WL_DRAW_CLASSIC_CLOUDS = 35;
         public const int WL_SUN_MOON_POSITION = 36;
 
     }
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/CM_Stub.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/CM_Stub.cs
index 5bc3a88483..c0edaae6bc 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/CM_Stub.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/CM_Stub.cs
@@ -66,11 +66,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
         public int cmSetWindlightScene(LSL_List rules)
         {
             return m_CM_Functions.cmSetWindlightScene(rules);
-        }
-
-        public int cmSetWindlightSceneTargeted(LSL_List rules, key target)
-        {
-            return m_CM_Functions.cmSetWindlightSceneTargeted(rules, target);
+        }
+
+        public int cmSetWindlightSceneTargeted(LSL_List rules, key target)
+        {
+            return m_CM_Functions.cmSetWindlightSceneTargeted(rules, target);
         }
     }
 }

From c33b1de9dfc238ca38a0f145160de2648189dd16 Mon Sep 17 00:00:00 2001
From: "Justin Clark-Casey (justincc)" <jjustincc@googlemail.com>
Date: Thu, 1 Apr 2010 22:37:20 +0100
Subject: [PATCH 6/7] expose methods that allow region modules to send messages
 to groups

---
 .../XmlRpcGroups/GroupsMessagingModule.cs     | 144 ++++++++++--------
 1 file changed, 81 insertions(+), 63 deletions(-)

diff --git a/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/GroupsMessagingModule.cs b/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/GroupsMessagingModule.cs
index 00fe5df046..e0840b1d1e 100644
--- a/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/GroupsMessagingModule.cs
+++ b/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/GroupsMessagingModule.cs
@@ -28,29 +28,23 @@
 using System;
 using System.Collections.Generic;
 using System.Reflection;
-
-
 using log4net;
 using Mono.Addins;
 using Nini.Config;
-
 using OpenMetaverse;
 using OpenMetaverse.StructuredData;
-
 using OpenSim.Framework;
 using OpenSim.Region.CoreModules.Framework.EventQueue;
 using OpenSim.Region.Framework.Interfaces;
 using OpenSim.Region.Framework.Scenes;
 
-
 using Caps = OpenSim.Framework.Capabilities.Caps;
 
 namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
 {
     [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule")]
-    public class GroupsMessagingModule : ISharedRegionModule
+    public class GroupsMessagingModule : ISharedRegionModule, IGroupsMessagingModule
     {
-
         private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
 
         private List<Scene> m_sceneList = new List<Scene>();
@@ -108,8 +102,12 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
 
         public void AddRegion(Scene scene)
         {
-            // NoOp
+            if (!m_groupMessagingEnabled)
+                return;
+            
+            scene.RegisterModuleInterface<IGroupsMessagingModule>(this);
         }
+        
         public void RegionLoaded(Scene scene)
         {
             if (!m_groupMessagingEnabled)
@@ -197,6 +195,75 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
 
         #endregion
 
+        public bool StartGroupChatSession(UUID agentID, UUID groupID)
+        {
+            if (m_debugEnabled)
+                m_log.DebugFormat("[GROUPS-MESSAGING]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
+                
+            GroupRecord groupInfo = m_groupsModule.GetGroupRecord(groupID);
+
+            if (groupInfo != null)
+                return StartGroupChatSession(agentID.Guid, groupInfo);
+            else
+                return false;
+        }
+            
+        protected bool StartGroupChatSession(Guid agentID, GroupRecord groupInfo)
+        {
+            AddAgentToGroupSession(agentID, groupInfo.GroupID.Guid);
+
+            return true;
+        }
+        
+        public void SendMessageToGroup(GridInstantMessage im, UUID groupID)
+        {
+            if (m_debugEnabled) 
+                m_log.DebugFormat("[GROUPS-MESSAGING]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
+
+            foreach (GroupMembersData member in m_groupsModule.GroupMembersRequest(null, groupID))
+            {
+                if (!m_agentsDroppedSession.ContainsKey(im.imSessionID) || m_agentsDroppedSession[im.imSessionID].Contains(member.AgentID.Guid))
+                {
+                    // Don't deliver messages to people who have dropped this session
+                    if (m_debugEnabled) m_log.DebugFormat("[GROUPS-MESSAGING]: {0} has dropped session, not delivering to them", member.AgentID);
+                    continue;
+                }
+
+                // Copy Message
+                GridInstantMessage msg = new GridInstantMessage();
+                msg.imSessionID = im.imSessionID;
+                msg.fromAgentName = im.fromAgentName;
+                msg.message = im.message;
+                msg.dialog = im.dialog;
+                msg.offline = im.offline;
+                msg.ParentEstateID = im.ParentEstateID;
+                msg.Position = im.Position;
+                msg.RegionID = im.RegionID;
+                msg.binaryBucket = im.binaryBucket;
+                msg.timestamp = (uint)Util.UnixTimeSinceEpoch();
+
+                // Updat Pertinate fields to make it a "group message"
+                msg.fromAgentID = groupID.Guid;
+                msg.fromGroup = true;
+
+                msg.toAgentID = member.AgentID.Guid;
+
+                IClientAPI client = GetActiveClient(member.AgentID);
+                if (client == null)
+                {
+                    // If they're not local, forward across the grid
+                    if (m_debugEnabled) m_log.DebugFormat("[GROUPS-MESSAGING]: Delivering to {0} via Grid", member.AgentID);
+                    m_msgTransferModule.SendInstantMessage(msg, delegate(bool success) { });
+                }
+                else
+                {
+                    // Deliver locally, directly
+                    if (m_debugEnabled) m_log.DebugFormat("[GROUPS-MESSAGING]: Passing to ProcessMessageFromGroupSession to deliver to {0} locally", client.Name);
+                    ProcessMessageFromGroupSession(msg);
+                }
+            }
+        }
+        
         #region SimGridEventHandlers
 
         private void OnNewClient(IClientAPI client)
@@ -370,7 +437,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
                 m_agentsDroppedSession.Add(sessionID, new List<Guid>());
             }
         }
-
+        
         private void OnInstantMessage(IClientAPI remoteClient, GridInstantMessage im)
         {
             if (m_debugEnabled)
@@ -384,13 +451,11 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
             if ((im.dialog == (byte)InstantMessageDialog.SessionGroupStart))
             {
                 UUID groupID = new UUID(im.toAgentID);
-
                 GroupRecord groupInfo = m_groupsModule.GetGroupRecord(groupID);
+    
                 if (groupInfo != null)
-                {
-                    if (m_debugEnabled) m_log.DebugFormat("[GROUPS-MESSAGING]: Start Group Session for {0}", groupInfo.GroupName);
-
-                    AddAgentToGroupSession(im.fromAgentID, im.imSessionID);
+                {                
+                    StartGroupChatSession(im.fromAgentID, groupInfo);
 
                     ChatterBoxSessionStartReplyViaCaps(remoteClient, groupInfo.GroupName, groupID);
 
@@ -411,7 +476,8 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
             {
                 UUID groupID = new UUID(im.toAgentID);
 
-                if (m_debugEnabled) m_log.DebugFormat("[GROUPS-MESSAGING]: Send message to session for group {0} with session ID {1}", groupID, im.imSessionID.ToString());
+                if (m_debugEnabled) 
+                    m_log.DebugFormat("[GROUPS-MESSAGING]: Send message to session for group {0} with session ID {1}", groupID, im.imSessionID.ToString());
 
                 SendMessageToGroup(im, groupID);
             }
@@ -419,54 +485,6 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
 
         #endregion
 
-        private void SendMessageToGroup(GridInstantMessage im, UUID groupID)
-        {
-            if (m_debugEnabled) m_log.DebugFormat("[GROUPS-MESSAGING]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
-
-            foreach (GroupMembersData member in m_groupsModule.GroupMembersRequest(null, groupID))
-            {
-                if (!m_agentsDroppedSession.ContainsKey(im.imSessionID) || m_agentsDroppedSession[im.imSessionID].Contains(member.AgentID.Guid))
-                {
-                    // Don't deliver messages to people who have dropped this session
-                    if (m_debugEnabled) m_log.DebugFormat("[GROUPS-MESSAGING]: {0} has dropped session, not delivering to them", member.AgentID);
-                    continue;
-                }
-
-                // Copy Message
-                GridInstantMessage msg = new GridInstantMessage();
-                msg.imSessionID = im.imSessionID;
-                msg.fromAgentName = im.fromAgentName;
-                msg.message = im.message;
-                msg.dialog = im.dialog;
-                msg.offline = im.offline;
-                msg.ParentEstateID = im.ParentEstateID;
-                msg.Position = im.Position;
-                msg.RegionID = im.RegionID;
-                msg.binaryBucket = im.binaryBucket;
-                msg.timestamp = (uint)Util.UnixTimeSinceEpoch();
-
-                // Updat Pertinate fields to make it a "group message"
-                msg.fromAgentID = groupID.Guid;
-                msg.fromGroup = true;
-
-                msg.toAgentID = member.AgentID.Guid;
-
-                IClientAPI client = GetActiveClient(member.AgentID);
-                if (client == null)
-                {
-                    // If they're not local, forward across the grid
-                    if (m_debugEnabled) m_log.DebugFormat("[GROUPS-MESSAGING]: Delivering to {0} via Grid", member.AgentID);
-                    m_msgTransferModule.SendInstantMessage(msg, delegate(bool success) { });
-                }
-                else
-                {
-                    // Deliver locally, directly
-                    if (m_debugEnabled) m_log.DebugFormat("[GROUPS-MESSAGING]: Passing to ProcessMessageFromGroupSession to deliver to {0} locally", client.Name);
-                    ProcessMessageFromGroupSession(msg);
-                }
-            }
-        }
-
         void ChatterBoxSessionStartReplyViaCaps(IClientAPI remoteClient, string groupName, UUID groupID)
         {
             if (m_debugEnabled) m_log.DebugFormat("[GROUPS-MESSAGING]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);

From 938905df1e04ca5ff2f09bb29b955ba7386daea4 Mon Sep 17 00:00:00 2001
From: "Justin Clark-Casey (justincc)" <jjustincc@googlemail.com>
Date: Thu, 1 Apr 2010 22:45:01 +0100
Subject: [PATCH 7/7] oops, add file missing from last commit refactor out
 redundant method from GroupsMessagingModule

---
 .../Interfaces/IGroupsMessagingModule.cs      | 73 +++++++++++++++++++
 .../XmlRpcGroups/GroupsMessagingModule.cs     | 16 ++--
 2 files changed, 80 insertions(+), 9 deletions(-)
 create mode 100644 OpenSim/Region/Framework/Interfaces/IGroupsMessagingModule.cs

diff --git a/OpenSim/Region/Framework/Interfaces/IGroupsMessagingModule.cs b/OpenSim/Region/Framework/Interfaces/IGroupsMessagingModule.cs
new file mode 100644
index 0000000000..f15823659b
--- /dev/null
+++ b/OpenSim/Region/Framework/Interfaces/IGroupsMessagingModule.cs
@@ -0,0 +1,73 @@
+/*
+ * Copyright (c) Contributors, http://opensimulator.org/
+ * See CONTRIBUTORS.TXT for a full list of copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in the
+ *       documentation and/or other materials provided with the distribution.
+ *     * Neither the name of the OpenSimulator Project nor the
+ *       names of its contributors may be used to endorse or promote products
+ *       derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+using OpenMetaverse;
+using OpenSim.Framework;
+
+namespace OpenSim.Region.Framework.Interfaces
+{
+    /// <summary>
+    /// Provide mechanisms for messaging groups.
+    /// </summary>
+    /// 
+    /// TODO: Provide a mechanism for receiving group messages as well as sending them
+    /// 
+    public interface IGroupsMessagingModule
+    {
+        /// <summary>
+        /// Start a group chat session.
+        /// </summary>
+        /// You must call this before calling SendMessageToGroup().  If a chat session for this group is already taking
+        /// place then the agent will added to that session.
+        /// <param name="agentID">
+        /// A UUID that represents the agent being added.  If you are agentless (e.g. you are
+        /// a region module), then you can use any random ID.
+        /// </param>
+        /// <param name="groupID">
+        /// The ID for the group to join.  Currently, the session ID used is identical to the
+        /// group ID.
+        /// </param>
+        /// <returns>
+        /// True if the chat session was started successfully, false otherwise.
+        /// </returns>
+        bool StartGroupChatSession(UUID agentID, UUID groupID);
+        
+        /// <summary>
+        /// Send a message to an entire group.
+        /// </summary>
+        /// <param name="im">
+        /// The message itself.  The fields that must be populated are
+        /// 
+        /// imSessionID - Populate this with the group ID (session ID and group ID are currently identical)
+        /// fromAgentName - Populate this with whatever arbitrary name you want to show up in the chat dialog
+        /// message - The message itself
+        /// dialog - This must be (byte)InstantMessageDialog.SessionSend
+        /// </param>
+        /// <param name="groupID"></param>
+        void SendMessageToGroup(GridInstantMessage im, UUID groupID);
+    }
+}
\ No newline at end of file
diff --git a/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/GroupsMessagingModule.cs b/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/GroupsMessagingModule.cs
index e0840b1d1e..533815fc4e 100644
--- a/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/GroupsMessagingModule.cs
+++ b/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/GroupsMessagingModule.cs
@@ -203,16 +203,14 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
             GroupRecord groupInfo = m_groupsModule.GetGroupRecord(groupID);
 
             if (groupInfo != null)
-                return StartGroupChatSession(agentID.Guid, groupInfo);
+            {
+                AddAgentToGroupSession(agentID.Guid, groupID.Guid);
+                return true;
+            }
             else
+            {
                 return false;
-        }
-            
-        protected bool StartGroupChatSession(Guid agentID, GroupRecord groupInfo)
-        {
-            AddAgentToGroupSession(agentID, groupInfo.GroupID.Guid);
-
-            return true;
+            }
         }
         
         public void SendMessageToGroup(GridInstantMessage im, UUID groupID)
@@ -455,7 +453,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
     
                 if (groupInfo != null)
                 {                
-                    StartGroupChatSession(im.fromAgentID, groupInfo);
+                    AddAgentToGroupSession(im.fromAgentID, groupInfo.GroupID.Guid);
 
                     ChatterBoxSessionStartReplyViaCaps(remoteClient, groupInfo.GroupName, groupID);