Example #1
0
        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;
        }
Example #2
0
        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;
            }
        }
Example #3
0
        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
        }
Example #4
0
        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);
        }
Example #5
0
 /// <summary>
 /// Move this item to the target folder
 /// </summary>
 /// <param name="targetFolder"></param>
 public void MoveTo(InventoryFolder targetFolder)
 {
     this.FolderID = targetFolder.FolderID;
 }
Example #6
0
 public void MoveTo(InventoryFolder newParent)
 {
     MoveTo(newParent.FolderID);
 }
Example #7
0
        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." );
                }
            }
        }
Example #8
0
        internal void FolderRename(InventoryFolder ifolder)
        {
            Packet packet = InvPacketHelper.UpdateInventoryFolder(ifolder.Name, ifolder.ParentID, ifolder.Type, ifolder.FolderID);

            slClient.Network.SendPacket(packet);
        }
Example #9
0
        internal void FolderMove(InventoryFolder iFolder, LLUUID newParentID)
        {
            Packet packet = InvPacketHelper.MoveInventoryFolder(newParentID, iFolder.FolderID);

            slClient.Network.SendPacket(packet);
        }
Example #10
0
 internal void FolderRemove(InventoryFolder ifolder)
 {
     FolderRemove(ifolder.FolderID);
 }
Example #11
0
        /// <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;
                }
            }
        }