diff --git a/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs
index 94b6797b67..4bbc2edf9c 100644
--- a/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs
+++ b/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs
@@ -1151,20 +1151,26 @@ namespace OpenSim.Region.Environment.Scenes
{
MainLog.Instance.Warn(
"SCENE",
- "Couldn't find part {0} in object group {1} ({2}) to retreive prim inventory",
- localID, LocalId, UUID);
+ "Couldn't find part {0} in object group {1}, {2} to retreive prim inventory",
+ localID, Name, UUID);
}
return false;
}
- public string RequestInventoryFile(uint localID, IXfer xferManager)
+ public void RequestInventoryFile(uint localID, IXfer xferManager)
{
SceneObjectPart part = GetChildPart(localID);
if (part != null)
{
part.RequestInventoryFile(xferManager);
}
- return "";
+ else
+ {
+ MainLog.Instance.Warn(
+ "PRIMINVENTORY",
+ "Couldn't find part {0} in object group {1}, {2} to request inventory data",
+ localID, Name, UUID);
+ }
}
public bool AddInventoryItem(IClientAPI remoteClient, uint localID, InventoryItemBase item)
@@ -1202,7 +1208,7 @@ namespace OpenSim.Region.Environment.Scenes
taskItem.owner_id = new LLUUID(item.avatarID.ToString());
taskItem.creator_id = new LLUUID(item.creatorsID.ToString());
taskItem.type = SceneObjectPart.TaskInventoryItem.Types[item.assetType];
- taskItem.inv_type = SceneObjectPart.TaskInventoryItem.Types[item.invType];
+ taskItem.inv_type = SceneObjectPart.TaskInventoryItem.InvTypes[item.invType];
part.AddInventoryItem(taskItem);
return true;
}
diff --git a/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs b/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs
index 051884d2cc..2ddcf7be9f 100644
--- a/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs
+++ b/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs
@@ -56,7 +56,21 @@ namespace OpenSim.Region.Environment.Scenes
private const uint FULL_MASK_PERMISSIONS_GENERAL = 2147483647;
private const uint FULL_MASK_PERMISSIONS_OWNER = 2147483647;
private string m_inventoryFileName = "";
+
+ ///
+ /// The inventory folder for this prim
+ ///
private LLUUID m_folderID = LLUUID.Zero;
+
+ ///
+ /// Exposing this is not particularly good, but it's one of the least evils at the moment to see
+ /// folder id from prim inventory item data, since it's not (yet) actually stored with the prim.
+ ///
+ public LLUUID FolderID
+ {
+ get { return m_folderID; }
+ set { m_folderID = value; }
+ }
[XmlIgnore] public PhysicsActor PhysActor = null;
@@ -67,14 +81,9 @@ namespace OpenSim.Region.Environment.Scenes
= new Dictionary();
[XmlIgnore]
- ///
- /// Not really ideal to allow this to be set, but currently expedient for inserting a prim inventory
- /// from persistence.
- ///
public IDictionary TaskInventory
{
get { return m_taskInventory; }
- set { m_taskInventory = value; }
}
public LLUUID LastOwnerID;
@@ -1059,6 +1068,10 @@ namespace OpenSim.Region.Environment.Scenes
#region Inventory
+ ///
+ /// Add an item to this prim's inventory.
+ ///
+ ///
public void AddInventoryItem(TaskInventoryItem item)
{
item.parent_id = m_folderID;
@@ -1067,6 +1080,21 @@ namespace OpenSim.Region.Environment.Scenes
m_taskInventory.Add(item.item_id, item);
m_inventorySerial++;
}
+
+ ///
+ /// Add a whole collection of items to the prim's inventory at once. We assume that the items already
+ /// have all their fields correctly filled out.
+ ///
+ ///
+ public void AddInventoryItems(ICollection items)
+ {
+ foreach (TaskInventoryItem item in items)
+ {
+ m_taskInventory.Add(item.item_id, item);
+ }
+
+ m_inventorySerial++;
+ }
public int RemoveInventoryItem(IClientAPI remoteClient, uint localID, LLUUID itemID)
{
@@ -1077,7 +1105,7 @@ namespace OpenSim.Region.Environment.Scenes
string type = m_taskInventory[itemID].inv_type;
m_taskInventory.Remove(itemID);
m_inventorySerial++;
- if (type == "lsltext")
+ if (type == "lsl_text")
{
return 10;
}
@@ -1110,7 +1138,7 @@ namespace OpenSim.Region.Environment.Scenes
}
}
- public string RequestInventoryFile(IXfer xferManager)
+ public void RequestInventoryFile(IXfer xferManager)
{
byte[] fileData = new byte[0];
InventoryStringBuilder invString = new InventoryStringBuilder(m_folderID, UUID);
@@ -1141,12 +1169,16 @@ namespace OpenSim.Region.Environment.Scenes
invString.AddNameValueLine("creation_date", item.creation_date.ToString());
invString.AddSectionEnd();
}
+
fileData = Helpers.StringToField(invString.BuildString);
+
+// MainLog.Instance.Verbose(
+// "PRIMINVENTORY", "RequestInventoryFile fileData: {0}", Helpers.FieldToUTF8String(fileData));
+
if (fileData.Length > 2)
{
xferManager.AddNewFile(m_inventoryFileName, fileData);
}
- return "";
}
#endregion
@@ -1707,21 +1739,43 @@ namespace OpenSim.Region.Environment.Scenes
public class TaskInventoryItem
{
+ ///
+ /// Inventory types
+ ///
+ public static string[] InvTypes = new string[]
+ {
+ "texture",
+ "sound",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "lsl_text",
+ ""
+ };
+
+ ///
+ /// Asset types
+ ///
public static string[] Types = new string[]
- {
- "texture",
- "sound",
- "",
- "",
- "",
- "",
- "",
- "",
- "",
- "",
- "lsltext",
- ""
- };
+ {
+ "texture",
+ "sound",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "lsltext",
+ ""
+ };
public LLUUID item_id = LLUUID.Zero;
public LLUUID parent_id = LLUUID.Zero; //parent folder id
diff --git a/OpenSim/Region/Storage/OpenSim.DataStore.MonoSqlite/MonoSqliteDataStore.cs b/OpenSim/Region/Storage/OpenSim.DataStore.MonoSqlite/MonoSqliteDataStore.cs
index f9ab0c5ae8..8bad7300ac 100644
--- a/OpenSim/Region/Storage/OpenSim.DataStore.MonoSqlite/MonoSqliteDataStore.cs
+++ b/OpenSim/Region/Storage/OpenSim.DataStore.MonoSqlite/MonoSqliteDataStore.cs
@@ -340,18 +340,24 @@ namespace OpenSim.DataStore.MonoSqlite
String sql = String.Format("primID = '{0}'", prim.UUID.ToString());
DataRow[] dbItemRows = dbItems.Select(sql);
- IDictionary inventory
- = new Dictionary();
+ IList inventory = new List();
foreach (DataRow row in dbItemRows)
{
SceneObjectPart.TaskInventoryItem item = buildItem(row);
- inventory.Add(item.item_id, item);
+ inventory.Add(item);
MainLog.Instance.Verbose("DATASTORE", "Restored item {0}, {1}", item.name, item.item_id);
}
- prim.TaskInventory = inventory;
+ prim.AddInventoryItems(inventory);
+
+ // XXX A nasty little hack to recover the folder id for the prim (which is currently stored in
+ // every item). This data should really be stored in the prim table itself.
+ if (dbItemRows.Length > 0)
+ {
+ prim.FolderID = inventory[0].parent_id;
+ }
}
public void StoreTerrain(double[,] ter, LLUUID regionID)