diff --git a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs
index af75ea9c55..ec3b697c45 100755
--- a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs
+++ b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs
@@ -994,81 +994,89 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
///
private void UpdateKnownItem(IScenePresence sp, SceneObjectGroup grp, string scriptedState)
{
+ if (!grp.HasGroupChanged)
+ {
+ if (DebugLevel > 0)
+ {
+ m_log.DebugFormat(
+ "[ATTACHMENTS MODULE]: Don't need to update asset for unchanged attachment {0}, attachpoint {1}",
+ grp.UUID, grp.AttachmentPoint);
+ }
+ return;
+ }
+ grp.HasGroupChanged = false;
+
+ if (m_invAccessModule is null)
+ return;
+
if (grp.FromItemID.IsZero())
{
// We can't save temp attachments
- grp.HasGroupChanged = false;
return;
}
if(sp.IsNPC)
return;
- if (grp.HasGroupChanged)
+ m_log.DebugFormat(
+ "[ATTACHMENTS MODULE]: Updating asset for attachment {0}, attachpoint {1}",
+ grp.UUID, grp.AttachmentPoint);
+
+ InventoryItemBase item = m_scene.InventoryService.GetItem(sp.UUID, grp.FromItemID);
+ if (item != null)
{
- m_log.DebugFormat(
- "[ATTACHMENTS MODULE]: Updating asset for attachment {0}, attachpoint {1}",
- grp.UUID, grp.AttachmentPoint);
-
- string sceneObjectXml = SceneObjectSerializer.ToOriginalXmlFormat(grp, scriptedState);
-
- InventoryItemBase item = m_scene.InventoryService.GetItem(sp.UUID, grp.FromItemID);
-
- if (item != null)
+ if (item.Owner.NotEqual(sp.UUID))
{
- // attach is rez, need to update permissions
- item.Flags &= ~(uint)(InventoryItemFlags.ObjectSlamPerm | InventoryItemFlags.ObjectOverwriteBase |
- InventoryItemFlags.ObjectOverwriteOwner | InventoryItemFlags.ObjectOverwriteGroup |
- InventoryItemFlags.ObjectOverwriteEveryone | InventoryItemFlags.ObjectOverwriteNextOwner);
-
- uint permsBase = (uint)(PermissionMask.Copy | PermissionMask.Transfer |
- PermissionMask.Modify | PermissionMask.Move |
- PermissionMask.Export | PermissionMask.FoldedMask);
-
- permsBase &= grp.CurrentAndFoldedNextPermissions();
- permsBase |= (uint)PermissionMask.Move;
- item.BasePermissions = permsBase;
- item.CurrentPermissions = permsBase;
- item.NextPermissions = permsBase & grp.RootPart.NextOwnerMask | (uint)PermissionMask.Move;
- item.EveryOnePermissions = permsBase & grp.RootPart.EveryoneMask;
- item.GroupPermissions = permsBase & grp.RootPart.GroupMask;
- item.CurrentPermissions &=
- ((uint)PermissionMask.Copy |
- (uint)PermissionMask.Transfer |
- (uint)PermissionMask.Modify |
- (uint)PermissionMask.Move |
- (uint)PermissionMask.Export |
- (uint)PermissionMask.FoldedMask); // Preserve folded permissions ??
-
- string name = grp.RootPart.Name;
- string desc = grp.RootPart.Description;
-
- AssetBase asset = m_scene.CreateAsset(
- name, desc,
- (sbyte)AssetType.Object,
- Utils.StringToBytes(sceneObjectXml),
- sp.UUID);
-
- item.Name = name;
- item.Description = desc;
- item.AssetID = asset.FullID;
- item.AssetType = (int)AssetType.Object;
- item.InvType = (int)InventoryType.Object;
-
- if (m_invAccessModule != null)
- m_invAccessModule.UpdateInventoryItemAsset(sp.UUID, item, asset);
-
- if (sp.ControllingClient != null)
- sp.ControllingClient.SendInventoryItemCreateUpdate(item, 0);
+ m_log.DebugFormat("[ATTACHMENTS MODULE]: Updating asset for attachment owner mismach: agent {0}, owner {1}",
+ sp.UUID, item.Owner);
+ return;
}
- grp.HasGroupChanged = false; // Prevent it being saved over and over
- }
- else if (DebugLevel > 0)
- {
- m_log.DebugFormat(
- "[ATTACHMENTS MODULE]: Don't need to update asset for unchanged attachment {0}, attachpoint {1}",
- grp.UUID, grp.AttachmentPoint);
+ string sceneObjectXml = SceneObjectSerializer.ToOriginalXmlFormat(grp, scriptedState);
+ // attach is rez, need to update permissions
+ item.Flags &= ~(uint)(InventoryItemFlags.ObjectSlamPerm | InventoryItemFlags.ObjectOverwriteBase |
+ InventoryItemFlags.ObjectOverwriteOwner | InventoryItemFlags.ObjectOverwriteGroup |
+ InventoryItemFlags.ObjectOverwriteEveryone | InventoryItemFlags.ObjectOverwriteNextOwner);
+
+ uint permsBase = (uint)(PermissionMask.Copy | PermissionMask.Transfer |
+ PermissionMask.Modify | PermissionMask.Move |
+ PermissionMask.Export | PermissionMask.FoldedMask);
+
+ permsBase &= grp.CurrentAndFoldedNextPermissions();
+ permsBase |= (uint)PermissionMask.Move;
+ item.BasePermissions = permsBase;
+ item.CurrentPermissions = permsBase;
+ item.NextPermissions = permsBase & grp.RootPart.NextOwnerMask | (uint)PermissionMask.Move;
+ item.EveryOnePermissions = permsBase & grp.RootPart.EveryoneMask;
+ item.GroupPermissions = permsBase & grp.RootPart.GroupMask;
+ item.CurrentPermissions &=
+ ((uint)PermissionMask.Copy |
+ (uint)PermissionMask.Transfer |
+ (uint)PermissionMask.Modify |
+ (uint)PermissionMask.Move |
+ (uint)PermissionMask.Export |
+ (uint)PermissionMask.FoldedMask); // Preserve folded permissions ??
+
+ string name = grp.RootPart.Name;
+ string desc = grp.RootPart.Description;
+
+ AssetBase asset = m_scene.CreateAsset(
+ name, desc,
+ (sbyte)AssetType.Object,
+ Utils.StringToBytes(sceneObjectXml),
+ sp.UUID);
+
+ item.Name = name;
+ item.Description = desc;
+ item.AssetID = asset.FullID;
+ item.AssetType = (int)AssetType.Object;
+ item.InvType = (int)InventoryType.Object;
+
+ if (!m_invAccessModule.UpdateInventoryItemAsset(sp.UUID, item, asset))
+ return;
+
+ if (sp.ControllingClient != null)
+ sp.ControllingClient.SendInventoryItemCreateUpdate(item, 0);
}
}
diff --git a/OpenSim/Services/InventoryService/XInventoryService.cs b/OpenSim/Services/InventoryService/XInventoryService.cs
index 402dba40ae..6bcd6b3c75 100644
--- a/OpenSim/Services/InventoryService/XInventoryService.cs
+++ b/OpenSim/Services/InventoryService/XInventoryService.cs
@@ -297,6 +297,10 @@ namespace OpenSim.Services.InventoryService
inventory.Folders = new List();
inventory.Items = new List();
+ InventoryFolderBase f = GetFolder(principalID, folderID);
+ if (f == null)
+ return inventory;
+
XInventoryFolder[] folders = m_Database.GetFolders(
new string[] { "parentFolderID"},
new string[] { folderID.ToString() });
@@ -317,12 +321,8 @@ namespace OpenSim.Services.InventoryService
inventory.Items.Add(ConvertToOpenSim(i));
}
- InventoryFolderBase f = GetFolder(principalID, folderID);
- if (f != null)
- {
- inventory.Version = f.Version;
- inventory.OwnerID = f.Owner;
- }
+ inventory.Version = f.Version;
+ inventory.OwnerID = f.Owner;
inventory.FolderID = folderID;
return inventory;
@@ -562,12 +562,20 @@ namespace OpenSim.Services.InventoryService
{
// Principal is b0rked. *sigh*
//
- foreach (InventoryItemBase i in items)
+ int len = items.Count;
+ if(len == 0)
+ return false;
+ string[] ids = new string[len];
+ string[] folders = new string[len];
+ int i=0;
+ foreach (InventoryItemBase it in items)
{
- m_Database.MoveItem(i.ID.ToString(), i.Folder.ToString());
+ ids[i] = it.ID.ToString();
+ folders[i++] = it.Folder.ToString();
+
}
- return true;
+ return m_Database.MoveItems(ids, folders);
}
public virtual bool DeleteItems(UUID principalID, List itemIDs)
@@ -594,18 +602,39 @@ namespace OpenSim.Services.InventoryService
{
// Just use the ID... *facepalms*
//
- foreach (UUID id in itemIDs)
- m_Database.DeleteItems("inventoryID", id.ToString());
+ if(principalID.IsZero())
+ {
+ foreach (UUID id in itemIDs)
+ m_Database.DeleteItems("inventoryID", id.ToString());
+ }
+ else
+ {
+ string u = principalID.ToString();
+ string[] fields = new string[] { "agentID", "inventoryID" };
+ foreach (UUID id in itemIDs)
+ m_Database.DeleteItems(
+ fields,
+ new string[] { u, id.ToString()});
+ }
}
-
return true;
}
public virtual InventoryItemBase GetItem(UUID principalID, UUID itemID)
{
- XInventoryItem[] items = m_Database.GetItems(
+ XInventoryItem[] items;
+ if (principalID.IsZero())
+ {
+ items = m_Database.GetItems(
new string[] { "inventoryID" },
new string[] { itemID.ToString() });
+ }
+ else
+ {
+ items = m_Database.GetItems(
+ new string[] { "avatarID", "inventoryID" },
+ new string[] { principalID.ToString(), itemID.ToString() });
+ }
if (items.Length == 0)
return null;
@@ -615,19 +644,63 @@ namespace OpenSim.Services.InventoryService
public virtual InventoryItemBase[] GetMultipleItems(UUID userID, UUID[] ids)
{
- InventoryItemBase[] items = new InventoryItemBase[ids.Length];
- int i = 0;
- foreach (UUID id in ids)
- items[i++] = GetItem(userID, id);
+ int len = ids.Length;
+ if(len == 0)
+ return new InventoryItemBase[0];
+ string[] sids = new string[len];
+
+ int i;
+ for(i = 0; i< len; ++i)
+ sids[i] = ids[i].ToString();
+
+ XInventoryItem[] xits = m_Database.GetItems("inventoryID", sids);
+ sids = null;
+
+ len = xits.Length;
+ InventoryItemBase[] items = new InventoryItemBase[len];
+ i = 0;
+
+ if(userID.IsZero())
+ {
+ for (i = 0; i < len; ++i)
+ {
+ if (xits[i] == null)
+ items[i] = null;
+ else
+ items[i] = ConvertToOpenSim(xits[i]);
+ }
+ }
+ else
+ {
+ for (i = 0; i < len; ++i)
+ {
+ if (xits[i] == null)
+ items[i] = null;
+ else if (xits[i].avatarID.Equals(userID))
+ items[i] = ConvertToOpenSim(xits[i]);
+ else
+ items[i] = null;
+ }
+ }
return items;
}
public virtual InventoryFolderBase GetFolder(UUID principalID, UUID folderID)
{
- XInventoryFolder[] folders = m_Database.GetFolders(
- new string[] { "folderID"},
+ XInventoryFolder[] folders;
+ if(principalID.IsZero())
+ {
+ folders = m_Database.GetFolders(
+ new string[] { "folderID" },
new string[] { folderID.ToString() });
+ }
+ else
+ {
+ folders = m_Database.GetFolders(
+ new string[] { "avatarID", "folderID" },
+ new string[] { principalID.ToString(), folderID.ToString() });
+ }
if (folders.Length == 0)
return null;