diff --git a/OpenSim/Framework/ISearchModule.cs b/OpenSim/Framework/ISearchModule.cs
new file mode 100644
index 0000000000..64bf72cf86
--- /dev/null
+++ b/OpenSim/Framework/ISearchModule.cs
@@ -0,0 +1,36 @@
+/*
+ * 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;
+
+namespace OpenSim.Framework
+{
+ public interface ISearchModule
+ {
+
+ }
+}
diff --git a/OpenSim/Region/CoreModules/Agent/TextureSender/J2KDecoderModule.cs b/OpenSim/Region/CoreModules/Agent/TextureSender/J2KDecoderModule.cs
index 14dee84c24..a1a250176d 100644
--- a/OpenSim/Region/CoreModules/Agent/TextureSender/J2KDecoderModule.cs
+++ b/OpenSim/Region/CoreModules/Agent/TextureSender/J2KDecoderModule.cs
@@ -133,18 +133,20 @@ namespace OpenSim.Region.CoreModules.Agent.TextureSender
// Do Decode!
if (decode)
- DoJ2KDecode(assetID, j2kData);
+ Decode(assetID, j2kData);
}
}
- ///
- /// Provides a synchronous decode so that caller can be assured that this executes before the next line
- ///
- ///
- ///
- public void Decode(UUID assetID, byte[] j2kData)
+ public bool Decode(UUID assetID, byte[] j2kData)
{
- DoJ2KDecode(assetID, j2kData);
+ OpenJPEG.J2KLayerInfo[] layers;
+ int components;
+ return Decode(assetID, j2kData, out layers, out components);
+ }
+
+ public bool Decode(UUID assetID, byte[] j2kData, out OpenJPEG.J2KLayerInfo[] layers, out int components)
+ {
+ return DoJ2KDecode(assetID, j2kData, out layers, out components);
}
#endregion IJ2KDecoder
@@ -154,14 +156,21 @@ namespace OpenSim.Region.CoreModules.Agent.TextureSender
///
/// UUID of Asset
/// JPEG2000 data
- private void DoJ2KDecode(UUID assetID, byte[] j2kData)
+ /// layer data
+ /// number of components
+ /// true if decode was successful. false otherwise.
+ private bool DoJ2KDecode(UUID assetID, byte[] j2kData, out OpenJPEG.J2KLayerInfo[] layers, out int components)
{
// m_log.DebugFormat(
// "[J2KDecoderModule]: Doing J2K decoding of {0} bytes for asset {1}", j2kData.Length, assetID);
+ bool decodedSuccessfully = true;
+
//int DecodeTime = 0;
//DecodeTime = Environment.TickCount;
- OpenJPEG.J2KLayerInfo[] layers;
+
+ // We don't get this from CSJ2K. Is it relevant?
+ components = 0;
if (!TryLoadCacheForAsset(assetID, out layers))
{
@@ -196,14 +205,15 @@ namespace OpenSim.Region.CoreModules.Agent.TextureSender
catch (Exception ex)
{
m_log.Warn("[J2KDecoderModule]: CSJ2K threw an exception decoding texture " + assetID + ": " + ex.Message);
+ decodedSuccessfully = false;
}
}
else
{
- int components;
if (!OpenJPEG.DecodeLayerBoundaries(j2kData, out layers, out components))
{
m_log.Warn("[J2KDecoderModule]: OpenJPEG failed to decode texture " + assetID);
+ decodedSuccessfully = false;
}
}
@@ -212,6 +222,7 @@ namespace OpenSim.Region.CoreModules.Agent.TextureSender
m_log.Warn("[J2KDecoderModule]: Failed to decode layer data for texture " + assetID + ", guessing sane defaults");
// Layer decoding completely failed. Guess at sane defaults for the layer boundaries
layers = CreateDefaultLayers(j2kData.Length);
+ decodedSuccessfully = false;
}
// Cache Decoded layers
@@ -231,6 +242,8 @@ namespace OpenSim.Region.CoreModules.Agent.TextureSender
m_notifyList.Remove(assetID);
}
}
+
+ return decodedSuccessfully;
}
private OpenJPEG.J2KLayerInfo[] CreateDefaultLayers(int j2kLength)
diff --git a/OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs b/OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs
index 9df0592d4c..d68d28c345 100644
--- a/OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs
+++ b/OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs
@@ -321,8 +321,10 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory
return (defonly ? false : true);
}
- public void RequestRebake(IScenePresence sp, bool missingTexturesOnly)
+ public int RequestRebake(IScenePresence sp, bool missingTexturesOnly)
{
+ int texturesRebaked = 0;
+
for (int i = 0; i < AvatarAppearance.BAKE_INDICES.Length; i++)
{
int idx = AvatarAppearance.BAKE_INDICES[i];
@@ -359,8 +361,11 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory
face.TextureID, idx, sp.Name);
}
+ texturesRebaked++;
sp.ControllingClient.SendRebakeAvatarTextures(face.TextureID);
}
+
+ return texturesRebaked;
}
#endregion
diff --git a/OpenSim/Region/DataSnapshot/DataRequestHandler.cs b/OpenSim/Region/DataSnapshot/DataRequestHandler.cs
index b7604546eb..93648d6430 100644
--- a/OpenSim/Region/DataSnapshot/DataRequestHandler.cs
+++ b/OpenSim/Region/DataSnapshot/DataRequestHandler.cs
@@ -67,7 +67,7 @@ namespace OpenSim.Region.DataSnapshot
public void OnRegisterCaps(UUID agentID, Caps caps)
{
- m_log.Info("[DATASNAPSHOT]: Registering service discovery capability for " + agentID);
+// m_log.InfoFormat("[DATASNAPSHOT]: Registering service discovery capability for {0}", agentID);
string capsBase = "/CAPS/" + caps.CapsObjectPath;
caps.RegisterHandler("PublicSnapshotDataInfo",
new RestStreamHandler("POST", capsBase + m_discoveryPath, OnDiscoveryAttempt));
diff --git a/OpenSim/Region/Framework/Interfaces/IAvatarFactoryModule.cs b/OpenSim/Region/Framework/Interfaces/IAvatarFactoryModule.cs
index 04df9c3723..39a760cbf4 100644
--- a/OpenSim/Region/Framework/Interfaces/IAvatarFactoryModule.cs
+++ b/OpenSim/Region/Framework/Interfaces/IAvatarFactoryModule.cs
@@ -82,7 +82,10 @@ namespace OpenSim.Region.Framework.Interfaces
/// If true, only request a rebake for the textures that are missing.
/// If false then we request a rebake of all textures for which we already have references.
///
- void RequestRebake(IScenePresence sp, bool missingTexturesOnly);
+ ///
+ /// Number of rebake requests made. This will depend upon whether we've previously received texture IDs.
+ ///
+ int RequestRebake(IScenePresence sp, bool missingTexturesOnly);
void QueueAppearanceSend(UUID agentid);
void QueueAppearanceSave(UUID agentid);
diff --git a/OpenSim/Region/Framework/Interfaces/IJ2KDecoder.cs b/OpenSim/Region/Framework/Interfaces/IJ2KDecoder.cs
index 856eb119ab..46d03b3742 100644
--- a/OpenSim/Region/Framework/Interfaces/IJ2KDecoder.cs
+++ b/OpenSim/Region/Framework/Interfaces/IJ2KDecoder.cs
@@ -35,6 +35,23 @@ namespace OpenSim.Region.Framework.Interfaces
public interface IJ2KDecoder
{
void BeginDecode(UUID assetID, byte[] j2kData, DecodedCallback callback);
- void Decode(UUID assetID, byte[] j2kData);
+
+ ///
+ /// Provides a synchronous decode so that caller can be assured that this executes before the next line
+ ///
+ ///
+ ///
+ /// true if decode was successful. false otherwise.
+ bool Decode(UUID assetID, byte[] j2kData);
+
+ ///
+ /// Provides a synchronous decode so that caller can be assured that this executes before the next line
+ ///
+ ///
+ ///
+ /// layer data
+ /// number of components
+ /// true if decode was successful. false otherwise.
+ bool Decode(UUID assetID, byte[] j2kData, out OpenJPEG.J2KLayerInfo[] layers, out int components);
}
}
diff --git a/OpenSim/Region/OptionalModules/Agent/TextureSender/J2KDecoderCommandModule.cs b/OpenSim/Region/OptionalModules/Agent/TextureSender/J2KDecoderCommandModule.cs
new file mode 100644
index 0000000000..439096a09f
--- /dev/null
+++ b/OpenSim/Region/OptionalModules/Agent/TextureSender/J2KDecoderCommandModule.cs
@@ -0,0 +1,155 @@
+/*
+ * 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.Text;
+using log4net;
+using Mono.Addins;
+using Nini.Config;
+using OpenMetaverse;
+using OpenMetaverse.Imaging;
+using OpenSim.Framework;
+using OpenSim.Framework.Console;
+using OpenSim.Region.Framework.Interfaces;
+using OpenSim.Region.Framework.Scenes;
+
+namespace OpenSim.Region.OptionalModules.Agent.TextureSender
+{
+ ///
+ /// Commands for the J2KDecoder module. For debugging purposes.
+ ///
+ ///
+ /// Placed here so that they can be removed if not required and to keep the J2KDecoder module itself simple.
+ ///
+ [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule", Id = "J2KDecoderCommandModule")]
+ public class J2KDecoderCommandModule : ISharedRegionModule
+ {
+// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
+
+ private Scene m_scene;
+
+ public string Name { get { return "Asset Information Module"; } }
+
+ public Type ReplaceableInterface { get { return null; } }
+
+ public void Initialise(IConfigSource source)
+ {
+// m_log.DebugFormat("[J2K DECODER COMMAND MODULE]: INITIALIZED MODULE");
+ }
+
+ public void PostInitialise()
+ {
+// m_log.DebugFormat("[J2K DECODER COMMAND MODULE]: POST INITIALIZED MODULE");
+ }
+
+ public void Close()
+ {
+// m_log.DebugFormat("[J2K DECODER COMMAND MODULE]: CLOSED MODULE");
+ }
+
+ public void AddRegion(Scene scene)
+ {
+// m_log.DebugFormat("[J2K DECODER COMMAND MODULE]: REGION {0} ADDED", scene.RegionInfo.RegionName);
+ }
+
+ public void RemoveRegion(Scene scene)
+ {
+// m_log.DebugFormat("[J2K DECODER COMMAND MODULE]: REGION {0} REMOVED", scene.RegionInfo.RegionName);
+ }
+
+ public void RegionLoaded(Scene scene)
+ {
+// m_log.DebugFormat("[J2K DECODER COMMAND MODULE]: REGION {0} LOADED", scene.RegionInfo.RegionName);
+
+ if (m_scene == null)
+ m_scene = scene;
+
+ MainConsole.Instance.Commands.AddCommand(
+ "j2k",
+ false,
+ "j2k decode",
+ "j2k decode ",
+ "Do JPEG2000 decoding of an asset.",
+ "This is for debugging purposes. The asset id given must contain JPEG2000 data.",
+ HandleDecode);
+ }
+
+ void HandleDecode(string module, string[] args)
+ {
+ if (args.Length < 3)
+ {
+ MainConsole.Instance.Output("Usage is j2k decode ");
+ return;
+ }
+
+ UUID assetId;
+ string rawAssetId = args[2];
+
+ if (!UUID.TryParse(rawAssetId, out assetId))
+ {
+ MainConsole.Instance.OutputFormat("ERROR: {0} is not a valid ID format", rawAssetId);
+ return;
+ }
+
+ AssetBase asset = m_scene.AssetService.Get(assetId.ToString());
+ if (asset == null)
+ {
+ MainConsole.Instance.OutputFormat("ERROR: No asset found with ID {0}", assetId);
+ return;
+ }
+
+ if (asset.Type != (sbyte)AssetType.Texture)
+ {
+ MainConsole.Instance.OutputFormat("ERROR: Asset {0} is not a texture type", assetId);
+ return;
+ }
+
+ IJ2KDecoder decoder = m_scene.RequestModuleInterface();
+ if (decoder == null)
+ {
+ MainConsole.Instance.OutputFormat("ERROR: No IJ2KDecoder module available");
+ return;
+ }
+
+ OpenJPEG.J2KLayerInfo[] layers;
+ int components;
+ if (decoder.Decode(assetId, asset.Data, out layers, out components))
+ {
+ MainConsole.Instance.OutputFormat(
+ "Successfully decoded asset {0} with {1} layers and {2} components",
+ assetId, layers.Length, components);
+ }
+ else
+ {
+ MainConsole.Instance.OutputFormat("Decode of asset {0} failed", assetId);
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/OpenSim/Region/OptionalModules/Asset/AssetInfoModule.cs b/OpenSim/Region/OptionalModules/Asset/AssetInfoModule.cs
new file mode 100644
index 0000000000..a5207ebcb0
--- /dev/null
+++ b/OpenSim/Region/OptionalModules/Asset/AssetInfoModule.cs
@@ -0,0 +1,185 @@
+/*
+ * 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.Text;
+using log4net;
+using Mono.Addins;
+using Nini.Config;
+using OpenMetaverse;
+using OpenSim.Framework;
+using OpenSim.Framework.Console;
+using OpenSim.Region.Framework.Interfaces;
+using OpenSim.Region.Framework.Scenes;
+
+namespace OpenSim.Region.OptionalModules.Asset
+{
+ ///
+ /// A module that just holds commands for inspecting assets.
+ ///
+ [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule", Id = "AssetInfoModule")]
+ public class AssetInfoModule : ISharedRegionModule
+ {
+// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
+
+ private Scene m_scene;
+
+ public string Name { get { return "Asset Information Module"; } }
+
+ public Type ReplaceableInterface { get { return null; } }
+
+ public void Initialise(IConfigSource source)
+ {
+// m_log.DebugFormat("[ASSET INFO MODULE]: INITIALIZED MODULE");
+ }
+
+ public void PostInitialise()
+ {
+// m_log.DebugFormat("[ASSET INFO MODULE]: POST INITIALIZED MODULE");
+ }
+
+ public void Close()
+ {
+// m_log.DebugFormat("[ASSET INFO MODULE]: CLOSED MODULE");
+ }
+
+ public void AddRegion(Scene scene)
+ {
+// m_log.DebugFormat("[ASSET INFO MODULE]: REGION {0} ADDED", scene.RegionInfo.RegionName);
+ }
+
+ public void RemoveRegion(Scene scene)
+ {
+// m_log.DebugFormat("[ASSET INFO MODULE]: REGION {0} REMOVED", scene.RegionInfo.RegionName);
+ }
+
+ public void RegionLoaded(Scene scene)
+ {
+// m_log.DebugFormat("[ASSET INFO MODULE]: REGION {0} LOADED", scene.RegionInfo.RegionName);
+
+ if (m_scene == null)
+ m_scene = scene;
+
+ MainConsole.Instance.Commands.AddCommand(
+ "asset",
+ false,
+ "show asset",
+ "show asset ",
+ "Show asset information",
+ HandleShowAsset);
+
+ MainConsole.Instance.Commands.AddCommand(
+ "asset", false, "dump asset",
+ "dump asset ",
+ "Dump an asset",
+ HandleDumpAsset);
+ }
+
+ void HandleDumpAsset(string module, string[] args)
+ {
+ if (args.Length < 3)
+ {
+ MainConsole.Instance.Output("Usage is dump asset ");
+ return;
+ }
+
+ UUID assetId;
+ string rawAssetId = args[2];
+
+ if (!UUID.TryParse(rawAssetId, out assetId))
+ {
+ MainConsole.Instance.OutputFormat("ERROR: {0} is not a valid ID format", rawAssetId);
+ return;
+ }
+
+ AssetBase asset = m_scene.AssetService.Get(assetId.ToString());
+ if (asset == null)
+ {
+ MainConsole.Instance.OutputFormat("ERROR: No asset found with ID {0}", assetId);
+ return;
+ }
+
+ string fileName = rawAssetId;
+
+ using (FileStream fs = new FileStream(fileName, FileMode.CreateNew))
+ {
+ using (BinaryWriter bw = new BinaryWriter(fs))
+ {
+ bw.Write(asset.Data);
+ }
+ }
+
+ MainConsole.Instance.OutputFormat("Asset dumped to file {0}", fileName);
+ }
+
+ void HandleShowAsset(string module, string[] args)
+ {
+ if (args.Length < 3)
+ {
+ MainConsole.Instance.Output("Syntax: show asset ");
+ return;
+ }
+
+ AssetBase asset = m_scene.AssetService.Get(args[2]);
+
+ if (asset == null || asset.Data.Length == 0)
+ {
+ MainConsole.Instance.Output("Asset not found");
+ return;
+ }
+
+ int i;
+
+ MainConsole.Instance.OutputFormat("Name: {0}", asset.Name);
+ MainConsole.Instance.OutputFormat("Description: {0}", asset.Description);
+ MainConsole.Instance.OutputFormat("Type: {0} (type number = {1})", (AssetType)asset.Type, asset.Type);
+ MainConsole.Instance.OutputFormat("Content-type: {0}", asset.Metadata.ContentType);
+ MainConsole.Instance.OutputFormat("Size: {0} bytes", asset.Data.Length);
+ MainConsole.Instance.OutputFormat("Temporary: {0}", asset.Temporary ? "yes" : "no");
+ MainConsole.Instance.OutputFormat("Flags: {0}", asset.Metadata.Flags);
+
+ for (i = 0 ; i < 5 ; i++)
+ {
+ int off = i * 16;
+ if (asset.Data.Length <= off)
+ break;
+ int len = 16;
+ if (asset.Data.Length < off + len)
+ len = asset.Data.Length - off;
+
+ byte[] line = new byte[len];
+ Array.Copy(asset.Data, off, line, 0, len);
+
+ string text = BitConverter.ToString(line);
+ MainConsole.Instance.Output(String.Format("{0:x4}: {1}", off, text));
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/OpenSim/Region/OptionalModules/Avatar/Appearance/AppearanceInfoModule.cs b/OpenSim/Region/OptionalModules/Avatar/Appearance/AppearanceInfoModule.cs
index 7e15718c45..39cd4c992c 100644
--- a/OpenSim/Region/OptionalModules/Avatar/Appearance/AppearanceInfoModule.cs
+++ b/OpenSim/Region/OptionalModules/Avatar/Appearance/AppearanceInfoModule.cs
@@ -240,11 +240,16 @@ namespace OpenSim.Region.OptionalModules.Avatar.Appearance
ScenePresence sp = scene.GetScenePresence(firstname, lastname);
if (sp != null && !sp.IsChildAgent)
{
- MainConsole.Instance.OutputFormat(
- "Requesting rebake of uploaded textures for {0}",
- sp.Name, scene.RegionInfo.RegionName);
+ int rebakesRequested = scene.AvatarFactory.RequestRebake(sp, false);
- scene.AvatarFactory.RequestRebake(sp, false);
+ if (rebakesRequested > 0)
+ MainConsole.Instance.OutputFormat(
+ "Requesting rebake of {0} uploaded textures for {1} in {2}",
+ rebakesRequested, sp.Name, scene.RegionInfo.RegionName);
+ else
+ MainConsole.Instance.OutputFormat(
+ "No texture IDs available for rebake request for {0} in {1}",
+ sp.Name, scene.RegionInfo.RegionName);
}
}
}
diff --git a/OpenSim/Region/OptionalModules/Scripting/Minimodule/Interfaces/IInventoryItem.cs b/OpenSim/Region/OptionalModules/Scripting/Minimodule/Interfaces/IInventoryItem.cs
index 16cd7e454e..a8e545cc06 100644
--- a/OpenSim/Region/OptionalModules/Scripting/Minimodule/Interfaces/IInventoryItem.cs
+++ b/OpenSim/Region/OptionalModules/Scripting/Minimodule/Interfaces/IInventoryItem.cs
@@ -30,8 +30,7 @@ using OpenMetaverse;
using OpenMetaverse.Assets;
namespace OpenSim.Region.OptionalModules.Scripting.Minimodule
-{
-
+{
///
/// This implements the methods needed to operate on individual inventory items.
///
@@ -39,6 +38,6 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule
{
int Type { get; }
UUID AssetID { get; }
- T RetrieveAsset() where T : Asset, new();
+ T RetrieveAsset() where T : OpenMetaverse.Assets.Asset, new();
}
}
diff --git a/OpenSim/Server/Handlers/Asset/AssetServerConnector.cs b/OpenSim/Server/Handlers/Asset/AssetServerConnector.cs
index df571fa925..9b80245267 100644
--- a/OpenSim/Server/Handlers/Asset/AssetServerConnector.cs
+++ b/OpenSim/Server/Handlers/Asset/AssetServerConnector.cs
@@ -26,7 +26,11 @@
*/
using System;
+using System.IO;
using Nini.Config;
+using OpenMetaverse;
+using OpenSim.Framework;
+using OpenSim.Framework.Console;
using OpenSim.Server.Base;
using OpenSim.Services.Interfaces;
using OpenSim.Framework.Servers.HttpServer;
@@ -67,6 +71,129 @@ namespace OpenSim.Server.Handlers.Asset
server.AddStreamHandler(new AssetServerGetHandler(m_AssetService));
server.AddStreamHandler(new AssetServerPostHandler(m_AssetService));
server.AddStreamHandler(new AssetServerDeleteHandler(m_AssetService, allowDelete));
+
+ MainConsole.Instance.Commands.AddCommand("kfs", false,
+ "show asset",
+ "show asset ",
+ "Show asset information",
+ HandleShowAsset);
+
+ MainConsole.Instance.Commands.AddCommand("kfs", false,
+ "delete asset",
+ "delete asset ",
+ "Delete asset from database",
+ HandleDeleteAsset);
+
+ MainConsole.Instance.Commands.AddCommand("kfs", false,
+ "dump asset",
+ "dump asset ",
+ "Dump asset to a file",
+ "The filename is the same as the ID given.",
+ HandleDumpAsset);
+ }
+
+ void HandleDeleteAsset(string module, string[] args)
+ {
+ if (args.Length < 3)
+ {
+ MainConsole.Instance.Output("Syntax: delete asset ");
+ return;
+ }
+
+ AssetBase asset = m_AssetService.Get(args[2]);
+
+ if (asset == null || asset.Data.Length == 0)
+ {
+ MainConsole.Instance.Output("Asset not found");
+ return;
+ }
+
+ m_AssetService.Delete(args[2]);
+
+ //MainConsole.Instance.Output("Asset deleted");
+ // TODO: Implement this
+
+ MainConsole.Instance.Output("Asset deletion not supported by database");
+ }
+
+ void HandleDumpAsset(string module, string[] args)
+ {
+ if (args.Length < 3)
+ {
+ MainConsole.Instance.Output("Usage is dump asset ");
+ return;
+ }
+
+ UUID assetId;
+ string rawAssetId = args[2];
+
+ if (!UUID.TryParse(rawAssetId, out assetId))
+ {
+ MainConsole.Instance.OutputFormat("ERROR: {0} is not a valid ID format", rawAssetId);
+ return;
+ }
+
+ AssetBase asset = m_AssetService.Get(assetId.ToString());
+ if (asset == null)
+ {
+ MainConsole.Instance.OutputFormat("ERROR: No asset found with ID {0}", assetId);
+ return;
+ }
+
+ string fileName = rawAssetId;
+
+ using (FileStream fs = new FileStream(fileName, FileMode.CreateNew))
+ {
+ using (BinaryWriter bw = new BinaryWriter(fs))
+ {
+ bw.Write(asset.Data);
+ }
+ }
+
+ MainConsole.Instance.OutputFormat("Asset dumped to file {0}", fileName);
+ }
+
+ void HandleShowAsset(string module, string[] args)
+ {
+ if (args.Length < 3)
+ {
+ MainConsole.Instance.Output("Syntax: show asset ");
+ return;
+ }
+
+ AssetBase asset = m_AssetService.Get(args[2]);
+
+ if (asset == null || asset.Data.Length == 0)
+ {
+ MainConsole.Instance.Output("Asset not found");
+ return;
+ }
+
+ int i;
+
+ MainConsole.Instance.OutputFormat("Name: {0}", asset.Name);
+ MainConsole.Instance.OutputFormat("Description: {0}", asset.Description);
+ MainConsole.Instance.OutputFormat("Type: {0} (type number = {1})", (AssetType)asset.Type, asset.Type);
+ MainConsole.Instance.OutputFormat("Content-type: {0}", asset.Metadata.ContentType);
+ MainConsole.Instance.OutputFormat("Size: {0} bytes", asset.Data.Length);
+ MainConsole.Instance.OutputFormat("Temporary: {0}", asset.Temporary ? "yes" : "no");
+ MainConsole.Instance.OutputFormat("Flags: {0}", asset.Metadata.Flags);
+
+ for (i = 0 ; i < 5 ; i++)
+ {
+ int off = i * 16;
+ if (asset.Data.Length <= off)
+ break;
+ int len = 16;
+ if (asset.Data.Length < off + len)
+ len = asset.Data.Length - off;
+
+ byte[] line = new byte[len];
+ Array.Copy(asset.Data, off, line, 0, len);
+
+ string text = BitConverter.ToString(line);
+ MainConsole.Instance.Output(String.Format("{0:x4}: {1}", off, text));
+ }
}
}
-}
+}
\ No newline at end of file
diff --git a/OpenSim/Services/AssetService/AssetService.cs b/OpenSim/Services/AssetService/AssetService.cs
index ec424c0d24..d4bfe8f00b 100644
--- a/OpenSim/Services/AssetService/AssetService.cs
+++ b/OpenSim/Services/AssetService/AssetService.cs
@@ -32,7 +32,6 @@ using System.Reflection;
using Nini.Config;
using log4net;
using OpenSim.Framework;
-using OpenSim.Framework.Console;
using OpenSim.Data;
using OpenSim.Services.Interfaces;
using OpenMetaverse;
@@ -53,23 +52,6 @@ namespace OpenSim.Services.AssetService
{
m_RootInstance = this;
- MainConsole.Instance.Commands.AddCommand("kfs", false,
- "show digest",
- "show digest ",
- "Show asset digest", HandleShowDigest);
-
- MainConsole.Instance.Commands.AddCommand("kfs", false,
- "delete asset",
- "delete asset ",
- "Delete asset from database", HandleDeleteAsset);
-
- MainConsole.Instance.Commands.AddCommand("kfs", false,
- "dump asset",
- "dump asset ",
- "Dump asset to a file",
- "The filename is the same as the ID given.",
- HandleDumpAsset);
-
if (m_AssetLoader != null)
{
IConfig assetConfig = config.Configs["AssetService"];
@@ -221,111 +203,11 @@ namespace OpenSim.Services.AssetService
return m_Database.Delete(id);
}
else
+ {
m_log.DebugFormat("[ASSET SERVICE]: Request to delete asset {0}, but flags are not Maptile", id);
+ }
return false;
}
-
- void HandleDumpAsset(string module, string[] args)
- {
- if (args.Length < 3)
- {
- MainConsole.Instance.Output("Usage is dump asset ");
- return;
- }
-
- string rawAssetId = args[2];
- UUID assetId;
-
- if (!UUID.TryParse(rawAssetId, out assetId))
- {
- MainConsole.Instance.OutputFormat("ERROR: {0} is not a valid ID format", rawAssetId);
- return;
- }
-
- AssetBase asset = m_Database.GetAsset(assetId);
- if (asset == null)
- {
- MainConsole.Instance.OutputFormat("ERROR: No asset found with ID {0}", assetId);
- return;
- }
-
- string fileName = rawAssetId;
-
- using (FileStream fs = new FileStream(fileName, FileMode.CreateNew))
- {
- using (BinaryWriter bw = new BinaryWriter(fs))
- {
- bw.Write(asset.Data);
- }
- }
-
- MainConsole.Instance.OutputFormat("Asset dumped to file {0}", fileName);
- }
-
- void HandleShowDigest(string module, string[] args)
- {
- if (args.Length < 3)
- {
- MainConsole.Instance.Output("Syntax: show digest ");
- return;
- }
-
- AssetBase asset = Get(args[2]);
-
- if (asset == null || asset.Data.Length == 0)
- {
- MainConsole.Instance.Output("Asset not found");
- return;
- }
-
- int i;
-
- MainConsole.Instance.OutputFormat("Name: {0}", asset.Name);
- MainConsole.Instance.OutputFormat("Description: {0}", asset.Description);
- MainConsole.Instance.OutputFormat("Type: {0} (type number = {1})", (AssetType)asset.Type, asset.Type);
- MainConsole.Instance.OutputFormat("Content-type: {0}", asset.Metadata.ContentType);
- MainConsole.Instance.OutputFormat("Flags: {0}", asset.Metadata.Flags);
-
- for (i = 0 ; i < 5 ; i++)
- {
- int off = i * 16;
- if (asset.Data.Length <= off)
- break;
- int len = 16;
- if (asset.Data.Length < off + len)
- len = asset.Data.Length - off;
-
- byte[] line = new byte[len];
- Array.Copy(asset.Data, off, line, 0, len);
-
- string text = BitConverter.ToString(line);
- MainConsole.Instance.Output(String.Format("{0:x4}: {1}", off, text));
- }
- }
-
- void HandleDeleteAsset(string module, string[] args)
- {
- if (args.Length < 3)
- {
- MainConsole.Instance.Output("Syntax: delete asset ");
- return;
- }
-
- AssetBase asset = Get(args[2]);
-
- if (asset == null || asset.Data.Length == 0)
- {
- MainConsole.Instance.Output("Asset not found");
- return;
- }
-
- Delete(args[2]);
-
- //MainConsole.Instance.Output("Asset deleted");
- // TODO: Implement this
-
- MainConsole.Instance.Output("Asset deletion not supported by database");
- }
}
-}
+}
\ No newline at end of file
diff --git a/OpenSim/Services/Connectors/Asset/AssetServiceConnector.cs b/OpenSim/Services/Connectors/Asset/AssetServiceConnector.cs
index c3268d1632..9bd04ed744 100644
--- a/OpenSim/Services/Connectors/Asset/AssetServiceConnector.cs
+++ b/OpenSim/Services/Connectors/Asset/AssetServiceConnector.cs
@@ -89,7 +89,6 @@ namespace OpenSim.Services.Connectors
m_log.Error("[ASSET CONNECTOR]: No Server URI named in section AssetService");
throw new Exception("Asset connector init error");
}
- m_ServerURI = serviceURI;
MainConsole.Instance.Commands.AddCommand("asset", false, "dump asset",
"dump asset ",
@@ -461,43 +460,5 @@ namespace OpenSim.Services.Connectors
}
return false;
}
-
- private void HandleDumpAsset(string module, string[] args)
- {
- if (args.Length != 4)
- {
- MainConsole.Instance.Output("Syntax: dump asset ");
- return;
- }
-
- UUID assetID;
-
- if (!UUID.TryParse(args[2], out assetID))
- {
- MainConsole.Instance.Output("Invalid asset ID");
- return;
- }
-
- if (m_Cache == null)
- {
- MainConsole.Instance.Output("Instance uses no cache");
- return;
- }
-
- AssetBase asset = m_Cache.Get(assetID.ToString());
-
- if (asset == null)
- {
- MainConsole.Instance.Output("Asset not found in cache");
- return;
- }
-
- string fileName = args[3];
-
- FileStream fs = File.Create(fileName);
- fs.Write(asset.Data, 0, asset.Data.Length);
-
- fs.Close();
- }
}
}