Example #1
0
        private void DeleteItem(TreeNode node)
        {
            if (node == null)
            {
                return;
            }

            InventoryBase io = (InventoryBase)node.Tag;

            if (io is InventoryFolder)
            {
                InventoryFolder folder = (InventoryFolder)io;
                //treeLookup.Remove(folder.UUID);
                client.Inventory.RemoveFolder(folder.UUID);
                folder = null;
            }
            else if (io is InventoryItem)
            {
                InventoryItem item = (InventoryItem)io;
                //treeLookup.Remove(item.UUID);
                client.Inventory.RemoveItem(item.UUID);
                item = null;
            }

            io = null;

            node.Remove();
            node = null;
        }
Example #2
0
        public static InventoryFolder[] ParseInventoryFolders(string key, UUID owner, LLSDMap reply)
        {
            List <InventoryFolder> folders = new List <InventoryFolder>();

            LLSD skeleton;

            if (reply.TryGetValue(key, out skeleton) && skeleton.Type == LLSDType.Array)
            {
                LLSDArray array = (LLSDArray)skeleton;

                for (int i = 0; i < array.Count; i++)
                {
                    if (array[i].Type == LLSDType.Map)
                    {
                        LLSDMap         map    = (LLSDMap)array[i];
                        InventoryFolder folder = new InventoryFolder(map["folder_id"].AsUUID());
                        folder.PreferredType = (AssetType)map["type_default"].AsInteger();
                        folder.Version       = map["version"].AsInteger();
                        folder.OwnerID       = owner;
                        folder.ParentUUID    = map["parent_id"].AsUUID();
                        folder.Name          = map["name"].AsString();

                        folders.Add(folder);
                    }
                }
            }

            return(folders.ToArray());
        }
        public void TestFindFolderForType()
        {
            var owner = Guid.NewGuid();
            InventoryFolder folder1 = new InventoryFolder
            {
                FolderId = Guid.NewGuid(),
                Level = FolderLevel.TopLevel,
                Name = "Test1",
                OwnerId = owner,
                ParentId = Guid.Empty,
                Type = 2
            };
            InventoryFolder folder2 = new InventoryFolder
            {
                FolderId = Guid.NewGuid(),
                Level = FolderLevel.TopLevel,
                Name = "Test2",
                OwnerId = owner,
                ParentId = Guid.Empty,
                Type = 3
            };

            _storage.CreateFolder(folder1);
            _storage.CreateFolder(folder2);

            Assert.AreEqual(folder1.FolderId, _storage.FindFolderForType(owner, 2).FolderId);
        }
Example #4
0
        void Inventory_FolderUpdated(object sender, FolderUpdatedEventArgs e)
        {
            if (COF == null)
            {
                return;
            }

            if (e.FolderID == COF.UUID && e.Success)
            {
                COF = (InventoryFolder)Client.Inventory.Store[COF.UUID];
                lock (FolderSync)
                {
                    lock (Content) Content.Clear();


                    List <UUID> items  = new List <UUID>();
                    List <UUID> owners = new List <UUID>();

                    foreach (var link in ContentLinks())
                    {
                        //if (Client.Inventory.Store.Contains(link.AssetUUID))
                        //{
                        //    continue;
                        //}
                        items.Add(link.AssetUUID);
                        owners.Add(Client.Self.AgentID);
                    }

                    if (items.Count > 0)
                    {
                        Client.Inventory.RequestFetchInventory(items, owners);
                    }
                }
            }
        }
Example #5
0
        public UUID CopyFolder(InventoryFolder folder, UUID destination)
        {
            UUID newFolderID = CreateFolder(destination, folder.Name, folder.PreferredType);
            //var newFolder = (InventoryFolder)Store[newFolderID];

            var items = FetchFolder(folder);

            foreach (var item in items)
            {
                if (item is InventoryItem)
                {
                    AutoResetEvent itemCopied = new AutoResetEvent(false);
                    Client.Inventory.RequestCopyItem(item.UUID, newFolderID, item.Name, item.OwnerID, (newItem) =>
                    {
                        itemCopied.Set();
                    });
                    if (itemCopied.WaitOne(20 * 1000, false))
                    {
                        Logger.Log("Copied item " + item.Name, Helpers.LogLevel.Info);
                    }
                    else
                    {
                        Logger.Log("Failed to copy item " + item.Name, Helpers.LogLevel.Warning);
                    }
                }
                else if (item is InventoryFolder)
                {
                    CopyFolder((InventoryFolder)item, newFolderID);
                }
            }

            return(newFolderID);
        }
        public void TestCreateAndReadFolder()
        {
            InventoryFolder folder = new InventoryFolder
            {
                FolderId = Guid.NewGuid(),
                Level = FolderLevel.Root,
                Name = "Test",
                OwnerId = Guid.NewGuid(),
                ParentId = Guid.Empty,
                Type = 2
            };

            _storage.CreateFolder(folder);

            var copy = _storage.GetFolderAttributes(folder.FolderId);

            Assert.AreEqual(folder.FolderId, copy.FolderId);
            //note that level is a property of the skel and GetFolderAttributes doesnt load it
            Assert.AreEqual(folder.Name, copy.Name);
            Assert.AreEqual(folder.OwnerId, copy.OwnerId);
            Assert.AreEqual(folder.ParentId, copy.ParentId);
            Assert.AreEqual(folder.Type, copy.Type);

            //get the skel for this user to check the level and version
            var skel = _storage.GetInventorySkeleton(folder.OwnerId);

            Assert.AreEqual(1, skel.Count);
            Assert.AreEqual(1, skel[0].Version);
            Assert.AreEqual(folder.Level, skel[0].Level);
            Assert.AreEqual(folder.Name, skel[0].Name);
            Assert.AreEqual(folder.ParentId, skel[0].ParentId);
            Assert.AreEqual(folder.Type, skel[0].Type);
        }
Example #7
0
    /// <summary>
    /// Updates the state of the InventoryNode and inventory data structure that
    /// is responsible for the InventoryObject. If the item was previously not added to inventory,
    /// it adds the item, and updates structure accordingly. If it was, it updates the
    /// InventoryNode, changing the parent node if <code>item.parentUUID</code> does
    /// not match <code>node.Parent.Data.UUID</code>.
    ///
    /// You can not set the inventory root folder using this method
    /// </summary>
    /// <param name="item">The InventoryObject to store</param>
    public void UpdateNodeFor(InventoryBase item)
    {
        lock (Items)
        {
            InventoryNode itemParent = null;
            if (item.ParentUUID != UUID.Zero && !Items.TryGetValue(item.ParentUUID, out itemParent))
            {
                // OK, we have no data on the parent, let's create a fake one.
                InventoryFolder fakeParent = new InventoryFolder(item.ParentUUID);
                fakeParent.DescendentCount = 1; // Dear god, please forgive me.
                itemParent             = new InventoryNode(fakeParent);
                Items[item.ParentUUID] = itemParent;
                // Unfortunately, this breaks the nice unified tree
                // while we're waiting for the parent's data to come in.
                // As soon as we get the parent, the tree repairs itself.
                Console.WriteLine("Attempting to update inventory child of " +
                                  item.ParentUUID.ToString() + " when we have no local reference to that folder");

                if (true)
                {
                    // Fetch the parent
                    List <UUID> fetchreq = new List <UUID>(1);
                    fetchreq.Add(item.ParentUUID);
                    //Manager.FetchInventory(fetchreq); // we cant fetch folder data! :-O
                }
            }

            InventoryNode itemNode;
            if (Items.TryGetValue(item.UUID, out itemNode)) // We're updating.
            {
                InventoryNode oldParent = itemNode.Parent;
                // Handle parent change
                if (oldParent == null || itemParent == null || itemParent.Data.UUID != oldParent.Data.UUID)
                {
                    if (oldParent != null)
                    {
                        lock (oldParent.Nodes.SyncRoot)
                            oldParent.Nodes.Remove(item.UUID);
                    }
                    if (itemParent != null)
                    {
                        lock (itemParent.Nodes.SyncRoot)
                            itemParent.Nodes[item.UUID] = itemNode;
                    }
                }

                itemNode.Parent = itemParent;



                itemNode.Data = item;
            }
            else // We're adding.
            {
                itemNode = new InventoryNode(item, itemParent);
                Items.Add(item.UUID, itemNode);
            }
        }
    }
Example #8
0
        private void btnDecline_Click(object sender, EventArgs e)
        {
            try
            {
                //UUID invfolder = client.Inventory.FindFolderForType(invtype);

                UUID invfolder = UUID.Zero;

                if (invtype == AssetType.Folder)
                {
                    instance.State.FolderRcvd = true;
                    invfolder = client.Inventory.Store.RootFolder.UUID;
                }
                else
                {
                    instance.State.FolderRcvd = false;
                    invfolder = client.Inventory.FindFolderForType(invtype);
                }

                if (diag == InstantMessageDialog.InventoryOffered)
                {
                    client.Self.InstantMessage(client.Self.Name, msg.FromAgentID, string.Empty, msg.IMSessionID, InstantMessageDialog.InventoryDeclined, InstantMessageOnline.Offline, instance.SIMsittingPos(), client.Network.CurrentSim.RegionID, invfolder.GetBytes()); // Decline Inventory Offer

                    try
                    {
                        //client.Inventory.RemoveItem(objectID);
                        //client.Inventory.RequestFetchInventory(objectID, client.Self.AgentID);

                        InventoryBase item    = client.Inventory.Store.Items[objectID].Data;
                        UUID          content = client.Inventory.FindFolderForType(AssetType.TrashFolder);

                        InventoryFolder folder = (InventoryFolder)client.Inventory.Store.Items[content].Data;

                        if (invtype != AssetType.Folder)
                        {
                            client.Inventory.Move(item, folder, item.Name);
                        }
                        else
                        {
                            client.Inventory.MoveFolder(objectID, content, item.Name);
                        }
                    }
                    catch {; }
                }
                else if (diag == InstantMessageDialog.TaskInventoryOffered)
                {
                    client.Self.InstantMessage(client.Self.Name, msg.FromAgentID, string.Empty, msg.IMSessionID, InstantMessageDialog.TaskInventoryDeclined, InstantMessageOnline.Offline, instance.SIMsittingPos(), client.Network.CurrentSim.RegionID, invfolder.GetBytes()); // Decline Inventory Offer
                }

                timer1.Stop();
                timer1.Enabled = false;
            }
            catch
            {
                ;
            }

            this.Close();
        }
Example #9
0
        public override CmdResult ExecuteRequest(CmdRequest args)
        {
            if (args.Length > 1)
            {
                return(ShowUsage()); // " ls [-l]";
            }
            bool longDisplay = false;

            if (args.Length > 0 && args[0] == "-l")
            {
                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(TheBotClient.CurrentDirectory);
            string displayString          = "";
            string nl = "\n"; // New line character

            // Pretty simple, just print out the contents.
            foreach (InventoryBase b in contents)
            {
                if (longDisplay)
                {
                    // Generate a nicely formatted description of the item.
                    // It kinda looks like the WriteLine of the unix ls.
                    // starts with 'd' if the inventory is a folder, '-' if not.
                    // 9 character permissions string
                    // UUID of object
                    // Name of object
                    if (b is InventoryFolder)
                    {
                        InventoryFolder folder = b as InventoryFolder;
                        displayString += "d--------- ";
                        displayString += folder.UUID;
                        displayString += " " + folder.Name;
                    }
                    else if (b is InventoryItem)
                    {
                        InventoryItem item = b as InventoryItem;
                        displayString += "-";
                        displayString += PermMaskString(item.Permissions.OwnerMask);
                        displayString += PermMaskString(item.Permissions.GroupMask);
                        displayString += PermMaskString(item.Permissions.EveryoneMask);
                        displayString += " " + item.UUID;
                        displayString += " " + item.Name;
                        displayString += nl;
                        displayString += "  AssetID: " + item.AssetUUID;
                    }
                }
                else
                {
                    displayString += b.Name;
                }
                displayString += nl;
            }
            return(Success(displayString));
        }
Example #10
0
        private Dictionary <UUID, InventoryBase> CreateInventory(UUID ownerID, out InventoryFolder rootFolder)
        {
            Dictionary <UUID, InventoryBase> inventory = new Dictionary <UUID, InventoryBase>();

            // Create a default inventory
            UUID rootFolderID = CreateFolder(inventory, UUID.Zero, "My Inventory", "application/vnd.ll.folder", ownerID);

            rootFolder = (InventoryFolder)inventory[rootFolderID];

            CreateFolder(inventory, rootFolderID, "Animations", "application/vnd.ll.animation", ownerID);
            CreateFolder(inventory, rootFolderID, "Body Parts", "application/vnd.ll.bodypart", ownerID);
            CreateFolder(inventory, rootFolderID, "Calling Cards", "application/vnd.ll.callingcard", ownerID);
            CreateFolder(inventory, rootFolderID, "Gestures", "application/vnd.ll.gesture", ownerID);
            CreateFolder(inventory, rootFolderID, "Landmarks", "application/vnd.ll.landmark", ownerID);
            CreateFolder(inventory, rootFolderID, "Lost and Found", "application/vnd.ll.lostandfoundfolder", ownerID);
            CreateFolder(inventory, rootFolderID, "Notecards", "application/vnd.ll.notecard", ownerID);
            CreateFolder(inventory, rootFolderID, "Objects", "application/vnd.ll.primitive", ownerID);
            CreateFolder(inventory, rootFolderID, "Photo Album", "application/vnd.ll.snapshotfolder", ownerID);
            CreateFolder(inventory, rootFolderID, "Scripts", "application/vnd.ll.lsltext", ownerID);
            CreateFolder(inventory, rootFolderID, "Sounds", "audio/ogg", ownerID);
            CreateFolder(inventory, rootFolderID, "Textures", "image/x-j2c", ownerID);
            CreateFolder(inventory, rootFolderID, "Trash", "application/vnd.ll.trashfolder", ownerID);

            UUID clothingFolder = CreateFolder(inventory, rootFolderID, "Clothing", "application/vnd.ll.clothing", ownerID);
            UUID outfitFolder   = CreateFolder(inventory, clothingFolder, "Default Outfit", "application/octet-stream", ownerID);

            UUID hairItem  = CreateItem(inventory, outfitFolder, "Default Hair", "Default Hair", WearableType.Hair, HAIR_ASSET, "application/vnd.ll.bodypart", ownerID);
            UUID pantsItem = CreateItem(inventory, outfitFolder, "Default Pants", "Default Pants", WearableType.Pants, PANTS_ASSET, "application/vnd.ll.clothing", ownerID);
            UUID shapeItem = CreateItem(inventory, outfitFolder, "Default Shape", "Default Shape", WearableType.Shape, SHAPE_ASSET, "application/vnd.ll.bodypart", ownerID);
            UUID shirtItem = CreateItem(inventory, outfitFolder, "Default Shirt", "Default Shirt", WearableType.Shirt, SHIRT_ASSET, "application/vnd.ll.clothing", ownerID);
            UUID skinItem  = CreateItem(inventory, outfitFolder, "Default Skin", "Default Skin", WearableType.Skin, SKIN_ASSET, "application/vnd.ll.bodypart", ownerID);
            UUID eyesItem  = CreateItem(inventory, outfitFolder, "Default Eyes", "Default Eyes", WearableType.Eyes, EYES_ASSET, "application/vnd.ll.bodypart", ownerID);

            if (m_userClient != null)
            {
                OSDMap appearanceMap = new OSDMap
                {
                    { "Height", OSD.FromReal(1.771488d) },
                    { "ShapeItem", OSD.FromUUID(shapeItem) },
                    { "ShapeAsset", OSD.FromUUID(SHAPE_ASSET) },
                    { "EyesItem", OSD.FromUUID(eyesItem) },
                    { "EyesAsset", OSD.FromUUID(EYES_ASSET) },
                    { "HairItem", OSD.FromUUID(hairItem) },
                    { "HairAsset", OSD.FromUUID(HAIR_ASSET) },
                    { "PantsItem", OSD.FromUUID(pantsItem) },
                    { "PantsAsset", OSD.FromUUID(PANTS_ASSET) },
                    { "ShirtItem", OSD.FromUUID(shirtItem) },
                    { "ShirtAsset", OSD.FromUUID(SHIRT_ASSET) },
                    { "SkinItem", OSD.FromUUID(skinItem) },
                    { "SkinAsset", OSD.FromUUID(SKIN_ASSET) }
                };

                m_userClient.UpdateUserFields(ownerID, new OSDMap {
                    { "LLAppearance", appearanceMap }
                });
            }

            return(inventory);
        }
Example #11
0
        public object Outfit(string name, string token)
        {
            if (tokens.Allow(token, "inventory", "Outfit", handleGetClientIP()) == false)
            {
                return(Failure("Token not accepted", "Outfit", new [] { name }));
            }
            if (helpers.notempty(name) == false)
            {
                return(Failure("Named folder value is empty", "Outfit", new [] { name }));
            }
            // uses the Clothing folder
            // must be a full outfit (shapes/eyes ect)
            InventoryFolder      AA = bot.GetClient.Inventory.Store.RootFolder;
            List <InventoryBase> T  = bot.GetClient.Inventory.Store.GetContents(AA);

            AA = null;
            foreach (InventoryBase R in T)
            {
                if (R.Name == "Clothing")
                {
                    AA = (InventoryFolder)R;
                    break;
                }
            }
            if (AA == null)
            {
                return(Failure("Cant find Clothing folder", "Outfit", new [] { name }));
            }
            T  = bot.GetClient.Inventory.Store.GetContents(AA);
            AA = null;
            foreach (InventoryBase R in T)
            {
                if (R.Name == name)
                {
                    AA = (InventoryFolder)R;
                    break;
                }
            }
            if (AA == null)
            {
                return(Failure("Cant find target folder", "Outfit", new [] { name }));
            }
            List <InventoryBase> contents  = bot.GetClient.Inventory.FolderContents(AA.UUID, bot.GetClient.Self.AgentID, true, true, InventorySortOrder.ByName, 5 * 1000);
            List <InventoryItem> wareables = new List <InventoryItem>();

            if (contents == null)
            {
                return(Failure("target folder is empty or so full I cant get it in 5 secs...", "Outfit", new [] { name }));
            }
            foreach (InventoryBase item in contents)
            {
                if ((item is InventoryWearable) || (item is InventoryObject))
                {
                    wareables.Add((InventoryItem)item);
                }
            }
            bot.GetClient.Appearance.ReplaceOutfit(wareables, false);
            return(BasicReply("ok", "Outfit", new [] { name }));
        }
 public void regFolderHook(InventoryFolder folder)
 {
     if (!hooked.ContainsKey(folder.UUID))
     {
         hooked.Add(folder.UUID, folder.Name);
         WriteLine("  regFolderHook " + folder.Name);
     }
 }
Example #13
0
 /// <summary>
 /// Initialize everything that needs to be initialized once we're logged in.
 /// </summary>
 /// <param name="login">The status of the login</param>
 /// <param name="message">Error message on failure, MOTD on success.</param>
 public void  LoginHandler(LoginStatus login, string message)
 {
     if (login == LoginStatus.Success)
     {
         // Start in the inventory root folder.
         CurrentDirectory = Inventory.Store.RootFolder;
     }
 }
Example #14
0
 /// <summary>
 /// Initialize everything that needs to be initialized once we're logged in.
 /// </summary>
 /// <param name="login">The status of the login</param>
 /// <param name="message">Error message on failure, MOTD on success.</param>
 public void LoginHandler(object sender, LoginProgressEventArgs e)
 {
     if (e.Status == LoginStatus.Success)
     {
         // Start in the inventory root folder.
         CurrentDirectory = Inventory.Store.RootFolder;
     }
 }
 public static bool TryGetSpecificOrDefaultFolderOrFallback(
     this IInventoryFolderServiceInterface folderServiceInterface,
     UUID principalID,
     UUID specificFolder,
     AssetType type,
     out InventoryFolder folder) =>
 folderServiceInterface.TryGetValue(principalID, specificFolder, out folder) ||
 folderServiceInterface.TryGetDefaultFolderOrFallback(principalID, type, out folder);
Example #16
0
        Process(RestBot b, Dictionary <string, string> Parameters)
        {
            UUID folderID;

            DebugUtilities.WriteDebug("Entering folder key parser");
            try
            {
                bool check = false;
                if (Parameters.ContainsKey("key"))
                {
                    DebugUtilities.WriteDebug("Attempting to parse from POST");
                    check =
                        UUID
                        .TryParse(Parameters["key"].ToString().Replace("_", " "),
                                  out folderID);
                    DebugUtilities.WriteDebug("Succesfully parsed POST");
                }
                else
                {
                    folderID = UUID.Zero;                     // start with root folder
                    check    = true;
                }

                if (
                    check                     // means that we have a correctly parsed key OR no key
                    )
                //  which is fine too (attempts root folder)
                {
                    DebugUtilities.WriteDebug("Entering loop");

                    Manager   = b.Client.Inventory;
                    Inventory = Manager.Store;

                    StringBuilder response = new StringBuilder();

                    InventoryFolder startFolder = new InventoryFolder(folderID);

                    if (folderID == UUID.Zero)
                    {
                        startFolder = Inventory.RootFolder;
                    }

                    PrintFolder(b, startFolder, response);
                    DebugUtilities.WriteDebug("Complete");

                    return($"<inventory>{response}</inventory>");
                }
                else
                {
                    return($"<error>{MethodName}: parsekey</error>");
                }
            }
            catch (Exception e)
            {
                DebugUtilities.WriteError(e.Message);
                return($"<error>{MethodName}: {e.Message}</error>");
            }
        }
        private static UUID GetPath(
            UGUI principalID,
            InventoryServiceInterface inventoryService,
            Dictionary <UUID, UUID> folders,
            string path,
            LoadOptions options)
        {
            path = path.Substring(10); /* Get Rid of inventory/ */
            int slashPos = path.LastIndexOf('/');

            if (slashPos >= 0)
            {
                path = path.Substring(0, slashPos);
            }

            string[] pathcomps = path.Split('/');
            var      finalpath = new StringBuilder();
            UUID     folderID  = folders[string.Empty];

            int pathidx = 0;

            if ((options & LoadOptions.Merge) != 0 &&
                pathcomps[0].StartsWith("MyInventory") &&
                pathcomps[0].Length == 13 + 36)
            {
                pathidx = 1;
            }

            for (; pathidx < pathcomps.Length; ++pathidx)
            {
                if (finalpath.Length != 0)
                {
                    finalpath.Append("/");
                }

                string uuidstr      = pathcomps[pathidx].Substring(pathcomps[pathidx].Length - 36);
                UUID   nextfolderid = UUID.Parse(uuidstr);
                string pname        = pathcomps[pathidx].Substring(0, pathcomps[pathidx].Length - 38);
                finalpath.Append(pname);
                if (folders.ContainsKey(nextfolderid))
                {
                    folderID = folders[nextfolderid];
                }
                else
                {
                    var folder = new InventoryFolder
                    {
                        Owner          = principalID,
                        ParentFolderID = folderID,
                        Name           = EscapingMethods.UnescapeName(pname)
                    };
                    inventoryService.Folder.Add(folder);
                    folderID = folder.ID;
                    folders[nextfolderid] = folderID;
                }
            }
            return(folderID);
        }
 public static Dictionary <string, object> ToDictionary(this InventoryFolder folder) => new Dictionary <string, object>
 {
     ["ID"]             = folder.ID,
     ["ParentFolderID"] = folder.ParentFolderID,
     ["Name"]           = folder.Name,
     ["DefaultType"]    = folder.DefaultType,
     ["OwnerID"]        = folder.Owner.ID,
     ["Version"]        = folder.Version
 };
 public bool CreateNewFolder(LLUUID folderID, ushort type)
 {
     InventoryFolder Folder = new InventoryFolder();
     Folder.FolderID = folderID;
     Folder.OwnerID = this.AgentID;
     Folder.DefaultType = type;
     this.InventoryFolders.Add(Folder.FolderID, Folder);
     return (true);
 }
 public void appendFolderHook(InventoryFolder folder)
 {
     if (!hooked.ContainsKey(folder.UUID))
     {
         hooked.Add(folder.UUID, folder.Name);
         //    botclient.Inventory.OnContentsRetrieved += new InventoryFolder.ContentsRetrieved(myfolder_OnContentsRetrieved);
         WriteLine("  appendFolderHook " + folder.Name);
     }
 }
Example #21
0
 public void AddInventoryFolder(InventoryFolder folder)
 {
     FolderData.Add(new FolderDataEntry
     {
         FolderID    = folder.ID,
         ParentID    = folder.ParentFolderID,
         DefaultType = folder.DefaultType,
         Name        = folder.Name
     });
 }
        public void FetchInventoryDescendents(SimClient userInfo, FetchInventoryDescendentsPacket FetchDescend)
        {
            if (this._agentsInventory.ContainsKey(userInfo.AgentID))
            {
                AgentInventory agentInventory = this._agentsInventory[userInfo.AgentID];
                if (FetchDescend.InventoryData.FetchItems)
                {
                    if (agentInventory.InventoryFolders.ContainsKey(FetchDescend.InventoryData.FolderID))
                    {
                        InventoryFolder            Folder  = agentInventory.InventoryFolders[FetchDescend.InventoryData.FolderID];
                        InventoryDescendentsPacket Descend = new InventoryDescendentsPacket();
                        Descend.AgentData.AgentID     = userInfo.AgentID;
                        Descend.AgentData.OwnerID     = Folder.OwnerID;
                        Descend.AgentData.FolderID    = FetchDescend.InventoryData.FolderID;
                        Descend.AgentData.Descendents = Folder.Items.Count;
                        Descend.AgentData.Version     = Folder.Items.Count;


                        Descend.ItemData = new InventoryDescendentsPacket.ItemDataBlock[Folder.Items.Count];
                        for (int i = 0; i < Folder.Items.Count; i++)
                        {
                            InventoryItem Item = Folder.Items[i];
                            Descend.ItemData[i]               = new InventoryDescendentsPacket.ItemDataBlock();
                            Descend.ItemData[i].ItemID        = Item.ItemID;
                            Descend.ItemData[i].AssetID       = Item.AssetID;
                            Descend.ItemData[i].CreatorID     = Item.CreatorID;
                            Descend.ItemData[i].BaseMask      = FULL_MASK_PERMISSIONS;
                            Descend.ItemData[i].CreationDate  = 1000;
                            Descend.ItemData[i].Description   = _enc.GetBytes(Item.Description + "\0");
                            Descend.ItemData[i].EveryoneMask  = FULL_MASK_PERMISSIONS;
                            Descend.ItemData[i].Flags         = 1;
                            Descend.ItemData[i].FolderID      = Item.FolderID;
                            Descend.ItemData[i].GroupID       = new LLUUID("00000000-0000-0000-0000-000000000000");
                            Descend.ItemData[i].GroupMask     = FULL_MASK_PERMISSIONS;
                            Descend.ItemData[i].InvType       = Item.InvType;
                            Descend.ItemData[i].Name          = _enc.GetBytes(Item.Name + "\0");
                            Descend.ItemData[i].NextOwnerMask = FULL_MASK_PERMISSIONS;
                            Descend.ItemData[i].OwnerID       = Item.OwnerID;
                            Descend.ItemData[i].OwnerMask     = FULL_MASK_PERMISSIONS;
                            Descend.ItemData[i].SalePrice     = 100;
                            Descend.ItemData[i].SaleType      = 0;
                            Descend.ItemData[i].Type          = Item.Type;
                            Descend.ItemData[i].CRC           = libsecondlife.Helpers.InventoryCRC(1000, 0, Descend.ItemData[i].InvType, Descend.ItemData[i].Type, Descend.ItemData[i].AssetID, Descend.ItemData[i].GroupID, 100, Descend.ItemData[i].OwnerID, Descend.ItemData[i].CreatorID, Descend.ItemData[i].ItemID, Descend.ItemData[i].FolderID, FULL_MASK_PERMISSIONS, 1, FULL_MASK_PERMISSIONS, FULL_MASK_PERMISSIONS, FULL_MASK_PERMISSIONS);
                        }

                        userInfo.OutPacket(Descend);
                    }
                }
                else
                {
                    Console.WriteLine("fetch subfolders");
                }
            }
        }
        void IInventoryFolderServiceInterface.Move(UUID principalID, UUID folderID, UUID toFolderID)
        {
            InventoryFolder thisfolder = Folder[principalID, folderID];

            if (folderID == toFolderID)
            {
                throw new ArgumentException("folderID != toFolderID");
            }

            using (var connection = new MySqlConnection(m_ConnectionString))
            {
                connection.Open();
                connection.InsideTransaction((transaction) =>
                {
                    if (!IsParentFolderIdValid(connection, principalID, toFolderID, folderID, transaction))
                    {
                        throw new InvalidParentFolderIdException(string.Format("Invalid parent folder {0} for folder {1}", toFolderID, folderID));
                    }


                    using (var cmd = new MySqlCommand("SELECT NULL FROM " + m_InventoryFolderTable + " WHERE ID = @folderid AND OwnerID = @ownerid LIMIT 1", connection)
                    {
                        Transaction = transaction
                    })
                    {
                        cmd.Parameters.AddParameter("@folderid", toFolderID);
                        cmd.Parameters.AddParameter("@ownerid", principalID);
                        using (MySqlDataReader reader = cmd.ExecuteReader())
                        {
                            if (!reader.Read())
                            {
                                throw new InventoryFolderNotStoredException(folderID);
                            }
                        }
                    }
                    using (var cmd = new MySqlCommand("UPDATE " + m_InventoryFolderTable + " SET ParentFolderID = @folderid WHERE ID = @id AND OwnerID = @ownerid", connection)
                    {
                        Transaction = transaction
                    })
                    {
                        cmd.Parameters.AddParameter("@folderid", toFolderID);
                        cmd.Parameters.AddParameter("@ownerid", principalID);
                        cmd.Parameters.AddParameter("@id", folderID);
                        if (cmd.ExecuteNonQuery() < 1)
                        {
                            throw new InventoryFolderNotStoredException(folderID);
                        }
                    }
                });
            }
            IncrementVersionNoExcept(principalID, toFolderID);
            IncrementVersionNoExcept(principalID, thisfolder.ParentFolderID);
        }
Example #24
0
 void PrintFolder(InventoryFolder f, StringBuilder result, int indent)
 {
     foreach (InventoryBase i in Manager.FolderContents(f.UUID, Client.Self.AgentID, true, true, InventorySortOrder.ByName, 3000))
     {
         result.AppendFormat("{0}{1} ({2})\n", new String(' ', indent * 2), i.Name, i.UUID);
         if (i is InventoryFolder)
         {
             InventoryFolder folder = (InventoryFolder)i;
             PrintFolder(folder, result, indent + 1);
         }
     }
 }
        void IInventoryFolderServiceInterface.Add(InventoryFolder folder)
        {
            var m          = new Map();
            var categories = new AnArray();

            m.Add("categories", categories);
            var category = new Map();

            categories.Add(category);
            category.Add("name", folder.Name);
            category.Add("type_default", (int)folder.DefaultType);

            byte[] reqdata;
            using (var ms = new MemoryStream())
            {
                LlsdXml.Serialize(m, ms);
                reqdata = ms.ToArray();
            }

            IValue         res;
            HttpStatusCode statuscode;

            using (Stream sres = new HttpClient.Post(
                       $"{m_CapabilityUri}category/{folder.ParentFolderID}",
                       "application/llsd+xml",
                       reqdata.Length,
                       (Stream s) => s.Write(reqdata, 0, reqdata.Length))
            {
                TimeoutMs = TimeoutMs
            }.ExecuteStreamRequest(out statuscode))
            {
                if (statuscode != HttpStatusCode.Created)
                {
                    throw new InventoryFolderNotFoundException(folder.ParentFolderID);
                }
                res = LlsdXml.Deserialize(sres);
            }
            var resmap = res as Map;

            if (resmap == null)
            {
                throw new InvalidDataException();
            }

            var created_items = resmap["_created_categories"] as AnArray;

            if (created_items == null)
            {
                throw new InvalidDataException();
            }
            folder.ID = created_items[0].AsUUID;
        }
 private static bool TryGetFolder(Request request, UUID folderId, out InventoryFolder folder, Dictionary <UUID, InventoryFolder> folderCache)
 {
     if (folderCache.TryGetValue(folderId, out folder))
     {
         return(true);
     }
     if (request.InventoryService.Folder.TryGetValue(request.Agent.ID, folderId, out folder))
     {
         folderCache.Add(folder.ID, folder);
         return(true);
     }
     return(false);
 }
 bool IInventoryFolderServiceInterface.TryGetValue(UUID key, out InventoryFolder folder)
 {
     foreach (RwLockedDictionary <UUID, InventoryFolder> dict in m_Folders.Values)
     {
         if (dict.TryGetValue(key, out folder))
         {
             folder = new InventoryFolder(folder);
             return(true);
         }
     }
     folder = default(InventoryFolder);
     return(false);
 }
Example #28
0
        public static void DoMapFolderHumanReadable(CommandsBot bot, int level, InventoryFolder folder, StringBuilder reply)
        {
            List <InventoryBase> T = bot.GetClient.Inventory.Store.GetContents(folder);

            foreach (InventoryBase R in T)
            {
                if (R.GetType() == typeof(InventoryFolder))
                {
                    reply.Append("" + Spaces(level) + "|- " + R.Name + " [" + R.UUID.ToString() + "]\n\r");
                    DoMapFolderHumanReadable(bot, level + 1, (InventoryFolder)R, reply);
                }
            }
        }
Example #29
0
        public override string Execute(string[] args, UUID fromAgentID)
        {
            Manager   = Client.Inventory;
            Inventory = Manager.Store;

            StringBuilder result = new StringBuilder();

            InventoryFolder rootFolder = Inventory.RootFolder;

            PrintFolder(rootFolder, result, 0);

            return(result.ToString());
        }
Example #30
0
        public void Inventory_OnFolderUpdated(LLUUID folderID)
        {
            List <InventoryBase> contents = Client.Inventory.Store.GetContents(folderID);
            Hashtable            roothash = new Hashtable();

            roothash.Add("MessageType", "FolderUpdated");
            roothash.Add("FolderID", folderID);
            List <Hashtable> response = new List <Hashtable>();

            lock (LoadedInventory)
            {
                foreach (InventoryBase o in contents)
                {
                    if (LoadedInventory.Contains(o.UUID))
                    {
                        continue;
                    }
                    LoadedInventory.Add(o.UUID);
                    Hashtable hash = new Hashtable();
                    if (o is InventoryFolder)
                    {
                        InventoryFolder folder = (InventoryFolder)o;
                        hash.Add("Type", "InventoryFolder");
                        hash.Add("Name", folder.Name);
                        hash.Add("PreferredType", folder.PreferredType);
                        hash.Add("OwnerID", folder.OwnerID);
                        hash.Add("UUID", folder.UUID);
                        response.Add(hash);
                    }
                    else if (o is InventoryItem)
                    {
                        InventoryItem item = (InventoryItem)o;
                        hash.Add("Type", "InventoryItem");
                        hash.Add("Name", item.Name);
                        hash.Add("UUID", item.UUID);
                        hash.Add("AssetType", item.AssetType);
                        hash.Add("AssetUUID", item.AssetUUID);
                        hash.Add("CreatorID", item.CreatorID);
                        hash.Add("OwnerID", item.OwnerID);
                        hash.Add("CreationDate", item.CreationDate);
                        hash.Add("Description", item.Description);
                        hash.Add("Flags", item.Flags);
                        hash.Add("InventoryType", item.InventoryType);
                        hash.Add("Permissions", item.Permissions);
                        response.Add(hash);
                    }
                }
            }
            roothash.Add("Contents", response);
            enqueue(roothash);
        }
Example #31
0
        public void TestWriteItemToFolder()
        {
            InventoryFolder folder = new InventoryFolder
            {
                FolderId = Guid.NewGuid(),
                Level    = FolderLevel.Root,
                Name     = "Test",
                OwnerId  = Guid.NewGuid(),
                ParentId = Guid.Empty,
                Type     = 2
            };

            _storage.CreateFolder(folder);

            InventoryItem item = new InventoryItem
            {
                AssetId             = Guid.NewGuid(),
                AssetType           = 11,
                BasePermissions     = 3,
                CreationDate        = 4,
                CreatorId           = Guid.NewGuid(),
                CurrentPermissions  = 5,
                Description         = "Description",
                EveryonePermissions = 6,
                Flags            = 7,
                FolderId         = folder.FolderId,
                GroupId          = Guid.NewGuid(),
                GroupOwned       = true,
                GroupPermissions = 8,
                InventoryType    = 9,
                ItemId           = Guid.NewGuid(),
                Name             = "Name",
                NextPermissions  = int.MaxValue,
                OwnerId          = folder.OwnerId,
                SaleType         = 10
            };

            _storage.CreateItem(item);

            folder = _storage.GetFolder(folder.FolderId);
            var skelEntry = _storage.GetInventorySkeletonEntry(folder.OwnerId, folder.FolderId);

            Assert.AreEqual(2, skelEntry.Version);
            Assert.AreEqual(1, folder.Items.Count);

            AssertItemEqual(item, folder.Items[0]);

            var foundItem = _storage.GetItem(item.ItemId, Guid.Empty);

            AssertItemEqual(item, foundItem);
        }
        public void TraverseNodesUnsorted(InventoryNode start, TimeSpan maxTime)
        {
            var  Inventory = client.Inventory.Store;
            bool has_items = false;

            foreach (InventoryNode node in start.Nodes.Values)
            {
                if (node.Data is InventoryItem)
                {
                    has_items = true;
                    break;
                }
            }

            if (!has_items || start.NeedsUpdate)
            {
                InventoryFolder f = (InventoryFolder)start.Data;
                AutoResetEvent  gotFolderEvent = new AutoResetEvent(false);
                bool            success        = false;

                EventHandler <FolderUpdatedEventArgs> callback = delegate(object sender, FolderUpdatedEventArgs ea)
                {
                    if (f.UUID == ea.FolderID)
                    {
                        if (((InventoryFolder)Inventory.Items[ea.FolderID].Data).DescendentCount <= Inventory.Items[ea.FolderID].Nodes.Count)
                        {
                            success = true;
                            gotFolderEvent.Set();
                        }
                    }
                };

                client.Inventory.FolderUpdated += callback;
                fetchFolder(f.UUID, f.OwnerID, true);
                gotFolderEvent.WaitOne(maxTime, false);
                client.Inventory.FolderUpdated -= callback;

                if (!success)
                {
                    Logger.Log(string.Format("Failed fetching folder {0}, got {1} items out of {2}", f.Name, Inventory.Items[f.UUID].Nodes.Count, ((InventoryFolder)Inventory.Items[f.UUID].Data).DescendentCount), Helpers.LogLevel.Error, client);
                }
            }

            foreach (InventoryBase item in Inventory.GetContents((InventoryFolder)start.Data))
            {
                if (item is InventoryFolder)
                {
                    TraverseNodes(Inventory.GetNodeFor(item.UUID), maxTime);
                }
            }
        }
        private bool TryGetValue(UUID folderID, out InventoryFolder folder, out InventoryFolderContent inventoryFolderContent)
        {
            KeyValuePair <InventoryFolder, InventoryFolderContent> result;

            inventoryFolderContent = default(InventoryFolderContent);
            folder = default(InventoryFolder);
            if (!GetFolderContents(new UUID[] { folderID }, true).TryGetValue(folderID, out result))
            {
                return(false);
            }
            folder = result.Key;
            inventoryFolderContent = result.Value;
            return(true);
        }
Example #34
0
 private void InventoryFolder_OnContentsRetrieved(InventoryFolder folder)
 {
     UpdateFolder(folder);
 }
 public void PurgeFolder(InventoryFolder folder)
 {
     this.PurgeFolderContents(folder);
     this.DeleteFolder(folder.OwnerId, folder.FolderId);
 }
Example #36
0
 /// <summary>
 /// Equivalent to the SL "Replace Outfit" command.  All clothing is removed, and replaced with wearables in given folder.  Body wearables will be replaced if provided.
 /// </summary>
 /// <param name="outfitFolder">Contains the wearable items to put on.</param>
 public void WearOutfit(InventoryFolder outfitFolder)
 {
     WearOutfit(outfitFolder, 10000, true);
 }
Example #37
0
        /// <summary>
        /// Thread-safe method for updating the contents of the specified folder UUID
        /// </summary>
        /// <param name="folderID"></param>
        public void UpdateFolder(InventoryFolder folder)
        {
            if (this.InvokeRequired) this.BeginInvoke((MethodInvoker)delegate { UpdateFolder(folder); });
            else
            {
                TreeNode node = null;
                TreeNodeCollection children;

                if (folder != Client.InventoryStore.RootFolder)
                {
                    TreeNode[] found = Nodes.Find(folder.UUID.ToString(), true);
                    if (found.Length > 0)
                    {
                        node = found[0];
                        children = node.Nodes;
                    }
                    else
                    {
                        Logger.Log("Received update for unknown TreeView node " + folder.UUID, Helpers.LogLevel.Warning);
                        return;
                    }
                }
                else children = this.Nodes;

                children.Clear();

                List<InventoryBase> contents = folder.Contents;
                if (contents.Count == 0)
                {
                    TreeNode add = children.Add(null, "(empty)");
                    add.ForeColor = Color.FromKnownColor(KnownColor.GrayText);
                }
                else
                {
                    foreach (InventoryBase inv in contents)
                    {
                        string key = inv.UUID.ToString();
                        children.Add(key, inv.Name);
                        children[key].Tag = inv;
                        if (inv is InventoryFolder)
                        {
                            children[key].Nodes.Add(null, "(loading...)").ForeColor = Color.FromKnownColor(KnownColor.GrayText);
                            ((InventoryFolder)inv).OnContentsRetrieved += new InventoryFolder.ContentsRetrieved(InventoryFolder_OnContentsRetrieved);
                        }
                    }
                }
            }
        }
        public InventoryFolder GetFolder(Guid folderId)
        {
            var statement = FOLDER_SELECT_STMT.Bind(folderId);
            var rowset = _session.Execute(statement);

            var itemList = new List<InventoryItem>();
            InventoryFolder retFolder = null;
            foreach (var row in rowset)
            {
                if (row.GetValue<Guid>("item_id") == FOLDER_MAGIC_ENTRY)
                {
                    retFolder = new InventoryFolder { FolderId = folderId };
                    //this is the data row that holds the information for the folder itself
                    MapRowToFolder(retFolder, row);
                }
                else
                {
                    itemList.Add(MapRowToItem(row));
                }
            }

            if (retFolder != null)
            {
                retFolder.Items = itemList;
            }

            return retFolder;
        }
Example #39
0
 public List<InventoryBase> GetContents(InventoryFolder folder)
 {
     return GetContents(folder.UUID);
 }
 internal void FolderRename(InventoryFolder ifolder)
 {
     Packet packet = InvPacketHelper.UpdateInventoryFolder(ifolder.Name, ifolder.ParentID, ifolder.Type, ifolder.FolderID);
     slClient.Network.SendPacket(packet);
 }
Example #41
0
 public InventoryFolder(InventoryFolder folder)
     : base(folder)
 {
     PreferredContentType = folder.PreferredContentType;
     Version = folder.Version;
     Children = new Dictionary<UUID, InventoryBase>(folder.Children);
 }
 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);
 }
 private static void MapRowToFolder(InventoryFolder retFolder, Row row)
 {
     retFolder.CreationDate = row.GetValue<int>("creation_date");
     retFolder.Name = row.GetValue<string>("name");
     retFolder.OwnerId = row.GetValue<Guid>("owner_id");
     retFolder.Type = row.GetValue<int>("inv_type");
 }
        public void TestPurgeEmptyFolder()
        {
            InventoryFolder folder = new InventoryFolder
            {
                FolderId = Guid.NewGuid(),
                Level = FolderLevel.Root,
                Name = "Test",
                OwnerId = Guid.NewGuid(),
                ParentId = Guid.Empty,
                Type = 2
            };

            _storage.CreateFolder(folder);
            _storage.PurgeFolder(folder);

            var newfolder = _storage.GetFolder(folder.FolderId);
            var skelEntry = _storage.GetInventorySkeletonEntry(folder.OwnerId, folder.FolderId);

            Assert.Null(newfolder);
            Assert.Null(skelEntry);
        }
        public void TestPurgeNonemptyFolderContents()
        {
            var ownerId = Guid.NewGuid();

            InventoryFolder parent = new InventoryFolder
            {
                FolderId = Guid.NewGuid(),
                Level = FolderLevel.Root,
                Name = "Test",
                OwnerId = ownerId,
                ParentId = Guid.Empty,
                Type = 2
            };

            InventoryFolder child = new InventoryFolder
            {
                FolderId = Guid.NewGuid(),
                Level = FolderLevel.TopLevel,
                Name = "Test",
                OwnerId = ownerId,
                ParentId = parent.FolderId,
                Type = 2
            };

            _storage.CreateFolder(parent);
            _storage.CreateFolder(child);

            InventoryItem item = new InventoryItem
            {
                AssetId = Guid.NewGuid(),
                AssetType = 11,
                BasePermissions = 3,
                CreationDate = 4,
                CreatorId = Guid.NewGuid(),
                CurrentPermissions = 5,
                Description = "Description",
                EveryonePermissions = 6,
                Flags = 7,
                FolderId = child.FolderId,
                GroupId = Guid.NewGuid(),
                GroupOwned = true,
                GroupPermissions = 8,
                InventoryType = 9,
                ItemId = Guid.NewGuid(),
                Name = "Name",
                NextPermissions = int.MaxValue,
                OwnerId = ownerId,
                SaleType = 10
            };

            InventoryItem item2 = new InventoryItem
            {
                AssetId = Guid.NewGuid(),
                AssetType = 11,
                BasePermissions = 3,
                CreationDate = 4,
                CreatorId = Guid.NewGuid(),
                CurrentPermissions = 5,
                Description = "Description",
                EveryonePermissions = 6,
                Flags = 7,
                FolderId = parent.FolderId,
                GroupId = Guid.NewGuid(),
                GroupOwned = true,
                GroupPermissions = 8,
                InventoryType = 9,
                ItemId = Guid.NewGuid(),
                Name = "Name",
                NextPermissions = int.MaxValue,
                OwnerId = ownerId,
                SaleType = 10
            };

            _storage.CreateItem(item);
            _storage.CreateItem(item2);

            _storage.PurgeFolderContents(parent);

            Assert.Null(_storage.GetFolder(child.FolderId));
            Assert.Null(_storage.GetInventorySkeletonEntry(parent.OwnerId, child.FolderId));
            Assert.Null(_storage.GetItem(item.ItemId, Guid.Empty));
            Assert.Null(_storage.GetItem(item2.ItemId, Guid.Empty));
        }
 /// <summary>
 /// Move this item to the target folder
 /// </summary>
 /// <param name="targetFolder"></param>
 public void MoveTo(InventoryFolder targetFolder)
 {
     this.FolderID = targetFolder.FolderID;
 }
        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;
        }
        public void MoveItem(InventoryItem item, InventoryFolder parentFolder)
        {
            var insert = FOLDER_ITEM_INSERT_STMT.Bind(parentFolder.FolderId, item.ItemId, item.Name, item.AssetId, item.AssetType,
                item.BasePermissions, item.CreationDate, item.CreatorId, item.CurrentPermissions, item.Description, item.EveryonePermissions,
                item.Flags, item.GroupId, item.GroupOwned, item.GroupPermissions, item.InventoryType, item.NextPermissions,
                item.OwnerId, item.SaleType);

            var removeOld = FOLDER_ITEM_REMOVE_STMT.Bind(item.FolderId, item.ItemId);

            var ownershipUpdate = ITEM_OWNERSHIP_UPDATE.Bind(parentFolder.FolderId, item.ItemId);

            var batch = new BatchStatement()
                .Add(insert)
                .Add(ownershipUpdate)
                .Add(removeOld);

            _session.Execute(batch);

            VersionInc(item.OwnerId, item.FolderId);
            VersionInc(item.OwnerId, parentFolder.FolderId);
        }
        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;
        }
        public InventoryFolder GetFolderAttributes(Guid folderId)
        {
            var statement = FOLDER_SELECT_STMT.Bind(folderId);
            var rowset = _session.Execute(statement);

            InventoryFolder retFolder = null;

            foreach (var row in rowset)
            {
                retFolder = new InventoryFolder { FolderId = folderId };
                //should only be a single row
                MapRowToFolder(retFolder, row);
                break;
            }

            return retFolder;
        }
        public void TestMoveFolder()
        {
            var ownerId = Guid.NewGuid();
            InventoryFolder firstParent = new InventoryFolder
            {
                FolderId = Guid.NewGuid(),
                Level = FolderLevel.Root,
                Name = "Test1",
                OwnerId = ownerId,
                ParentId = Guid.Empty,
                Type = 2
            };

            InventoryFolder secondParent = new InventoryFolder
            {
                FolderId = Guid.NewGuid(),
                Level = FolderLevel.Root,
                Name = "Test2",
                OwnerId = ownerId,
                ParentId = Guid.Empty,
                Type = 2
            };

            InventoryFolder folder = new InventoryFolder
            {
                FolderId = Guid.NewGuid(),
                Level = FolderLevel.Root,
                Name = "Test",
                OwnerId = ownerId,
                ParentId = firstParent.FolderId,
                Type = 2
            };

            _storage.CreateFolder(firstParent);
            _storage.CreateFolder(secondParent);
            _storage.CreateFolder(folder);

            //find the folder in the skel
            var folderSkelEntry = _storage.GetInventorySkeletonEntry(ownerId, folder.FolderId);
            _storage.MoveFolder(folderSkelEntry, secondParent.FolderId);

            //get the skel for this user to check the level, version, and parent
            var skel = _storage.GetInventorySkeleton(folder.OwnerId);
            Dictionary<Guid, InventorySkeletonEntry> entries = new Dictionary<Guid, InventorySkeletonEntry>();
            foreach (var skelentry in skel)
            {
                entries.Add(skelentry.FolderId, skelentry);
            }

            Assert.AreEqual(3, skel.Count);

            Assert.AreEqual(folder.Level, entries[folder.FolderId].Level);
            Assert.AreEqual(secondParent.FolderId, entries[folder.FolderId].ParentId);
            Assert.AreEqual(2, entries[folder.FolderId].Version);
            Assert.AreEqual(folder.Name, entries[folder.FolderId].Name);
            Assert.AreEqual(folder.Type, entries[folder.FolderId].Type);
        }
Example #53
0
    /// <summary>
    /// Updates the state of the InventoryNode and inventory data structure that
    /// is responsible for the InventoryObject. If the item was previously not added to inventory,
    /// it adds the item, and updates structure accordingly. If it was, it updates the 
    /// InventoryNode, changing the parent node if <code>item.parentUUID</code> does 
    /// not match <code>node.Parent.Data.UUID</code>.
    /// 
    /// You can not set the inventory root folder using this method
    /// </summary>
    /// <param name="item">The InventoryObject to store</param>
    public void UpdateNodeFor(InventoryBase item)
    {
        lock (Items)
        {
            InventoryNode itemParent = null;
            if (item.ParentUUID != UUID.Zero && !Items.TryGetValue(item.ParentUUID, out itemParent))
            {
                // OK, we have no data on the parent, let's create a fake one.
                InventoryFolder fakeParent = new InventoryFolder(item.ParentUUID);
                fakeParent.DescendentCount = 1; // Dear god, please forgive me.
                itemParent = new InventoryNode(fakeParent);
                Items[item.ParentUUID] = itemParent;
                // Unfortunately, this breaks the nice unified tree
                // while we're waiting for the parent's data to come in.
                // As soon as we get the parent, the tree repairs itself.
                Console.WriteLine("Attempting to update inventory child of " +
                    item.ParentUUID.ToString() + " when we have no local reference to that folder");

                if (true)
                {
                    // Fetch the parent
                    List<UUID> fetchreq = new List<UUID>(1);
                    fetchreq.Add(item.ParentUUID);
                    //Manager.FetchInventory(fetchreq); // we cant fetch folder data! :-O
                }
            }

            InventoryNode itemNode;
            if (Items.TryGetValue(item.UUID, out itemNode)) // We're updating.
            {
                InventoryNode oldParent = itemNode.Parent;
                // Handle parent change
                if (oldParent == null || itemParent == null || itemParent.Data.UUID != oldParent.Data.UUID)
                {
                    if (oldParent != null)
                    {
                        lock (oldParent.Nodes.SyncRoot)
                            oldParent.Nodes.Remove(item.UUID);
                    }
                    if (itemParent != null)
                    {
                        lock (itemParent.Nodes.SyncRoot)
                            itemParent.Nodes[item.UUID] = itemNode;
                    }
                }

                itemNode.Parent = itemParent;

                itemNode.Data = item;
            }
            else // We're adding.
            {
                itemNode = new InventoryNode(item, itemParent);
                Items.Add(item.UUID, itemNode);
            }
        }
    }
        public void PurgeFolderContents(InventoryFolder folder)
        {
            //build a graph from the inventory skeleton
            var skel = this.GetInventorySkeleton(folder.OwnerId);
            var graph = new SkeletonGraphNode(skel);

            var thisNode = graph.AllChildren[folder.FolderId];

            //to purge the contents of a folder, we need to collect all
            //the items and subfolders currently inside of it and delete everything
            //recursively

            Tuple<List<InventoryItem>, List<Guid>> itemsAndFolders = new Tuple<List<InventoryItem>, List<Guid>>(new List<InventoryItem>(), new List<Guid>());
            RecursiveCollectFolderContents(thisNode, itemsAndFolders);

            //remove all the items
            foreach (var item in itemsAndFolders.Item1)
            {
                this.PurgeItem(item);
            }

            //remove the folders
            foreach (var folderid in itemsAndFolders.Item2)
            {
                if (folderid != folder.FolderId)
                {
                    this.DeleteFolder(folder.OwnerId, folderid);
                }
            }

            VersionInc(folder.OwnerId, folder.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." );
                }
            }
        }
Example #56
0
 public void MoveTo(InventoryFolder newParent)
 {
     MoveTo(newParent.FolderID);
 }
        internal InventoryFolder FolderCreate(String name, LLUUID parentid)
        {
            InventoryFolder ifolder = new InventoryFolder(this, name, LLUUID.GenerateUUID(), parentid);
            ifolder._Type = -1;

            if (htFoldersByUUID.ContainsKey(ifolder.ParentID))
            {
                if (((InventoryFolder)htFoldersByUUID[ifolder.ParentID]).alContents.Contains(ifolder) == false)
                {
                    // Add new folder to the contents of the parent folder.
                    ((InventoryFolder)htFoldersByUUID[ifolder.ParentID]).alContents.Add(ifolder);
                }
            }
            else
            {
                throw new Exception("Parent Folder " + ifolder.ParentID + " does not exist in this Inventory Manager.");
            }

            if (htFoldersByUUID.ContainsKey(ifolder.FolderID) == false)
            {
                htFoldersByUUID[ifolder.FolderID] = ifolder;
            }

            Packet packet = InvPacketHelper.CreateInventoryFolder(ifolder.Name, ifolder.ParentID, ifolder.Type, ifolder.FolderID);
            slClient.Network.SendPacket(packet);

            return ifolder;
        }
        public void SaveFolder(InventoryFolder folder)
        {
            var skelUpdate = SKEL_UPDATE_STMT.Bind(folder.Name, folder.Type, folder.OwnerId, folder.FolderId);
            var contentUpdate = FOLDER_UPDATE_STMT.Bind(folder.Name, folder.Type, folder.FolderId);

            var batch = new BatchStatement()
                .Add(skelUpdate)
                .Add(contentUpdate);

            _session.Execute(batch);

            VersionInc(folder.OwnerId, folder.FolderId);
        }
Example #59
0
        /// <summary>
        /// Equivalent to the SL "Replace Outfit" command.  All clothing is removed, and replaced with wearables in given folder.  Body wearables will be replaced if provided.
        /// </summary>
        /// <param name="outfitFolder">Contains the wearable items to put on.</param>
        /// <param name="TimeOut">How long to wait for outfit directory information to download</param>
        public void WearOutfit(InventoryFolder outfitFolder, int TimeOut, bool removeExistingAttachments)
        {
            // Refresh download of outfit folder
            if (!outfitFolder.RequestDownloadContents(false, false, true).RequestComplete.WaitOne(TimeOut, false))
            {
                Client.Log("Outfit not changed. An error occured while downloads the folder contents of : " + outfitFolder.Name, Helpers.LogLevel.Error);
                return;
            }

            // Make sure we have some Wearable Data to start with.
            if (AgentWearablesSignal.WaitOne(1000, false) == false)
            {
                Client.Log("You must have set appearance at least once, before calling WearOutfit().  AgentWearablesSignal not set.", Helpers.LogLevel.Error);
                return;
            }

            // Flush the cached clothing wearables so we can redefine them
            for (byte i = 4; i <= 12; i++)
            {
                AgentWearablesData[i].ItemID  = LLUUID.Zero;
                AgentWearablesData[i].AssetID = LLUUID.Zero;
            }

            List<InventoryItem> attachments = new List<InventoryItem>();

            // Replace with wearables from Outfit folder
            foreach (InventoryBase ib in outfitFolder.GetContents())
            {
                if (ib is InventoryWearable)
                {
                    try
                    {
                        InventoryWearable iw = (InventoryWearable)ib;
                        Client.Log("Retrieving asset for " + iw.Name + "("+iw.AssetID+")", Helpers.LogLevel.Info);
                        AssetWearable.AppearanceLayerType AppearanceLayer = ((AssetWearable)iw.Asset).AppearanceLayer;

                        Client.Log("Adding skin/clothing layer for " + AppearanceLayer, Helpers.LogLevel.Info);
                        AgentWearablesData[(byte)AppearanceLayer].ItemID = iw.ItemID;
                        AgentWearablesData[(byte)AppearanceLayer].AssetID = iw.AssetID;
                    }
                    catch (Exception e)
                    {
                        Client.Log("Asset for " + ib._Name + " unavailable: " + e.Message, Helpers.LogLevel.Error);
                    }
                }
                else if (ib is InventoryItem)
                {
                    InventoryItem ii = (InventoryItem)ib;
                    attachments.Add(ii);
                }
            }

            // Change attachments
            AddAttachments(attachments, removeExistingAttachments);

            // Create AgentIsNowWearing Packet, and send it
            SendAgentIsNowWearing();

            // Send updated AgentSetAppearance to the grid
            SendAgentSetAppearance();
        }
        public void TestWriteItemToFolder()
        {
            InventoryFolder folder = new InventoryFolder
            {
                FolderId = Guid.NewGuid(),
                Level = FolderLevel.Root,
                Name = "Test",
                OwnerId = Guid.NewGuid(),
                ParentId = Guid.Empty,
                Type = 2
            };

            _storage.CreateFolder(folder);

            InventoryItem item = new InventoryItem
            {
                AssetId = Guid.NewGuid(),
                AssetType = 11,
                BasePermissions = 3,
                CreationDate = 4,
                CreatorId = Guid.NewGuid(),
                CurrentPermissions = 5,
                Description = "Description",
                EveryonePermissions = 6,
                Flags = 7,
                FolderId = folder.FolderId,
                GroupId = Guid.NewGuid(),
                GroupOwned = true,
                GroupPermissions = 8,
                InventoryType = 9,
                ItemId = Guid.NewGuid(),
                Name = "Name",
                NextPermissions = int.MaxValue,
                OwnerId = folder.OwnerId,
                SaleType = 10
            };

            _storage.CreateItem(item);

            folder = _storage.GetFolder(folder.FolderId);
            var skelEntry = _storage.GetInventorySkeletonEntry(folder.OwnerId, folder.FolderId);

            Assert.AreEqual(2, skelEntry.Version);
            Assert.AreEqual(1, folder.Items.Count);

            AssertItemEqual(item, folder.Items[0]);

            var foundItem = _storage.GetItem(item.ItemId, Guid.Empty);

            AssertItemEqual(item, foundItem);
        }