Esempio n. 1
0
        bool IInventoryFolderContentServiceInterface.TryGetValue(UUID principalID, UUID folderID, out InventoryFolderContent inventoryFolderContent)
        {
            IValue         iv;
            HttpStatusCode statuscode;

            using (Stream s = new HttpClient.Get($"{m_CapabilityUri}category/{folderID}?depth=1")
            {
                TimeoutMs = TimeoutMs
            }.ExecuteStreamRequest(out statuscode))
            {
                if (statuscode != HttpStatusCode.OK)
                {
                    inventoryFolderContent = default(InventoryFolderContent);
                    return(false);
                }
                iv = LlsdXml.Deserialize(s);
            }

            var resmap = iv as Map;

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

            inventoryFolderContent          = new InventoryFolderContent();
            inventoryFolderContent.FolderID = resmap["category_id"].AsUUID;
            inventoryFolderContent.Owner    = new UGUI(resmap["agent_id"].AsUUID);
            inventoryFolderContent.Folders  = ExtractFolders(resmap);
            inventoryFolderContent.Items    = ExtractItems(resmap);

            return(true);
        }
 private static void WriteInventoryFolderContent(XmlTextWriter writer, InventoryFolderContent folder,
                                                 bool fetch_folders,
                                                 bool fetch_items, UUID agentID)
 {
     writer.WriteStartElement("map");
     writer.WriteKeyValuePair("agent_id", folder.Owner.ID);
     writer.WriteKeyValuePair("descendents", folder.Folders.Count + folder.Items.Count);
     writer.WriteKeyValuePair("folder_id", folder.FolderID);
     if (fetch_folders)
     {
         writer.WriteStartElement("key");
         writer.WriteValue("categories");
         writer.WriteEndElement();
         writer.WriteStartElement("array");
         foreach (var childfolder in folder.Folders)
         {
             writer.WriteStartElement("map");
             writer.WriteKeyValuePair("folder_id", childfolder.ID);
             writer.WriteKeyValuePair("parent_id", childfolder.ParentFolderID);
             writer.WriteKeyValuePair("name", childfolder.Name);
             if (childfolder.DefaultType != AssetType.RootFolder)
             {
                 writer.WriteKeyValuePair("type", (byte)childfolder.DefaultType);
             }
             else
             {
                 writer.WriteKeyValuePair("type", -1);
             }
             writer.WriteKeyValuePair("preferred_type", -1);
             writer.WriteKeyValuePair("version", childfolder.Version);
             writer.WriteEndElement();
         }
         writer.WriteEndElement();
     }
     if (fetch_items)
     {
         writer.WriteStartElement("key");
         writer.WriteValue("items");
         writer.WriteEndElement();
         writer.WriteStartElement("array");
         foreach (var childitem in folder.Items)
         {
             writer.WriteStartElement("map");
             WriteInventoryItem(childitem, writer, agentID);
             writer.WriteEndElement();
         }
         writer.WriteEndElement();
     }
     writer.WriteKeyValuePair("owner_id", folder.Owner.ID);
     writer.WriteKeyValuePair("version", folder.Version);
     writer.WriteEndElement();
 }
        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);
        }
        public bool TryGetValue(UUID principalID, UUID folderID, out InventoryFolderContent inventoryFolderContent)
        {
            InventoryFolder folder;
            if(!m_Service.TryGetValue(principalID, folderID, out folder))
            {
                inventoryFolderContent = null;
                return false;
            }

            inventoryFolderContent = new InventoryFolderContent
            {
                Version = folder.Version,
                Owner = folder.Owner,
                FolderID = folder.ID
            };

            try
            {
                inventoryFolderContent.Folders = m_Service.GetFolders(principalID, folderID);
            }
            catch
            {
                inventoryFolderContent.Folders = new List<InventoryFolder>();
            }

            try
            {
                inventoryFolderContent.Items = m_Service.GetItems(principalID, folderID);
            }
            catch
            {
                inventoryFolderContent.Items = new List<InventoryItem>();
            }

            return true;
        }
Esempio n. 5
0
 bool IInventoryFolderContentServiceInterface.TryGetValue(UUID principalID, UUID folderID, out InventoryFolderContent inventoryFolderContent)
 {
     throw new NotImplementedException();
 }
        private Dictionary <UUID, KeyValuePair <InventoryFolder, InventoryFolderContent> > GetFolderContents(UUID[] folderids, bool fetch_children)
        {
            var folderidsreq = new AnArray();
            var reqmap       = new Map
            {
                ["folder_ids"] = folderidsreq
            };

            foreach (UUID folderid in folderids)
            {
                folderidsreq.Add(new Map {
                    { "folder_id", folderid }, { "fetch_folders", fetch_children }, { "fetch_items", fetch_children }
                });
            }
            byte[] reqdata;
            using (var ms = new MemoryStream())
            {
                LlsdXml.Serialize(reqmap, ms);
                reqdata = ms.ToArray();
            }
            Map resdata;

            using (Stream s = new HttpClient.Post(m_CapabilityUri, "application/llsd+xml", reqdata.Length,
                                                  (Stream o) => o.Write(reqdata, 0, reqdata.Length))
            {
                TimeoutMs = TimeoutMs
            }.ExecuteStreamRequest())
            {
                resdata = LlsdXml.Deserialize(s) as Map;
            }
            if (resdata == null)
            {
                throw new InvalidDataException();
            }
            AnArray foldersres;
            var     resultset = new Dictionary <UUID, KeyValuePair <InventoryFolder, InventoryFolderContent> >();

            if (!resdata.TryGetValue("folders", out foldersres))
            {
                return(resultset);
            }
            foreach (IValue folderiv in foldersres)
            {
                var folderdata = folderiv as Map;
                if (folderdata == null)
                {
                    continue;
                }
                var folder = new InventoryFolder(folderdata["folder_id"].AsUUID)
                {
                    Owner          = new UGUI(folderdata["owner_id"].AsUUID),
                    Version        = folderdata["version"].AsInt,
                    ParentFolderID = folderdata["parent_id"].AsUUID,
                };
                var content = new InventoryFolderContent
                {
                    Version  = folderdata["version"].AsInt,
                    FolderID = folderdata["folder_id"].AsUUID,
                    Owner    = new UGUI(folderdata["owner_id"].AsUUID)
                };
                AnArray categories;
                if (folderdata.TryGetValue("categories", out categories))
                {
                    foreach (IValue categoryiv in categories)
                    {
                        var category = categoryiv as Map;
                        if (category == null)
                        {
                            continue;
                        }
                        content.Folders.Add(new InventoryFolder(category["folder_id"].AsUUID)
                        {
                            Name           = category["name"].ToString(),
                            ParentFolderID = category["parent_id"].AsUUID,
                            DefaultType    = (AssetType)category["type"].AsInt,
                            Version        = category["version"].AsInt
                        });
                    }
                }

                AnArray childitems;
                if (folderdata.TryGetValue("items", out childitems))
                {
                    foreach (IValue childiv in childitems)
                    {
                        var childdata = childiv as Map;
                        if (childdata == null)
                        {
                            continue;
                        }
                        if (childdata["parent_id"].AsUUID != folder.ID)
                        {
                            continue;
                        }
                        var permissions = (Map)childdata["permissions"];
                        var sale_info   = (Map)childdata["sale_info"];
                        var item        = new InventoryItem(childdata["item_id"].AsUUID)
                        {
                            AssetID        = childdata["asset_id"].AsUUID,
                            CreationDate   = Date.UnixTimeToDateTime(childdata["created_at"].AsULong),
                            Description    = childdata["desc"].ToString(),
                            Flags          = (InventoryFlags)childdata["flags"].AsInt,
                            InventoryType  = (InventoryType)childdata["inv_type"].AsInt,
                            Name           = childdata["name"].ToString(),
                            ParentFolderID = childdata["parent_id"].AsUUID,
                            AssetType      = (AssetType)childdata["type"].AsInt,
                            Creator        = new UGUI(permissions["creator_id"].AsUUID),
                            Group          = new UGI(permissions["group_id"].AsUUID),
                            IsGroupOwned   = permissions["is_owner_group"].AsBoolean,
                            LastOwner      = new UGUI(permissions["last_owner_id"].AsUUID),
                            Owner          = new UGUI(permissions["owner_id"].AsUUID),
                            SaleInfo       = new InventoryItem.SaleInfoData
                            {
                                Price = sale_info["sale_price"].AsInt,
                                Type  = (InventoryItem.SaleInfoData.SaleType)sale_info["sale_type"].AsInt
                            }
                        };
                        item.Permissions.Base      = (InventoryPermissionsMask)permissions["base_mask"].AsInt;
                        item.Permissions.EveryOne  = (InventoryPermissionsMask)permissions["everyone_mask"].AsInt;
                        item.Permissions.Group     = (InventoryPermissionsMask)permissions["group_mask"].AsInt;
                        item.Permissions.NextOwner = (InventoryPermissionsMask)permissions["next_owner_mask"].AsInt;
                        item.Permissions.Current   = (InventoryPermissionsMask)permissions["owner_mask"].AsInt;
                        content.Items.Add(item);
                    }
                }

                resultset.Add(folder.ID, new KeyValuePair <InventoryFolder, InventoryFolderContent>(folder, content));
            }

            return(resultset);
        }
        bool IInventoryFolderContentServiceInterface.TryGetValue(UUID principalID, UUID folderID, out InventoryFolderContent inventoryFolderContent)
        {
            InventoryFolder folder;

            return(TryGetValue(folderID, out folder, out inventoryFolderContent));
        }
Esempio n. 8
0
        public void LoadFromCurrentOutfit(UGUI principal, InventoryServiceInterface inventoryService, AssetServiceInterface assetService, Action <string> logOutput = null)
        {
            lock (m_Lock)
            {
                if (CurrentOutfitFolderID == UUID.Zero)
                {
                    InventoryFolder folder;
                    if (!inventoryService.Folder.TryGetValue(principal.ID, AssetType.CurrentOutfitFolder, out folder))
                    {
                        throw new BakeErrorException("Outfit folder missing");
                    }
                    CurrentOutfitFolderID = folder.ID;
                }

                InventoryFolderContent folderContent = inventoryService.Folder.Content[principal.ID, CurrentOutfitFolderID];
                AppearanceSerial = folderContent.Version;

                var items     = new List <InventoryItem>();
                var itemlinks = new List <UUID>();
                foreach (var item in folderContent.Items)
                {
                    if (item.AssetType == AssetType.Link &&
                        item.InventoryType == InventoryType.Wearable)
                    {
                        items.Add(item);
                        itemlinks.Add(item.AssetID);
                    }
                }

                var actualItems       = itemlinks.Count != 0 ? inventoryService.Item[principal.ID, itemlinks] : new List <InventoryItem>();
                var actualItemsInDict = new Dictionary <UUID, InventoryItem>();
                foreach (var item in actualItems)
                {
                    actualItemsInDict.Add(item.ID, item);
                }

                var outfitItems = new Dictionary <UUID, OutfitItem>();

                logOutput?.Invoke(string.Format("Processing assets for baking agent {0}", principal.ToString()));

                AvatarWearables.Clear();

                foreach (var linkItem in items)
                {
                    InventoryItem actualItem;
                    if (actualItemsInDict.TryGetValue(linkItem.AssetID, out actualItem))
                    {
                        AssetData outfitData;
                        Wearable  wearableData;
                        if (assetService.TryGetValue(actualItem.AssetID, out outfitData))
                        {
#if DEBUG
                            logOutput?.Invoke(string.Format("Using item {0} {1} ({2}): asset {3}", actualItem.AssetType.ToString(), actualItem.Name, actualItem.ID, actualItem.AssetID));
#endif
                            try
                            {
                                wearableData = new Wearable(outfitData);
                            }
                            catch (Exception e)
                            {
                                string info = string.Format("Asset {0} for agent {1} ({2}) failed to decode as wearable", actualItem.AssetID, principal.ToString(), principal.ID);
                                m_Log.ErrorFormat(info, e);
                                throw new BakeErrorException(info, e);
                            }

                            var oitem = new OutfitItem(LinkDescriptionToInt(linkItem.Description), wearableData);
                            outfitItems.Add(linkItem.AssetID, oitem);
                            List <AgentWearables.WearableInfo> wearables;
                            if (!AvatarWearables.TryGetValue(wearableData.Type, out wearables))
                            {
                                wearables = new List <AgentWearables.WearableInfo>();
                                AvatarWearables.Add(wearableData.Type, wearables);
                            }
                            wearables.Add(new AgentWearables.WearableInfo(linkItem.AssetID, actualItem.AssetID));
                        }
                        else
                        {
                            logOutput?.Invoke(string.Format("Missing asset {0} for inventory item {1} ({2})", actualItem.AssetID, actualItem.Name, actualItem.ID));
                        }
                    }
                    else
                    {
                        logOutput?.Invoke(string.Format("Missing inventory item {0} for link {1} ({2}", linkItem.AssetID, linkItem.Name, linkItem.ID));
                    }
                }

                logOutput?.Invoke(string.Format("Setting current outfit for baking agent {0}", principal.ToString()));
                SetCurrentOutfit(outfitItems);
            }
        }
 public FolderGetStack(InventoryFolderContent content, Map embedded, int depth)
 {
     Content  = content;
     Depth    = depth;
     Embedded = embedded;
 }