Merge branch 'htb-throttle' of ssh://opensimulator.org/var/git/opensim into htb-throttle
commit
4b5a2f8c02
|
@ -151,7 +151,10 @@ namespace OpenSim.Data.MySQL
|
||||||
|
|
||||||
DataTable schemaTable = result.GetSchemaTable();
|
DataTable schemaTable = result.GetSchemaTable();
|
||||||
foreach (DataRow row in schemaTable.Rows)
|
foreach (DataRow row in schemaTable.Rows)
|
||||||
m_ColumnNames.Add(row["ColumnName"].ToString());
|
{
|
||||||
|
if (row["ColumnName"] != null)
|
||||||
|
m_ColumnNames.Add(row["ColumnName"].ToString());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach (string s in m_ColumnNames)
|
foreach (string s in m_ColumnNames)
|
||||||
|
|
|
@ -31,6 +31,7 @@ using OpenMetaverse;
|
||||||
using OpenMetaverse.Imaging;
|
using OpenMetaverse.Imaging;
|
||||||
using OpenSim.Framework;
|
using OpenSim.Framework;
|
||||||
using OpenSim.Region.Framework.Interfaces;
|
using OpenSim.Region.Framework.Interfaces;
|
||||||
|
using OpenSim.Region.Framework.Scenes.Hypergrid;
|
||||||
using OpenSim.Services.Interfaces;
|
using OpenSim.Services.Interfaces;
|
||||||
using log4net;
|
using log4net;
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
|
@ -54,6 +55,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||||
public UUID TextureID;
|
public UUID TextureID;
|
||||||
public IJ2KDecoder J2KDecoder;
|
public IJ2KDecoder J2KDecoder;
|
||||||
public IAssetService AssetService;
|
public IAssetService AssetService;
|
||||||
|
public UUID AgentID;
|
||||||
|
public IHyperAssetService HyperAssets;
|
||||||
public OpenJPEG.J2KLayerInfo[] Layers;
|
public OpenJPEG.J2KLayerInfo[] Layers;
|
||||||
public bool IsDecoded;
|
public bool IsDecoded;
|
||||||
public bool HasAsset;
|
public bool HasAsset;
|
||||||
|
@ -373,6 +376,17 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||||
UUID assetID = UUID.Zero;
|
UUID assetID = UUID.Zero;
|
||||||
if (asset != null)
|
if (asset != null)
|
||||||
assetID = asset.FullID;
|
assetID = asset.FullID;
|
||||||
|
else if ((HyperAssets != null) && (sender != HyperAssets))
|
||||||
|
{
|
||||||
|
// Try the user's inventory, but only if it's different from the regions'
|
||||||
|
string userAssets = HyperAssets.GetUserAssetServer(AgentID);
|
||||||
|
if ((userAssets != string.Empty) && (userAssets != HyperAssets.GetSimAssetServer()))
|
||||||
|
{
|
||||||
|
m_log.DebugFormat("[J2KIMAGE]: texture {0} not found in local asset storage. Trying user's storage.", id);
|
||||||
|
AssetService.Get(userAssets + "/" + id, HyperAssets, AssetReceived);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
AssetDataCallback(assetID, asset);
|
AssetDataCallback(assetID, asset);
|
||||||
|
|
||||||
|
|
|
@ -43,6 +43,7 @@ using OpenSim.Framework.Communications.Cache;
|
||||||
using OpenSim.Framework.Statistics;
|
using OpenSim.Framework.Statistics;
|
||||||
using OpenSim.Region.Framework.Interfaces;
|
using OpenSim.Region.Framework.Interfaces;
|
||||||
using OpenSim.Region.Framework.Scenes;
|
using OpenSim.Region.Framework.Scenes;
|
||||||
|
using OpenSim.Region.Framework.Scenes.Hypergrid;
|
||||||
using OpenSim.Services.Interfaces;
|
using OpenSim.Services.Interfaces;
|
||||||
using Timer=System.Timers.Timer;
|
using Timer=System.Timers.Timer;
|
||||||
using AssetLandmark = OpenSim.Framework.AssetLandmark;
|
using AssetLandmark = OpenSim.Framework.AssetLandmark;
|
||||||
|
@ -319,6 +320,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||||
/// OnQueueEmpty event is triggered for the texture category</summary>
|
/// OnQueueEmpty event is triggered for the texture category</summary>
|
||||||
protected int m_textureSendLimit = 20;
|
protected int m_textureSendLimit = 20;
|
||||||
protected IAssetService m_assetService;
|
protected IAssetService m_assetService;
|
||||||
|
private IHyperAssetService m_hyperAssets;
|
||||||
|
|
||||||
|
|
||||||
#endregion Class Members
|
#endregion Class Members
|
||||||
|
|
||||||
|
@ -377,6 +380,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||||
|
|
||||||
m_scene = scene;
|
m_scene = scene;
|
||||||
m_assetService = m_scene.RequestModuleInterface<IAssetService>();
|
m_assetService = m_scene.RequestModuleInterface<IAssetService>();
|
||||||
|
m_hyperAssets = m_scene.RequestModuleInterface<IHyperAssetService>();
|
||||||
m_GroupsModule = scene.RequestModuleInterface<IGroupsModule>();
|
m_GroupsModule = scene.RequestModuleInterface<IGroupsModule>();
|
||||||
m_imageManager = new LLImageManager(this, m_assetService, Scene.RequestModuleInterface<IJ2KDecoder>());
|
m_imageManager = new LLImageManager(this, m_assetService, Scene.RequestModuleInterface<IJ2KDecoder>());
|
||||||
m_channelVersion = Utils.StringToBytes(scene.GetSimulatorVersion());
|
m_channelVersion = Utils.StringToBytes(scene.GetSimulatorVersion());
|
||||||
|
@ -6895,7 +6899,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
//handlerTextureRequest = null;
|
//handlerTextureRequest = null;
|
||||||
|
|
||||||
for (int i = 0; i < imageRequest.RequestImage.Length; i++)
|
for (int i = 0; i < imageRequest.RequestImage.Length; i++)
|
||||||
{
|
{
|
||||||
if (OnRequestTexture != null)
|
if (OnRequestTexture != null)
|
||||||
|
@ -6906,7 +6909,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||||
args.PacketNumber = imageRequest.RequestImage[i].Packet;
|
args.PacketNumber = imageRequest.RequestImage[i].Packet;
|
||||||
args.Priority = imageRequest.RequestImage[i].DownloadPriority;
|
args.Priority = imageRequest.RequestImage[i].DownloadPriority;
|
||||||
args.requestSequence = imageRequest.Header.Sequence;
|
args.requestSequence = imageRequest.Header.Sequence;
|
||||||
|
|
||||||
//handlerTextureRequest = OnRequestTexture;
|
//handlerTextureRequest = OnRequestTexture;
|
||||||
|
|
||||||
//if (handlerTextureRequest != null)
|
//if (handlerTextureRequest != null)
|
||||||
|
@ -6929,10 +6931,10 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||||
// Validate inventory transfers
|
// Validate inventory transfers
|
||||||
// Has to be done here, because AssetCache can't do it
|
// Has to be done here, because AssetCache can't do it
|
||||||
//
|
//
|
||||||
|
UUID taskID = UUID.Zero;
|
||||||
if (transfer.TransferInfo.SourceType == 3)
|
if (transfer.TransferInfo.SourceType == 3)
|
||||||
{
|
{
|
||||||
UUID taskID = new UUID(transfer.TransferInfo.Params, 48);
|
taskID = new UUID(transfer.TransferInfo.Params, 48);
|
||||||
UUID itemID = new UUID(transfer.TransferInfo.Params, 64);
|
UUID itemID = new UUID(transfer.TransferInfo.Params, 64);
|
||||||
UUID requestID = new UUID(transfer.TransferInfo.Params, 80);
|
UUID requestID = new UUID(transfer.TransferInfo.Params, 80);
|
||||||
if (!(((Scene)m_scene).Permissions.BypassPermissions()))
|
if (!(((Scene)m_scene).Permissions.BypassPermissions()))
|
||||||
|
@ -7003,7 +7005,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||||
|
|
||||||
//m_assetCache.AddAssetRequest(this, transfer);
|
//m_assetCache.AddAssetRequest(this, transfer);
|
||||||
|
|
||||||
MakeAssetRequest(transfer);
|
MakeAssetRequest(transfer, taskID);
|
||||||
|
|
||||||
/* RequestAsset = OnRequestAsset;
|
/* RequestAsset = OnRequestAsset;
|
||||||
if (RequestAsset != null)
|
if (RequestAsset != null)
|
||||||
|
@ -10210,7 +10212,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||||
return String.Empty;
|
return String.Empty;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void MakeAssetRequest(TransferRequestPacket transferRequest)
|
public void MakeAssetRequest(TransferRequestPacket transferRequest, UUID taskID)
|
||||||
{
|
{
|
||||||
UUID requestID = UUID.Zero;
|
UUID requestID = UUID.Zero;
|
||||||
if (transferRequest.TransferInfo.SourceType == 2)
|
if (transferRequest.TransferInfo.SourceType == 2)
|
||||||
|
@ -10222,7 +10224,15 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||||
{
|
{
|
||||||
//inventory asset request
|
//inventory asset request
|
||||||
requestID = new UUID(transferRequest.TransferInfo.Params, 80);
|
requestID = new UUID(transferRequest.TransferInfo.Params, 80);
|
||||||
//m_log.Debug("asset request " + requestID);
|
//m_log.Debug("[XXX] inventory asset request " + requestID);
|
||||||
|
//if (taskID == UUID.Zero) // Agent
|
||||||
|
// if (m_scene is HGScene)
|
||||||
|
// {
|
||||||
|
// m_log.Debug("[XXX] hg asset request " + requestID);
|
||||||
|
// // We may need to fetch the asset from the user's asset server into the local asset server
|
||||||
|
// HGAssetMapper mapper = ((HGScene)m_scene).AssetMapper;
|
||||||
|
// mapper.Get(requestID, AgentId);
|
||||||
|
// }
|
||||||
}
|
}
|
||||||
|
|
||||||
//check to see if asset is in local cache, if not we need to request it from asset server.
|
//check to see if asset is in local cache, if not we need to request it from asset server.
|
||||||
|
@ -10238,12 +10248,12 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||||
|
|
||||||
UUID requestID = UUID.Zero;
|
UUID requestID = UUID.Zero;
|
||||||
byte source = 2;
|
byte source = 2;
|
||||||
if (transferRequest.TransferInfo.SourceType == 2)
|
if ((transferRequest.TransferInfo.SourceType == 2) || (transferRequest.TransferInfo.SourceType == 2222))
|
||||||
{
|
{
|
||||||
//direct asset request
|
//direct asset request
|
||||||
requestID = new UUID(transferRequest.TransferInfo.Params, 0);
|
requestID = new UUID(transferRequest.TransferInfo.Params, 0);
|
||||||
}
|
}
|
||||||
else if (transferRequest.TransferInfo.SourceType == 3)
|
else if ((transferRequest.TransferInfo.SourceType == 3) || (transferRequest.TransferInfo.SourceType == 3333))
|
||||||
{
|
{
|
||||||
//inventory asset request
|
//inventory asset request
|
||||||
requestID = new UUID(transferRequest.TransferInfo.Params, 80);
|
requestID = new UUID(transferRequest.TransferInfo.Params, 80);
|
||||||
|
@ -10251,10 +10261,28 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||||
//m_log.Debug("asset request " + requestID);
|
//m_log.Debug("asset request " + requestID);
|
||||||
}
|
}
|
||||||
|
|
||||||
// FIXME: We never tell the client about assets which do not exist when requested by this transfer mechanism, which can't be right.
|
|
||||||
if (null == asset)
|
if (null == asset)
|
||||||
{
|
{
|
||||||
|
if ((m_hyperAssets != null) && (transferRequest.TransferInfo.SourceType < 2000))
|
||||||
|
{
|
||||||
|
// Try the user's inventory, but only if it's different from the regions'
|
||||||
|
string userAssets = m_hyperAssets.GetUserAssetServer(AgentId);
|
||||||
|
if ((userAssets != string.Empty) && (userAssets != m_hyperAssets.GetSimAssetServer()))
|
||||||
|
{
|
||||||
|
m_log.DebugFormat("[CLIENT]: asset {0} not found in local asset storage. Trying user's storage.", id);
|
||||||
|
if (transferRequest.TransferInfo.SourceType == 2)
|
||||||
|
transferRequest.TransferInfo.SourceType = 2222; // marker
|
||||||
|
else if (transferRequest.TransferInfo.SourceType == 3)
|
||||||
|
transferRequest.TransferInfo.SourceType = 3333; // marker
|
||||||
|
|
||||||
|
m_assetService.Get(userAssets + "/" + id, transferRequest, AssetReceived);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//m_log.DebugFormat("[ASSET CACHE]: Asset transfer request for asset which is {0} already known to be missing. Dropping", requestID);
|
//m_log.DebugFormat("[ASSET CACHE]: Asset transfer request for asset which is {0} already known to be missing. Dropping", requestID);
|
||||||
|
|
||||||
|
// FIXME: We never tell the client about assets which do not exist when requested by this transfer mechanism, which can't be right.
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -59,6 +59,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||||
private C5.IntervalHeap<J2KImage> m_priorityQueue = new C5.IntervalHeap<J2KImage>(10, new J2KImageComparer());
|
private C5.IntervalHeap<J2KImage> m_priorityQueue = new C5.IntervalHeap<J2KImage>(10, new J2KImageComparer());
|
||||||
private object m_syncRoot = new object();
|
private object m_syncRoot = new object();
|
||||||
|
|
||||||
|
private IHyperAssetService m_hyperAssets;
|
||||||
|
|
||||||
public LLClientView Client { get { return m_client; } }
|
public LLClientView Client { get { return m_client; } }
|
||||||
public AssetBase MissingImage { get { return m_missingImage; } }
|
public AssetBase MissingImage { get { return m_missingImage; } }
|
||||||
|
|
||||||
|
@ -74,6 +76,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||||
m_log.Error("[ClientView] - Couldn't set missing image asset, falling back to missing image packet. This is known to crash the client");
|
m_log.Error("[ClientView] - Couldn't set missing image asset, falling back to missing image packet. This is known to crash the client");
|
||||||
|
|
||||||
m_j2kDecodeModule = pJ2kDecodeModule;
|
m_j2kDecodeModule = pJ2kDecodeModule;
|
||||||
|
m_hyperAssets = client.Scene.RequestModuleInterface<IHyperAssetService>();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -146,6 +149,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||||
imgrequest = new J2KImage(this);
|
imgrequest = new J2KImage(this);
|
||||||
imgrequest.J2KDecoder = m_j2kDecodeModule;
|
imgrequest.J2KDecoder = m_j2kDecodeModule;
|
||||||
imgrequest.AssetService = m_assetCache;
|
imgrequest.AssetService = m_assetCache;
|
||||||
|
imgrequest.AgentID = m_client.AgentId;
|
||||||
|
imgrequest.HyperAssets = m_hyperAssets;
|
||||||
imgrequest.DiscardLevel = newRequest.DiscardLevel;
|
imgrequest.DiscardLevel = newRequest.DiscardLevel;
|
||||||
imgrequest.StartPacket = Math.Max(1, newRequest.PacketNumber);
|
imgrequest.StartPacket = Math.Max(1, newRequest.PacketNumber);
|
||||||
imgrequest.Priority = newRequest.Priority;
|
imgrequest.Priority = newRequest.Priority;
|
||||||
|
|
|
@ -43,6 +43,7 @@ using Mono.Addins;
|
||||||
using OpenMetaverse;
|
using OpenMetaverse;
|
||||||
|
|
||||||
using OpenSim.Framework;
|
using OpenSim.Framework;
|
||||||
|
using OpenSim.Framework.Console;
|
||||||
using OpenSim.Region.Framework.Interfaces;
|
using OpenSim.Region.Framework.Interfaces;
|
||||||
using OpenSim.Region.Framework.Scenes;
|
using OpenSim.Region.Framework.Scenes;
|
||||||
using OpenSim.Services.Interfaces;
|
using OpenSim.Services.Interfaces;
|
||||||
|
@ -54,7 +55,7 @@ using OpenSim.Services.Interfaces;
|
||||||
namespace Flotsam.RegionModules.AssetCache
|
namespace Flotsam.RegionModules.AssetCache
|
||||||
{
|
{
|
||||||
[Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule")]
|
[Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule")]
|
||||||
public class FlotsamAssetCache : ISharedRegionModule, IImprovedAssetCache
|
public class FlotsamAssetCache : ISharedRegionModule, IImprovedAssetCache, IAssetService
|
||||||
{
|
{
|
||||||
private static readonly ILog m_log =
|
private static readonly ILog m_log =
|
||||||
LogManager.GetLogger(
|
LogManager.GetLogger(
|
||||||
|
@ -102,6 +103,11 @@ namespace Flotsam.RegionModules.AssetCache
|
||||||
|
|
||||||
private System.Timers.Timer m_CachCleanTimer = new System.Timers.Timer();
|
private System.Timers.Timer m_CachCleanTimer = new System.Timers.Timer();
|
||||||
|
|
||||||
|
private IAssetService m_AssetService = null;
|
||||||
|
private List<Scene> m_Scenes = new List<Scene>();
|
||||||
|
|
||||||
|
private bool m_DeepScanBeforePurge = false;
|
||||||
|
|
||||||
public FlotsamAssetCache()
|
public FlotsamAssetCache()
|
||||||
{
|
{
|
||||||
m_InvalidChars.AddRange(Path.GetInvalidPathChars());
|
m_InvalidChars.AddRange(Path.GetInvalidPathChars());
|
||||||
|
@ -122,6 +128,7 @@ namespace Flotsam.RegionModules.AssetCache
|
||||||
{
|
{
|
||||||
IConfig moduleConfig = source.Configs["Modules"];
|
IConfig moduleConfig = source.Configs["Modules"];
|
||||||
|
|
||||||
|
|
||||||
if (moduleConfig != null)
|
if (moduleConfig != null)
|
||||||
{
|
{
|
||||||
string name = moduleConfig.GetString("AssetCaching", "");
|
string name = moduleConfig.GetString("AssetCaching", "");
|
||||||
|
@ -195,6 +202,12 @@ namespace Flotsam.RegionModules.AssetCache
|
||||||
|
|
||||||
m_CacheWarnAt = assetConfig.GetInt("CacheWarnAt", 30000);
|
m_CacheWarnAt = assetConfig.GetInt("CacheWarnAt", 30000);
|
||||||
|
|
||||||
|
m_DeepScanBeforePurge = assetConfig.GetBoolean("DeepScanBeforePurge", false);
|
||||||
|
|
||||||
|
MainConsole.Instance.Commands.AddCommand(this.Name, true, "fcache status", "fcache status", "Display cache status", HandleConsoleCommand);
|
||||||
|
MainConsole.Instance.Commands.AddCommand(this.Name, true, "fcache clear", "fcache clear [file] [memory]", "Remove all assets in the file and/or memory cache", HandleConsoleCommand);
|
||||||
|
MainConsole.Instance.Commands.AddCommand(this.Name, true, "fcache assets", "fcache assets", "Attempt a deep scan and cache of all assets in all scenes", HandleConsoleCommand);
|
||||||
|
MainConsole.Instance.Commands.AddCommand(this.Name, true, "fcache expire", "fcache expire <datetime>", "Purge cached assets older then the specified date/time", HandleConsoleCommand);
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -213,16 +226,23 @@ namespace Flotsam.RegionModules.AssetCache
|
||||||
if (m_Enabled)
|
if (m_Enabled)
|
||||||
{
|
{
|
||||||
scene.RegisterModuleInterface<IImprovedAssetCache>(this);
|
scene.RegisterModuleInterface<IImprovedAssetCache>(this);
|
||||||
|
m_Scenes.Add(scene);
|
||||||
|
|
||||||
//scene.AddCommand(this, "flotsamcache", "", "Display a list of console commands for the Flotsam Asset Cache", HandleConsoleCommand);
|
if (m_AssetService == null)
|
||||||
scene.AddCommand(this, "flotsamcache counts", "flotsamcache counts", "Display the number of cached assets", HandleConsoleCommand);
|
{
|
||||||
scene.AddCommand(this, "flotsamcache clearmem", "flotsamcache clearmem", "Remove all assets cached in memory", HandleConsoleCommand);
|
m_AssetService = scene.RequestModuleInterface<IAssetService>();
|
||||||
scene.AddCommand(this, "flotsamcache clearfile", "flotsamcache clearfile", "Remove all assets cached on disk", HandleConsoleCommand);
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void RemoveRegion(Scene scene)
|
public void RemoveRegion(Scene scene)
|
||||||
{
|
{
|
||||||
|
if (m_Enabled)
|
||||||
|
{
|
||||||
|
scene.UnregisterModuleInterface<IImprovedAssetCache>(this);
|
||||||
|
m_Scenes.Remove(scene);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void RegionLoaded(Scene scene)
|
public void RegionLoaded(Scene scene)
|
||||||
|
@ -442,31 +462,47 @@ namespace Flotsam.RegionModules.AssetCache
|
||||||
if (m_LogLevel >= 2)
|
if (m_LogLevel >= 2)
|
||||||
m_log.DebugFormat("[FLOTSAM ASSET CACHE]: Checking for expired files older then {0}.", m_FileExpiration.ToString());
|
m_log.DebugFormat("[FLOTSAM ASSET CACHE]: Checking for expired files older then {0}.", m_FileExpiration.ToString());
|
||||||
|
|
||||||
|
// Purge all files last accessed prior to this point
|
||||||
|
DateTime purgeLine = DateTime.Now - m_FileExpiration;
|
||||||
|
|
||||||
|
// An optional deep scan at this point will ensure assets present in scenes,
|
||||||
|
// or referenced by objects in the scene, but not recently accessed
|
||||||
|
// are not purged.
|
||||||
|
if (m_DeepScanBeforePurge)
|
||||||
|
{
|
||||||
|
CacheScenes();
|
||||||
|
}
|
||||||
|
|
||||||
foreach (string dir in Directory.GetDirectories(m_CacheDirectory))
|
foreach (string dir in Directory.GetDirectories(m_CacheDirectory))
|
||||||
{
|
{
|
||||||
CleanExpiredFiles(dir);
|
CleanExpiredFiles(dir, purgeLine);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Recurses through specified directory checking for expired asset files and deletes them. Also removes empty directories.
|
/// Recurses through specified directory checking for asset files last
|
||||||
|
/// accessed prior to the specified purge line and deletes them. Also
|
||||||
|
/// removes empty tier directories.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="dir"></param>
|
/// <param name="dir"></param>
|
||||||
private void CleanExpiredFiles(string dir)
|
private void CleanExpiredFiles(string dir, DateTime purgeLine)
|
||||||
{
|
{
|
||||||
|
|
||||||
foreach (string file in Directory.GetFiles(dir))
|
foreach (string file in Directory.GetFiles(dir))
|
||||||
{
|
{
|
||||||
if (DateTime.Now - File.GetLastAccessTime(file) > m_FileExpiration)
|
if (File.GetLastAccessTime(file) < purgeLine)
|
||||||
{
|
{
|
||||||
File.Delete(file);
|
File.Delete(file);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Recurse into lower tiers
|
||||||
foreach (string subdir in Directory.GetDirectories(dir))
|
foreach (string subdir in Directory.GetDirectories(dir))
|
||||||
{
|
{
|
||||||
CleanExpiredFiles(subdir);
|
CleanExpiredFiles(subdir, purgeLine);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Check if a tier directory is empty, if so, delete it
|
||||||
int dirSize = Directory.GetFiles(dir).Length + Directory.GetDirectories(dir).Length;
|
int dirSize = Directory.GetFiles(dir).Length + Directory.GetDirectories(dir).Length;
|
||||||
if (dirSize == 0)
|
if (dirSize == 0)
|
||||||
{
|
{
|
||||||
|
@ -478,6 +514,11 @@ namespace Flotsam.RegionModules.AssetCache
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Determines the filename for an AssetID stored in the file cache
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="id"></param>
|
||||||
|
/// <returns></returns>
|
||||||
private string GetFileName(string id)
|
private string GetFileName(string id)
|
||||||
{
|
{
|
||||||
// Would it be faster to just hash the darn thing?
|
// Would it be faster to just hash the darn thing?
|
||||||
|
@ -496,14 +537,23 @@ namespace Flotsam.RegionModules.AssetCache
|
||||||
return Path.Combine(path, id);
|
return Path.Combine(path, id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Writes a file to the file cache, creating any nessesary
|
||||||
|
/// tier directories along the way
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="filename"></param>
|
||||||
|
/// <param name="asset"></param>
|
||||||
private void WriteFileCache(string filename, AssetBase asset)
|
private void WriteFileCache(string filename, AssetBase asset)
|
||||||
{
|
{
|
||||||
Stream stream = null;
|
Stream stream = null;
|
||||||
|
|
||||||
// Make sure the target cache directory exists
|
// Make sure the target cache directory exists
|
||||||
string directory = Path.GetDirectoryName(filename);
|
string directory = Path.GetDirectoryName(filename);
|
||||||
|
|
||||||
// Write file first to a temp name, so that it doesn't look
|
// Write file first to a temp name, so that it doesn't look
|
||||||
// like it's already cached while it's still writing.
|
// like it's already cached while it's still writing.
|
||||||
string tempname = Path.Combine(directory, Path.GetRandomFileName());
|
string tempname = Path.Combine(directory, Path.GetRandomFileName());
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
if (!Directory.Exists(directory))
|
if (!Directory.Exists(directory))
|
||||||
|
@ -563,6 +613,11 @@ namespace Flotsam.RegionModules.AssetCache
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Scan through the file cache, and return number of assets currently cached.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="dir"></param>
|
||||||
|
/// <returns></returns>
|
||||||
private int GetFileCacheCount(string dir)
|
private int GetFileCacheCount(string dir)
|
||||||
{
|
{
|
||||||
int count = Directory.GetFiles(dir).Length;
|
int count = Directory.GetFiles(dir).Length;
|
||||||
|
@ -575,55 +630,180 @@ namespace Flotsam.RegionModules.AssetCache
|
||||||
return count;
|
return count;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// This notes the last time the Region had a deep asset scan performed on it.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="RegionID"></param>
|
||||||
|
private void StampRegionStatusFile(UUID RegionID)
|
||||||
|
{
|
||||||
|
string RegionCacheStatusFile = Path.Combine(m_CacheDirectory, "RegionStatus_" + RegionID.ToString() + ".fac");
|
||||||
|
if (File.Exists(RegionCacheStatusFile))
|
||||||
|
{
|
||||||
|
File.SetLastWriteTime(RegionCacheStatusFile, DateTime.Now);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
File.WriteAllText(RegionCacheStatusFile, "Please do not delete this file unless you are manually clearing your Flotsam Asset Cache.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Iterates through all Scenes, doing a deep scan through assets
|
||||||
|
/// to cache all assets present in the scene or referenced by assets
|
||||||
|
/// in the scene
|
||||||
|
/// </summary>
|
||||||
|
/// <returns></returns>
|
||||||
|
private int CacheScenes()
|
||||||
|
{
|
||||||
|
UuidGatherer gatherer = new UuidGatherer(m_AssetService);
|
||||||
|
|
||||||
|
Dictionary<UUID, int> assets = new Dictionary<UUID, int>();
|
||||||
|
foreach (Scene s in m_Scenes)
|
||||||
|
{
|
||||||
|
StampRegionStatusFile(s.RegionInfo.RegionID);
|
||||||
|
|
||||||
|
s.ForEachSOG(delegate(SceneObjectGroup e)
|
||||||
|
{
|
||||||
|
gatherer.GatherAssetUuids(e, assets);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (UUID assetID in assets.Keys)
|
||||||
|
{
|
||||||
|
string filename = GetFileName(assetID.ToString());
|
||||||
|
|
||||||
|
if (File.Exists(filename))
|
||||||
|
{
|
||||||
|
File.SetLastAccessTime(filename, DateTime.Now);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
m_AssetService.Get(assetID.ToString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return assets.Keys.Count;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Deletes all cache contents
|
||||||
|
/// </summary>
|
||||||
|
private void ClearFileCache()
|
||||||
|
{
|
||||||
|
foreach (string dir in Directory.GetDirectories(m_CacheDirectory))
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
Directory.Delete(dir, true);
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
LogException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (string file in Directory.GetFiles(m_CacheDirectory))
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
File.Delete(file);
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
LogException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#region Console Commands
|
#region Console Commands
|
||||||
private void HandleConsoleCommand(string module, string[] cmdparams)
|
private void HandleConsoleCommand(string module, string[] cmdparams)
|
||||||
{
|
{
|
||||||
if (cmdparams.Length == 2)
|
if (cmdparams.Length >= 2)
|
||||||
{
|
{
|
||||||
string cmd = cmdparams[1];
|
string cmd = cmdparams[1];
|
||||||
switch (cmd)
|
switch (cmd)
|
||||||
{
|
{
|
||||||
case "count":
|
case "status":
|
||||||
case "counts":
|
m_log.InfoFormat("[FLOTSAM ASSET CACHE] Memory Cache : {0} assets", m_MemoryCache.Count);
|
||||||
m_log.InfoFormat("[FLOTSAM ASSET CACHE] Memory Cache : {0}", m_MemoryCache.Count);
|
|
||||||
|
|
||||||
int fileCount = GetFileCacheCount(m_CacheDirectory);
|
int fileCount = GetFileCacheCount(m_CacheDirectory);
|
||||||
m_log.InfoFormat("[FLOTSAM ASSET CACHE] File Cache : {0}", fileCount);
|
m_log.InfoFormat("[FLOTSAM ASSET CACHE] File Cache : {0} assets", fileCount);
|
||||||
|
|
||||||
break;
|
foreach ( string s in Directory.GetFiles(m_CacheDirectory, "*.fac" ) )
|
||||||
|
|
||||||
case "clearmem":
|
|
||||||
m_MemoryCache.Clear();
|
|
||||||
m_log.InfoFormat("[FLOTSAM ASSET CACHE] Memory Cache Cleared, there are now {0} items in the memory cache", m_MemoryCache.Count);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "clearfile":
|
|
||||||
foreach (string dir in Directory.GetDirectories(m_CacheDirectory))
|
|
||||||
{
|
{
|
||||||
try
|
m_log.Info("[FLOTSAM ASSET CACHE] Deep Scans were performed on the following regions:");
|
||||||
{
|
|
||||||
Directory.Delete(dir, true);
|
|
||||||
}
|
|
||||||
catch (Exception e)
|
|
||||||
{
|
|
||||||
LogException(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach (string file in Directory.GetFiles(m_CacheDirectory))
|
string RegionID = s.Remove(0,s.IndexOf("_")).Replace(".fac","");
|
||||||
{
|
DateTime RegionDeepScanTMStamp = File.GetLastWriteTime(s);
|
||||||
try
|
m_log.InfoFormat("[FLOTSAM ASSET CACHE] Region: {0}, {1}", RegionID, RegionDeepScanTMStamp.ToString("MM/dd/yyyy hh:mm:ss"));
|
||||||
{
|
|
||||||
File.Delete(file);
|
|
||||||
}
|
|
||||||
catch (Exception e)
|
|
||||||
{
|
|
||||||
LogException(e);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case "clear":
|
||||||
|
if (cmdparams.Length < 3)
|
||||||
|
{
|
||||||
|
m_log.Warn("[FLOTSAM ASSET CACHE] Please specify memory and/or file cache.");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
foreach (string s in cmdparams)
|
||||||
|
{
|
||||||
|
if (s.ToLower() == "memory")
|
||||||
|
{
|
||||||
|
m_MemoryCache.Clear();
|
||||||
|
m_log.Info("[FLOTSAM ASSET CACHE] Memory cache cleared.");
|
||||||
|
}
|
||||||
|
else if (s.ToLower() == "file")
|
||||||
|
{
|
||||||
|
ClearFileCache();
|
||||||
|
m_log.Info("[FLOTSAM ASSET CACHE] File cache cleared.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
|
||||||
|
case "assets":
|
||||||
|
m_log.Info("[FLOTSAM ASSET CACHE] Caching all assets, in all scenes.");
|
||||||
|
|
||||||
|
Util.FireAndForget(delegate {
|
||||||
|
int assetsCached = CacheScenes();
|
||||||
|
m_log.InfoFormat("[FLOTSAM ASSET CACHE] Completed Scene Caching, {0} assets found.", assetsCached);
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "expire":
|
||||||
|
|
||||||
|
|
||||||
|
if (cmdparams.Length >= 3)
|
||||||
|
{
|
||||||
|
m_log.InfoFormat("[FLOTSAM ASSET CACHE] Invalid parameters for Expire, please specify a valid date & time", cmd);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
string s_expirationDate = "";
|
||||||
|
DateTime expirationDate;
|
||||||
|
|
||||||
|
if (cmdparams.Length > 3)
|
||||||
|
{
|
||||||
|
s_expirationDate = string.Join(" ", cmdparams, 2, cmdparams.Length - 2);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
s_expirationDate = cmdparams[2];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!DateTime.TryParse(s_expirationDate, out expirationDate))
|
||||||
|
{
|
||||||
|
m_log.InfoFormat("[FLOTSAM ASSET CACHE] {0} is not a valid date & time", cmd);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
CleanExpiredFiles(m_CacheDirectory, expirationDate);
|
||||||
|
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
m_log.InfoFormat("[FLOTSAM ASSET CACHE] Unknown command {0}", cmd);
|
m_log.InfoFormat("[FLOTSAM ASSET CACHE] Unknown command {0}", cmd);
|
||||||
break;
|
break;
|
||||||
|
@ -631,13 +811,66 @@ namespace Flotsam.RegionModules.AssetCache
|
||||||
}
|
}
|
||||||
else if (cmdparams.Length == 1)
|
else if (cmdparams.Length == 1)
|
||||||
{
|
{
|
||||||
m_log.InfoFormat("[FLOTSAM ASSET CACHE] flotsamcache counts - Display the number of cached assets");
|
m_log.InfoFormat("[FLOTSAM ASSET CACHE] flotsamcache status - Display cache status");
|
||||||
m_log.InfoFormat("[FLOTSAM ASSET CACHE] flotsamcache clearmem - Remove all assets cached in memory");
|
m_log.InfoFormat("[FLOTSAM ASSET CACHE] flotsamcache clearmem - Remove all assets cached in memory");
|
||||||
m_log.InfoFormat("[FLOTSAM ASSET CACHE] flotsamcache clearfile - Remove all assets cached on disk");
|
m_log.InfoFormat("[FLOTSAM ASSET CACHE] flotsamcache clearfile - Remove all assets cached on disk");
|
||||||
|
m_log.InfoFormat("[FLOTSAM ASSET CACHE] flotsamcache cachescenes - Attempt a deep cache of all assets in all scenes");
|
||||||
|
m_log.InfoFormat("[FLOTSAM ASSET CACHE] flotsamcache <datetime> - Purge assets older then the specified date & time");
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
#region IAssetService Members
|
||||||
|
|
||||||
|
|
||||||
|
public AssetMetadata GetMetadata(string id)
|
||||||
|
{
|
||||||
|
AssetBase asset = Get(id);
|
||||||
|
return asset.Metadata;
|
||||||
|
}
|
||||||
|
|
||||||
|
public byte[] GetData(string id)
|
||||||
|
{
|
||||||
|
AssetBase asset = Get(id);
|
||||||
|
return asset.Data;
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool Get(string id, object sender, AssetRetrieved handler)
|
||||||
|
{
|
||||||
|
AssetBase asset = Get(id);
|
||||||
|
handler(id, sender, asset);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public string Store(AssetBase asset)
|
||||||
|
{
|
||||||
|
if ((asset.FullID == null) || (asset.FullID == UUID.Zero))
|
||||||
|
{
|
||||||
|
asset.FullID = UUID.Random();
|
||||||
|
}
|
||||||
|
|
||||||
|
Cache(asset);
|
||||||
|
|
||||||
|
return asset.ID;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool UpdateContent(string id, byte[] data)
|
||||||
|
{
|
||||||
|
AssetBase asset = Get(id);
|
||||||
|
asset.Data = data;
|
||||||
|
Cache(asset);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool Delete(string id)
|
||||||
|
{
|
||||||
|
Expire(id);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -31,6 +31,7 @@ using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
using OpenSim.Framework;
|
using OpenSim.Framework;
|
||||||
|
using OpenSim.Framework.Communications.Cache;
|
||||||
using OpenSim.Server.Base;
|
using OpenSim.Server.Base;
|
||||||
using OpenSim.Region.Framework.Interfaces;
|
using OpenSim.Region.Framework.Interfaces;
|
||||||
using OpenSim.Region.Framework.Scenes;
|
using OpenSim.Region.Framework.Scenes;
|
||||||
|
@ -40,7 +41,7 @@ using OpenMetaverse;
|
||||||
namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Asset
|
namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Asset
|
||||||
{
|
{
|
||||||
public class HGAssetBroker :
|
public class HGAssetBroker :
|
||||||
ISharedRegionModule, IAssetService
|
ISharedRegionModule, IAssetService, IHyperAssetService
|
||||||
{
|
{
|
||||||
private static readonly ILog m_log =
|
private static readonly ILog m_log =
|
||||||
LogManager.GetLogger(
|
LogManager.GetLogger(
|
||||||
|
@ -50,6 +51,9 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Asset
|
||||||
private IAssetService m_GridService;
|
private IAssetService m_GridService;
|
||||||
private IAssetService m_HGService;
|
private IAssetService m_HGService;
|
||||||
|
|
||||||
|
private Scene m_aScene;
|
||||||
|
private string m_LocalAssetServiceURI;
|
||||||
|
|
||||||
private bool m_Enabled = false;
|
private bool m_Enabled = false;
|
||||||
|
|
||||||
public Type ReplaceableInterface
|
public Type ReplaceableInterface
|
||||||
|
@ -114,6 +118,16 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Asset
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
m_LocalAssetServiceURI = assetConfig.GetString("AssetServerURI", string.Empty);
|
||||||
|
if (m_LocalAssetServiceURI == string.Empty)
|
||||||
|
{
|
||||||
|
IConfig netConfig = source.Configs["Network"];
|
||||||
|
m_LocalAssetServiceURI = netConfig.GetString("asset_server_url", string.Empty);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (m_LocalAssetServiceURI != string.Empty)
|
||||||
|
m_LocalAssetServiceURI = m_LocalAssetServiceURI.Trim('/');
|
||||||
|
|
||||||
m_Enabled = true;
|
m_Enabled = true;
|
||||||
m_log.Info("[HG ASSET CONNECTOR]: HG asset broker enabled");
|
m_log.Info("[HG ASSET CONNECTOR]: HG asset broker enabled");
|
||||||
}
|
}
|
||||||
|
@ -133,7 +147,10 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Asset
|
||||||
if (!m_Enabled)
|
if (!m_Enabled)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
m_aScene = scene;
|
||||||
|
|
||||||
scene.RegisterModuleInterface<IAssetService>(this);
|
scene.RegisterModuleInterface<IAssetService>(this);
|
||||||
|
scene.RegisterModuleInterface<IHyperAssetService>(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void RemoveRegion(Scene scene)
|
public void RemoveRegion(Scene scene)
|
||||||
|
@ -344,5 +361,30 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Asset
|
||||||
else
|
else
|
||||||
return m_GridService.Delete(id);
|
return m_GridService.Delete(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#region IHyperAssetService
|
||||||
|
|
||||||
|
public string GetUserAssetServer(UUID userID)
|
||||||
|
{
|
||||||
|
CachedUserInfo uinfo = m_aScene.CommsManager.UserProfileCacheService.GetUserDetails(userID);
|
||||||
|
if ((uinfo != null) && (uinfo.UserProfile != null))
|
||||||
|
{
|
||||||
|
if ((uinfo.UserProfile.UserAssetURI == string.Empty) || (uinfo.UserProfile.UserAssetURI == ""))
|
||||||
|
return m_LocalAssetServiceURI;
|
||||||
|
return uinfo.UserProfile.UserAssetURI.Trim('/');
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// we don't know anyting about this user
|
||||||
|
return string.Empty;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public string GetSimAssetServer()
|
||||||
|
{
|
||||||
|
return m_LocalAssetServiceURI;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -759,6 +759,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
protected bool IsLocalRegion(ulong handle)
|
protected bool IsLocalRegion(ulong handle)
|
||||||
{
|
{
|
||||||
return m_LocalScenes.ContainsKey(handle);
|
return m_LocalScenes.ContainsKey(handle);
|
||||||
|
|
|
@ -159,6 +159,9 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
|
||||||
/// <returns>true if the item was successfully added</returns>
|
/// <returns>true if the item was successfully added</returns>
|
||||||
public bool AddItem(InventoryItemBase item)
|
public bool AddItem(InventoryItemBase item)
|
||||||
{
|
{
|
||||||
|
if (item == null)
|
||||||
|
return false;
|
||||||
|
|
||||||
if (item.Folder == UUID.Zero)
|
if (item.Folder == UUID.Zero)
|
||||||
{
|
{
|
||||||
InventoryFolderBase f = GetFolderForType(item.Owner, (AssetType)item.AssetType);
|
InventoryFolderBase f = GetFolderForType(item.Owner, (AssetType)item.AssetType);
|
||||||
|
|
|
@ -386,7 +386,9 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (IsLocalGridUser(item.Owner))
|
if (IsLocalGridUser(item.Owner))
|
||||||
|
{
|
||||||
return m_GridService.AddItem(item);
|
return m_GridService.AddItem(item);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
UUID sessionID = GetSessionID(item.Owner);
|
UUID sessionID = GetSessionID(item.Owner);
|
||||||
|
|
|
@ -343,7 +343,9 @@ namespace OpenSim.Region.CoreModules.World.Land
|
||||||
|
|
||||||
lock (scene.WestBorders)
|
lock (scene.WestBorders)
|
||||||
{
|
{
|
||||||
scene.WestBorders[0].BorderLine.Z += (int) Constants.RegionSize; //auto teleport West
|
|
||||||
|
|
||||||
|
scene.WestBorders[0].BorderLine.Z = (int)((scene.RegionInfo.RegionLocX - conn.RegionScene.RegionInfo.RegionLocX) * (int)Constants.RegionSize); //auto teleport West
|
||||||
|
|
||||||
// Trigger auto teleport to root region
|
// Trigger auto teleport to root region
|
||||||
scene.WestBorders[0].TriggerRegionX = conn.RegionScene.RegionInfo.RegionLocX;
|
scene.WestBorders[0].TriggerRegionX = conn.RegionScene.RegionInfo.RegionLocX;
|
||||||
|
@ -410,7 +412,7 @@ namespace OpenSim.Region.CoreModules.World.Land
|
||||||
conn.RegionScene.WestBorders[0].BorderLine.Y += (int)Constants.RegionSize;
|
conn.RegionScene.WestBorders[0].BorderLine.Y += (int)Constants.RegionSize;
|
||||||
lock (scene.SouthBorders)
|
lock (scene.SouthBorders)
|
||||||
{
|
{
|
||||||
scene.SouthBorders[0].BorderLine.Z += (int) Constants.RegionSize; //auto teleport south
|
scene.SouthBorders[0].BorderLine.Z = (int)((scene.RegionInfo.RegionLocY - conn.RegionScene.RegionInfo.RegionLocY) * (int)Constants.RegionSize); //auto teleport south
|
||||||
scene.SouthBorders[0].TriggerRegionX = conn.RegionScene.RegionInfo.RegionLocX;
|
scene.SouthBorders[0].TriggerRegionX = conn.RegionScene.RegionInfo.RegionLocX;
|
||||||
scene.SouthBorders[0].TriggerRegionY = conn.RegionScene.RegionInfo.RegionLocY;
|
scene.SouthBorders[0].TriggerRegionY = conn.RegionScene.RegionInfo.RegionLocY;
|
||||||
}
|
}
|
||||||
|
@ -481,7 +483,7 @@ namespace OpenSim.Region.CoreModules.World.Land
|
||||||
|
|
||||||
lock (scene.SouthBorders)
|
lock (scene.SouthBorders)
|
||||||
{
|
{
|
||||||
scene.SouthBorders[0].BorderLine.Z += (int) Constants.RegionSize; //auto teleport south
|
scene.SouthBorders[0].BorderLine.Z = (int)((scene.RegionInfo.RegionLocY - conn.RegionScene.RegionInfo.RegionLocY) * (int)Constants.RegionSize); //auto teleport south
|
||||||
scene.SouthBorders[0].TriggerRegionX = conn.RegionScene.RegionInfo.RegionLocX;
|
scene.SouthBorders[0].TriggerRegionX = conn.RegionScene.RegionInfo.RegionLocX;
|
||||||
scene.SouthBorders[0].TriggerRegionY = conn.RegionScene.RegionInfo.RegionLocY;
|
scene.SouthBorders[0].TriggerRegionY = conn.RegionScene.RegionInfo.RegionLocY;
|
||||||
}
|
}
|
||||||
|
@ -503,7 +505,7 @@ namespace OpenSim.Region.CoreModules.World.Land
|
||||||
|
|
||||||
lock (scene.WestBorders)
|
lock (scene.WestBorders)
|
||||||
{
|
{
|
||||||
scene.WestBorders[0].BorderLine.Z += (int) Constants.RegionSize; //auto teleport West
|
scene.WestBorders[0].BorderLine.Z = (int)((scene.RegionInfo.RegionLocX - conn.RegionScene.RegionInfo.RegionLocX) * (int)Constants.RegionSize); //auto teleport West
|
||||||
scene.WestBorders[0].TriggerRegionX = conn.RegionScene.RegionInfo.RegionLocX;
|
scene.WestBorders[0].TriggerRegionX = conn.RegionScene.RegionInfo.RegionLocX;
|
||||||
scene.WestBorders[0].TriggerRegionY = conn.RegionScene.RegionInfo.RegionLocY;
|
scene.WestBorders[0].TriggerRegionY = conn.RegionScene.RegionInfo.RegionLocY;
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,37 @@
|
||||||
|
/*
|
||||||
|
* 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 OpenSimulator 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 OpenMetaverse;
|
||||||
|
|
||||||
|
namespace OpenSim.Region.Framework.Interfaces
|
||||||
|
{
|
||||||
|
public interface IHyperAssetService
|
||||||
|
{
|
||||||
|
string GetUserAssetServer(UUID userID);
|
||||||
|
string GetSimAssetServer();
|
||||||
|
}
|
||||||
|
}
|
|
@ -35,6 +35,7 @@ using OpenSim.Framework;
|
||||||
using OpenSim.Framework.Communications.Cache;
|
using OpenSim.Framework.Communications.Cache;
|
||||||
using OpenSim.Framework.Communications.Clients;
|
using OpenSim.Framework.Communications.Clients;
|
||||||
using OpenSim.Region.Framework.Scenes.Serialization;
|
using OpenSim.Region.Framework.Scenes.Serialization;
|
||||||
|
using OpenSim.Region.Framework.Interfaces;
|
||||||
using OpenSim.Services.Interfaces;
|
using OpenSim.Services.Interfaces;
|
||||||
|
|
||||||
//using HyperGrid.Framework;
|
//using HyperGrid.Framework;
|
||||||
|
@ -52,13 +53,13 @@ namespace OpenSim.Region.Framework.Scenes.Hypergrid
|
||||||
|
|
||||||
private Scene m_scene;
|
private Scene m_scene;
|
||||||
|
|
||||||
private IHyperlinkService m_hyper;
|
private IHyperAssetService m_hyper;
|
||||||
IHyperlinkService HyperlinkService
|
IHyperAssetService HyperlinkAssets
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
if (m_hyper == null)
|
if (m_hyper == null)
|
||||||
m_hyper = m_scene.RequestModuleInterface<IHyperlinkService>();
|
m_hyper = m_scene.RequestModuleInterface<IHyperAssetService>();
|
||||||
return m_hyper;
|
return m_hyper;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -99,7 +100,7 @@ namespace OpenSim.Region.Framework.Scenes.Hypergrid
|
||||||
|
|
||||||
if (asset != null)
|
if (asset != null)
|
||||||
{
|
{
|
||||||
m_log.Debug("[HGScene]: Asset made it to asset cache. " + asset.Name + " " + assetID);
|
m_log.DebugFormat("[HGScene]: Copied asset {0} from {1} to local asset server. ", asset.ID, url);
|
||||||
return asset;
|
return asset;
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
|
@ -129,6 +130,7 @@ namespace OpenSim.Region.Framework.Scenes.Hypergrid
|
||||||
}
|
}
|
||||||
|
|
||||||
m_scene.AssetService.Store(asset1);
|
m_scene.AssetService.Store(asset1);
|
||||||
|
m_log.DebugFormat("[HGScene]: Posted copy of asset {0} from local asset server to {1}", asset1.ID, url);
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -167,34 +169,32 @@ namespace OpenSim.Region.Framework.Scenes.Hypergrid
|
||||||
|
|
||||||
public void Get(UUID assetID, UUID ownerID)
|
public void Get(UUID assetID, UUID ownerID)
|
||||||
{
|
{
|
||||||
if (!HyperlinkService.IsLocalUser(ownerID))
|
// Get the item from the remote asset server onto the local AssetCache
|
||||||
|
// and place an entry in m_assetMap
|
||||||
|
|
||||||
|
string userAssetURL = HyperlinkAssets.GetUserAssetServer(ownerID);
|
||||||
|
if ((userAssetURL != string.Empty) && (userAssetURL != HyperlinkAssets.GetSimAssetServer()))
|
||||||
{
|
{
|
||||||
// Get the item from the remote asset server onto the local AssetCache
|
m_log.Debug("[HGScene]: Fetching object " + assetID + " from asset server " + userAssetURL);
|
||||||
// and place an entry in m_assetMap
|
AssetBase asset = FetchAsset(userAssetURL, assetID);
|
||||||
|
|
||||||
string userAssetURL = UserAssetURL(ownerID);
|
if (asset != null)
|
||||||
if (userAssetURL != null)
|
|
||||||
{
|
{
|
||||||
m_log.Debug("[HGScene]: Fetching object " + assetID + " to asset server " + userAssetURL);
|
// OK, now fetch the inside.
|
||||||
AssetBase asset = FetchAsset(userAssetURL, assetID);
|
Dictionary<UUID, int> ids = new Dictionary<UUID, int>();
|
||||||
|
HGUuidGatherer uuidGatherer = new HGUuidGatherer(this, m_scene.AssetService, userAssetURL);
|
||||||
|
uuidGatherer.GatherAssetUuids(asset.FullID, (AssetType)asset.Type, ids);
|
||||||
|
foreach (UUID uuid in ids.Keys)
|
||||||
|
FetchAsset(userAssetURL, uuid);
|
||||||
|
|
||||||
if (asset != null)
|
m_log.DebugFormat("[HGScene]: Successfully fetched asset {0} from asset server {1}", asset.ID, userAssetURL);
|
||||||
{
|
|
||||||
m_log.Debug("[HGScene]: Successfully fetched item from remote asset server " + userAssetURL);
|
|
||||||
|
|
||||||
// OK, now fetch the inside.
|
|
||||||
Dictionary<UUID, int> ids = new Dictionary<UUID, int>();
|
|
||||||
HGUuidGatherer uuidGatherer = new HGUuidGatherer(this, m_scene.AssetService, userAssetURL);
|
|
||||||
uuidGatherer.GatherAssetUuids(asset.FullID, (AssetType)asset.Type, ids);
|
|
||||||
foreach (UUID uuid in ids.Keys)
|
|
||||||
FetchAsset(userAssetURL, uuid);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
m_log.Warn("[HGScene]: Could not fetch asset from remote asset server " + userAssetURL);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
m_log.Warn("[HGScene]: Unable to locate foreign user's asset server");
|
m_log.Warn("[HGScene]: Could not fetch asset from remote asset server " + userAssetURL);
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
m_log.Debug("[HGScene]: user's asset server is the local region's asset server");
|
||||||
}
|
}
|
||||||
|
|
||||||
//public InventoryItemBase Get(InventoryItemBase item, UUID rootFolder, CachedUserInfo userInfo)
|
//public InventoryItemBase Get(InventoryItemBase item, UUID rootFolder, CachedUserInfo userInfo)
|
||||||
|
@ -225,44 +225,38 @@ namespace OpenSim.Region.Framework.Scenes.Hypergrid
|
||||||
|
|
||||||
public void Post(UUID assetID, UUID ownerID)
|
public void Post(UUID assetID, UUID ownerID)
|
||||||
{
|
{
|
||||||
if (!HyperlinkService.IsLocalUser(ownerID))
|
|
||||||
{
|
|
||||||
// Post the item from the local AssetCache onto the remote asset server
|
// Post the item from the local AssetCache onto the remote asset server
|
||||||
// and place an entry in m_assetMap
|
// and place an entry in m_assetMap
|
||||||
|
|
||||||
string userAssetURL = UserAssetURL(ownerID);
|
string userAssetURL = HyperlinkAssets.GetUserAssetServer(ownerID);
|
||||||
if (userAssetURL != null)
|
if ((userAssetURL != string.Empty) && (userAssetURL != HyperlinkAssets.GetSimAssetServer()))
|
||||||
|
{
|
||||||
|
m_log.Debug("[HGScene]: Posting object " + assetID + " to asset server " + userAssetURL);
|
||||||
|
AssetBase asset = m_scene.AssetService.Get(assetID.ToString());
|
||||||
|
if (asset != null)
|
||||||
{
|
{
|
||||||
m_log.Debug("[HGScene]: Posting object " + assetID + " to asset server " + userAssetURL);
|
Dictionary<UUID, int> ids = new Dictionary<UUID, int>();
|
||||||
AssetBase asset = m_scene.AssetService.Get(assetID.ToString());
|
HGUuidGatherer uuidGatherer = new HGUuidGatherer(this, m_scene.AssetService, string.Empty);
|
||||||
if (asset != null)
|
uuidGatherer.GatherAssetUuids(asset.FullID, (AssetType)asset.Type, ids);
|
||||||
|
foreach (UUID uuid in ids.Keys)
|
||||||
{
|
{
|
||||||
Dictionary<UUID, int> ids = new Dictionary<UUID, int>();
|
asset = m_scene.AssetService.Get(uuid.ToString());
|
||||||
HGUuidGatherer uuidGatherer = new HGUuidGatherer(this, m_scene.AssetService, string.Empty);
|
if (asset == null)
|
||||||
uuidGatherer.GatherAssetUuids(asset.FullID, (AssetType)asset.Type, ids);
|
m_log.DebugFormat("[HGScene]: Could not find asset {0}", uuid);
|
||||||
foreach (UUID uuid in ids.Keys)
|
|
||||||
{
|
|
||||||
asset = m_scene.AssetService.Get(uuid.ToString());
|
|
||||||
if (asset != null)
|
|
||||||
m_log.DebugFormat("[HGScene]: Posting {0} {1}", asset.Type.ToString(), asset.Name);
|
|
||||||
else
|
|
||||||
m_log.DebugFormat("[HGScene]: Could not find asset {0}", uuid);
|
|
||||||
PostAsset(userAssetURL, asset);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ids.Count > 0) // maybe it succeeded...
|
|
||||||
m_log.DebugFormat("[HGScene]: Successfully posted item {0} to remote asset server {1}", assetID, userAssetURL);
|
|
||||||
else
|
else
|
||||||
m_log.WarnFormat("[HGScene]: Could not post asset {0} to remote asset server {1}", assetID, userAssetURL);
|
PostAsset(userAssetURL, asset);
|
||||||
|
|
||||||
}
|
}
|
||||||
else
|
|
||||||
m_log.Debug("[HGScene]: Something wrong with asset, it could not be found");
|
// maybe all pieces got there...
|
||||||
|
m_log.DebugFormat("[HGScene]: Successfully posted item {0} to asset server {1}", assetID, userAssetURL);
|
||||||
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
m_log.Warn("[HGScene]: Unable to locate foreign user's asset server");
|
m_log.DebugFormat("[HGScene]: Something wrong with asset {0}, it could not be found", assetID);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
m_log.Debug("[HGScene]: user's asset server is local region's asset server");
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
|
@ -32,6 +32,7 @@ using OpenMetaverse;
|
||||||
using OpenSim.Framework;
|
using OpenSim.Framework;
|
||||||
using OpenSim.Framework.Communications;
|
using OpenSim.Framework.Communications;
|
||||||
using OpenSim.Framework.Communications.Cache;
|
using OpenSim.Framework.Communications.Cache;
|
||||||
|
using OpenSim.Region.Framework.Interfaces;
|
||||||
|
|
||||||
namespace OpenSim.Region.Framework.Scenes.Hypergrid
|
namespace OpenSim.Region.Framework.Scenes.Hypergrid
|
||||||
{
|
{
|
||||||
|
@ -41,6 +42,21 @@ namespace OpenSim.Region.Framework.Scenes.Hypergrid
|
||||||
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
||||||
|
|
||||||
private HGAssetMapper m_assMapper;
|
private HGAssetMapper m_assMapper;
|
||||||
|
public HGAssetMapper AssetMapper
|
||||||
|
{
|
||||||
|
get { return m_assMapper; }
|
||||||
|
}
|
||||||
|
|
||||||
|
private IHyperAssetService m_hyper;
|
||||||
|
private IHyperAssetService HyperAssets
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
if (m_hyper == null)
|
||||||
|
m_hyper = RequestModuleInterface<IHyperAssetService>();
|
||||||
|
return m_hyper;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
@ -140,6 +156,16 @@ namespace OpenSim.Region.Framework.Scenes.Hypergrid
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected override void TransferInventoryAssets(InventoryItemBase item, UUID sender, UUID receiver)
|
||||||
|
{
|
||||||
|
string userAssetServer = HyperAssets.GetUserAssetServer(sender);
|
||||||
|
if ((userAssetServer != string.Empty) && (userAssetServer != HyperAssets.GetSimAssetServer()))
|
||||||
|
m_assMapper.Get(item.AssetID, sender);
|
||||||
|
|
||||||
|
userAssetServer = HyperAssets.GetUserAssetServer(receiver);
|
||||||
|
if ((userAssetServer != string.Empty) && (userAssetServer != HyperAssets.GetSimAssetServer()))
|
||||||
|
m_assMapper.Post(item.AssetID, receiver);
|
||||||
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
|
|
@ -408,7 +408,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
public virtual InventoryItemBase GiveInventoryItem(
|
public virtual InventoryItemBase GiveInventoryItem(
|
||||||
UUID recipient, UUID senderId, UUID itemId, UUID recipientFolderId)
|
UUID recipient, UUID senderId, UUID itemId, UUID recipientFolderId)
|
||||||
{
|
{
|
||||||
Console.WriteLine("Scene.Inventory.cs: GiveInventoryItem");
|
//Console.WriteLine("Scene.Inventory.cs: GiveInventoryItem");
|
||||||
|
|
||||||
InventoryItemBase item = new InventoryItemBase(itemId, senderId);
|
InventoryItemBase item = new InventoryItemBase(itemId, senderId);
|
||||||
item = InventoryService.GetItem(item);
|
item = InventoryService.GetItem(item);
|
||||||
|
@ -472,7 +472,8 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
itemCopy.SalePrice = item.SalePrice;
|
itemCopy.SalePrice = item.SalePrice;
|
||||||
itemCopy.SaleType = item.SaleType;
|
itemCopy.SaleType = item.SaleType;
|
||||||
|
|
||||||
InventoryService.AddItem(itemCopy);
|
if (InventoryService.AddItem(itemCopy))
|
||||||
|
TransferInventoryAssets(itemCopy, senderId, recipient);
|
||||||
|
|
||||||
if (!Permissions.BypassPermissions())
|
if (!Permissions.BypassPermissions())
|
||||||
{
|
{
|
||||||
|
@ -494,6 +495,10 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected virtual void TransferInventoryAssets(InventoryItemBase item, UUID sender, UUID receiver)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Give an entire inventory folder from one user to another. The entire contents (including all descendent
|
/// Give an entire inventory folder from one user to another. The entire contents (including all descendent
|
||||||
/// folders) is given.
|
/// folders) is given.
|
||||||
|
|
|
@ -1772,36 +1772,86 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
|
|
||||||
Vector3 pos = attemptedPosition;
|
Vector3 pos = attemptedPosition;
|
||||||
|
|
||||||
|
int changeX = 1;
|
||||||
|
int changeY = 1;
|
||||||
|
|
||||||
if (TestBorderCross(attemptedPosition + WestCross, Cardinals.W))
|
if (TestBorderCross(attemptedPosition + WestCross, Cardinals.W))
|
||||||
{
|
{
|
||||||
if (TestBorderCross(attemptedPosition + SouthCross, Cardinals.S))
|
if (TestBorderCross(attemptedPosition + SouthCross, Cardinals.S))
|
||||||
{
|
{
|
||||||
//Border crossedBorderx = GetCrossedBorder(attemptedPosition,Cardinals.W);
|
|
||||||
//Border crossedBordery = GetCrossedBorder(attemptedPosition, Cardinals.S);
|
Border crossedBorderx = GetCrossedBorder(attemptedPosition + WestCross, Cardinals.W);
|
||||||
|
|
||||||
|
if (crossedBorderx.BorderLine.Z > 0)
|
||||||
|
{
|
||||||
|
pos.X = ((pos.X + crossedBorderx.BorderLine.Z));
|
||||||
|
changeX = (int)(crossedBorderx.BorderLine.Z /(int) Constants.RegionSize);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
pos.X = ((pos.X + Constants.RegionSize));
|
||||||
|
|
||||||
|
Border crossedBordery = GetCrossedBorder(attemptedPosition + SouthCross, Cardinals.S);
|
||||||
//(crossedBorderx.BorderLine.Z / (int)Constants.RegionSize)
|
//(crossedBorderx.BorderLine.Z / (int)Constants.RegionSize)
|
||||||
pos.X = ((pos.X + Constants.RegionSize));
|
|
||||||
pos.Y = ((pos.Y + Constants.RegionSize));
|
if (crossedBordery.BorderLine.Z > 0)
|
||||||
|
{
|
||||||
|
pos.Y = ((pos.Y + crossedBordery.BorderLine.Z));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
pos.Y = ((pos.Y + Constants.RegionSize));
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
newRegionHandle
|
newRegionHandle
|
||||||
= Util.UIntsToLong((uint)((thisx - 1) * Constants.RegionSize),
|
= Util.UIntsToLong((uint)((thisx - changeX) * Constants.RegionSize),
|
||||||
(uint)((thisy - 1) * Constants.RegionSize));
|
(uint)((thisy - changeY) * Constants.RegionSize));
|
||||||
// x - 1
|
// x - 1
|
||||||
// y - 1
|
// y - 1
|
||||||
}
|
}
|
||||||
else if (TestBorderCross(attemptedPosition + NorthCross, Cardinals.N))
|
else if (TestBorderCross(attemptedPosition + NorthCross, Cardinals.N))
|
||||||
{
|
{
|
||||||
pos.X = ((pos.X + Constants.RegionSize));
|
Border crossedBorderx = GetCrossedBorder(attemptedPosition + WestCross, Cardinals.W);
|
||||||
pos.Y = ((pos.Y - Constants.RegionSize));
|
|
||||||
|
if (crossedBorderx.BorderLine.Z > 0)
|
||||||
|
{
|
||||||
|
pos.X = ((pos.X + crossedBorderx.BorderLine.Z));
|
||||||
|
changeX = (int)(crossedBorderx.BorderLine.Z / (int)Constants.RegionSize);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
pos.X = ((pos.X + Constants.RegionSize));
|
||||||
|
|
||||||
|
|
||||||
|
Border crossedBordery = GetCrossedBorder(attemptedPosition + SouthCross, Cardinals.S);
|
||||||
|
//(crossedBorderx.BorderLine.Z / (int)Constants.RegionSize)
|
||||||
|
|
||||||
|
if (crossedBordery.BorderLine.Z > 0)
|
||||||
|
{
|
||||||
|
pos.Y = ((pos.Y + crossedBordery.BorderLine.Z));
|
||||||
|
changeY = (int)(crossedBordery.BorderLine.Z / (int)Constants.RegionSize);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
pos.Y = ((pos.Y + Constants.RegionSize));
|
||||||
|
|
||||||
newRegionHandle
|
newRegionHandle
|
||||||
= Util.UIntsToLong((uint)((thisx - 1) * Constants.RegionSize),
|
= Util.UIntsToLong((uint)((thisx - changeX) * Constants.RegionSize),
|
||||||
(uint)((thisy + 1) * Constants.RegionSize));
|
(uint)((thisy + changeY) * Constants.RegionSize));
|
||||||
// x - 1
|
// x - 1
|
||||||
// y + 1
|
// y + 1
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
pos.X = ((pos.X + Constants.RegionSize));
|
Border crossedBorderx = GetCrossedBorder(attemptedPosition + WestCross, Cardinals.W);
|
||||||
|
|
||||||
|
if (crossedBorderx.BorderLine.Z > 0)
|
||||||
|
{
|
||||||
|
pos.X = ((pos.X + crossedBorderx.BorderLine.Z));
|
||||||
|
changeX = (int)(crossedBorderx.BorderLine.Z / (int)Constants.RegionSize);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
pos.X = ((pos.X + Constants.RegionSize));
|
||||||
|
|
||||||
newRegionHandle
|
newRegionHandle
|
||||||
= Util.UIntsToLong((uint) ((thisx - 1)*Constants.RegionSize),
|
= Util.UIntsToLong((uint)((thisx - changeX) * Constants.RegionSize),
|
||||||
(uint) (thisy*Constants.RegionSize));
|
(uint) (thisy*Constants.RegionSize));
|
||||||
// x - 1
|
// x - 1
|
||||||
}
|
}
|
||||||
|
@ -1810,11 +1860,23 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
{
|
{
|
||||||
if (TestBorderCross(attemptedPosition + SouthCross, Cardinals.S))
|
if (TestBorderCross(attemptedPosition + SouthCross, Cardinals.S))
|
||||||
{
|
{
|
||||||
|
|
||||||
pos.X = ((pos.X - Constants.RegionSize));
|
pos.X = ((pos.X - Constants.RegionSize));
|
||||||
pos.Y = ((pos.Y + Constants.RegionSize));
|
Border crossedBordery = GetCrossedBorder(attemptedPosition + SouthCross, Cardinals.S);
|
||||||
|
//(crossedBorderx.BorderLine.Z / (int)Constants.RegionSize)
|
||||||
|
|
||||||
|
if (crossedBordery.BorderLine.Z > 0)
|
||||||
|
{
|
||||||
|
pos.Y = ((pos.Y + crossedBordery.BorderLine.Z));
|
||||||
|
changeY = (int)(crossedBordery.BorderLine.Z / (int)Constants.RegionSize);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
pos.Y = ((pos.Y + Constants.RegionSize));
|
||||||
|
|
||||||
|
|
||||||
newRegionHandle
|
newRegionHandle
|
||||||
= Util.UIntsToLong((uint)((thisx + 1) * Constants.RegionSize),
|
= Util.UIntsToLong((uint)((thisx + changeX) * Constants.RegionSize),
|
||||||
(uint)((thisy - 1) * Constants.RegionSize));
|
(uint)((thisy - changeY) * Constants.RegionSize));
|
||||||
// x + 1
|
// x + 1
|
||||||
// y - 1
|
// y - 1
|
||||||
}
|
}
|
||||||
|
@ -1823,8 +1885,8 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
pos.X = ((pos.X - Constants.RegionSize));
|
pos.X = ((pos.X - Constants.RegionSize));
|
||||||
pos.Y = ((pos.Y - Constants.RegionSize));
|
pos.Y = ((pos.Y - Constants.RegionSize));
|
||||||
newRegionHandle
|
newRegionHandle
|
||||||
= Util.UIntsToLong((uint)((thisx + 1) * Constants.RegionSize),
|
= Util.UIntsToLong((uint)((thisx + changeX) * Constants.RegionSize),
|
||||||
(uint)((thisy + 1) * Constants.RegionSize));
|
(uint)((thisy + changeY) * Constants.RegionSize));
|
||||||
// x + 1
|
// x + 1
|
||||||
// y + 1
|
// y + 1
|
||||||
}
|
}
|
||||||
|
@ -1832,16 +1894,26 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
{
|
{
|
||||||
pos.X = ((pos.X - Constants.RegionSize));
|
pos.X = ((pos.X - Constants.RegionSize));
|
||||||
newRegionHandle
|
newRegionHandle
|
||||||
= Util.UIntsToLong((uint) ((thisx + 1)*Constants.RegionSize),
|
= Util.UIntsToLong((uint)((thisx + changeX) * Constants.RegionSize),
|
||||||
(uint) (thisy*Constants.RegionSize));
|
(uint) (thisy*Constants.RegionSize));
|
||||||
// x + 1
|
// x + 1
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (TestBorderCross(attemptedPosition + SouthCross, Cardinals.S))
|
else if (TestBorderCross(attemptedPosition + SouthCross, Cardinals.S))
|
||||||
{
|
{
|
||||||
pos.Y = ((pos.Y + Constants.RegionSize));
|
Border crossedBordery = GetCrossedBorder(attemptedPosition + SouthCross, Cardinals.S);
|
||||||
|
//(crossedBorderx.BorderLine.Z / (int)Constants.RegionSize)
|
||||||
|
|
||||||
|
if (crossedBordery.BorderLine.Z > 0)
|
||||||
|
{
|
||||||
|
pos.Y = ((pos.Y + crossedBordery.BorderLine.Z));
|
||||||
|
changeY = (int)(crossedBordery.BorderLine.Z / (int)Constants.RegionSize);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
pos.Y = ((pos.Y + Constants.RegionSize));
|
||||||
|
|
||||||
newRegionHandle
|
newRegionHandle
|
||||||
= Util.UIntsToLong((uint)(thisx * Constants.RegionSize), (uint)((thisy - 1) * Constants.RegionSize));
|
= Util.UIntsToLong((uint)(thisx * Constants.RegionSize), (uint)((thisy - changeY) * Constants.RegionSize));
|
||||||
// y - 1
|
// y - 1
|
||||||
}
|
}
|
||||||
else if (TestBorderCross(attemptedPosition + NorthCross, Cardinals.N))
|
else if (TestBorderCross(attemptedPosition + NorthCross, Cardinals.N))
|
||||||
|
@ -1849,7 +1921,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
|
|
||||||
pos.Y = ((pos.Y - Constants.RegionSize));
|
pos.Y = ((pos.Y - Constants.RegionSize));
|
||||||
newRegionHandle
|
newRegionHandle
|
||||||
= Util.UIntsToLong((uint)(thisx * Constants.RegionSize), (uint)((thisy + 1) * Constants.RegionSize));
|
= Util.UIntsToLong((uint)(thisx * Constants.RegionSize), (uint)((thisy + changeY) * Constants.RegionSize));
|
||||||
// y + 1
|
// y + 1
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -299,6 +299,7 @@ namespace OpenSim.Services.Connectors.Inventory
|
||||||
|
|
||||||
if (StringToUrlAndUserID(id, out url, out userID))
|
if (StringToUrlAndUserID(id, out url, out userID))
|
||||||
{
|
{
|
||||||
|
//m_log.DebugFormat("[HGInventory CONNECTOR]: calling {0}", url);
|
||||||
ISessionAuthInventoryService connector = GetConnector(url);
|
ISessionAuthInventoryService connector = GetConnector(url);
|
||||||
return connector.QueryItem(userID, item, sessionID);
|
return connector.QueryItem(userID, item, sessionID);
|
||||||
}
|
}
|
||||||
|
|
|
@ -200,6 +200,12 @@ namespace OpenSim.Services.Interfaces
|
||||||
Maturity = ConvertFrom.RegionSettings.Maturity;
|
Maturity = ConvertFrom.RegionSettings.Maturity;
|
||||||
RegionSecret = ConvertFrom.regionSecret;
|
RegionSecret = ConvertFrom.regionSecret;
|
||||||
EstateOwner = ConvertFrom.EstateSettings.EstateOwner;
|
EstateOwner = ConvertFrom.EstateSettings.EstateOwner;
|
||||||
|
if (EstateOwner == UUID.Zero)
|
||||||
|
{
|
||||||
|
EstateOwner = ConvertFrom.MasterAvatarAssignedUUID;
|
||||||
|
ConvertFrom.EstateSettings.EstateOwner = EstateOwner;
|
||||||
|
ConvertFrom.EstateSettings.Save();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public GridRegion(GridRegion ConvertFrom)
|
public GridRegion(GridRegion ConvertFrom)
|
||||||
|
|
|
@ -50,3 +50,10 @@
|
||||||
|
|
||||||
; Warning level for cache directory size
|
; Warning level for cache directory size
|
||||||
;CacheWarnAt = 30000
|
;CacheWarnAt = 30000
|
||||||
|
|
||||||
|
; Perform a deep scan of all assets within all regions, looking for all assets
|
||||||
|
; present or referenced. Mark all assets found that are already present in the
|
||||||
|
; cache, and request all assets that are found that are not already cached (this
|
||||||
|
; will cause those assets to be cached)
|
||||||
|
;
|
||||||
|
; DeepScanBeforePurge = false
|
||||||
|
|
Loading…
Reference in New Issue