2009-03-12 23:02:42 +00:00
|
|
|
|
using System;
|
2009-03-13 08:57:52 +00:00
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
|
using System.Security.Cryptography.X509Certificates;
|
2009-03-12 23:02:42 +00:00
|
|
|
|
using ExtensionLoader;
|
|
|
|
|
|
using OpenMetaverse;
|
|
|
|
|
|
|
|
|
|
|
|
namespace Simian
|
|
|
|
|
|
{
|
|
|
|
|
|
public class GridLocal : IExtension<Simian>, IGridProvider
|
|
|
|
|
|
{
|
2009-03-16 18:02:48 +00:00
|
|
|
|
public event RegionUpdateCallback OnRegionUpdate;
|
|
|
|
|
|
|
2009-03-12 23:02:42 +00:00
|
|
|
|
Simian server;
|
2009-03-13 08:57:52 +00:00
|
|
|
|
DoubleDictionary<ulong, UUID, RegionInfo> grid = new DoubleDictionary<ulong, UUID, RegionInfo>();
|
2009-03-16 18:02:48 +00:00
|
|
|
|
object syncRoot = new object();
|
2009-03-12 23:02:42 +00:00
|
|
|
|
|
|
|
|
|
|
public GridLocal()
|
|
|
|
|
|
{
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public bool Start(Simian server)
|
|
|
|
|
|
{
|
|
|
|
|
|
this.server = server;
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public void Stop()
|
|
|
|
|
|
{
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2009-03-13 08:57:52 +00:00
|
|
|
|
public bool TryRegisterGridSpace(RegionInfo regionInfo, X509Certificate2 regionCert, out UUID regionID)
|
2009-03-12 23:02:42 +00:00
|
|
|
|
{
|
2009-03-13 08:57:52 +00:00
|
|
|
|
// No need to check the certificate since the requests are all local
|
|
|
|
|
|
|
2009-03-16 18:02:48 +00:00
|
|
|
|
lock (syncRoot)
|
2009-03-13 08:57:52 +00:00
|
|
|
|
{
|
2009-03-16 18:02:48 +00:00
|
|
|
|
// Check the coordinates
|
|
|
|
|
|
if (!grid.ContainsKey(regionInfo.Handle))
|
|
|
|
|
|
{
|
|
|
|
|
|
regionID = UUID.Random();
|
|
|
|
|
|
grid.Add(regionInfo.Handle, regionID, regionInfo);
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
regionID = UUID.Zero;
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
2009-03-13 08:57:52 +00:00
|
|
|
|
}
|
2009-03-12 23:02:42 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2009-03-16 18:02:48 +00:00
|
|
|
|
public bool TryRegisterAnyGridSpace(RegionInfo regionInfo, X509Certificate2 regionCert, bool isolated, out UUID regionID)
|
2009-03-12 23:02:42 +00:00
|
|
|
|
{
|
|
|
|
|
|
regionID = UUID.Zero;
|
2009-03-16 18:02:48 +00:00
|
|
|
|
regionInfo.Online = false;
|
2009-03-12 23:02:42 +00:00
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2009-03-13 08:57:52 +00:00
|
|
|
|
public bool UnregisterGridSpace(UUID regionID, X509Certificate2 regionCert)
|
2009-03-12 23:02:42 +00:00
|
|
|
|
{
|
2009-03-16 18:02:48 +00:00
|
|
|
|
lock (syncRoot)
|
|
|
|
|
|
{
|
|
|
|
|
|
RegionInfo regionInfo;
|
|
|
|
|
|
if (grid.TryGetValue(regionID, out regionInfo))
|
|
|
|
|
|
{
|
|
|
|
|
|
regionInfo.Online = false;
|
|
|
|
|
|
grid.Remove(regionID);
|
|
|
|
|
|
|
|
|
|
|
|
if (OnRegionUpdate != null)
|
|
|
|
|
|
{
|
|
|
|
|
|
OnRegionUpdate(regionInfo);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2009-03-12 23:02:42 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2009-03-16 18:02:48 +00:00
|
|
|
|
public void RegionUpdate(RegionInfo regionInfo, X509Certificate2 regionCert)
|
2009-03-12 23:02:42 +00:00
|
|
|
|
{
|
2009-03-16 18:02:48 +00:00
|
|
|
|
lock (syncRoot)
|
|
|
|
|
|
{
|
|
|
|
|
|
RegionInfo oldRegionInfo;
|
|
|
|
|
|
if (grid.TryGetValue(regionInfo.ID, out oldRegionInfo))
|
|
|
|
|
|
{
|
|
|
|
|
|
// TODO: Handle requests to move the region
|
|
|
|
|
|
//oldRegionInfo.Handle
|
|
|
|
|
|
|
|
|
|
|
|
oldRegionInfo.HttpServer = regionInfo.HttpServer;
|
|
|
|
|
|
oldRegionInfo.IPAndPort = regionInfo.IPAndPort;
|
|
|
|
|
|
oldRegionInfo.MapTextureID = regionInfo.MapTextureID;
|
|
|
|
|
|
oldRegionInfo.Name = regionInfo.Name;
|
|
|
|
|
|
oldRegionInfo.Owner = regionInfo.Owner;
|
|
|
|
|
|
oldRegionInfo.Online = regionInfo.Online;
|
|
|
|
|
|
oldRegionInfo.EnableClientCap = regionInfo.EnableClientCap;
|
|
|
|
|
|
|
|
|
|
|
|
if (OnRegionUpdate != null)
|
|
|
|
|
|
{
|
|
|
|
|
|
OnRegionUpdate(oldRegionInfo);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2009-03-12 23:02:42 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2009-03-13 08:57:52 +00:00
|
|
|
|
public void RegionHeartbeat(UUID regionID, X509Certificate2 regionCert)
|
2009-03-12 23:02:42 +00:00
|
|
|
|
{
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2009-03-13 08:57:52 +00:00
|
|
|
|
public bool TryGetRegion(UUID regionID, X509Certificate2 regionCert, out RegionInfo region)
|
2009-03-12 23:02:42 +00:00
|
|
|
|
{
|
2009-03-13 08:57:52 +00:00
|
|
|
|
return grid.TryGetValue(regionID, out region);
|
2009-03-12 23:02:42 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2009-03-13 08:57:52 +00:00
|
|
|
|
public bool TryGetRegion(uint regionX, uint regionY, X509Certificate2 regionCert, out RegionInfo region)
|
2009-03-12 23:02:42 +00:00
|
|
|
|
{
|
2009-03-13 08:57:52 +00:00
|
|
|
|
ulong handle = Utils.UIntsToLong(256 * regionX, 256 * regionY);
|
|
|
|
|
|
return grid.TryGetValue(handle, out region);
|
2009-03-12 23:02:42 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public ISceneProvider GetDefaultLocalScene()
|
|
|
|
|
|
{
|
|
|
|
|
|
if (server.Scenes.Count > 0)
|
|
|
|
|
|
return server.Scenes[0];
|
|
|
|
|
|
else
|
|
|
|
|
|
return null;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|