From 17316170a5fb1396d7ed82f6d9c5f0976385cf31 Mon Sep 17 00:00:00 2001 From: Melanie Date: Wed, 6 Oct 2010 03:03:10 +0100 Subject: Add WOrldView request handler and plumbing --- .../World/WorldView/WorldViewModule.cs | 28 +++++ .../World/WorldView/WorldViewRequestHandler.cs | 127 +++++++++++++++++++++ 2 files changed, 155 insertions(+) create mode 100644 OpenSim/Region/OptionalModules/World/WorldView/WorldViewRequestHandler.cs (limited to 'OpenSim/Region') diff --git a/OpenSim/Region/OptionalModules/World/WorldView/WorldViewModule.cs b/OpenSim/Region/OptionalModules/World/WorldView/WorldViewModule.cs index d89d274..098b741 100644 --- a/OpenSim/Region/OptionalModules/World/WorldView/WorldViewModule.cs +++ b/OpenSim/Region/OptionalModules/World/WorldView/WorldViewModule.cs @@ -36,6 +36,9 @@ using OpenMetaverse.Imaging; using OpenSim.Framework; using OpenSim.Region.Framework.Interfaces; using OpenSim.Region.Framework.Scenes; +using OpenSim.Server.Base; +using OpenSim.Framework.Servers.HttpServer; +using OpenSim.Services.Interfaces; namespace OpenSim.Region.OptionalModules.World.WorldView { @@ -46,9 +49,18 @@ namespace OpenSim.Region.OptionalModules.World.WorldView private bool m_Enabled = false; + private IMapImageGenerator m_Generator; public void Initialise(IConfigSource config) { + IConfig moduleConfig = config.Configs["Modules"]; + if (moduleConfig == null) + return; + + if (moduleConfig.GetString("WorldViewModule", String.Empty) != Name) + return; + + m_Enabled = true; } public void AddRegion(Scene scene) @@ -57,6 +69,17 @@ namespace OpenSim.Region.OptionalModules.World.WorldView public void RegionLoaded(Scene scene) { + m_Generator = scene.RequestModuleInterface(); + if (m_Generator == null) + { + m_Enabled = false; + return; + } + + m_log.Info("[WORLDVIEW]: Configured and enabled"); + + IHttpServer server = MainServer.GetHttpServer(0); + server.AddStreamHandler(new WorldViewRequestHandler(this)); } public void RemoveRegion(Scene scene) @@ -76,5 +99,10 @@ namespace OpenSim.Region.OptionalModules.World.WorldView public void Close() { } + + public byte[] GenerateWorldView(Vector3 pos, Vector3 rot) + { + return new Byte[0]; + } } } diff --git a/OpenSim/Region/OptionalModules/World/WorldView/WorldViewRequestHandler.cs b/OpenSim/Region/OptionalModules/World/WorldView/WorldViewRequestHandler.cs new file mode 100644 index 0000000..a9cf1f1 --- /dev/null +++ b/OpenSim/Region/OptionalModules/World/WorldView/WorldViewRequestHandler.cs @@ -0,0 +1,127 @@ +/* + * 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.Collections.Generic; +using System.IO; +using System.Reflection; +using System.Xml; + +using OpenSim.Framework; +using OpenSim.Server.Base; +using OpenSim.Framework.Servers.HttpServer; +using OpenSim.Region.Framework.Scenes; +using OpenSim.Region.Framework.Interfaces; + +using OpenMetaverse; +using log4net; + +namespace OpenSim.Region.OptionalModules.World.WorldView +{ + public class WorldViewRequestHandler : BaseStreamHandler + { + private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + + protected WorldViewModule m_WorldViewModule; + protected Object m_RequestLock = new Object(); + + public WorldViewRequestHandler(WorldViewModule fmodule) + : base("POST", "/worldview") + { + m_WorldViewModule = fmodule; + } + + public override byte[] Handle(string path, Stream requestData, + OSHttpRequest httpRequest, OSHttpResponse httpResponse) + { + StreamReader sr = new StreamReader(requestData); + string body = sr.ReadToEnd(); + sr.Close(); + body = body.Trim(); + + try + { + lock (m_RequestLock) + { + Dictionary request = + ServerUtils.ParseQueryString(body); + + return SendWorldView(request); + } + } + catch (Exception e) + { + m_log.Debug("[WORLDVIEW]: Exception {0}" + e.ToString()); + } + + return new Byte[0]; + } + + public Byte[] SendWorldView(Dictionary request) + { + float posX; + float posY; + float posZ; + float rotX; + float rotY; + float rotZ; + + if (!request.ContainsKey("posX")) + return new Byte[0]; + if (!request.ContainsKey("posY")) + return new Byte[0]; + if (!request.ContainsKey("posZ")) + return new Byte[0]; + if (!request.ContainsKey("rotX")) + return new Byte[0]; + if (!request.ContainsKey("rotY")) + return new Byte[0]; + if (!request.ContainsKey("rotZ")) + return new Byte[0]; + + try + { + posX = Convert.ToSingle(request["posX"]); + posY = Convert.ToSingle(request["posY"]); + posZ = Convert.ToSingle(request["posZ"]); + rotX = Convert.ToSingle(request["rotX"]); + rotY = Convert.ToSingle(request["rotY"]); + rotZ = Convert.ToSingle(request["rotZ"]); + } + catch + { + return new Byte[0]; + } + + Vector3 pos = new Vector3(posX, posY, posZ); + Vector3 rot = new Vector3(rotX, rotY, rotZ); + + return m_WorldViewModule.GenerateWorldView(pos, rot); + } + } +} + -- cgit v1.1