/// <summary>
        /// Handle a texture request.  This involves creating a texture sender and placing it on the
        /// previously passed in shared queue.
        /// </summary>
        /// <param name="e"></param>
        public void HandleTextureRequest(TextureRequestArgs e)
        {
            TextureSender.TextureSender textureSender;

            //TODO: should be working out the data size/ number of packets to be sent for each discard level
            if ((e.DiscardLevel >= 0) || (e.Priority != 0))
            {
                lock (m_textureSenders)
                {
                    if (m_textureSenders.TryGetValue(e.RequestedAssetID, out textureSender))
                    {
                        // If we've received new non UUID information for this request and it hasn't dispatched
                        // yet, then update the request accordingly.
                        textureSender.UpdateRequest(e.DiscardLevel, e.PacketNumber);
                    }
                    else
                    {
                        //                        m_log.DebugFormat("[TEXTURE]: Received a request for texture {0}", e.RequestedAssetID);

                        if (!foundTextureLimitStrategy.AllowRequest(e.RequestedAssetID))
                        {
                            //                            m_log.DebugFormat(
                            //                                "[TEXTURE]: Refusing request for {0} from client {1}",
                            //                                e.RequestedAssetID, m_client.AgentId);

                            return;
                        }
                        else if (!missingTextureLimitStrategy.AllowRequest(e.RequestedAssetID))
                        {
                            if (missingTextureLimitStrategy.IsFirstRefusal(e.RequestedAssetID))
                            {
                                if (StatsManager.SimExtraStats != null)
                                    StatsManager.SimExtraStats.AddBlockedMissingTextureRequest();

                                // Commenting out this message for now as it causes too much noise with other
                                // debug messages.
                                //                                m_log.DebugFormat(
                                //                                    "[TEXTURE]: Dropping requests for notified missing texture {0} for client {1} since we have received more than {2} requests",
                                //                                    e.RequestedAssetID, m_client.AgentId, MAX_ALLOWED_TEXTURE_REQUESTS);
                            }

                            return;
                        }

                        m_scene.StatsReporter.AddPendingDownloads(1);

                        TextureSender.TextureSender requestHandler = new TextureSender.TextureSender(m_client, e.DiscardLevel, e.PacketNumber);
                        m_textureSenders.Add(e.RequestedAssetID, requestHandler);

                        m_scene.CommsManager.AssetCache.GetAsset(e.RequestedAssetID, TextureCallback, 
                            AssetRequestInfo.GenericNetRequest());
                    }
                }
            }
            else
            {
                lock (m_textureSenders)
                {
                    if (m_textureSenders.TryGetValue(e.RequestedAssetID, out textureSender))
                    {
                        textureSender.Cancel = true;
                    }
                }
            }
        }
        /// <summary>
        /// Handle a texture request.  This involves creating a texture sender and placing it on the
        /// previously passed in shared queue.
        /// </summary>
        /// <param name="e"></param>
        public void HandleTextureRequest(TextureRequestArgs e)
        {
            TextureSender.TextureSender textureSender;

            //TODO: should be working out the data size/ number of packets to be sent for each discard level
            if ((e.DiscardLevel >= 0) || (e.Priority != 0))
            {
                lock (m_textureSenders)
                {
                    if (m_textureSenders.TryGetValue(e.RequestedAssetID, out textureSender))
                    {
                        // If we've received new non UUID information for this request and it hasn't dispatched
                        // yet, then update the request accordingly.
                        textureSender.UpdateRequest(e.DiscardLevel, e.PacketNumber);
                    }
                    else
                    {
                        //                        m_log.DebugFormat("[TEXTURE]: Received a request for texture {0}", e.RequestedAssetID);

                        if (!foundTextureLimitStrategy.AllowRequest(e.RequestedAssetID))
                        {
                            //                            m_log.DebugFormat(
                            //                                "[TEXTURE]: Refusing request for {0} from client {1}",
                            //                                e.RequestedAssetID, m_client.AgentId);

                            return;
                        }
                        else if (!missingTextureLimitStrategy.AllowRequest(e.RequestedAssetID))
                        {
                            if (missingTextureLimitStrategy.IsFirstRefusal(e.RequestedAssetID))
                            {
                                if (StatsManager.SimExtraStats != null)
                                {
                                    StatsManager.SimExtraStats.AddBlockedMissingTextureRequest();
                                }

                                // Commenting out this message for now as it causes too much noise with other
                                // debug messages.
                                //                                m_log.DebugFormat(
                                //                                    "[TEXTURE]: Dropping requests for notified missing texture {0} for client {1} since we have received more than {2} requests",
                                //                                    e.RequestedAssetID, m_client.AgentId, MAX_ALLOWED_TEXTURE_REQUESTS);
                            }

                            return;
                        }

                        m_scene.StatsReporter.AddPendingDownloads(1);

                        TextureSender.TextureSender requestHandler = new TextureSender.TextureSender(m_client, e.DiscardLevel, e.PacketNumber);
                        m_textureSenders.Add(e.RequestedAssetID, requestHandler);

                        m_scene.AssetService.Get(e.RequestedAssetID.ToString(), this, TextureReceived);
                    }
                }
            }
            else
            {
                lock (m_textureSenders)
                {
                    if (m_textureSenders.TryGetValue(e.RequestedAssetID, out textureSender))
                    {
                        textureSender.Cancel = true;
                    }
                }
            }
        }