* Add exclusion of UtilsConversion.cs to prebuild.xml, should fix the build

* First stab at working inventory persistence

git-svn-id: http://libopenmetaverse.googlecode.com/svn/trunk@2268 52acb1d6-8a22-11de-b505-999d5b087335
This commit is contained in:
John Hurliman
2008-10-07 00:42:05 +00:00
parent 3e5fcb7fab
commit b3380d2c11
7 changed files with 198 additions and 52 deletions

View File

@@ -70,8 +70,11 @@ namespace Simian.Extensions
break;
}
if (parentID == UUID.Zero)
parentID = agent.InventoryRoot;
// Create the inventory item
CreateItem(agent, Utils.BytesToString(create.InventoryBlock.Name), "Created in Simian",
CreateItem(agent.AgentID, Utils.BytesToString(create.InventoryBlock.Name), "Created in Simian",
(InventoryType)create.InventoryBlock.InvType, assetType, assetID, parentID,
PermissionMask.All, (PermissionMask)create.InventoryBlock.NextOwnerMask, agent.AgentID,
agent.AgentID, create.InventoryBlock.TransactionID, create.InventoryBlock.CallbackID);
@@ -81,7 +84,11 @@ namespace Simian.Extensions
{
CreateInventoryFolderPacket create = (CreateInventoryFolderPacket)packet;
CreateFolder(agent, create.FolderData.FolderID, Utils.BytesToString(create.FolderData.Name),
UUID folderID = create.FolderData.FolderID;
if (folderID == UUID.Zero)
folderID = agent.InventoryRoot;
CreateFolder(agent.AgentID, folderID, Utils.BytesToString(create.FolderData.Name),
(AssetType)create.FolderData.Type, create.FolderData.ParentID, agent.AgentID);
}
@@ -302,9 +309,9 @@ namespace Simian.Extensions
Server.UDP.SendPacket(agent.AgentID, reply, PacketCategory.Inventory);
}
public bool CreateRootFolder(Agent agent, UUID folderID, string name, UUID ownerID)
public bool CreateRootFolder(UUID agentID, UUID folderID, string name, UUID ownerID)
{
Dictionary<UUID, InventoryObject> agentInventory = GetAgentInventory(agent.AgentID);
Dictionary<UUID, InventoryObject> agentInventory = GetAgentInventory(agentID);
lock (agentInventory)
{
@@ -312,7 +319,7 @@ namespace Simian.Extensions
{
InventoryFolder folder = new InventoryFolder();
folder.Name = name;
folder.OwnerID = agent.AgentID;
folder.OwnerID = agentID;
folder.ParentID = UUID.Zero;
folder.Parent = null;
folder.PreferredType = AssetType.Folder;
@@ -335,13 +342,10 @@ namespace Simian.Extensions
return false;
}
public bool CreateFolder(Agent agent, UUID folderID, string name, AssetType preferredType,
public bool CreateFolder(UUID agentID, UUID folderID, string name, AssetType preferredType,
UUID parentID, UUID ownerID)
{
if (parentID == UUID.Zero)
parentID = agent.InventoryRoot;
Dictionary<UUID, InventoryObject> agentInventory = GetAgentInventory(agent.AgentID);
Dictionary<UUID, InventoryObject> agentInventory = GetAgentInventory(agentID);
lock (agentInventory)
{
@@ -354,7 +358,7 @@ namespace Simian.Extensions
{
InventoryFolder folder = new InventoryFolder();
folder.Name = name;
folder.OwnerID = agent.AgentID;
folder.OwnerID = agentID;
folder.ParentID = parentID;
folder.Parent = parentFolder;
folder.PreferredType = preferredType;
@@ -387,14 +391,11 @@ namespace Simian.Extensions
return false;
}
public UUID CreateItem(Agent agent, string name, string description, InventoryType invType, AssetType type,
public UUID CreateItem(UUID agentID, string name, string description, InventoryType invType, AssetType type,
UUID assetID, UUID parentID, PermissionMask ownerMask, PermissionMask nextOwnerMask, UUID ownerID,
UUID creatorID, UUID transactionID, uint callbackID)
{
if (parentID == UUID.Zero)
parentID = agent.InventoryRoot;
Dictionary<UUID, InventoryObject> agentInventory = GetAgentInventory(agent.AgentID);
Dictionary<UUID, InventoryObject> agentInventory = GetAgentInventory(agentID);
lock (agentInventory)
{
@@ -415,8 +416,8 @@ namespace Simian.Extensions
item.Permissions.NextOwnerMask = nextOwnerMask;
item.AssetType = type;
item.AssetID = assetID;
item.OwnerID = agent.AgentID;
item.CreatorID = agent.AgentID;
item.OwnerID = agentID;
item.CreatorID = agentID;
item.CreationDate = DateTime.Now;
Logger.DebugLog(String.Format("Creating inventory item {0} (InvType: {1}, AssetType: {2})", item.Name,
@@ -429,7 +430,7 @@ namespace Simian.Extensions
// Send a success response
UpdateCreateInventoryItemPacket update = new UpdateCreateInventoryItemPacket();
update.AgentData.AgentID = agent.AgentID;
update.AgentData.AgentID = agentID;
update.AgentData.SimApproved = true;
if (transactionID != UUID.Zero)
update.AgentData.TransactionID = transactionID;
@@ -465,7 +466,7 @@ namespace Simian.Extensions
update.InventoryData[0].SaleType = (byte)item.SaleType;
update.InventoryData[0].Type = (sbyte)item.AssetType;
Server.UDP.SendPacket(agent.AgentID, update, PacketCategory.Inventory);
Server.UDP.SendPacket(agentID, update, PacketCategory.Inventory);
return item.ID;
}
else
@@ -493,9 +494,50 @@ namespace Simian.Extensions
return false;
}
public OpenMetaverse.InventoryFolder[] CreateInventorySkeleton(UUID agentID)
{
Dictionary<UUID, InventoryObject> inventory;
if (Inventory.TryGetValue(agentID, out inventory))
{
List<InventoryFolder> folderList = new List<InventoryFolder>();
lock (inventory)
{
foreach (InventoryObject obj in inventory.Values)
{
if (obj is InventoryFolder)
folderList.Add((InventoryFolder)obj);
}
}
OpenMetaverse.InventoryFolder[] folders = new OpenMetaverse.InventoryFolder[folderList.Count];
for (int i = 0; i < folderList.Count; i++)
{
InventoryFolder folder = folderList[i];
folders[i] = new OpenMetaverse.InventoryFolder(folder.ID);
folders[i].DescendentCount = folder.Children.Count;
folders[i].Name = folder.Name;
folders[i].OwnerID = folder.OwnerID;
folders[i].ParentUUID = folder.ParentID;
folders[i].PreferredType = folder.PreferredType;
folders[i].Version = folder.Version;
}
return folders;
}
else
{
Logger.Log("CreateInventorySkeleton() called with an unknown agent " + agentID.ToString(),
Helpers.LogLevel.Warning);
return null;
}
}
#region Persistance
LLSDMap SerializeInventoryItem(InventoryItem item)
LLSDMap SerializeItem(InventoryItem item)
{
LLSDMap itemMap = new LLSDMap(16);
itemMap.Add("ID", LLSD.FromUUID(item.ID));
@@ -517,7 +559,7 @@ namespace Simian.Extensions
return itemMap;
}
LLSDMap SerializeInventoryFolder(InventoryFolder folder)
LLSDMap SerializeFolder(InventoryFolder folder)
{
LLSDMap folderMap = new LLSDMap(6);
folderMap.Add("ID", LLSD.FromUUID(folder.ID));
@@ -533,7 +575,16 @@ namespace Simian.Extensions
{
LLSDMap map = new LLSDMap(agentInventory.Count);
// FIXME:
foreach (KeyValuePair<UUID, InventoryObject> kvp in agentInventory)
{
LLSD value;
if (kvp.Value is InventoryItem)
value = SerializeItem((InventoryItem)kvp.Value);
else
value = SerializeFolder((InventoryFolder)kvp.Value);
map.Add(kvp.Key.ToString(), value);
}
return map;
}
@@ -543,10 +594,13 @@ namespace Simian.Extensions
LLSDMap map = new LLSDMap(Inventory.Count);
int itemCount = 0;
foreach (KeyValuePair<UUID, Dictionary<UUID, InventoryObject>> kvp in Inventory)
lock (Inventory)
{
map.Add(kvp.Key.ToString(), SerializeInventory(kvp.Value));
itemCount += kvp.Value.Count;
foreach (KeyValuePair<UUID, Dictionary<UUID, InventoryObject>> kvp in Inventory)
{
map.Add(kvp.Key.ToString(), SerializeInventory(kvp.Value));
itemCount += kvp.Value.Count;
}
}
Logger.Log(String.Format("Serializing the inventory store with {0} items", itemCount),
@@ -555,24 +609,105 @@ namespace Simian.Extensions
return map;
}
InventoryItem DeserializeItem(LLSDMap itemMap)
{
InventoryItem item = new InventoryItem();
item.ID = itemMap["ID"].AsUUID();
item.ParentID = itemMap["ParentID"].AsUUID();
item.Name = itemMap["Name"].AsString();
item.OwnerID = itemMap["OwnerID"].AsUUID();
item.AssetID = itemMap["AssetID"].AsUUID();
item.AssetType = (AssetType)itemMap["AssetType"].AsInteger();
item.InventoryType = (InventoryType)itemMap["InventoryType"].AsInteger();
item.CreatorID = itemMap["CreatorID"].AsUUID();
item.GroupID = itemMap["GroupID"].AsUUID();
item.Description = itemMap["Description"].AsString();
item.GroupOwned = itemMap["GroupOwned"].AsBoolean();
item.Permissions = Permissions.FromLLSD(itemMap["Permissions"]);
item.SalePrice = itemMap["SalePrice"].AsInteger();
item.SaleType = (SaleType)itemMap["SaleType"].AsInteger();
item.Flags = Utils.BytesToUInt(itemMap["Flags"].AsBinary());
item.CreationDate = itemMap["CreationDate"].AsDate();
return item;
}
InventoryFolder DeserializeFolder(LLSDMap folderMap)
{
InventoryFolder folder = new InventoryFolder();
folder.ID = folderMap["ID"].AsUUID();
folder.ParentID = folderMap["ParentID"].AsUUID();
folder.Name = folderMap["Name"].AsString();
folder.OwnerID = folderMap["OwnerID"].AsUUID();
folder.PreferredType = (AssetType)folderMap["PreferredType"].AsInteger();
folder.Version = folderMap["Version"].AsInteger();
return folder;
}
Dictionary<UUID, InventoryObject> DeserializeInventory(LLSDMap map)
{
Dictionary<UUID, InventoryObject> inventory = new Dictionary<UUID, InventoryObject>();
foreach (KeyValuePair<string, LLSD> kvp in map)
{
UUID objectID = (UUID)kvp.Key;
LLSDMap objectMap = (LLSDMap)kvp.Value;
InventoryObject obj;
if (objectMap.ContainsKey("AssetID"))
obj = DeserializeItem(objectMap);
else
obj = DeserializeFolder(objectMap);
inventory[objectID] = obj;
}
return inventory;
}
public void Deserialize(LLSD serialized)
{
//accounts.Clear();
int itemCount = 0;
LLSDMap map = (LLSDMap)serialized;
//LLSDArray array = (LLSDArray)serialized;
lock (Inventory)
{
Inventory.Clear();
//for (int i = 0; i < array.Count; i++)
//{
// Agent agent = new Agent();
// object agentRef = (object)agent;
// LLSD.DeserializeMembers(ref agentRef, (LLSDMap)array[i]);
// agent = (Agent)agentRef;
foreach (KeyValuePair<string, LLSD> kvp in map)
{
UUID agentID = (UUID)kvp.Key;
Dictionary<UUID, InventoryObject> agentInventory = DeserializeInventory((LLSDMap)kvp.Value);
itemCount += agentInventory.Count;
// accounts.Add(agent.FullName, agent.AgentID, agent);
//}
Inventory[agentID] = agentInventory;
}
//Logger.Log(String.Format("Deserialized the agent store with {0} entries", accounts.Count),
// Helpers.LogLevel.Info);
// Iterate over the inventory objects and connect them to each other
foreach (Dictionary<UUID, InventoryObject> inventory in Inventory.Values)
{
foreach (InventoryObject obj in inventory.Values)
{
if (obj.ParentID != UUID.Zero)
{
InventoryObject parentObj;
if (inventory.TryGetValue(obj.ParentID, out parentObj) && parentObj is InventoryFolder)
{
InventoryFolder parent = (InventoryFolder)parentObj;
obj.Parent = parent;
parent.Children.Dictionary[obj.ID] = obj;
}
else
{
Logger.Log(String.Format("Cannot find parent folder {0} for inventory item {1}",
obj.ParentID, obj.ID), Helpers.LogLevel.Warning);
}
}
}
}
}
Logger.Log(String.Format("Deserialized the inventory store with {0} items", itemCount),
Helpers.LogLevel.Info);
}
#endregion Persistance