Added support for terrain map to be serialised to xml(as base64 binary). useful for places that the terrain map is needed in a serialised form. Also could add console commands to save and load from files, which should be faster than .raw files (these load/save commands are not included/implemented)
Add util functions to compress and uncompress strings. Fixed a couple of modules so they use SceneCommunicationService rather than directly call functions on the CommsManager.0.6.0-stable
							parent
							
								
									5158aad662
								
							
						
					
					
						commit
						7a9922af27
					
				| 
						 | 
				
			
			@ -28,6 +28,7 @@
 | 
			
		|||
using System;
 | 
			
		||||
using System.Data;
 | 
			
		||||
using System.IO;
 | 
			
		||||
using System.IO.Compression;
 | 
			
		||||
using System.Net;
 | 
			
		||||
using System.Net.Sockets;
 | 
			
		||||
using System.Reflection;
 | 
			
		||||
| 
						 | 
				
			
			@ -618,6 +619,47 @@ namespace OpenSim.Framework
 | 
			
		|||
            return ret;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public static string Compress(string text)
 | 
			
		||||
        {
 | 
			
		||||
            byte[] buffer = Encoding.UTF8.GetBytes(text);
 | 
			
		||||
            MemoryStream memory = new MemoryStream();
 | 
			
		||||
            using (GZipStream compressor = new GZipStream(memory, CompressionMode.Compress, true))
 | 
			
		||||
            {
 | 
			
		||||
                compressor.Write(buffer, 0, buffer.Length);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            memory.Position = 0;
 | 
			
		||||
            MemoryStream outStream = new MemoryStream();
 | 
			
		||||
 | 
			
		||||
            byte[] compressed = new byte[memory.Length];
 | 
			
		||||
            memory.Read(compressed, 0, compressed.Length);
 | 
			
		||||
 | 
			
		||||
            byte[] compressedBuffer = new byte[compressed.Length + 4];
 | 
			
		||||
            System.Buffer.BlockCopy(compressed, 0, compressedBuffer, 4, compressed.Length);
 | 
			
		||||
            System.Buffer.BlockCopy(BitConverter.GetBytes(buffer.Length), 0, compressedBuffer, 0, 4);
 | 
			
		||||
            return Convert.ToBase64String(compressedBuffer);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public static string Decompress(string compressedText)
 | 
			
		||||
        {
 | 
			
		||||
            byte[] compressedBuffer = Convert.FromBase64String(compressedText);
 | 
			
		||||
            using (MemoryStream memory = new MemoryStream())
 | 
			
		||||
            {
 | 
			
		||||
                int msgLength = BitConverter.ToInt32(compressedBuffer, 0);
 | 
			
		||||
                memory.Write(compressedBuffer, 4, compressedBuffer.Length - 4);
 | 
			
		||||
 | 
			
		||||
                byte[] buffer = new byte[msgLength];
 | 
			
		||||
 | 
			
		||||
                memory.Position = 0;
 | 
			
		||||
                using (GZipStream decompressor = new GZipStream(memory, CompressionMode.Decompress))
 | 
			
		||||
                {
 | 
			
		||||
                    decompressor.Read(buffer, 0, buffer.Length);
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                return Encoding.UTF8.GetString(buffer);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public static string[] ParseStartLocationRequest(string startLocationRequest)
 | 
			
		||||
        {
 | 
			
		||||
            string[] returnstring = new string[4];
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -36,5 +36,7 @@ namespace OpenSim.Region.Environment.Interfaces
 | 
			
		|||
        double[,] GetDoubles();
 | 
			
		||||
        bool Tainted(int x, int y);
 | 
			
		||||
        ITerrainChannel MakeCopy();
 | 
			
		||||
        string SaveToXmlString();
 | 
			
		||||
        void LoadFromXmlString(string data);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -523,7 +523,7 @@ namespace OpenSim.Region.Environment.Modules.Avatar.InstantMessage
 | 
			
		|||
            {
 | 
			
		||||
                if (upd.AgentOnline)
 | 
			
		||||
                {
 | 
			
		||||
                    RegionInfo reginfo = m_scenes[0].CommsManager.GridService.RequestNeighbourInfo(upd.Handle);
 | 
			
		||||
                    RegionInfo reginfo = m_scenes[0].SceneGridService.RequestNeighbouringRegionInfo(upd.Handle);
 | 
			
		||||
                    if (reginfo != null)
 | 
			
		||||
                    {
 | 
			
		||||
                        GridInstantMessage msg = new GridInstantMessage();
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -950,8 +950,6 @@ namespace OpenSim.Region.Environment.Modules.World.Permissions
 | 
			
		|||
 | 
			
		||||
                return true;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -27,6 +27,11 @@
 | 
			
		|||
 | 
			
		||||
using OpenSim.Framework;
 | 
			
		||||
using OpenSim.Region.Environment.Interfaces;
 | 
			
		||||
using System;
 | 
			
		||||
using System.Text;
 | 
			
		||||
using System.Xml;
 | 
			
		||||
using System.IO;
 | 
			
		||||
using System.Xml.Serialization;
 | 
			
		||||
 | 
			
		||||
namespace OpenSim.Region.Environment.Modules.World.Terrain
 | 
			
		||||
{
 | 
			
		||||
| 
						 | 
				
			
			@ -151,5 +156,75 @@ namespace OpenSim.Region.Environment.Modules.World.Terrain
 | 
			
		|||
 | 
			
		||||
            return copy;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public string SaveToXmlString()
 | 
			
		||||
        {
 | 
			
		||||
            XmlWriterSettings settings = new XmlWriterSettings();
 | 
			
		||||
            settings.Encoding = Encoding.UTF8;
 | 
			
		||||
            using (StringWriter sw = new StringWriter())
 | 
			
		||||
            {
 | 
			
		||||
                using (XmlWriter writer = XmlWriter.Create(sw, settings))
 | 
			
		||||
                {
 | 
			
		||||
                    WriteXml(writer);
 | 
			
		||||
                }
 | 
			
		||||
                string output = sw.ToString();
 | 
			
		||||
                return output;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private void WriteXml(XmlWriter writer)
 | 
			
		||||
        {
 | 
			
		||||
            writer.WriteStartElement(String.Empty, "TerrainMap", String.Empty);
 | 
			
		||||
            ToXml(writer);
 | 
			
		||||
            writer.WriteEndElement();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public void LoadFromXmlString(string data)
 | 
			
		||||
        {
 | 
			
		||||
            StringReader sr = new StringReader(data);
 | 
			
		||||
            XmlTextReader reader = new XmlTextReader(sr);
 | 
			
		||||
            reader.Read();
 | 
			
		||||
 | 
			
		||||
            ReadXml(reader);
 | 
			
		||||
            reader.Close();
 | 
			
		||||
            sr.Close();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private void ReadXml(XmlReader reader)
 | 
			
		||||
        {
 | 
			
		||||
            reader.ReadStartElement("TerrainMap");
 | 
			
		||||
            FromXml(reader);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private void ToXml(XmlWriter xmlWriter)
 | 
			
		||||
        {
 | 
			
		||||
            float[] mapData = GetFloatsSerialised();
 | 
			
		||||
            byte[] buffer = new byte[mapData.Length * 4];
 | 
			
		||||
            for (int i = 0; i < mapData.Length; i++)
 | 
			
		||||
            {
 | 
			
		||||
                byte[] value = BitConverter.GetBytes(mapData[i]);
 | 
			
		||||
                Array.Copy(value, 0, buffer, (i * 4), 4);
 | 
			
		||||
            }
 | 
			
		||||
            XmlSerializer serializer = new XmlSerializer(typeof(byte[]));
 | 
			
		||||
            serializer.Serialize(xmlWriter, buffer);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private void FromXml(XmlReader xmlReader)
 | 
			
		||||
        {
 | 
			
		||||
            XmlSerializer serializer = new XmlSerializer(typeof(byte[]));
 | 
			
		||||
            byte[] dataArray = (byte[])serializer.Deserialize(xmlReader);
 | 
			
		||||
            int index = 0;
 | 
			
		||||
 | 
			
		||||
            for (int y = 0; y < Height; y++)
 | 
			
		||||
            {
 | 
			
		||||
                for (int x = 0; x < Width; x++)
 | 
			
		||||
                {
 | 
			
		||||
                    float value;
 | 
			
		||||
                    value = BitConverter.ToSingle(dataArray, index);
 | 
			
		||||
                    index += 4;
 | 
			
		||||
                    this[x, y] = (double)value;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -166,7 +166,7 @@ namespace OpenSim.Region.Environment.Modules.World.WorldMap
 | 
			
		|||
                {
 | 
			
		||||
                    List<MapBlockData> mapBlocks;
 | 
			
		||||
 | 
			
		||||
                    mapBlocks = m_scene.CommsManager.GridService.RequestNeighbourMapBlocks((int)m_scene.RegionInfo.RegionLocX - 8, (int)m_scene.RegionInfo.RegionLocY - 8, (int)m_scene.RegionInfo.RegionLocX + 8, (int)m_scene.RegionInfo.RegionLocY + 8);
 | 
			
		||||
                    mapBlocks = m_scene.SceneGridService.RequestNeighbourMapBlocks((int)m_scene.RegionInfo.RegionLocX - 8, (int)m_scene.RegionInfo.RegionLocY - 8, (int)m_scene.RegionInfo.RegionLocX + 8, (int)m_scene.RegionInfo.RegionLocY + 8);
 | 
			
		||||
                    avatarPresence.ControllingClient.SendMapBlock(mapBlocks);
 | 
			
		||||
                    
 | 
			
		||||
                    lock (cachedMapBlocks)
 | 
			
		||||
| 
						 | 
				
			
			@ -244,7 +244,7 @@ namespace OpenSim.Region.Environment.Modules.World.WorldMap
 | 
			
		|||
        public virtual void RequestMapBlocks(IClientAPI remoteClient, int minX, int minY, int maxX, int maxY)
 | 
			
		||||
        {
 | 
			
		||||
            List<MapBlockData> mapBlocks;
 | 
			
		||||
            mapBlocks = m_scene.CommsManager.GridService.RequestNeighbourMapBlocks(minX - 4, minY - 4, minX + 4, minY + 4);
 | 
			
		||||
            mapBlocks = m_scene.SceneGridService.RequestNeighbourMapBlocks(minX - 4, minY - 4, minX + 4, minY + 4);
 | 
			
		||||
            remoteClient.SendMapBlock(mapBlocks);
 | 
			
		||||
        }
 | 
			
		||||
        public Hashtable OnHTTPGetMapImage(Hashtable keysvals)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -101,6 +101,11 @@ namespace OpenSim.Region.Environment.Scenes
 | 
			
		|||
 | 
			
		||||
        protected SceneCommunicationService m_sceneGridService;
 | 
			
		||||
 | 
			
		||||
        public SceneCommunicationService SceneGridService
 | 
			
		||||
        {
 | 
			
		||||
            get { return m_sceneGridService; }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Each agent has its own capabilities handler.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue