From d8ee0cbe1cf93ca521f52ce39aa2a15cb5784e48 Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Sat, 30 Apr 2011 09:24:15 -0700 Subject: First stab at cleaning up Caps. Compiles. Untested. --- OpenSim/Region/ClientStack/LindenUDP/J2KImage.cs | 398 ----------------------- 1 file changed, 398 deletions(-) delete mode 100644 OpenSim/Region/ClientStack/LindenUDP/J2KImage.cs (limited to 'OpenSim/Region/ClientStack/LindenUDP/J2KImage.cs') diff --git a/OpenSim/Region/ClientStack/LindenUDP/J2KImage.cs b/OpenSim/Region/ClientStack/LindenUDP/J2KImage.cs deleted file mode 100644 index e9e2dca..0000000 --- a/OpenSim/Region/ClientStack/LindenUDP/J2KImage.cs +++ /dev/null @@ -1,398 +0,0 @@ -/* - * 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 OpenMetaverse; -using OpenMetaverse.Imaging; -using OpenSim.Framework; -using OpenSim.Region.Framework.Interfaces; -using OpenSim.Services.Interfaces; -using log4net; -using System.Reflection; - -namespace OpenSim.Region.ClientStack.LindenUDP -{ - /// - /// Stores information about a current texture download and a reference to the texture asset - /// - public class J2KImage - { - private const int IMAGE_PACKET_SIZE = 1000; - private const int FIRST_PACKET_SIZE = 600; - - private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); - - public uint LastSequence; - public float Priority; - public uint StartPacket; - public sbyte DiscardLevel; - public UUID TextureID; - public IJ2KDecoder J2KDecoder; - public IAssetService AssetService; - public UUID AgentID; - public IInventoryAccessModule InventoryAccessModule; - public OpenJPEG.J2KLayerInfo[] Layers; - public bool IsDecoded; - public bool HasAsset; - public C5.IPriorityQueueHandle PriorityQueueHandle; - - private uint m_currentPacket; - private bool m_decodeRequested; - private bool m_assetRequested; - private bool m_sentInfo; - private uint m_stopPacket; - private byte[] m_asset; - private LLImageManager m_imageManager; - - public J2KImage(LLImageManager imageManager) - { - m_imageManager = imageManager; - } - - /// - /// Sends packets for this texture to a client until packetsToSend is - /// hit or the transfer completes - /// - /// Reference to the client that the packets are destined for - /// Maximum number of packets to send during this call - /// Number of packets sent during this call - /// True if the transfer completes at the current discard level, otherwise false - public bool SendPackets(LLClientView client, int packetsToSend, out int packetsSent) - { - packetsSent = 0; - - if (m_currentPacket <= m_stopPacket) - { - bool sendMore = true; - - if (!m_sentInfo || (m_currentPacket == 0)) - { - sendMore = !SendFirstPacket(client); - - m_sentInfo = true; - ++m_currentPacket; - ++packetsSent; - } - if (m_currentPacket < 2) - { - m_currentPacket = 2; - } - - while (sendMore && packetsSent < packetsToSend && m_currentPacket <= m_stopPacket) - { - sendMore = SendPacket(client); - ++m_currentPacket; - ++packetsSent; - } - } - - return (m_currentPacket > m_stopPacket); - } - - public void RunUpdate() - { - //This is where we decide what we need to update - //and assign the real discardLevel and packetNumber - //assuming of course that the connected client might be bonkers - - if (!HasAsset) - { - if (!m_assetRequested) - { - m_assetRequested = true; - AssetService.Get(TextureID.ToString(), this, AssetReceived); - } - } - else - { - if (!IsDecoded) - { - //We need to decode the requested image first - if (!m_decodeRequested) - { - //Request decode - m_decodeRequested = true; - // Do we have a jpeg decoder? - if (J2KDecoder != null) - { - if (m_asset == null) - { - J2KDecodedCallback(TextureID, new OpenJPEG.J2KLayerInfo[0]); - } - else - { - // Send it off to the jpeg decoder - J2KDecoder.BeginDecode(TextureID, m_asset, J2KDecodedCallback); - } - - } - else - { - J2KDecodedCallback(TextureID, new OpenJPEG.J2KLayerInfo[0]); - } - } - } - else - { - // Check for missing image asset data - if (m_asset == null) - { - m_log.Warn("[J2KIMAGE]: RunUpdate() called with missing asset data (no missing image texture?). Canceling texture transfer"); - m_currentPacket = m_stopPacket; - return; - } - - if (DiscardLevel >= 0 || m_stopPacket == 0) - { - // This shouldn't happen, but if it does, we really can't proceed - if (Layers == null) - { - m_log.Warn("[J2KIMAGE]: RunUpdate() called with missing Layers. Canceling texture transfer"); - m_currentPacket = m_stopPacket; - return; - } - - int maxDiscardLevel = Math.Max(0, Layers.Length - 1); - - // Treat initial texture downloads with a DiscardLevel of -1 a request for the highest DiscardLevel - if (DiscardLevel < 0 && m_stopPacket == 0) - DiscardLevel = (sbyte)maxDiscardLevel; - - // Clamp at the highest discard level - DiscardLevel = (sbyte)Math.Min(DiscardLevel, maxDiscardLevel); - - //Calculate the m_stopPacket - if (Layers.Length > 0) - { - m_stopPacket = (uint)GetPacketForBytePosition(Layers[(Layers.Length - 1) - DiscardLevel].End); - //I don't know why, but the viewer seems to expect the final packet if the file - //is just one packet bigger. - if (TexturePacketCount() == m_stopPacket + 1) - { - m_stopPacket = TexturePacketCount(); - } - } - else - { - m_stopPacket = TexturePacketCount(); - } - - m_currentPacket = StartPacket; - } - } - } - } - - private bool SendFirstPacket(LLClientView client) - { - if (client == null) - return false; - - if (m_asset == null) - { - m_log.Warn("[J2KIMAGE]: Sending ImageNotInDatabase for texture " + TextureID); - client.SendImageNotFound(TextureID); - return true; - } - else if (m_asset.Length <= FIRST_PACKET_SIZE) - { - // We have less then one packet's worth of data - client.SendImageFirstPart(1, TextureID, (uint)m_asset.Length, m_asset, 2); - m_stopPacket = 0; - return true; - } - else - { - // This is going to be a multi-packet texture download - byte[] firstImageData = new byte[FIRST_PACKET_SIZE]; - - try { Buffer.BlockCopy(m_asset, 0, firstImageData, 0, FIRST_PACKET_SIZE); } - catch (Exception) - { - m_log.ErrorFormat("[J2KIMAGE]: Texture block copy for the first packet failed. textureid={0}, assetlength={1}", TextureID, m_asset.Length); - return true; - } - - client.SendImageFirstPart(TexturePacketCount(), TextureID, (uint)m_asset.Length, firstImageData, (byte)ImageCodec.J2C); - } - return false; - } - - private bool SendPacket(LLClientView client) - { - if (client == null) - return false; - - bool complete = false; - int imagePacketSize = ((int)m_currentPacket == (TexturePacketCount())) ? LastPacketSize() : IMAGE_PACKET_SIZE; - - try - { - if ((CurrentBytePosition() + IMAGE_PACKET_SIZE) > m_asset.Length) - { - imagePacketSize = LastPacketSize(); - complete = true; - if ((CurrentBytePosition() + imagePacketSize) > m_asset.Length) - { - imagePacketSize = m_asset.Length - CurrentBytePosition(); - complete = true; - } - } - - // It's concievable that the client might request packet one - // from a one packet image, which is really packet 0, - // which would leave us with a negative imagePacketSize.. - if (imagePacketSize > 0) - { - byte[] imageData = new byte[imagePacketSize]; - int currentPosition = CurrentBytePosition(); - - try { Buffer.BlockCopy(m_asset, currentPosition, imageData, 0, imagePacketSize); } - catch (Exception e) - { - m_log.ErrorFormat("[J2KIMAGE]: Texture block copy for the first packet failed. textureid={0}, assetlength={1}, currentposition={2}, imagepacketsize={3}, exception={4}", - TextureID, m_asset.Length, currentPosition, imagePacketSize, e.Message); - return false; - } - - //Send the packet - client.SendImageNextPart((ushort)(m_currentPacket - 1), TextureID, imageData); - } - - return !complete; - } - catch (Exception) - { - return false; - } - } - - private ushort TexturePacketCount() - { - if (!IsDecoded) - return 0; - - if (m_asset == null) - return 0; - - if (m_asset.Length <= FIRST_PACKET_SIZE) - return 1; - - return (ushort)(((m_asset.Length - FIRST_PACKET_SIZE + IMAGE_PACKET_SIZE - 1) / IMAGE_PACKET_SIZE) + 1); - } - - private int GetPacketForBytePosition(int bytePosition) - { - return ((bytePosition - FIRST_PACKET_SIZE + IMAGE_PACKET_SIZE - 1) / IMAGE_PACKET_SIZE) + 1; - } - - private int LastPacketSize() - { - if (m_currentPacket == 1) - return m_asset.Length; - int lastsize = (m_asset.Length - FIRST_PACKET_SIZE) % IMAGE_PACKET_SIZE; - //If the last packet size is zero, it's really cImagePacketSize, it sits on the boundary - if (lastsize == 0) - { - lastsize = IMAGE_PACKET_SIZE; - } - return lastsize; - } - - private int CurrentBytePosition() - { - if (m_currentPacket == 0) - return 0; - if (m_currentPacket == 1) - return FIRST_PACKET_SIZE; - - int result = FIRST_PACKET_SIZE + ((int)m_currentPacket - 2) * IMAGE_PACKET_SIZE; - if (result < 0) - { - result = FIRST_PACKET_SIZE; - } - return result; - } - - private void J2KDecodedCallback(UUID AssetId, OpenJPEG.J2KLayerInfo[] layers) - { - Layers = layers; - IsDecoded = true; - RunUpdate(); - } - - private void AssetDataCallback(UUID AssetID, AssetBase asset) - { - HasAsset = true; - - if (asset == null || asset.Data == null) - { - if (m_imageManager.MissingImage != null) - { - m_asset = m_imageManager.MissingImage.Data; - } - else - { - m_asset = null; - IsDecoded = true; - } - } - else - { - m_asset = asset.Data; - } - - RunUpdate(); - } - - private void AssetReceived(string id, Object sender, AssetBase asset) - { - UUID assetID = UUID.Zero; - if (asset != null) - assetID = asset.FullID; - else if ((InventoryAccessModule != null) && (sender != InventoryAccessModule)) - { - // Unfortunately we need this here, there's no other way. - // This is due to the fact that textures opened directly from the agent's inventory - // don't have any distinguishing feature. As such, in order to serve those when the - // foreign user is visiting, we need to try again after the first fail to the local - // asset service. - string assetServerURL = string.Empty; - if (InventoryAccessModule.IsForeignUser(AgentID, out assetServerURL)) - { - m_log.DebugFormat("[J2KIMAGE]: texture {0} not found in local asset storage. Trying user's storage.", id); - AssetService.Get(assetServerURL + "/" + id, InventoryAccessModule, AssetReceived); - return; - } - } - - AssetDataCallback(assetID, asset); - - } - } -} -- cgit v1.1