aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Framework/Communications/Cache
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Framework/Communications/Cache')
-rw-r--r--OpenSim/Framework/Communications/Cache/AssetCache.cs85
1 files changed, 17 insertions, 68 deletions
diff --git a/OpenSim/Framework/Communications/Cache/AssetCache.cs b/OpenSim/Framework/Communications/Cache/AssetCache.cs
index a1d9c73..2c51160 100644
--- a/OpenSim/Framework/Communications/Cache/AssetCache.cs
+++ b/OpenSim/Framework/Communications/Cache/AssetCache.cs
@@ -612,80 +612,29 @@ namespace OpenSim.Framework.Communications.Cache
612 int num = Math.Min(5, AssetRequests.Count); 612 int num = Math.Min(5, AssetRequests.Count);
613 613
614 AssetRequest req; 614 AssetRequest req;
615 AssetRequestToClient req2 = null;
615 for (int i = 0; i < num; i++) 616 for (int i = 0; i < num; i++)
616 { 617 {
617 req = (AssetRequest)AssetRequests[i]; 618 req = (AssetRequest)AssetRequests[i];
618 //Console.WriteLine("sending asset " + req.RequestAssetID); 619 if (req2 == null)
619 TransferInfoPacket Transfer = new TransferInfoPacket();
620 Transfer.TransferInfo.ChannelType = 2;
621 Transfer.TransferInfo.Status = 0;
622 Transfer.TransferInfo.TargetType = 0;
623 if (req.AssetRequestSource == 2)
624 { 620 {
625 Transfer.TransferInfo.Params = new byte[20]; 621 req2 = new AssetRequestToClient();
626 Array.Copy(req.RequestAssetID.GetBytes(), 0, Transfer.TransferInfo.Params, 0, 16);
627 int assType = (int)req.AssetInf.Type;
628 Array.Copy(Helpers.IntToBytes(assType), 0, Transfer.TransferInfo.Params, 16, 4);
629 } 622 }
630 else if (req.AssetRequestSource == 3) 623 // Trying to limit memory usage by only creating AssetRequestToClient if needed
631 { 624 //req2 = new AssetRequestToClient();
632 Transfer.TransferInfo.Params = req.Params; 625 req2.AssetInf = (AssetBase)req.AssetInf;
633 // Transfer.TransferInfo.Params = new byte[100]; 626 req2.AssetRequestSource = req.AssetRequestSource;
634 //Array.Copy(req.RequestUser.AgentId.GetBytes(), 0, Transfer.TransferInfo.Params, 0, 16); 627 req2.DataPointer = req.DataPointer;
635 //Array.Copy(req.RequestUser.SessionId.GetBytes(), 0, Transfer.TransferInfo.Params, 16, 16); 628 req2.DiscardLevel = req.DiscardLevel;
636 } 629 req2.ImageInfo = (AssetBase)req.ImageInfo;
637 Transfer.TransferInfo.Size = (int)req.AssetInf.Data.Length; 630 req2.IsTextureRequest = req.IsTextureRequest;
638 Transfer.TransferInfo.TransferID = req.TransferRequestID; 631 req2.NumPackets = req.NumPackets;
639 Transfer.Header.Zerocoded = true; 632 req2.PacketCounter = req.PacketCounter;
640 req.RequestUser.OutPacket(Transfer, ThrottleOutPacketType.Asset); 633 req2.Params = req.Params;
634 req2.RequestAssetID = req.RequestAssetID;
635 req2.TransferRequestID = req.TransferRequestID;
636 req.RequestUser.SendAsset(req2);
641 637
642 if (req.NumPackets == 1)
643 {
644 TransferPacketPacket TransferPacket = new TransferPacketPacket();
645 TransferPacket.TransferData.Packet = 0;
646 TransferPacket.TransferData.ChannelType = 2;
647 TransferPacket.TransferData.TransferID = req.TransferRequestID;
648 TransferPacket.TransferData.Data = req.AssetInf.Data;
649 TransferPacket.TransferData.Status = 1;
650 TransferPacket.Header.Zerocoded = true;
651 req.RequestUser.OutPacket(TransferPacket, ThrottleOutPacketType.Asset);
652 }
653 else
654 {
655 int processedLength = 0;
656 // libsecondlife hardcodes 1500 as the maximum data chunk size
657 int maxChunkSize = 1250;
658 int packetNumber = 0;
659
660 while (processedLength < req.AssetInf.Data.Length)
661 {
662 TransferPacketPacket TransferPacket = new TransferPacketPacket();
663 TransferPacket.TransferData.Packet = packetNumber;
664 TransferPacket.TransferData.ChannelType = 2;
665 TransferPacket.TransferData.TransferID = req.TransferRequestID;
666
667 int chunkSize = Math.Min(req.AssetInf.Data.Length - processedLength, maxChunkSize);
668 byte[] chunk = new byte[chunkSize];
669 Array.Copy(req.AssetInf.Data, processedLength, chunk, 0, chunk.Length);
670
671 TransferPacket.TransferData.Data = chunk;
672
673 // 0 indicates more packets to come, 1 indicates last packet
674 if (req.AssetInf.Data.Length - processedLength > maxChunkSize)
675 {
676 TransferPacket.TransferData.Status = 0;
677 }
678 else
679 {
680 TransferPacket.TransferData.Status = 1;
681 }
682 TransferPacket.Header.Zerocoded = true;
683 req.RequestUser.OutPacket(TransferPacket, ThrottleOutPacketType.Asset);
684
685 processedLength += chunkSize;
686 packetNumber++;
687 }
688 }
689 } 638 }
690 639
691 //remove requests that have been completed 640 //remove requests that have been completed