aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs159
1 files changed, 141 insertions, 18 deletions
diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs
index 585cdc4..1f522e8 100644
--- a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs
+++ b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs
@@ -325,6 +325,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
325 private readonly byte[] m_channelVersion = Utils.EmptyBytes; 325 private readonly byte[] m_channelVersion = Utils.EmptyBytes;
326 private readonly IGroupsModule m_GroupsModule; 326 private readonly IGroupsModule m_GroupsModule;
327 327
328 private int m_cachedTextureSerial;
328 private PriorityQueue m_entityUpdates; 329 private PriorityQueue m_entityUpdates;
329 private PriorityQueue m_entityProps; 330 private PriorityQueue m_entityProps;
330 private Prioritizer m_prioritizer; 331 private Prioritizer m_prioritizer;
@@ -11742,36 +11743,158 @@ namespace OpenSim.Region.ClientStack.LindenUDP
11742 /// <returns></returns> 11743 /// <returns></returns>
11743 protected bool HandleAgentTextureCached(IClientAPI simclient, Packet packet) 11744 protected bool HandleAgentTextureCached(IClientAPI simclient, Packet packet)
11744 { 11745 {
11746 //m_log.Debug("texture cached: " + packet.ToString());
11745 AgentCachedTexturePacket cachedtex = (AgentCachedTexturePacket)packet; 11747 AgentCachedTexturePacket cachedtex = (AgentCachedTexturePacket)packet;
11748 AgentCachedTextureResponsePacket cachedresp = (AgentCachedTextureResponsePacket)PacketPool.Instance.GetPacket(PacketType.AgentCachedTextureResponse);
11746 11749
11747 if (cachedtex.AgentData.SessionID != SessionId) 11750 if (cachedtex.AgentData.SessionID != SessionId)
11748 return false; 11751 return false;
11749 11752
11750 List<CachedTextureRequestArg> requestArgs = new List<CachedTextureRequestArg>();
11751 11753
11752 for (int i = 0; i < cachedtex.WearableData.Length; i++) 11754 // TODO: don't create new blocks if recycling an old packet
11753 { 11755 cachedresp.AgentData.AgentID = AgentId;
11754 CachedTextureRequestArg arg = new CachedTextureRequestArg(); 11756 cachedresp.AgentData.SessionID = m_sessionId;
11755 arg.BakedTextureIndex = cachedtex.WearableData[i].TextureIndex; 11757 cachedresp.AgentData.SerialNum = m_cachedTextureSerial;
11756 arg.WearableHashID = cachedtex.WearableData[i].ID; 11758 m_cachedTextureSerial++;
11757 11759 cachedresp.WearableData =
11758 requestArgs.Add(arg); 11760 new AgentCachedTextureResponsePacket.WearableDataBlock[cachedtex.WearableData.Length];
11759 } 11761
11762 //IAvatarFactoryModule fac = m_scene.RequestModuleInterface<IAvatarFactoryModule>();
11763 // var item = fac.GetBakedTextureFaces(AgentId);
11764 //WearableCacheItem[] items = fac.GetCachedItems(AgentId);
11765
11766 IAssetService cache = m_scene.AssetService;
11767 IBakedTextureModule bakedTextureModule = m_scene.RequestModuleInterface<IBakedTextureModule>();
11768 //bakedTextureModule = null;
11769 int maxWearablesLoop = cachedtex.WearableData.Length;
11770 if (maxWearablesLoop > AvatarWearable.MAX_WEARABLES)
11771 maxWearablesLoop = AvatarWearable.MAX_WEARABLES;
11772
11773 if (bakedTextureModule != null && cache != null)
11774 {
11775 // We need to make sure the asset stored in the bake is available on this server also by it's assetid before we map it to a Cacheid
11776
11777 WearableCacheItem[] cacheItems = null;
11778 ScenePresence p = m_scene.GetScenePresence(AgentId);
11779 if (p.Appearance != null)
11780 if (p.Appearance.WearableCacheItems == null || p.Appearance.WearableCacheItemsDirty)
11781 {
11782 try
11783 {
11784 cacheItems = bakedTextureModule.Get(AgentId);
11785 p.Appearance.WearableCacheItems = cacheItems;
11786 p.Appearance.WearableCacheItemsDirty = false;
11787 }
11760 11788
11761 try 11789 /*
11762 { 11790 * The following Catch types DO NOT WORK, it jumps to the General Packet Exception Handler if you don't catch Exception!
11763 CachedTextureRequest handlerCachedTextureRequest = OnCachedTextureRequest; 11791 *
11764 if (handlerCachedTextureRequest != null) 11792 catch (System.Net.Sockets.SocketException)
11793 {
11794 cacheItems = null;
11795 }
11796 catch (WebException)
11797 {
11798 cacheItems = null;
11799 }
11800 catch (InvalidOperationException)
11801 {
11802 cacheItems = null;
11803 } */
11804 catch (Exception)
11805 {
11806 cacheItems = null;
11807 }
11808
11809 }
11810 else if (p.Appearance.WearableCacheItems != null)
11811 {
11812 cacheItems = p.Appearance.WearableCacheItems;
11813 }
11814
11815 if (cache != null && cacheItems != null)
11765 { 11816 {
11766 handlerCachedTextureRequest(simclient,cachedtex.AgentData.SerialNum,requestArgs); 11817 foreach (WearableCacheItem item in cacheItems)
11818 {
11819
11820 if (cache.GetCached(item.TextureID.ToString()) == null)
11821 {
11822 item.TextureAsset.Temporary = true;
11823 cache.Store(item.TextureAsset);
11824 }
11825
11826
11827 }
11828 }
11829 if (cacheItems != null)
11830 {
11831
11832 for (int i = 0; i < maxWearablesLoop; i++)
11833 {
11834 WearableCacheItem item =
11835 WearableCacheItem.SearchTextureIndex(cachedtex.WearableData[i].TextureIndex,cacheItems);
11836
11837 cachedresp.WearableData[i] = new AgentCachedTextureResponsePacket.WearableDataBlock();
11838 cachedresp.WearableData[i].TextureIndex= cachedtex.WearableData[i].TextureIndex;
11839 cachedresp.WearableData[i].HostName = new byte[0];
11840 if (item != null && cachedtex.WearableData[i].ID == item.CacheId)
11841 {
11842
11843 cachedresp.WearableData[i].TextureID = item.TextureID;
11844 }
11845 else
11846 {
11847 cachedresp.WearableData[i].TextureID = UUID.Zero;
11848 }
11849 }
11850 }
11851 else
11852 {
11853 for (int i = 0; i < maxWearablesLoop; i++)
11854 {
11855 cachedresp.WearableData[i] = new AgentCachedTextureResponsePacket.WearableDataBlock();
11856 cachedresp.WearableData[i].TextureIndex = cachedtex.WearableData[i].TextureIndex;
11857 cachedresp.WearableData[i].TextureID = UUID.Zero;
11858 //UUID.Parse("8334fb6e-c2f5-46ee-807d-a435f61a8d46");
11859 cachedresp.WearableData[i].HostName = new byte[0];
11860 }
11767 } 11861 }
11768 } 11862 }
11769 catch (Exception e) 11863 else
11770 { 11864 {
11771 m_log.ErrorFormat("[CLIENT VIEW]: AgentTextureCached packet handler threw an exception, {0}", e); 11865 if (cache == null)
11772 return false; 11866 {
11867 for (int i = 0; i < maxWearablesLoop; i++)
11868 {
11869 cachedresp.WearableData[i] = new AgentCachedTextureResponsePacket.WearableDataBlock();
11870 cachedresp.WearableData[i].TextureIndex = cachedtex.WearableData[i].TextureIndex;
11871 cachedresp.WearableData[i].TextureID = UUID.Zero;
11872 //UUID.Parse("8334fb6e-c2f5-46ee-807d-a435f61a8d46");
11873 cachedresp.WearableData[i].HostName = new byte[0];
11874 }
11875 }
11876 else
11877 {
11878 for (int i = 0; i < maxWearablesLoop; i++)
11879 {
11880 cachedresp.WearableData[i] = new AgentCachedTextureResponsePacket.WearableDataBlock();
11881 cachedresp.WearableData[i].TextureIndex = cachedtex.WearableData[i].TextureIndex;
11882
11883
11884
11885 if (cache.GetCached(cachedresp.WearableData[i].TextureID.ToString()) == null)
11886 cachedresp.WearableData[i].TextureID = UUID.Zero;
11887 //UUID.Parse("8334fb6e-c2f5-46ee-807d-a435f61a8d46");
11888 else
11889 cachedresp.WearableData[i].TextureID = UUID.Zero;
11890 // UUID.Parse("8334fb6e-c2f5-46ee-807d-a435f61a8d46");
11891 cachedresp.WearableData[i].HostName = new byte[0];
11892 }
11893 }
11773 } 11894 }
11774 11895 cachedresp.Header.Zerocoded = true;
11896 OutPacket(cachedresp, ThrottleOutPacketType.Task);
11897
11775 return true; 11898 return true;
11776 } 11899 }
11777 11900