* Refactors call to OutPacket out of AssetCache and into LLClientView
							parent
							
								
									6753578465
								
							
						
					
					
						commit
						cb29926e3c
					
				|  | @ -0,0 +1,63 @@ | |||
| /* | ||||
|  * Copyright (c) Contributors, http://opensimulator.org/ | ||||
|  * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||||
|  * | ||||
|  * Redistribution and use in source and binary forms, with or without | ||||
|  * modification, are permitted provided that the following conditions are met: | ||||
|  *     * Redistributions of source code must retain the above copyright | ||||
|  *       notice, this list of conditions and the following disclaimer. | ||||
|  *     * Redistributions in binary form must reproduce the above copyright | ||||
|  *       notice, this list of conditions and the following disclaimer in the | ||||
|  *       documentation and/or other materials provided with the distribution. | ||||
|  *     * Neither the name of the OpenSim Project nor the | ||||
|  *       names of its contributors may be used to endorse or promote products | ||||
|  *       derived from this software without specific prior written permission. | ||||
|  * | ||||
|  * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||||
|  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||||
|  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||||
|  * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||||
|  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||||
|  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||||
|  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||||
|  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||||
|  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||||
|  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||
|  */ | ||||
| 
 | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.Text; | ||||
| using libsecondlife; | ||||
| 
 | ||||
| namespace OpenSim.Framework | ||||
| { | ||||
|     /// <summary> | ||||
|     /// This class was created to refactor OutPacket out of AssetCache | ||||
|     /// There is a conflict between  | ||||
|     /// OpenSim.Framework.Communications.Cache.AssetRequest and OpenSim.Framework.AssetRequest | ||||
|     /// and unifying them results in a prebuild chicken and egg problem with OpenSim.Framework requiring  | ||||
|     /// OpenSim.Framework.Communications.Cache while OpenSim.Framework.Communications.Cache  | ||||
|     /// requiring OpenSim.Framework | ||||
|     /// </summary> | ||||
|     public class AssetRequestToClient | ||||
|     { | ||||
|         public LLUUID RequestAssetID; | ||||
|         public AssetBase AssetInf; | ||||
|         public AssetBase ImageInfo; | ||||
|         public LLUUID TransferRequestID; | ||||
|         public long DataPointer = 0; | ||||
|         public int NumPackets = 0; | ||||
|         public int PacketCounter = 0; | ||||
|         public bool IsTextureRequest; | ||||
|         public byte AssetRequestSource = 2; | ||||
|         public byte[] Params = null; | ||||
|         //public bool AssetInCache; | ||||
|         //public int TimeRequested; | ||||
|         public int DiscardLevel = -1; | ||||
| 
 | ||||
|         public AssetRequestToClient() | ||||
|         { | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | @ -612,80 +612,29 @@ namespace OpenSim.Framework.Communications.Cache | |||
|             int num = Math.Min(5, AssetRequests.Count); | ||||
| 
 | ||||
|             AssetRequest req; | ||||
|             AssetRequestToClient req2 = null; | ||||
|             for (int i = 0; i < num; i++) | ||||
|             { | ||||
|                 req = (AssetRequest)AssetRequests[i]; | ||||
|                 //Console.WriteLine("sending asset " + req.RequestAssetID); | ||||
|                 TransferInfoPacket Transfer = new TransferInfoPacket(); | ||||
|                 Transfer.TransferInfo.ChannelType = 2; | ||||
|                 Transfer.TransferInfo.Status = 0; | ||||
|                 Transfer.TransferInfo.TargetType = 0; | ||||
|                 if (req.AssetRequestSource == 2) | ||||
|                 if (req2 == null) | ||||
|                 { | ||||
|                     Transfer.TransferInfo.Params = new byte[20]; | ||||
|                     Array.Copy(req.RequestAssetID.GetBytes(), 0, Transfer.TransferInfo.Params, 0, 16); | ||||
|                     int assType = (int)req.AssetInf.Type; | ||||
|                     Array.Copy(Helpers.IntToBytes(assType), 0, Transfer.TransferInfo.Params, 16, 4); | ||||
|                     req2 = new AssetRequestToClient(); | ||||
|                 } | ||||
|                 else if (req.AssetRequestSource == 3) | ||||
|                 { | ||||
|                     Transfer.TransferInfo.Params = req.Params; | ||||
|                     // Transfer.TransferInfo.Params = new byte[100]; | ||||
|                     //Array.Copy(req.RequestUser.AgentId.GetBytes(), 0, Transfer.TransferInfo.Params, 0, 16); | ||||
|                     //Array.Copy(req.RequestUser.SessionId.GetBytes(), 0, Transfer.TransferInfo.Params, 16, 16); | ||||
|                 } | ||||
|                 Transfer.TransferInfo.Size = (int)req.AssetInf.Data.Length; | ||||
|                 Transfer.TransferInfo.TransferID = req.TransferRequestID; | ||||
|                 Transfer.Header.Zerocoded = true; | ||||
|                 req.RequestUser.OutPacket(Transfer, ThrottleOutPacketType.Asset); | ||||
|                 // Trying to limit memory usage by only creating AssetRequestToClient if needed | ||||
|                 //req2 = new AssetRequestToClient(); | ||||
|                 req2.AssetInf = (AssetBase)req.AssetInf; | ||||
|                 req2.AssetRequestSource = req.AssetRequestSource; | ||||
|                 req2.DataPointer = req.DataPointer; | ||||
|                 req2.DiscardLevel = req.DiscardLevel; | ||||
|                 req2.ImageInfo = (AssetBase)req.ImageInfo; | ||||
|                 req2.IsTextureRequest = req.IsTextureRequest; | ||||
|                 req2.NumPackets = req.NumPackets; | ||||
|                 req2.PacketCounter = req.PacketCounter; | ||||
|                 req2.Params = req.Params; | ||||
|                 req2.RequestAssetID = req.RequestAssetID; | ||||
|                 req2.TransferRequestID = req.TransferRequestID; | ||||
|                 req.RequestUser.SendAsset(req2); | ||||
| 
 | ||||
|                 if (req.NumPackets == 1) | ||||
|                 { | ||||
|                     TransferPacketPacket TransferPacket = new TransferPacketPacket(); | ||||
|                     TransferPacket.TransferData.Packet = 0; | ||||
|                     TransferPacket.TransferData.ChannelType = 2; | ||||
|                     TransferPacket.TransferData.TransferID = req.TransferRequestID; | ||||
|                     TransferPacket.TransferData.Data = req.AssetInf.Data; | ||||
|                     TransferPacket.TransferData.Status = 1; | ||||
|                     TransferPacket.Header.Zerocoded = true; | ||||
|                     req.RequestUser.OutPacket(TransferPacket, ThrottleOutPacketType.Asset); | ||||
|                 } | ||||
|                 else | ||||
|                 { | ||||
|                     int processedLength = 0; | ||||
|                     // libsecondlife hardcodes 1500 as the maximum data chunk size | ||||
|                     int maxChunkSize = 1250; | ||||
|                     int packetNumber = 0; | ||||
| 
 | ||||
|                     while (processedLength < req.AssetInf.Data.Length) | ||||
|                     { | ||||
|                         TransferPacketPacket TransferPacket = new TransferPacketPacket(); | ||||
|                         TransferPacket.TransferData.Packet = packetNumber; | ||||
|                         TransferPacket.TransferData.ChannelType = 2; | ||||
|                         TransferPacket.TransferData.TransferID = req.TransferRequestID; | ||||
| 
 | ||||
|                         int chunkSize = Math.Min(req.AssetInf.Data.Length - processedLength, maxChunkSize); | ||||
|                         byte[] chunk = new byte[chunkSize]; | ||||
|                         Array.Copy(req.AssetInf.Data, processedLength, chunk, 0, chunk.Length); | ||||
| 
 | ||||
|                         TransferPacket.TransferData.Data = chunk; | ||||
| 
 | ||||
|                         // 0 indicates more packets to come, 1 indicates last packet | ||||
|                         if (req.AssetInf.Data.Length - processedLength > maxChunkSize) | ||||
|                         { | ||||
|                             TransferPacket.TransferData.Status = 0; | ||||
|                         } | ||||
|                         else | ||||
|                         { | ||||
|                             TransferPacket.TransferData.Status = 1; | ||||
|                         } | ||||
|                         TransferPacket.Header.Zerocoded = true; | ||||
|                         req.RequestUser.OutPacket(TransferPacket, ThrottleOutPacketType.Asset); | ||||
| 
 | ||||
|                         processedLength += chunkSize; | ||||
|                         packetNumber++; | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
| 
 | ||||
|             //remove requests that have been completed | ||||
|  |  | |||
|  | @ -1011,6 +1011,8 @@ namespace OpenSim.Framework | |||
| 
 | ||||
|         void SendLandStatReply(uint reportType, uint requestFlags, uint resultCount, LandStatReportItem[] lsrpia); | ||||
| 
 | ||||
|         void SendAsset(AssetRequestToClient req); | ||||
| 
 | ||||
|         byte[] GetThrottlesPacked(float multiplier); | ||||
| 
 | ||||
| 
 | ||||
|  |  | |||
|  | @ -6242,6 +6242,82 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
|             OutPacket(lsrp, ThrottleOutPacketType.Task); | ||||
|         } | ||||
| 
 | ||||
|         public void SendAsset(AssetRequestToClient req) | ||||
|         { | ||||
|              | ||||
|             //Console.WriteLine("sending asset " + req.RequestAssetID); | ||||
|             TransferInfoPacket Transfer = new TransferInfoPacket(); | ||||
|             Transfer.TransferInfo.ChannelType = 2; | ||||
|             Transfer.TransferInfo.Status = 0; | ||||
|             Transfer.TransferInfo.TargetType = 0; | ||||
|             if (req.AssetRequestSource == 2) | ||||
|             { | ||||
|                 Transfer.TransferInfo.Params = new byte[20]; | ||||
|                 Array.Copy(req.RequestAssetID.GetBytes(), 0, Transfer.TransferInfo.Params, 0, 16); | ||||
|                 int assType = (int)req.AssetInf.Type; | ||||
|                 Array.Copy(Helpers.IntToBytes(assType), 0, Transfer.TransferInfo.Params, 16, 4); | ||||
|             } | ||||
|             else if (req.AssetRequestSource == 3) | ||||
|             { | ||||
|                 Transfer.TransferInfo.Params = req.Params; | ||||
|                 // Transfer.TransferInfo.Params = new byte[100]; | ||||
|                 //Array.Copy(req.RequestUser.AgentId.GetBytes(), 0, Transfer.TransferInfo.Params, 0, 16); | ||||
|                 //Array.Copy(req.RequestUser.SessionId.GetBytes(), 0, Transfer.TransferInfo.Params, 16, 16); | ||||
|             } | ||||
|             Transfer.TransferInfo.Size = (int)req.AssetInf.Data.Length; | ||||
|             Transfer.TransferInfo.TransferID = req.TransferRequestID; | ||||
|             Transfer.Header.Zerocoded = true; | ||||
|             OutPacket(Transfer, ThrottleOutPacketType.Asset); | ||||
| 
 | ||||
|             if (req.NumPackets == 1) | ||||
|             { | ||||
|                 TransferPacketPacket TransferPacket = new TransferPacketPacket(); | ||||
|                 TransferPacket.TransferData.Packet = 0; | ||||
|                 TransferPacket.TransferData.ChannelType = 2; | ||||
|                 TransferPacket.TransferData.TransferID = req.TransferRequestID; | ||||
|                 TransferPacket.TransferData.Data = req.AssetInf.Data; | ||||
|                 TransferPacket.TransferData.Status = 1; | ||||
|                 TransferPacket.Header.Zerocoded = true; | ||||
|                 OutPacket(TransferPacket, ThrottleOutPacketType.Asset); | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 int processedLength = 0; | ||||
|                 // libsecondlife hardcodes 1500 as the maximum data chunk size | ||||
|                 int maxChunkSize = 1250; | ||||
|                 int packetNumber = 0; | ||||
| 
 | ||||
|                 while (processedLength < req.AssetInf.Data.Length) | ||||
|                 { | ||||
|                     TransferPacketPacket TransferPacket = new TransferPacketPacket(); | ||||
|                     TransferPacket.TransferData.Packet = packetNumber; | ||||
|                     TransferPacket.TransferData.ChannelType = 2; | ||||
|                     TransferPacket.TransferData.TransferID = req.TransferRequestID; | ||||
| 
 | ||||
|                     int chunkSize = Math.Min(req.AssetInf.Data.Length - processedLength, maxChunkSize); | ||||
|                     byte[] chunk = new byte[chunkSize]; | ||||
|                     Array.Copy(req.AssetInf.Data, processedLength, chunk, 0, chunk.Length); | ||||
| 
 | ||||
|                     TransferPacket.TransferData.Data = chunk; | ||||
| 
 | ||||
|                     // 0 indicates more packets to come, 1 indicates last packet | ||||
|                     if (req.AssetInf.Data.Length - processedLength > maxChunkSize) | ||||
|                     { | ||||
|                         TransferPacket.TransferData.Status = 0; | ||||
|                     } | ||||
|                     else | ||||
|                     { | ||||
|                         TransferPacket.TransferData.Status = 1; | ||||
|                     } | ||||
|                     TransferPacket.Header.Zerocoded = true; | ||||
|                     OutPacket(TransferPacket, ThrottleOutPacketType.Asset); | ||||
| 
 | ||||
|                     processedLength += chunkSize; | ||||
|                     packetNumber++; | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         public ClientInfo GetClientInfo() | ||||
|         { | ||||
|             //MainLog.Instance.Verbose("CLIENT", "GetClientInfo BGN"); | ||||
|  |  | |||
|  | @ -684,6 +684,10 @@ namespace OpenSim.Region.Environment.Modules.World.NPC | |||
|         { | ||||
|         } | ||||
| 
 | ||||
|         public void SendAsset(AssetRequestToClient req) | ||||
|         { | ||||
|         } | ||||
| 
 | ||||
|         public void SetDebug(int newDebug) | ||||
|         { | ||||
|         } | ||||
|  |  | |||
|  | @ -767,7 +767,10 @@ namespace OpenSim.Region.Examples.SimpleModule | |||
| 
 | ||||
|         public void SendLandStatReply(uint reportType, uint requestFlags, uint resultCount, LandStatReportItem[] lsrpia) | ||||
|         { | ||||
|         } | ||||
| 
 | ||||
|         public void SendAsset(AssetRequestToClient req) | ||||
|         { | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 Teravus Ovares
						Teravus Ovares