clockwerk-opensim-stable – Blame information for rev 1

Subversion Repositories:
Rev:
Rev Author Line No. Line
1 vero 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 Nini.Config;
29 using log4net;
30 using System;
31 using System.Reflection;
32 using System.IO;
33 using System.Net;
34 using System.Text;
35 using System.Text.RegularExpressions;
36 using System.Xml;
37 using System.Xml.Serialization;
38 using System.Collections.Generic;
39 using OpenSim.Server.Base;
40 using OpenSim.Services.Interfaces;
41 using OpenSim.Framework;
42 using OpenSim.Framework.Servers.HttpServer;
43 using OpenMetaverse;
44  
45 namespace OpenSim.Server.Handlers.Avatar
46 {
47 public class AvatarServerPostHandler : BaseStreamHandler
48 {
49 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
50  
51 private IAvatarService m_AvatarService;
52  
53 public AvatarServerPostHandler(IAvatarService service) :
54 base("POST", "/avatar")
55 {
56 m_AvatarService = service;
57 }
58  
59 protected override byte[] ProcessRequest(string path, Stream requestData,
60 IOSHttpRequest httpRequest, IOSHttpResponse httpResponse)
61 {
62 StreamReader sr = new StreamReader(requestData);
63 string body = sr.ReadToEnd();
64 sr.Close();
65 body = body.Trim();
66  
67 //m_log.DebugFormat("[XXX]: query String: {0}", body);
68  
69 try
70 {
71 Dictionary<string, object> request =
72 ServerUtils.ParseQueryString(body);
73  
74 if (!request.ContainsKey("METHOD"))
75 return FailureResult();
76  
77 string method = request["METHOD"].ToString();
78  
79 switch (method)
80 {
81 case "getavatar":
82 return GetAvatar(request);
83 case "setavatar":
84 return SetAvatar(request);
85 case "resetavatar":
86 return ResetAvatar(request);
87 case "setitems":
88 return SetItems(request);
89 case "removeitems":
90 return RemoveItems(request);
91 }
92 m_log.DebugFormat("[AVATAR HANDLER]: unknown method request: {0}", method);
93 }
94 catch (Exception e)
95 {
96 m_log.Debug("[AVATAR HANDLER]: Exception {0}" + e);
97 }
98  
99 return FailureResult();
100  
101 }
102  
103 byte[] GetAvatar(Dictionary<string, object> request)
104 {
105 UUID user = UUID.Zero;
106  
107 if (!request.ContainsKey("UserID"))
108 return FailureResult();
109  
110 if (UUID.TryParse(request["UserID"].ToString(), out user))
111 {
112 AvatarData avatar = m_AvatarService.GetAvatar(user);
113 if (avatar == null)
114 return FailureResult();
115  
116 Dictionary<string, object> result = new Dictionary<string, object>();
117 if (avatar == null)
118 result["result"] = "null";
119 else
120 result["result"] = avatar.ToKeyValuePairs();
121  
122 string xmlString = ServerUtils.BuildXmlResponse(result);
123  
124 return Util.UTF8NoBomEncoding.GetBytes(xmlString);
125 }
126  
127 return FailureResult();
128 }
129  
130 byte[] SetAvatar(Dictionary<string, object> request)
131 {
132 UUID user = UUID.Zero;
133  
134 if (!request.ContainsKey("UserID"))
135 return FailureResult();
136  
137 if (!UUID.TryParse(request["UserID"].ToString(), out user))
138 return FailureResult();
139  
140 RemoveRequestParamsNotForStorage(request);
141  
142 AvatarData avatar = new AvatarData(request);
143 if (m_AvatarService.SetAvatar(user, avatar))
144 return SuccessResult();
145  
146 return FailureResult();
147 }
148  
149 byte[] ResetAvatar(Dictionary<string, object> request)
150 {
151 UUID user = UUID.Zero;
152 if (!request.ContainsKey("UserID"))
153 return FailureResult();
154  
155 if (!UUID.TryParse(request["UserID"].ToString(), out user))
156 return FailureResult();
157  
158 RemoveRequestParamsNotForStorage(request);
159  
160 if (m_AvatarService.ResetAvatar(user))
161 return SuccessResult();
162  
163 return FailureResult();
164 }
165  
166 /// <summary>
167 /// Remove parameters that were used to invoke the method and should not in themselves be persisted.
168 /// </summary>
169 /// <param name='request'></param>
170 private void RemoveRequestParamsNotForStorage(Dictionary<string, object> request)
171 {
172 request.Remove("VERSIONMAX");
173 request.Remove("VERSIONMIN");
174 request.Remove("METHOD");
175 request.Remove("UserID");
176 }
177  
178 byte[] SetItems(Dictionary<string, object> request)
179 {
180 UUID user = UUID.Zero;
181 string[] names, values;
182  
183 if (!request.ContainsKey("UserID") || !request.ContainsKey("Names") || !request.ContainsKey("Values"))
184 return FailureResult();
185  
186 if (!UUID.TryParse(request["UserID"].ToString(), out user))
187 return FailureResult();
188  
189 if (!(request["Names"] is List<string> || request["Values"] is List<string>))
190 return FailureResult();
191  
192 RemoveRequestParamsNotForStorage(request);
193  
194 List<string> _names = (List<string>)request["Names"];
195 names = _names.ToArray();
196 List<string> _values = (List<string>)request["Values"];
197 values = _values.ToArray();
198  
199 if (m_AvatarService.SetItems(user, names, values))
200 return SuccessResult();
201  
202 return FailureResult();
203 }
204  
205 byte[] RemoveItems(Dictionary<string, object> request)
206 {
207 UUID user = UUID.Zero;
208 string[] names;
209  
210 if (!request.ContainsKey("UserID") || !request.ContainsKey("Names"))
211 return FailureResult();
212  
213 if (!UUID.TryParse(request["UserID"].ToString(), out user))
214 return FailureResult();
215  
216 if (!(request["Names"] is List<string>))
217 return FailureResult();
218  
219 List<string> _names = (List<string>)request["Names"];
220 names = _names.ToArray();
221  
222 if (m_AvatarService.RemoveItems(user, names))
223 return SuccessResult();
224  
225 return FailureResult();
226 }
227  
228  
229  
230 private byte[] SuccessResult()
231 {
232 XmlDocument doc = new XmlDocument();
233  
234 XmlNode xmlnode = doc.CreateNode(XmlNodeType.XmlDeclaration,
235 "", "");
236  
237 doc.AppendChild(xmlnode);
238  
239 XmlElement rootElement = doc.CreateElement("", "ServerResponse",
240 "");
241  
242 doc.AppendChild(rootElement);
243  
244 XmlElement result = doc.CreateElement("", "result", "");
245 result.AppendChild(doc.CreateTextNode("Success"));
246  
247 rootElement.AppendChild(result);
248  
249 return DocToBytes(doc);
250 }
251  
252 private byte[] FailureResult()
253 {
254 XmlDocument doc = new XmlDocument();
255  
256 XmlNode xmlnode = doc.CreateNode(XmlNodeType.XmlDeclaration,
257 "", "");
258  
259 doc.AppendChild(xmlnode);
260  
261 XmlElement rootElement = doc.CreateElement("", "ServerResponse",
262 "");
263  
264 doc.AppendChild(rootElement);
265  
266 XmlElement result = doc.CreateElement("", "result", "");
267 result.AppendChild(doc.CreateTextNode("Failure"));
268  
269 rootElement.AppendChild(result);
270  
271 return DocToBytes(doc);
272 }
273  
274 private byte[] DocToBytes(XmlDocument doc)
275 {
276 MemoryStream ms = new MemoryStream();
277 XmlTextWriter xw = new XmlTextWriter(ms, null);
278 xw.Formatting = Formatting.Indented;
279 doc.WriteTo(xw);
280 xw.Flush();
281  
282 return ms.ToArray();
283 }
284  
285 }
286 }