From d1457001150d7af6faf2a11e59b895320c6e3e9b Mon Sep 17 00:00:00 2001 From: Teravus Ovares Date: Mon, 10 Nov 2008 23:56:58 +0000 Subject: [PATCH] * Commit allows downloading of the .raw terrain from the estate tools. * Implements the SendInitiateDownload method in IClientAPI * Uses the ITerrainModule Interface to write a terrain file to disk then uses a FileStream to read the binary file from the disk and put it in a byte array. and save to the xFer list. * It then tells the client to download the file and the client initiates an Xfer request. --- OpenSim/Framework/IClientAPI.cs | 6 +++ .../ClientStack/LindenUDP/LLClientView.cs | 38 ++++++++++++++++--- .../Modules/Agent/Xfer/XferModule.cs | 1 + .../World/Estate/EstateManagementModule.cs | 26 +++++++++++++ .../Modules/World/NPC/NPCAvatar.cs | 6 ++- .../Examples/SimpleModule/MyNpcCharacter.cs | 5 +++ 6 files changed, 76 insertions(+), 6 deletions(-) diff --git a/OpenSim/Framework/IClientAPI.cs b/OpenSim/Framework/IClientAPI.cs index 7a3931fb41..2be647f376 100644 --- a/OpenSim/Framework/IClientAPI.cs +++ b/OpenSim/Framework/IClientAPI.cs @@ -340,6 +340,8 @@ namespace OpenSim.Framework public delegate void EstateChangeInfo(IClientAPI client, UUID invoice, UUID senderID, UInt32 param1, UInt32 param2); + public delegate void RequestTerrain(IClientAPI remoteClient, string clientFileName); + public delegate void BakeTerrain(IClientAPI remoteClient); public delegate void EstateRestartSimRequest(IClientAPI remoteClient, int secondsTilReboot); @@ -651,6 +653,8 @@ namespace OpenSim.Framework event ObjectBuy OnObjectBuy; event BuyObjectInventory OnBuyObjectInventory; + event RequestTerrain OnRequestTerrain; + event ObjectIncludeInSearch OnObjectIncludeInSearch; event UUIDNameRequest OnTeleportHomeRequest; @@ -906,6 +910,8 @@ namespace OpenSim.Framework void SendConfirmXfer(ulong xferID, uint PacketID); void SendXferRequest(ulong XferID, short AssetType, UUID vFileID, byte FilePath, byte[] FileName); + void SendInitiateDownload(string simFileName, string clientFileName); + /// /// Send the first part of a texture. For sufficiently small textures, this may be the only packet. /// diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs index 188ce4b52d..a835e43eac 100644 --- a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs +++ b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs @@ -205,6 +205,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP private ParcelAbandonRequest handlerParcelAbandonRequest; private ParcelGodForceOwner handlerParcelGodForceOwner; private ParcelReclaim handlerParcelReclaim; + private RequestTerrain handlerRequestTerrain; private ParcelReturnObjectsRequest handlerParcelReturnObjectsRequest; private RegionInfoRequest handlerRegionInfoRequest; //OnRegionInfoRequest; private EstateCovenantRequest handlerEstateCovenantRequest; //OnEstateCovenantRequest; @@ -895,6 +896,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP public event XferReceive OnXferReceive; public event RequestXfer OnRequestXfer; public event ConfirmXfer OnConfirmXfer; + public event RequestTerrain OnRequestTerrain; public event RezScript OnRezScript; public event UpdateTaskInventory OnUpdateTaskInventory; public event MoveTaskInventory OnMoveTaskItem; @@ -2527,7 +2529,14 @@ namespace OpenSim.Region.ClientStack.LindenUDP newPack.Header.Zerocoded = true; OutPacket(newPack, ThrottleOutPacketType.Asset); } - + public void SendInitiateDownload(string simFileName, string clientFileName) + { + InitiateDownloadPacket newPack = new InitiateDownloadPacket(); + newPack.AgentData.AgentID = AgentId; + newPack.FileData.SimFilename = Utils.StringToBytes(simFileName); + newPack.FileData.ViewerFilename = Utils.StringToBytes(clientFileName); + OutPacket(newPack, ThrottleOutPacketType.Asset); + } public void SendImageFirstPart( ushort numParts, UUID ImageUUID, uint ImageSize, byte[] ImageData, byte imageCodec) { @@ -5756,7 +5765,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP case PacketType.EstateOwnerMessage: EstateOwnerMessagePacket messagePacket = (EstateOwnerMessagePacket)Pack; - + switch (Utils.BytesToString(messagePacket.MethodData.Method)) { case "getinfo": @@ -5975,11 +5984,30 @@ namespace OpenSim.Region.ClientStack.LindenUDP case "terrain": if (((Scene)m_scene).ExternalChecks.ExternalChecksCanIssueEstateCommand(AgentId, false)) { - handlerBakeTerrain = OnBakeTerrain; - if (handlerBakeTerrain != null) + if (messagePacket.ParamList.Length > 0) { - handlerBakeTerrain(this); + if (Utils.BytesToString(messagePacket.ParamList[0].Parameter) == "bake") + { + handlerBakeTerrain = OnBakeTerrain; + if (handlerBakeTerrain != null) + { + handlerBakeTerrain(this); + } + } + if (Utils.BytesToString(messagePacket.ParamList[0].Parameter) == "download filename") + { + if (messagePacket.ParamList.Length > 1) + { + handlerRequestTerrain = OnRequestTerrain; + if (handlerRequestTerrain != null) + { + handlerRequestTerrain(this, Utils.BytesToString(messagePacket.ParamList[1].Parameter)); + } + } + } } + + } break; diff --git a/OpenSim/Region/Environment/Modules/Agent/Xfer/XferModule.cs b/OpenSim/Region/Environment/Modules/Agent/Xfer/XferModule.cs index 3c69621ab6..2f9a69103a 100644 --- a/OpenSim/Region/Environment/Modules/Agent/Xfer/XferModule.cs +++ b/OpenSim/Region/Environment/Modules/Agent/Xfer/XferModule.cs @@ -105,6 +105,7 @@ namespace OpenSim.Region.Environment.Modules.Agent.Xfer /// public void RequestXfer(IClientAPI remoteClient, ulong xferID, string fileName) { + lock (NewFiles) { if (NewFiles.ContainsKey(fileName)) diff --git a/OpenSim/Region/Environment/Modules/World/Estate/EstateManagementModule.cs b/OpenSim/Region/Environment/Modules/World/Estate/EstateManagementModule.cs index 041bba5d41..c38d5026ea 100644 --- a/OpenSim/Region/Environment/Modules/World/Estate/EstateManagementModule.cs +++ b/OpenSim/Region/Environment/Modules/World/Estate/EstateManagementModule.cs @@ -421,6 +421,31 @@ namespace OpenSim.Region.Environment.Modules.World.Estate } } + private void handleTerrainRequest(IClientAPI remote_client, string clientFileName) + { + // Save terrain here + OpenSim.Region.Environment.Modules.World.Terrain.ITerrainModule terr = m_scene.RequestModuleInterface(); + + if (terr != null) + { + m_log.Warn("[CLIENT]: Got Request to Send Terrain in region " + m_scene.RegionInfo.RegionName); + if (System.IO.File.Exists(Util.dataDir() + "/terrain.raw")) + { + System.IO.File.Delete(Util.dataDir() + "/terrain.raw"); + } + terr.SaveToFile(Util.dataDir() + "/terrain.raw"); + + System.IO.FileStream input = new System.IO.FileStream(Util.dataDir() + "/terrain.raw", System.IO.FileMode.Open); + byte[] bdata = new byte[input.Length]; + input.Read(bdata, 0, (int)input.Length); + remote_client.SendAlertMessage("Terrain file written, starting download..."); + m_scene.XferManager.AddNewFile("terrain.raw", bdata); + // Tell client about it + m_log.Warn("[CLIENT]: Sending Terrain to " + remote_client.Name); + remote_client.SendInitiateDownload("terrain.raw", clientFileName); + } + } + private void HandleRegionInfoRequest(IClientAPI remote_client) { @@ -767,6 +792,7 @@ namespace OpenSim.Region.Environment.Modules.World.Estate client.OnEstateDebugRegionRequest += handleEstateDebugRegionRequest; client.OnEstateTeleportOneUserHomeRequest += handleEstateTeleportOneUserHomeRequest; client.OnEstateTeleportAllUsersHomeRequest += handleEstateTeleportAllUsersHomeRequest; + client.OnRequestTerrain += handleTerrainRequest; client.OnRegionInfoRequest += HandleRegionInfoRequest; client.OnEstateCovenantRequest += HandleEstateCovenantRequest; diff --git a/OpenSim/Region/Environment/Modules/World/NPC/NPCAvatar.cs b/OpenSim/Region/Environment/Modules/World/NPC/NPCAvatar.cs index cf8ba94f7b..7b077ece39 100644 --- a/OpenSim/Region/Environment/Modules/World/NPC/NPCAvatar.cs +++ b/OpenSim/Region/Environment/Modules/World/NPC/NPCAvatar.cs @@ -268,7 +268,7 @@ namespace OpenSim.Region.Environment.Modules.World.NPC public event ObjectDeselect OnObjectDeselect; public event RegionInfoRequest OnRegionInfoRequest; public event EstateCovenantRequest OnEstateCovenantRequest; - + public event RequestTerrain OnRequestTerrain; public event ObjectDuplicateOnRay OnObjectDuplicateOnRay; public event FriendActionDelegate OnApproveFriendRequest; @@ -698,6 +698,10 @@ namespace OpenSim.Region.Environment.Modules.World.NPC { } + public void SendInitiateDownload(string simFileName, string clientFileName) + { + } + public void SendImageFirstPart(ushort numParts, UUID ImageUUID, uint ImageSize, byte[] ImageData, byte imageCodec) { } diff --git a/OpenSim/Region/Examples/SimpleModule/MyNpcCharacter.cs b/OpenSim/Region/Examples/SimpleModule/MyNpcCharacter.cs index 789d24b3fc..66fb6d8a5f 100644 --- a/OpenSim/Region/Examples/SimpleModule/MyNpcCharacter.cs +++ b/OpenSim/Region/Examples/SimpleModule/MyNpcCharacter.cs @@ -136,6 +136,7 @@ namespace OpenSim.Region.Examples.SimpleModule public event CopyInventoryItem OnCopyInventoryItem; public event MoveInventoryItem OnMoveInventoryItem; public event UDPAssetUploadRequest OnAssetUploadRequest; + public event RequestTerrain OnRequestTerrain; public event XferReceive OnXferReceive; public event RequestXfer OnRequestXfer; public event ConfirmXfer OnConfirmXfer; @@ -615,6 +616,10 @@ namespace OpenSim.Region.Examples.SimpleModule { } + public void SendInitiateDownload(string simFileName, string clientFileName) + { + } + public void SendImageFirstPart(ushort numParts, UUID ImageUUID, uint ImageSize, byte[] ImageData, byte imageCodec) { }