refactor: Separate the upload baked texture handler out from BunchOfCaps
							parent
							
								
									4dbfcc26a2
								
							
						
					
					
						commit
						52ec854c42
					
				|  | @ -350,7 +350,5 @@ namespace OpenSim.Capabilities.Handlers | |||
|             } | ||||
|             return null; | ||||
|         } | ||||
| 
 | ||||
| 
 | ||||
|     } | ||||
| } | ||||
| } | ||||
|  | @ -0,0 +1,179 @@ | |||
| /* | ||||
|  * 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; | ||||
| using System.Collections.Specialized; | ||||
| using System.Drawing; | ||||
| using System.Drawing.Imaging; | ||||
| using System.Reflection; | ||||
| using System.IO; | ||||
| using System.Web; | ||||
| using log4net; | ||||
| using Nini.Config; | ||||
| using OpenMetaverse; | ||||
| using OpenMetaverse.StructuredData; | ||||
| using OpenMetaverse.Imaging; | ||||
| using OpenSim.Framework; | ||||
| using OpenSim.Framework.Capabilities; | ||||
| using OpenSim.Framework.Servers; | ||||
| using OpenSim.Framework.Servers.HttpServer; | ||||
| using OpenSim.Region.Framework.Interfaces; | ||||
| using OpenSim.Services.Interfaces; | ||||
| using Caps = OpenSim.Framework.Capabilities.Caps; | ||||
| 
 | ||||
| namespace OpenSim.Capabilities.Handlers | ||||
| { | ||||
|     public class UploadBakedTextureHandler | ||||
|     { | ||||
|         private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | ||||
| 
 | ||||
|         private Caps m_HostCapsObj; | ||||
|         private IAssetService m_assetService; | ||||
|         private bool m_persistBakedTextures; | ||||
| 
 | ||||
|         public UploadBakedTextureHandler(Caps caps, IAssetService assetService, bool persistBakedTextures) | ||||
|         { | ||||
|             m_HostCapsObj = caps; | ||||
|             m_assetService = assetService; | ||||
|             m_persistBakedTextures = persistBakedTextures; | ||||
|         } | ||||
| 
 | ||||
|         /// <summary> | ||||
|         /// Handle a request from the client for a Uri to upload a baked texture. | ||||
|         /// </summary> | ||||
|         /// <param name="request"></param> | ||||
|         /// <param name="path"></param> | ||||
|         /// <param name="param"></param> | ||||
|         /// <param name="httpRequest"></param> | ||||
|         /// <param name="httpResponse"></param> | ||||
|         /// <returns>The upload response if the request is successful, null otherwise.</returns> | ||||
|         public string UploadBakedTexture( | ||||
|             string request, string path, string param, OSHttpRequest httpRequest, OSHttpResponse httpResponse) | ||||
|         { | ||||
|             try | ||||
|             { | ||||
| //                m_log.Debug("[CAPS]: UploadBakedTexture Request in region: " + m_regionName); | ||||
| 
 | ||||
|                 string capsBase = "/CAPS/" + m_HostCapsObj.CapsObjectPath; | ||||
|                 string uploaderPath = Util.RandomClass.Next(5000, 8000).ToString("0000"); | ||||
| 
 | ||||
|                 BakedTextureUploader uploader = | ||||
|                     new BakedTextureUploader(capsBase + uploaderPath, m_HostCapsObj.HttpListener); | ||||
|                 uploader.OnUpLoad += BakedTextureUploaded; | ||||
| 
 | ||||
|                 m_HostCapsObj.HttpListener.AddStreamHandler( | ||||
|                         new BinaryStreamHandler("POST", capsBase + uploaderPath, | ||||
|                         uploader.uploaderCaps)); | ||||
| 
 | ||||
|                 string protocol = "http://"; | ||||
| 
 | ||||
|                 if (m_HostCapsObj.SSLCaps) | ||||
|                     protocol = "https://"; | ||||
| 
 | ||||
|                 string uploaderURL = protocol + m_HostCapsObj.HostName + ":" + | ||||
|                         m_HostCapsObj.Port.ToString() + capsBase + uploaderPath; | ||||
| 
 | ||||
|                 LLSDAssetUploadResponse uploadResponse = new LLSDAssetUploadResponse(); | ||||
|                 uploadResponse.uploader = uploaderURL; | ||||
|                 uploadResponse.state = "upload"; | ||||
| 
 | ||||
|                 return LLSDHelpers.SerialiseLLSDReply(uploadResponse); | ||||
|             } | ||||
|             catch (Exception e) | ||||
|             { | ||||
|                 m_log.Error("[CAPS]: " + e.ToString()); | ||||
|             } | ||||
| 
 | ||||
|             return null; | ||||
|         } | ||||
| 
 | ||||
|         /// <summary> | ||||
|         /// Called when a baked texture has been successfully uploaded by a client. | ||||
|         /// </summary> | ||||
|         /// <param name="assetID"></param> | ||||
|         /// <param name="data"></param> | ||||
|         private void BakedTextureUploaded(UUID assetID, byte[] data) | ||||
|         { | ||||
|             //            m_log.WarnFormat("[CAPS]: Received baked texture {0}", assetID.ToString()); | ||||
| 
 | ||||
|             AssetBase asset; | ||||
|             asset = new AssetBase(assetID, "Baked Texture", (sbyte)AssetType.Texture, m_HostCapsObj.AgentID.ToString()); | ||||
|             asset.Data = data; | ||||
|             asset.Temporary = true; | ||||
|             asset.Local = !m_persistBakedTextures; // Local assets aren't persisted, non-local are | ||||
|             m_assetService.Store(asset); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     class BakedTextureUploader | ||||
|     { | ||||
|         public event Action<UUID, byte[]> OnUpLoad; | ||||
| 
 | ||||
|         private string uploaderPath = String.Empty; | ||||
|         private UUID newAssetID; | ||||
|         private IHttpServer httpListener; | ||||
| 
 | ||||
|         public BakedTextureUploader(string path, IHttpServer httpServer) | ||||
|         { | ||||
|             newAssetID = UUID.Random(); | ||||
|             uploaderPath = path; | ||||
|             httpListener = httpServer; | ||||
|             //                m_log.InfoFormat("[CAPS] baked texture upload starting for {0}",newAssetID); | ||||
|         } | ||||
| 
 | ||||
|         /// <summary> | ||||
|         /// Handle raw uploaded baked texture data. | ||||
|         /// </summary> | ||||
|         /// <param name="data"></param> | ||||
|         /// <param name="path"></param> | ||||
|         /// <param name="param"></param> | ||||
|         /// <returns></returns> | ||||
|         public string uploaderCaps(byte[] data, string path, string param) | ||||
|         { | ||||
|             Action<UUID, byte[]> handlerUpLoad = OnUpLoad; | ||||
|             if (handlerUpLoad != null) | ||||
|             { | ||||
|                 Util.FireAndForget(delegate(object o) { handlerUpLoad(newAssetID, data); }); | ||||
|             } | ||||
| 
 | ||||
|             string res = String.Empty; | ||||
|             LLSDAssetUploadComplete uploadComplete = new LLSDAssetUploadComplete(); | ||||
|             uploadComplete.new_asset = newAssetID.ToString(); | ||||
|             uploadComplete.new_inventory_item = UUID.Zero; | ||||
|             uploadComplete.state = "complete"; | ||||
| 
 | ||||
|             res = LLSDHelpers.SerialiseLLSDReply(uploadComplete); | ||||
| 
 | ||||
|             httpListener.RemoveStreamHandler("POST", uploaderPath); | ||||
| 
 | ||||
|             //                m_log.InfoFormat("[CAPS] baked texture upload completed for {0}",newAssetID); | ||||
| 
 | ||||
|             return res; | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | @ -56,8 +56,6 @@ namespace OpenSim.Region.ClientStack.Linden | |||
|     string assetName, string description, UUID assetID, UUID inventoryItem, UUID parentFolder, | ||||
|     byte[] data, string inventoryType, string assetType); | ||||
| 
 | ||||
|     public delegate void UploadedBakedTexture(UUID assetID, byte[] data); | ||||
| 
 | ||||
|     public delegate UUID UpdateItem(UUID itemID, byte[] data); | ||||
| 
 | ||||
|     public delegate void UpdateTaskScript(UUID itemID, UUID primID, bool isScriptRunning, byte[] data, ref ArrayList errors); | ||||
|  | @ -97,7 +95,6 @@ namespace OpenSim.Region.ClientStack.Linden | |||
|         private static readonly string m_notecardTaskUpdatePath = "0005/"; | ||||
|         //        private static readonly string m_fetchInventoryPath = "0006/"; | ||||
|         // private static readonly string m_remoteParcelRequestPath = "0009/";// This is in the LandManagementModule. | ||||
|         private static readonly string m_uploadBakedTexturePath = "0010/";// This is in the LandManagementModule. | ||||
| 
 | ||||
| 
 | ||||
|         // These are callbacks which will be setup by the scene so that we can update scene data when we | ||||
|  | @ -165,8 +162,6 @@ namespace OpenSim.Region.ClientStack.Linden | |||
|                 IRequestHandler req = new RestStreamHandler("POST", capsBase + m_notecardTaskUpdatePath, ScriptTaskInventory); | ||||
|                 m_HostCapsObj.RegisterHandler("UpdateScriptTaskInventory", req); | ||||
|                 m_HostCapsObj.RegisterHandler("UpdateScriptTask", req); | ||||
|                 m_HostCapsObj.RegisterHandler("UploadBakedTexture", new RestStreamHandler("POST", capsBase + m_uploadBakedTexturePath, UploadBakedTexture)); | ||||
| 
 | ||||
|             } | ||||
|             catch (Exception e) | ||||
|             { | ||||
|  | @ -331,74 +326,6 @@ namespace OpenSim.Region.ClientStack.Linden | |||
|             } | ||||
|         } | ||||
| 
 | ||||
|         /// <summary> | ||||
|         /// Handle a request from the client for a Uri to upload a baked texture. | ||||
|         /// </summary> | ||||
|         /// <param name="request"></param> | ||||
|         /// <param name="path"></param> | ||||
|         /// <param name="param"></param> | ||||
|         /// <param name="httpRequest"></param> | ||||
|         /// <param name="httpResponse"></param> | ||||
|         /// <returns>The upload response if the request is successful, null otherwise.</returns> | ||||
|         public string UploadBakedTexture(string request, string path, | ||||
|                 string param, OSHttpRequest httpRequest, | ||||
|                 OSHttpResponse httpResponse) | ||||
|         { | ||||
|             try | ||||
|             { | ||||
| //                m_log.Debug("[CAPS]: UploadBakedTexture Request in region: " + m_regionName); | ||||
| 
 | ||||
|                 string capsBase = "/CAPS/" + m_HostCapsObj.CapsObjectPath; | ||||
|                 string uploaderPath = Util.RandomClass.Next(5000, 8000).ToString("0000"); | ||||
| 
 | ||||
|                 BakedTextureUploader uploader = | ||||
|                     new BakedTextureUploader(capsBase + uploaderPath, m_HostCapsObj.HttpListener); | ||||
|                 uploader.OnUpLoad += BakedTextureUploaded; | ||||
| 
 | ||||
|                 m_HostCapsObj.HttpListener.AddStreamHandler( | ||||
|                         new BinaryStreamHandler("POST", capsBase + uploaderPath, | ||||
|                         uploader.uploaderCaps)); | ||||
| 
 | ||||
|                 string protocol = "http://"; | ||||
| 
 | ||||
|                 if (m_HostCapsObj.SSLCaps) | ||||
|                     protocol = "https://"; | ||||
| 
 | ||||
|                 string uploaderURL = protocol + m_HostCapsObj.HostName + ":" + | ||||
|                         m_HostCapsObj.Port.ToString() + capsBase + uploaderPath; | ||||
| 
 | ||||
|                 LLSDAssetUploadResponse uploadResponse = | ||||
|                         new LLSDAssetUploadResponse(); | ||||
|                 uploadResponse.uploader = uploaderURL; | ||||
|                 uploadResponse.state = "upload"; | ||||
| 
 | ||||
|                 return LLSDHelpers.SerialiseLLSDReply(uploadResponse); | ||||
|             } | ||||
|             catch (Exception e) | ||||
|             { | ||||
|                 m_log.Error("[CAPS]: " + e.ToString()); | ||||
|             } | ||||
| 
 | ||||
|             return null; | ||||
|         } | ||||
| 
 | ||||
|         /// <summary> | ||||
|         /// Called when a baked texture has been successfully uploaded by a client. | ||||
|         /// </summary> | ||||
|         /// <param name="assetID"></param> | ||||
|         /// <param name="data"></param> | ||||
|         public void BakedTextureUploaded(UUID assetID, byte[] data) | ||||
|         { | ||||
|             //            m_log.WarnFormat("[CAPS]: Received baked texture {0}", assetID.ToString()); | ||||
| 
 | ||||
|             AssetBase asset; | ||||
|             asset = new AssetBase(assetID, "Baked Texture", (sbyte)AssetType.Texture, m_HostCapsObj.AgentID.ToString()); | ||||
|             asset.Data = data; | ||||
|             asset.Temporary = true; | ||||
|             asset.Local = !m_persistBakedTextures; // Local assets aren't persisted, non-local are | ||||
|             m_assetService.Store(asset); | ||||
|         } | ||||
| 
 | ||||
|         /// <summary> | ||||
|         /// Called when new asset data for an agent inventory item update has been uploaded. | ||||
|         /// </summary> | ||||
|  | @ -1068,6 +995,7 @@ namespace OpenSim.Region.ClientStack.Linden | |||
|             // XXX Maybe this should be some meaningful error packet | ||||
|             return null; | ||||
|         } | ||||
| 
 | ||||
|         ///Left this in and commented in case there are unforseen issues | ||||
|         //private void SaveAssetToFile(string filename, byte[] data) | ||||
|         //{ | ||||
|  | @ -1091,53 +1019,4 @@ namespace OpenSim.Region.ClientStack.Linden | |||
|             fs.Close(); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     public class BakedTextureUploader | ||||
|     { | ||||
|         public event UploadedBakedTexture OnUpLoad; | ||||
|         private UploadedBakedTexture handlerUpLoad = null; | ||||
| 
 | ||||
|         private string uploaderPath = String.Empty; | ||||
|         private UUID newAssetID; | ||||
|         private IHttpServer httpListener; | ||||
| 
 | ||||
|         public BakedTextureUploader(string path, IHttpServer httpServer) | ||||
|         { | ||||
|             newAssetID = UUID.Random(); | ||||
|             uploaderPath = path; | ||||
|             httpListener = httpServer; | ||||
|             //                m_log.InfoFormat("[CAPS] baked texture upload starting for {0}",newAssetID); | ||||
|         } | ||||
| 
 | ||||
|         /// <summary> | ||||
|         /// Handle raw uploaded baked texture data. | ||||
|         /// </summary> | ||||
|         /// <param name="data"></param> | ||||
|         /// <param name="path"></param> | ||||
|         /// <param name="param"></param> | ||||
|         /// <returns></returns> | ||||
|         public string uploaderCaps(byte[] data, string path, string param) | ||||
|         { | ||||
|             handlerUpLoad = OnUpLoad; | ||||
|             if (handlerUpLoad != null) | ||||
|             { | ||||
|                 Util.FireAndForget(delegate(object o) { handlerUpLoad(newAssetID, data); }); | ||||
|             } | ||||
| 
 | ||||
|             string res = String.Empty; | ||||
|             LLSDAssetUploadComplete uploadComplete = new LLSDAssetUploadComplete(); | ||||
|             uploadComplete.new_asset = newAssetID.ToString(); | ||||
|             uploadComplete.new_inventory_item = UUID.Zero; | ||||
|             uploadComplete.state = "complete"; | ||||
| 
 | ||||
|             res = LLSDHelpers.SerialiseLLSDReply(uploadComplete); | ||||
| 
 | ||||
|             httpListener.RemoveStreamHandler("POST", uploaderPath); | ||||
| 
 | ||||
|             //                m_log.InfoFormat("[CAPS] baked texture upload completed for {0}",newAssetID); | ||||
| 
 | ||||
|             return res; | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
| } | ||||
|  | @ -0,0 +1,112 @@ | |||
| /* | ||||
|  * 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; | ||||
| using System.Collections.Specialized; | ||||
| using System.Drawing; | ||||
| using System.Drawing.Imaging; | ||||
| using System.Reflection; | ||||
| using System.IO; | ||||
| using System.Web; | ||||
| using log4net; | ||||
| using Nini.Config; | ||||
| using Mono.Addins; | ||||
| using OpenMetaverse; | ||||
| using OpenMetaverse.StructuredData; | ||||
| using OpenMetaverse.Imaging; | ||||
| using OpenSim.Framework; | ||||
| using OpenSim.Framework.Servers; | ||||
| using OpenSim.Framework.Servers.HttpServer; | ||||
| using OpenSim.Region.Framework.Interfaces; | ||||
| using OpenSim.Region.Framework.Scenes; | ||||
| using OpenSim.Services.Interfaces; | ||||
| using Caps = OpenSim.Framework.Capabilities.Caps; | ||||
| using OpenSim.Capabilities.Handlers; | ||||
| 
 | ||||
| namespace OpenSim.Region.ClientStack.Linden | ||||
| { | ||||
|     [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule")] | ||||
|     public class UploadBakedTextureModule : INonSharedRegionModule | ||||
|     { | ||||
| //        private static readonly ILog m_log = | ||||
| //            LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | ||||
| 
 | ||||
|         /// <summary> | ||||
|         /// For historical reasons this is fixed, but there | ||||
|         /// </summary> | ||||
|         private static readonly string m_uploadBakedTexturePath = "0010/";// This is in the LandManagementModule. | ||||
| 
 | ||||
|         private Scene m_scene; | ||||
|         private bool m_persistBakedTextures; | ||||
| 
 | ||||
|         public void Initialise(IConfigSource source) | ||||
|         { | ||||
|             IConfig sconfig = source.Configs["Startup"]; | ||||
|             if (sconfig != null) | ||||
|                 m_persistBakedTextures = sconfig.GetBoolean("PersistBakedTextures", m_persistBakedTextures); | ||||
|         } | ||||
| 
 | ||||
|         public void AddRegion(Scene s) | ||||
|         { | ||||
|             m_scene = s; | ||||
|         } | ||||
| 
 | ||||
|         public void RemoveRegion(Scene s) | ||||
|         { | ||||
|         } | ||||
| 
 | ||||
|         public void RegionLoaded(Scene s) | ||||
|         { | ||||
|             m_scene.EventManager.OnRegisterCaps += RegisterCaps; | ||||
|         } | ||||
| 
 | ||||
|         public void PostInitialise() | ||||
|         { | ||||
|         } | ||||
| 
 | ||||
|         public void Close() { } | ||||
| 
 | ||||
|         public string Name { get { return "UploadBakedTextureModule"; } } | ||||
| 
 | ||||
|         public Type ReplaceableInterface | ||||
|         { | ||||
|             get { return null; } | ||||
|         } | ||||
| 
 | ||||
|         public void RegisterCaps(UUID agentID, Caps caps) | ||||
|         { | ||||
|             caps.RegisterHandler( | ||||
|                 "UploadBakedTexture", | ||||
|                 new RestStreamHandler( | ||||
|                     "POST", | ||||
|                     "/CAPS/" + m_uploadBakedTexturePath, | ||||
|                     new UploadBakedTextureHandler( | ||||
|                         caps, m_scene.AssetService, m_persistBakedTextures).UploadBakedTexture)); | ||||
|         } | ||||
|     } | ||||
| } | ||||
		Loading…
	
		Reference in New Issue
	
	 Justin Clark-Casey (justincc)
						Justin Clark-Casey (justincc)