diff --git a/OpenSim/Framework/ILandChannel.cs b/OpenSim/Framework/ILandChannel.cs
index a687f105ac..0fd221fafa 100644
--- a/OpenSim/Framework/ILandChannel.cs
+++ b/OpenSim/Framework/ILandChannel.cs
@@ -56,7 +56,7 @@ namespace OpenSim.Region.Framework.Interfaces
/// Value between 0 - 256 on the y axis of the point
/// Land object at the point supplied
ILandObject GetLandObject(float x, float y);
-
+ ILandObject GetLandObjectClipedXY(float x, float y);
///
/// Get the parcel at the specified point
///
diff --git a/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs b/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs
index 3fdae90a32..dea63e67f4 100644
--- a/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs
+++ b/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs
@@ -138,6 +138,26 @@ namespace OpenSim.Region.ClientStack.Linden
}
private FileAgentInventoryState m_FileAgentInventoryState = FileAgentInventoryState.idle;
+ public struct ScriptInfoForParcel
+ {
+ public UUID id;
+ public UUID owner;
+ public string name;
+ public Vector3 pos;
+ public int memory;
+ public int urls;
+ public bool groupOwned;
+ };
+
+ public struct ParcelScriptInfo
+ {
+ public UUID id;
+ public UUID owner;
+ public string name;
+ public int localID;
+ public List objects;
+ };
+
public BunchOfCaps(Scene scene, UUID agentID, Caps caps)
{
m_Scene = scene;
@@ -1591,7 +1611,6 @@ namespace OpenSim.Region.ClientStack.Linden
public struct AttachmentScriptInfo
{
- public byte attpoint;
public UUID id;
public string name;
public Vector3 pos;
@@ -1624,7 +1643,6 @@ namespace OpenSim.Region.ClientStack.Linden
}
AttachmentScriptInfo info = new AttachmentScriptInfo()
{
- attpoint = attp,
id = so.UUID,
name = so.Name,
memory = mem,
@@ -1713,44 +1731,135 @@ namespace OpenSim.Region.ClientStack.Linden
httpResponse.StatusCode = (int)HttpStatusCode.NotFound;
}
+
public void LandResources(IOSHttpRequest httpRequest, IOSHttpResponse httpResponse, OSDMap req)
{
- if(req.TryGetValue("parcel_id", out OSD tmp) && tmp is OSDUUID)
+ if (!m_Scene.TryGetScenePresence(m_AgentID, out ScenePresence sp))
{
- UUID parcelID = tmp.AsUUID();
- if(!Util.ParseFakeParcelID(parcelID, out ulong regionHandle, out uint x, out uint y) || regionHandle != m_Scene.RegionInfo.RegionHandle)
- {
- httpResponse.StatusCode = (int)HttpStatusCode.NotFound;
- return;
- }
-
- ILandObject land = m_Scene.LandChannel.GetLandObject(x, y);
- if(land == null || land.LandData == null)
- {
- httpResponse.StatusCode = (int)HttpStatusCode.NotFound;
- return;
- }
-
- string uploaderPath = GetNewCapPath();
- ScriptResourceSummary uploader =
- new ScriptResourceSummary(land.LandData.LocalID, m_Scene, m_HostCapsObj.HttpListener, uploaderPath, httpRequest.RemoteIPEndPoint.Address);
-
- m_HostCapsObj.RegisterSimpleHandler("LandResources",
- new SimpleOSDMapHandler("POST", GetNewCapPath(), LandResources));
-
- string protocol = m_HostCapsObj.SSLCaps ? "https://" : "http://";
- string uploaderURL = protocol + m_HostCapsObj.HostName + ":" + m_HostCapsObj.Port.ToString() + uploaderPath;
-
- StringBuilder lsl = LLSDxmlEncode.Start();
- LLSDxmlEncode.AddMap(lsl);
- LLSDxmlEncode.AddElem("ScriptResourceSummary", uploaderURL,lsl);
- LLSDxmlEncode.AddEndMap(lsl);
-
- httpResponse.RawBuffer = LLSDxmlEncode.EndToNBBytes(lsl);
- httpResponse.StatusCode = (int)HttpStatusCode.OK;
+ httpResponse.StatusCode = (int)HttpStatusCode.NotFound;
return;
}
- httpResponse.StatusCode = (int)HttpStatusCode.BadRequest;
+
+ UUID parcelOwner;
+ LandData landdata = null;
+ if (req.TryGetValue("parcel_id", out OSD tmp) && tmp is OSDUUID)
+ {
+ UUID parcelID = tmp.AsUUID();
+ if (Util.ParseFakeParcelID(parcelID, out ulong regionHandle, out uint x, out uint y) && regionHandle == m_Scene.RegionInfo.RegionHandle)
+ {
+ ILandObject land = m_Scene.LandChannel.GetLandObjectClipedXY(x, y);
+ if (land != null)
+ landdata = land.LandData;
+ land = null;
+ }
+ }
+ if(landdata == null)
+ {
+ httpResponse.StatusCode = (int)HttpStatusCode.NotFound;
+ return;
+ }
+ parcelOwner = landdata.OwnerID;
+
+ int showType = 0;
+ if (sp.IsGod || m_Scene.Permissions.IsEstateManager(m_AgentID))
+ showType = 1;
+ else
+ {
+ if (parcelOwner == m_AgentID)
+ showType = 2;
+ else if (landdata.GroupID != UUID.Zero)
+ {
+ ulong powers = sp.ControllingClient.GetGroupPowers(landdata.GroupID);
+ if ((powers & (ulong)(GroupPowers.ReturnGroupOwned | GroupPowers.ReturnGroupSet | GroupPowers.ReturnNonGroup)) != 0)
+ showType = 2;
+ }
+ }
+ landdata = null;
+
+ int nparcels = 0;
+ int totalmem = 0;
+ int totalurls = 0;
+
+ bool ownerparcels = showType != 1;
+ bool showdetail = showType != 0;
+
+ showdetail = false;
+
+ List parcelsInfo = null;
+ IUrlModule urlModule = m_Scene.RequestModuleInterface();
+
+ List allParcels = m_Scene.LandChannel.AllParcels();
+ if (showdetail)
+ parcelsInfo = new List(allParcels.Count);
+
+ for (int p = 0; p < allParcels.Count; ++p)
+ {
+ ILandObject parcel = allParcels[p];
+ landdata = parcel.LandData;
+ if (landdata == null)
+ continue;
+ if(ownerparcels && landdata.OwnerID != parcelOwner)
+ continue;
+
+ ++nparcels;
+
+ if(showdetail)
+ {
+ ParcelScriptInfo pi = new ParcelScriptInfo
+ {
+ name = landdata.Name,
+ localID = landdata.LocalID
+
+ };
+ }
+ ISceneObject[] isops = parcel.GetSceneObjectGroups();
+ for(int i = 0; i < isops.Length; ++i)
+ {
+ SceneObjectGroup so = isops[i] as SceneObjectGroup;
+ if(so == null || so.IsDeleted || so.inTransit || so.IsAttachment)
+ continue;
+
+ int mem = so.ScriptsMemory();
+ int urls_used = 0;
+ totalmem += mem;
+ if (urlModule != null)
+ {
+ urls_used = urlModule.GetUrlCount(so.UUID);
+ totalurls += urls_used;
+ }
+ }
+ }
+ landdata = null;
+
+ StringBuilder lsl = LLSDxmlEncode.Start();
+ LLSDxmlEncode.AddMap(lsl);
+
+ string baseurl = m_HostCapsObj.SSLCaps ? "https://" : "http://";
+ baseurl += m_HostCapsObj.HostName + ":" + m_HostCapsObj.Port.ToString();
+
+ string SRSPath = GetNewCapPath();
+ ScriptResourceSummary srs =
+ new ScriptResourceSummary(m_Scene, m_AgentID, m_HostCapsObj.HttpListener, SRSPath, httpRequest.RemoteIPEndPoint.Address,
+ totalmem, totalurls);
+ m_HostCapsObj.HttpListener.AddSimpleStreamHandler(new SimpleStreamHandler(SRSPath, srs.ScriptResourceSummaryCap));
+ string SRSURL = baseurl + SRSPath;
+ LLSDxmlEncode.AddElem("ScriptResourceSummary", SRSURL, lsl);
+
+ if(showdetail)
+ {
+ string SRDPath = GetNewCapPath();
+ string SRDURL = baseurl + SRDPath;
+ ScriptResourceDetails srd =
+ new ScriptResourceDetails(m_Scene, m_AgentID, m_HostCapsObj.HttpListener, SRDPath, httpRequest.RemoteIPEndPoint.Address,
+ parcelsInfo);
+ m_HostCapsObj.HttpListener.AddSimpleStreamHandler(new SimpleStreamHandler(SRDPath, srd.ScriptResourceDetailsCap));
+ LLSDxmlEncode.AddElem("ScriptResourceDetails", SRDURL, lsl);
+ }
+
+ LLSDxmlEncode.AddEndMap(lsl);
+ httpResponse.RawBuffer = LLSDxmlEncode.EndToNBBytes(lsl);
+ httpResponse.StatusCode = (int)HttpStatusCode.OK;
+ return;
}
public void ResourceCostSelected(IOSHttpRequest httpRequest, IOSHttpResponse httpResponse, OSDMap req)
@@ -2210,227 +2319,341 @@ namespace OpenSim.Region.ClientStack.Linden
httpResponse.ContentType = "application/llsd+xml";
httpResponse.StatusCode = (int)HttpStatusCode.OK;
}
- }
- public class AssetUploader
- {
- private static readonly ILog m_log =
- LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
-
-
- public event UpLoadedAsset OnUpLoad;
- private UpLoadedAsset handlerUpLoad = null;
-
- private string uploaderPath = String.Empty;
- private UUID newAssetID;
- private UUID inventoryItemID;
- private UUID parentFolder;
- private IHttpServer httpListener;
- private bool m_dumpAssetsToFile;
- private string m_assetName = String.Empty;
- private string m_assetDes = String.Empty;
-
- private string m_invType = String.Empty;
- private string m_assetType = String.Empty;
- private int m_cost;
- private string m_error = String.Empty;
-
- private Timer m_timeoutTimer = new Timer();
- private UUID m_texturesFolder;
- private int m_nreqtextures;
- private int m_nreqmeshs;
- private int m_nreqinstances;
- private bool m_IsAtestUpload;
-
- private int m_nextOwnerMask;
- private int m_groupMask;
- private int m_everyoneMask;
- private int[] m_meshesSides;
-
- public AssetUploader(string assetName, string description, UUID assetID, UUID inventoryItem,
- UUID parentFolderID, string invType, string assetType, string path,
- IHttpServer httpServer, bool dumpAssetsToFile,
- int totalCost, UUID texturesFolder, int nreqtextures, int nreqmeshs, int nreqinstances,
- bool IsAtestUpload, int nextOwnerMask, int groupMask, int everyoneMask, int[] meshesSides)
+ public class AssetUploader
{
- m_assetName = assetName;
- m_assetDes = description;
- newAssetID = assetID;
- inventoryItemID = inventoryItem;
- uploaderPath = path;
- httpListener = httpServer;
- parentFolder = parentFolderID;
- m_assetType = assetType;
- m_invType = invType;
- m_dumpAssetsToFile = dumpAssetsToFile;
- m_cost = totalCost;
+ private static readonly ILog m_log =
+ LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
- m_texturesFolder = texturesFolder;
- m_nreqtextures = nreqtextures;
- m_nreqmeshs = nreqmeshs;
- m_nreqinstances = nreqinstances;
- m_IsAtestUpload = IsAtestUpload;
- m_timeoutTimer.Elapsed += TimedOut;
- m_timeoutTimer.Interval = 120000;
- m_timeoutTimer.AutoReset = false;
- m_timeoutTimer.Start();
+ public event UpLoadedAsset OnUpLoad;
+ private UpLoadedAsset handlerUpLoad = null;
- m_nextOwnerMask = nextOwnerMask;
- m_groupMask = groupMask;
- m_everyoneMask = everyoneMask;
+ private string uploaderPath = String.Empty;
+ private UUID newAssetID;
+ private UUID inventoryItemID;
+ private UUID parentFolder;
+ private IHttpServer httpListener;
+ private bool m_dumpAssetsToFile;
+ private string m_assetName = String.Empty;
+ private string m_assetDes = String.Empty;
- m_meshesSides = meshesSides;
- }
+ private string m_invType = String.Empty;
+ private string m_assetType = String.Empty;
+ private int m_cost;
+ private string m_error = String.Empty;
- ///
- /// Handle raw asset upload data via the capability.
- ///
- ///
- ///
- ///
- ///
- public string uploaderCaps(byte[] data, string path, string param)
- {
- UUID inv = inventoryItemID;
- string res = String.Empty;
- LLSDAssetUploadComplete uploadComplete = new LLSDAssetUploadComplete();
-/*
- uploadComplete.new_asset = newAssetID.ToString();
- uploadComplete.new_inventory_item = inv;
- uploadComplete.state = "complete";
+ private Timer m_timeoutTimer = new Timer();
+ private UUID m_texturesFolder;
+ private int m_nreqtextures;
+ private int m_nreqmeshs;
+ private int m_nreqinstances;
+ private bool m_IsAtestUpload;
- res = LLSDHelpers.SerialiseLLSDReply(uploadComplete);
-*/
- m_timeoutTimer.Stop();
- httpListener.RemoveStreamHandler("POST", uploaderPath);
+ private int m_nextOwnerMask;
+ private int m_groupMask;
+ private int m_everyoneMask;
+ private int[] m_meshesSides;
- // TODO: probably make this a better set of extensions here
- string extension = ".jp2";
- if (m_invType != "image")
+ public AssetUploader(string assetName, string description, UUID assetID, UUID inventoryItem,
+ UUID parentFolderID, string invType, string assetType, string path,
+ IHttpServer httpServer, bool dumpAssetsToFile,
+ int totalCost, UUID texturesFolder, int nreqtextures, int nreqmeshs, int nreqinstances,
+ bool IsAtestUpload, int nextOwnerMask, int groupMask, int everyoneMask, int[] meshesSides)
{
- extension = ".dat";
+ m_assetName = assetName;
+ m_assetDes = description;
+ newAssetID = assetID;
+ inventoryItemID = inventoryItem;
+ uploaderPath = path;
+ httpListener = httpServer;
+ parentFolder = parentFolderID;
+ m_assetType = assetType;
+ m_invType = invType;
+ m_dumpAssetsToFile = dumpAssetsToFile;
+ m_cost = totalCost;
+
+ m_texturesFolder = texturesFolder;
+ m_nreqtextures = nreqtextures;
+ m_nreqmeshs = nreqmeshs;
+ m_nreqinstances = nreqinstances;
+ m_IsAtestUpload = IsAtestUpload;
+
+ m_timeoutTimer.Elapsed += TimedOut;
+ m_timeoutTimer.Interval = 120000;
+ m_timeoutTimer.AutoReset = false;
+ m_timeoutTimer.Start();
+
+ m_nextOwnerMask = nextOwnerMask;
+ m_groupMask = groupMask;
+ m_everyoneMask = everyoneMask;
+
+ m_meshesSides = meshesSides;
}
- if (m_dumpAssetsToFile)
- {
- SaveAssetToFile(m_assetName + extension, data);
- }
- handlerUpLoad = OnUpLoad;
- if (handlerUpLoad != null)
- {
- handlerUpLoad(m_assetName, m_assetDes, newAssetID, inv, parentFolder, data, m_invType, m_assetType,
- m_cost, m_texturesFolder, m_nreqtextures, m_nreqmeshs, m_nreqinstances, m_IsAtestUpload,
- ref m_error, ref m_nextOwnerMask, ref m_groupMask, ref m_everyoneMask, m_meshesSides);
- }
-
- uploadComplete.new_next_owner_mask = m_nextOwnerMask;
- uploadComplete.new_group_mask = m_groupMask;
- uploadComplete.new_everyone_mask = m_everyoneMask;
-
- if (m_error == String.Empty)
+ ///
+ /// Handle raw asset upload data via the capability.
+ ///
+ ///
+ ///
+ ///
+ ///
+ public string uploaderCaps(byte[] data, string path, string param)
{
+ UUID inv = inventoryItemID;
+ string res = String.Empty;
+ LLSDAssetUploadComplete uploadComplete = new LLSDAssetUploadComplete();
+ /*
uploadComplete.new_asset = newAssetID.ToString();
uploadComplete.new_inventory_item = inv;
- // if (m_texturesFolder != UUID.Zero)
- // uploadComplete.new_texture_folder_id = m_texturesFolder;
- if (m_IsAtestUpload)
- {
- LLSDAssetUploadError resperror = new LLSDAssetUploadError();
- resperror.message = "Upload SUCCESSFUL for testing purposes only. Other uses are prohibited. Item will not work after 48 hours or on other regions";
- resperror.identifier = inv;
+ uploadComplete.state = "complete";
+
+ res = LLSDHelpers.SerialiseLLSDReply(uploadComplete);
+ */
+ m_timeoutTimer.Stop();
+ httpListener.RemoveStreamHandler("POST", uploaderPath);
+
+ // TODO: probably make this a better set of extensions here
+ string extension = ".jp2";
+ if (m_invType != "image")
+ {
+ extension = ".dat";
+ }
+
+ if (m_dumpAssetsToFile)
+ {
+ SaveAssetToFile(m_assetName + extension, data);
+ }
+ handlerUpLoad = OnUpLoad;
+ if (handlerUpLoad != null)
+ {
+ handlerUpLoad(m_assetName, m_assetDes, newAssetID, inv, parentFolder, data, m_invType, m_assetType,
+ m_cost, m_texturesFolder, m_nreqtextures, m_nreqmeshs, m_nreqinstances, m_IsAtestUpload,
+ ref m_error, ref m_nextOwnerMask, ref m_groupMask, ref m_everyoneMask, m_meshesSides);
+ }
+
+ uploadComplete.new_next_owner_mask = m_nextOwnerMask;
+ uploadComplete.new_group_mask = m_groupMask;
+ uploadComplete.new_everyone_mask = m_everyoneMask;
+
+ if (m_error == String.Empty)
+ {
+ uploadComplete.new_asset = newAssetID.ToString();
+ uploadComplete.new_inventory_item = inv;
+ // if (m_texturesFolder != UUID.Zero)
+ // uploadComplete.new_texture_folder_id = m_texturesFolder;
+ if (m_IsAtestUpload)
+ {
+ LLSDAssetUploadError resperror = new LLSDAssetUploadError();
+ resperror.message = "Upload SUCCESSFUL for testing purposes only. Other uses are prohibited. Item will not work after 48 hours or on other regions";
+ resperror.identifier = inv;
- uploadComplete.error = resperror;
- }
- uploadComplete.state = "complete";
+ uploadComplete.error = resperror;
+ }
+ uploadComplete.state = "complete";
+ }
+ else
+ {
+ LLSDAssetUploadError resperror = new LLSDAssetUploadError();
+ resperror.message = m_error;
+ resperror.identifier = inv;
+
+ uploadComplete.error = resperror;
+ uploadComplete.state = "failed";
+ }
+
+ res = LLSDHelpers.SerialiseLLSDReply(uploadComplete);
+ return res;
}
- else
+
+ private void TimedOut(object sender, ElapsedEventArgs args)
{
- LLSDAssetUploadError resperror = new LLSDAssetUploadError();
- resperror.message = m_error;
- resperror.identifier = inv;
-
- uploadComplete.error = resperror;
- uploadComplete.state = "failed";
+ m_log.InfoFormat("[CAPS]: Removing URL and handler for timed out mesh upload");
+ httpListener.RemoveStreamHandler("POST", uploaderPath);
}
- res = LLSDHelpers.SerialiseLLSDReply(uploadComplete);
- return res;
- }
-
- private void TimedOut(object sender, ElapsedEventArgs args)
- {
- m_log.InfoFormat("[CAPS]: Removing URL and handler for timed out mesh upload");
- httpListener.RemoveStreamHandler("POST", uploaderPath);
- }
-
- private static void SaveAssetToFile(string filename, byte[] data)
- {
- string assetPath = "UserAssets";
- if (!Directory.Exists(assetPath))
+ private static void SaveAssetToFile(string filename, byte[] data)
{
- Directory.CreateDirectory(assetPath);
+ string assetPath = "UserAssets";
+ if (!Directory.Exists(assetPath))
+ {
+ Directory.CreateDirectory(assetPath);
+ }
+ FileStream fs = File.Create(Path.Combine(assetPath, Util.SafeFileName(filename)));
+ BinaryWriter bw = new BinaryWriter(fs);
+ bw.Write(data);
+ bw.Close();
+ fs.Close();
}
- FileStream fs = File.Create(Path.Combine(assetPath, Util.SafeFileName(filename)));
- BinaryWriter bw = new BinaryWriter(fs);
- bw.Write(data);
- bw.Close();
- fs.Close();
- }
- }
-
- public class ScriptResourceSummary
- {
- private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
-
- private IHttpServer m_httpListener;
- private string m_mypath;
- private int m_parcelID;
- private Scene m_scene;
- private Timer m_timeoutTimer;
-
- private IPAddress m_address;
-
- public ScriptResourceSummary(int parcelID, Scene scene, IHttpServer httpServer, string path, IPAddress address)
- {
- m_httpListener = httpServer;
- m_address = address;
- m_mypath = path;
- m_scene = scene;
- m_parcelID = parcelID;
-
- m_timeoutTimer = new Timer();
- m_timeoutTimer.Elapsed += TimedOut;
- m_timeoutTimer.Interval = 10000;
- m_timeoutTimer.AutoReset = false;
- m_timeoutTimer.Start();
}
- ///
- /// Handle raw asset upload data via the capability.
- ///
- ///
- ///
- ///
- ///
- public void ScriptResourceSummaryCap(IOSHttpRequest request, IOSHttpResponse response)
+ public class ScriptResourceSummary
{
- m_timeoutTimer.Stop();
- m_httpListener.RemoveSimpleStreamHandler(m_mypath);
- m_timeoutTimer.Dispose();
+ private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
- if (request.RemoteIPEndPoint.Address != m_address)
+ private IHttpServer m_httpListener;
+ private string m_mypath;
+ private Scene m_scene;
+ private Timer m_timeoutTimer;
+ private UUID m_agentID;
+ private int m_memory;
+ private int m_urls;
+ private IPAddress m_address;
+
+ public ScriptResourceSummary(Scene scene, UUID agentID, IHttpServer httpServer, string path, IPAddress address,
+ int memory, int urls)
{
- response.StatusCode = (int)HttpStatusCode.Unauthorized;
- return;
+ m_httpListener = httpServer;
+ m_address = address;
+ m_mypath = path;
+ m_scene = scene;
+ m_agentID = agentID;
+ m_memory = memory;
+ m_urls = urls;
+
+ m_timeoutTimer = new Timer();
+ m_timeoutTimer.Elapsed += TimedOut;
+ m_timeoutTimer.Interval = 30000;
+ m_timeoutTimer.AutoReset = false;
+ m_timeoutTimer.Start();
+ }
+
+ ///
+ /// Handle raw asset upload data via the capability.
+ ///
+ ///
+ ///
+ ///
+ ///
+ public void ScriptResourceSummaryCap(IOSHttpRequest request, IOSHttpResponse response)
+ {
+ m_timeoutTimer.Stop();
+ m_httpListener.RemoveSimpleStreamHandler(m_mypath);
+ m_timeoutTimer.Dispose();
+
+ if (!request.RemoteIPEndPoint.Address.Equals(m_address))
+ {
+ response.StatusCode = (int)HttpStatusCode.Unauthorized;
+ return;
+ }
+
+ if (m_scene.ShuttingDown || !m_scene.TryGetScenePresence(m_agentID, out ScenePresence sp) || sp.IsChildAgent || sp.IsInTransit)
+ {
+ response.StatusCode = (int)HttpStatusCode.Unauthorized;
+ return;
+ }
+
+ StringBuilder sb = LLSDxmlEncode.Start();
+ LLSDxmlEncode.AddMap(sb);
+
+ LLSDxmlEncode.AddMap("summary", sb);
+ LLSDxmlEncode.AddArray("available", sb);
+
+ int maxurls = m_urls + 5000; // we don't limit this
+ LLSDxmlEncode.AddMap(sb);
+ LLSDxmlEncode.AddElem("amount", maxurls, sb);
+ LLSDxmlEncode.AddElem("type", "urls", sb);
+ LLSDxmlEncode.AddEndMap(sb);
+
+ LLSDxmlEncode.AddMap(sb);
+ LLSDxmlEncode.AddElem("amount", (int)-1, sb);
+ LLSDxmlEncode.AddElem("type", "memory", sb);
+ LLSDxmlEncode.AddEndMap(sb);
+
+ LLSDxmlEncode.AddEndArray(sb); //available
+
+ LLSDxmlEncode.AddArray("used", sb);
+
+ LLSDxmlEncode.AddMap(sb);
+ LLSDxmlEncode.AddElem("amount", m_urls, sb);
+ LLSDxmlEncode.AddElem("type", "urls", sb);
+ LLSDxmlEncode.AddEndMap(sb);
+
+ LLSDxmlEncode.AddMap(sb);
+ LLSDxmlEncode.AddElem("amount", m_memory, sb);
+ LLSDxmlEncode.AddElem("type", "memory", sb);
+ LLSDxmlEncode.AddEndMap(sb);
+
+ LLSDxmlEncode.AddEndArray(sb); //used
+
+ LLSDxmlEncode.AddEndMap(sb); // summary
+ LLSDxmlEncode.AddEndMap(sb);
+ response.RawBuffer = LLSDxmlEncode.EndToNBBytes(sb);
+ response.StatusCode = (int)HttpStatusCode.OK;
+ }
+
+ private void TimedOut(object sender, ElapsedEventArgs args)
+ {
+ m_httpListener.RemoveSimpleStreamHandler(m_mypath);
+ m_log.InfoFormat("[CAPS]: Removing URL and handler for timed out ScriptResourceSummary");
+ m_timeoutTimer.Dispose();
}
}
- private void TimedOut(object sender, ElapsedEventArgs args)
+ public class ScriptResourceDetails
{
- m_httpListener.RemoveSimpleStreamHandler(m_mypath);
- m_log.InfoFormat("[CAPS]: Removing URL and handler for timed out ScriptResourceSummary");
- m_timeoutTimer.Dispose();
+ private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
+
+ private IHttpServer m_httpListener;
+ private string m_mypath;
+ private Scene m_scene;
+ private Timer m_timeoutTimer;
+ private UUID m_agentID;
+ private List m_parcelsInfo;
+
+ private IPAddress m_address;
+
+ public ScriptResourceDetails(Scene scene, UUID agentID, IHttpServer httpServer, string path, IPAddress address,
+ List parcelsInfo)
+ {
+ m_httpListener = httpServer;
+ m_address = address;
+ m_mypath = path;
+ m_scene = scene;
+ m_agentID = agentID;
+ m_parcelsInfo = parcelsInfo;
+
+ m_timeoutTimer = new Timer();
+ m_timeoutTimer.Elapsed += TimedOut;
+ m_timeoutTimer.Interval = 30000;
+ m_timeoutTimer.AutoReset = false;
+ m_timeoutTimer.Start();
+ }
+
+ ///
+ /// Handle raw asset upload data via the capability.
+ ///
+ ///
+ ///
+ ///
+ ///
+ public void ScriptResourceDetailsCap(IOSHttpRequest request, IOSHttpResponse response)
+ {
+ m_timeoutTimer.Stop();
+ m_httpListener.RemoveSimpleStreamHandler(m_mypath);
+ m_timeoutTimer.Dispose();
+
+ if (!request.RemoteIPEndPoint.Address.Equals(m_address))
+ {
+ response.StatusCode = (int)HttpStatusCode.Unauthorized;
+ return;
+ }
+
+ if (m_scene.ShuttingDown || !m_scene.TryGetScenePresence(m_agentID, out ScenePresence sp) || sp.IsChildAgent || sp.IsInTransit)
+ {
+ response.StatusCode = (int)HttpStatusCode.Unauthorized;
+ return;
+ }
+
+ response.StatusCode = (int)HttpStatusCode.OK;
+ }
+
+ private void TimedOut(object sender, ElapsedEventArgs args)
+ {
+ m_httpListener.RemoveSimpleStreamHandler(m_mypath);
+ m_log.InfoFormat("[CAPS]: Removing URL and handler for timed out ScriptResourceSummary");
+ m_timeoutTimer.Dispose();
+ }
}
}
}
\ No newline at end of file
diff --git a/OpenSim/Region/CoreModules/World/Land/LandChannel.cs b/OpenSim/Region/CoreModules/World/Land/LandChannel.cs
index 29d11a3df4..35e6334a6c 100644
--- a/OpenSim/Region/CoreModules/World/Land/LandChannel.cs
+++ b/OpenSim/Region/CoreModules/World/Land/LandChannel.cs
@@ -148,6 +148,15 @@ namespace OpenSim.Region.CoreModules.World.Land
return obj;
}
+ public ILandObject GetLandObjectClipedXY(float x, float y)
+ {
+ if (m_landManagementModule != null)
+ {
+ return m_landManagementModule.GetLandObjectClipedXY(x, y);
+ }
+ return null;
+ }
+
public List AllParcels()
{
if (m_landManagementModule != null)
diff --git a/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs b/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs
index 6bf227bc33..0e445f1e85 100755
--- a/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs
+++ b/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs
@@ -2146,7 +2146,7 @@ namespace OpenSim.Region.CoreModules.World.Land
// for this region or for somewhere else?
if (extLandData.RegionHandle == m_scene.RegionInfo.RegionHandle)
{
- ILandObject extLandObject = GetLandObject(extLandData.X, extLandData.Y);
+ ILandObject extLandObject = GetLandObjectClipedXY(extLandData.X, extLandData.Y);
if (extLandObject == null)
break;
diff --git a/OpenSim/Tests/Common/Mock/TestLandChannel.cs b/OpenSim/Tests/Common/Mock/TestLandChannel.cs
index 87215ad4de..5cd7c12063 100644
--- a/OpenSim/Tests/Common/Mock/TestLandChannel.cs
+++ b/OpenSim/Tests/Common/Mock/TestLandChannel.cs
@@ -93,6 +93,11 @@ namespace OpenSim.Tests.Common
return GetNoLand();
}
+ public ILandObject GetLandObjectClipedXY(float x, float y)
+ {
+ return GetNoLand();
+ }
+
public ILandObject GetLandObject(int localID)
{
return GetNoLand();