diff --git a/CONTRIBUTORS.txt b/CONTRIBUTORS.txt index 7601a50690..f621cd3966 100644 --- a/CONTRIBUTORS.txt +++ b/CONTRIBUTORS.txt @@ -58,7 +58,7 @@ where we are today. = Additional OpenSim Contributors = -These folks have contributed code patches to OpenSim to help make it +These folks have contributed code patches or content to OpenSimulator to help make it what it is today. * aduffy70 @@ -163,6 +163,7 @@ what it is today. * webmage (IBM) * Xantor * Y. Nitta +* YoshikoFazuku * YZh * Zackary Geers aka Kunnis Basiat * Zha Ewry @@ -215,5 +216,3 @@ In addition, we would like to thank: * The Mono Project * The NANT Developers * Microsoft (.NET, MSSQL-Adapters) -*x - diff --git a/OpenSim/Addons/Groups/GroupsModule.cs b/OpenSim/Addons/Groups/GroupsModule.cs index 5b3b9f64ca..5959baca40 100644 --- a/OpenSim/Addons/Groups/GroupsModule.cs +++ b/OpenSim/Addons/Groups/GroupsModule.cs @@ -766,14 +766,17 @@ namespace OpenSim.Groups remoteClient.SendCreateGroupReply(UUID.Zero, false, "Insufficient funds to create a group."); return UUID.Zero; } - money.ApplyCharge(remoteClient.AgentId, money.GroupCreationCharge, MoneyTransactionType.GroupCreate); } + string reason = string.Empty; UUID groupID = m_groupData.CreateGroup(remoteClient.AgentId, name, charter, showInList, insigniaID, membershipFee, openEnrollment, allowPublish, maturePublish, remoteClient.AgentId, out reason); if (groupID != UUID.Zero) { + if (money != null) + money.ApplyCharge(remoteClient.AgentId, money.GroupCreationCharge, MoneyTransactionType.GroupCreate); + remoteClient.SendCreateGroupReply(groupID, true, "Group created successfullly"); // Update the founder with new group information. diff --git a/OpenSim/Data/MSSQL/MSSQLSimulationData.cs b/OpenSim/Data/MSSQL/MSSQLSimulationData.cs index 00af3a01e2..bc5beebf2e 100644 --- a/OpenSim/Data/MSSQL/MSSQLSimulationData.cs +++ b/OpenSim/Data/MSSQL/MSSQLSimulationData.cs @@ -2100,7 +2100,7 @@ VALUES parameters.Add(_Database.CreateParameter("LinkNumber", prim.LinkNum)); parameters.Add(_Database.CreateParameter("MediaURL", prim.MediaUrl)); - if (prim.DynAttrs.Count > 0) + if (prim.DynAttrs.CountNamespaces > 0) parameters.Add(_Database.CreateParameter("DynAttrs", prim.DynAttrs.ToXml())); else parameters.Add(_Database.CreateParameter("DynAttrs", null)); diff --git a/OpenSim/Data/MySQL/MySQLSimulationData.cs b/OpenSim/Data/MySQL/MySQLSimulationData.cs index 537ec850d3..feacbb2ee3 100644 --- a/OpenSim/Data/MySQL/MySQLSimulationData.cs +++ b/OpenSim/Data/MySQL/MySQLSimulationData.cs @@ -1730,7 +1730,7 @@ namespace OpenSim.Data.MySQL else cmd.Parameters.AddWithValue("Vehicle", String.Empty); - if (prim.DynAttrs.Count > 0) + if (prim.DynAttrs.CountNamespaces > 0) cmd.Parameters.AddWithValue("DynAttrs", prim.DynAttrs.ToXml()); else cmd.Parameters.AddWithValue("DynAttrs", null); diff --git a/OpenSim/Data/MySQL/MySQLXAssetData.cs b/OpenSim/Data/MySQL/MySQLXAssetData.cs index 15ac9215e2..5f1d2ee665 100644 --- a/OpenSim/Data/MySQL/MySQLXAssetData.cs +++ b/OpenSim/Data/MySQL/MySQLXAssetData.cs @@ -199,6 +199,8 @@ namespace OpenSim.Data.MySQL /// On failure : Throw an exception and attempt to reconnect to database public void StoreAsset(AssetBase asset) { +// m_log.DebugFormat("[XASSETS DB]: Storing asset {0} {1}", asset.Name, asset.ID); + lock (m_dbLock) { using (MySqlConnection dbcon = new MySqlConnection(m_connectionString)) diff --git a/OpenSim/Data/SQLite/SQLiteSimulationData.cs b/OpenSim/Data/SQLite/SQLiteSimulationData.cs index a369b2b37a..52502b359a 100644 --- a/OpenSim/Data/SQLite/SQLiteSimulationData.cs +++ b/OpenSim/Data/SQLite/SQLiteSimulationData.cs @@ -2176,7 +2176,7 @@ namespace OpenSim.Data.SQLite row["MediaURL"] = prim.MediaUrl; - if (prim.DynAttrs.Count > 0) + if (prim.DynAttrs.CountNamespaces > 0) row["DynAttrs"] = prim.DynAttrs.ToXml(); else row["DynAttrs"] = null; diff --git a/OpenSim/Framework/DAMap.cs b/OpenSim/Framework/DAMap.cs index df4a6bc4a7..5c729e883f 100644 --- a/OpenSim/Framework/DAMap.cs +++ b/OpenSim/Framework/DAMap.cs @@ -29,10 +29,12 @@ using System; using System.Collections; using System.Collections.Generic; using System.IO; +using System.Reflection; using System.Text; using System.Xml; using System.Xml.Schema; using System.Xml.Serialization; +using log4net; using OpenMetaverse; using OpenMetaverse.StructuredData; @@ -48,13 +50,20 @@ namespace OpenSim.Framework /// within their data store. However, avoid storing large amounts of data because that /// would slow down database access. /// - public class DAMap : IDictionary, IXmlSerializable + public class DAMap : IXmlSerializable { - private static readonly int MIN_STORE_NAME_LENGTH = 4; +// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); - protected OSDMap m_map; - - public DAMap() { m_map = new OSDMap(); } + private static readonly int MIN_NAMESPACE_LENGTH = 4; + + private OSDMap m_map = new OSDMap(); + + // WARNING: this is temporary for experimentation only, it will be removed!!!! + public OSDMap TopLevelMap + { + get { return m_map; } + set { m_map = value; } + } public XmlSchema GetSchema() { return null; } @@ -64,39 +73,34 @@ namespace OpenSim.Framework map.ReadXml(rawXml); return map; } - + + public void ReadXml(XmlReader reader) + { + ReadXml(reader.ReadInnerXml()); + } + public void ReadXml(string rawXml) { // System.Console.WriteLine("Trying to deserialize [{0}]", rawXml); lock (this) + { m_map = (OSDMap)OSDParser.DeserializeLLSDXml(rawXml); - } - - // WARNING: this is temporary for experimentation only, it will be removed!!!! - public OSDMap TopLevelMap - { - get { return m_map; } - set { m_map = value; } - } - - - public void ReadXml(XmlReader reader) - { - ReadXml(reader.ReadInnerXml()); - } - - public string ToXml() - { - lock (this) - return OSDParser.SerializeLLSDXmlString(m_map); + SanitiseMap(this); + } } public void WriteXml(XmlWriter writer) { writer.WriteRaw(ToXml()); } - + + public string ToXml() + { + lock (this) + return OSDParser.SerializeLLSDXmlString(m_map); + } + public void CopyFrom(DAMap other) { // Deep copy @@ -104,7 +108,7 @@ namespace OpenSim.Framework string data = null; lock (other) { - if (other.Count > 0) + if (other.CountNamespaces > 0) { data = OSDParser.SerializeLLSDXmlString(other.m_map); } @@ -120,59 +124,136 @@ namespace OpenSim.Framework } /// - /// Returns the number of data stores. + /// Sanitise the map to remove any namespaces or stores that are not OSDMap. /// - public int Count { get { lock (this) { return m_map.Count; } } } - - public bool IsReadOnly { get { return false; } } - - /// - /// Returns the names of the data stores. - /// - public ICollection Keys { get { lock (this) { return m_map.Keys; } } } - - /// - /// Returns all the data stores. - /// - public ICollection Values + /// + /// + public static void SanitiseMap(DAMap daMap) { - get + List keysToRemove = null; + + // Hard-coded special case that needs to be removed in the future. Normally, modules themselves should + // handle reading data from old locations + bool osMaterialsMigrationRequired = false; + + OSDMap namespacesMap = daMap.m_map; + + foreach (string key in namespacesMap.Keys) { - lock (this) +// Console.WriteLine("Processing ns {0}", key); + if (!(namespacesMap[key] is OSDMap)) { - List stores = new List(m_map.Count); - foreach (OSD llsd in m_map.Values) - stores.Add((OSDMap)llsd); - return stores; + if (keysToRemove == null) + keysToRemove = new List(); + + keysToRemove.Add(key); } } + + if (keysToRemove != null) + { + foreach (string key in keysToRemove) + { +// Console.WriteLine ("Removing bad ns {0}", key); + namespacesMap.Remove(key); + } + } + + foreach (OSD nsOsd in namespacesMap.Values) + { + OSDMap nsOsdMap = (OSDMap)nsOsd; + keysToRemove = null; + + foreach (string key in nsOsdMap.Keys) + { + if (!(nsOsdMap[key] is OSDMap)) + { + if (keysToRemove == null) + keysToRemove = new List(); + + keysToRemove.Add(key); + } + } + + if (keysToRemove != null) + foreach (string key in keysToRemove) + nsOsdMap.Remove(key); + } } - + /// - /// Gets or sets one data store. + /// Get the number of namespaces /// - /// Store name - /// - public OSDMap this[string key] - { - get - { - OSD llsd; - + public int CountNamespaces { get { lock (this) { return m_map.Count; } } } + + /// + /// Get the number of stores. + /// + public int CountStores + { + get + { + int count = 0; + lock (this) { - if (m_map.TryGetValue(key, out llsd)) - return (OSDMap)llsd; - else - return null; + foreach (OSD osdNamespace in m_map) + { + count += ((OSDMap)osdNamespace).Count; + } } - } - - set + + return count; + } + } + + /// + /// Retrieve a Dynamic Attribute store + /// + /// namespace for the store - use "OpenSim" for in-core modules + /// name of the store within the namespace + /// an OSDMap representing the stored data, or null if not found + public OSDMap GetStore(string ns, string storeName) + { + OSD namespaceOsd; + + lock (this) { - ValidateKey(key); - lock (this) - m_map[key] = value; + if (m_map.TryGetValue(ns, out namespaceOsd)) + { + OSD store; + + if (((OSDMap)namespaceOsd).TryGetValue(storeName, out store)) + return (OSDMap)store; + } + } + + return null; + } + + /// + /// Saves a Dynamic attribute store + /// + /// namespace for the store - use "OpenSim" for in-core modules + /// name of the store within the namespace + /// an OSDMap representing the data to store + public void SetStore(string ns, string storeName, OSDMap store) + { + ValidateNamespace(ns); + OSDMap nsMap; + + lock (this) + { + if (!m_map.ContainsKey(ns)) + { + nsMap = new OSDMap(); + m_map[ns] = nsMap; + } + + nsMap = (OSDMap)m_map[ns]; + +// m_log.DebugFormat("[DA MAP]: Setting store to {0}:{1}", ns, storeName); + nsMap[storeName] = store; } } @@ -180,54 +261,46 @@ namespace OpenSim.Framework /// Validate the key used for storing separate data stores. /// /// - public static void ValidateKey(string key) + public static void ValidateNamespace(string ns) { - if (key.Length < MIN_STORE_NAME_LENGTH) - throw new Exception("Minimum store name length is " + MIN_STORE_NAME_LENGTH); + if (ns.Length < MIN_NAMESPACE_LENGTH) + throw new Exception("Minimum namespace length is " + MIN_NAMESPACE_LENGTH); } - public bool ContainsKey(string key) + public bool ContainsStore(string ns, string storeName) { - lock (this) - return m_map.ContainsKey(key); - } + OSD namespaceOsd; - public void Add(string key, OSDMap store) - { - ValidateKey(key); - lock (this) - m_map.Add(key, store); - } - - public void Add(KeyValuePair kvp) - { - ValidateKey(kvp.Key); - lock (this) - m_map.Add(kvp.Key, kvp.Value); - } - - public bool Remove(string key) - { - lock (this) - return m_map.Remove(key); - } - - public bool TryGetValue(string key, out OSDMap store) - { lock (this) { - OSD llsd; - if (m_map.TryGetValue(key, out llsd)) + if (m_map.TryGetValue(ns, out namespaceOsd)) { - store = (OSDMap)llsd; - return true; - } - else - { - store = null; - return false; + return ((OSDMap)namespaceOsd).ContainsKey(storeName); } } + + return false; + } + + public bool TryGetStore(string ns, string storeName, out OSDMap store) + { + OSD namespaceOsd; + + lock (this) + { + if (m_map.TryGetValue(ns, out namespaceOsd)) + { + OSD storeOsd; + + bool result = ((OSDMap)namespaceOsd).TryGetValue(storeName, out storeOsd); + store = (OSDMap)storeOsd; + + return result; + } + } + + store = null; + return false; } public void Clear() @@ -235,39 +308,25 @@ namespace OpenSim.Framework lock (this) m_map.Clear(); } - - public bool Contains(KeyValuePair kvp) + + public bool RemoveStore(string ns, string storeName) { + OSD namespaceOsd; + lock (this) - return m_map.ContainsKey(kvp.Key); - } + { + if (m_map.TryGetValue(ns, out namespaceOsd)) + { + OSDMap namespaceOsdMap = (OSDMap)namespaceOsd; + namespaceOsdMap.Remove(storeName); - public void CopyTo(KeyValuePair[] array, int index) - { - throw new NotImplementedException(); - } + // Don't keep empty namespaces around + if (namespaceOsdMap.Count <= 0) + m_map.Remove(ns); + } + } - public bool Remove(KeyValuePair kvp) - { - lock (this) - return m_map.Remove(kvp.Key); - } - - public System.Collections.IDictionaryEnumerator GetEnumerator() - { - lock (this) - return m_map.GetEnumerator(); - } - - IEnumerator> IEnumerable>.GetEnumerator() - { - return null; - } - - IEnumerator IEnumerable.GetEnumerator() - { - lock (this) - return m_map.GetEnumerator(); - } + return false; + } } } \ No newline at end of file diff --git a/OpenSim/Framework/DOMap.cs b/OpenSim/Framework/DOMap.cs index 755e129a13..f5b650b375 100644 --- a/OpenSim/Framework/DOMap.cs +++ b/OpenSim/Framework/DOMap.cs @@ -42,22 +42,22 @@ namespace OpenSim.Framework /// This class stores and retrieves dynamic objects. /// /// - /// Experimental - DO NOT USE. + /// Experimental - DO NOT USE. Does not yet have namespace support. /// public class DOMap { private IDictionary m_map; - public void Add(string key, object dynObj) + public void Add(string ns, string objName, object dynObj) { - DAMap.ValidateKey(key); + DAMap.ValidateNamespace(ns); lock (this) { if (m_map == null) m_map = new Dictionary(); - m_map.Add(key, dynObj); + m_map.Add(objName, dynObj); } } diff --git a/OpenSim/Framework/WebUtil.cs b/OpenSim/Framework/WebUtil.cs index 312e9a92b9..dfa37cac1d 100644 --- a/OpenSim/Framework/WebUtil.cs +++ b/OpenSim/Framework/WebUtil.cs @@ -972,11 +972,12 @@ namespace OpenSim.Framework /// /// /// + /// /// /// /// Thrown if we encounter a network issue while posting /// the request. You'll want to make sure you deal with this as they're not uncommon - public static string MakeRequest(string verb, string requestUrl, string obj) + public static string MakeRequest(string verb, string requestUrl, string obj, int timeoutsecs) { int reqnum = WebUtil.RequestNumber++; @@ -990,6 +991,8 @@ namespace OpenSim.Framework WebRequest request = WebRequest.Create(requestUrl); request.Method = verb; + if (timeoutsecs > 0) + request.Timeout = timeoutsecs * 1000; string respstring = String.Empty; int tickset = Util.EnvironmentTickCountSubtract(tickstart); @@ -1086,6 +1089,11 @@ namespace OpenSim.Framework return respstring; } + + public static string MakeRequest(string verb, string requestUrl, string obj) + { + return MakeRequest(verb, requestUrl, obj, -1); + } } public class SynchronousRestObjectRequester diff --git a/OpenSim/Region/CoreModules/Avatar/Friends/HGFriendsModule.cs b/OpenSim/Region/CoreModules/Avatar/Friends/HGFriendsModule.cs index b3e3aa2e97..ae45b992fb 100644 --- a/OpenSim/Region/CoreModules/Avatar/Friends/HGFriendsModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Friends/HGFriendsModule.cs @@ -183,6 +183,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends if (Util.ParseUniversalUserIdentifier(finfo.Friend, out id, out url, out first, out last, out tmp)) { IUserManagement uMan = m_Scenes[0].RequestModuleInterface(); + m_log.DebugFormat("[HGFRIENDS MODULE]: caching {0}", finfo.Friend); uMan.AddUser(id, url + ";" + first + " " + last); } } @@ -347,31 +348,31 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends return null; } - public override FriendInfo[] GetFriendsFromService(IClientAPI client) - { -// m_log.DebugFormat("[HGFRIENDS MODULE]: Entering GetFriendsFromService for {0}", client.Name); - Boolean agentIsLocal = true; - if (UserManagementModule != null) - agentIsLocal = UserManagementModule.IsLocalGridUser(client.AgentId); +// public override FriendInfo[] GetFriendsFromService(IClientAPI client) +// { +//// m_log.DebugFormat("[HGFRIENDS MODULE]: Entering GetFriendsFromService for {0}", client.Name); +// Boolean agentIsLocal = true; +// if (UserManagementModule != null) +// agentIsLocal = UserManagementModule.IsLocalGridUser(client.AgentId); - if (agentIsLocal) - return base.GetFriendsFromService(client); +// if (agentIsLocal) +// return base.GetFriendsFromService(client); - FriendInfo[] finfos = new FriendInfo[0]; - // Foreigner - AgentCircuitData agentClientCircuit = ((Scene)(client.Scene)).AuthenticateHandler.GetAgentCircuitData(client.CircuitCode); - if (agentClientCircuit != null) - { - //[XXX] string agentUUI = Util.ProduceUserUniversalIdentifier(agentClientCircuit); +// FriendInfo[] finfos = new FriendInfo[0]; +// // Foreigner +// AgentCircuitData agentClientCircuit = ((Scene)(client.Scene)).AuthenticateHandler.GetAgentCircuitData(client.CircuitCode); +// if (agentClientCircuit != null) +// { +// //[XXX] string agentUUI = Util.ProduceUserUniversalIdentifier(agentClientCircuit); - finfos = FriendsService.GetFriends(client.AgentId.ToString()); - m_log.DebugFormat("[HGFRIENDS MODULE]: Fetched {0} local friends for visitor {1}", finfos.Length, client.AgentId.ToString()); - } +// finfos = FriendsService.GetFriends(client.AgentId.ToString()); +// m_log.DebugFormat("[HGFRIENDS MODULE]: Fetched {0} local friends for visitor {1}", finfos.Length, client.AgentId.ToString()); +// } -// m_log.DebugFormat("[HGFRIENDS MODULE]: Exiting GetFriendsFromService for {0}", client.Name); +//// m_log.DebugFormat("[HGFRIENDS MODULE]: Exiting GetFriendsFromService for {0}", client.Name); - return finfos; - } +// return finfos; +// } protected override bool StoreRights(UUID agentID, UUID friendID, int rights) { diff --git a/OpenSim/Region/CoreModules/Framework/DynamicAttributes/DAExampleModule.cs b/OpenSim/Region/CoreModules/Framework/DynamicAttributes/DAExampleModule.cs index 1f1568f390..0c632b1365 100644 --- a/OpenSim/Region/CoreModules/Framework/DynamicAttributes/DAExampleModule.cs +++ b/OpenSim/Region/CoreModules/Framework/DynamicAttributes/DAExampleModule.cs @@ -44,11 +44,12 @@ namespace OpenSim.Region.CoreModules.Framework.DynamicAttributes.DAExampleModule [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule", Id = "DAExampleModule")] public class DAExampleModule : INonSharedRegionModule { -// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); - private static readonly bool ENABLED = false; // enable for testing + private readonly bool ENABLED = false; // enable for testing - public const string DANamespace = "DAExample Module"; + public const string Namespace = "Example"; + public const string StoreName = "DA"; protected Scene m_scene; protected IDialogModule m_dialogMod; @@ -65,6 +66,8 @@ namespace OpenSim.Region.CoreModules.Framework.DynamicAttributes.DAExampleModule m_scene = scene; m_scene.EventManager.OnSceneGroupMove += OnSceneGroupMove; m_dialogMod = m_scene.RequestModuleInterface(); + + m_log.DebugFormat("[DA EXAMPLE MODULE]: Added region {0}", m_scene.Name); } } @@ -91,7 +94,7 @@ namespace OpenSim.Region.CoreModules.Framework.DynamicAttributes.DAExampleModule if (sop == null) return true; - if (!sop.DynAttrs.TryGetValue(DANamespace, out attrs)) + if (!sop.DynAttrs.TryGetStore(Namespace, StoreName, out attrs)) attrs = new OSDMap(); OSDInteger newValue; @@ -106,12 +109,14 @@ namespace OpenSim.Region.CoreModules.Framework.DynamicAttributes.DAExampleModule attrs["moves"] = newValue; - sop.DynAttrs[DANamespace] = attrs; + sop.DynAttrs.SetStore(Namespace, StoreName, attrs); } sop.ParentGroup.HasGroupChanged = true; - m_dialogMod.SendGeneralAlert(string.Format("{0} {1} moved {2} times", sop.Name, sop.UUID, newValue)); + string msg = string.Format("{0} {1} moved {2} times", sop.Name, sop.UUID, newValue); + m_log.DebugFormat("[DA EXAMPLE MODULE]: {0}", msg); + m_dialogMod.SendGeneralAlert(msg); return true; } diff --git a/OpenSim/Region/CoreModules/Framework/DynamicAttributes/DOExampleModule.cs b/OpenSim/Region/CoreModules/Framework/DynamicAttributes/DOExampleModule.cs index 650aa35974..166a994a33 100644 --- a/OpenSim/Region/CoreModules/Framework/DynamicAttributes/DOExampleModule.cs +++ b/OpenSim/Region/CoreModules/Framework/DynamicAttributes/DOExampleModule.cs @@ -64,8 +64,8 @@ namespace OpenSim.Region.Framework.DynamicAttributes.DOExampleModule private Scene m_scene; private IDialogModule m_dialogMod; - - public string Name { get { return "DOExample Module"; } } + + public string Name { get { return "DO"; } } public Type ReplaceableInterface { get { return null; } } public void Initialise(IConfigSource source) {} @@ -106,7 +106,7 @@ namespace OpenSim.Region.Framework.DynamicAttributes.DOExampleModule // Console.WriteLine("Here for {0}", so.Name); - if (rootPart.DynAttrs.TryGetValue(DAExampleModule.DANamespace, out attrs)) + if (rootPart.DynAttrs.TryGetStore(DAExampleModule.Namespace, DAExampleModule.StoreName, out attrs)) { movesSoFar = attrs["moves"].AsInteger(); @@ -114,7 +114,7 @@ namespace OpenSim.Region.Framework.DynamicAttributes.DOExampleModule "[DO EXAMPLE MODULE]: Found saved moves {0} for {1} in {2}", movesSoFar, so.Name, m_scene.Name); } - rootPart.DynObjs.Add(Name, new MyObject(movesSoFar)); + rootPart.DynObjs.Add(DAExampleModule.Namespace, Name, new MyObject(movesSoFar)); } private bool OnSceneGroupMove(UUID groupId, Vector3 delta) diff --git a/OpenSim/Region/CoreModules/Framework/UserManagement/UserManagementModule.cs b/OpenSim/Region/CoreModules/Framework/UserManagement/UserManagementModule.cs index 864e1817d5..194b591460 100644 --- a/OpenSim/Region/CoreModules/Framework/UserManagement/UserManagementModule.cs +++ b/OpenSim/Region/CoreModules/Framework/UserManagement/UserManagementModule.cs @@ -320,7 +320,7 @@ namespace OpenSim.Region.CoreModules.Framework.UserManagement else { names[0] = "Unknown"; - names[1] = "UserUMMTGUN2"; + names[1] = "UserUMMTGUN3"; return false; } diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/LocalInventoryServiceConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/LocalInventoryServiceConnector.cs index ec5751d599..99913a9b55 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/LocalInventoryServiceConnector.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/LocalInventoryServiceConnector.cs @@ -196,7 +196,8 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory Util.FireAndForget(delegate { foreach (InventoryItemBase item in items) - UserManager.AddUser(item.CreatorIdAsUuid, item.CreatorData); + if (!string.IsNullOrEmpty(item.CreatorData)) + UserManager.AddUser(item.CreatorIdAsUuid, item.CreatorData); }); } diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/RemoteXInventoryServiceConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/RemoteXInventoryServiceConnector.cs index 2d3ba82e6d..70ba9448be 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/RemoteXInventoryServiceConnector.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/RemoteXInventoryServiceConnector.cs @@ -204,7 +204,8 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory Util.FireAndForget(delegate { foreach (InventoryItemBase item in items) - UserManager.AddUser(item.CreatorIdAsUuid, item.CreatorData); + if (!string.IsNullOrEmpty(item.CreatorData)) + UserManager.AddUser(item.CreatorIdAsUuid, item.CreatorData); }); } diff --git a/OpenSim/Region/CoreModules/World/Serialiser/Tests/SerialiserTests.cs b/OpenSim/Region/CoreModules/World/Serialiser/Tests/SerialiserTests.cs index b4348c9d5a..66059fb8bb 100644 --- a/OpenSim/Region/CoreModules/World/Serialiser/Tests/SerialiserTests.cs +++ b/OpenSim/Region/CoreModules/World/Serialiser/Tests/SerialiserTests.cs @@ -144,7 +144,20 @@ namespace OpenSim.Region.CoreModules.World.Serialiser.Tests None 00000000-0000-0000-0000-000000000000 0 - MyStorethe answer42 + + + + MyNamespace + + MyStore + + the answer + 42 + + + + + @@ -333,7 +346,20 @@ namespace OpenSim.Region.CoreModules.World.Serialiser.Tests 0 2147483647 None - MyStorelast wordsRosebud + + + + MyNamespace + + MyStore + + last words + Rosebud + + + + + 00000000-0000-0000-0000-000000000000 @@ -362,7 +388,7 @@ namespace OpenSim.Region.CoreModules.World.Serialiser.Tests Assert.That(rootPart.UUID, Is.EqualTo(new UUID("e6a5a05e-e8cc-4816-8701-04165e335790"))); Assert.That(rootPart.CreatorID, Is.EqualTo(new UUID("a6dacf01-4636-4bb9-8a97-30609438af9d"))); Assert.That(rootPart.Name, Is.EqualTo("PrimMyRide")); - OSDMap store = rootPart.DynAttrs["MyStore"]; + OSDMap store = rootPart.DynAttrs.GetStore("MyNamespace", "MyStore"); Assert.AreEqual(42, store["the answer"].AsInteger()); // TODO: Check other properties @@ -414,13 +440,14 @@ namespace OpenSim.Region.CoreModules.World.Serialiser.Tests rp.CreatorID = rpCreatorId; rp.Shape = shape; + string daNamespace = "MyNamespace"; string daStoreName = "MyStore"; string daKey = "foo"; string daValue = "bar"; OSDMap myStore = new OSDMap(); myStore.Add(daKey, daValue); rp.DynAttrs = new DAMap(); - rp.DynAttrs[daStoreName] = myStore; + rp.DynAttrs.SetStore(daNamespace, daStoreName, myStore); SceneObjectGroup so = new SceneObjectGroup(rp); @@ -481,7 +508,7 @@ namespace OpenSim.Region.CoreModules.World.Serialiser.Tests Assert.That(name, Is.EqualTo(rpName)); Assert.That(creatorId, Is.EqualTo(rpCreatorId)); Assert.NotNull(daMap); - Assert.AreEqual(daValue, daMap[daStoreName][daKey].AsString()); + Assert.AreEqual(daValue, daMap.GetStore(daNamespace, daStoreName)[daKey].AsString()); } [Test] @@ -496,7 +523,7 @@ namespace OpenSim.Region.CoreModules.World.Serialiser.Tests Assert.That(rootPart.UUID, Is.EqualTo(new UUID("9be68fdd-f740-4a0f-9675-dfbbb536b946"))); Assert.That(rootPart.CreatorID, Is.EqualTo(new UUID("b46ef588-411e-4a8b-a284-d7dcfe8e74ef"))); Assert.That(rootPart.Name, Is.EqualTo("PrimFun")); - OSDMap store = rootPart.DynAttrs["MyStore"]; + OSDMap store = rootPart.DynAttrs.GetStore("MyNamespace", "MyStore"); Assert.AreEqual("Rosebud", store["last words"].AsString()); // TODO: Check other properties @@ -522,13 +549,14 @@ namespace OpenSim.Region.CoreModules.World.Serialiser.Tests rp.CreatorID = rpCreatorId; rp.Shape = shape; + string daNamespace = "MyNamespace"; string daStoreName = "MyStore"; string daKey = "foo"; string daValue = "bar"; OSDMap myStore = new OSDMap(); myStore.Add(daKey, daValue); rp.DynAttrs = new DAMap(); - rp.DynAttrs[daStoreName] = myStore; + rp.DynAttrs.SetStore(daNamespace, daStoreName, myStore); SceneObjectGroup so = new SceneObjectGroup(rp); @@ -585,7 +613,7 @@ namespace OpenSim.Region.CoreModules.World.Serialiser.Tests Assert.That(name, Is.EqualTo(rpName)); Assert.That(creatorId, Is.EqualTo(rpCreatorId)); Assert.NotNull(daMap); - Assert.AreEqual(daValue, daMap[daStoreName][daKey].AsString()); + Assert.AreEqual(daValue, daMap.GetStore(daNamespace, daStoreName)[daKey].AsString()); } } } \ No newline at end of file diff --git a/OpenSim/Region/Framework/Scenes/EventManager.cs b/OpenSim/Region/Framework/Scenes/EventManager.cs index 4fec44fb7b..1018b54adb 100644 --- a/OpenSim/Region/Framework/Scenes/EventManager.cs +++ b/OpenSim/Region/Framework/Scenes/EventManager.cs @@ -1026,6 +1026,16 @@ namespace OpenSim.Region.Framework.Scenes /// public event TeleportFail OnTeleportFail; +// public delegate void GatherUuids(SceneObjectPart sop, IDictionary assetUuids); +// +// /// +// /// Triggered when UUIDs referenced by a scene object are being gathered for archiving, hg transfer, etc. +// /// +// /// +// /// The listener should add references to the IDictionary as appropriate. +// /// +// public event GatherUuids OnGatherUuids; + public class MoneyTransferArgs : EventArgs { public UUID sender; @@ -3274,5 +3284,26 @@ namespace OpenSim.Region.Framework.Scenes handler(scenePresence); } } + +// public void TriggerGatherUuids(SceneObjectPart sop, IDictionary assetUuids) +// { +// GatherUuids handler = OnGatherUuids; +// +// if (handler != null) +// { +// foreach (GatherUuids d in handler.GetInvocationList()) +// { +// try +// { +// d(sop, assetUuids); +// } +// catch (Exception e) +// { +// m_log.ErrorFormat("[EVENT MANAGER]: Delegate for TriggerUuidGather failed - continuing {0} - {1}", +// e.Message, e.StackTrace); +// } +// } +// } +// } } } diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs index 0a18d8a17b..9e3d8758bf 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs @@ -3810,20 +3810,23 @@ namespace OpenSim.Region.Framework.Scenes /// /// Update just the root prim position in a linkset /// - /// - public void UpdateRootPosition(Vector3 pos) + /// + public void UpdateRootPosition(Vector3 newPos) { // needs to be called with phys building true - Vector3 newPos = new Vector3(pos.X, pos.Y, pos.Z); - Vector3 oldPos = - new Vector3(AbsolutePosition.X + m_rootPart.OffsetPosition.X, - AbsolutePosition.Y + m_rootPart.OffsetPosition.Y, - AbsolutePosition.Z + m_rootPart.OffsetPosition.Z); + Vector3 oldPos; + + // FIXME: This improves the situation where editing just the root prim of an attached object would send + // all the other parts to oblivion after detach/reattach. However, a problem remains since the root prim + // still ends up in the wrong position on reattach. + if (IsAttachment) + oldPos = RootPart.OffsetPosition; + else + oldPos = AbsolutePosition + RootPart.OffsetPosition; + Vector3 diff = oldPos - newPos; - Vector3 axDiff = new Vector3(diff.X, diff.Y, diff.Z); Quaternion partRotation = m_rootPart.RotationOffset; - axDiff *= Quaternion.Inverse(partRotation); - diff = axDiff; + diff *= Quaternion.Inverse(partRotation); SceneObjectPart[] parts = m_parts.GetArray(); for (int i = 0; i < parts.Length; i++) diff --git a/OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs b/OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs index ce4fb4012e..68918d3749 100644 --- a/OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs +++ b/OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs @@ -1346,7 +1346,7 @@ namespace OpenSim.Region.Framework.Scenes.Serialization if (sop.MediaUrl != null) writer.WriteElementString("MediaUrl", sop.MediaUrl.ToString()); - if (sop.DynAttrs.Count > 0) + if (sop.DynAttrs.CountNamespaces > 0) { writer.WriteStartElement("DynAttrs"); sop.DynAttrs.WriteXml(writer); diff --git a/OpenSim/Region/Framework/Scenes/UuidGatherer.cs b/OpenSim/Region/Framework/Scenes/UuidGatherer.cs index 7b47275c7d..e60a025045 100644 --- a/OpenSim/Region/Framework/Scenes/UuidGatherer.cs +++ b/OpenSim/Region/Framework/Scenes/UuidGatherer.cs @@ -182,7 +182,12 @@ namespace OpenSim.Region.Framework.Scenes GatherAssetUuids(tii.AssetID, (AssetType)tii.Type, assetUuids); } - // get any texture UUIDs used for materials such as normal and specular maps + // FIXME: We need to make gathering modular but we cannot yet, since gatherers are not guaranteed + // to be called with scene objects that are in a scene (e.g. in the case of hg asset mapping and + // inventory transfer. There needs to be a way for a module to register a method without assuming a + // Scene.EventManager is present. +// part.ParentGroup.Scene.EventManager.TriggerGatherUuids(part, assetUuids); + GatherMaterialsUuids(part, assetUuids); } catch (Exception e) @@ -208,7 +213,6 @@ namespace OpenSim.Region.Framework.Scenes // } // } - /// /// Gather all of the texture asset UUIDs used to reference "Materials" such as normal and specular maps /// @@ -217,20 +221,27 @@ namespace OpenSim.Region.Framework.Scenes public void GatherMaterialsUuids(SceneObjectPart part, IDictionary assetUuids) { // scan thru the dynAttrs map of this part for any textures used as materials - OSDMap OSMaterials = null; + OSD osdMaterials = null; lock (part.DynAttrs) { - if (part.DynAttrs.ContainsKey("OS:Materials")) - OSMaterials = part.DynAttrs["OS:Materials"]; - if (OSMaterials != null && OSMaterials.ContainsKey("Materials")) + if (part.DynAttrs.ContainsStore("OpenSim", "Materials")) + { + OSDMap materialsStore = part.DynAttrs.GetStore("OpenSim", "Materials"); + + if (materialsStore == null) + return; + + materialsStore.TryGetValue("Materials", out osdMaterials); + } + + if (osdMaterials != null) { - OSD osd = OSMaterials["Materials"]; //m_log.Info("[UUID Gatherer]: found Materials: " + OSDParser.SerializeJsonString(osd)); - if (osd is OSDArray) + if (osdMaterials is OSDArray) { - OSDArray matsArr = osd as OSDArray; + OSDArray matsArr = osdMaterials as OSDArray; foreach (OSDMap matMap in matsArr) { try @@ -268,8 +279,7 @@ namespace OpenSim.Region.Framework.Scenes } } } - - + /// /// Get an asset synchronously, potentially using an asynchronous callback. If the /// asynchronous callback is used, we will wait for it to complete. diff --git a/OpenSim/Region/OptionalModules/Materials/MaterialsDemoModule.cs b/OpenSim/Region/OptionalModules/Materials/MaterialsDemoModule.cs index 4ab6609c36..3a39971078 100644 --- a/OpenSim/Region/OptionalModules/Materials/MaterialsDemoModule.cs +++ b/OpenSim/Region/OptionalModules/Materials/MaterialsDemoModule.cs @@ -121,9 +121,11 @@ namespace OpenSim.Region.OptionalModules.MaterialsDemoModule return; m_log.DebugFormat("[MaterialsDemoModule]: REGION {0} ADDED", scene.RegionInfo.RegionName); + m_scene = scene; - m_scene.EventManager.OnRegisterCaps += new EventManager.RegisterCapsEvent(OnRegisterCaps); - m_scene.EventManager.OnObjectAddedToScene += new Action(EventManager_OnObjectAddedToScene); + m_scene.EventManager.OnRegisterCaps += OnRegisterCaps; + m_scene.EventManager.OnObjectAddedToScene += EventManager_OnObjectAddedToScene; +// m_scene.EventManager.OnGatherUuids += GatherMaterialsUuids; } void EventManager_OnObjectAddedToScene(SceneObjectGroup obj) @@ -157,6 +159,10 @@ namespace OpenSim.Region.OptionalModules.MaterialsDemoModule if (!m_enabled) return; + m_scene.EventManager.OnRegisterCaps -= OnRegisterCaps; + m_scene.EventManager.OnObjectAddedToScene -= EventManager_OnObjectAddedToScene; +// m_scene.EventManager.OnGatherUuids -= GatherMaterialsUuids; + m_log.DebugFormat("[MaterialsDemoModule]: REGION {0} REMOVED", scene.RegionInfo.RegionName); } @@ -167,18 +173,21 @@ namespace OpenSim.Region.OptionalModules.MaterialsDemoModule OSDMap GetMaterial(UUID id) { OSDMap map = null; - if (m_knownMaterials.ContainsKey(id)) + lock (m_knownMaterials) { - map = new OSDMap(); - map["ID"] = OSD.FromBinary(id.GetBytes()); - map["Material"] = m_knownMaterials[id]; + if (m_knownMaterials.ContainsKey(id)) + { + map = new OSDMap(); + map["ID"] = OSD.FromBinary(id.GetBytes()); + map["Material"] = m_knownMaterials[id]; + } } return map; } void GetStoredMaterialsForPart(SceneObjectPart part) { - OSDMap OSMaterials = null; + OSD OSMaterials = null; OSDArray matsArr = null; if (part.DynAttrs == null) @@ -188,23 +197,24 @@ namespace OpenSim.Region.OptionalModules.MaterialsDemoModule lock (part.DynAttrs) { - if (part.DynAttrs.ContainsKey("OS:Materials")) - OSMaterials = part.DynAttrs["OS:Materials"]; - if (OSMaterials != null && OSMaterials.ContainsKey("Materials")) + if (part.DynAttrs.ContainsStore("OpenSim", "Materials")) { + OSDMap materialsStore = part.DynAttrs.GetStore("OpenSim", "Materials"); - OSD osd = OSMaterials["Materials"]; - if (osd is OSDArray) - matsArr = osd as OSDArray; + if (materialsStore == null) + return; + + materialsStore.TryGetValue("Materials", out OSMaterials); } + + if (OSMaterials != null && OSMaterials is OSDArray) + matsArr = OSMaterials as OSDArray; + else + return; } - if (OSMaterials == null) - return; - m_log.Info("[MaterialsDemoModule]: OSMaterials: " + OSDParser.SerializeJsonString(OSMaterials)); - if (matsArr == null) { m_log.Info("[MaterialsDemoModule]: matsArr is null :( "); @@ -215,13 +225,13 @@ namespace OpenSim.Region.OptionalModules.MaterialsDemoModule { if (elemOsd != null && elemOsd is OSDMap) { - OSDMap matMap = elemOsd as OSDMap; if (matMap.ContainsKey("ID") && matMap.ContainsKey("Material")) { try { - m_knownMaterials[matMap["ID"].AsUUID()] = (OSDMap)matMap["Material"]; + lock (m_knownMaterials) + m_knownMaterials[matMap["ID"].AsUUID()] = (OSDMap)matMap["Material"]; } catch (Exception e) { @@ -232,7 +242,6 @@ namespace OpenSim.Region.OptionalModules.MaterialsDemoModule } } - void StoreMaterialsForPart(SceneObjectPart part) { try @@ -246,8 +255,11 @@ namespace OpenSim.Region.OptionalModules.MaterialsDemoModule if (te.DefaultTexture != null) { - if (m_knownMaterials.ContainsKey(te.DefaultTexture.MaterialID)) - mats[te.DefaultTexture.MaterialID] = m_knownMaterials[te.DefaultTexture.MaterialID]; + lock (m_knownMaterials) + { + if (m_knownMaterials.ContainsKey(te.DefaultTexture.MaterialID)) + mats[te.DefaultTexture.MaterialID] = m_knownMaterials[te.DefaultTexture.MaterialID]; + } } if (te.FaceTextures != null) @@ -256,8 +268,11 @@ namespace OpenSim.Region.OptionalModules.MaterialsDemoModule { if (face != null) { - if (m_knownMaterials.ContainsKey(face.MaterialID)) - mats[face.MaterialID] = m_knownMaterials[face.MaterialID]; + lock (m_knownMaterials) + { + if (m_knownMaterials.ContainsKey(face.MaterialID)) + mats[face.MaterialID] = m_knownMaterials[face.MaterialID]; + } } } } @@ -277,7 +292,7 @@ namespace OpenSim.Region.OptionalModules.MaterialsDemoModule OSMaterials["Materials"] = matsArr; lock (part.DynAttrs) - part.DynAttrs["OS:Materials"] = OSMaterials; + part.DynAttrs.SetStore("OpenSim", "Materials", OSMaterials); } catch (Exception e) { @@ -285,7 +300,6 @@ namespace OpenSim.Region.OptionalModules.MaterialsDemoModule } } - public string RenderMaterialsPostCap(string request, string path, string param, IOSHttpRequest httpRequest, IOSHttpResponse httpResponse) @@ -319,18 +333,21 @@ namespace OpenSim.Region.OptionalModules.MaterialsDemoModule try { UUID id = new UUID(elem.AsBinary(), 0); - - if (m_knownMaterials.ContainsKey(id)) - { - m_log.Info("[MaterialsDemoModule]: request for known material ID: " + id.ToString()); - OSDMap matMap = new OSDMap(); - matMap["ID"] = OSD.FromBinary(id.GetBytes()); - matMap["Material"] = m_knownMaterials[id]; - respArr.Add(matMap); + lock (m_knownMaterials) + { + if (m_knownMaterials.ContainsKey(id)) + { + m_log.Info("[MaterialsDemoModule]: request for known material ID: " + id.ToString()); + OSDMap matMap = new OSDMap(); + matMap["ID"] = OSD.FromBinary(id.GetBytes()); + + matMap["Material"] = m_knownMaterials[id]; + respArr.Add(matMap); + } + else + m_log.Info("[MaterialsDemoModule]: request for UNKNOWN material ID: " + id.ToString()); } - else - m_log.Info("[MaterialsDemoModule]: request for UNKNOWN material ID: " + id.ToString()); } catch (Exception e) { @@ -368,7 +385,8 @@ namespace OpenSim.Region.OptionalModules.MaterialsDemoModule m_log.Debug("[MaterialsDemoModule]: mat: " + OSDParser.SerializeJsonString(mat)); UUID id = HashOsd(mat); - m_knownMaterials[id] = mat; + lock (m_knownMaterials) + m_knownMaterials[id] = mat; var sop = m_scene.GetSceneObjectPart(matLocalID); @@ -476,24 +494,22 @@ namespace OpenSim.Region.OptionalModules.MaterialsDemoModule m_log.Debug("[MaterialsDemoModule]: GET cap handler"); OSDMap resp = new OSDMap(); - - int matsCount = 0; - OSDArray allOsd = new OSDArray(); - foreach (KeyValuePair kvp in m_knownMaterials) + lock (m_knownMaterials) { - OSDMap matMap = new OSDMap(); + foreach (KeyValuePair kvp in m_knownMaterials) + { + OSDMap matMap = new OSDMap(); - matMap["ID"] = OSD.FromBinary(kvp.Key.GetBytes()); - - matMap["Material"] = kvp.Value; - allOsd.Add(matMap); - matsCount++; + matMap["ID"] = OSD.FromBinary(kvp.Key.GetBytes()); + matMap["Material"] = kvp.Value; + allOsd.Add(matMap); + matsCount++; + } } - resp["Zipped"] = ZCompressOSD(allOsd, false); m_log.Debug("[MaterialsDemoModule]: matsCount: " + matsCount.ToString()); @@ -575,5 +591,72 @@ namespace OpenSim.Region.OptionalModules.MaterialsDemoModule output.Flush(); } + // FIXME: This code is currently still in UuidGatherer since we cannot use Scene.EventManager as some + // calls to the gatherer are done for objects with no scene. +// /// +// /// Gather all of the texture asset UUIDs used to reference "Materials" such as normal and specular maps +// /// +// /// +// /// +// private void GatherMaterialsUuids(SceneObjectPart part, IDictionary assetUuids) +// { +// // scan thru the dynAttrs map of this part for any textures used as materials +// OSD osdMaterials = null; +// +// lock (part.DynAttrs) +// { +// if (part.DynAttrs.ContainsStore("OpenSim", "Materials")) +// { +// OSDMap materialsStore = part.DynAttrs.GetStore("OpenSim", "Materials"); +// if (materialsStore == null) +// return; +// +// materialsStore.TryGetValue("Materials", out osdMaterials); +// } +// +// if (osdMaterials != null) +// { +// //m_log.Info("[UUID Gatherer]: found Materials: " + OSDParser.SerializeJsonString(osd)); +// +// if (osdMaterials is OSDArray) +// { +// OSDArray matsArr = osdMaterials as OSDArray; +// foreach (OSDMap matMap in matsArr) +// { +// try +// { +// if (matMap.ContainsKey("Material")) +// { +// OSDMap mat = matMap["Material"] as OSDMap; +// if (mat.ContainsKey("NormMap")) +// { +// UUID normalMapId = mat["NormMap"].AsUUID(); +// if (normalMapId != UUID.Zero) +// { +// assetUuids[normalMapId] = AssetType.Texture; +// //m_log.Info("[UUID Gatherer]: found normal map ID: " + normalMapId.ToString()); +// } +// } +// if (mat.ContainsKey("SpecMap")) +// { +// UUID specularMapId = mat["SpecMap"].AsUUID(); +// if (specularMapId != UUID.Zero) +// { +// assetUuids[specularMapId] = AssetType.Texture; +// //m_log.Info("[UUID Gatherer]: found specular map ID: " + specularMapId.ToString()); +// } +// } +// } +// +// } +// catch (Exception e) +// { +// m_log.Warn("[MaterialsDemoModule]: exception getting materials: " + e.Message); +// } +// } +// } +// } +// } +// } } } \ No newline at end of file diff --git a/OpenSim/Server/Handlers/Asset/AssetServerConnector.cs b/OpenSim/Server/Handlers/Asset/AssetServerConnector.cs index ff45d94b7a..cc4325ac4c 100644 --- a/OpenSim/Server/Handlers/Asset/AssetServerConnector.cs +++ b/OpenSim/Server/Handlers/Asset/AssetServerConnector.cs @@ -119,16 +119,14 @@ namespace OpenSim.Server.Handlers.Asset if (asset == null || asset.Data.Length == 0) { - MainConsole.Instance.Output("Asset not found"); + MainConsole.Instance.OutputFormat("Could not find asset with ID {0}", args[2]); return; } - m_AssetService.Delete(args[2]); - - //MainConsole.Instance.Output("Asset deleted"); - // TODO: Implement this - - MainConsole.Instance.Output("Asset deletion not supported by database"); + if (!m_AssetService.Delete(asset.ID)) + MainConsole.Instance.OutputFormat("ERROR: Could not delete asset {0} {1}", asset.ID, asset.Name); + else + MainConsole.Instance.OutputFormat("Deleted asset {0} {1}", asset.ID, asset.Name); } void HandleDumpAsset(string module, string[] args) diff --git a/OpenSim/Services/AssetService/XAssetService.cs b/OpenSim/Services/AssetService/XAssetService.cs index 8a2ca7cf6d..6047616f65 100644 --- a/OpenSim/Services/AssetService/XAssetService.cs +++ b/OpenSim/Services/AssetService/XAssetService.cs @@ -205,15 +205,16 @@ namespace OpenSim.Services.AssetService if (!UUID.TryParse(id, out assetID)) return false; - // Don't bother deleting from a chained asset service. This isn't a big deal since deleting happens - // very rarely. + if (HasChainedAssetService) + m_ChainedAssetService.Delete(id); return m_Database.Delete(id); } private void MigrateFromChainedService(AssetBase asset) { - Util.FireAndForget(o => { Store(asset); m_ChainedAssetService.Delete(asset.ID); }); + Store(asset); + m_ChainedAssetService.Delete(asset.ID); } } } \ No newline at end of file diff --git a/OpenSim/Services/Connectors/Hypergrid/HGFriendsServicesConnector.cs b/OpenSim/Services/Connectors/Hypergrid/HGFriendsServicesConnector.cs index e984a544fd..622d4e1712 100644 --- a/OpenSim/Services/Connectors/Hypergrid/HGFriendsServicesConnector.cs +++ b/OpenSim/Services/Connectors/Hypergrid/HGFriendsServicesConnector.cs @@ -277,7 +277,7 @@ namespace OpenSim.Services.Connectors.Hypergrid { reply = SynchronousRestFormsRequester.MakeRequest("POST", uri, - ServerUtils.BuildQueryString(sendData)); + ServerUtils.BuildQueryString(sendData), 15); } catch (Exception e) { diff --git a/bin/assets/TexturesAssetSet/IMG_BLOOM1.jp2 b/bin/assets/TexturesAssetSet/IMG_BLOOM1.jp2 new file mode 100644 index 0000000000..8186d493b5 Binary files /dev/null and b/bin/assets/TexturesAssetSet/IMG_BLOOM1.jp2 differ diff --git a/bin/assets/TexturesAssetSet/TexturesAssetSet.xml b/bin/assets/TexturesAssetSet/TexturesAssetSet.xml index a4a0cba127..a29ac38bfb 100644 --- a/bin/assets/TexturesAssetSet/TexturesAssetSet.xml +++ b/bin/assets/TexturesAssetSet/TexturesAssetSet.xml @@ -746,4 +746,16 @@ + + +
+ + + + +
+