private void resetFoldersByUUID() { // Init folder structure with root htFoldersByUUID = new Dictionary <LLUUID, InventoryFolder>(); InventoryFolder ifRootFolder = new InventoryFolder(this, "My Inventory", uuidRootFolder, null); htFoldersByUUID[uuidRootFolder] = ifRootFolder; }
private void ClearState() { htFoldersByUUID.Clear(); FolderDownloadStatus.Clear(); alFolderRequestQueue.Clear(); if (slClient.Self.InventoryRootFolderUUID != null) { // Init folder structure with root InventoryFolder ifRootFolder = new InventoryFolder(this, "My Inventory", slClient.Self.InventoryRootFolderUUID, null); htFoldersByUUID[slClient.Self.InventoryRootFolderUUID] = ifRootFolder; } }
internal void ItemRemove(InventoryItem iitem) { InventoryFolder ifolder = getFolder(iitem.FolderID); ifolder.alContents.Remove(iitem); Packet packet = InvPacketHelper.RemoveInventoryItem(iitem.ItemID); slClient.Network.SendPacket(packet); #if DEBUG_PACKETS Console.WriteLine(packet); #endif }
private InventoryFolder getFolder(Queue <string> qFolderPath, InventoryFolder ifRoot) { string sCurFolder = qFolderPath.Dequeue(); foreach (InventoryBase ibFolder in ifRoot.alContents) { if (ibFolder is libsecondlife.InventorySystem.InventoryFolder) { if (((InventoryFolder)ibFolder).Name.Equals(sCurFolder)) { if (qFolderPath.Count == 0) { return((InventoryFolder)ibFolder); } else { return(getFolder(qFolderPath, (InventoryFolder)ibFolder)); } } } } return(null); }
/// <summary> /// Move this item to the target folder /// </summary> /// <param name="targetFolder"></param> public void MoveTo(InventoryFolder targetFolder) { this.FolderID = targetFolder.FolderID; }
public void MoveTo(InventoryFolder newParent) { MoveTo(newParent.FolderID); }
public void InventoryDescendentsHandler(Packet packet, Simulator simulator) { InventoryDescendentsPacket reply = (InventoryDescendentsPacket)packet; LastPacketRecieved = Helpers.GetUnixTime(); InventoryItem invItem; InventoryFolder invFolder; LLUUID uuidFolderID = new LLUUID(); int iDescendentsExpected = int.MaxValue; int iDescendentsReceivedThisBlock = 0; foreach (InventoryDescendentsPacket.ItemDataBlock itemBlock in reply.ItemData) { // There is always an item block, even if there isn't any items // the "filler" block will not have a name if (itemBlock.Name.Length != 0) { iDescendentsReceivedThisBlock++; invItem = new InventoryItem(this, itemBlock); InventoryFolder ifolder = (InventoryFolder)htFoldersByUUID[invItem.FolderID]; if (ifolder.alContents.Contains(invItem) == false) { if ((invItem.InvType == 7) && (invItem.Type == Asset.ASSET_TYPE_NOTECARD)) { InventoryItem temp = new InventoryNotecard(this, invItem); invItem = temp; } if ((invItem.InvType == 0) && (invItem.Type == Asset.ASSET_TYPE_IMAGE)) { InventoryItem temp = new InventoryImage(this, invItem); invItem = temp; } ifolder.alContents.Add(invItem); } } } foreach (InventoryDescendentsPacket.FolderDataBlock folderBlock in reply.FolderData) { String name = System.Text.Encoding.UTF8.GetString(folderBlock.Name).Trim().Replace("\0", ""); LLUUID folderid = folderBlock.FolderID; LLUUID parentid = folderBlock.ParentID; sbyte type = folderBlock.Type; // There is always an folder block, even if there isn't any folders // the "filler" block will not have a name if (folderBlock.Name.Length != 0) { invFolder = new InventoryFolder(this, name, folderid, parentid); iDescendentsReceivedThisBlock++; // Add folder to Parent InventoryFolder ifolder = (InventoryFolder)htFoldersByUUID[invFolder.ParentID]; if (ifolder.alContents.Contains(invFolder) == false) { ifolder.alContents.Add(invFolder); } // Add folder to UUID Lookup htFoldersByUUID[invFolder.FolderID] = invFolder; // It's not the root, should be safe to "recurse" if (!invFolder.FolderID.Equals(uuidRootFolder)) { bool alreadyQueued = false; foreach (DescendentRequest dr in alFolderRequestQueue) { if (dr.FolderID == invFolder.FolderID) { alreadyQueued = true; break; } } if (!alreadyQueued) { alFolderRequestQueue.Add(new DescendentRequest(invFolder.FolderID)); } } } } // Check how many descendents we're actually supposed to receive iDescendentsExpected = reply.AgentData.Descendents; uuidFolderID = reply.AgentData.FolderID; // Update download status for this folder if (iDescendentsReceivedThisBlock >= iDescendentsExpected) { // We received all the descendents we're expecting for this folder // in this packet, so go ahead and remove folder from status list. htFolderDownloadStatus.Remove(uuidFolderID); } else { // This one packet didn't have all the descendents we're expecting // so update the total we're expecting, and update the total downloaded DescendentRequest dr = (DescendentRequest)htFolderDownloadStatus[uuidFolderID]; dr.Expected = iDescendentsExpected; dr.Received += iDescendentsReceivedThisBlock; dr.LastReceived = Helpers.GetUnixTime(); if (dr.Received >= dr.Expected) { // Looks like after updating, we have all the descendents, // remove from folder status. htFolderDownloadStatus.Remove(uuidFolderID); } else { htFolderDownloadStatus[uuidFolderID] = dr; // Console.WriteLine( uuidFolderID + " is expecting " + (iDescendentsExpected - iStatus[1]) + " more packets." ); } } }
internal void FolderRename(InventoryFolder ifolder) { Packet packet = InvPacketHelper.UpdateInventoryFolder(ifolder.Name, ifolder.ParentID, ifolder.Type, ifolder.FolderID); slClient.Network.SendPacket(packet); }
internal void FolderMove(InventoryFolder iFolder, LLUUID newParentID) { Packet packet = InvPacketHelper.MoveInventoryFolder(newParentID, iFolder.FolderID); slClient.Network.SendPacket(packet); }
internal void FolderRemove(InventoryFolder ifolder) { FolderRemove(ifolder.FolderID); }
/// <summary> /// Returned in response to a InventoryDescendantRequest. Contains information about the /// contents of a folder. /// </summary> /// <seealso cref="InventoryManager.RequestFolder"/> /// <param name="packet"></param> /// <param name="simulator"></param> public void InventoryDescendentsHandler(Packet packet, Simulator simulator) { InventoryDescendentsPacket reply = (InventoryDescendentsPacket)packet; // The UUID of this folder. LLUUID uuidFolderID = reply.AgentData.FolderID; // Get the original Descendent Request for this Packet DownloadRequest_Folder dr = (DownloadRequest_Folder)FolderDownloadStatus[uuidFolderID]; // Update Inventory Manager's last tick point, used for timeouts and such LastPacketRecievedAtTick = Environment.TickCount; // Some temp variables to be reused as we're parsing the packet InventoryItem invItem; InventoryFolder invFolder; // Used to count the number of descendants received to see if we're finished or not. int iDescendentsExpected = reply.AgentData.Descendents; int iDescendentsReceivedThisBlock = 0; foreach (InventoryDescendentsPacket.ItemDataBlock itemBlock in reply.ItemData) { // There is always an item block, even if there isn't any items // the "filler" block will not have a name if (itemBlock.Name.Length != 0) { iDescendentsReceivedThisBlock++; if (itemBlock.ItemID == LLUUID.Zero) { // this shouldn't ever happen, unless you've uploaded an invalid item // to yourself while developping inventory code :-( } else { invItem = new InventoryItem(this, itemBlock); InventoryFolder ifolder = (InventoryFolder)htFoldersByUUID[invItem.FolderID]; if (ifolder._Contents.Contains(invItem) == false) { if ((invItem.InvType == 7) && (invItem.Type == Asset.ASSET_TYPE_NOTECARD)) { InventoryItem temp = new InventoryNotecard(this, invItem); invItem = temp; } if ((invItem.InvType == 0) && (invItem.Type == Asset.ASSET_TYPE_IMAGE)) { InventoryItem temp = new InventoryImage(this, invItem); invItem = temp; } if ((invItem.InvType == 18) && ( (invItem.Type == Asset.ASSET_TYPE_WEARABLE_BODY) || (invItem.Type == Asset.ASSET_TYPE_WEARABLE_CLOTHING) ) ) { InventoryItem temp = new InventoryWearable(this, invItem); invItem = temp; } ifolder._Contents.Add(invItem); } } } } foreach (InventoryDescendentsPacket.FolderDataBlock folderBlock in reply.FolderData) { String name = System.Text.Encoding.UTF8.GetString(folderBlock.Name).Trim().Replace("\0", ""); LLUUID folderid = folderBlock.FolderID; LLUUID parentid = folderBlock.ParentID; // unused? sbyte type = folderBlock.Type; // There is always an folder block, even if there isn't any folders // the "filler" block will not have a name if (folderBlock.Name.Length != 0) { invFolder = new InventoryFolder(this, name, folderid, parentid); iDescendentsReceivedThisBlock++; // Add folder to Parent InventoryFolder ifolder = (InventoryFolder)htFoldersByUUID[invFolder.ParentID]; if (ifolder._Contents.Contains(invFolder) == false) { ifolder._Contents.Add(invFolder); } // Add folder to UUID Lookup htFoldersByUUID[invFolder.FolderID] = invFolder; // Do we recurse? if (dr.Recurse) { // It's not the root, should be safe to "recurse" if (!invFolder.FolderID.Equals(slClient.Self.InventoryRootFolderUUID)) { bool alreadyQueued = false; foreach (DownloadRequest_Folder adr in alFolderRequestQueue) { if (adr.FolderID == invFolder.FolderID) { alreadyQueued = true; break; } } if (!alreadyQueued) { alFolderRequestQueue.Add(new DownloadRequest_Folder(invFolder.FolderID)); } } } } } // Update download status for this folder if (iDescendentsReceivedThisBlock >= iDescendentsExpected) { // We received all the descendents we're expecting for this folder // in this packet, so go ahead and remove folder from status list. FolderDownloadStatus.Remove(uuidFolderID); dr.RequestComplete.Set(); } else { // This one packet didn't have all the descendents we're expecting // so update the total we're expecting, and update the total downloaded dr.Expected = iDescendentsExpected; dr.Received += iDescendentsReceivedThisBlock; dr.LastReceivedAtTick = Environment.TickCount; if (dr.Received >= dr.Expected) { // Looks like after updating, we have all the descendents, // remove from folder status. FolderDownloadStatus.Remove(uuidFolderID); dr.RequestComplete.Set(); } else { FolderDownloadStatus[uuidFolderID] = dr; } } }