From 11976582339d068a6e8eb793166199a532b78b88 Mon Sep 17 00:00:00 2001 From: Melanie Date: Tue, 4 Feb 2014 02:09:39 +0000 Subject: [PATCH] Adding the Avination XBakesModule, the client for the persistent bakes system --- .../Avatar/BakedTextures/XBakesModule.cs | 189 ++++++++++++++++++ 1 file changed, 189 insertions(+) create mode 100644 OpenSim/Region/CoreModules/Avatar/BakedTextures/XBakesModule.cs diff --git a/OpenSim/Region/CoreModules/Avatar/BakedTextures/XBakesModule.cs b/OpenSim/Region/CoreModules/Avatar/BakedTextures/XBakesModule.cs new file mode 100644 index 0000000000..6ef5e39ea8 --- /dev/null +++ b/OpenSim/Region/CoreModules/Avatar/BakedTextures/XBakesModule.cs @@ -0,0 +1,189 @@ +/* + * 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 Nini.Config; +using System; +using System.IO; +using System.Text; +using System.Xml; +using System.Xml.Serialization; +using System.Collections; +using System.Collections.Generic; +using System.Reflection; +using log4net; +using OpenSim.Framework; +using OpenSim.Framework.Communications; +using OpenSim.Region.Framework.Interfaces; +using OpenSim.Region.Framework.Scenes; +using OpenSim.Services.Interfaces; +using Mono.Addins; + +namespace OpenSim.Region.CoreModules.Avatar.BakedTextures +{ + [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule", Id = "XBakes.Module")] + public class XBakesModule : INonSharedRegionModule, IBakedTextureModule + { + protected Scene m_Scene; + private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + private UTF8Encoding enc = new UTF8Encoding(); + private string m_URL = String.Empty; + private static XmlSerializer m_serializer = new XmlSerializer(typeof(AssetBase)); + + + + public void Initialise(IConfigSource configSource) + { + IConfig config = configSource.Configs["XBakes"]; + if (config == null) + return; + + m_URL = config.GetString("URL", String.Empty); + } + + public void AddRegion(Scene scene) + { + // m_log.InfoFormat("[XBakes]: Enabled for region {0}", scene.RegionInfo.RegionName); + m_Scene = scene; + + scene.RegisterModuleInterface(this); + } + + public void RegionLoaded(Scene scene) + { + } + + public void RemoveRegion(Scene scene) + { + } + + public void Close() + { + } + + public string Name + { + get { return "XBakes.Module"; } + } + + public Type ReplaceableInterface + { + get { return null; } + } + + public WearableCacheItem[] Get(UUID id) + { + if (m_URL == String.Empty) + return null; + + int size = 0; + RestClient rc = new RestClient(m_URL); + List ret = new List(); + rc.AddResourcePath("bakes"); + rc.AddResourcePath(id.ToString()); + + rc.RequestMethod = "GET"; + + try + { + Stream s = rc.Request(); + XmlTextReader sr = new XmlTextReader(s); + + sr.ReadStartElement("BakedAppearance"); + while (sr.LocalName == "BakedTexture") + { + string sTextureIndex = sr.GetAttribute("TextureIndex"); + int lTextureIndex = Convert.ToInt32(sTextureIndex); + string sCacheId = sr.GetAttribute("CacheId"); + UUID lCacheId = UUID.Zero; + if (!(UUID.TryParse(sCacheId, out lCacheId))) + { + // ?? Nothing here + } + + ++size; + + sr.ReadStartElement("BakedTexture"); + AssetBase a = (AssetBase)m_serializer.Deserialize(sr); + ret.Add(new WearableCacheItem() { CacheId = lCacheId, TextureIndex = (uint)lTextureIndex, TextureAsset = a, TextureID = a.FullID }); + + sr.ReadEndElement(); + } + m_log.DebugFormat("[XBakes]: Ended reading"); + sr.Close(); + s.Close(); + + + return ret.ToArray(); + } + catch (XmlException e) + { + return null; + } + } + + public void Store(UUID agentId, WearableCacheItem[] data) + { + MemoryStream bakeStream = new MemoryStream(); + XmlTextWriter bakeWriter = new XmlTextWriter(bakeStream, null); + + bakeWriter.WriteStartElement(String.Empty, "BakedAppearance", String.Empty); + + for (int i = 0; i < data.Length; i++) + { + if (data[i] != null) + { + bakeWriter.WriteStartElement(String.Empty, "BakedTexture", String.Empty); + bakeWriter.WriteAttributeString(String.Empty, "TextureIndex", String.Empty, data[i].TextureIndex.ToString()); + bakeWriter.WriteAttributeString(String.Empty, "CacheId", String.Empty, data[i].CacheId.ToString()); + if (data[i].TextureAsset != null) + m_serializer.Serialize(bakeWriter, data[i].TextureAsset); + + bakeWriter.WriteEndElement(); + } + } + + bakeWriter.WriteEndElement(); + bakeWriter.Flush(); + + RestClient rc = new RestClient(m_URL); + rc.AddResourcePath("bakes"); + rc.AddResourcePath(agentId.ToString()); + + rc.RequestMethod = "POST"; + + MemoryStream reqStream = new MemoryStream(bakeStream.ToArray()); + Util.FireAndForget( + delegate + { + rc.Request(reqStream); + } + ); + } + + } +}