mirror of
https://github.com/opensim/opensim.git
synced 2026-08-05 00:46:02 +08:00
a few changes on attachment module and Xinventory service
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user