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