diff --git a/OpenSim/Framework/Communications/Cache/UserProfileCacheService.cs b/OpenSim/Framework/Communications/Cache/UserProfileCacheService.cs index 455f72226d..b066fdcab8 100644 --- a/OpenSim/Framework/Communications/Cache/UserProfileCacheService.cs +++ b/OpenSim/Framework/Communications/Cache/UserProfileCacheService.cs @@ -254,6 +254,66 @@ namespace OpenSim.Framework.Communications.Cache folderID, remoteClient.Name); } + public List HandleFetchInventoryDescendentsCAPS(LLUUID agentID, LLUUID folderID, LLUUID ownerID, + bool fetchFolders, bool fetchItems, int sortOrder) + { + // XXX We're not handling sortOrder yet! + // with CAPS we are only return items in the folders at the moment + // need to find the format that sub folder details are sent in + // if (fetchItems) + // { + InventoryFolderImpl fold = null; + if (folderID == libraryRoot.folderID) + { + return libraryRoot.RequestListOfItems(); + } + + if ((fold = libraryRoot.HasSubFolder(folderID)) != null) + { + return fold.RequestListOfItems(); + } + + CachedUserInfo userProfile; + if (m_userProfiles.TryGetValue(agentID, out userProfile)) + { + if (userProfile.RootFolder != null) + { + if (userProfile.RootFolder.folderID == folderID) + { + return userProfile.RootFolder.RequestListOfItems(); + } + else + { + if ((fold = userProfile.RootFolder.HasSubFolder(folderID)) != null) + { + return fold.RequestListOfItems(); + } + } + } + else + { + m_log.ErrorFormat("[INVENTORYCACHE]: Could not find root folder for user {0}", agentID.ToString()); + + return new List(); ; + } + } + else + { + m_log.ErrorFormat("[INVENTORYCACHE]: " + + "Could not find user profile for {0} for folder {1}", + agentID.ToString(), folderID); + return new List(); + } + + // If we've reached this point then we couldn't find the folder, even though the client thinks + // it exists + m_log.ErrorFormat("[INVENTORYCACHE]: " + + "Could not find folder {0} for user {1}", + folderID, agentID.ToString()); + // } + return new List(); + } + public void HandlePurgeInventoryDescendents(IClientAPI remoteClient, LLUUID folderID) { // m_log.InfoFormat("[INVENTORYCACHE]: Purging folder {0} for {1} uuid {2}", diff --git a/OpenSim/Framework/Communications/Capabilities/Caps.cs b/OpenSim/Framework/Communications/Capabilities/Caps.cs index 53cb955029..d38af7cc79 100644 --- a/OpenSim/Framework/Communications/Capabilities/Caps.cs +++ b/OpenSim/Framework/Communications/Capabilities/Caps.cs @@ -52,6 +52,9 @@ namespace OpenSim.Region.Capabilities public delegate void TaskScriptUpdatedCallback(LLUUID userID, LLUUID itemID, LLUUID primID, bool isScriptRunning, byte[] data); + public delegate List FetchInventoryDescendentsCAPS(LLUUID agentID, LLUUID folderID, LLUUID ownerID, + bool fetchFolders, bool fetchItems, int sortOrder); + public class Caps { private static readonly log4net.ILog m_log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); @@ -81,6 +84,9 @@ namespace OpenSim.Region.Capabilities public NewInventoryItem AddNewInventoryItem = null; public ItemUpdatedCallback ItemUpdatedCall = null; public TaskScriptUpdatedCallback TaskScriptUpdatedCall = null; + // + public FetchInventoryDescendentsCAPS CAPSFetchInventoryDescendents = null; + public Caps(AssetCache assetCache, BaseHttpServer httpServer, string httpListen, uint httpPort, string capsPath, LLUUID agent, bool dumpAssetsToFile) @@ -191,14 +197,56 @@ namespace OpenSim.Region.Capabilities LLSDInventoryDescendents reply = new LLSDInventoryDescendents(); LLSDInventoryFolderContents contents = new LLSDInventoryFolderContents(); contents.agent___id = m_agentID; - contents.owner___id = m_agentID; + contents.owner___id = invFetch.owner_id; contents.folder___id = invFetch.folder_id; - contents.version = 1; + contents.version = 1; //FixMe contents.descendents = 0; reply.folders.Array.Add(contents); + List itemList = null; + if (CAPSFetchInventoryDescendents != null) + { + itemList = CAPSFetchInventoryDescendents(m_agentID, invFetch.folder_id, invFetch.owner_id, invFetch.fetch_folders, invFetch.fetch_items, invFetch.sort_order); + } + if (itemList != null) + { + foreach (InventoryItemBase invItem in itemList) + { + contents.items.Array.Add(ConvertInventoryItem(invItem)); + } + } + contents.descendents = contents.items.Array.Count; return reply; } + private LLSDInventoryItem ConvertInventoryItem(InventoryItemBase invItem) + { + LLSDInventoryItem llsdItem = new LLSDInventoryItem(); + llsdItem.asset_id = invItem.assetID; + llsdItem.created_at = 1000; + llsdItem.desc = invItem.inventoryDescription; + llsdItem.flags = 0; + llsdItem.item_id = invItem.inventoryID; + llsdItem.name = invItem.inventoryName; + llsdItem.parent_id = invItem.parentFolderID; + llsdItem.type = Enum.GetName(typeof(AssetType), invItem.assetType).ToLower(); + llsdItem.inv_type = Enum.GetName(typeof(InventoryType), invItem.invType).ToLower(); + llsdItem.permissions = new LLSDPermissions(); + llsdItem.permissions.creator_id = invItem.creatorsID; + llsdItem.permissions.base_mask = (int)invItem.inventoryBasePermissions; + llsdItem.permissions.everyone_mask = (int)invItem.inventoryEveryOnePermissions; + llsdItem.permissions.group_id = LLUUID.Zero; + llsdItem.permissions.group_mask = 0; + llsdItem.permissions.is_owner_group = false; + llsdItem.permissions.next_owner_mask = (int)invItem.inventoryNextPermissions; + llsdItem.permissions.owner_id = m_agentID; // FixMe + llsdItem.permissions.owner_mask = (int)invItem.inventoryCurrentPermissions; + llsdItem.sale_info = new LLSDSaleInfo(); + llsdItem.sale_info.sale_price = 10; + llsdItem.sale_info.sale_type = "not"; + + return llsdItem; + } + /// /// /// diff --git a/OpenSim/Framework/Communications/Capabilities/LLSDInventoryItem.cs b/OpenSim/Framework/Communications/Capabilities/LLSDInventoryItem.cs index 2d1d441d60..784b41c8c0 100644 --- a/OpenSim/Framework/Communications/Capabilities/LLSDInventoryItem.cs +++ b/OpenSim/Framework/Communications/Capabilities/LLSDInventoryItem.cs @@ -4,15 +4,15 @@ using System.Text; using libsecondlife; namespace OpenSim.Region.Capabilities -{ +{ [LLSDMap] public class LLSDInventoryItem { public LLUUID parent_id; - + public LLUUID asset_id; public LLUUID item_id; - + public LLSDPermissions permissions; public string type; public string inv_type; public int flags; @@ -45,19 +45,19 @@ namespace OpenSim.Region.Capabilities public string sale_type; } - /* [LLSDMap] - public class LLSDFolderItem - { - public LLUUID folder_id; - public LLUUID parent_id; - public int type; - public string name; - }*/ + /* [LLSDMap] + public class LLSDFolderItem + { + public LLUUID folder_id; + public LLUUID parent_id; + public int type; + public string name; + }*/ [LLSDMap] public class LLSDInventoryDescendents { - public LLSDArray folders= new LLSDArray(); + public LLSDArray folders = new LLSDArray(); } [LLSDMap] @@ -73,11 +73,11 @@ namespace OpenSim.Region.Capabilities [LLSDMap] public class LLSDInventoryFolderContents { - public LLUUID agent___id; + public LLUUID agent___id; // the (three "_") "___" so the serialising knows to change this to a "-" public int descendents; - public LLUUID folder___id; // the (three "_") "___" so the serialising knows to change this to a "-" + public LLUUID folder___id; //as LL can't decide if they are going to use "_" or "-" to separate words in the field names public LLSDArray items = new LLSDArray(); - public LLUUID owner___id; + public LLUUID owner___id; // and of course we can't have field names with "-" in public int version; } } diff --git a/OpenSim/Region/Environment/Scenes/Scene.cs b/OpenSim/Region/Environment/Scenes/Scene.cs index 7c1faa3764..19dbbc9cfb 100644 --- a/OpenSim/Region/Environment/Scenes/Scene.cs +++ b/OpenSim/Region/Environment/Scenes/Scene.cs @@ -1656,6 +1656,7 @@ namespace OpenSim.Region.Environment.Scenes cap.AddNewInventoryItem = AddInventoryItem; cap.ItemUpdatedCall = CapsUpdateInventoryItemAsset; cap.TaskScriptUpdatedCall = CapsUpdateTaskInventoryScriptAsset; + cap.CAPSFetchInventoryDescendents = CommsManager.UserProfileCacheService.HandleFetchInventoryDescendentsCAPS; if (m_capsHandlers.ContainsKey(agent.AgentID)) {