From 5460f2e035f50aade96b3daa0cb284bcb6faeea7 Mon Sep 17 00:00:00 2001
From: Justin Clark-Casey (justincc)
Date: Thu, 1 Dec 2011 23:24:15 +0000
Subject: refactor: Separate the upload baked texture handler out from
BunchOfCaps
---
.../Handlers/GetTexture/GetTextureHandler.cs | 4 +-
.../UploadBakedTextureHandler.cs | 179 +++++++++++++++++++++
.../Linden/Caps/BunchOfCaps/BunchOfCaps.cs | 123 +-------------
.../Linden/Caps/UploadBakedTextureModule.cs | 112 +++++++++++++
4 files changed, 293 insertions(+), 125 deletions(-)
create mode 100644 OpenSim/Capabilities/Handlers/UploadBakedTexture/UploadBakedTextureHandler.cs
create mode 100644 OpenSim/Region/ClientStack/Linden/Caps/UploadBakedTextureModule.cs
diff --git a/OpenSim/Capabilities/Handlers/GetTexture/GetTextureHandler.cs b/OpenSim/Capabilities/Handlers/GetTexture/GetTextureHandler.cs
index e1b4fe7..245d931 100644
--- a/OpenSim/Capabilities/Handlers/GetTexture/GetTextureHandler.cs
+++ b/OpenSim/Capabilities/Handlers/GetTexture/GetTextureHandler.cs
@@ -350,7 +350,5 @@ namespace OpenSim.Capabilities.Handlers
}
return null;
}
-
-
}
-}
+}
\ No newline at end of file
diff --git a/OpenSim/Capabilities/Handlers/UploadBakedTexture/UploadBakedTextureHandler.cs b/OpenSim/Capabilities/Handlers/UploadBakedTexture/UploadBakedTextureHandler.cs
new file mode 100644
index 0000000..97b558c
--- /dev/null
+++ b/OpenSim/Capabilities/Handlers/UploadBakedTexture/UploadBakedTextureHandler.cs
@@ -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;
+ }
+
+ ///
+ /// Handle a request from the client for a Uri to upload a baked texture.
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ /// The upload response if the request is successful, null otherwise.
+ 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;
+ }
+
+ ///
+ /// Called when a baked texture has been successfully uploaded by a client.
+ ///
+ ///
+ ///
+ 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 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);
+ }
+
+ ///
+ /// Handle raw uploaded baked texture data.
+ ///
+ ///
+ ///
+ ///
+ ///
+ public string uploaderCaps(byte[] data, string path, string param)
+ {
+ Action 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;
+ }
+ }
+}
\ No newline at end of file
diff --git a/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs b/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs
index 07b4df3..98dda36 100644
--- a/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs
+++ b/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs
@@ -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
@@ -164,8 +161,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
}
///
- /// Handle a request from the client for a Uri to upload a baked texture.
- ///
- ///
- ///
- ///
- ///
- ///
- /// The upload response if the request is successful, null otherwise.
- 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;
- }
-
- ///
- /// Called when a baked texture has been successfully uploaded by a client.
- ///
- ///
- ///
- 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);
- }
-
- ///
/// Called when new asset data for an agent inventory item update has been uploaded.
///
/// Item to update
@@ -1067,6 +994,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)
//{
@@ -1090,53 +1018,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);
- }
-
- ///
- /// Handle raw uploaded baked texture data.
- ///
- ///
- ///
- ///
- ///
- 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;
- }
- }
-
}
\ No newline at end of file
diff --git a/OpenSim/Region/ClientStack/Linden/Caps/UploadBakedTextureModule.cs b/OpenSim/Region/ClientStack/Linden/Caps/UploadBakedTextureModule.cs
new file mode 100644
index 0000000..e61815f
--- /dev/null
+++ b/OpenSim/Region/ClientStack/Linden/Caps/UploadBakedTextureModule.cs
@@ -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);
+
+ ///
+ /// For historical reasons this is fixed, but there
+ ///
+ 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));
+ }
+ }
+}
\ No newline at end of file
--
cgit v1.1