diff options
Diffstat (limited to '')
-rw-r--r-- | src/OpenSimClient.cs | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/src/OpenSimClient.cs b/src/OpenSimClient.cs index b430c3e..f9349db 100644 --- a/src/OpenSimClient.cs +++ b/src/OpenSimClient.cs | |||
@@ -51,6 +51,7 @@ namespace OpenSim | |||
51 | private Thread ClientThread; | 51 | private Thread ClientThread; |
52 | private EndPoint userEP; | 52 | private EndPoint userEP; |
53 | private BlockingQueue<QueItem> PacketQueue; | 53 | private BlockingQueue<QueItem> PacketQueue; |
54 | private BlockingQueue<TransferRequestPacket> AssetRequests; | ||
54 | private Dictionary<uint, uint> PendingAcks = new Dictionary<uint, uint>(); | 55 | private Dictionary<uint, uint> PendingAcks = new Dictionary<uint, uint>(); |
55 | private Dictionary<uint, Packet> NeedAck = new Dictionary<uint, Packet>(); | 56 | private Dictionary<uint, Packet> NeedAck = new Dictionary<uint, Packet>(); |
56 | private System.Timers.Timer AckTimer; | 57 | private System.Timers.Timer AckTimer; |
@@ -77,6 +78,28 @@ namespace OpenSim | |||
77 | } | 78 | } |
78 | } | 79 | } |
79 | 80 | ||
81 | public void AssetLoader() { | ||
82 | Console.WriteLine("OpenSimClient.cs:AssetLoader() - Starting new thread"); | ||
83 | TransferRequestPacket reqPacket = AssetRequests.Dequeue(); | ||
84 | Console.WriteLine("OpenSimClient.cs:AssetLoader() - Got a request, processing it"); | ||
85 | LLUUID AssetID = new LLUUID(reqPacket.TransferInfo.Params, 0); | ||
86 | WebRequest AssetLoad = WebRequest.Create(OpenSim_Main.cfg.AssetURL + "getasset/" + OpenSim_Main.cfg.AssetSendKey + "/" + AssetID + "/data"); | ||
87 | WebResponse AssetResponse = AssetLoad.GetResponse(); | ||
88 | byte[] idata = new byte[(int)AssetResponse.ContentLength]; | ||
89 | BinaryReader br = new BinaryReader(AssetResponse.GetResponseStream()); | ||
90 | idata = br.ReadBytes((int)AssetResponse.ContentLength); | ||
91 | br.Close(); | ||
92 | AssetResponse.Close(); | ||
93 | |||
94 | TransferInfoPacket Transfer = new TransferInfoPacket(); | ||
95 | Transfer.TransferInfo.ChannelType = 2; | ||
96 | Transfer.TransferInfo.Status = 0; | ||
97 | Transfer.TransferInfo.TargetType = 0; | ||
98 | Transfer.TransferInfo.Params = reqPacket.TransferInfo.Params; | ||
99 | Transfer.TransferInfo.Size = (int)AssetResponse.ContentLength; | ||
100 | Transfer.TransferInfo.TransferID = reqPacket.TransferInfo.TransferID; | ||
101 | } | ||
102 | |||
80 | public void ProcessInPacket(Packet Pack) { | 103 | public void ProcessInPacket(Packet Pack) { |
81 | ack_pack(Pack); | 104 | ack_pack(Pack); |
82 | switch(Pack.Type) { | 105 | switch(Pack.Type) { |
@@ -86,6 +109,14 @@ namespace OpenSim | |||
86 | case PacketType.RegionHandshakeReply: | 109 | case PacketType.RegionHandshakeReply: |
87 | OpenSim_Main.local_world.SendLayerData(this); | 110 | OpenSim_Main.local_world.SendLayerData(this); |
88 | break; | 111 | break; |
112 | case PacketType.TransferRequest: | ||
113 | // We put transfer requests into a big queue and then spawn a thread for each new one | ||
114 | TransferRequestPacket transfer = (TransferRequestPacket)Pack; | ||
115 | AssetRequests.Enqueue(transfer); | ||
116 | Thread AssetLoaderThread = new Thread(new ThreadStart(AssetLoader)); | ||
117 | AssetLoaderThread.IsBackground = true; | ||
118 | AssetLoaderThread.Start(); | ||
119 | break; | ||
89 | } | 120 | } |
90 | } | 121 | } |
91 | 122 | ||
@@ -284,6 +315,7 @@ namespace OpenSim | |||
284 | cirpack = initialcirpack; | 315 | cirpack = initialcirpack; |
285 | userEP = remoteEP; | 316 | userEP = remoteEP; |
286 | PacketQueue = new BlockingQueue<QueItem>(); | 317 | PacketQueue = new BlockingQueue<QueItem>(); |
318 | AssetRequests = new BlockingQueue<TransferRequestPacket>(); | ||
287 | AckTimer = new System.Timers.Timer(500); | 319 | AckTimer = new System.Timers.Timer(500); |
288 | AckTimer.Elapsed += new ElapsedEventHandler(AckTimer_Elapsed); | 320 | AckTimer.Elapsed += new ElapsedEventHandler(AckTimer_Elapsed); |
289 | AckTimer.Start(); | 321 | AckTimer.Start(); |