Merge branch 'master' of /home/opensim/var/repo/opensim

integration
BlueWall 2012-05-23 14:21:47 -04:00
commit a73a5be0c5
14 changed files with 468 additions and 208 deletions

View File

@ -0,0 +1,112 @@
/*
* 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 System.Collections.Generic;
using System.Linq;
using System.Text;
namespace OpenSim.Framework.Console
{
/// <summary>
/// Used to generated a formatted table for the console.
/// </summary>
/// <remarks>
/// Currently subject to change. If you use this, be prepared to change your code when this class changes.
/// </remarks>
public class ConsoleDisplayList
{
/// <summary>
/// The default divider between key and value for a list item.
/// </summary>
public const string DefaultKeyValueDivider = " : ";
/// <summary>
/// The divider used between key and value for a list item.
/// </summary>
public string KeyValueDivider { get; set; }
/// <summary>
/// Table rows
/// </summary>
public List<KeyValuePair<string, string>> Rows { get; private set; }
/// <summary>
/// Number of spaces to indent the list.
/// </summary>
public int Indent { get; set; }
public ConsoleDisplayList()
{
Rows = new List<KeyValuePair<string, string>>();
KeyValueDivider = DefaultKeyValueDivider;
}
public override string ToString()
{
StringBuilder sb = new StringBuilder();
AddToStringBuilder(sb);
return sb.ToString();
}
public void AddToStringBuilder(StringBuilder sb)
{
string formatString = GetFormatString();
// System.Console.WriteLine("FORMAT STRING [{0}]", formatString);
// rows
foreach (KeyValuePair<string, string> row in Rows)
sb.AppendFormat(formatString, row.Key, row.Value);
}
/// <summary>
/// Gets the format string for the table.
/// </summary>
private string GetFormatString()
{
StringBuilder formatSb = new StringBuilder();
int longestKey = -1;
foreach (KeyValuePair<string, string> row in Rows)
if (row.Key.Length > longestKey)
longestKey = row.Key.Length;
formatSb.Append(' ', Indent);
// Can only do left formatting for now
formatSb.AppendFormat("{{0,-{0}}}{1}{{1}}\n", longestKey, KeyValueDivider);
return formatSb.ToString();
}
public void AddRow(object key, object value)
{
Rows.Add(new KeyValuePair<string, string>(key.ToString(), value.ToString()));
}
}
}

View File

@ -38,7 +38,7 @@ namespace OpenSim.Framework.Console
/// <remarks> /// <remarks>
/// Currently subject to change. If you use this, be prepared to change your code when this class changes. /// Currently subject to change. If you use this, be prepared to change your code when this class changes.
/// </remarks> /// </remarks>
public class ConsoleTable public class ConsoleDisplayTable
{ {
/// <summary> /// <summary>
/// Default number of spaces between table columns. /// Default number of spaces between table columns.
@ -48,12 +48,12 @@ namespace OpenSim.Framework.Console
/// <summary> /// <summary>
/// Table columns. /// Table columns.
/// </summary> /// </summary>
public List<ConsoleTableColumn> Columns { get; private set; } public List<ConsoleDisplayTableColumn> Columns { get; private set; }
/// <summary> /// <summary>
/// Table rows /// Table rows
/// </summary> /// </summary>
public List<ConsoleTableRow> Rows { get; private set; } public List<ConsoleDisplayTableRow> Rows { get; private set; }
/// <summary> /// <summary>
/// Number of spaces to indent the table. /// Number of spaces to indent the table.
@ -65,11 +65,11 @@ namespace OpenSim.Framework.Console
/// </summary> /// </summary>
public int TableSpacing { get; set; } public int TableSpacing { get; set; }
public ConsoleTable() public ConsoleDisplayTable()
{ {
TableSpacing = DefaultTableSpacing; TableSpacing = DefaultTableSpacing;
Columns = new List<ConsoleTableColumn>(); Columns = new List<ConsoleDisplayTableColumn>();
Rows = new List<ConsoleTableRow>(); Rows = new List<ConsoleDisplayTableRow>();
} }
public override string ToString() public override string ToString()
@ -88,7 +88,7 @@ namespace OpenSim.Framework.Console
sb.AppendFormat(formatString, Columns.ConvertAll(c => c.Header).ToArray()); sb.AppendFormat(formatString, Columns.ConvertAll(c => c.Header).ToArray());
// rows // rows
foreach (ConsoleTableRow row in Rows) foreach (ConsoleDisplayTableRow row in Rows)
sb.AppendFormat(formatString, row.Cells.ToArray()); sb.AppendFormat(formatString, row.Cells.ToArray());
} }
@ -115,23 +115,23 @@ namespace OpenSim.Framework.Console
} }
} }
public struct ConsoleTableColumn public struct ConsoleDisplayTableColumn
{ {
public string Header { get; set; } public string Header { get; set; }
public int Width { get; set; } public int Width { get; set; }
public ConsoleTableColumn(string header, int width) : this() public ConsoleDisplayTableColumn(string header, int width) : this()
{ {
Header = header; Header = header;
Width = width; Width = width;
} }
} }
public struct ConsoleTableRow public struct ConsoleDisplayTableRow
{ {
public List<string> Cells { get; private set; } public List<string> Cells { get; private set; }
public ConsoleTableRow(List<string> cells) : this() public ConsoleDisplayTableRow(List<string> cells) : this()
{ {
Cells = cells; Cells = cells;
} }

View File

@ -49,6 +49,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
private Scene m_scene; private Scene m_scene;
private IDialogModule m_dialogModule; private IDialogModule m_dialogModule;
private IInventoryAccessModule m_invAccessModule;
/// <summary> /// <summary>
/// Are attachments enabled? /// Are attachments enabled?
@ -70,7 +71,6 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
public void AddRegion(Scene scene) public void AddRegion(Scene scene)
{ {
m_scene = scene; m_scene = scene;
m_dialogModule = m_scene.RequestModuleInterface<IDialogModule>();
m_scene.RegisterModuleInterface<IAttachmentsModule>(this); m_scene.RegisterModuleInterface<IAttachmentsModule>(this);
if (Enabled) if (Enabled)
@ -87,7 +87,11 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
m_scene.EventManager.OnNewClient -= SubscribeToClientEvents; m_scene.EventManager.OnNewClient -= SubscribeToClientEvents;
} }
public void RegionLoaded(Scene scene) {} public void RegionLoaded(Scene scene)
{
m_dialogModule = m_scene.RequestModuleInterface<IDialogModule>();
m_invAccessModule = m_scene.RequestModuleInterface<IInventoryAccessModule>();
}
public void Close() public void Close()
{ {
@ -578,90 +582,23 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
/// <returns>The user inventory item created that holds the attachment.</returns> /// <returns>The user inventory item created that holds the attachment.</returns>
private InventoryItemBase AddSceneObjectAsNewAttachmentInInv(IScenePresence sp, SceneObjectGroup grp) private InventoryItemBase AddSceneObjectAsNewAttachmentInInv(IScenePresence sp, SceneObjectGroup grp)
{ {
if (m_invAccessModule == null)
return null;
// m_log.DebugFormat( // m_log.DebugFormat(
// "[ATTACHMENTS MODULE]: Called AddSceneObjectAsAttachment for object {0} {1} for {2}", // "[ATTACHMENTS MODULE]: Called AddSceneObjectAsAttachment for object {0} {1} for {2}",
// grp.Name, grp.LocalId, remoteClient.Name); // grp.Name, grp.LocalId, remoteClient.Name);
Vector3 inventoryStoredPosition = new Vector3 InventoryItemBase newItem = m_invAccessModule.CopyToInventory(
(((grp.AbsolutePosition.X > (int)Constants.RegionSize) DeRezAction.TakeCopy,
? Constants.RegionSize - 6 m_scene.InventoryService.GetFolderForType(sp.UUID, AssetType.Object).ID,
: grp.AbsolutePosition.X) new List<SceneObjectGroup> { grp },
, sp.ControllingClient, true)[0];
(grp.AbsolutePosition.Y > (int)Constants.RegionSize)
? Constants.RegionSize - 6
: grp.AbsolutePosition.Y,
grp.AbsolutePosition.Z);
Vector3 originalPosition = grp.AbsolutePosition;
grp.AbsolutePosition = inventoryStoredPosition;
// If we're being called from a script, then trying to serialize that same script's state will not complete
// in any reasonable time period. Therefore, we'll avoid it. The worst that can happen is that if
// the client/server crashes rather than logging out normally, the attachment's scripts will resume
// without state on relog. Arguably, this is what we want anyway.
string sceneObjectXml = SceneObjectSerializer.ToOriginalXmlFormat(grp, false);
grp.AbsolutePosition = originalPosition;
AssetBase asset = m_scene.CreateAsset(
grp.GetPartName(grp.LocalId),
grp.GetPartDescription(grp.LocalId),
(sbyte)AssetType.Object,
Utils.StringToBytes(sceneObjectXml),
sp.UUID);
m_scene.AssetService.Store(asset);
InventoryItemBase item = new InventoryItemBase();
item.CreatorId = grp.RootPart.CreatorID.ToString();
item.CreatorData = grp.RootPart.CreatorData;
item.Owner = sp.UUID;
item.ID = UUID.Random();
item.AssetID = asset.FullID;
item.Description = asset.Description;
item.Name = asset.Name;
item.AssetType = asset.Type;
item.InvType = (int)InventoryType.Object;
InventoryFolderBase folder = m_scene.InventoryService.GetFolderForType(sp.UUID, AssetType.Object);
if (folder != null)
item.Folder = folder.ID;
else // oopsies
item.Folder = UUID.Zero;
if ((sp.UUID != grp.RootPart.OwnerID) && m_scene.Permissions.PropagatePermissions())
{
item.BasePermissions = grp.RootPart.NextOwnerMask;
item.CurrentPermissions = grp.RootPart.NextOwnerMask;
item.NextPermissions = grp.RootPart.NextOwnerMask;
item.EveryOnePermissions = grp.RootPart.EveryoneMask & grp.RootPart.NextOwnerMask;
item.GroupPermissions = grp.RootPart.GroupMask & grp.RootPart.NextOwnerMask;
}
else
{
item.BasePermissions = grp.RootPart.BaseMask;
item.CurrentPermissions = grp.RootPart.OwnerMask;
item.NextPermissions = grp.RootPart.NextOwnerMask;
item.EveryOnePermissions = grp.RootPart.EveryoneMask;
item.GroupPermissions = grp.RootPart.GroupMask;
}
item.CreationDate = Util.UnixTimeSinceEpoch();
// sets itemID so client can show item as 'attached' in inventory // sets itemID so client can show item as 'attached' in inventory
grp.FromItemID = item.ID; grp.FromItemID = newItem.ID;
if (m_scene.AddInventoryItem(item)) return newItem;
{
sp.ControllingClient.SendInventoryItemCreateUpdate(item, 0);
}
else
{
if (m_dialogModule != null)
m_dialogModule.SendAlertToUser(sp.ControllingClient, "Operation failed");
}
return item;
} }
// What makes this method odd and unique is it tries to detach using an UUID.... Yay for standards. // What makes this method odd and unique is it tries to detach using an UUID.... Yay for standards.
@ -709,19 +646,19 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
private SceneObjectGroup RezSingleAttachmentFromInventoryInternal( private SceneObjectGroup RezSingleAttachmentFromInventoryInternal(
IScenePresence sp, UUID itemID, UUID assetID, uint attachmentPt) IScenePresence sp, UUID itemID, UUID assetID, uint attachmentPt)
{ {
IInventoryAccessModule invAccess = m_scene.RequestModuleInterface<IInventoryAccessModule>(); if (m_invAccessModule == null)
if (invAccess != null) return null;
{
lock (sp.AttachmentsSyncLock) lock (sp.AttachmentsSyncLock)
{ {
SceneObjectGroup objatt; SceneObjectGroup objatt;
if (itemID != UUID.Zero) if (itemID != UUID.Zero)
objatt = invAccess.RezObject(sp.ControllingClient, objatt = m_invAccessModule.RezObject(sp.ControllingClient,
itemID, Vector3.Zero, Vector3.Zero, UUID.Zero, (byte)1, true, itemID, Vector3.Zero, Vector3.Zero, UUID.Zero, (byte)1, true,
false, false, sp.UUID, true); false, false, sp.UUID, true);
else else
objatt = invAccess.RezObject(sp.ControllingClient, objatt = m_invAccessModule.RezObject(sp.ControllingClient,
null, assetID, Vector3.Zero, Vector3.Zero, UUID.Zero, (byte)1, true, null, assetID, Vector3.Zero, Vector3.Zero, UUID.Zero, (byte)1, true,
false, false, sp.UUID, true); false, false, sp.UUID, true);
@ -774,7 +711,6 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
itemID, sp.Name, attachmentPt); itemID, sp.Name, attachmentPt);
} }
} }
}
return null; return null;
} }

View File

@ -99,12 +99,12 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests
public void TestAddAttachmentFromGround() public void TestAddAttachmentFromGround()
{ {
TestHelpers.InMethod(); TestHelpers.InMethod();
// log4net.Config.XmlConfigurator.Configure(); // TestHelpers.EnableLogging();
AddPresence(); AddPresence();
string attName = "att"; string attName = "att";
SceneObjectGroup so = SceneHelpers.AddSceneObject(scene, attName).ParentGroup; SceneObjectGroup so = SceneHelpers.AddSceneObject(scene, attName, m_presence.UUID).ParentGroup;
m_attMod.AttachObject(m_presence, so, (uint)AttachmentPoint.Chest, false); m_attMod.AttachObject(m_presence, so, (uint)AttachmentPoint.Chest, false);
@ -123,6 +123,15 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests
Assert.That( Assert.That(
m_presence.Appearance.GetAttachpoint(attSo.FromItemID), m_presence.Appearance.GetAttachpoint(attSo.FromItemID),
Is.EqualTo((int)AttachmentPoint.Chest)); Is.EqualTo((int)AttachmentPoint.Chest));
InventoryItemBase attachmentItem = scene.InventoryService.GetItem(new InventoryItemBase(attSo.FromItemID));
Assert.That(attachmentItem, Is.Not.Null);
Assert.That(attachmentItem.Name, Is.EqualTo(attName));
InventoryFolderBase targetFolder = scene.InventoryService.GetFolderForType(m_presence.UUID, AssetType.Object);
Assert.That(attachmentItem.Folder, Is.EqualTo(targetFolder.ID));
// TestHelpers.DisableLogging();
} }
[Test] [Test]

View File

@ -175,7 +175,7 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
sbyte assetType, sbyte assetType,
byte wearableType, uint nextOwnerMask, int creationDate) byte wearableType, uint nextOwnerMask, int creationDate)
{ {
m_log.DebugFormat("[AGENT INVENTORY]: Received request to create inventory item {0} in folder {1}", name, folderID); m_log.DebugFormat("[INVENTORY ACCESS MODULE]: Received request to create inventory item {0} in folder {1}", name, folderID);
if (!m_Scene.Permissions.CanCreateUserInventory(invType, remoteClient.AgentId)) if (!m_Scene.Permissions.CanCreateUserInventory(invType, remoteClient.AgentId))
return; return;
@ -210,7 +210,7 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
else else
{ {
m_log.ErrorFormat( m_log.ErrorFormat(
"ScenePresence for agent uuid {0} unexpectedly not found in CreateNewInventoryItem", "[INVENTORY ACCESS MODULE]: ScenePresence for agent uuid {0} unexpectedly not found in CreateNewInventoryItem",
remoteClient.AgentId); remoteClient.AgentId);
} }
} }
@ -288,16 +288,19 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
else else
{ {
m_log.ErrorFormat( m_log.ErrorFormat(
"[AGENT INVENTORY]: Could not find item {0} for caps inventory update", "[INVENTORY ACCESS MODULE]: Could not find item {0} for caps inventory update",
itemID); itemID);
} }
return UUID.Zero; return UUID.Zero;
} }
public virtual UUID CopyToInventory(DeRezAction action, UUID folderID, public virtual List<InventoryItemBase> CopyToInventory(
List<SceneObjectGroup> objectGroups, IClientAPI remoteClient) DeRezAction action, UUID folderID,
List<SceneObjectGroup> objectGroups, IClientAPI remoteClient, bool asAttachment)
{ {
List<InventoryItemBase> copiedItems = new List<InventoryItemBase>();
Dictionary<UUID, List<SceneObjectGroup>> bundlesToCopy = new Dictionary<UUID, List<SceneObjectGroup>>(); Dictionary<UUID, List<SceneObjectGroup>> bundlesToCopy = new Dictionary<UUID, List<SceneObjectGroup>>();
if (CoalesceMultipleObjectsToInventory) if (CoalesceMultipleObjectsToInventory)
@ -324,16 +327,16 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
} }
} }
// This is method scoped and will be returned. It will be the // m_log.DebugFormat(
// last created asset id // "[INVENTORY ACCESS MODULE]: Copying {0} object bundles to folder {1} action {2} for {3}",
UUID assetID = UUID.Zero; // bundlesToCopy.Count, folderID, action, remoteClient.Name);
// Each iteration is really a separate asset being created, // Each iteration is really a separate asset being created,
// with distinct destinations as well. // with distinct destinations as well.
foreach (List<SceneObjectGroup> bundle in bundlesToCopy.Values) foreach (List<SceneObjectGroup> bundle in bundlesToCopy.Values)
assetID = CopyBundleToInventory(action, folderID, bundle, remoteClient); copiedItems.Add(CopyBundleToInventory(action, folderID, bundle, remoteClient, asAttachment));
return assetID; return copiedItems;
} }
/// <summary> /// <summary>
@ -344,12 +347,13 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
/// <param name="folderID"></param> /// <param name="folderID"></param>
/// <param name="objlist"></param> /// <param name="objlist"></param>
/// <param name="remoteClient"></param> /// <param name="remoteClient"></param>
/// <returns></returns> /// <param name="asAttachment">Should be true if the bundle is being copied as an attachment. This prevents
protected UUID CopyBundleToInventory( /// attempted serialization of any script state which would abort any operating scripts.</param>
DeRezAction action, UUID folderID, List<SceneObjectGroup> objlist, IClientAPI remoteClient) /// <returns>The inventory item created by the copy</returns>
protected InventoryItemBase CopyBundleToInventory(
DeRezAction action, UUID folderID, List<SceneObjectGroup> objlist, IClientAPI remoteClient,
bool asAttachment)
{ {
UUID assetID = UUID.Zero;
CoalescedSceneObjects coa = new CoalescedSceneObjects(UUID.Zero); CoalescedSceneObjects coa = new CoalescedSceneObjects(UUID.Zero);
Dictionary<UUID, Vector3> originalPositions = new Dictionary<UUID, Vector3>(); Dictionary<UUID, Vector3> originalPositions = new Dictionary<UUID, Vector3>();
@ -385,18 +389,27 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
string itemXml; string itemXml;
// If we're being called from a script, then trying to serialize that same script's state will not complete
// in any reasonable time period. Therefore, we'll avoid it. The worst that can happen is that if
// the client/server crashes rather than logging out normally, the attachment's scripts will resume
// without state on relog. Arguably, this is what we want anyway.
if (objlist.Count > 1) if (objlist.Count > 1)
itemXml = CoalescedSceneObjectsSerializer.ToXml(coa); itemXml = CoalescedSceneObjectsSerializer.ToXml(coa, !asAttachment);
else else
itemXml = SceneObjectSerializer.ToOriginalXmlFormat(objlist[0]); itemXml = SceneObjectSerializer.ToOriginalXmlFormat(objlist[0], !asAttachment);
// Restore the position of each group now that it has been stored to inventory. // Restore the position of each group now that it has been stored to inventory.
foreach (SceneObjectGroup objectGroup in objlist) foreach (SceneObjectGroup objectGroup in objlist)
objectGroup.AbsolutePosition = originalPositions[objectGroup.UUID]; objectGroup.AbsolutePosition = originalPositions[objectGroup.UUID];
InventoryItemBase item = CreateItemForObject(action, remoteClient, objlist[0], folderID); InventoryItemBase item = CreateItemForObject(action, remoteClient, objlist[0], folderID);
// m_log.DebugFormat(
// "[INVENTORY ACCESS MODULE]: Created item is {0}",
// item != null ? item.ID.ToString() : "NULL");
if (item == null) if (item == null)
return UUID.Zero; return null;
// Can't know creator is the same, so null it in inventory // Can't know creator is the same, so null it in inventory
if (objlist.Count > 1) if (objlist.Count > 1)
@ -407,6 +420,7 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
else else
{ {
item.CreatorId = objlist[0].RootPart.CreatorID.ToString(); item.CreatorId = objlist[0].RootPart.CreatorID.ToString();
item.CreatorData = objlist[0].RootPart.CreatorData;
item.SaleType = objlist[0].RootPart.ObjectSaleType; item.SaleType = objlist[0].RootPart.ObjectSaleType;
item.SalePrice = objlist[0].RootPart.SalePrice; item.SalePrice = objlist[0].RootPart.SalePrice;
} }
@ -420,7 +434,6 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
m_Scene.AssetService.Store(asset); m_Scene.AssetService.Store(asset);
item.AssetID = asset.FullID; item.AssetID = asset.FullID;
assetID = asset.FullID;
if (DeRezAction.SaveToExistingUserInventoryItem == action) if (DeRezAction.SaveToExistingUserInventoryItem == action)
{ {
@ -453,9 +466,9 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
// This is a hook to do some per-asset post-processing for subclasses that need that // This is a hook to do some per-asset post-processing for subclasses that need that
if (remoteClient != null) if (remoteClient != null)
ExportAsset(remoteClient.AgentId, assetID); ExportAsset(remoteClient.AgentId, asset.FullID);
return assetID; return item;
} }
protected virtual void ExportAsset(UUID agentID, UUID assetID) protected virtual void ExportAsset(UUID agentID, UUID assetID)
@ -592,7 +605,7 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
if (null == item) if (null == item)
{ {
m_log.DebugFormat( m_log.DebugFormat(
"[AGENT INVENTORY]: Object {0} {1} scheduled for save to inventory has already been deleted.", "[INVENTORY ACCESS MODULE]: Object {0} {1} scheduled for save to inventory has already been deleted.",
so.Name, so.UUID); so.Name, so.UUID);
return null; return null;
@ -643,7 +656,6 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
{ {
// Catch all. Use lost & found // Catch all. Use lost & found
// //
folder = m_Scene.InventoryService.GetFolderForType(userID, AssetType.LostAndFoundFolder); folder = m_Scene.InventoryService.GetFolderForType(userID, AssetType.LostAndFoundFolder);
} }
} }
@ -694,7 +706,7 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
if (item == null) if (item == null)
{ {
m_log.WarnFormat( m_log.WarnFormat(
"[InventoryAccessModule]: Could not find item {0} for {1} in RezObject()", "[INVENTORY ACCESS MODULE]: Could not find item {0} for {1} in RezObject()",
itemID, remoteClient.Name); itemID, remoteClient.Name);
return null; return null;
@ -726,7 +738,7 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
else else
{ {
m_log.WarnFormat( m_log.WarnFormat(
"[InventoryAccessModule]: Could not find asset {0} for {1} in RezObject()", "[INVENTORY ACCESS MODULE]: Could not find asset {0} for {1} in RezObject()",
assetID, remoteClient.Name); assetID, remoteClient.Name);
} }
@ -803,7 +815,7 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
group = objlist[i]; group = objlist[i];
// m_log.DebugFormat( // m_log.DebugFormat(
// "[InventoryAccessModule]: Preparing to rez {0} {1} {2} ownermask={3:X} nextownermask={4:X} groupmask={5:X} everyonemask={6:X} for {7}", // "[INVENTORY ACCESS MODULE]: Preparing to rez {0} {1} {2} ownermask={3:X} nextownermask={4:X} groupmask={5:X} everyonemask={6:X} for {7}",
// group.Name, group.LocalId, group.UUID, // group.Name, group.LocalId, group.UUID,
// group.RootPart.OwnerMask, group.RootPart.NextOwnerMask, group.RootPart.GroupMask, group.RootPart.EveryoneMask, // group.RootPart.OwnerMask, group.RootPart.NextOwnerMask, group.RootPart.GroupMask, group.RootPart.EveryoneMask,
// remoteClient.Name); // remoteClient.Name);
@ -811,7 +823,7 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
// Vector3 storedPosition = group.AbsolutePosition; // Vector3 storedPosition = group.AbsolutePosition;
if (group.UUID == UUID.Zero) if (group.UUID == UUID.Zero)
{ {
m_log.Debug("[InventoryAccessModule]: Object has UUID.Zero! Position 3"); m_log.Debug("[INVENTORY ACCESS MODULE]: Object has UUID.Zero! Position 3");
} }
foreach (SceneObjectPart part in group.Parts) foreach (SceneObjectPart part in group.Parts)
@ -874,7 +886,7 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
} }
// m_log.DebugFormat( // m_log.DebugFormat(
// "[InventoryAccessModule]: Rezzed {0} {1} {2} ownermask={3:X} nextownermask={4:X} groupmask={5:X} everyonemask={6:X} for {7}", // "[INVENTORY ACCESS MODULE]: Rezzed {0} {1} {2} ownermask={3:X} nextownermask={4:X} groupmask={5:X} everyonemask={6:X} for {7}",
// group.Name, group.LocalId, group.UUID, // group.Name, group.LocalId, group.UUID,
// group.RootPart.OwnerMask, group.RootPart.NextOwnerMask, group.RootPart.GroupMask, group.RootPart.EveryoneMask, // group.RootPart.OwnerMask, group.RootPart.NextOwnerMask, group.RootPart.GroupMask, group.RootPart.EveryoneMask,
// remoteClient.Name); // remoteClient.Name);
@ -964,7 +976,8 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
so.FromFolderID = item.Folder; so.FromFolderID = item.Folder;
// Console.WriteLine("rootPart.OwnedID {0}, item.Owner {1}, item.CurrentPermissions {2:X}", // m_log.DebugFormat(
// "[INVENTORY ACCESS MODULE]: rootPart.OwnedID {0}, item.Owner {1}, item.CurrentPermissions {2:X}",
// rootPart.OwnerID, item.Owner, item.CurrentPermissions); // rootPart.OwnerID, item.Owner, item.CurrentPermissions);
if ((rootPart.OwnerID != item.Owner) || if ((rootPart.OwnerID != item.Owner) ||
@ -1088,7 +1101,7 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
if (assetRequestItem.AssetID != requestID) if (assetRequestItem.AssetID != requestID)
{ {
m_log.WarnFormat( m_log.WarnFormat(
"[CLIENT]: {0} requested asset {1} from item {2} but this does not match item's asset {3}", "[INVENTORY ACCESS MODULE]: {0} requested asset {1} from item {2} but this does not match item's asset {3}",
Name, requestID, itemID, assetRequestItem.AssetID); Name, requestID, itemID, assetRequestItem.AssetID);
return false; return false;

View File

@ -0,0 +1,155 @@
/*
* 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 System.Collections.Generic;
using System.Reflection;
using System.Text;
using System.Text.RegularExpressions;
using log4net;
using Mono.Addins;
using NDesk.Options;
using Nini.Config;
using OpenMetaverse;
using OpenSim.Framework;
using OpenSim.Framework.Console;
using OpenSim.Framework.Statistics;
using OpenSim.Region.Framework.Interfaces;
using OpenSim.Region.Framework.Scenes;
namespace OpenSim.Region.CoreModules.World.Objects.Commands
{
/// <summary>
/// A module that holds commands for manipulating objects in the scene.
/// </summary>
[Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule", Id = "RegionCommandsModule")]
public class RegionCommandsModule : INonSharedRegionModule
{
private Scene m_scene;
private ICommandConsole m_console;
public string Name { get { return "Region Commands Module"; } }
public Type ReplaceableInterface { get { return null; } }
public void Initialise(IConfigSource source)
{
// m_log.DebugFormat("[REGION COMMANDS MODULE]: INITIALIZED MODULE");
}
public void PostInitialise()
{
// m_log.DebugFormat("[REGION COMMANDS MODULE]: POST INITIALIZED MODULE");
}
public void Close()
{
// m_log.DebugFormat("[REGION COMMANDS MODULE]: CLOSED MODULE");
}
public void AddRegion(Scene scene)
{
// m_log.DebugFormat("[REGION COMMANDS MODULE]: REGION {0} ADDED", scene.RegionInfo.RegionName);
m_scene = scene;
m_console = MainConsole.Instance;
m_console.Commands.AddCommand(
"Regions", false, "show scene",
"show scene",
"Show live scene information for the currently selected region.", HandleShowScene);
}
public void RemoveRegion(Scene scene)
{
// m_log.DebugFormat("[REGION COMMANDS MODULE]: REGION {0} REMOVED", scene.RegionInfo.RegionName);
}
public void RegionLoaded(Scene scene)
{
// m_log.DebugFormat("[REGION COMMANDS MODULE]: REGION {0} LOADED", scene.RegionInfo.RegionName);
}
private void HandleShowScene(string module, string[] cmd)
{
if (!(MainConsole.Instance.ConsoleScene == null || MainConsole.Instance.ConsoleScene == m_scene))
return;
SimStatsReporter r = m_scene.StatsReporter;
float[] stats = r.LastReportedSimStats;
float timeDilation = stats[0];
float simFps = stats[1];
float physicsFps = stats[2];
float agentUpdates = stats[3];
float rootAgents = stats[4];
float childAgents = stats[5];
float totalPrims = stats[6];
float activePrims = stats[7];
float totalFrameTime = stats[8];
// float netFrameTime = stats.StatsBlock[9].StatValue; // Ignored - not used by OpenSimulator
float physicsFrameTime = stats[10];
float otherFrameTime = stats[11];
// float imageFrameTime = stats.StatsBlock[12].StatValue; // Ignored
float inPacketsPerSecond = stats[13];
float outPacketsPerSecond = stats[14];
float unackedBytes = stats[15];
// float agentFrameTime = stats.StatsBlock[16].StatValue; // Not really used
float pendingDownloads = stats[17];
float pendingUploads = stats[18];
float activeScripts = stats[19];
float scriptLinesPerSecond = stats[20];
StringBuilder sb = new StringBuilder();
sb.AppendFormat("Scene statistics for {0}\n", m_scene.RegionInfo.RegionName);
ConsoleDisplayList dispList = new ConsoleDisplayList();
dispList.AddRow("Time Dilation", timeDilation);
dispList.AddRow("Sim FPS", simFps);
dispList.AddRow("Physics FPS", physicsFps);
dispList.AddRow("Avatars", rootAgents);
dispList.AddRow("Child agents", childAgents);
dispList.AddRow("Total prims", totalPrims);
dispList.AddRow("Scripts", activeScripts);
dispList.AddRow("Script lines processed per second", scriptLinesPerSecond);
dispList.AddRow("Physics enabled prims", activePrims);
dispList.AddRow("Total frame time", totalFrameTime);
dispList.AddRow("Physics frame time", physicsFrameTime);
dispList.AddRow("Other frame time", otherFrameTime);
dispList.AddRow("Agent Updates per second", agentUpdates);
dispList.AddRow("Packets processed from clients per second", inPacketsPerSecond);
dispList.AddRow("Packets sent to clients per second", outPacketsPerSecond);
dispList.AddRow("Bytes unacknowledged by clients", unackedBytes);
dispList.AddRow("Pending asset downloads to clients", pendingDownloads);
dispList.AddRow("Pending asset uploads from clients", pendingUploads);
dispList.AddToStringBuilder(sb);
MainConsole.Instance.Output(sb.ToString());
}
}
}

View File

@ -49,11 +49,15 @@ namespace OpenSim.Region.Framework.Interfaces
/// <param name="folderID"></param> /// <param name="folderID"></param>
/// <param name="objectGroups"></param> /// <param name="objectGroups"></param>
/// <param name="remoteClient"></param> /// <param name="remoteClient"></param>
/// <param name="asAttachment">
/// Should be true if the object(s) are begin taken as attachments. False otherwise.
/// </param>
/// <returns> /// <returns>
/// Returns the UUID of the newly created item asset (not the item itself). /// A list of the items created. If there was more than one object and objects are not being coaleseced in
/// FIXME: This is not very useful. It would be far more useful to return a list of items instead. /// inventory, then the order of items is in the same order as the input objects.
/// </returns> /// </returns>
UUID CopyToInventory(DeRezAction action, UUID folderID, List<SceneObjectGroup> objectGroups, IClientAPI remoteClient); List<InventoryItemBase> CopyToInventory(
DeRezAction action, UUID folderID, List<SceneObjectGroup> objectGroups, IClientAPI remoteClient, bool asAttachment);
/// <summary> /// <summary>
/// Rez an object into the scene from the user's inventory /// Rez an object into the scene from the user's inventory

View File

@ -155,7 +155,7 @@ namespace OpenSim.Region.Framework.Scenes
{ {
IInventoryAccessModule invAccess = m_scene.RequestModuleInterface<IInventoryAccessModule>(); IInventoryAccessModule invAccess = m_scene.RequestModuleInterface<IInventoryAccessModule>();
if (invAccess != null) if (invAccess != null)
invAccess.CopyToInventory(x.action, x.folderID, x.objectGroups, x.remoteClient); invAccess.CopyToInventory(x.action, x.folderID, x.objectGroups, x.remoteClient, false);
if (x.permissionToDelete) if (x.permissionToDelete)
{ {

View File

@ -77,7 +77,12 @@ namespace OpenSim.Region.Framework.Scenes
public bool DebugUpdates { get; private set; } public bool DebugUpdates { get; private set; }
public SynchronizeSceneHandler SynchronizeScene; public SynchronizeSceneHandler SynchronizeScene;
public SimStatsReporter StatsReporter;
/// <summary>
/// Statistical information for this scene.
/// </summary>
public SimStatsReporter StatsReporter { get; private set; }
public List<Border> NorthBorders = new List<Border>(); public List<Border> NorthBorders = new List<Border>();
public List<Border> EastBorders = new List<Border>(); public List<Border> EastBorders = new List<Border>();
public List<Border> SouthBorders = new List<Border>(); public List<Border> SouthBorders = new List<Border>();

View File

@ -1027,10 +1027,16 @@ namespace OpenSim.Region.Framework.Scenes
public void ApplyNextOwnerPermissions() public void ApplyNextOwnerPermissions()
{ {
Util.PrintCallStack();
lock (m_items) lock (m_items)
{ {
foreach (TaskInventoryItem item in m_items.Values) foreach (TaskInventoryItem item in m_items.Values)
{ {
// m_log.DebugFormat (
// "[SCENE OBJECT PART INVENTORY]: Applying next permissions {0} to {1} in {2} with current {3}, base {4}, everyone {5}",
// item.NextPermissions, item.Name, m_part.Name, item.CurrentPermissions, item.BasePermissions, item.EveryonePermissions);
if (item.InvType == (int)InventoryType.Object && (item.CurrentPermissions & 7) != 0) if (item.InvType == (int)InventoryType.Object && (item.CurrentPermissions & 7) != 0)
{ {
if ((item.CurrentPermissions & ((uint)PermissionMask.Copy >> 13)) == 0) if ((item.CurrentPermissions & ((uint)PermissionMask.Copy >> 13)) == 0)
@ -1040,6 +1046,7 @@ namespace OpenSim.Region.Framework.Scenes
if ((item.CurrentPermissions & ((uint)PermissionMask.Modify >> 13)) == 0) if ((item.CurrentPermissions & ((uint)PermissionMask.Modify >> 13)) == 0)
item.CurrentPermissions &= ~(uint)PermissionMask.Modify; item.CurrentPermissions &= ~(uint)PermissionMask.Modify;
} }
item.CurrentPermissions &= item.NextPermissions; item.CurrentPermissions &= item.NextPermissions;
item.BasePermissions &= item.NextPermissions; item.BasePermissions &= item.NextPermissions;
item.EveryonePermissions &= item.NextPermissions; item.EveryonePermissions &= item.NextPermissions;

View File

@ -53,8 +53,24 @@ namespace OpenSim.Region.Framework.Scenes.Serialization
/// Serialize coalesced objects to Xml /// Serialize coalesced objects to Xml
/// </summary> /// </summary>
/// <param name="coa"></param> /// <param name="coa"></param>
/// <param name="doScriptStates">
/// If true then serialize script states. This will halt any running scripts
/// </param>
/// <returns></returns> /// <returns></returns>
public static string ToXml(CoalescedSceneObjects coa) public static string ToXml(CoalescedSceneObjects coa)
{
return ToXml(coa, true);
}
/// <summary>
/// Serialize coalesced objects to Xml
/// </summary>
/// <param name="coa"></param>
/// <param name="doScriptStates">
/// If true then serialize script states. This will halt any running scripts
/// </param>
/// <returns></returns>
public static string ToXml(CoalescedSceneObjects coa, bool doScriptStates)
{ {
using (StringWriter sw = new StringWriter()) using (StringWriter sw = new StringWriter())
{ {
@ -91,7 +107,7 @@ namespace OpenSim.Region.Framework.Scenes.Serialization
writer.WriteAttributeString("offsety", offsets[i].Y.ToString()); writer.WriteAttributeString("offsety", offsets[i].Y.ToString());
writer.WriteAttributeString("offsetz", offsets[i].Z.ToString()); writer.WriteAttributeString("offsetz", offsets[i].Z.ToString());
SceneObjectSerializer.ToOriginalXmlFormat(obj, writer, true); SceneObjectSerializer.ToOriginalXmlFormat(obj, writer, doScriptStates);
writer.WriteEndElement(); // SceneObjectGroup writer.WriteEndElement(); // SceneObjectGroup
} }

View File

@ -145,12 +145,12 @@ namespace OpenSim.Region.OptionalModules.Avatar.Attachments
{ {
sb.AppendFormat("Attachments for {0}\n", sp.Name); sb.AppendFormat("Attachments for {0}\n", sp.Name);
ConsoleTable ct = new ConsoleTable() { Indent = 2 }; ConsoleDisplayTable ct = new ConsoleDisplayTable() { Indent = 2 };
ct.Columns.Add(new ConsoleTableColumn("Attachment Name", 36)); ct.Columns.Add(new ConsoleDisplayTableColumn("Attachment Name", 36));
ct.Columns.Add(new ConsoleTableColumn("Local ID", 10)); ct.Columns.Add(new ConsoleDisplayTableColumn("Local ID", 10));
ct.Columns.Add(new ConsoleTableColumn("Item ID", 36)); ct.Columns.Add(new ConsoleDisplayTableColumn("Item ID", 36));
ct.Columns.Add(new ConsoleTableColumn("Attach Point", 14)); ct.Columns.Add(new ConsoleDisplayTableColumn("Attach Point", 14));
ct.Columns.Add(new ConsoleTableColumn("Position", 15)); ct.Columns.Add(new ConsoleDisplayTableColumn("Position", 15));
// sb.AppendFormat( // sb.AppendFormat(
// " {0,-36} {1,-10} {2,-36} {3,-14} {4,-15}\n", // " {0,-36} {1,-10} {2,-36} {3,-14} {4,-15}\n",
@ -176,7 +176,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.Attachments
// attachmentObject.Name, attachmentObject.LocalId, attachmentObject.FromItemID, // attachmentObject.Name, attachmentObject.LocalId, attachmentObject.FromItemID,
// (AttachmentPoint)attachmentObject.AttachmentPoint, attachmentObject.RootPart.AttachedPos); // (AttachmentPoint)attachmentObject.AttachmentPoint, attachmentObject.RootPart.AttachedPos);
ct.Rows.Add( ct.Rows.Add(
new ConsoleTableRow( new ConsoleDisplayTableRow(
new List<string>() new List<string>()
{ {
attachmentObject.Name, attachmentObject.Name,

View File

@ -509,19 +509,21 @@ namespace OpenSim.Services.GridService
return; return;
} }
MainConsole.Instance.Output("Region Name Region UUID");
MainConsole.Instance.Output("Location URI");
MainConsole.Instance.Output("Owner ID Flags");
MainConsole.Instance.Output("-------------------------------------------------------------------------------");
foreach (RegionData r in regions) foreach (RegionData r in regions)
{ {
OpenSim.Data.RegionFlags flags = (OpenSim.Data.RegionFlags)Convert.ToInt32(r.Data["flags"]); OpenSim.Data.RegionFlags flags = (OpenSim.Data.RegionFlags)Convert.ToInt32(r.Data["flags"]);
MainConsole.Instance.Output(String.Format("{0,-20} {1}\n{2,-20} {3}\n{4,-39} {5}\n\n",
r.RegionName, r.RegionID, ConsoleDisplayList dispList = new ConsoleDisplayList();
String.Format("{0},{1}", r.posX / Constants.RegionSize, r.posY / Constants.RegionSize), dispList.AddRow("Region Name", r.RegionName);
r.Data["serverURI"], dispList.AddRow("Region ID", r.RegionID);
r.Data["owner_uuid"], flags)); dispList.AddRow("Location", string.Format("{0},{1}", r.coordX, r.coordY));
dispList.AddRow("URI", r.Data["serverURI"]);
dispList.AddRow("Owner ID", r.Data["owner_uuid"]);
dispList.AddRow("Flags", flags);
MainConsole.Instance.Output(dispList.ToString());
} }
return; return;
} }

View File

@ -566,7 +566,7 @@ namespace OpenSim.Tests.Common
/// <returns></returns> /// <returns></returns>
public static SceneObjectPart AddSceneObject(Scene scene) public static SceneObjectPart AddSceneObject(Scene scene)
{ {
return AddSceneObject(scene, "Test Object"); return AddSceneObject(scene, "Test Object", UUID.Zero);
} }
/// <summary> /// <summary>
@ -574,10 +574,11 @@ namespace OpenSim.Tests.Common
/// </summary> /// </summary>
/// <param name="scene"></param> /// <param name="scene"></param>
/// <param name="name"></param> /// <param name="name"></param>
/// <param name="ownerId"></param>
/// <returns></returns> /// <returns></returns>
public static SceneObjectPart AddSceneObject(Scene scene, string name) public static SceneObjectPart AddSceneObject(Scene scene, string name, UUID ownerId)
{ {
SceneObjectPart part = CreateSceneObjectPart(name, UUID.Random(), UUID.Zero); SceneObjectPart part = CreateSceneObjectPart(name, UUID.Random(), ownerId);
//part.UpdatePrimFlags(false, false, true); //part.UpdatePrimFlags(false, false, true);
//part.ObjectFlags |= (uint)PrimFlags.Phantom; //part.ObjectFlags |= (uint)PrimFlags.Phantom;