private void HttpRequestTexture(UUID textureID, ImageType imageType, float priority, int discardLevel,
uint packetStart, TextureDownloadCallback callback, bool progress)
{
if (textureID == UUID.Zero || callback == null)
return;
// Do we have this image in the cache?
if (Client.Assets.Cache.HasAsset(textureID))
{
ImageDownload image = new ImageDownload();
image.ID = textureID;
image.AssetData = Client.Assets.Cache.GetCachedAssetBytes(textureID);
image.Size = image.AssetData.Length;
image.Transferred = image.AssetData.Length;
image.ImageType = imageType;
image.AssetType = AssetType.Texture;
image.Success = true;
callback(TextureRequestState.Finished, new AssetTexture(image.ID, image.AssetData));
FireImageProgressEvent(image.ID, image.Transferred, image.Size);
return;
}
CapsBase.DownloadProgressEventHandler progressHandler = null;
if (progress)
{
progressHandler = (HttpWebRequest request, HttpWebResponse response, int bytesReceived, int totalBytesToReceive) =>
{
FireImageProgressEvent(textureID, bytesReceived, totalBytesToReceive);
};
}
Uri url = Client.Network.CurrentSim.Caps.CapabilityURI("GetTexture");
DownloadRequest req = new DownloadRequest(
new Uri(string.Format("{0}/?texture_id={1}", url.ToString(), textureID.ToString())),
Client.Settings.CAPS_TIMEOUT,
"image/x-j2c",
progressHandler,
(HttpWebRequest request, HttpWebResponse response, byte[] responseData, Exception error) =>
{
if (error == null && responseData != null) // success
{
ImageDownload image = new ImageDownload();
image.ID = textureID;
image.AssetData = responseData;
image.Size = image.AssetData.Length;
image.Transferred = image.AssetData.Length;
image.ImageType = imageType;
image.AssetType = AssetType.Texture;
image.Success = true;
callback(TextureRequestState.Finished, new AssetTexture(image.ID, image.AssetData));
FireImageProgressEvent(image.ID, image.Transferred, image.Size);
Client.Assets.Cache.SaveAssetToCache(textureID, responseData);
}
else // download failed
{
Logger.Log(
string.Format("Failed to fetch texture {0} over HTTP, falling back to UDP: {1}",
textureID,
(error == null) ? "" : error.Message
),
Helpers.LogLevel.Warning, Client);
Texture.RequestTexture(textureID, imageType, priority, discardLevel, packetStart, callback, progress);
}
}
);
HttpDownloads.QueueDownlad(req);
}