OpenSimulator Internals/Walkthroughs/Avatar Removes From Inventory
OpenSimulator Internals/Walkthroughs/Avatar Removes From Inventory
[edit]Overview
[edit]Traces what happens when an avatar deletes an item from inventory, moves it to trash, or purges the trash folder. Also covers the Return Object path (estate/parcel manager returning an object to owner's Lost and Found).
Case 1: Delete Item (Move to Trash)
[edit]Avatar selects an item and deletes it (moves to Trash folder).
1. Client Sends RemoveInventoryItem
[edit]OpenSim/Region/Framework/Scenes/Scene.cs -- RemoveInventoryItem()
- Viewer sends RemoveInventoryItem packet.
- Scene.RemoveInventoryItem() calls InventoryService.DeleteItems(agentID, [itemID]) if permitted.
Wait -- DeleteItems moves to trash in v2 protocol or deletes directly depending on implementation. In OpenSim's XInventoryService, DeleteItems() marks the item deleted (moves to system trash folder or removes depending on config).
- DB writes
- inventoryitems -- UPDATE or DELETE depending on server config
Case 2: Purge Folder (Empty Trash)
[edit]Avatar right-clicks Trash folder and selects Empty Trash.
1. Client Sends PurgeInventoryDescendents
[edit]- Viewer sends PurgeInventoryDescendents packet with folderID = Trash folder UUID.
- Scene.HandlePurgeInventoryDescendents() calls InventoryService.PurgeFolder(folder).
- ROBUST XInventoryService: deletes all items and subfolders recursively from inventoryitems and inventoryfolders tables.
- DB writes
- inventoryitems -- DELETE: all items in folder and subfolders
- inventoryfolders -- DELETE: all subfolders (not the trash folder itself)
Case 3: Delete Object from World (DeRez to Trash)
[edit]Avatar right-clicks object in world and selects Delete (not Take).
1. Client Sends DeRezObject with action=Delete
[edit]BasicInventoryAccessModule -- CopyToInventory(DeRezAction.Delete)
- If deleting own object: destination folder = Trash (FolderType.Trash).
- If deleting another's object (estate manager): destination = owner's Lost and Found (FolderType.LostAndFound).
- CopyBundleToInventory() runs: serialises object, creates asset, inserts inventory item in appropriate folder.
- Scene.DeleteSceneObject() removes object from scene and region storage.
- DB writes
- assets -- INSERT: serialised object XML
- inventoryitems -- INSERT: item in Trash or LostAndFound
- prims/primshapes/primitems -- DELETE: object removed from region
Case 4: Return Object (Parcel/Estate Manager)
[edit]Estate manager or parcel owner returns an object to its owner's inventory.
1. Return Triggered
[edit]OpenSim/Region/Framework/Scenes/Scene.cs -- returnObjects()
- Parcel manager calls returnObjects() for objects on the parcel.
- Calls IInventoryAccessModule.CopyToInventory(DeRezAction.Return, UUID.Zero, objlist, null, false).
- remoteClient is null -- return is server-initiated.
- Destination folder: owner's Lost and Found (FolderType.LostAndFound).
- AddPermissions() with null remoteClient: same-owner path, perms preserved.
- Asset created, item inserted.
- Scene.AddReturn() queues a notification message to the owner.
- Scene.DeleteSceneObject() removes from scene.
On next backup cycle, Scene.Backup() processes m_returns:
- Sends GridInstantMessage to the owner: "Your object X was returned from parcel Y in region Z due to [reason]."
- DB writes
- assets -- INSERT: serialised object XML
- inventoryitems -- INSERT: item in Lost and Found
- prims/primshapes/primitems -- DELETE
Summary: DB Tables Touched
[edit]| Case | Table | Operation |
|---|---|---|
| Delete item | inventoryitems | UPDATE/DELETE |
| Purge folder | inventoryitems, inventoryfolders | DELETE recursive |
| Delete object | assets, inventoryitems | INSERT; prims DELETE |
| Return object | assets, inventoryitems | INSERT; prims DELETE |