From 3e4b094921dddfe10f6ee5f73eb1b917381c2c30 Mon Sep 17 00:00:00 2001 From: Teravus Ovares Date: Fri, 14 Nov 2008 14:42:00 +0000 Subject: * Implements terrain raw upload. You can now upload your .raw terrain files using the Estate Tools. * Could this be extended in the future to support .oar uploads too? Only time will tell! --- OpenSim/Framework/IClientAPI.cs | 6 + .../Region/ClientStack/LindenUDP/LLClientView.cs | 31 ++++- .../AgentAssetTransactionsManager.cs | 2 + .../AssetTransaction/AssetTransactionModule.cs | 9 +- .../Modules/World/Estate/EstateManagementModule.cs | 115 ++++++++++++++++++ .../World/Estate/EstateTerrainXferHandler.cs | 129 +++++++++++++++++++++ .../Environment/Modules/World/NPC/NPCAvatar.cs | 2 + .../Region/Examples/SimpleModule/MyNpcCharacter.cs | 2 + 8 files changed, 293 insertions(+), 3 deletions(-) create mode 100644 OpenSim/Region/Environment/Modules/World/Estate/EstateTerrainXferHandler.cs (limited to 'OpenSim') diff --git a/OpenSim/Framework/IClientAPI.cs b/OpenSim/Framework/IClientAPI.cs index 240bb6c..ff2ca25 100644 --- a/OpenSim/Framework/IClientAPI.cs +++ b/OpenSim/Framework/IClientAPI.cs @@ -258,6 +258,8 @@ namespace OpenSim.Framework public delegate void RequestAsset(IClientAPI remoteClient, RequestAssetArgs transferRequest); + public delegate void AbortXfer(IClientAPI remoteClient, ulong xferID); + public delegate void RezScript(IClientAPI remoteClient, InventoryItemBase item, UUID transactionID, uint localID); public delegate void UpdateTaskInventory( @@ -344,6 +346,7 @@ namespace OpenSim.Framework public delegate void BakeTerrain(IClientAPI remoteClient); + public delegate void EstateRestartSimRequest(IClientAPI remoteClient, int secondsTilReboot); public delegate void EstateChangeCovenantRequest(IClientAPI remoteClient, UUID newCovenantID); @@ -614,6 +617,7 @@ namespace OpenSim.Framework event XferReceive OnXferReceive; event RequestXfer OnRequestXfer; event ConfirmXfer OnConfirmXfer; + event AbortXfer OnAbortXfer; event RezScript OnRezScript; event UpdateTaskInventory OnUpdateTaskInventory; event MoveTaskInventory OnMoveTaskItem; @@ -655,6 +659,8 @@ namespace OpenSim.Framework event RequestTerrain OnRequestTerrain; + event RequestTerrain OnUploadTerrain; + event ObjectIncludeInSearch OnObjectIncludeInSearch; event UUIDNameRequest OnTeleportHomeRequest; diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs index 09e4160..bb43750 100644 --- a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs +++ b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs @@ -172,6 +172,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP private RequestXfer handlerRequestXfer; //OnRequestXfer; private XferReceive handlerXferReceive; //OnXferReceive; private ConfirmXfer handlerConfirmXfer; //OnConfirmXfer; + private AbortXfer handlerAbortXfer; private CreateInventoryFolder handlerCreateInventoryFolder; //OnCreateNewInventoryFolder; private UpdateInventoryFolder handlerUpdateInventoryFolder; private MoveInventoryFolder handlerMoveInventoryFolder; @@ -206,6 +207,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP private ParcelGodForceOwner handlerParcelGodForceOwner; private ParcelReclaim handlerParcelReclaim; private RequestTerrain handlerRequestTerrain; + private RequestTerrain handlerUploadTerrain; private ParcelReturnObjectsRequest handlerParcelReturnObjectsRequest; private RegionInfoRequest handlerRegionInfoRequest; //OnRegionInfoRequest; private EstateCovenantRequest handlerEstateCovenantRequest; //OnEstateCovenantRequest; @@ -894,6 +896,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP public event XferReceive OnXferReceive; public event RequestXfer OnRequestXfer; public event ConfirmXfer OnConfirmXfer; + public event AbortXfer OnAbortXfer; public event RequestTerrain OnRequestTerrain; public event RezScript OnRezScript; public event UpdateTaskInventory OnUpdateTaskInventory; @@ -941,6 +944,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP public event CommitEstateTerrainTextureRequest OnCommitEstateTerrainTextureRequest; public event SetRegionTerrainSettings OnSetRegionTerrainSettings; public event BakeTerrain OnBakeTerrain; + public event RequestTerrain OnUploadTerrain; public event EstateChangeInfo OnEstateChangeInfo; public event EstateRestartSimRequest OnEstateRestartSimRequest; public event EstateChangeCovenantRequest OnEstateChangeCovenantRequest; @@ -4937,7 +4941,9 @@ namespace OpenSim.Region.ClientStack.LindenUDP break; case PacketType.TransferRequest: //Console.WriteLine("ClientView.ProcessPackets.cs:ProcessInPacket() - Got transfer request"); + TransferRequestPacket transfer = (TransferRequestPacket)Pack; + Console.WriteLine("Transfer Request: " + transfer.ToString()); // Validate inventory transfers // Has to be done here, because AssetCache can't do it // @@ -5032,7 +5038,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP break; case PacketType.AssetUploadRequest: AssetUploadRequestPacket request = (AssetUploadRequestPacket)Pack; - // Console.WriteLine("upload request " + Pack.ToString()); + // Console.WriteLine("upload request " + request.ToString()); // Console.WriteLine("upload request was for assetid: " + request.AssetBlock.TransactionID.Combine(this.SecureSessionId).ToString()); UUID temp = UUID.Combine(request.AssetBlock.TransactionID, SecureSessionId); @@ -5074,6 +5080,15 @@ namespace OpenSim.Region.ClientStack.LindenUDP handlerConfirmXfer(this, confirmXfer.XferID.ID, confirmXfer.XferID.Packet); } break; + case PacketType.AbortXfer: + AbortXferPacket abortXfer = (AbortXferPacket)Pack; + handlerAbortXfer = OnAbortXfer; + if (handlerAbortXfer != null) + { + handlerAbortXfer(this, abortXfer.XferID.ID); + } + + break; case PacketType.CreateInventoryFolder: CreateInventoryFolderPacket invFolder = (CreateInventoryFolderPacket)Pack; @@ -5738,7 +5753,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP case PacketType.EstateOwnerMessage: EstateOwnerMessagePacket messagePacket = (EstateOwnerMessagePacket)Pack; - + //System.Console.WriteLine(messagePacket.ToString()); switch (Utils.BytesToString(messagePacket.MethodData.Method)) { case "getinfo": @@ -5978,6 +5993,18 @@ namespace OpenSim.Region.ClientStack.LindenUDP } } } + if (Utils.BytesToString(messagePacket.ParamList[0].Parameter) == "upload filename") + { + if (messagePacket.ParamList.Length > 1) + { + handlerUploadTerrain = OnUploadTerrain; + if (handlerUploadTerrain != null) + { + handlerUploadTerrain(this, Utils.BytesToString(messagePacket.ParamList[1].Parameter)); + } + } + } + } diff --git a/OpenSim/Region/Environment/Modules/Agent/AssetTransaction/AgentAssetTransactionsManager.cs b/OpenSim/Region/Environment/Modules/Agent/AssetTransaction/AgentAssetTransactionsManager.cs index be8aeea..010fcf7 100644 --- a/OpenSim/Region/Environment/Modules/Agent/AssetTransaction/AgentAssetTransactionsManager.cs +++ b/OpenSim/Region/Environment/Modules/Agent/AssetTransaction/AgentAssetTransactionsManager.cs @@ -180,6 +180,7 @@ namespace OpenSim.Region.Environment.Modules.Agent.AssetTransaction public void HandleUDPUploadRequest(IClientAPI remoteClient, UUID assetID, UUID transaction, sbyte type, byte[] data, bool storeLocal, bool tempFile) { + //System.Console.WriteLine("HandleUDPUploadRequest - assetID: " + assetID.ToString() + " transaction: " + transaction.ToString() + " type: " + type.ToString() + " storelocal: " + storeLocal + " tempFile: " + tempFile); if (((AssetType)type == AssetType.Texture || (AssetType)type == AssetType.Sound || (AssetType)type == AssetType.TextureTGA || @@ -219,6 +220,7 @@ namespace OpenSim.Region.Environment.Modules.Agent.AssetTransaction /// public void HandleXfer(IClientAPI remoteClient, ulong xferID, uint packetID, byte[] data) { + //System.Console.WriteLine("xferID: " + xferID + " packetID: " + packetID + " data!"); AgentAssetTransactions transactions = GetUserTransactions(remoteClient.AgentId); transactions.HandleXfer(xferID, packetID, data); diff --git a/OpenSim/Region/Environment/Modules/Agent/AssetTransaction/AssetTransactionModule.cs b/OpenSim/Region/Environment/Modules/Agent/AssetTransaction/AssetTransactionModule.cs index 09c9aef..19d7066 100644 --- a/OpenSim/Region/Environment/Modules/Agent/AssetTransaction/AssetTransactionModule.cs +++ b/OpenSim/Region/Environment/Modules/Agent/AssetTransaction/AssetTransactionModule.cs @@ -43,6 +43,7 @@ namespace OpenSim.Region.Environment.Modules.Agent.AssetTransaction private Scene m_scene = null; private AgentAssetTransactionsManager m_transactionManager; + public AssetTransactionModule() { @@ -68,7 +69,13 @@ namespace OpenSim.Region.Environment.Modules.Agent.AssetTransaction IClientAPI remoteClient, SceneObjectPart part, UUID transactionID, TaskInventoryItem item) { m_transactionManager.HandleTaskItemUpdateFromTransaction(remoteClient, part, transactionID, item); - } + } + + public void RequestXferFromClient(IClientAPI remoteClient, UUID assetID, UUID transaction, sbyte type, + byte[] data, bool storeLocal, bool tempFile) + { + m_transactionManager.HandleUDPUploadRequest(remoteClient, assetID, transaction, type, data, storeLocal, tempFile); + } public void RemoveAgentAssetTransactions(UUID userID) { diff --git a/OpenSim/Region/Environment/Modules/World/Estate/EstateManagementModule.cs b/OpenSim/Region/Environment/Modules/World/Estate/EstateManagementModule.cs index 52175f4..4aad3b1 100644 --- a/OpenSim/Region/Environment/Modules/World/Estate/EstateManagementModule.cs +++ b/OpenSim/Region/Environment/Modules/World/Estate/EstateManagementModule.cs @@ -45,6 +45,8 @@ namespace OpenSim.Region.Environment.Modules.World.Estate private Scene m_scene; + private EstateTerrainXferHandler TerrainUploader = null; + #region Packet Data Responders private void sendDetailedEstateData(IClientAPI remote_client, UUID invoice) @@ -420,7 +422,119 @@ namespace OpenSim.Region.Environment.Modules.World.Estate } } } + private void AbortTerrainXferHandler(IClientAPI remoteClient, ulong XferID) + { + if (TerrainUploader != null) + { + lock (TerrainUploader) + { + if (XferID == TerrainUploader.XferID) + { + remoteClient.OnXferReceive -= TerrainUploader.XferReceive; + remoteClient.OnAbortXfer -= AbortTerrainXferHandler; + TerrainUploader.TerrainUploadDone -= HandleTerrainApplication; + + TerrainUploader = null; + remoteClient.SendAlertMessage("Terrain Upload aborted by the client"); + } + } + } + + } + private void HandleTerrainApplication(string filename, byte[] terrainData, IClientAPI remoteClient) + { + lock (TerrainUploader) + { + remoteClient.OnXferReceive -= TerrainUploader.XferReceive; + remoteClient.OnAbortXfer -= AbortTerrainXferHandler; + TerrainUploader.TerrainUploadDone -= HandleTerrainApplication; + + TerrainUploader = null; + } + remoteClient.SendAlertMessage("Terrain Upload Complete. Loading...."); + 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"); + } + try + { + System.IO.FileStream input = new System.IO.FileStream(Util.dataDir() + "/terrain.raw", System.IO.FileMode.CreateNew); + input.Write(terrainData, 0, terrainData.Length); + input.Close(); + } + catch (System.IO.IOException e) + { + m_log.ErrorFormat("[TERRAIN]: Error Saving a terrain file uploaded via the estate tools. It gave us the following error: {0}", e.ToString()); + remoteClient.SendAlertMessage("There was an IO Exception loading your terrain. Please check free space"); + + return; + } + catch (System.Security.SecurityException e) + { + m_log.ErrorFormat("[TERRAIN]: Error Saving a terrain file uploaded via the estate tools. It gave us the following error: {0}", e.ToString()); + remoteClient.SendAlertMessage("There was a security Exception loading your terrain. Please check the security on the simulator drive"); + + return; + } + catch (System.UnauthorizedAccessException e) + { + m_log.ErrorFormat("[TERRAIN]: Error Saving a terrain file uploaded via the estate tools. It gave us the following error: {0}", e.ToString()); + remoteClient.SendAlertMessage("There was a security Exception loading your terrain. Please check the security on the simulator drive"); + return; + } + + + + + try + { + terr.LoadFromFile(Util.dataDir() + "/terrain.raw"); + remoteClient.SendAlertMessage("Your terrain was loaded. Give it a minute or two to apply"); + } + catch (Exception e) + { + m_log.ErrorFormat("[TERRAIN]: Error loading a terrain file uploaded via the estate tools. It gave us the following error: {0}", e.ToString()); + remoteClient.SendAlertMessage("There was a general error loading your terrain. Please fix the terrain file and try again"); + } + + } + else + { + remoteClient.SendAlertMessage("Unable to apply terrain. Cannot get an instance of the terrain module"); + } + + + + } + + private void handleUploadTerrain(IClientAPI remote_client, string clientFileName) + { + + if (TerrainUploader == null) + { + + TerrainUploader = new EstateTerrainXferHandler(remote_client, clientFileName); + lock (TerrainUploader) + { + remote_client.OnXferReceive += TerrainUploader.XferReceive; + remote_client.OnAbortXfer += AbortTerrainXferHandler; + TerrainUploader.TerrainUploadDone += HandleTerrainApplication; + } + TerrainUploader.RequestStartXfer(remote_client); + + } + else + { + remote_client.SendAlertMessage("Another Terrain Upload is in progress. Please wait your turn!"); + } + + } private void handleTerrainRequest(IClientAPI remote_client, string clientFileName) { // Save terrain here @@ -793,6 +907,7 @@ namespace OpenSim.Region.Environment.Modules.World.Estate client.OnEstateTeleportOneUserHomeRequest += handleEstateTeleportOneUserHomeRequest; client.OnEstateTeleportAllUsersHomeRequest += handleEstateTeleportAllUsersHomeRequest; client.OnRequestTerrain += handleTerrainRequest; + client.OnUploadTerrain += handleUploadTerrain; client.OnRegionInfoRequest += HandleRegionInfoRequest; client.OnEstateCovenantRequest += HandleEstateCovenantRequest; diff --git a/OpenSim/Region/Environment/Modules/World/Estate/EstateTerrainXferHandler.cs b/OpenSim/Region/Environment/Modules/World/Estate/EstateTerrainXferHandler.cs new file mode 100644 index 0000000..3ee633e --- /dev/null +++ b/OpenSim/Region/Environment/Modules/World/Estate/EstateTerrainXferHandler.cs @@ -0,0 +1,129 @@ +/* + * 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.IO; +using System.Reflection; +using log4net; +using OpenMetaverse; +using OpenSim.Framework; +using OpenSim.Framework.Communications.Cache; +using OpenSim.Region.Environment.Scenes; + + +namespace OpenSim.Region.Environment.Modules.World.Estate +{ + + public class EstateTerrainXferHandler + { + private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + + private AssetBase m_asset; + + public delegate void TerrainUploadComplete(string name, byte[] filedata, IClientAPI remoteClient); + + public event TerrainUploadComplete TerrainUploadDone; + + private string m_description = String.Empty; + private string m_name = String.Empty; + private UUID TransactionID = UUID.Zero; + private sbyte type = 0; + + public ulong mXferID; + private TerrainUploadComplete handlerTerrainUploadDone; + + + + public EstateTerrainXferHandler(IClientAPI pRemoteClient, string pClientFilename) + { + + m_asset = new AssetBase(); + m_asset.FullID = UUID.Zero; + m_asset.Type = type; + m_asset.Data = new byte[0]; + m_asset.Name = pClientFilename; + m_asset.Description = "empty"; + m_asset.Local = true; + m_asset.Temporary = true; + + } + + public ulong XferID + { + get { return mXferID; } + } + + public void RequestStartXfer(IClientAPI pRemoteClient) + { + mXferID = Util.GetNextXferID(); + pRemoteClient.SendXferRequest(mXferID, m_asset.Type, m_asset.FullID, 0, Utils.StringToBytes(m_asset.Name)); + } + + /// + /// Process transfer data received from the client. + /// + /// + /// + /// + public void XferReceive(IClientAPI remoteClient, ulong xferID, uint packetID, byte[] data) + { + if (mXferID == xferID) + { + if (m_asset.Data.Length > 1) + { + byte[] destinationArray = new byte[m_asset.Data.Length + data.Length]; + Array.Copy(m_asset.Data, 0, destinationArray, 0, m_asset.Data.Length); + Array.Copy(data, 0, destinationArray, m_asset.Data.Length, data.Length); + m_asset.Data = destinationArray; + } + else + { + byte[] buffer2 = new byte[data.Length - 4]; + Array.Copy(data, 4, buffer2, 0, data.Length - 4); + m_asset.Data = buffer2; + } + + remoteClient.SendConfirmXfer(xferID, packetID); + + if ((packetID & 0x80000000) != 0) + { + SendCompleteMessage(remoteClient); + + } + } + } + + public void SendCompleteMessage(IClientAPI remoteClient) + { + handlerTerrainUploadDone = TerrainUploadDone; + if (handlerTerrainUploadDone != null) + { + handlerTerrainUploadDone(m_asset.Name,m_asset.Data, remoteClient); + } + } + } +} diff --git a/OpenSim/Region/Environment/Modules/World/NPC/NPCAvatar.cs b/OpenSim/Region/Environment/Modules/World/NPC/NPCAvatar.cs index ba73a31..de0a41a 100644 --- a/OpenSim/Region/Environment/Modules/World/NPC/NPCAvatar.cs +++ b/OpenSim/Region/Environment/Modules/World/NPC/NPCAvatar.cs @@ -243,6 +243,7 @@ namespace OpenSim.Region.Environment.Modules.World.NPC public event UDPAssetUploadRequest OnAssetUploadRequest; public event XferReceive OnXferReceive; public event RequestXfer OnRequestXfer; + public event AbortXfer OnAbortXfer; public event ConfirmXfer OnConfirmXfer; public event RezScript OnRezScript; public event UpdateTaskInventory OnUpdateTaskInventory; @@ -269,6 +270,7 @@ namespace OpenSim.Region.Environment.Modules.World.NPC public event RegionInfoRequest OnRegionInfoRequest; public event EstateCovenantRequest OnEstateCovenantRequest; public event RequestTerrain OnRequestTerrain; + public event RequestTerrain OnUploadTerrain; public event ObjectDuplicateOnRay OnObjectDuplicateOnRay; public event FriendActionDelegate OnApproveFriendRequest; diff --git a/OpenSim/Region/Examples/SimpleModule/MyNpcCharacter.cs b/OpenSim/Region/Examples/SimpleModule/MyNpcCharacter.cs index 8317fcc..761d2aa 100644 --- a/OpenSim/Region/Examples/SimpleModule/MyNpcCharacter.cs +++ b/OpenSim/Region/Examples/SimpleModule/MyNpcCharacter.cs @@ -137,9 +137,11 @@ namespace OpenSim.Region.Examples.SimpleModule public event MoveInventoryItem OnMoveInventoryItem; public event UDPAssetUploadRequest OnAssetUploadRequest; public event RequestTerrain OnRequestTerrain; + public event RequestTerrain OnUploadTerrain; public event XferReceive OnXferReceive; public event RequestXfer OnRequestXfer; public event ConfirmXfer OnConfirmXfer; + public event AbortXfer OnAbortXfer; public event RezScript OnRezScript; public event UpdateTaskInventory OnUpdateTaskInventory; public event MoveTaskInventory OnMoveTaskItem; -- cgit v1.1