OpenSim
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Events Macros
EnvironmentModule.cs
Go to the documentation of this file.
1 /*
2  * Copyright (c) Contributors, http://opensimulator.org/
3  * See CONTRIBUTORS.TXT for a full list of copyright holders.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions are met:
7  * * Redistributions of source code must retain the above copyright
8  * notice, this list of conditions and the following disclaimer.
9  * * Redistributions in binary form must reproduce the above copyright
10  * notice, this list of conditions and the following disclaimer in the
11  * documentation and/or other materials provided with the distribution.
12  * * Neither the name of the OpenSimulator Project nor the
13  * names of its contributors may be used to endorse or promote products
14  * derived from this software without specific prior written permission.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19  * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26  */
27 
28 using System;
29 using System.Reflection;
30 using OpenMetaverse;
31 using OpenSim.Framework;
32 using OpenSim.Framework.Capabilities;
33 using OpenSim.Framework.Servers.HttpServer;
34 using OpenSim.Region.Framework.Interfaces;
35 using OpenSim.Region.Framework.Scenes;
36 using log4net;
37 using Nini.Config;
38 using Mono.Addins;
39 
41 
42 
43 namespace OpenSim.Region.CoreModules.World.LightShare
44 {
45  [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule", Id = "EnvironmentModule")]
46 
48  {
49  private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
50 
51  private Scene m_scene = null;
52  private UUID regionID = UUID.Zero;
53  private static bool Enabled = false;
54 
55  private static readonly string capsName = "EnvironmentSettings";
56  private static readonly string capsBase = "/CAPS/0020/";
57 
58  private LLSDEnvironmentSetResponse setResponse = null;
59 
60  #region INonSharedRegionModule
61  public void Initialise(IConfigSource source)
62  {
63  IConfig config = source.Configs["ClientStack.LindenCaps"];
64 
65  if (null == config)
66  return;
67 
68  if (config.GetString("Cap_EnvironmentSettings", String.Empty) != "localhost")
69  {
70  m_log.InfoFormat("[{0}]: Module is disabled.", Name);
71  return;
72  }
73 
74  Enabled = true;
75 
76  m_log.InfoFormat("[{0}]: Module is enabled.", Name);
77  }
78 
79  public void Close()
80  {
81  }
82 
83  public string Name
84  {
85  get { return "EnvironmentModule"; }
86  }
87 
88  public Type ReplaceableInterface
89  {
90  get { return null; }
91  }
92 
93  public void AddRegion(Scene scene)
94  {
95  if (!Enabled)
96  return;
97 
98  scene.RegisterModuleInterface<IEnvironmentModule>(this);
99  m_scene = scene;
100  regionID = scene.RegionInfo.RegionID;
101  }
102 
103  public void RegionLoaded(Scene scene)
104  {
105  if (!Enabled)
106  return;
107 
108  setResponse = new LLSDEnvironmentSetResponse();
109  scene.EventManager.OnRegisterCaps += OnRegisterCaps;
110  }
111 
112  public void RemoveRegion(Scene scene)
113  {
114  if (Enabled)
115  return;
116 
117  scene.EventManager.OnRegisterCaps -= OnRegisterCaps;
118  m_scene = null;
119  }
120  #endregion
121 
122  #region IEnvironmentModule
123  public void ResetEnvironmentSettings(UUID regionUUID)
124  {
125  if (!Enabled)
126  return;
127 
128  m_scene.SimulationDataService.RemoveRegionEnvironmentSettings(regionUUID);
129  }
130  #endregion
131 
132  #region Events
133  private void OnRegisterCaps(UUID agentID, Caps caps)
134  {
135  // m_log.DebugFormat("[{0}]: Register capability for agentID {1} in region {2}",
136  // Name, agentID, caps.RegionName);
137 
138  string capsPath = capsBase + UUID.Random();
139 
140  // Get handler
141  caps.RegisterHandler(
142  capsName,
143  new RestStreamHandler(
144  "GET",
145  capsPath,
146  (request, path, param, httpRequest, httpResponse)
147  => GetEnvironmentSettings(request, path, param, agentID, caps),
148  capsName,
149  agentID.ToString()));
150 
151  // Set handler
152  caps.HttpListener.AddStreamHandler(
153  new RestStreamHandler(
154  "POST",
155  capsPath,
156  (request, path, param, httpRequest, httpResponse)
157  => SetEnvironmentSettings(request, path, param, agentID, caps),
158  capsName,
159  agentID.ToString()));
160  }
161  #endregion
162 
163  private string GetEnvironmentSettings(string request, string path, string param,
164  UUID agentID, Caps caps)
165  {
166  // m_log.DebugFormat("[{0}]: Environment GET handle for agentID {1} in region {2}",
167  // Name, agentID, caps.RegionName);
168 
169  string env = String.Empty;
170 
171  try
172  {
173  env = m_scene.SimulationDataService.LoadRegionEnvironmentSettings(regionID);
174  }
175  catch (Exception e)
176  {
177  m_log.ErrorFormat("[{0}]: Unable to load environment settings for region {1}, Exception: {2} - {3}",
178  Name, caps.RegionName, e.Message, e.StackTrace);
179  }
180 
181  if (String.IsNullOrEmpty(env))
182  env = EnvironmentSettings.EmptySettings(UUID.Zero, regionID);
183 
184  return env;
185  }
186 
187  private string SetEnvironmentSettings(string request, string path, string param,
188  UUID agentID, Caps caps)
189  {
190 
191  // m_log.DebugFormat("[{0}]: Environment SET handle from agentID {1} in region {2}",
192  // Name, agentID, caps.RegionName);
193 
194  setResponse.regionID = regionID;
195  setResponse.success = false;
196 
197  if (!m_scene.Permissions.CanIssueEstateCommand(agentID, false))
198  {
199  setResponse.fail_reason = "Insufficient estate permissions, settings has not been saved.";
200  return LLSDHelpers.SerialiseLLSDReply(setResponse);
201  }
202 
203  try
204  {
205  m_scene.SimulationDataService.StoreRegionEnvironmentSettings(regionID, request);
206  setResponse.success = true;
207 
208  m_log.InfoFormat("[{0}]: New Environment settings has been saved from agentID {1} in region {2}",
209  Name, agentID, caps.RegionName);
210  }
211  catch (Exception e)
212  {
213  m_log.ErrorFormat("[{0}]: Environment settings has not been saved for region {1}, Exception: {2} - {3}",
214  Name, caps.RegionName, e.Message, e.StackTrace);
215 
216  setResponse.success = false;
217  setResponse.fail_reason = String.Format("Environment Set for region {0} has failed, settings has not been saved.", caps.RegionName);
218  }
219 
220  return LLSDHelpers.SerialiseLLSDReply(setResponse);
221  }
222  }
223 }
224 
void RegionLoaded(Scene scene)
This will be called once for every scene loaded. In a shared module this will be multiple times in on...
void Close()
This is the inverse to Initialise. After a Close(), this instance won't be usable anymore...
void RemoveRegion(Scene scene)
This is called whenever a Scene is removed. For shared modules, this can happen several times...
void Initialise(IConfigSource source)
This is called to initialize the region module. For shared modules, this is called exactly once...
Interactive OpenSim region server
Definition: OpenSim.cs:55
void AddRegion(Scene scene)
This is called whenever a Scene is added. For shared modules, this can happen several times...
OpenSim.Framework.Capabilities.Caps Caps
static string EmptySettings(UUID messageID, UUID regionID)
generates a empty llsd settings response for viewer