From eeec4c24f8913f3109be90546df30e6cd3df1f36 Mon Sep 17 00:00:00 2001 From: Michael Cortez Date: Fri, 3 Nov 2006 20:42:37 +0000 Subject: [PATCH] + RequestImage now blocks by using signals via ManualResetEvent.WaitOne() + Added ImageManager to SecondLife / is only initialized on first use + Updated async callbacks for ImageRequestAsync to include Status Message + Updated GroupManager to use ImageManager via Client.Images.* git-svn-id: http://libopenmetaverse.googlecode.com/svn/trunk@496 52acb1d6-8a22-11de-b505-999d5b087335 --- libsecondlife-cs/AssetSystem/ImageManager.cs | 31 +++++++++---------- .../AssetSystem/ImagePacketHelpers.cs | 12 +++---- libsecondlife-cs/SecondLife.cs | 25 +++++++++++++++ .../IA_TestAsyncImage/IA_TestAsyncImage.cs | 4 +-- .../examples/groupmanager/frmGroupInfo.cs | 18 ++++++++--- 5 files changed, 61 insertions(+), 29 deletions(-) diff --git a/libsecondlife-cs/AssetSystem/ImageManager.cs b/libsecondlife-cs/AssetSystem/ImageManager.cs index 7534c3a9..8d9d094d 100644 --- a/libsecondlife-cs/AssetSystem/ImageManager.cs +++ b/libsecondlife-cs/AssetSystem/ImageManager.cs @@ -39,7 +39,7 @@ using libsecondlife.InventorySystem; namespace libsecondlife.AssetSystem { - public delegate void ImageRetrievedCallback(LLUUID id, byte[] data, bool cached); //this delegate is called when an image completed. + public delegate void ImageRetrievedCallback(LLUUID id, byte[] data, bool cached, string statusmsg); //this delegate is called when an image completed. /// /// Manages the uploading and downloading of Images from SecondLife @@ -64,8 +64,8 @@ namespace libsecondlife.AssetSystem private class TransferRequest { public ManualResetEvent ReceivedHeaderPacket = new ManualResetEvent(false); + public ManualResetEvent Completed = new ManualResetEvent(false); - public bool Completed; public bool Status; public string StatusMsg; @@ -78,8 +78,6 @@ namespace libsecondlife.AssetSystem public TransferRequest() { - Completed = false; - Status = false; StatusMsg = ""; @@ -151,7 +149,7 @@ namespace libsecondlife.AssetSystem } // Image Packet Helpers - ImagePacketHelper = new ImagePacketHelpers(client.Network.AgentID, client.Network.SessionID); + ImagePacketHelper = new ImagePacketHelpers(client); // Image Callbacks slClient.Network.RegisterCallback(PacketType.ImageData, new PacketCallback(ImageDataCallbackHandler)); @@ -267,7 +265,6 @@ namespace libsecondlife.AssetSystem if (htDownloadRequests.ContainsKey(ImageID) == false) { tr = new TransferRequest(); - tr.Completed = false; 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 @@ -283,10 +280,8 @@ namespace libsecondlife.AssetSystem } } - while( tr.Completed == false ) - { - slClient.Tick(); - } + // Wait for transfer to complete. + tr.Completed.WaitOne(); if( tr.Status == true ) { @@ -320,7 +315,6 @@ namespace libsecondlife.AssetSystem if (htDownloadRequests.ContainsKey(ImageID) == false) { TransferRequest tr = new TransferRequest(); - tr.Completed = false; 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 @@ -382,7 +376,7 @@ namespace libsecondlife.AssetSystem if( tr.Received >= tr.Size ) { tr.Status = true; - tr.Completed = true; + tr.Completed.Set(); // Fire off image downloaded event CacheImage(ImageID, tr.AssetData); @@ -436,7 +430,7 @@ namespace libsecondlife.AssetSystem if( tr.Received >= tr.Size ) { tr.Status = true; - tr.Completed = true; + tr.Completed.Set(); // Fire off image downloaded event CacheImage(ImageID, tr.AssetData); @@ -471,17 +465,22 @@ namespace libsecondlife.AssetSystem tr.Status = false; tr.StatusMsg = "Image not in database"; - tr.Completed = true; + tr.Completed.Set(); // Fire off image downloaded event - FireImageRetrieved(ImageID, null, false); + FireImageRetrieved(ImageID, null, false, tr.StatusMsg); } private void FireImageRetrieved(LLUUID ImageID, byte[] ImageData, bool cached) + { + FireImageRetrieved(ImageID, ImageData, cached, ""); + } + + private void FireImageRetrieved(LLUUID ImageID, byte[] ImageData, bool cached, string status) { if (OnImageRetrieved != null) { - OnImageRetrieved(ImageID, ImageData, cached); + OnImageRetrieved(ImageID, ImageData, cached, status); } } diff --git a/libsecondlife-cs/AssetSystem/ImagePacketHelpers.cs b/libsecondlife-cs/AssetSystem/ImagePacketHelpers.cs index fcb1e798..44bddcad 100644 --- a/libsecondlife-cs/AssetSystem/ImagePacketHelpers.cs +++ b/libsecondlife-cs/AssetSystem/ImagePacketHelpers.cs @@ -37,13 +37,11 @@ namespace libsecondlife.AssetSystem /// public class ImagePacketHelpers { - private LLUUID AgentID; - private LLUUID SessionID; + private SecondLife Client; - public ImagePacketHelpers(LLUUID AgentID, LLUUID SessionID) + public ImagePacketHelpers(SecondLife client) { - this.AgentID = AgentID; - this.SessionID = SessionID; + this.Client = client; } @@ -65,8 +63,8 @@ namespace libsecondlife.AssetSystem //FIXME: Find out what the appropriate values are here. p.RequestImage[0].Type = 0; - p.AgentData.AgentID = AgentID; - p.AgentData.SessionID = SessionID; + p.AgentData.AgentID = Client.Network.AgentID; + p.AgentData.SessionID = Client.Network.SessionID; return p; } diff --git a/libsecondlife-cs/SecondLife.cs b/libsecondlife-cs/SecondLife.cs index a46556ec..53e36ca6 100644 --- a/libsecondlife-cs/SecondLife.cs +++ b/libsecondlife-cs/SecondLife.cs @@ -27,6 +27,7 @@ using System; using System.Collections.Generic; using libsecondlife.Packets; +using libsecondlife.AssetSystem; namespace libsecondlife { @@ -61,6 +62,30 @@ namespace libsecondlife public ObjectManager Objects; /// Group Subsystem public GroupManager Groups; + + /// Image Subsystem + private ImageManager _ImageManager; + public ImageManager Images + { + get + { + if (_ImageManager == null) + { + _ImageManager = new ImageManager(this); + return _ImageManager; + } + else + { + return _ImageManager; + } + } + + set + { + _ImageManager = value; + } + } + /// public event LogCallback OnLogMessage; /// Debug flag diff --git a/libsecondlife-cs/examples/IA_TestAsyncImage/IA_TestAsyncImage.cs b/libsecondlife-cs/examples/IA_TestAsyncImage/IA_TestAsyncImage.cs index 88c45191..993857f7 100644 --- a/libsecondlife-cs/examples/IA_TestAsyncImage/IA_TestAsyncImage.cs +++ b/libsecondlife-cs/examples/IA_TestAsyncImage/IA_TestAsyncImage.cs @@ -128,7 +128,7 @@ namespace IA_TestAsyncImage } } - private void NewImageRetrievedCallBack( LLUUID ImageID, byte[] data, bool wasCached ) + private void NewImageRetrievedCallBack( LLUUID ImageID, byte[] data, bool wasCached, string statusMsg ) { if (wasCached) { @@ -138,7 +138,7 @@ namespace IA_TestAsyncImage { if (data == null) { - Console.WriteLine("Image Data is null: " + ImageID); + Console.WriteLine("Image Data is null (" + statusMsg + "): " + ImageID); } else { diff --git a/libsecondlife-cs/examples/groupmanager/frmGroupInfo.cs b/libsecondlife-cs/examples/groupmanager/frmGroupInfo.cs index ec0228f7..9addf921 100644 --- a/libsecondlife-cs/examples/groupmanager/frmGroupInfo.cs +++ b/libsecondlife-cs/examples/groupmanager/frmGroupInfo.cs @@ -51,15 +51,25 @@ namespace groupmanager Invoke(new MethodInvoker(UpdateProfile)); // Waterdrop: new LLUUID("c77a1c21-e604-7d2c-2c89-5539ce853466") - ImageManager im = new ImageManager(Client); - byte[] j2cdata = im.RequestImage(Group.InsigniaID); - // - //JasperWrapper.jas_init(); + + byte[] j2cdata; + if (Group.InsigniaID != null) + { + j2cdata = Client.Images.RequestImage(Group.InsigniaID); + } + else + { + // TODO: Add somekind of + j2cdata = Client.Images.RequestImage("c77a1c21-e604-7d2c-2c89-5539ce853466"); + } + byte[] imagedata = JasperWrapper.jasper_decode_j2c_to_tiff(j2cdata); + // MemoryStream imageStream = new MemoryStream(imagedata, false); Image image = Image.FromStream(imageStream, false, false); // + picInsignia.Image = image; }