瀏覽代碼

Adding the Avination XBakesModule, the client for the persistent bakes system

Melanie 10 年之前
父節點
當前提交
1197658233
共有 1 個文件被更改,包括 189 次插入0 次删除
  1. 189 0
      OpenSim/Region/CoreModules/Avatar/BakedTextures/XBakesModule.cs

+ 189 - 0
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<IBakedTextureModule>(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<WearableCacheItem> ret = new List<WearableCacheItem>();
+            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);
+                }
+            );
+        }
+
+    }
+}