/* * Copyright (c) Contributors, http://opensimulator.org/ * See CONTRIBUTORS.TXT for a full list of copyright holders. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the OpenSimulator Project nor the * names of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ using log4net; using System; using System.Collections.Generic; using System.IO; using System.Reflection; using Nini.Config; using OpenSim.Framework; using OpenSim.Framework.Console; using OpenSim.Framework.Communications; using OpenSim.Framework.Servers.HttpServer; using OpenSim.Services.Interfaces; using OpenSim.Server.Base; using OpenMetaverse; namespace OpenSim.Services.Connectors { public class XInventoryServicesConnector : IInventoryService { private static readonly ILog m_log = LogManager.GetLogger( MethodBase.GetCurrentMethod().DeclaringType); private string m_ServerURI = String.Empty; public XInventoryServicesConnector() { } public XInventoryServicesConnector(string serverURI) { m_ServerURI = serverURI.TrimEnd('/'); } public XInventoryServicesConnector(IConfigSource source) { Initialise(source); } public virtual void Initialise(IConfigSource source) { IConfig assetConfig = source.Configs["InventoryService"]; if (assetConfig == null) { m_log.Error("[INVENTORY CONNECTOR]: InventoryService missing from OpenSim.ini"); throw new Exception("Inventory connector init error"); } string serviceURI = assetConfig.GetString("InventoryServerURI", String.Empty); if (serviceURI == String.Empty) { m_log.Error("[INVENTORY CONNECTOR]: No Server URI named in section InventoryService"); throw new Exception("Inventory connector init error"); } m_ServerURI = serviceURI; } public bool CreateUserInventory(UUID principalID) { Dictionary ret = MakeRequest("CREATEUSERINVENTORY", new Dictionary { { "PRINCIPAL", principalID.ToString() } }); if (ret == null) return false; if (ret.Count == 0) return false; return bool.Parse(ret["RESULT"].ToString()); } public List GetInventorySkeleton(UUID principalID) { Dictionary ret = MakeRequest("GETINVENTORYSKELETON", new Dictionary { { "PRINCIPAL", principalID.ToString() } }); if (ret == null) return null; if (ret.Count == 0) return null; List folders = new List(); foreach (Object o in ret.Values) folders.Add(BuildFolder((Dictionary)o)); return folders; } public InventoryFolderBase GetRootFolder(UUID principalID) { Dictionary ret = MakeRequest("GETROOTFOLDER", new Dictionary { { "PRINCIPAL", principalID.ToString() } }); if (ret == null) return null; if (ret.Count == 0) return null; return BuildFolder(ret); } public InventoryFolderBase GetFolderForType(UUID principalID, AssetType type) { Dictionary ret = MakeRequest("GETFOLDERFORTYPE", new Dictionary { { "PRINCIPAL", principalID.ToString() }, { "TYPE", ((int)type).ToString() } }); if (ret == null) return null; if (ret.Count == 0) return null; return BuildFolder(ret); } public InventoryCollection GetFolderContent(UUID principalID, UUID folderID) { Dictionary ret = MakeRequest("GETFOLDERCONTENT", new Dictionary { { "PRINCIPAL", principalID.ToString() }, { "FOLDER", folderID.ToString() } }); if (ret == null) return null; if (ret.Count == 0) return null; InventoryCollection inventory = new InventoryCollection(); inventory.Folders = new List(); inventory.Items = new List(); inventory.UserID = principalID; Dictionary folders = (Dictionary)ret["FOLDERS"]; Dictionary items = (Dictionary)ret["ITEMS"]; foreach (Object o in folders.Values) inventory.Folders.Add(BuildFolder((Dictionary)o)); foreach (Object o in items.Values) inventory.Items.Add(BuildItem((Dictionary)o)); return inventory; } public List GetFolderItems(UUID principalID, UUID folderID) { Dictionary ret = MakeRequest("GETFOLDERITEMS", new Dictionary { { "PRINCIPAL", principalID.ToString() }, { "FOLDER", folderID.ToString() } }); if (ret == null) return null; if (ret.Count == 0) return null; List items = new List(); foreach (Object o in ret.Values) items.Add(BuildItem((Dictionary)o)); return items; } public bool AddFolder(InventoryFolderBase folder) { Dictionary ret = MakeRequest("ADDFOLDER", new Dictionary { { "ParentID", folder.ParentID.ToString() }, { "Type", folder.Type.ToString() }, { "Version", folder.Version.ToString() }, { "Name", folder.Name.ToString() }, { "Owner", folder.Owner.ToString() }, { "ID", folder.ID.ToString() } }); if (ret == null) return false; return bool.Parse(ret["RESULT"].ToString()); } public bool UpdateFolder(InventoryFolderBase folder) { Dictionary ret = MakeRequest("UPDATEFOLDER", new Dictionary { { "ParentID", folder.ParentID.ToString() }, { "Type", folder.Type.ToString() }, { "Version", folder.Version.ToString() }, { "Name", folder.Name.ToString() }, { "Owner", folder.Owner.ToString() }, { "ID", folder.ID.ToString() } }); if (ret == null) return false; return bool.Parse(ret["RESULT"].ToString()); } public bool MoveFolder(InventoryFolderBase folder) { Dictionary ret = MakeRequest("MOVEFOLDER", new Dictionary { { "ParentID", folder.ParentID.ToString() }, { "ID", folder.ID.ToString() }, { "PRINCIPAL", folder.Owner.ToString() } }); if (ret == null) return false; return bool.Parse(ret["RESULT"].ToString()); } public bool DeleteFolders(UUID principalID, List folderIDs) { List slist = new List(); foreach (UUID f in folderIDs) slist.Add(f.ToString()); Dictionary ret = MakeRequest("DELETEFOLDERS", new Dictionary { { "PRINCIPAL", principalID.ToString() }, { "FOLDERS", slist } }); if (ret == null) return false; return bool.Parse(ret["RESULT"].ToString()); } public bool PurgeFolder(InventoryFolderBase folder) { Dictionary ret = MakeRequest("PURGEFOLDER", new Dictionary { { "ID", folder.ID.ToString() } }); if (ret == null) return false; return bool.Parse(ret["RESULT"].ToString()); } public bool AddItem(InventoryItemBase item) { Dictionary ret = MakeRequest("ADDITEM", new Dictionary { { "AssetID", item.AssetID.ToString() }, { "AssetType", item.AssetType.ToString() }, { "Name", item.Name.ToString() }, { "Owner", item.Owner.ToString() }, { "ID", item.ID.ToString() }, { "InvType", item.InvType.ToString() }, { "Folder", item.Folder.ToString() }, { "CreatorId", item.CreatorId.ToString() }, { "Description", item.Description.ToString() }, { "NextPermissions", item.NextPermissions.ToString() }, { "CurrentPermissions", item.CurrentPermissions.ToString() }, { "BasePermissions", item.BasePermissions.ToString() }, { "EveryOnePermissions", item.EveryOnePermissions.ToString() }, { "GroupPermissions", item.GroupPermissions.ToString() }, { "GroupID", item.GroupID.ToString() }, { "GroupOwned", item.GroupOwned.ToString() }, { "SalePrice", item.SalePrice.ToString() }, { "SaleType", item.SaleType.ToString() }, { "Flags", item.Flags.ToString() }, { "CreationDate", item.CreationDate.ToString() } }); if (ret == null) return false; return bool.Parse(ret["RESULT"].ToString()); } public bool UpdateItem(InventoryItemBase item) { Dictionary ret = MakeRequest("UPDATEITEM", new Dictionary { { "AssetID", item.AssetID.ToString() }, { "AssetType", item.AssetType.ToString() }, { "Name", item.Name.ToString() }, { "Owner", item.Owner.ToString() }, { "ID", item.ID.ToString() }, { "InvType", item.InvType.ToString() }, { "Folder", item.Folder.ToString() }, { "CreatorId", item.CreatorId.ToString() }, { "Description", item.Description.ToString() }, { "NextPermissions", item.NextPermissions.ToString() }, { "CurrentPermissions", item.CurrentPermissions.ToString() }, { "BasePermissions", item.BasePermissions.ToString() }, { "EveryOnePermissions", item.EveryOnePermissions.ToString() }, { "GroupPermissions", item.GroupPermissions.ToString() }, { "GroupID", item.GroupID.ToString() }, { "GroupOwned", item.GroupOwned.ToString() }, { "SalePrice", item.SalePrice.ToString() }, { "SaleType", item.SaleType.ToString() }, { "Flags", item.Flags.ToString() }, { "CreationDate", item.CreationDate.ToString() } }); if (ret == null) return false; return bool.Parse(ret["RESULT"].ToString()); } public bool MoveItems(UUID principalID, List items) { List idlist = new List(); List destlist = new List(); foreach (InventoryItemBase item in items) { idlist.Add(item.ID.ToString()); destlist.Add(item.Folder.ToString()); } Dictionary ret = MakeRequest("MOVEITEMS", new Dictionary { { "PRINCIPAL", principalID.ToString() }, { "IDLIST", idlist }, { "DESTLIST", destlist } }); if (ret == null) return false; return bool.Parse(ret["RESULT"].ToString()); } public bool DeleteItems(UUID principalID, List itemIDs) { List slist = new List(); foreach (UUID f in itemIDs) slist.Add(f.ToString()); Dictionary ret = MakeRequest("DELETEITEMS", new Dictionary { { "PRINCIPAL", principalID.ToString() }, { "ITEMS", slist } }); if (ret == null) return false; return bool.Parse(ret["RESULT"].ToString()); } public InventoryItemBase GetItem(InventoryItemBase item) { Dictionary ret = MakeRequest("GETITEM", new Dictionary { { "ID", item.ID.ToString() } }); if (ret == null) return null; if (ret.Count == 0) return null; return BuildItem(ret); } public InventoryFolderBase GetFolder(InventoryFolderBase folder) { Dictionary ret = MakeRequest("GETFOLDER", new Dictionary { { "ID", folder.ID.ToString() } }); if (ret == null) return null; if (ret.Count == 0) return null; return BuildFolder(ret); } public List GetActiveGestures(UUID principalID) { Dictionary ret = MakeRequest("GETACTIVEGESTURES", new Dictionary { { "PRINCIPAL", principalID.ToString() } }); if (ret == null) return null; List items = new List(); foreach (Object o in ret.Values) items.Add(BuildItem((Dictionary)o)); return items; } public int GetAssetPermissions(UUID principalID, UUID assetID) { Dictionary ret = MakeRequest("GETASSETPERMISSIONS", new Dictionary { { "PRINCIPAL", principalID.ToString() }, { "ASSET", assetID.ToString() } }); if (ret == null) return 0; return int.Parse(ret["RESULT"].ToString()); } // These are either obsolete or unused // public InventoryCollection GetUserInventory(UUID principalID) { return null; } public void GetUserInventory(UUID principalID, InventoryReceiptCallback callback) { } public bool HasInventoryForUser(UUID principalID) { return false; } // Helpers // private Dictionary MakeRequest(string method, Dictionary sendData) { sendData["METHOD"] = method; string reply = SynchronousRestFormsRequester.MakeRequest("POST", m_ServerURI + "/xinventory", ServerUtils.BuildQueryString(sendData)); Dictionary replyData = ServerUtils.ParseXmlResponse( reply); return replyData; } private InventoryFolderBase BuildFolder(Dictionary data) { InventoryFolderBase folder = new InventoryFolderBase(); folder.ParentID = new UUID(data["ParentID"].ToString()); folder.Type = short.Parse(data["Type"].ToString()); folder.Version = ushort.Parse(data["Version"].ToString()); folder.Name = data["Name"].ToString(); folder.Owner = new UUID(data["Owner"].ToString()); folder.ID = new UUID(data["ID"].ToString()); return folder; } private InventoryItemBase BuildItem(Dictionary data) { InventoryItemBase item = new InventoryItemBase(); item.AssetID = new UUID(data["AssetID"].ToString()); item.AssetType = int.Parse(data["AssetType"].ToString()); item.Name = data["Name"].ToString(); item.Owner = new UUID(data["Owner"].ToString()); item.ID = new UUID(data["ID"].ToString()); item.InvType = int.Parse(data["InvType"].ToString()); item.Folder = new UUID(data["Folder"].ToString()); item.CreatorId = data["CreatorId"].ToString(); item.Description = data["Description"].ToString(); item.NextPermissions = uint.Parse(data["NextPermissions"].ToString()); item.CurrentPermissions = uint.Parse(data["CurrentPermissions"].ToString()); item.BasePermissions = uint.Parse(data["BasePermissions"].ToString()); item.EveryOnePermissions = uint.Parse(data["EveryOnePermissions"].ToString()); item.GroupPermissions = uint.Parse(data["GroupPermissions"].ToString()); item.GroupID = new UUID(data["GroupID"].ToString()); item.GroupOwned = bool.Parse(data["GroupOwned"].ToString()); item.SalePrice = int.Parse(data["SalePrice"].ToString()); item.SaleType = byte.Parse(data["SaleType"].ToString()); item.Flags = uint.Parse(data["Flags"].ToString()); item.CreationDate = int.Parse(data["CreationDate"].ToString()); return item; } } }