a few changes on attachment module and Xinventory service

This commit is contained in:
UbitUmarov
2022-12-15 23:17:59 +00:00
parent 8ecf31eb67
commit e88e93a34a
2 changed files with 162 additions and 81 deletions

View File

@@ -994,81 +994,89 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
/// <param name="saveAllScripted"></param>
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);
}
}

View File

@@ -297,6 +297,10 @@ namespace OpenSim.Services.InventoryService
inventory.Folders = new List<InventoryFolderBase>();
inventory.Items = new List<InventoryItemBase>();
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<UUID> 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;