/// <summary>
        /// Initiate an image download. This is an asynchronous function
        /// </summary>
        /// <param name="imageID">The image to download</param>
        /// <param name="type">Type of the image to download, either a baked
        /// avatar texture or a normal texture</param>
        /// <param name="priority">Priority level of the download. Default is
        /// <code>1,013,000.0f</code></param>
        /// <param name="discardLevel">Number of quality layers to discard</param>
        public void RequestImage(LLUUID imageID, ImageType type, float priority, int discardLevel)
        {
            if (!Transfers.ContainsKey(imageID))
            {
                ImageDownload transfer = new ImageDownload();
                //transfer.AssetType = AssetType.Texture // Handled in ImageDataHandler.
                transfer.ID        = imageID;
                transfer.Simulator = Client.Network.CurrentSim;

                // Add this transfer to the dictionary
                lock (Transfers) Transfers[transfer.ID] = transfer;

                // Build and send the request packet
                RequestImagePacket request = new RequestImagePacket();
                request.AgentData.AgentID                = Client.Self.AgentID;
                request.AgentData.SessionID              = Client.Self.SessionID;
                request.RequestImage                     = new RequestImagePacket.RequestImageBlock[1];
                request.RequestImage[0]                  = new RequestImagePacket.RequestImageBlock();
                request.RequestImage[0].DiscardLevel     = (sbyte)discardLevel;
                request.RequestImage[0].DownloadPriority = priority;
                request.RequestImage[0].Packet           = 0;
                request.RequestImage[0].Image            = imageID;
                request.RequestImage[0].Type             = (byte)type;

                Client.Network.SendPacket(request, transfer.Simulator);
            }
            else
            {
                Client.Log("RequestImage() called for an image we are already downloading, ignoring",
                           Helpers.LogLevel.Info);
            }
        }
Exemple #2
0
        /// <summary>
        /// Sends the actual request packet to the simulator
        /// </summary>
        /// <param name="imageID">The image to download</param>
        /// <param name="type">Type of the image to download, either a baked
        /// avatar texture or a normal texture</param>
        /// <param name="priority">Priority level of the download. Default is
        /// <c>1,013,000.0f</c></param>
        /// <param name="discardLevel">Number of quality layers to discard.
        /// This controls the end marker of the data sent</param>
        /// <param name="packetNum">Packet number to start the download at.
        /// This controls the start marker of the data sent</param>
        /// <remarks>Sending a priority of 0 and a discardlevel of -1 aborts
        /// download</remarks>
        private void RequestImage(UUID imageID, ImageType type, float priority, int discardLevel, uint packetNum)
        {
            // Priority == 0 && DiscardLevel == -1 means cancel the transfer
            if (priority.Equals(0) && discardLevel.Equals(-1))
            {
                AbortTextureRequest(imageID);
            }
            else
            {
                TaskInfo task;
                if (TryGetTransferValue(imageID, out task))
                {
                    if (task.Transfer.Simulator != null)
                    {
                        // Already downloading, just updating the priority
                        float percentComplete = ((float)task.Transfer.Transferred / (float)task.Transfer.Size) * 100f;
                        if (Single.IsNaN(percentComplete))
                        {
                            percentComplete = 0f;
                        }

                        if (percentComplete > 0f)
                        {
                            Logger.DebugLog(String.Format("Updating priority on image transfer {0} to {1}, {2}% complete",
                                                          imageID, task.Transfer.Priority, Math.Round(percentComplete, 2)));
                        }
                    }
                    else
                    {
                        ImageDownload transfer = task.Transfer;
                        transfer.Simulator = _Client.Network.CurrentSim;
                    }

                    // Build and send the request packet
                    RequestImagePacket request = new RequestImagePacket
                    {
                        AgentData =
                        {
                            AgentID   = _Client.Self.AgentID,
                            SessionID = _Client.Self.SessionID
                        },
                        RequestImage = new RequestImagePacket.RequestImageBlock[1]
                    };
                    request.RequestImage[0] = new RequestImagePacket.RequestImageBlock
                    {
                        DiscardLevel     = (sbyte)discardLevel,
                        DownloadPriority = priority,
                        Packet           = packetNum,
                        Image            = imageID,
                        Type             = (byte)type
                    };

                    _Client.Network.SendPacket(request, _Client.Network.CurrentSim);
                }
                else
                {
                    Logger.Log("Received texture download request for a texture that isn't in the download queue: " + imageID, Helpers.LogLevel.Warning);
                }
            }
        }
Exemple #3
0
        public bool GetImage(RequestImagePacket imgPacket)
        {
            RequestImagePacket.RequestImageBlock[] invImgBlocks = new RequestImagePacket.RequestImageBlock[imgPacket.RequestImage.Length];
            for (int i = 0; i < imgPacket.RequestImage.Length; i++)
            {
                invImgBlocks[i] = imgPacket.RequestImage[i];

                lock (textureSenders)
                {
                    if (!textureSenders.ContainsKey(imgPacket.RequestImage[i].Image))
                    {
                        TextureSender sender = new TextureSender(this, proxy, imgPacket.RequestImage[i].DiscardLevel, imgPacket.RequestImage[i].Packet);
                        textureSenders.Add(imgPacket.RequestImage[i].Image, sender);
                        m_RegionAssetService.Get(imgPacket.RequestImage[i].Image.ToString(), sender, TextureReceived);
                        //old: assClient.RequestAsset(imgPacket.RequestImage[i].Image, true);
                        //older: assDownloader.RequestAsset(imgPacket.RequestImage[i].Image, true, AuthToken);
                    }
                    else
                    {
                        TextureSender sender = textureSenders[imgPacket.RequestImage[i].Image];
                        sender.UpdateRequest(imgPacket.RequestImage[i].DiscardLevel, imgPacket.RequestImage[i].Packet);
                    }
                }
                Console.WriteLine("  >> Image is region asset");
            }

            // Don't forward
            return true;
        }
Exemple #4
0
        private void RequestImageHandler(Packet packet, LLAgent agent)
        {
            RequestImagePacket request = (RequestImagePacket)packet;

            for (int i = 0; i < request.RequestImage.Length; i++)
            {
                RequestImagePacket.RequestImageBlock block = request.RequestImage[i];
                EnqueueRequest(agent, block.Image, block.DiscardLevel, block.DownloadPriority, block.Packet, packet.Header.Sequence);
            }
        }
Exemple #5
0
        /// <summary>
        /// Cancel a pending or in process texture request
        /// </summary>
        /// <param name="textureID">The texture assets unique ID</param>
        public void AbortTextureRequest(UUID textureID)
        {
            TaskInfo task;

            if (!TryGetTransferValue(textureID, out task))
            {
                return;
            }

            // this means we've actually got the request assigned to the threadpool
            if (task.State == TextureRequestState.Progress)
            {
                RequestImagePacket request = new RequestImagePacket
                {
                    AgentData =
                    {
                        AgentID   = _Client.Self.AgentID,
                        SessionID = _Client.Self.SessionID
                    },
                    RequestImage = new RequestImagePacket.RequestImageBlock[1]
                };
                request.RequestImage[0] = new RequestImagePacket.RequestImageBlock
                {
                    DiscardLevel     = -1,
                    DownloadPriority = 0,
                    Packet           = 0,
                    Image            = textureID,
                    Type             = (byte)task.Type
                };
                _Client.Network.SendPacket(request);

                foreach (var callback in task.Callbacks)
                {
                    callback(TextureRequestState.Aborted, new AssetTexture(textureID, Utils.EmptyBytes));
                }

                _Client.Assets.FireImageProgressEvent(task.RequestID, task.Transfer.Transferred, task.Transfer.Size);

                task.TokenSource.Cancel();

                RemoveTransfer(textureID);
            }
            else
            {
                RemoveTransfer(textureID);

                foreach (var callback in task.Callbacks)
                {
                    callback(TextureRequestState.Aborted, new AssetTexture(textureID, Utils.EmptyBytes));
                }

                _Client.Assets.FireImageProgressEvent(task.RequestID, task.Transfer.Transferred, task.Transfer.Size);
            }
        }
        /// <summary>
        /// Cancel a pending or in process texture request
        /// </summary>
        /// <param name="textureID">The texture assets unique ID</param>
        public void AbortTextureRequest(UUID textureID)
        {
            TaskInfo task;

            if (TryGetTransferValue(textureID, out task))
            {
                // this means we've actually got the request assigned to the threadpool
                if (task.State == TextureRequestState.Progress)
                {
                    RequestImagePacket request = new RequestImagePacket();
                    request.AgentData.AgentID                = _Client.Self.AgentID;
                    request.AgentData.SessionID              = _Client.Self.SessionID;
                    request.RequestImage                     = new RequestImagePacket.RequestImageBlock[1];
                    request.RequestImage[0]                  = new RequestImagePacket.RequestImageBlock();
                    request.RequestImage[0].DiscardLevel     = -1;
                    request.RequestImage[0].DownloadPriority = 0;
                    request.RequestImage[0].Packet           = 0;
                    request.RequestImage[0].Image            = textureID;
                    request.RequestImage[0].Type             = (byte)task.Type;
                    _Client.Network.SendPacket(request);

                    foreach (TextureDownloadCallback callback in task.Callbacks)
                    {
                        callback(TextureRequestState.Aborted, new AssetTexture(textureID, Utils.EmptyBytes));
                    }

                    _Client.Assets.FireImageProgressEvent(task.RequestID, task.Transfer.Transferred, task.Transfer.Size);

                    resetEvents[task.RequestSlot].Set();

                    RemoveTransfer(textureID);
                }
                else
                {
                    RemoveTransfer(textureID);

                    foreach (TextureDownloadCallback callback in task.Callbacks)
                    {
                        callback(TextureRequestState.Aborted, new AssetTexture(textureID, Utils.EmptyBytes));
                    }

                    _Client.Assets.FireImageProgressEvent(task.RequestID, task.Transfer.Transferred, task.Transfer.Size);
                }
            }
        }
        /// <summary>
        /// Send a packet requesting an image.  This will either fail silently, or result in 
        /// one ImageData packet, along with zero or more ImagePacket packets.
        /// </summary>
        /// <param name="imageID">LLUUID of the AssetID of an image.</param>
        public Packet RequestImage(LLUUID imageID)
		{
            RequestImagePacket p = new RequestImagePacket();
            p.RequestImage    = new RequestImagePacket.RequestImageBlock[1];
            p.RequestImage[0] = new RequestImagePacket.RequestImageBlock();
            p.RequestImage[0].DownloadPriority = (float)1215000.0;
            p.RequestImage[0].DiscardLevel     = (int)0;
            p.RequestImage[0].Packet           = (uint)0;
            p.RequestImage[0].Image            = imageID;

            //FIXME: Find out what the appropriate values are here.
            p.RequestImage[0].Type             = 0;

            p.AgentData.AgentID   = Client.Network.AgentID;
            p.AgentData.SessionID = Client.Network.SessionID;

            return p;
		}
        /// <summary>
        /// Send a packet requesting an image.  This will either fail silently, or result in
        /// one ImageData packet, along with zero or more ImagePacket packets.
        /// </summary>
        /// <param name="imageID">LLUUID of the AssetID of an image.</param>
        public Packet RequestImage(LLUUID imageID)
        {
            RequestImagePacket p = new RequestImagePacket();

            p.RequestImage    = new RequestImagePacket.RequestImageBlock[1];
            p.RequestImage[0] = new RequestImagePacket.RequestImageBlock();
            p.RequestImage[0].DownloadPriority = (float)1215000.0;
            p.RequestImage[0].DiscardLevel     = (int)0;
            p.RequestImage[0].Packet           = (uint)0;
            p.RequestImage[0].Image            = imageID;

            //FIXME: Find out what the appropriate values are here.
            p.RequestImage[0].Type = 0;

            p.AgentData.AgentID   = Client.Network.AgentID;
            p.AgentData.SessionID = Client.Network.SessionID;

            return(p);
        }
        /// <summary>
        /// Requests multiple Images
        /// </summary>
        /// <param name="Images">List of requested images</param>
        public void RequestImages(List <ImageRequest> Images)
        {
            for (int iri = Images.Count; iri > 0; --iri)
            {
                if (Transfers.ContainsKey(Images[iri].ImageID))
                {
                    Images.RemoveAt(iri);
                }
            }

            if (Images.Count > 0)
            {
                // Build and send the request packet
                RequestImagePacket request = new RequestImagePacket();
                request.AgentData.AgentID   = Client.Self.AgentID;
                request.AgentData.SessionID = Client.Self.SessionID;
                request.RequestImage        = new RequestImagePacket.RequestImageBlock[Images.Count];

                for (int iru = 0; iru < Images.Count; ++iru)
                {
                    ImageDownload transfer = new ImageDownload();
                    //transfer.AssetType = AssetType.Texture // Handled in ImageDataHandler.
                    transfer.ID        = Images[iru].ImageID;
                    transfer.Simulator = Client.Network.CurrentSim;

                    // Add this transfer to the dictionary
                    lock (Transfers) Transfers[transfer.ID] = transfer;
                    request.RequestImage[iru] = new RequestImagePacket.RequestImageBlock();
                    request.RequestImage[iru].DiscardLevel     = (sbyte)Images[iru].DiscardLevel;
                    request.RequestImage[iru].DownloadPriority = Images[iru].Priority;
                    request.RequestImage[iru].Packet           = 0;
                    request.RequestImage[iru].Image            = Images[iru].ImageID;
                    request.RequestImage[iru].Type             = (byte)Images[iru].Type;
                }
                Client.Network.SendPacket(request, Client.Network.CurrentSim);
            }
            else
            {
                Client.Log("RequestImages() called for an image(s) we are already downloading or an empty list, ignoring",
                           Helpers.LogLevel.Info);
            }
        }
Exemple #10
0
        /// <summary>
        /// Requests multiple Images
        /// </summary>
        /// <param name="Images">List of requested images</param>
        public void RequestImages(List<ImageRequest> Images)
        {
            for (int iri = 0; iri < Images.Count; iri++)
            {
                if (Transfers.ContainsKey(Images[iri].ImageID))
                    Images.RemoveAt(iri);
            }

            if (Images.Count > 0)
            {
                // Build and send the request packet
                RequestImagePacket request = new RequestImagePacket();
                request.AgentData.AgentID = Client.Self.AgentID;
                request.AgentData.SessionID = Client.Self.SessionID;
                request.RequestImage = new RequestImagePacket.RequestImageBlock[Images.Count];

                for (int iru = 0; iru < Images.Count; ++iru)
                {
                    ImageDownload transfer = new ImageDownload();
                    //transfer.AssetType = AssetType.Texture // Handled in ImageDataHandler.
                    transfer.ID = Images[iru].ImageID;
                    transfer.Simulator = Client.Network.CurrentSim;

                    // Add this transfer to the dictionary
                    lock (Transfers) Transfers[transfer.ID] = transfer;
                    request.RequestImage[iru] = new RequestImagePacket.RequestImageBlock();
                    request.RequestImage[iru].DiscardLevel = (sbyte)Images[iru].DiscardLevel;
                    request.RequestImage[iru].DownloadPriority = Images[iru].Priority;
                    request.RequestImage[iru].Packet = 0;
                    request.RequestImage[iru].Image = Images[iru].ImageID;
                    request.RequestImage[iru].Type = (byte)Images[iru].Type;
                }

                Client.Network.SendPacket(request, Client.Network.CurrentSim);
            }
            else
            {
                Client.Log("RequestImages() called for an image(s) we are already downloading or an empty list, ignoring",
                    Helpers.LogLevel.Info);
            }
        }
Exemple #11
0
        /// <summary>
        /// Initiate an image download. This is an asynchronous function
        /// </summary>
        /// <param name="imageID">The image to download</param>
        /// <param name="type">Type of the image to download, either a baked
        /// avatar texture or a normal texture</param>
        /// <param name="priority">Priority level of the download. Default is
        /// <c>1,013,000.0f</c></param>
        /// <param name="discardLevel">Number of quality layers to discard</param>
        /// <remarks>Sending a priority of 0, and a discardlevel of -1 aborts
        /// download</remarks>
        public void RequestImage(LLUUID imageID, ImageType type, float priority, int discardLevel)
        {
            // allows aborting of download
            if (Transfers.ContainsKey(imageID) && priority.Equals(0) && discardLevel.Equals(-1))
                Transfers.Remove(imageID);

            if (!Transfers.ContainsKey(imageID) && !priority.Equals(0) && !discardLevel.Equals(-1))
            {
                ImageDownload transfer = new ImageDownload();
                //transfer.AssetType = AssetType.Texture // Handled in ImageDataHandler.
                transfer.ID = imageID;
                transfer.Simulator = Client.Network.CurrentSim;

                // Add this transfer to the dictionary
                lock (Transfers) Transfers[transfer.ID] = transfer;

                // Build and send the request packet
                RequestImagePacket request = new RequestImagePacket();
                request.AgentData.AgentID = Client.Self.AgentID;
                request.AgentData.SessionID = Client.Self.SessionID;
                request.RequestImage = new RequestImagePacket.RequestImageBlock[1];
                request.RequestImage[0] = new RequestImagePacket.RequestImageBlock();
                request.RequestImage[0].DiscardLevel = (sbyte)discardLevel;
                request.RequestImage[0].DownloadPriority = priority;
                request.RequestImage[0].Packet = 0;
                request.RequestImage[0].Image = imageID;
                request.RequestImage[0].Type = (byte)type;

                Client.Network.SendPacket(request, transfer.Simulator);
            }
            else
            {
                Client.Log("RequestImage() called for an image we are already downloading, ignoring",
                    Helpers.LogLevel.Info);
            }
        }
Exemple #12
0
        /// <summary>
        /// Cancel a pending or in process texture request
        /// </summary>
        /// <param name="textureID">The texture assets unique ID</param>
        public void AbortTextureRequest(UUID textureID)
        {
            TaskInfo task;
            if (TryGetTransferValue(textureID, out task))
            {
                // this means we've actually got the request assigned to the threadpool
                if (task.State == TextureRequestState.Progress)
                {
                    RequestImagePacket request = new RequestImagePacket();
                    request.AgentData.AgentID = _Client.Self.AgentID;
                    request.AgentData.SessionID = _Client.Self.SessionID;
                    request.RequestImage = new RequestImagePacket.RequestImageBlock[1];
                    request.RequestImage[0] = new RequestImagePacket.RequestImageBlock();
                    request.RequestImage[0].DiscardLevel = -1;
                    request.RequestImage[0].DownloadPriority = 0;
                    request.RequestImage[0].Packet = 0;
                    request.RequestImage[0].Image = textureID;
                    request.RequestImage[0].Type = (byte)task.Type;
                    _Client.Network.SendPacket(request);

                    foreach (TextureDownloadCallback callback in task.Callbacks)
                        callback(TextureRequestState.Aborted, new AssetTexture(textureID, Utils.EmptyBytes));

                    _Client.Assets.FireImageProgressEvent(task.RequestID, task.Transfer.Transferred, task.Transfer.Size);

                    resetEvents[task.RequestSlot].Set();

                    RemoveTransfer(textureID);
                }
                else
                {
                    RemoveTransfer(textureID);

                    foreach (TextureDownloadCallback callback in task.Callbacks)
                        callback(TextureRequestState.Aborted, new AssetTexture(textureID, Utils.EmptyBytes));

                    _Client.Assets.FireImageProgressEvent(task.RequestID, task.Transfer.Transferred, task.Transfer.Size);
                }
            }
        }
Exemple #13
0
        /// <summary>
        /// Sends the actual request packet to the simulator
        /// </summary>
        /// <param name="imageID">The image to download</param>
        /// <param name="type">Type of the image to download, either a baked
        /// avatar texture or a normal texture</param>
        /// <param name="priority">Priority level of the download. Default is
        /// <c>1,013,000.0f</c></param>
        /// <param name="discardLevel">Number of quality layers to discard.
        /// This controls the end marker of the data sent</param>
        /// <param name="packetNum">Packet number to start the download at.
        /// This controls the start marker of the data sent</param>
        /// <remarks>Sending a priority of 0 and a discardlevel of -1 aborts
        /// download</remarks>
        private void RequestImage(UUID imageID, ImageType type, float priority, int discardLevel, uint packetNum)
        {
            // Priority == 0 && DiscardLevel == -1 means cancel the transfer
            if (priority.Equals(0) && discardLevel.Equals(-1))
            {
                AbortTextureRequest(imageID);
            }
            else
            {
                TaskInfo task;
                if (TryGetTransferValue(imageID, out task))
                {
                    if (task.Transfer.Simulator != null)
                    {
                        // Already downloading, just updating the priority
                        float percentComplete = ((float)task.Transfer.Transferred / (float)task.Transfer.Size) * 100f;
                        if (Single.IsNaN(percentComplete))
                            percentComplete = 0f;

                        if (percentComplete > 0f)
                            Logger.DebugLog(String.Format("Updating priority on image transfer {0} to {1}, {2}% complete",
                                                          imageID, task.Transfer.Priority, Math.Round(percentComplete, 2)));
                    }
                    else
                    {
                        ImageDownload transfer = task.Transfer;
                        transfer.Simulator = _Client.Network.CurrentSim;
                    }

                    // Build and send the request packet
                    RequestImagePacket request = new RequestImagePacket();
                    request.AgentData.AgentID = _Client.Self.AgentID;
                    request.AgentData.SessionID = _Client.Self.SessionID;
                    request.RequestImage = new RequestImagePacket.RequestImageBlock[1];
                    request.RequestImage[0] = new RequestImagePacket.RequestImageBlock();
                    request.RequestImage[0].DiscardLevel = (sbyte)discardLevel;
                    request.RequestImage[0].DownloadPriority = priority;
                    request.RequestImage[0].Packet = packetNum;
                    request.RequestImage[0].Image = imageID;
                    request.RequestImage[0].Type = (byte)type;

                    _Client.Network.SendPacket(request, _Client.Network.CurrentSim);
                }
                else
                {
                    Logger.Log("Received texture download request for a texture that isn't in the download queue: " + imageID, Helpers.LogLevel.Warning);
                }
            }
        }
Exemple #14
0
        /// <summary>
        /// Requests multiple Images
        /// </summary>
        /// <param name="Images">List of requested images</param>
        public void RequestImages(List<ImageRequest> Images)
        {
            for (int iri = 0; iri < Images.Count; iri++)
            {
                if (Transfers.ContainsKey(Images[iri].ImageID))
                {
                    Images.RemoveAt(iri);
                }

                if (Cache.HasImage(Images[iri].ImageID))
                {
                    ImageDownload transfer = Cache.GetCachedImage(Images[iri].ImageID);
                    if (null != transfer)
                    {
                        if (null != OnImageReceived)
                        {
                            AssetTexture asset = new AssetTexture(transfer.ID, transfer.AssetData);

                            try { OnImageReceived(transfer, asset); }
                            catch (Exception e) { Logger.Log(e.Message, Helpers.LogLevel.Error, Client, e); }
                        }

                        Images.RemoveAt(iri);
                    }
                }
            }

            if (Images.Count > 0)
            {
                // Build and send the request packet
                RequestImagePacket request = new RequestImagePacket();
                request.AgentData.AgentID = Client.Self.AgentID;
                request.AgentData.SessionID = Client.Self.SessionID;
                request.RequestImage = new RequestImagePacket.RequestImageBlock[Images.Count];

                for (int iru = 0; iru < Images.Count; ++iru)
                {
                    ImageDownload transfer = new ImageDownload();
                    //transfer.AssetType = AssetType.Texture // Handled in ImageDataHandler.
                    transfer.ID = Images[iru].ImageID;
                    transfer.Simulator = Client.Network.CurrentSim;
                    transfer.ImageType = Images[iru].Type;
                    transfer.DiscardLevel = Images[iru].DiscardLevel;
                    transfer.Priority = Images[iru].Priority;

                    // Add this transfer to the dictionary
                    lock (Transfers) Transfers[transfer.ID] = transfer;
                    request.RequestImage[iru] = new RequestImagePacket.RequestImageBlock();
                    request.RequestImage[iru].DiscardLevel = (sbyte)Images[iru].DiscardLevel;
                    request.RequestImage[iru].DownloadPriority = Images[iru].Priority;
                    request.RequestImage[iru].Packet = 0;
                    request.RequestImage[iru].Image = Images[iru].ImageID;
                    request.RequestImage[iru].Type = (byte)Images[iru].Type;
                }

                Client.Network.SendPacket(request, Client.Network.CurrentSim);
            }
            else
            {
                Logger.Log("RequestImages() called for an image(s) we are already downloading or an empty list, ignoring",
                    Helpers.LogLevel.Info, Client);
            }
        }
Exemple #15
0
        /// <summary>
        /// Initiate an image download. This is an asynchronous function
        /// </summary>
        /// <param name="imageID">The image to download</param>
        /// <param name="type">Type of the image to download, either a baked
        /// avatar texture or a normal texture</param>
        /// <param name="priority">Priority level of the download. Default is
        /// <c>1,013,000.0f</c></param>
        /// <param name="discardLevel">Number of quality layers to discard.
        /// This controls the end marker of the data sent</param>
        /// <param name="packetNum">Packet number to start the download at.
        /// This controls the start marker of the data sent</param>
        /// <remarks>Sending a priority of 0 and a discardlevel of -1 aborts
        /// download</remarks>
        public void RequestImage(UUID imageID, ImageType type, float priority, int discardLevel, uint packetNum)
        {
            if (Cache.HasImage(imageID))
            {
                ImageDownload transfer = Cache.GetCachedImage(imageID);
                transfer.ImageType = type;

                if (null != transfer)
                {
                    if (null != OnImageReceived)
                    {
                        AssetTexture asset = new AssetTexture(transfer.ID, transfer.AssetData);

                        try { OnImageReceived(transfer, asset); }
                        catch (Exception e) { Logger.Log(e.Message, Helpers.LogLevel.Error, Client, e); }
                    }
                    return;
                }
            }

            // Priority == 0 && DiscardLevel == -1 means cancel the transfer
            if (priority.Equals(0) && discardLevel.Equals(-1))
            {
                if (Transfers.ContainsKey(imageID))
                    Transfers.Remove(imageID);

                RequestImagePacket cancel = new RequestImagePacket();
                cancel.AgentData.AgentID = Client.Self.AgentID;
                cancel.AgentData.SessionID = Client.Self.SessionID;
                cancel.RequestImage = new RequestImagePacket.RequestImageBlock[1];
                cancel.RequestImage[0] = new RequestImagePacket.RequestImageBlock();
                cancel.RequestImage[0].DiscardLevel = -1;
                cancel.RequestImage[0].DownloadPriority = 0;
                cancel.RequestImage[0].Packet = 0;
                cancel.RequestImage[0].Image = imageID;
                cancel.RequestImage[0].Type = 0;
            }
            else
            {
                Simulator currentSim = Client.Network.CurrentSim;

                if (!Transfers.ContainsKey(imageID))
                {
                    // New download
                    ImageDownload transfer = new ImageDownload();
                    transfer.ID = imageID;
                    transfer.Simulator = currentSim;
                    transfer.ImageType = type;
                    transfer.DiscardLevel = discardLevel;
                    transfer.Priority = priority;

                    // Add this transfer to the dictionary
                    lock (Transfers) Transfers[transfer.ID] = transfer;

                    Logger.DebugLog("Adding image " + imageID.ToString() + " to the download queue");
                }
                else
                {
                    // Already downloading, just updating the priority
                    Transfer transfer = Transfers[imageID];
                    float percentComplete = ((float)transfer.Transferred / (float)transfer.Size) * 100f;
                    if (Single.IsNaN(percentComplete))
                        percentComplete = 0f;

                    Logger.DebugLog(String.Format("Updating priority on image transfer {0}, {1}% complete",
                        imageID, Math.Round(percentComplete, 2)));
                }

                // Build and send the request packet
                RequestImagePacket request = new RequestImagePacket();
                request.AgentData.AgentID = Client.Self.AgentID;
                request.AgentData.SessionID = Client.Self.SessionID;
                request.RequestImage = new RequestImagePacket.RequestImageBlock[1];
                request.RequestImage[0] = new RequestImagePacket.RequestImageBlock();
                request.RequestImage[0].DiscardLevel = (sbyte)discardLevel;
                request.RequestImage[0].DownloadPriority = priority;
                request.RequestImage[0].Packet = packetNum;
                request.RequestImage[0].Image = imageID;
                request.RequestImage[0].Type = (byte)type;

                Client.Network.SendPacket(request, currentSim);
            }
        }
Exemple #16
0
        public bool GetImage(RequestImagePacket imgPacket)
        {
            RequestImagePacket.RequestImageBlock[] invImgBlocks = new RequestImagePacket.RequestImageBlock[imgPacket.RequestImage.Length];
            for (int i = 0; i < imgPacket.RequestImage.Length; i++)
            {
                invImgBlocks[i] = imgPacket.RequestImage[i];

                lock (textureSenders)
                {
                    if (!textureSenders.ContainsKey(imgPacket.RequestImage[i].Image))
                    {
                        lock (textureSenders)
                            textureSenders.Add(imgPacket.RequestImage[i].Image, new TextureSender(proxy, imgPacket.RequestImage[i].DiscardLevel, imgPacket.RequestImage[i].Packet));
                        assClient.RequestAsset(imgPacket.RequestImage[i].Image, true);
                        //assDownloader.RequestAsset(imgPacket.RequestImage[i].Image, true, AuthToken);
                    }
                }
                Console.WriteLine("  >> Image is region asset");
            }

            // Don't forward
            return true;
        }
        void RequestImageHandler(Packet packet, Agent agent)
        {
            RequestImagePacket request = (RequestImagePacket)packet;

            for (int i = 0; i < request.RequestImage.Length; i++)
            {
                RequestImagePacket.RequestImageBlock block = request.RequestImage[i];

                ImageDownload download;
                bool          downloadFound = CurrentDownloads.TryGetValue(block.Image, out download);

                if (downloadFound)
                {
                    lock (download)
                    {
                        if (block.DiscardLevel == -1 && block.DownloadPriority == 0.0f)
                        {
                            Logger.DebugLog(String.Format("Image download {0} is aborting", block.Image));
                        }
                        else
                        {
                            if (block.DiscardLevel < download.DiscardLevel)
                            {
                                Logger.DebugLog(String.Format("Image download {0} is changing from DiscardLevel {1} to {2}",
                                                              block.Image, download.DiscardLevel, block.DiscardLevel));
                            }

                            if (block.DownloadPriority != download.Priority)
                            {
                                Logger.DebugLog(String.Format("Image download {0} is changing from Priority {1} to {2}",
                                                              block.Image, download.Priority, block.DownloadPriority));
                            }

                            if (block.Packet != download.CurrentPacket)
                            {
                                Logger.DebugLog(String.Format("Image download {0} is changing from Packet {1} to {2}",
                                                              block.Image, download.CurrentPacket, block.Packet));
                            }
                        }

                        // Update download
                        download.Update(block.DiscardLevel, block.DownloadPriority, (int)block.Packet);
                    }
                }
                else if (block.DiscardLevel == -1 && block.DownloadPriority == 0.0f)
                {
                    // Aborting a download we are not tracking, ignore
                    Logger.DebugLog(String.Format("Aborting an image download for untracked image " + block.Image.ToString()));
                }
                else
                {
                    bool bake = ((ImageType)block.Type == ImageType.Baked);

                    // New download, check if we have this image
                    Asset asset;
                    if (server.Assets.TryGetAsset(block.Image, out asset) && asset is AssetTexture)
                    {
                        download = new ImageDownload((AssetTexture)asset, block.DiscardLevel, block.DownloadPriority,
                                                     (int)block.Packet);

                        Logger.DebugLog(String.Format(
                                            "Starting new download for {0}, DiscardLevel: {1}, Priority: {2}, Start: {3}, End: {4}, Total: {5}",
                                            block.Image, block.DiscardLevel, block.DownloadPriority, download.CurrentPacket, download.StopPacket,
                                            download.TexturePacketCount()));

                        // Send initial data
                        ImageDataPacket data = new ImageDataPacket();
                        data.ImageID.Codec   = (byte)ImageCodec.J2C;
                        data.ImageID.ID      = download.Texture.AssetID;
                        data.ImageID.Packets = (ushort)download.TexturePacketCount();
                        data.ImageID.Size    = (uint)download.Texture.AssetData.Length;

                        // The first bytes of the image are always sent in the ImageData packet
                        data.ImageData = new ImageDataPacket.ImageDataBlock();
                        int imageDataSize = (download.Texture.AssetData.Length >= ImageDownload.FIRST_IMAGE_PACKET_SIZE) ?
                                            ImageDownload.FIRST_IMAGE_PACKET_SIZE : download.Texture.AssetData.Length;
                        data.ImageData.Data = new byte[imageDataSize];
                        Buffer.BlockCopy(download.Texture.AssetData, 0, data.ImageData.Data, 0, imageDataSize);

                        server.UDP.SendPacket(agent.AgentID, data, PacketCategory.Texture);

                        // Check if ImagePacket packets need to be sent to complete this transfer
                        if (download.CurrentPacket <= download.StopPacket)
                        {
                            // Insert this download into the dictionary
                            lock (CurrentDownloads)
                                CurrentDownloads[block.Image] = download;

                            // Send all of the remaining packets
                            ThreadPool.QueueUserWorkItem(
                                delegate(object obj)
                            {
                                while (download.CurrentPacket <= download.StopPacket)
                                {
                                    if (download.Priority == 0.0f && download.DiscardLevel == -1)
                                    {
                                        break;
                                    }

                                    lock (download)
                                    {
                                        int imagePacketSize = (download.CurrentPacket == download.TexturePacketCount() - 1) ?
                                                              download.LastPacketSize() : ImageDownload.IMAGE_PACKET_SIZE;

                                        ImagePacketPacket transfer = new ImagePacketPacket();
                                        transfer.ImageID.ID        = block.Image;
                                        transfer.ImageID.Packet    = (ushort)download.CurrentPacket;
                                        transfer.ImageData.Data    = new byte[imagePacketSize];
                                        Buffer.BlockCopy(download.Texture.AssetData, download.CurrentBytePosition(),
                                                         transfer.ImageData.Data, 0, imagePacketSize);

                                        server.UDP.SendPacket(agent.AgentID, transfer, PacketCategory.Texture);

                                        ++download.CurrentPacket;
                                    }
                                }

                                Logger.DebugLog("Completed image transfer for " + block.Image.ToString());

                                // Transfer is complete, remove the reference
                                lock (CurrentDownloads)
                                    CurrentDownloads.Remove(block.Image);
                            }
                                );
                        }
                    }
                    else
                    {
                        Logger.Log("Request for a missing texture " + block.Image.ToString(), Helpers.LogLevel.Warning);

                        ImageNotInDatabasePacket notfound = new ImageNotInDatabasePacket();
                        notfound.ImageID.ID = block.Image;
                        server.UDP.SendPacket(agent.AgentID, notfound, PacketCategory.Texture);
                    }
                }
            }
        }
        protected virtual void ProcessInPacket(Packet Pack)
        {
            ack_pack(Pack);
            if (debug)
            {
                if (Pack.Type != PacketType.AgentUpdate)
                {
                    Console.WriteLine(Pack.Type.ToString());
                }
            }

            if (this.ProcessPacketMethod(Pack))
            {
                //there is a handler registered that handled this packet type
                return;
            }
            else
            {
                System.Text.Encoding _enc = System.Text.Encoding.ASCII;

                switch (Pack.Type)
                {
                case PacketType.CompleteAgentMovement:
                    if (this.m_child)
                    {
                        this.UpgradeClient();
                    }
                    ClientAvatar.CompleteMovement(m_world);
                    ClientAvatar.SendInitialPosition();
                    break;

                case PacketType.RegionHandshakeReply:
                    m_world.SendLayerData(this);
                    break;

                case PacketType.AgentWearablesRequest:
                    ClientAvatar.SendInitialAppearance();
                    foreach (SimClient client in m_clientThreads.Values)
                    {
                        if (client.AgentID != this.AgentID)
                        {
                            ObjectUpdatePacket objupdate = client.ClientAvatar.CreateUpdatePacket();
                            this.OutPacket(objupdate);
                            client.ClientAvatar.SendAppearanceToOtherAgent(this);
                        }
                    }
                    m_world.GetInitialPrims(this);
                    break;

                case PacketType.AgentIsNowWearing:
                    AgentIsNowWearingPacket wear = (AgentIsNowWearingPacket)Pack;
                    //Console.WriteLine(Pack.ToString());
                    break;

                case PacketType.AgentSetAppearance:
                    AgentSetAppearancePacket appear = (AgentSetAppearancePacket)Pack;
                    // Console.WriteLine(appear.ToString());
                    this.ClientAvatar.SetAppearance(appear);
                    break;

                case PacketType.ObjectAdd:
                    m_world.AddNewPrim((ObjectAddPacket)Pack, this);
                    break;

                case PacketType.ObjectLink:
                    OpenSim.Framework.Console.MainConsole.Instance.WriteLine(Pack.ToString());
                    ObjectLinkPacket        link         = (ObjectLinkPacket)Pack;
                    uint                    parentprimid = 0;
                    OpenSim.world.Primitive parentprim   = null;
                    if (link.ObjectData.Length > 1)
                    {
                        parentprimid = link.ObjectData[0].ObjectLocalID;
                        foreach (Entity ent in m_world.Entities.Values)
                        {
                            if (ent.localid == parentprimid)
                            {
                                parentprim = (OpenSim.world.Primitive)ent;
                            }
                        }
                        for (int i = 1; i < link.ObjectData.Length; i++)
                        {
                            foreach (Entity ent in m_world.Entities.Values)
                            {
                                if (ent.localid == link.ObjectData[i].ObjectLocalID)
                                {
                                    ((OpenSim.world.Primitive)ent).MakeParent(parentprim);
                                }
                            }
                        }
                    }
                    break;

                case PacketType.ObjectScale:
                    OpenSim.Framework.Console.MainConsole.Instance.WriteLine(Pack.ToString());
                    break;

                case PacketType.ObjectShape:
                    ObjectShapePacket shape = (ObjectShapePacket)Pack;
                    for (int i = 0; i < shape.ObjectData.Length; i++)
                    {
                        foreach (Entity ent in m_world.Entities.Values)
                        {
                            if (ent.localid == shape.ObjectData[i].ObjectLocalID)
                            {
                                ((OpenSim.world.Primitive)ent).UpdateShape(shape.ObjectData[i]);
                            }
                        }
                    }
                    break;

                case PacketType.RequestImage:
                    RequestImagePacket imageRequest = (RequestImagePacket)Pack;
                    for (int i = 0; i < imageRequest.RequestImage.Length; i++)
                    {
                        m_assetCache.AddTextureRequest(this, imageRequest.RequestImage[i].Image);
                    }
                    break;

                case PacketType.TransferRequest:
                    //Console.WriteLine("OpenSimClient.cs:ProcessInPacket() - Got transfer request");
                    TransferRequestPacket transfer = (TransferRequestPacket)Pack;
                    m_assetCache.AddAssetRequest(this, transfer);
                    break;

                case PacketType.AgentUpdate:
                    ClientAvatar.HandleUpdate((AgentUpdatePacket)Pack);
                    break;

                case PacketType.ObjectImage:
                    ObjectImagePacket imagePack = (ObjectImagePacket)Pack;
                    for (int i = 0; i < imagePack.ObjectData.Length; i++)
                    {
                        foreach (Entity ent in m_world.Entities.Values)
                        {
                            if (ent.localid == imagePack.ObjectData[i].ObjectLocalID)
                            {
                                ((OpenSim.world.Primitive)ent).UpdateTexture(imagePack.ObjectData[i].TextureEntry);
                            }
                        }
                    }
                    break;

                case PacketType.ObjectFlagUpdate:
                    ObjectFlagUpdatePacket flags = (ObjectFlagUpdatePacket)Pack;
                    foreach (Entity ent in m_world.Entities.Values)
                    {
                        if (ent.localid == flags.AgentData.ObjectLocalID)
                        {
                            ((OpenSim.world.Primitive)ent).UpdateObjectFlags(flags);
                        }
                    }
                    break;

                case PacketType.AssetUploadRequest:
                    AssetUploadRequestPacket request = (AssetUploadRequestPacket)Pack;
                    this.UploadAssets.HandleUploadPacket(request, request.AssetBlock.TransactionID.Combine(this.SecureSessionID));
                    break;

                case PacketType.RequestXfer:
                    //Console.WriteLine(Pack.ToString());
                    break;

                case PacketType.SendXferPacket:
                    this.UploadAssets.HandleXferPacket((SendXferPacketPacket)Pack);
                    break;

                case PacketType.CreateInventoryFolder:
                    CreateInventoryFolderPacket invFolder = (CreateInventoryFolderPacket)Pack;
                    m_inventoryCache.CreateNewInventoryFolder(this, invFolder.FolderData.FolderID, (ushort)invFolder.FolderData.Type, Util.FieldToString(invFolder.FolderData.Name), invFolder.FolderData.ParentID);
                    //Console.WriteLine(Pack.ToString());
                    break;

                case PacketType.CreateInventoryItem:
                    //Console.WriteLine(Pack.ToString());
                    CreateInventoryItemPacket createItem = (CreateInventoryItemPacket)Pack;
                    if (createItem.InventoryBlock.TransactionID != LLUUID.Zero)
                    {
                        this.UploadAssets.CreateInventoryItem(createItem);
                    }
                    else
                    {
                        // Console.Write(Pack.ToString());
                        this.CreateInventoryItem(createItem);
                    }
                    break;

                case PacketType.FetchInventory:
                    //Console.WriteLine("fetch item packet");
                    FetchInventoryPacket FetchInventory = (FetchInventoryPacket)Pack;
                    m_inventoryCache.FetchInventory(this, FetchInventory);
                    break;

                case PacketType.FetchInventoryDescendents:
                    FetchInventoryDescendentsPacket Fetch = (FetchInventoryDescendentsPacket)Pack;
                    m_inventoryCache.FetchInventoryDescendents(this, Fetch);
                    break;

                case PacketType.UpdateInventoryItem:
                    UpdateInventoryItemPacket update = (UpdateInventoryItemPacket)Pack;
                    //Console.WriteLine(Pack.ToString());
                    for (int i = 0; i < update.InventoryData.Length; i++)
                    {
                        if (update.InventoryData[i].TransactionID != LLUUID.Zero)
                        {
                            AssetBase asset = m_assetCache.GetAsset(update.InventoryData[i].TransactionID.Combine(this.SecureSessionID));
                            if (asset != null)
                            {
                                // Console.WriteLine("updating inventory item, found asset" + asset.FullID.ToStringHyphenated() + " already in cache");
                                m_inventoryCache.UpdateInventoryItemAsset(this, update.InventoryData[i].ItemID, asset);
                            }
                            else
                            {
                                asset = this.UploadAssets.AddUploadToAssetCache(update.InventoryData[i].TransactionID);
                                if (asset != null)
                                {
                                    //Console.WriteLine("updating inventory item, adding asset" + asset.FullID.ToStringHyphenated() + " to cache");
                                    m_inventoryCache.UpdateInventoryItemAsset(this, update.InventoryData[i].ItemID, asset);
                                }
                                else
                                {
                                    //Console.WriteLine("trying to update inventory item, but asset is null");
                                }
                            }
                        }
                        else
                        {
                            m_inventoryCache.UpdateInventoryItemDetails(this, update.InventoryData[i].ItemID, update.InventoryData[i]);;
                        }
                    }
                    break;

                case PacketType.ViewerEffect:
                    ViewerEffectPacket viewer = (ViewerEffectPacket)Pack;
                    foreach (SimClient client in m_clientThreads.Values)
                    {
                        if (client.AgentID != this.AgentID)
                        {
                            viewer.AgentData.AgentID   = client.AgentID;
                            viewer.AgentData.SessionID = client.SessionID;
                            client.OutPacket(viewer);
                        }
                    }
                    break;

                case PacketType.RequestTaskInventory:
                    // Console.WriteLine(Pack.ToString());
                    RequestTaskInventoryPacket requesttask = (RequestTaskInventoryPacket)Pack;
                    ReplyTaskInventoryPacket   replytask   = new ReplyTaskInventoryPacket();
                    bool foundent = false;
                    foreach (Entity ent in m_world.Entities.Values)
                    {
                        if (ent.localid == requesttask.InventoryData.LocalID)
                        {
                            replytask.InventoryData.TaskID   = ent.uuid;
                            replytask.InventoryData.Serial   = 0;
                            replytask.InventoryData.Filename = new byte[0];
                            foundent = true;
                        }
                    }
                    if (foundent)
                    {
                        this.OutPacket(replytask);
                    }
                    break;

                case PacketType.UpdateTaskInventory:
                    // Console.WriteLine(Pack.ToString());
                    UpdateTaskInventoryPacket updatetask  = (UpdateTaskInventoryPacket)Pack;
                    AgentInventory            myinventory = this.m_inventoryCache.GetAgentsInventory(this.AgentID);
                    if (myinventory != null)
                    {
                        if (updatetask.UpdateData.Key == 0)
                        {
                            if (myinventory.InventoryItems[updatetask.InventoryData.ItemID] != null)
                            {
                                if (myinventory.InventoryItems[updatetask.InventoryData.ItemID].Type == 7)
                                {
                                    LLUUID    noteaid = myinventory.InventoryItems[updatetask.InventoryData.ItemID].AssetID;
                                    AssetBase assBase = this.m_assetCache.GetAsset(noteaid);
                                    if (assBase != null)
                                    {
                                        foreach (Entity ent in m_world.Entities.Values)
                                        {
                                            if (ent.localid == updatetask.UpdateData.LocalID)
                                            {
                                                if (ent is OpenSim.world.Primitive)
                                                {
                                                    this.m_world.AddScript(ent, Util.FieldToString(assBase.Data));
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                    break;

                case PacketType.AgentAnimation:
                    if (!m_child)
                    {
                        AgentAnimationPacket AgentAni = (AgentAnimationPacket)Pack;
                        for (int i = 0; i < AgentAni.AnimationList.Length; i++)
                        {
                            if (AgentAni.AnimationList[i].StartAnim)
                            {
                                ClientAvatar.current_anim = AgentAni.AnimationList[i].AnimID;
                                ClientAvatar.anim_seq     = 1;
                                ClientAvatar.SendAnimPack();
                            }
                        }
                    }
                    break;

                case PacketType.ObjectSelect:
                    ObjectSelectPacket incomingselect = (ObjectSelectPacket)Pack;
                    for (int i = 0; i < incomingselect.ObjectData.Length; i++)
                    {
                        foreach (Entity ent in m_world.Entities.Values)
                        {
                            if (ent.localid == incomingselect.ObjectData[i].ObjectLocalID)
                            {
                                ((OpenSim.world.Primitive)ent).GetProperites(this);
                                break;
                            }
                        }
                    }
                    break;
                }
            }
        }
Exemple #19
0
        public bool GetImage(RequestImagePacket imgPacket)
        {
            if (imgPacket.AgentData.AgentID.Equals(libOwner))
                // Tell grid surfer to forward request to region, because the Library is served from there (!)
                return false;

            RequestImagePacket.RequestImageBlock[] invImgBlocks = new RequestImagePacket.RequestImageBlock[imgPacket.RequestImage.Length];
            int count = 0;
            for (int i = 0; i < imgPacket.RequestImage.Length; i++)
            {
                //Console.WriteLine("  >> Requested image " + imgPacket.RequestImage[i].Image);
                if (IsInventoryAsset(imgPacket.RequestImage[i].Image))
                {
                    if (connected)
                    {
                        invImgBlocks[i] = imgPacket.RequestImage[i];
                        InventoryItemBase item = GetInventoryItem(imgPacket.RequestImage[i].Image);

                        if (item != null)
                        {
                            lock (textureSenders)
                            {
                                if (!textureSenders.ContainsKey(imgPacket.RequestImage[i].Image))
                                {
                                    lock (textureSenders)
                                        textureSenders.Add(imgPacket.RequestImage[i].Image, new TextureSender(this, proxy, imgPacket.RequestImage[i].DiscardLevel, imgPacket.RequestImage[i].Packet));
                                    assDownloader.RequestAsset(item, true);
                                }
                            }
                        }
                        count++;
                        Console.WriteLine("  >> Image is inventory item");
                    }
                }
                else
                    invImgBlocks[i] = null;
            }

            if (count == imgPacket.RequestImage.Length)
            {
                // They were all inventory images
                Console.WriteLine("  >> All images were inventory items");
                return true;
            }
            else if (count == 0)
            {
                // None of them were inventory items
                Console.WriteLine("  >> No images were inventory items");
                return false;
            }
            else
            {
                RequestImagePacket.RequestImageBlock[] iblocks = new RequestImagePacket.RequestImageBlock[imgPacket.RequestImage.Length - count];
                int j = 0;
                for (int i = 0; i < invImgBlocks.Length; i++)
                {
                    if (invImgBlocks[i] != null)
                        iblocks[j++] = imgPacket.RequestImage[i];
                }

                imgPacket.RequestImage = iblocks;
                Console.WriteLine("  >> Some images were inventory items " + (imgPacket.RequestImage.Length - count));

                // Forward this altered packet
                return false;
            }
        }