private IDataReader GetForeignInventory(UUID AgentID, UUID folder_id, string serverURL) { FakeDataReader d = new FakeDataReader(); IConfigurationService configService = m_registry.RequestModuleInterface <IConfigurationService>(); if (serverURL == "" && configService != null) { List <string> urls = configService.FindValueOf("InventoryServerURI"); if (urls.Count > 0) { serverURL = urls[0]; } else { return(null); } } XInventoryServicesConnector xinv = new XInventoryServicesConnector(serverURL + "xinventory"); InventoryCollection c = xinv.GetFolderContent(AgentID, folder_id); if (c != null) { foreach (InventoryItemBase item in c.Items) { d.items.Add(item); } } return(d); }
public override OSDArray GetLLSDItems(string[] fields, string[] vals) { string query = ""; for (int i = 0; i < fields.Length; i++) { query += String.Format("where {0} = '{1}' and ", fields[i], vals[i]); i++; } query = query.Remove(query.Length - 5); if (fields[0] == "inventoryID") { IInventoryService invService = m_registry.RequestModuleInterface <IInventoryService>(); if (invService != null) { UUID inventoryID = UUID.Parse(vals[0]); InventoryItemBase baseItem = new InventoryItemBase(UUID.Parse(vals[0])); if (vals.Count() > 1) { UUID avatarID = UUID.Parse(vals[1]); IUserFinder userFinder = m_registry.RequestModuleInterface <IUserFinder>(); if (userFinder != null && !userFinder.IsLocalGridUser(avatarID)) { string serverURL = userFinder.GetUserServerURL(avatarID, "InventoryServerURI") + "xinventory"; XInventoryServicesConnector xinv = new XInventoryServicesConnector(serverURL); return(BuildLLSDInventoryItems(xinv.GetItem(baseItem))); } } return(BuildLLSDInventoryItems(invService.GetItem(baseItem))); } } return(null); }
public override List <InventoryItemBase> GetItems(UUID avatarID, string[] fields, string[] vals) { IUserFinder userFinder = m_registry.RequestModuleInterface <IUserFinder>(); if (userFinder != null && !userFinder.IsLocalGridUser(avatarID)) { string serverURL = userFinder.GetUserServerURL(avatarID, "InventoryServerURI") + "xinventory"; UUID id = UUID.Parse(vals[0]); XInventoryServicesConnector xinv = new XInventoryServicesConnector(serverURL); if (fields[0] == "parentFolderID") { return(xinv.GetFolderContent(avatarID, id).Items); } else { return(new List <InventoryItemBase> { xinv.GetItem(new InventoryItemBase(id)) }); } } return(base.GetItems(avatarID, fields, vals)); }
public override byte[] FetchInventoryReply(OSDArray fetchRequest, UUID AgentID, UUID forceOwnerID, UUID libraryOwnerID) { LLSDSerializationDictionary contents = new LLSDSerializationDictionary(); contents.WriteStartMap("llsd"); //Start llsd contents.WriteKey("folders"); //Start array items contents.WriteStartArray("folders"); //Start array folders foreach (OSD m in fetchRequest) { contents.WriteStartMap("internalContents"); //Start internalContents kvp OSDMap invFetch = (OSDMap)m; //UUID agent_id = invFetch["agent_id"].AsUUID(); UUID owner_id = invFetch["owner_id"].AsUUID(); UUID folder_id = invFetch["folder_id"].AsUUID(); bool fetch_folders = invFetch["fetch_folders"].AsBoolean(); bool fetch_items = invFetch["fetch_items"].AsBoolean(); int sort_order = invFetch["sort_order"].AsInteger(); //Set the normal stuff contents["agent_id"] = forceOwnerID == UUID.Zero ? owner_id : forceOwnerID; contents["owner_id"] = forceOwnerID == UUID.Zero ? owner_id : forceOwnerID; contents["folder_id"] = folder_id; contents.WriteKey("items"); //Start array items contents.WriteStartArray("items"); List <UUID> moreLinkedItems = new List <UUID>(); int count = 0; bool addToCount = true; string invServer = ""; bool isForeign = GetIsForeign(AgentID, "InventoryServerURI", m_registry, out invServer); IDataReader fretVal = null; if (isForeign) { fretVal = GetForeignInventory(AgentID, folder_id, invServer); } string query = String.Format("where {0} = '{1}'", "parentFolderID", folder_id, "avatarID", AgentID, "avatarID", libraryOwnerID); redoQuery: using (DataReaderConnection retVal = isForeign ? new DataReaderConnection() { DataReader = fretVal } : GD.QueryData(query, m_itemsrealm, "*")) { try { while (retVal.DataReader.Read()) { contents.WriteStartMap("item"); //Start item kvp UUID assetID = UUID.Parse(retVal.DataReader["assetID"].ToString()); contents["asset_id"] = assetID; contents["name"] = retVal.DataReader["inventoryName"].ToString(); contents["desc"] = retVal.DataReader["inventoryDescription"].ToString(); contents.WriteKey("permissions"); //Start permissions kvp contents.WriteStartMap("permissions"); contents["group_id"] = UUID.Parse(retVal.DataReader["groupID"].ToString()); contents["is_owner_group"] = int.Parse(retVal.DataReader["groupOwned"].ToString()) == 1; contents["group_mask"] = uint.Parse(retVal.DataReader["inventoryGroupPermissions"].ToString()); contents["owner_id"] = forceOwnerID == UUID.Zero ? UUID.Parse(retVal.DataReader["avatarID"].ToString()) : forceOwnerID; contents["last_owner_id"] = UUID.Parse(retVal.DataReader["avatarID"].ToString()); contents["next_owner_mask"] = uint.Parse(retVal.DataReader["inventoryNextPermissions"].ToString()); contents["owner_mask"] = uint.Parse(retVal.DataReader["inventoryCurrentPermissions"].ToString()); UUID creator; if (UUID.TryParse(retVal.DataReader["creatorID"].ToString(), out creator)) { contents["creator_id"] = creator; } else { contents["creator_id"] = UUID.Zero; } contents["base_mask"] = uint.Parse(retVal.DataReader["inventoryBasePermissions"].ToString()); contents["everyone_mask"] = uint.Parse(retVal.DataReader["inventoryEveryOnePermissions"].ToString()); contents.WriteEndMap(/*Permissions*/); contents.WriteKey("sale_info"); //Start permissions kvp contents.WriteStartMap("sale_info"); //Start sale_info kvp contents["sale_price"] = int.Parse(retVal.DataReader["salePrice"].ToString()); switch (byte.Parse(retVal.DataReader["saleType"].ToString())) { default: contents["sale_type"] = "not"; break; case 1: contents["sale_type"] = "original"; break; case 2: contents["sale_type"] = "copy"; break; case 3: contents["sale_type"] = "contents"; break; } contents.WriteEndMap(/*sale_info*/); contents["created_at"] = int.Parse(retVal.DataReader["creationDate"].ToString()); contents["flags"] = uint.Parse(retVal.DataReader["flags"].ToString()); UUID inventoryID = UUID.Parse(retVal.DataReader["inventoryID"].ToString()); contents["item_id"] = inventoryID; contents["parent_id"] = UUID.Parse(retVal.DataReader["parentFolderID"].ToString()); UUID avatarID = forceOwnerID == UUID.Zero ? UUID.Parse(retVal.DataReader["avatarID"].ToString()) : forceOwnerID; contents["agent_id"] = avatarID; AssetType assetType = (AssetType)int.Parse(retVal.DataReader["assetType"].ToString()); if (assetType == AssetType.Link) { moreLinkedItems.Add(assetID); } contents["type"] = Utils.AssetTypeToString(assetType); InventoryType invType = (InventoryType)int.Parse(retVal.DataReader["invType"].ToString()); contents["inv_type"] = Utils.InventoryTypeToString(invType); if (addToCount) { count++; } contents.WriteEndMap(/*"item"*/); //end array items } } catch { } finally { GD.CloseDatabase(retVal); } } if (moreLinkedItems.Count > 0) { addToCount = false; query = String.Format("where {0} = '{1}' and (", "avatarID", AgentID); #if (!ISWIN) foreach (UUID item in moreLinkedItems) { query = query + String.Format("{0} = '{1}' or ", "inventoryID", item); } #else query = moreLinkedItems.Aggregate(query, (current, t) => current + String.Format("{0} = '{1}' or ", "inventoryID", t)); #endif query = query.Remove(query.Length - 4, 4); query += ")"; if (isForeign) { fretVal = new FakeDataReader(); IConfigurationService configService = m_registry.RequestModuleInterface <IConfigurationService>(); if (invServer == "" && configService != null) { List <string> urls = configService.FindValueOf("InventoryServerURI"); if (urls.Count > 0) { invServer = urls[0]; } else { return(null); } } XInventoryServicesConnector xinv = new XInventoryServicesConnector(invServer + "xinventory"); foreach (UUID t in moreLinkedItems) { ((FakeDataReader)fretVal).items.Add(xinv.GetItem(new InventoryItemBase(t))); } } moreLinkedItems.Clear(); goto redoQuery; } contents.WriteEndArray(/*"items"*/); //end array items contents.WriteStartArray("categories"); //We don't send any folders int version = 0; QueryFilter filter = new QueryFilter(); filter.andFilters["folderID"] = folder_id; List <string> versionRetVal = GD.Query(new string[2] { "version", "type" }, m_foldersrealm, filter, null, null, null); List <InventoryFolderBase> foldersToAdd = new List <InventoryFolderBase>(); if (versionRetVal.Count > 0) { version = int.Parse(versionRetVal[0]); if (int.Parse(versionRetVal[1]) == (int)AssetType.TrashFolder || int.Parse(versionRetVal[1]) == (int)AssetType.CurrentOutfitFolder || int.Parse(versionRetVal[1]) == (int)AssetType.LinkFolder) { //If it is the trash folder, we need to send its descendents, because the viewer wants it query = String.Format("where {0} = '{1}' and {2} = '{3}'", "parentFolderID", folder_id, "agentID", AgentID); using (DataReaderConnection retVal = GD.QueryData(query, m_foldersrealm, "*")) { try { while (retVal.DataReader.Read()) { contents.WriteStartMap("folder"); //Start item kvp contents["folder_id"] = UUID.Parse(retVal.DataReader["folderID"].ToString()); contents["parent_id"] = UUID.Parse(retVal.DataReader["parentFolderID"].ToString()); contents["name"] = retVal.DataReader["folderName"].ToString(); int type = int.Parse(retVal.DataReader["type"].ToString()); contents["type"] = type; contents["preferred_type"] = type; count++; contents.WriteEndMap(/*"folder"*/); //end array items } } catch { } finally { GD.CloseDatabase(retVal); } } } } contents.WriteEndArray(/*"categories"*/); contents["descendents"] = count; contents["version"] = version; //Now add it to the folder array contents.WriteEndMap(); //end array internalContents } contents.WriteEndArray(); //end array folders contents.WriteEndMap(/*"llsd"*/); //end llsd try { return(contents.GetSerializer()); } finally { contents = null; } }