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:
@@ -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);
|
||||
|
||||
@@ -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()));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user