Applying patches from [LIBOMV-288] to completely redo the InventoryManager system, hopefully for great justice

git-svn-id: http://libopenmetaverse.googlecode.com/svn/trunk@2021 52acb1d6-8a22-11de-b505-999d5b087335
This commit is contained in:
John Hurliman
2008-07-29 21:36:53 +00:00
parent 71837bfcf6
commit bfa6f6ca3f
23 changed files with 2603 additions and 1659 deletions

View File

@@ -61,7 +61,7 @@ namespace OpenMetaverse.TestClient
#endregion AvatarAppearance to AgentSetAppearance
// Detach everything we are currently wearing
Client.Appearance.AddAttachments(new List<InventoryBase>(), true);
Client.Appearance.AddAttachments(new List<ItemData>(0), true);
// Send the new appearance packet
Client.Network.SendPacket(set);

View File

@@ -240,7 +240,7 @@ namespace OpenMetaverse.TestClient
DirectoryInfo di = new DirectoryInfo(args[1]);
// recurse on the root folder into the entire inventory
BackupFolder(Client.Inventory.Store.RootNode, di.FullName);
BackupFolder(Client.InventoryStore.RootFolder, di.FullName);
}
/// <summary>
@@ -248,41 +248,42 @@ namespace OpenMetaverse.TestClient
/// </summary>
/// <param name="folder">The current leaf in the inventory tree</param>
/// <param name="sPathSoFar">path so far, in the form @"c:\here" -- this needs to be "clean" for the current filesystem</param>
private void BackupFolder(InventoryNode folder, string sPathSoFar)
private void BackupFolder(InventoryFolder folder, string sPathSoFar)
{
StringBuilder sbRequests = new StringBuilder();
// FIXME:
//Client.Inventory.RequestFolderContents(folder.Data.UUID, Client.Self.AgentID, true, true, false,
// InventorySortOrder.ByName);
if (folder.IsStale)
folder.DownloadContents(TimeSpan.FromSeconds(10));
// first scan this folder for text
foreach (InventoryNode iNode in folder.Nodes.Values)
foreach (InventoryBase ib in folder)
{
if (BackupWorker.CancellationPending)
return;
if (iNode.Data is OpenMetaverse.InventoryItem)
if (ib is InventoryItem)
{
InventoryItem ii = iNode.Data as InventoryItem;
if (ii.AssetType == AssetType.LSLText || ii.AssetType == AssetType.Notecard)
InventoryItem ii = ib as InventoryItem;
if (ii.Data.AssetType == AssetType.LSLText || ii.Data.AssetType == AssetType.Notecard)
{
// check permissions on scripts
if (ii.AssetType == AssetType.LSLText)
if (ii.Data.AssetType == AssetType.LSLText)
{
if ((ii.Permissions.OwnerMask & PermissionMask.Modify) == PermissionMask.None)
if ((ii.Data.Permissions.OwnerMask & PermissionMask.Modify) == PermissionMask.None)
{
// skip this one
continue;
}
}
string sExtension = (ii.AssetType == AssetType.LSLText) ? ".lsl" : ".txt";
string sExtension = (ii.Data.AssetType == AssetType.LSLText) ? ".lsl" : ".txt";
// make the output file
string sPath = sPathSoFar + @"\" + MakeValid(ii.Name.Trim()) + sExtension;
// create the new qdi
QueuedDownloadInfo qdi = new QueuedDownloadInfo(sPath, ii.AssetUUID, iNode.Data.UUID, UUID.Zero,
Client.Self.AgentID, ii.AssetType);
QueuedDownloadInfo qdi = new QueuedDownloadInfo(sPath, ii.Data.AssetUUID, ii.UUID, UUID.Zero,
Client.Self.AgentID, ii.Data.AssetType);
// add it to the queue
lock (PendingDownloads)
@@ -295,12 +296,12 @@ namespace OpenMetaverse.TestClient
}
// now run any subfolders
foreach (InventoryNode i in folder.Nodes.Values)
foreach (InventoryBase ib in folder)
{
if (BackupWorker.CancellationPending)
return;
else if (i.Data is OpenMetaverse.InventoryFolder)
BackupFolder(i, sPathSoFar + @"\" + MakeValid(i.Data.Name.Trim()));
else if (ib is InventoryFolder)
BackupFolder(ib as InventoryFolder, sPathSoFar + @"\" + MakeValid(ib.Name.Trim()));
}
}

View File

@@ -19,7 +19,7 @@ namespace OpenMetaverse.TestClient.Commands.Inventory.Shell
public override string Execute(string[] args, UUID fromAgentID)
{
Manager = Client.Inventory;
Inventory = Client.Inventory.Store;
Inventory = Client.InventoryStore;
if (args.Length > 1)
return "Usage: cd [path-to-folder]";
@@ -52,17 +52,19 @@ namespace OpenMetaverse.TestClient.Commands.Inventory.Shell
if (nextName == ".." && currentFolder != Inventory.RootFolder)
{
// If we encounter .., move to the parent folder.
currentFolder = Inventory[currentFolder.ParentUUID] as InventoryFolder;
currentFolder = currentFolder.Parent;
}
else
{
List<InventoryBase> currentContents = Inventory.GetContents(currentFolder);
if (currentFolder.IsStale)
currentFolder.DownloadContents(TimeSpan.FromSeconds(30));
// Try and find an InventoryBase with the corresponding name.
bool found = false;
foreach (InventoryBase item in currentContents)
foreach (InventoryBase item in currentFolder)
{
string name = item.Name;
// Allow lookup by UUID as well as name:
if (item.Name == nextName || item.UUID.ToString() == nextName)
if (name == nextName || item.UUID.ToString() == nextName)
{
found = true;
if (item is InventoryFolder)
@@ -71,16 +73,16 @@ namespace OpenMetaverse.TestClient.Commands.Inventory.Shell
}
else
{
return item.Name + " is not a folder.";
return name + " is not a folder.";
}
}
}
if (!found)
return nextName + " not found in " + currentFolder.Name;
return nextName + " not found in " + currentFolder.Data.Name;
}
}
Client.CurrentDirectory = currentFolder;
return "Current folder: " + currentFolder.Name;
return "Current folder: " + currentFolder.Data.Name;
}
}
}
}

View File

@@ -45,7 +45,7 @@ namespace OpenMetaverse.TestClient
Client.Inventory.RequestCreateItem(Client.Inventory.FindFolderForType(AssetType.Notecard),
file, desc, AssetType.Notecard, UUID.Random(), InventoryType.Notecard, PermissionMask.All,
delegate(bool success, InventoryItem item) {
delegate(bool success, ItemData item) {
if(success) // upload the asset
Client.Inventory.RequestUploadNotecardAsset(CreateNotecardAsset(body), item.UUID, new InventoryManager.NotecardUploadedAssetCallback(OnNoteUpdate));
}
@@ -83,4 +83,4 @@ namespace OpenMetaverse.TestClient
return assetData;
}
}
}
}

View File

@@ -34,12 +34,20 @@ namespace OpenMetaverse.TestClient
try
{
// find the folder
found = Client.Inventory.LocalFind(Client.Inventory.Store.RootFolder.UUID, target.Split('/'), 0, true);
if (found.Count.Equals(1))
found = Client.InventoryStore.InventoryFromPath(target.Split('/'), Client.InventoryStore.RootFolder);
if (found.Count > 0)
{
// move the folder to the trash folder
Client.Inventory.MoveFolder(found[0].UUID, Client.Inventory.FindFolderForType(AssetType.TrashFolder));
return String.Format("Moved folder {0} to Trash", found[0].Name);
InventoryBase item = found[0];
InventoryFolder trash = Client.InventoryStore[Client.Inventory.FindFolderForType(AssetType.TrashFolder)] as InventoryFolder;
if (trash != null)
{
item.Move(trash);
return String.Format("Moved folder {0} ({1}) to Trash", item.Name, item.UUID);
}
}
else
{
return String.Format("Unable to locate {0}", target);
}
}
catch (InvalidOutfitException ex)
@@ -49,4 +57,4 @@ namespace OpenMetaverse.TestClient
return string.Empty;
}
}
}
}

View File

@@ -26,29 +26,26 @@ namespace OpenMetaverse.TestClient.Commands.Inventory.Shell
return "First argument expected agent UUID.";
}
Manager = Client.Inventory;
Inventory = Manager.Store;
Inventory = Client.InventoryStore;
string ret = "";
string nl = "\n";
for (int i = 1; i < args.Length; ++i)
{
string inventoryName = args[i];
// WARNING: Uses local copy of inventory contents, need to download them first.
List<InventoryBase> contents = Inventory.GetContents(Client.CurrentDirectory);
if (Client.CurrentDirectory.IsStale)
{
Client.CurrentDirectory.DownloadContents(TimeSpan.FromSeconds(30));
}
bool found = false;
foreach (InventoryBase b in contents) {
if (inventoryName == b.Name || inventoryName == b.UUID.ToString())
foreach (InventoryBase b in Client.CurrentDirectory) {
string name = b.Name;
if (inventoryName == name || inventoryName == b.UUID.ToString())
{
found = true;
if (b is InventoryItem)
{
InventoryItem item = b as InventoryItem;
Manager.GiveItem(item.UUID, item.Name, item.AssetType, dest, true);
ret += "Gave " + item.Name + nl;
}
else
{
ret += "Unable to give folder " + b.Name + nl;
}
b.Give(dest, true);
ret += "Gave " + name + nl;
}
}
if (!found)

View File

@@ -25,27 +25,39 @@ namespace OpenMetaverse.TestClient
public override string Execute(string[] args, UUID fromAgentID)
{
Manager = Client.Inventory;
Inventory = Manager.Store;
Inventory = Client.InventoryStore;
StringBuilder result = new StringBuilder();
InventoryFolder rootFolder = Inventory.RootFolder;
PrintFolder(rootFolder, result, 0);
return result.ToString();
}
void PrintFolder(InventoryFolder f, StringBuilder result, int indent)
void PrintFolder(InventoryFolder folder, StringBuilder result, int indent)
{
foreach (InventoryBase i in Manager.FolderContents(f.UUID, Client.Self.AgentID, true, true, InventorySortOrder.ByName, 3000))
folder.DownloadContents(TimeSpan.FromSeconds(10));
foreach (InventoryBase b in folder)
{
result.AppendFormat("{0}{1} ({2})\n", new String(' ', indent * 2), i.Name, i.UUID);
if (i is InventoryFolder)
if (b is InventoryFolder)
{
InventoryFolder folder = (InventoryFolder)i;
PrintFolder(folder, result, indent + 1);
result.Append(Print(b as InventoryFolder, indent));
PrintFolder(b as InventoryFolder, result, indent + 1);
}
else if (b is InventoryItem)
{
result.Append(Print(b as InventoryItem, indent));
}
}
}
string Print(InventoryItem item, int indent)
{
return string.Format("{0}{1} ({2})\n", new String(' ', indent * 2), item.Data.Name, item.UUID);
}
string Print(InventoryFolder folder, int indent)
{
return string.Format("{0}{1} ({2})\n", new String(' ', indent * 2), folder.Data.Name, folder.UUID);
}
}
}
}

View File

@@ -24,13 +24,15 @@ namespace OpenMetaverse.TestClient.Commands.Inventory.Shell
longDisplay = true;
Manager = Client.Inventory;
Inventory = Manager.Store;
// WARNING: Uses local copy of inventory contents, need to download them first.
List<InventoryBase> contents = Inventory.GetContents(Client.CurrentDirectory);
Inventory = Client.InventoryStore;
if (Client.CurrentDirectory.IsStale)
Client.CurrentDirectory.DownloadContents(TimeSpan.FromSeconds(30));
string displayString = "";
string nl = "\n"; // New line character
// Pretty simple, just print out the contents.
foreach (InventoryBase b in contents)
foreach (InventoryBase b in Client.CurrentDirectory)
{
if (longDisplay)
{
@@ -51,16 +53,17 @@ namespace OpenMetaverse.TestClient.Commands.Inventory.Shell
{
InventoryItem item = b as InventoryItem;
displayString += "-";
displayString += PermMaskString(item.Permissions.OwnerMask);
displayString += PermMaskString(item.Permissions.GroupMask);
displayString += PermMaskString(item.Permissions.EveryoneMask);
displayString += PermMaskString(item.Data.Permissions.OwnerMask);
displayString += PermMaskString(item.Data.Permissions.GroupMask);
displayString += PermMaskString(item.Data.Permissions.EveryoneMask);
displayString += " " + item.UUID;
displayString += " " + item.Name;
}
}
else
{
displayString += b.Name;
string name = b.Name;
displayString += name;
}
displayString += nl;
}

View File

@@ -29,24 +29,22 @@ namespace OpenMetaverse.TestClient
else
return "Couldn't find prim " + objectID.ToString();
List<InventoryBase> items = Client.Inventory.GetTaskInventory(objectID, objectLocalID, 1000 * 30);
List<ItemData> items;
List<FolderData> folders;
Client.Inventory.GetTaskInventory(objectID, objectLocalID, TimeSpan.FromMilliseconds(1000 * 30), out items, out folders);
if (items != null)
{
string result = String.Empty;
for (int i = 0; i < items.Count; i++)
foreach (ItemData item in items)
{
if (items[i] is InventoryFolder)
{
result += String.Format("[Folder] Name: {0}", items[i].Name) + Environment.NewLine;
}
else
{
InventoryItem item = (InventoryItem)items[i];
result += String.Format("[Item] Name: {0} Desc: {1} Type: {2}", item.Name, item.Description,
result += String.Format("[Item] Name: {0} Desc: {1} Type: {2}", item.Name, item.Description,
item.AssetType) + Environment.NewLine;
}
}
foreach (FolderData folder in folders)
{
result += String.Format("[Folder] Name: {0}", folder.Name) + Environment.NewLine;
}
return result;

View File

@@ -131,20 +131,18 @@ namespace OpenMetaverse.TestClient
{
if ((prim.Flags & LLObject.ObjectFlags.InventoryEmpty) == 0)
{
List<InventoryBase> items = Client.Inventory.GetTaskInventory(prim.ID, prim.LocalID, 1000 * 30);
List<ItemData> items;
List<FolderData> folders;
Client.Inventory.GetTaskInventory(prim.ID, prim.LocalID, TimeSpan.FromSeconds(30), out items, out folders);
if (items != null)
{
for (int i = 0; i < items.Count; i++)
foreach (ItemData item in items)
{
if (!(items[i] is InventoryFolder))
{
InventoryItem item = (InventoryItem)items[i];
item.Permissions.NextOwnerMask = Perms;
Client.Inventory.UpdateTaskInventory(prim.LocalID, item);
++taskItems;
}
ItemData iitem = item;
iitem.Permissions.NextOwnerMask = Perms;
Client.Inventory.UpdateTaskInventory(prim.LocalID, iitem);
++taskItems;
}
}
}

View File

@@ -28,6 +28,8 @@ namespace OpenMetaverse.TestClient
private Vector3 left = new Vector3(0.9999f, 0, 0);
private Vector3 up = new Vector3(0, 0, 0.9999f);
private System.Timers.Timer updateTimer;
public Inventory InventoryStore;
public Inventory LibraryStore;
/// <summary>
///
@@ -59,7 +61,6 @@ namespace OpenMetaverse.TestClient
Network.RegisterCallback(PacketType.AlertMessage, new NetworkManager.PacketCallback(AlertMessageHandler));
VoiceManager = new VoiceManager(this);
updateTimer.Start();
}
@@ -72,8 +73,12 @@ namespace OpenMetaverse.TestClient
{
if (login == LoginStatus.Success)
{
// Start in the inventory root folder.
CurrentDirectory = Inventory.Store.RootFolder;
// Create the stores:
InventoryStore = new Inventory(Inventory, Inventory.InventorySkeleton);
LibraryStore = new Inventory(Inventory, Inventory.LibrarySkeleton);
// Start in the inventory root folder:
CurrentDirectory = InventoryStore.RootFolder;
}
}
@@ -244,20 +249,20 @@ namespace OpenMetaverse.TestClient
}
private bool Inventory_OnInventoryObjectReceived(InstantMessage offer, AssetType type,
private UUID Inventory_OnInventoryObjectReceived(InstantMessage offer, AssetType type,
UUID objectID, bool fromTask)
{
if (MasterKey != UUID.Zero)
{
if (offer.FromAgentID != MasterKey)
return false;
return UUID.Zero;
}
else if (GroupMembers != null && !GroupMembers.ContainsKey(offer.FromAgentID))
{
return false;
return UUID.Zero;
}
return true;
return Inventory.FindFolderForType(type);
}
}
}