From 6497ef03cac89f89cf6e5d9ea0910c50a2cb43f4 Mon Sep 17 00:00:00 2001 From: John Hurliman Date: Tue, 16 Sep 2008 00:31:55 +0000 Subject: [PATCH] * Modified ImageDownload to hold ImageType and DiscardLevel * RequestImage() now takes a starting packet number as a parameter * Image download refresh timer calculates which packet to restart the transfer at git-svn-id: http://libopenmetaverse.googlecode.com/svn/trunk@2227 52acb1d6-8a22-11de-b505-999d5b087335 --- OpenMetaverse/AppearanceManager.cs | 2 +- OpenMetaverse/AssetManager.cs | 59 ++++++++++++++----- .../Commands/Inventory/DumpOutfitCommand.cs | 2 +- .../examples/groupmanager/frmGroupInfo.cs | 2 +- 4 files changed, 48 insertions(+), 17 deletions(-) diff --git a/OpenMetaverse/AppearanceManager.cs b/OpenMetaverse/AppearanceManager.cs index 18c53556..aabe7a83 100644 --- a/OpenMetaverse/AppearanceManager.cs +++ b/OpenMetaverse/AppearanceManager.cs @@ -1206,7 +1206,7 @@ namespace OpenMetaverse foreach (UUID image in imgKeys) { // Download all the images we need for baking - Assets.RequestImage(image, ImageType.Normal, 1013000.0f, 0); + Assets.RequestImage(image, ImageType.Normal, 1013000.0f, 0, 0); } } } diff --git a/OpenMetaverse/AssetManager.cs b/OpenMetaverse/AssetManager.cs index d2117b34..cdc0852b 100644 --- a/OpenMetaverse/AssetManager.cs +++ b/OpenMetaverse/AssetManager.cs @@ -313,6 +313,8 @@ namespace OpenMetaverse public bool NotFound; public Simulator Simulator; public SortedList PacketsSeen; + public ImageType ImageType; + public int DiscardLevel; internal int InitialDataSize; internal AutoResetEvent HeaderReceivedEvent = new AutoResetEvent(false); @@ -453,11 +455,30 @@ namespace OpenMetaverse { ImageDownload download = (ImageDownload)transfer; + uint packet = 0; + lock (download.PacketsSeen) + { + if (download.PacketsSeen.Count > 0) + { + // Initially set this to the earliest packet received in the transfer + packet = download.PacketsSeen[0]; + + for (int i = 0; i < download.PacketsSeen.Count; i++) + { + ++packet; + + // If there is a missing packet in the list, break and request the download + // resume here + if (download.PacketsSeen[(ushort)i] != packet) + break; + } + } + } + if (download.TimeSinceLastPacket > 5000) { - // FIXME: This will probably break on baked textures and doesn't preserve the originally requested discardlevel download.TimeSinceLastPacket = 0; - RequestImage(download.ID, ImageType.Normal, 1013010.0f, 0); + RequestImage(download.ID, download.ImageType, 1013010.0f, download.DiscardLevel, packet); } } } @@ -607,7 +628,7 @@ namespace OpenMetaverse /// avatar texture or a normal texture public void RequestImage(UUID imageID, ImageType type) { - RequestImage(imageID, type, 1013000.0f, 0); + RequestImage(imageID, type, 1013000.0f, 0, 0); } /// @@ -618,14 +639,18 @@ namespace OpenMetaverse /// avatar texture or a normal texture /// Priority level of the download. Default is /// 1,013,000.0f - /// Number of quality layers to discard - /// Sending a priority of 0, and a discardlevel of -1 aborts + /// Number of quality layers to discard. + /// This controls the end marker of the data sent + /// Packet number to start the download at. + /// This controls the start marker of the data sent + /// Sending a priority of 0 and a discardlevel of -1 aborts /// download - public void RequestImage(UUID imageID, ImageType type, float priority, int discardLevel) + 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) { @@ -665,9 +690,10 @@ namespace OpenMetaverse { // New download ImageDownload transfer = new ImageDownload(); - //transfer.AssetType = AssetType.Texture // Handled in ImageDataHandler. transfer.ID = imageID; transfer.Simulator = currentSim; + transfer.ImageType = type; + transfer.DiscardLevel = discardLevel; // Add this transfer to the dictionary lock (Transfers) Transfers[transfer.ID] = transfer; @@ -694,7 +720,7 @@ namespace OpenMetaverse 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].Packet = packetNum; request.RequestImage[0].Image = imageID; request.RequestImage[0].Type = (byte)type; @@ -747,6 +773,8 @@ namespace OpenMetaverse //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; // Add this transfer to the dictionary lock (Transfers) Transfers[transfer.ID] = transfer; @@ -1388,13 +1416,16 @@ namespace OpenMetaverse // The header is downloaded, we can insert this data in to the proper position // Only insert if we haven't seen this packet before - if (!transfer.PacketsSeen.ContainsKey(image.ImageID.Packet)) + lock (transfer.PacketsSeen) { - transfer.PacketsSeen[image.ImageID.Packet] = image.ImageID.Packet; - Array.Copy(image.ImageData.Data, 0, transfer.AssetData, - transfer.InitialDataSize + (1000 * (image.ImageID.Packet - 1)), - image.ImageData.Data.Length); - transfer.Transferred += image.ImageData.Data.Length; + if (!transfer.PacketsSeen.ContainsKey(image.ImageID.Packet)) + { + transfer.PacketsSeen[image.ImageID.Packet] = image.ImageID.Packet; + Array.Copy(image.ImageData.Data, 0, transfer.AssetData, + transfer.InitialDataSize + (1000 * (image.ImageID.Packet - 1)), + image.ImageData.Data.Length); + transfer.Transferred += image.ImageData.Data.Length; + } } //Client.DebugLog("Received " + image.ImageData.Data.Length + "/" + transfer.Transferred + diff --git a/Programs/examples/TestClient/Commands/Inventory/DumpOutfitCommand.cs b/Programs/examples/TestClient/Commands/Inventory/DumpOutfitCommand.cs index 7d7ae2ae..bcd0ce23 100644 --- a/Programs/examples/TestClient/Commands/Inventory/DumpOutfitCommand.cs +++ b/Programs/examples/TestClient/Commands/Inventory/DumpOutfitCommand.cs @@ -71,7 +71,7 @@ namespace OpenMetaverse.TestClient } OutfitAssets.Add(face.TextureID); - Client.Assets.RequestImage(face.TextureID, type, 100000.0f, 0); + Client.Assets.RequestImage(face.TextureID, type, 100000.0f, 0, 0); output.Append(((AppearanceManager.TextureIndex)j).ToString()); output.Append(" "); diff --git a/Programs/examples/groupmanager/frmGroupInfo.cs b/Programs/examples/groupmanager/frmGroupInfo.cs index 628b720d..99e09b86 100644 --- a/Programs/examples/groupmanager/frmGroupInfo.cs +++ b/Programs/examples/groupmanager/frmGroupInfo.cs @@ -73,7 +73,7 @@ namespace groupmanager Profile = profile; if (Group.InsigniaID != UUID.Zero) - Client.Assets.RequestImage(Group.InsigniaID, ImageType.Normal, 113000.0f, 0); + Client.Assets.RequestImage(Group.InsigniaID, ImageType.Normal, 113000.0f, 0, 0); if (this.InvokeRequired) this.BeginInvoke(new MethodInvoker(UpdateProfile));