OpenSim
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Events Macros
XEstateRequestHandler.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.Collections.Generic;
30 using System.IO;
31 using System.Reflection;
32 using System.Xml;
33 
34 using OpenSim.Framework;
35 using OpenSim.Server.Base;
36 using OpenSim.Framework.Servers.HttpServer;
37 using OpenSim.Region.Framework.Scenes;
38 using OpenSim.Region.Framework.Interfaces;
39 
40 using OpenMetaverse;
41 using log4net;
42 
43 namespace OpenSim.Region.CoreModules.World.Estate
44 {
46  {
47  private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
48 
50  protected Object m_RequestLock = new Object();
51 
53  : base("POST", "/estate")
54  {
55  m_EstateModule = fmodule;
56  }
57 
58  protected override byte[] ProcessRequest(string path, Stream requestData,
59  IOSHttpRequest httpRequest, IOSHttpResponse httpResponse)
60  {
61  StreamReader sr = new StreamReader(requestData);
62  string body = sr.ReadToEnd();
63  sr.Close();
64  body = body.Trim();
65 
66  m_log.DebugFormat("[XESTATE HANDLER]: query String: {0}", body);
67 
68  try
69  {
70  lock (m_RequestLock)
71  {
72  Dictionary<string, object> request =
73  ServerUtils.ParseQueryString(body);
74 
75  if (!request.ContainsKey("METHOD"))
76  return FailureResult();
77 
78  string method = request["METHOD"].ToString();
79  request.Remove("METHOD");
80 
81  try
82  {
83  m_EstateModule.InInfoUpdate = false;
84 
85  switch (method)
86  {
87  case "update_covenant":
88  return UpdateCovenant(request);
89  case "update_estate":
90  return UpdateEstate(request);
91  case "estate_message":
92  return EstateMessage(request);
93  case "teleport_home_one_user":
94  return TeleportHomeOneUser(request);
95  case "teleport_home_all_users":
96  return TeleportHomeAllUsers(request);
97  }
98  }
99  finally
100  {
101  m_EstateModule.InInfoUpdate = false;
102  }
103  }
104  }
105  catch (Exception e)
106  {
107  m_log.Debug("[XESTATE]: Exception {0}" + e.ToString());
108  }
109 
110  return FailureResult();
111  }
112 
113  byte[] TeleportHomeAllUsers(Dictionary<string, object> request)
114  {
115  UUID PreyID = UUID.Zero;
116  int EstateID = 0;
117 
118  if (!request.ContainsKey("EstateID"))
119  return FailureResult();
120 
121  if (!Int32.TryParse(request["EstateID"].ToString(), out EstateID))
122  return FailureResult();
123 
124  foreach (Scene s in m_EstateModule.Scenes)
125  {
126  if (s.RegionInfo.EstateSettings.EstateID == EstateID)
127  {
128  s.ForEachScenePresence(delegate(ScenePresence p) {
129  if (p != null && !p.IsChildAgent)
130  {
131  p.ControllingClient.SendTeleportStart(16);
132  s.TeleportClientHome(p.ControllingClient.AgentId, p.ControllingClient);
133  }
134  });
135  }
136  }
137 
138  return SuccessResult();
139  }
140 
141  byte[] TeleportHomeOneUser(Dictionary<string, object> request)
142  {
143  UUID PreyID = UUID.Zero;
144  int EstateID = 0;
145 
146  if (!request.ContainsKey("PreyID") ||
147  !request.ContainsKey("EstateID"))
148  {
149  return FailureResult();
150  }
151 
152  if (!UUID.TryParse(request["PreyID"].ToString(), out PreyID))
153  return FailureResult();
154 
155  if (!Int32.TryParse(request["EstateID"].ToString(), out EstateID))
156  return FailureResult();
157 
158  foreach (Scene s in m_EstateModule.Scenes)
159  {
160  if (s.RegionInfo.EstateSettings.EstateID == EstateID)
161  {
162  ScenePresence p = s.GetScenePresence(PreyID);
163  if (p != null && !p.IsChildAgent)
164  {
165  p.ControllingClient.SendTeleportStart(16);
166  s.TeleportClientHome(PreyID, p.ControllingClient);
167  }
168  }
169  }
170 
171  return SuccessResult();
172  }
173 
174  byte[] EstateMessage(Dictionary<string, object> request)
175  {
176  UUID FromID = UUID.Zero;
177  string FromName = String.Empty;
178  string Message = String.Empty;
179  int EstateID = 0;
180 
181  if (!request.ContainsKey("FromID") ||
182  !request.ContainsKey("FromName") ||
183  !request.ContainsKey("Message") ||
184  !request.ContainsKey("EstateID"))
185  {
186  return FailureResult();
187  }
188 
189  if (!UUID.TryParse(request["FromID"].ToString(), out FromID))
190  return FailureResult();
191 
192  if (!Int32.TryParse(request["EstateID"].ToString(), out EstateID))
193  return FailureResult();
194 
195  FromName = request["FromName"].ToString();
196  Message = request["Message"].ToString();
197 
198  foreach (Scene s in m_EstateModule.Scenes)
199  {
200  if (s.RegionInfo.EstateSettings.EstateID == EstateID)
201  {
202  IDialogModule dm = s.RequestModuleInterface<IDialogModule>();
203 
204  if (dm != null)
205  {
206  dm.SendNotificationToUsersInRegion(FromID, FromName,
207  Message);
208  }
209  }
210  }
211 
212  return SuccessResult();
213  }
214 
215  byte[] UpdateCovenant(Dictionary<string, object> request)
216  {
217  UUID CovenantID = UUID.Zero;
218  int EstateID = 0;
219 
220  if (!request.ContainsKey("CovenantID") || !request.ContainsKey("EstateID"))
221  return FailureResult();
222 
223  if (!UUID.TryParse(request["CovenantID"].ToString(), out CovenantID))
224  return FailureResult();
225 
226  if (!Int32.TryParse(request["EstateID"].ToString(), out EstateID))
227  return FailureResult();
228 
229  foreach (Scene s in m_EstateModule.Scenes)
230  {
231  if (s.RegionInfo.EstateSettings.EstateID == (uint)EstateID)
232  s.RegionInfo.RegionSettings.Covenant = CovenantID;
233  }
234 
235  return SuccessResult();
236  }
237 
238  byte[] UpdateEstate(Dictionary<string, object> request)
239  {
240  int EstateID = 0;
241 
242  if (!request.ContainsKey("EstateID"))
243  return FailureResult();
244  if (!Int32.TryParse(request["EstateID"].ToString(), out EstateID))
245  return FailureResult();
246 
247  foreach (Scene s in m_EstateModule.Scenes)
248  {
249  if (s.RegionInfo.EstateSettings.EstateID == (uint)EstateID)
250  s.ReloadEstateData();
251  }
252  return SuccessResult();
253  }
254 
255  private byte[] FailureResult()
256  {
257  return BoolResult(false);
258  }
259 
260  private byte[] SuccessResult()
261  {
262  return BoolResult(true);
263  }
264 
265  private byte[] BoolResult(bool value)
266  {
267  XmlDocument doc = new XmlDocument();
268 
269  XmlNode xmlnode = doc.CreateNode(XmlNodeType.XmlDeclaration,
270  "", "");
271 
272  doc.AppendChild(xmlnode);
273 
274  XmlElement rootElement = doc.CreateElement("", "ServerResponse",
275  "");
276 
277  doc.AppendChild(rootElement);
278 
279  XmlElement result = doc.CreateElement("", "RESULT", "");
280  result.AppendChild(doc.CreateTextNode(value.ToString()));
281 
282  rootElement.AppendChild(result);
283 
284  return Util.DocToBytes(doc);
285  }
286 
287  }
288 }
override byte[] ProcessRequest(string path, Stream requestData, IOSHttpRequest httpRequest, IOSHttpResponse httpResponse)
EstateSettings EstateSettings
Definition: RegionInfo.cs:275