/// <summary> /// Requests an image from SecondLife and blocks until it's received. /// </summary> /// <param name="ImageID">The Image's AssetID</param> public byte[] RequestImage(LLUUID ImageID) { byte[] imgData = CachedImage(ImageID); if (imgData != null) { return(imgData); } TransferRequest tr; lock (htDownloadRequests) { if (htDownloadRequests.ContainsKey(ImageID) == false) { tr = new TransferRequest(); tr.Size = int.MaxValue; // Number of bytes expected tr.Received = 0; // Number of bytes received tr.TimeOfLastPacket = Helpers.GetUnixTime(); // last time we recevied a packet for this request htDownloadRequests[ImageID] = tr; Packet packet = ImagePacketHelper.RequestImage(ImageID); slClient.Network.SendPacket(packet); } else { tr = htDownloadRequests[ImageID]; } } // Wait for transfer to complete. while (!tr.Completed.WaitOne(10000, false)) //If it times out, then check, otherwise loop again until WaitOne returns true { slClient.Log("Warning long running texture download: " + ImageID.ToStringHyphenated(), Helpers.LogLevel.Warning); Console.WriteLine("Downloaded : " + tr.Received); if ((Helpers.GetUnixTime() - tr.TimeOfLastPacket) > 10) { tr.Status = false; tr.StatusMsg = "Timeout while downloading image."; slClient.Log(tr.StatusMsg, Helpers.LogLevel.Error); tr.Completed.Set(); } } if (tr.Status == true) { return(tr.AssetData); } else { throw new Exception("RequestImage: " + tr.StatusMsg); } }
/// <summary> /// Requests an image from SecondLife and blocks until it's received. /// </summary> /// <param name="ImageID">The Image's AssetID</param> public byte[] RequestImage(LLUUID ImageID) { byte[] imgData = CachedImage(ImageID); if (imgData != null) { return(imgData); } TransferRequest tr; lock (htDownloadRequests) { if (htDownloadRequests.ContainsKey(ImageID) == false) { tr = new TransferRequest(); tr.Size = int.MaxValue; // Number of bytes expected tr.Received = 0; // Number of bytes received tr.LastPacket = Helpers.GetUnixTime(); // last time we recevied a packet for this request htDownloadRequests[ImageID] = tr; Packet packet = ImagePacketHelper.RequestImage(ImageID); slClient.Network.SendPacket(packet); } else { tr = htDownloadRequests[ImageID]; } } // Wait for transfer to complete. tr.Completed.WaitOne(); if (tr.Status == true) { return(tr.AssetData); } else { throw new Exception("RequestImage: " + tr.StatusMsg); } }