From f02ebb6476eeef56f2b790d6b7f472fb84c5fa69 Mon Sep 17 00:00:00 2001 From: MW Date: Wed, 22 Aug 2007 14:47:01 +0000 Subject: [PATCH] Added forgotten file. Made a change to the Scene.EventManager OnRezScript event, it now includes the itemID as a param. This uuid is unique to each instance of a script, so can be used for tracking changes/editing, stopping and deleting a script. --- .../Environment/Scenes/Scene.Inventory.cs | 4 +- .../Region/Environment/Scenes/SceneEvents.cs | 6 +- OpenSim/Region/Environment/XferManagaer.cs | 142 ++++++++++++++++++ 3 files changed, 147 insertions(+), 5 deletions(-) create mode 100644 OpenSim/Region/Environment/XferManagaer.cs diff --git a/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs b/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs index bf7bb7e505..fa1b86532d 100644 --- a/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs +++ b/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs @@ -229,7 +229,7 @@ namespace OpenSim.Region.Environment.Scenes { string script = Util.FieldToString(rezAsset.Data); //Console.WriteLine("rez script "+script); - this.EventManager.TriggerRezScript(localID, script); + this.EventManager.TriggerRezScript(localID, itemID, script); rezzed = true; } else @@ -240,7 +240,7 @@ namespace OpenSim.Region.Environment.Scenes { string script = Util.FieldToString(rezAsset.Data); // Console.WriteLine("rez script " + script); - this.EventManager.TriggerRezScript(localID, script); + this.EventManager.TriggerRezScript(localID, itemID, script); rezzed = true; } } diff --git a/OpenSim/Region/Environment/Scenes/SceneEvents.cs b/OpenSim/Region/Environment/Scenes/SceneEvents.cs index 89aeda6d3f..09a7f21330 100644 --- a/OpenSim/Region/Environment/Scenes/SceneEvents.cs +++ b/OpenSim/Region/Environment/Scenes/SceneEvents.cs @@ -37,7 +37,7 @@ namespace OpenSim.Region.Environment.Scenes public event ObjectGrabDelegate OnObjectGrab; public event OnPermissionErrorDelegate OnPermissionError; - public delegate void NewRezScript(uint localID, string script); + public delegate void NewRezScript(uint localID, LLUUID itemID, string script); public event NewRezScript OnRezScript; @@ -110,11 +110,11 @@ namespace OpenSim.Region.Environment.Scenes OnObjectGrab(localID, offsetPos, remoteClient); } - public void TriggerRezScript(uint localID, string script) + public void TriggerRezScript(uint localID, LLUUID itemID, string script) { if (OnRezScript != null) { - OnRezScript(localID, script); + OnRezScript(localID, itemID, script); } } } diff --git a/OpenSim/Region/Environment/XferManagaer.cs b/OpenSim/Region/Environment/XferManagaer.cs new file mode 100644 index 0000000000..30fbaf0fd6 --- /dev/null +++ b/OpenSim/Region/Environment/XferManagaer.cs @@ -0,0 +1,142 @@ +using System; +using System.Collections.Generic; +using System.Text; + +using libsecondlife; +using OpenSim.Framework.Interfaces; +using OpenSim.Framework.Utilities; + +namespace OpenSim.Region.Environment +{ + public class XferManagaer + { + public Dictionary NewFiles = new Dictionary(); + public Dictionary Transfers = new Dictionary(); + + public XferManagaer() + { + + } + + /// + /// + /// + /// + /// + /// + public void RequestXfer(IClientAPI remoteClient, ulong xferID, string fileName) + { + Console.WriteLine("xfer request for " + fileName); + lock (NewFiles) + { + if (NewFiles.ContainsKey(fileName)) + { + if (!Transfers.ContainsKey(xferID)) + { + byte[] fileData = NewFiles[fileName]; + XferDownLoad transaction = new XferDownLoad(fileName, fileData, xferID, remoteClient); + Transfers.Add(xferID, transaction); + NewFiles.Remove(fileName); + transaction.StartSend(); + } + } + } + } + + public void AckPacket(IClientAPI remoteClient, ulong xferID, uint packet) + { + if (this.Transfers.ContainsKey(xferID)) + { + Transfers[xferID].AckPacket(packet); + } + } + + public void AddNewFile(string fileName, byte[] data) + { + lock (NewFiles) + { + if (NewFiles.ContainsKey(fileName)) + { + NewFiles[fileName] = data; + } + else + { + NewFiles.Add(fileName, data); + } + } + } + + public class XferDownLoad + { + public byte[] Data = new byte[0]; + public string FileName = ""; + public ulong XferID = 0; + public int DataPointer = 0; + public uint Packet = 0; + public IClientAPI Client; + public uint Serial = 1; + private bool complete = false; + + public XferDownLoad(string fileName, byte[] data, ulong xferID, IClientAPI client) + { + FileName = fileName; + Data = data; + XferID = xferID; + Client = client; + } + + public XferDownLoad() + { + + } + + public void StartSend() + { + if (Data.Length < 1000) + { + // for now (testing ) we only support files under 1000 bytes + byte[] transferData = new byte[Data.Length + 4]; + Array.Copy(Helpers.IntToBytes(Data.Length), 0, transferData, 0, 4); + Array.Copy(Data, 0, transferData, 4, Data.Length); + Client.SendXferPacket(XferID, 0 + 0x80000000, transferData); + complete = true; + Console.WriteLine("xfer is under 1000 bytes"); + } + else + { + byte[] transferData = new byte[1000 +4]; + Array.Copy(Helpers.IntToBytes(Data.Length), 0, transferData, 0, 4); + Array.Copy(Data, 0, transferData, 4, 1000); + Client.SendXferPacket(XferID, 0 , transferData); + Packet++; + DataPointer = 1000; + } + } + + public void AckPacket(uint packet) + { + if (!complete) + { + if ((Data.Length - DataPointer) > 1000) + { + byte[] transferData = new byte[1000]; + Array.Copy(Data, DataPointer, transferData, 0, 1000); + Client.SendXferPacket(XferID, Packet, transferData); + Packet++; + DataPointer += 1000; + } + else + { + byte[] transferData = new byte[Data.Length - DataPointer]; + Array.Copy(Data, DataPointer, transferData, 0, Data.Length - DataPointer); + uint endPacket = Packet |= (uint)0x80000000; + Client.SendXferPacket(XferID, endPacket, transferData); + Packet++; + DataPointer += (Data.Length - DataPointer); + complete = true; + } + } + } + } + } +}