diff options
11 files changed, 257 insertions, 172 deletions
diff --git a/OpenSim/Data/MSSQL/MSSQLSimulationData.cs b/OpenSim/Data/MSSQL/MSSQLSimulationData.cs index 476f57a..5135050 100644 --- a/OpenSim/Data/MSSQL/MSSQLSimulationData.cs +++ b/OpenSim/Data/MSSQL/MSSQLSimulationData.cs | |||
@@ -2100,7 +2100,7 @@ VALUES | |||
2100 | parameters.Add(_Database.CreateParameter("LinkNumber", prim.LinkNum)); | 2100 | parameters.Add(_Database.CreateParameter("LinkNumber", prim.LinkNum)); |
2101 | parameters.Add(_Database.CreateParameter("MediaURL", prim.MediaUrl)); | 2101 | parameters.Add(_Database.CreateParameter("MediaURL", prim.MediaUrl)); |
2102 | 2102 | ||
2103 | if (prim.DynAttrs.Count > 0) | 2103 | if (prim.DynAttrs.CountNamespaces > 0) |
2104 | parameters.Add(_Database.CreateParameter("DynAttrs", prim.DynAttrs.ToXml())); | 2104 | parameters.Add(_Database.CreateParameter("DynAttrs", prim.DynAttrs.ToXml())); |
2105 | else | 2105 | else |
2106 | parameters.Add(_Database.CreateParameter("DynAttrs", null)); | 2106 | parameters.Add(_Database.CreateParameter("DynAttrs", null)); |
diff --git a/OpenSim/Data/MySQL/MySQLSimulationData.cs b/OpenSim/Data/MySQL/MySQLSimulationData.cs index de52623..cf367ef 100644 --- a/OpenSim/Data/MySQL/MySQLSimulationData.cs +++ b/OpenSim/Data/MySQL/MySQLSimulationData.cs | |||
@@ -1679,7 +1679,7 @@ namespace OpenSim.Data.MySQL | |||
1679 | else | 1679 | else |
1680 | cmd.Parameters.AddWithValue("KeyframeMotion", new Byte[0]); | 1680 | cmd.Parameters.AddWithValue("KeyframeMotion", new Byte[0]); |
1681 | 1681 | ||
1682 | if (prim.DynAttrs.Count > 0) | 1682 | if (prim.DynAttrs.CountNamespaces > 0) |
1683 | cmd.Parameters.AddWithValue("DynAttrs", prim.DynAttrs.ToXml()); | 1683 | cmd.Parameters.AddWithValue("DynAttrs", prim.DynAttrs.ToXml()); |
1684 | else | 1684 | else |
1685 | cmd.Parameters.AddWithValue("DynAttrs", null); | 1685 | cmd.Parameters.AddWithValue("DynAttrs", null); |
diff --git a/OpenSim/Data/SQLite/SQLiteSimulationData.cs b/OpenSim/Data/SQLite/SQLiteSimulationData.cs index c35bba2..eba6612 100644 --- a/OpenSim/Data/SQLite/SQLiteSimulationData.cs +++ b/OpenSim/Data/SQLite/SQLiteSimulationData.cs | |||
@@ -2176,7 +2176,7 @@ namespace OpenSim.Data.SQLite | |||
2176 | 2176 | ||
2177 | row["MediaURL"] = prim.MediaUrl; | 2177 | row["MediaURL"] = prim.MediaUrl; |
2178 | 2178 | ||
2179 | if (prim.DynAttrs.Count > 0) | 2179 | if (prim.DynAttrs.CountNamespaces > 0) |
2180 | row["DynAttrs"] = prim.DynAttrs.ToXml(); | 2180 | row["DynAttrs"] = prim.DynAttrs.ToXml(); |
2181 | else | 2181 | else |
2182 | row["DynAttrs"] = null; | 2182 | row["DynAttrs"] = null; |
diff --git a/OpenSim/Framework/DAMap.cs b/OpenSim/Framework/DAMap.cs index df4a6bc..a57393b 100644 --- a/OpenSim/Framework/DAMap.cs +++ b/OpenSim/Framework/DAMap.cs | |||
@@ -29,10 +29,12 @@ using System; | |||
29 | using System.Collections; | 29 | using System.Collections; |
30 | using System.Collections.Generic; | 30 | using System.Collections.Generic; |
31 | using System.IO; | 31 | using System.IO; |
32 | using System.Reflection; | ||
32 | using System.Text; | 33 | using System.Text; |
33 | using System.Xml; | 34 | using System.Xml; |
34 | using System.Xml.Schema; | 35 | using System.Xml.Schema; |
35 | using System.Xml.Serialization; | 36 | using System.Xml.Serialization; |
37 | using log4net; | ||
36 | using OpenMetaverse; | 38 | using OpenMetaverse; |
37 | using OpenMetaverse.StructuredData; | 39 | using OpenMetaverse.StructuredData; |
38 | 40 | ||
@@ -48,13 +50,20 @@ namespace OpenSim.Framework | |||
48 | /// within their data store. However, avoid storing large amounts of data because that | 50 | /// within their data store. However, avoid storing large amounts of data because that |
49 | /// would slow down database access. | 51 | /// would slow down database access. |
50 | /// </remarks> | 52 | /// </remarks> |
51 | public class DAMap : IDictionary<string, OSDMap>, IXmlSerializable | 53 | public class DAMap : IXmlSerializable |
52 | { | 54 | { |
53 | private static readonly int MIN_STORE_NAME_LENGTH = 4; | 55 | // private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); |
54 | 56 | ||
55 | protected OSDMap m_map; | 57 | private static readonly int MIN_NAMESPACE_LENGTH = 4; |
56 | 58 | ||
57 | public DAMap() { m_map = new OSDMap(); } | 59 | private OSDMap m_map = new OSDMap(); |
60 | |||
61 | // WARNING: this is temporary for experimentation only, it will be removed!!!! | ||
62 | public OSDMap TopLevelMap | ||
63 | { | ||
64 | get { return m_map; } | ||
65 | set { m_map = value; } | ||
66 | } | ||
58 | 67 | ||
59 | public XmlSchema GetSchema() { return null; } | 68 | public XmlSchema GetSchema() { return null; } |
60 | 69 | ||
@@ -64,39 +73,34 @@ namespace OpenSim.Framework | |||
64 | map.ReadXml(rawXml); | 73 | map.ReadXml(rawXml); |
65 | return map; | 74 | return map; |
66 | } | 75 | } |
67 | 76 | ||
77 | public void ReadXml(XmlReader reader) | ||
78 | { | ||
79 | ReadXml(reader.ReadInnerXml()); | ||
80 | } | ||
81 | |||
68 | public void ReadXml(string rawXml) | 82 | public void ReadXml(string rawXml) |
69 | { | 83 | { |
70 | // System.Console.WriteLine("Trying to deserialize [{0}]", rawXml); | 84 | // System.Console.WriteLine("Trying to deserialize [{0}]", rawXml); |
71 | 85 | ||
72 | lock (this) | 86 | lock (this) |
87 | { | ||
73 | m_map = (OSDMap)OSDParser.DeserializeLLSDXml(rawXml); | 88 | m_map = (OSDMap)OSDParser.DeserializeLLSDXml(rawXml); |
89 | SanitiseMap(this); | ||
90 | } | ||
74 | } | 91 | } |
75 | 92 | ||
76 | // WARNING: this is temporary for experimentation only, it will be removed!!!! | 93 | public void WriteXml(XmlWriter writer) |
77 | public OSDMap TopLevelMap | ||
78 | { | 94 | { |
79 | get { return m_map; } | 95 | writer.WriteRaw(ToXml()); |
80 | set { m_map = value; } | ||
81 | } | 96 | } |
82 | |||
83 | 97 | ||
84 | public void ReadXml(XmlReader reader) | ||
85 | { | ||
86 | ReadXml(reader.ReadInnerXml()); | ||
87 | } | ||
88 | |||
89 | public string ToXml() | 98 | public string ToXml() |
90 | { | 99 | { |
91 | lock (this) | 100 | lock (this) |
92 | return OSDParser.SerializeLLSDXmlString(m_map); | 101 | return OSDParser.SerializeLLSDXmlString(m_map); |
93 | } | 102 | } |
94 | 103 | ||
95 | public void WriteXml(XmlWriter writer) | ||
96 | { | ||
97 | writer.WriteRaw(ToXml()); | ||
98 | } | ||
99 | |||
100 | public void CopyFrom(DAMap other) | 104 | public void CopyFrom(DAMap other) |
101 | { | 105 | { |
102 | // Deep copy | 106 | // Deep copy |
@@ -104,7 +108,7 @@ namespace OpenSim.Framework | |||
104 | string data = null; | 108 | string data = null; |
105 | lock (other) | 109 | lock (other) |
106 | { | 110 | { |
107 | if (other.Count > 0) | 111 | if (other.CountNamespaces > 0) |
108 | { | 112 | { |
109 | data = OSDParser.SerializeLLSDXmlString(other.m_map); | 113 | data = OSDParser.SerializeLLSDXmlString(other.m_map); |
110 | } | 114 | } |
@@ -120,59 +124,133 @@ namespace OpenSim.Framework | |||
120 | } | 124 | } |
121 | 125 | ||
122 | /// <summary> | 126 | /// <summary> |
123 | /// Returns the number of data stores. | 127 | /// Sanitise the map to remove any namespaces or stores that are not OSDMap. |
124 | /// </summary> | 128 | /// </summary> |
125 | public int Count { get { lock (this) { return m_map.Count; } } } | 129 | /// <param name='map'> |
126 | 130 | /// </param> | |
127 | public bool IsReadOnly { get { return false; } } | 131 | public static void SanitiseMap(DAMap daMap) |
128 | 132 | { | |
133 | List<string> keysToRemove = null; | ||
134 | |||
135 | // Hard-coded special case that needs to be removed in the future. Normally, modules themselves should | ||
136 | // handle reading data from old locations | ||
137 | bool osMaterialsMigrationRequired = false; | ||
138 | |||
139 | OSDMap namespacesMap = daMap.m_map; | ||
140 | |||
141 | foreach (string key in namespacesMap.Keys) | ||
142 | { | ||
143 | // Console.WriteLine("Processing ns {0}", key); | ||
144 | if (!(namespacesMap[key] is OSDMap)) | ||
145 | { | ||
146 | if (keysToRemove == null) | ||
147 | keysToRemove = new List<string>(); | ||
148 | |||
149 | keysToRemove.Add(key); | ||
150 | } | ||
151 | else if (key == "OS:Materials") | ||
152 | { | ||
153 | osMaterialsMigrationRequired = true; | ||
154 | } | ||
155 | } | ||
156 | |||
157 | if (keysToRemove != null) | ||
158 | { | ||
159 | foreach (string key in keysToRemove) | ||
160 | { | ||
161 | // Console.WriteLine ("Removing bad ns {0}", key); | ||
162 | namespacesMap.Remove(key); | ||
163 | } | ||
164 | } | ||
165 | |||
166 | // Hard-coded special case that needs to be removed in the future. Normally, modules themselves should | ||
167 | // handle reading data from old locations | ||
168 | if (osMaterialsMigrationRequired) | ||
169 | daMap.SetStore("OpenSim", "Materials", (OSDMap)namespacesMap["OS:Materials"]); | ||
170 | |||
171 | foreach (OSD nsOsd in namespacesMap.Values) | ||
172 | { | ||
173 | OSDMap nsOsdMap = (OSDMap)nsOsd; | ||
174 | keysToRemove = null; | ||
175 | |||
176 | foreach (string key in nsOsdMap.Keys) | ||
177 | { | ||
178 | if (!(nsOsdMap[key] is OSDMap)) | ||
179 | { | ||
180 | if (keysToRemove == null) | ||
181 | keysToRemove = new List<string>(); | ||
182 | |||
183 | keysToRemove.Add(key); | ||
184 | } | ||
185 | } | ||
186 | |||
187 | if (keysToRemove != null) | ||
188 | foreach (string key in keysToRemove) | ||
189 | nsOsdMap.Remove(key); | ||
190 | } | ||
191 | } | ||
192 | |||
129 | /// <summary> | 193 | /// <summary> |
130 | /// Returns the names of the data stores. | 194 | /// Get the number of namespaces |
131 | /// </summary> | 195 | /// </summary> |
132 | public ICollection<string> Keys { get { lock (this) { return m_map.Keys; } } } | 196 | public int CountNamespaces { get { lock (this) { return m_map.Count; } } } |
133 | 197 | ||
134 | /// <summary> | 198 | /// <summary> |
135 | /// Returns all the data stores. | 199 | /// Get the number of stores. |
136 | /// </summary> | 200 | /// </summary> |
137 | public ICollection<OSDMap> Values | 201 | public int CountStores |
138 | { | 202 | { |
139 | get | 203 | get |
140 | { | 204 | { |
205 | int count = 0; | ||
206 | |||
141 | lock (this) | 207 | lock (this) |
142 | { | 208 | { |
143 | List<OSDMap> stores = new List<OSDMap>(m_map.Count); | 209 | foreach (OSD osdNamespace in m_map) |
144 | foreach (OSD llsd in m_map.Values) | 210 | { |
145 | stores.Add((OSDMap)llsd); | 211 | count += ((OSDMap)osdNamespace).Count; |
146 | return stores; | 212 | } |
147 | } | 213 | } |
214 | |||
215 | return count; | ||
148 | } | 216 | } |
149 | } | 217 | } |
150 | 218 | ||
151 | /// <summary> | 219 | public OSDMap GetStore(string ns, string storeName) |
152 | /// Gets or sets one data store. | 220 | { |
153 | /// </summary> | 221 | OSD namespaceOsd; |
154 | /// <param name="key">Store name</param> | 222 | |
155 | /// <returns></returns> | 223 | lock (this) |
156 | public OSDMap this[string key] | 224 | { |
157 | { | 225 | if (m_map.TryGetValue(ns, out namespaceOsd)) |
158 | get | ||
159 | { | ||
160 | OSD llsd; | ||
161 | |||
162 | lock (this) | ||
163 | { | 226 | { |
164 | if (m_map.TryGetValue(key, out llsd)) | 227 | OSD store; |
165 | return (OSDMap)llsd; | 228 | |
166 | else | 229 | if (((OSDMap)namespaceOsd).TryGetValue(storeName, out store)) |
167 | return null; | 230 | return (OSDMap)store; |
168 | } | 231 | } |
169 | } | 232 | } |
170 | 233 | ||
171 | set | 234 | return null; |
235 | } | ||
236 | |||
237 | public void SetStore(string ns, string storeName, OSDMap store) | ||
238 | { | ||
239 | ValidateNamespace(ns); | ||
240 | OSDMap nsMap; | ||
241 | |||
242 | lock (this) | ||
172 | { | 243 | { |
173 | ValidateKey(key); | 244 | if (!m_map.ContainsKey(ns)) |
174 | lock (this) | 245 | { |
175 | m_map[key] = value; | 246 | nsMap = new OSDMap(); |
247 | m_map[ns] = nsMap; | ||
248 | } | ||
249 | |||
250 | nsMap = (OSDMap)m_map[ns]; | ||
251 | |||
252 | // m_log.DebugFormat("[DA MAP]: Setting store to {0}:{1}", ns, storeName); | ||
253 | nsMap[storeName] = store; | ||
176 | } | 254 | } |
177 | } | 255 | } |
178 | 256 | ||
@@ -180,54 +258,46 @@ namespace OpenSim.Framework | |||
180 | /// Validate the key used for storing separate data stores. | 258 | /// Validate the key used for storing separate data stores. |
181 | /// </summary> | 259 | /// </summary> |
182 | /// <param name='key'></param> | 260 | /// <param name='key'></param> |
183 | public static void ValidateKey(string key) | 261 | public static void ValidateNamespace(string ns) |
184 | { | 262 | { |
185 | if (key.Length < MIN_STORE_NAME_LENGTH) | 263 | if (ns.Length < MIN_NAMESPACE_LENGTH) |
186 | throw new Exception("Minimum store name length is " + MIN_STORE_NAME_LENGTH); | 264 | throw new Exception("Minimum namespace length is " + MIN_NAMESPACE_LENGTH); |
187 | } | 265 | } |
188 | 266 | ||
189 | public bool ContainsKey(string key) | 267 | public bool ContainsStore(string ns, string storeName) |
190 | { | 268 | { |
191 | lock (this) | 269 | OSD namespaceOsd; |
192 | return m_map.ContainsKey(key); | ||
193 | } | ||
194 | |||
195 | public void Add(string key, OSDMap store) | ||
196 | { | ||
197 | ValidateKey(key); | ||
198 | lock (this) | ||
199 | m_map.Add(key, store); | ||
200 | } | ||
201 | 270 | ||
202 | public void Add(KeyValuePair<string, OSDMap> kvp) | ||
203 | { | ||
204 | ValidateKey(kvp.Key); | ||
205 | lock (this) | 271 | lock (this) |
206 | m_map.Add(kvp.Key, kvp.Value); | 272 | { |
207 | } | 273 | if (m_map.TryGetValue(ns, out namespaceOsd)) |
274 | { | ||
275 | return ((OSDMap)namespaceOsd).ContainsKey(storeName); | ||
276 | } | ||
277 | } | ||
208 | 278 | ||
209 | public bool Remove(string key) | 279 | return false; |
210 | { | 280 | } |
211 | lock (this) | ||
212 | return m_map.Remove(key); | ||
213 | } | ||
214 | 281 | ||
215 | public bool TryGetValue(string key, out OSDMap store) | 282 | public bool TryGetStore(string ns, string storeName, out OSDMap store) |
216 | { | 283 | { |
284 | OSD namespaceOsd; | ||
285 | |||
217 | lock (this) | 286 | lock (this) |
218 | { | 287 | { |
219 | OSD llsd; | 288 | if (m_map.TryGetValue(ns, out namespaceOsd)) |
220 | if (m_map.TryGetValue(key, out llsd)) | ||
221 | { | ||
222 | store = (OSDMap)llsd; | ||
223 | return true; | ||
224 | } | ||
225 | else | ||
226 | { | 289 | { |
227 | store = null; | 290 | OSD storeOsd; |
228 | return false; | 291 | |
292 | bool result = ((OSDMap)namespaceOsd).TryGetValue(storeName, out storeOsd); | ||
293 | store = (OSDMap)storeOsd; | ||
294 | |||
295 | return result; | ||
229 | } | 296 | } |
230 | } | 297 | } |
298 | |||
299 | store = null; | ||
300 | return false; | ||
231 | } | 301 | } |
232 | 302 | ||
233 | public void Clear() | 303 | public void Clear() |
@@ -235,39 +305,25 @@ namespace OpenSim.Framework | |||
235 | lock (this) | 305 | lock (this) |
236 | m_map.Clear(); | 306 | m_map.Clear(); |
237 | } | 307 | } |
238 | |||
239 | public bool Contains(KeyValuePair<string, OSDMap> kvp) | ||
240 | { | ||
241 | lock (this) | ||
242 | return m_map.ContainsKey(kvp.Key); | ||
243 | } | ||
244 | 308 | ||
245 | public void CopyTo(KeyValuePair<string, OSDMap>[] array, int index) | 309 | public bool RemoveStore(string ns, string storeName) |
246 | { | 310 | { |
247 | throw new NotImplementedException(); | 311 | OSD namespaceOsd; |
248 | } | ||
249 | 312 | ||
250 | public bool Remove(KeyValuePair<string, OSDMap> kvp) | ||
251 | { | ||
252 | lock (this) | ||
253 | return m_map.Remove(kvp.Key); | ||
254 | } | ||
255 | |||
256 | public System.Collections.IDictionaryEnumerator GetEnumerator() | ||
257 | { | ||
258 | lock (this) | 313 | lock (this) |
259 | return m_map.GetEnumerator(); | 314 | { |
260 | } | 315 | if (m_map.TryGetValue(ns, out namespaceOsd)) |
316 | { | ||
317 | OSDMap namespaceOsdMap = (OSDMap)namespaceOsd; | ||
318 | namespaceOsdMap.Remove(storeName); | ||
261 | 319 | ||
262 | IEnumerator<KeyValuePair<string, OSDMap>> IEnumerable<KeyValuePair<string, OSDMap>>.GetEnumerator() | 320 | // Don't keep empty namespaces around |
263 | { | 321 | if (namespaceOsdMap.Count <= 0) |
264 | return null; | 322 | m_map.Remove(ns); |
265 | } | 323 | } |
324 | } | ||
266 | 325 | ||
267 | IEnumerator IEnumerable.GetEnumerator() | 326 | return false; |
268 | { | 327 | } |
269 | lock (this) | ||
270 | return m_map.GetEnumerator(); | ||
271 | } | ||
272 | } | 328 | } |
273 | } \ No newline at end of file | 329 | } \ No newline at end of file |
diff --git a/OpenSim/Framework/DOMap.cs b/OpenSim/Framework/DOMap.cs index 755e129..f5b650b 100644 --- a/OpenSim/Framework/DOMap.cs +++ b/OpenSim/Framework/DOMap.cs | |||
@@ -42,22 +42,22 @@ namespace OpenSim.Framework | |||
42 | /// This class stores and retrieves dynamic objects. | 42 | /// This class stores and retrieves dynamic objects. |
43 | /// </summary> | 43 | /// </summary> |
44 | /// <remarks> | 44 | /// <remarks> |
45 | /// Experimental - DO NOT USE. | 45 | /// Experimental - DO NOT USE. Does not yet have namespace support. |
46 | /// </remarks> | 46 | /// </remarks> |
47 | public class DOMap | 47 | public class DOMap |
48 | { | 48 | { |
49 | private IDictionary<string, object> m_map; | 49 | private IDictionary<string, object> m_map; |
50 | 50 | ||
51 | public void Add(string key, object dynObj) | 51 | public void Add(string ns, string objName, object dynObj) |
52 | { | 52 | { |
53 | DAMap.ValidateKey(key); | 53 | DAMap.ValidateNamespace(ns); |
54 | 54 | ||
55 | lock (this) | 55 | lock (this) |
56 | { | 56 | { |
57 | if (m_map == null) | 57 | if (m_map == null) |
58 | m_map = new Dictionary<string, object>(); | 58 | m_map = new Dictionary<string, object>(); |
59 | 59 | ||
60 | m_map.Add(key, dynObj); | 60 | m_map.Add(objName, dynObj); |
61 | } | 61 | } |
62 | } | 62 | } |
63 | 63 | ||
diff --git a/OpenSim/Region/CoreModules/Framework/DynamicAttributes/DAExampleModule.cs b/OpenSim/Region/CoreModules/Framework/DynamicAttributes/DAExampleModule.cs index 1f1568f..0c632b1 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 | |||
44 | [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule", Id = "DAExampleModule")] | 44 | [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule", Id = "DAExampleModule")] |
45 | public class DAExampleModule : INonSharedRegionModule | 45 | public class DAExampleModule : INonSharedRegionModule |
46 | { | 46 | { |
47 | // private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | 47 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); |
48 | 48 | ||
49 | private static readonly bool ENABLED = false; // enable for testing | 49 | private readonly bool ENABLED = false; // enable for testing |
50 | 50 | ||
51 | public const string DANamespace = "DAExample Module"; | 51 | public const string Namespace = "Example"; |
52 | public const string StoreName = "DA"; | ||
52 | 53 | ||
53 | protected Scene m_scene; | 54 | protected Scene m_scene; |
54 | protected IDialogModule m_dialogMod; | 55 | protected IDialogModule m_dialogMod; |
@@ -65,6 +66,8 @@ namespace OpenSim.Region.CoreModules.Framework.DynamicAttributes.DAExampleModule | |||
65 | m_scene = scene; | 66 | m_scene = scene; |
66 | m_scene.EventManager.OnSceneGroupMove += OnSceneGroupMove; | 67 | m_scene.EventManager.OnSceneGroupMove += OnSceneGroupMove; |
67 | m_dialogMod = m_scene.RequestModuleInterface<IDialogModule>(); | 68 | m_dialogMod = m_scene.RequestModuleInterface<IDialogModule>(); |
69 | |||
70 | m_log.DebugFormat("[DA EXAMPLE MODULE]: Added region {0}", m_scene.Name); | ||
68 | } | 71 | } |
69 | } | 72 | } |
70 | 73 | ||
@@ -91,7 +94,7 @@ namespace OpenSim.Region.CoreModules.Framework.DynamicAttributes.DAExampleModule | |||
91 | if (sop == null) | 94 | if (sop == null) |
92 | return true; | 95 | return true; |
93 | 96 | ||
94 | if (!sop.DynAttrs.TryGetValue(DANamespace, out attrs)) | 97 | if (!sop.DynAttrs.TryGetStore(Namespace, StoreName, out attrs)) |
95 | attrs = new OSDMap(); | 98 | attrs = new OSDMap(); |
96 | 99 | ||
97 | OSDInteger newValue; | 100 | OSDInteger newValue; |
@@ -106,12 +109,14 @@ namespace OpenSim.Region.CoreModules.Framework.DynamicAttributes.DAExampleModule | |||
106 | 109 | ||
107 | attrs["moves"] = newValue; | 110 | attrs["moves"] = newValue; |
108 | 111 | ||
109 | sop.DynAttrs[DANamespace] = attrs; | 112 | sop.DynAttrs.SetStore(Namespace, StoreName, attrs); |
110 | } | 113 | } |
111 | 114 | ||
112 | sop.ParentGroup.HasGroupChanged = true; | 115 | sop.ParentGroup.HasGroupChanged = true; |
113 | 116 | ||
114 | m_dialogMod.SendGeneralAlert(string.Format("{0} {1} moved {2} times", sop.Name, sop.UUID, newValue)); | 117 | string msg = string.Format("{0} {1} moved {2} times", sop.Name, sop.UUID, newValue); |
118 | m_log.DebugFormat("[DA EXAMPLE MODULE]: {0}", msg); | ||
119 | m_dialogMod.SendGeneralAlert(msg); | ||
115 | 120 | ||
116 | return true; | 121 | return true; |
117 | } | 122 | } |
diff --git a/OpenSim/Region/CoreModules/Framework/DynamicAttributes/DOExampleModule.cs b/OpenSim/Region/CoreModules/Framework/DynamicAttributes/DOExampleModule.cs index 650aa35..166a994 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 | |||
64 | 64 | ||
65 | private Scene m_scene; | 65 | private Scene m_scene; |
66 | private IDialogModule m_dialogMod; | 66 | private IDialogModule m_dialogMod; |
67 | 67 | ||
68 | public string Name { get { return "DOExample Module"; } } | 68 | public string Name { get { return "DO"; } } |
69 | public Type ReplaceableInterface { get { return null; } } | 69 | public Type ReplaceableInterface { get { return null; } } |
70 | 70 | ||
71 | public void Initialise(IConfigSource source) {} | 71 | public void Initialise(IConfigSource source) {} |
@@ -106,7 +106,7 @@ namespace OpenSim.Region.Framework.DynamicAttributes.DOExampleModule | |||
106 | 106 | ||
107 | // Console.WriteLine("Here for {0}", so.Name); | 107 | // Console.WriteLine("Here for {0}", so.Name); |
108 | 108 | ||
109 | if (rootPart.DynAttrs.TryGetValue(DAExampleModule.DANamespace, out attrs)) | 109 | if (rootPart.DynAttrs.TryGetStore(DAExampleModule.Namespace, DAExampleModule.StoreName, out attrs)) |
110 | { | 110 | { |
111 | movesSoFar = attrs["moves"].AsInteger(); | 111 | movesSoFar = attrs["moves"].AsInteger(); |
112 | 112 | ||
@@ -114,7 +114,7 @@ namespace OpenSim.Region.Framework.DynamicAttributes.DOExampleModule | |||
114 | "[DO EXAMPLE MODULE]: Found saved moves {0} for {1} in {2}", movesSoFar, so.Name, m_scene.Name); | 114 | "[DO EXAMPLE MODULE]: Found saved moves {0} for {1} in {2}", movesSoFar, so.Name, m_scene.Name); |
115 | } | 115 | } |
116 | 116 | ||
117 | rootPart.DynObjs.Add(Name, new MyObject(movesSoFar)); | 117 | rootPart.DynObjs.Add(DAExampleModule.Namespace, Name, new MyObject(movesSoFar)); |
118 | } | 118 | } |
119 | 119 | ||
120 | private bool OnSceneGroupMove(UUID groupId, Vector3 delta) | 120 | private bool OnSceneGroupMove(UUID groupId, Vector3 delta) |
diff --git a/OpenSim/Region/CoreModules/World/Serialiser/Tests/SerialiserTests.cs b/OpenSim/Region/CoreModules/World/Serialiser/Tests/SerialiserTests.cs index b4348c9..66059fb 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 | |||
144 | <Flags>None</Flags> | 144 | <Flags>None</Flags> |
145 | <CollisionSound><Guid>00000000-0000-0000-0000-000000000000</Guid></CollisionSound> | 145 | <CollisionSound><Guid>00000000-0000-0000-0000-000000000000</Guid></CollisionSound> |
146 | <CollisionSoundVolume>0</CollisionSoundVolume> | 146 | <CollisionSoundVolume>0</CollisionSoundVolume> |
147 | <DynAttrs><llsd><map><key>MyStore</key><map><key>the answer</key><integer>42</integer></map></map></llsd></DynAttrs> | 147 | <DynAttrs> |
148 | <llsd> | ||
149 | <map> | ||
150 | <key>MyNamespace</key> | ||
151 | <map> | ||
152 | <key>MyStore</key> | ||
153 | <map> | ||
154 | <key>the answer</key> | ||
155 | <integer>42</integer> | ||
156 | </map> | ||
157 | </map> | ||
158 | </map> | ||
159 | </llsd> | ||
160 | </DynAttrs> | ||
148 | </SceneObjectPart> | 161 | </SceneObjectPart> |
149 | </RootPart> | 162 | </RootPart> |
150 | <OtherParts /> | 163 | <OtherParts /> |
@@ -333,7 +346,20 @@ namespace OpenSim.Region.CoreModules.World.Serialiser.Tests | |||
333 | <EveryoneMask>0</EveryoneMask> | 346 | <EveryoneMask>0</EveryoneMask> |
334 | <NextOwnerMask>2147483647</NextOwnerMask> | 347 | <NextOwnerMask>2147483647</NextOwnerMask> |
335 | <Flags>None</Flags> | 348 | <Flags>None</Flags> |
336 | <DynAttrs><llsd><map><key>MyStore</key><map><key>last words</key><string>Rosebud</string></map></map></llsd></DynAttrs> | 349 | <DynAttrs> |
350 | <llsd> | ||
351 | <map> | ||
352 | <key>MyNamespace</key> | ||
353 | <map> | ||
354 | <key>MyStore</key> | ||
355 | <map> | ||
356 | <key>last words</key> | ||
357 | <string>Rosebud</string> | ||
358 | </map> | ||
359 | </map> | ||
360 | </map> | ||
361 | </llsd> | ||
362 | </DynAttrs> | ||
337 | <SitTargetAvatar><UUID>00000000-0000-0000-0000-000000000000</UUID></SitTargetAvatar> | 363 | <SitTargetAvatar><UUID>00000000-0000-0000-0000-000000000000</UUID></SitTargetAvatar> |
338 | </SceneObjectPart> | 364 | </SceneObjectPart> |
339 | <OtherParts /> | 365 | <OtherParts /> |
@@ -362,7 +388,7 @@ namespace OpenSim.Region.CoreModules.World.Serialiser.Tests | |||
362 | Assert.That(rootPart.UUID, Is.EqualTo(new UUID("e6a5a05e-e8cc-4816-8701-04165e335790"))); | 388 | Assert.That(rootPart.UUID, Is.EqualTo(new UUID("e6a5a05e-e8cc-4816-8701-04165e335790"))); |
363 | Assert.That(rootPart.CreatorID, Is.EqualTo(new UUID("a6dacf01-4636-4bb9-8a97-30609438af9d"))); | 389 | Assert.That(rootPart.CreatorID, Is.EqualTo(new UUID("a6dacf01-4636-4bb9-8a97-30609438af9d"))); |
364 | Assert.That(rootPart.Name, Is.EqualTo("PrimMyRide")); | 390 | Assert.That(rootPart.Name, Is.EqualTo("PrimMyRide")); |
365 | OSDMap store = rootPart.DynAttrs["MyStore"]; | 391 | OSDMap store = rootPart.DynAttrs.GetStore("MyNamespace", "MyStore"); |
366 | Assert.AreEqual(42, store["the answer"].AsInteger()); | 392 | Assert.AreEqual(42, store["the answer"].AsInteger()); |
367 | 393 | ||
368 | // TODO: Check other properties | 394 | // TODO: Check other properties |
@@ -414,13 +440,14 @@ namespace OpenSim.Region.CoreModules.World.Serialiser.Tests | |||
414 | rp.CreatorID = rpCreatorId; | 440 | rp.CreatorID = rpCreatorId; |
415 | rp.Shape = shape; | 441 | rp.Shape = shape; |
416 | 442 | ||
443 | string daNamespace = "MyNamespace"; | ||
417 | string daStoreName = "MyStore"; | 444 | string daStoreName = "MyStore"; |
418 | string daKey = "foo"; | 445 | string daKey = "foo"; |
419 | string daValue = "bar"; | 446 | string daValue = "bar"; |
420 | OSDMap myStore = new OSDMap(); | 447 | OSDMap myStore = new OSDMap(); |
421 | myStore.Add(daKey, daValue); | 448 | myStore.Add(daKey, daValue); |
422 | rp.DynAttrs = new DAMap(); | 449 | rp.DynAttrs = new DAMap(); |
423 | rp.DynAttrs[daStoreName] = myStore; | 450 | rp.DynAttrs.SetStore(daNamespace, daStoreName, myStore); |
424 | 451 | ||
425 | SceneObjectGroup so = new SceneObjectGroup(rp); | 452 | SceneObjectGroup so = new SceneObjectGroup(rp); |
426 | 453 | ||
@@ -481,7 +508,7 @@ namespace OpenSim.Region.CoreModules.World.Serialiser.Tests | |||
481 | Assert.That(name, Is.EqualTo(rpName)); | 508 | Assert.That(name, Is.EqualTo(rpName)); |
482 | Assert.That(creatorId, Is.EqualTo(rpCreatorId)); | 509 | Assert.That(creatorId, Is.EqualTo(rpCreatorId)); |
483 | Assert.NotNull(daMap); | 510 | Assert.NotNull(daMap); |
484 | Assert.AreEqual(daValue, daMap[daStoreName][daKey].AsString()); | 511 | Assert.AreEqual(daValue, daMap.GetStore(daNamespace, daStoreName)[daKey].AsString()); |
485 | } | 512 | } |
486 | 513 | ||
487 | [Test] | 514 | [Test] |
@@ -496,7 +523,7 @@ namespace OpenSim.Region.CoreModules.World.Serialiser.Tests | |||
496 | Assert.That(rootPart.UUID, Is.EqualTo(new UUID("9be68fdd-f740-4a0f-9675-dfbbb536b946"))); | 523 | Assert.That(rootPart.UUID, Is.EqualTo(new UUID("9be68fdd-f740-4a0f-9675-dfbbb536b946"))); |
497 | Assert.That(rootPart.CreatorID, Is.EqualTo(new UUID("b46ef588-411e-4a8b-a284-d7dcfe8e74ef"))); | 524 | Assert.That(rootPart.CreatorID, Is.EqualTo(new UUID("b46ef588-411e-4a8b-a284-d7dcfe8e74ef"))); |
498 | Assert.That(rootPart.Name, Is.EqualTo("PrimFun")); | 525 | Assert.That(rootPart.Name, Is.EqualTo("PrimFun")); |
499 | OSDMap store = rootPart.DynAttrs["MyStore"]; | 526 | OSDMap store = rootPart.DynAttrs.GetStore("MyNamespace", "MyStore"); |
500 | Assert.AreEqual("Rosebud", store["last words"].AsString()); | 527 | Assert.AreEqual("Rosebud", store["last words"].AsString()); |
501 | 528 | ||
502 | // TODO: Check other properties | 529 | // TODO: Check other properties |
@@ -522,13 +549,14 @@ namespace OpenSim.Region.CoreModules.World.Serialiser.Tests | |||
522 | rp.CreatorID = rpCreatorId; | 549 | rp.CreatorID = rpCreatorId; |
523 | rp.Shape = shape; | 550 | rp.Shape = shape; |
524 | 551 | ||
552 | string daNamespace = "MyNamespace"; | ||
525 | string daStoreName = "MyStore"; | 553 | string daStoreName = "MyStore"; |
526 | string daKey = "foo"; | 554 | string daKey = "foo"; |
527 | string daValue = "bar"; | 555 | string daValue = "bar"; |
528 | OSDMap myStore = new OSDMap(); | 556 | OSDMap myStore = new OSDMap(); |
529 | myStore.Add(daKey, daValue); | 557 | myStore.Add(daKey, daValue); |
530 | rp.DynAttrs = new DAMap(); | 558 | rp.DynAttrs = new DAMap(); |
531 | rp.DynAttrs[daStoreName] = myStore; | 559 | rp.DynAttrs.SetStore(daNamespace, daStoreName, myStore); |
532 | 560 | ||
533 | SceneObjectGroup so = new SceneObjectGroup(rp); | 561 | SceneObjectGroup so = new SceneObjectGroup(rp); |
534 | 562 | ||
@@ -585,7 +613,7 @@ namespace OpenSim.Region.CoreModules.World.Serialiser.Tests | |||
585 | Assert.That(name, Is.EqualTo(rpName)); | 613 | Assert.That(name, Is.EqualTo(rpName)); |
586 | Assert.That(creatorId, Is.EqualTo(rpCreatorId)); | 614 | Assert.That(creatorId, Is.EqualTo(rpCreatorId)); |
587 | Assert.NotNull(daMap); | 615 | Assert.NotNull(daMap); |
588 | Assert.AreEqual(daValue, daMap[daStoreName][daKey].AsString()); | 616 | Assert.AreEqual(daValue, daMap.GetStore(daNamespace, daStoreName)[daKey].AsString()); |
589 | } | 617 | } |
590 | } | 618 | } |
591 | } \ No newline at end of file | 619 | } \ No newline at end of file |
diff --git a/OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs b/OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs index 3882b45..945745e 100644 --- a/OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs +++ b/OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs | |||
@@ -1290,7 +1290,7 @@ namespace OpenSim.Region.Framework.Scenes.Serialization | |||
1290 | if (sop.MediaUrl != null) | 1290 | if (sop.MediaUrl != null) |
1291 | writer.WriteElementString("MediaUrl", sop.MediaUrl.ToString()); | 1291 | writer.WriteElementString("MediaUrl", sop.MediaUrl.ToString()); |
1292 | 1292 | ||
1293 | if (sop.DynAttrs.Count > 0) | 1293 | if (sop.DynAttrs.CountNamespaces > 0) |
1294 | { | 1294 | { |
1295 | writer.WriteStartElement("DynAttrs"); | 1295 | writer.WriteStartElement("DynAttrs"); |
1296 | sop.DynAttrs.WriteXml(writer); | 1296 | sop.DynAttrs.WriteXml(writer); |
diff --git a/OpenSim/Region/Framework/Scenes/UuidGatherer.cs b/OpenSim/Region/Framework/Scenes/UuidGatherer.cs index 0e83781..586b59d 100644 --- a/OpenSim/Region/Framework/Scenes/UuidGatherer.cs +++ b/OpenSim/Region/Framework/Scenes/UuidGatherer.cs | |||
@@ -212,7 +212,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
212 | // } | 212 | // } |
213 | // } | 213 | // } |
214 | 214 | ||
215 | |||
216 | /// <summary> | 215 | /// <summary> |
217 | /// Gather all of the texture asset UUIDs used to reference "Materials" such as normal and specular maps | 216 | /// Gather all of the texture asset UUIDs used to reference "Materials" such as normal and specular maps |
218 | /// </summary> | 217 | /// </summary> |
@@ -221,20 +220,23 @@ namespace OpenSim.Region.Framework.Scenes | |||
221 | public void GatherMaterialsUuids(SceneObjectPart part, IDictionary<UUID, AssetType> assetUuids) | 220 | public void GatherMaterialsUuids(SceneObjectPart part, IDictionary<UUID, AssetType> assetUuids) |
222 | { | 221 | { |
223 | // scan thru the dynAttrs map of this part for any textures used as materials | 222 | // scan thru the dynAttrs map of this part for any textures used as materials |
224 | OSDMap OSMaterials = null; | 223 | OSD osdMaterials = null; |
225 | 224 | ||
226 | lock (part.DynAttrs) | 225 | lock (part.DynAttrs) |
227 | { | 226 | { |
228 | if (part.DynAttrs.ContainsKey("OS:Materials")) | 227 | if (part.DynAttrs.ContainsStore("OpenSim", "Materials")) |
229 | OSMaterials = part.DynAttrs["OS:Materials"]; | 228 | { |
230 | if (OSMaterials != null && OSMaterials.ContainsKey("Materials")) | 229 | OSDMap materialsStore = part.DynAttrs.GetStore("OpenSim", "Materials"); |
230 | materialsStore.TryGetValue("Materials", out osdMaterials); | ||
231 | } | ||
232 | |||
233 | if (osdMaterials != null) | ||
231 | { | 234 | { |
232 | OSD osd = OSMaterials["Materials"]; | ||
233 | //m_log.Info("[UUID Gatherer]: found Materials: " + OSDParser.SerializeJsonString(osd)); | 235 | //m_log.Info("[UUID Gatherer]: found Materials: " + OSDParser.SerializeJsonString(osd)); |
234 | 236 | ||
235 | if (osd is OSDArray) | 237 | if (osdMaterials is OSDArray) |
236 | { | 238 | { |
237 | OSDArray matsArr = osd as OSDArray; | 239 | OSDArray matsArr = osdMaterials as OSDArray; |
238 | foreach (OSDMap matMap in matsArr) | 240 | foreach (OSDMap matMap in matsArr) |
239 | { | 241 | { |
240 | try | 242 | try |
diff --git a/OpenSim/Region/OptionalModules/Materials/MaterialsDemoModule.cs b/OpenSim/Region/OptionalModules/Materials/MaterialsDemoModule.cs index 4ab6609..5b15a73 100644 --- a/OpenSim/Region/OptionalModules/Materials/MaterialsDemoModule.cs +++ b/OpenSim/Region/OptionalModules/Materials/MaterialsDemoModule.cs | |||
@@ -178,7 +178,7 @@ namespace OpenSim.Region.OptionalModules.MaterialsDemoModule | |||
178 | 178 | ||
179 | void GetStoredMaterialsForPart(SceneObjectPart part) | 179 | void GetStoredMaterialsForPart(SceneObjectPart part) |
180 | { | 180 | { |
181 | OSDMap OSMaterials = null; | 181 | OSD OSMaterials = null; |
182 | OSDArray matsArr = null; | 182 | OSDArray matsArr = null; |
183 | 183 | ||
184 | if (part.DynAttrs == null) | 184 | if (part.DynAttrs == null) |
@@ -188,23 +188,20 @@ namespace OpenSim.Region.OptionalModules.MaterialsDemoModule | |||
188 | 188 | ||
189 | lock (part.DynAttrs) | 189 | lock (part.DynAttrs) |
190 | { | 190 | { |
191 | if (part.DynAttrs.ContainsKey("OS:Materials")) | 191 | if (part.DynAttrs.ContainsStore("OpenSim", "Materials")) |
192 | OSMaterials = part.DynAttrs["OS:Materials"]; | ||
193 | if (OSMaterials != null && OSMaterials.ContainsKey("Materials")) | ||
194 | { | 192 | { |
195 | 193 | OSDMap materialsStore = part.DynAttrs.GetStore("OpenSim", "Materials"); | |
196 | OSD osd = OSMaterials["Materials"]; | 194 | materialsStore.TryGetValue("Materials", out OSMaterials); |
197 | if (osd is OSDArray) | ||
198 | matsArr = osd as OSDArray; | ||
199 | } | 195 | } |
200 | } | ||
201 | 196 | ||
202 | if (OSMaterials == null) | 197 | if (OSMaterials != null && OSMaterials is OSDArray) |
203 | return; | 198 | matsArr = OSMaterials as OSDArray; |
199 | else | ||
200 | return; | ||
201 | } | ||
204 | 202 | ||
205 | m_log.Info("[MaterialsDemoModule]: OSMaterials: " + OSDParser.SerializeJsonString(OSMaterials)); | 203 | m_log.Info("[MaterialsDemoModule]: OSMaterials: " + OSDParser.SerializeJsonString(OSMaterials)); |
206 | 204 | ||
207 | |||
208 | if (matsArr == null) | 205 | if (matsArr == null) |
209 | { | 206 | { |
210 | m_log.Info("[MaterialsDemoModule]: matsArr is null :( "); | 207 | m_log.Info("[MaterialsDemoModule]: matsArr is null :( "); |
@@ -215,7 +212,6 @@ namespace OpenSim.Region.OptionalModules.MaterialsDemoModule | |||
215 | { | 212 | { |
216 | if (elemOsd != null && elemOsd is OSDMap) | 213 | if (elemOsd != null && elemOsd is OSDMap) |
217 | { | 214 | { |
218 | |||
219 | OSDMap matMap = elemOsd as OSDMap; | 215 | OSDMap matMap = elemOsd as OSDMap; |
220 | if (matMap.ContainsKey("ID") && matMap.ContainsKey("Material")) | 216 | if (matMap.ContainsKey("ID") && matMap.ContainsKey("Material")) |
221 | { | 217 | { |
@@ -232,7 +228,6 @@ namespace OpenSim.Region.OptionalModules.MaterialsDemoModule | |||
232 | } | 228 | } |
233 | } | 229 | } |
234 | 230 | ||
235 | |||
236 | void StoreMaterialsForPart(SceneObjectPart part) | 231 | void StoreMaterialsForPart(SceneObjectPart part) |
237 | { | 232 | { |
238 | try | 233 | try |
@@ -277,7 +272,7 @@ namespace OpenSim.Region.OptionalModules.MaterialsDemoModule | |||
277 | OSMaterials["Materials"] = matsArr; | 272 | OSMaterials["Materials"] = matsArr; |
278 | 273 | ||
279 | lock (part.DynAttrs) | 274 | lock (part.DynAttrs) |
280 | part.DynAttrs["OS:Materials"] = OSMaterials; | 275 | part.DynAttrs.SetStore("OpenSim", "Materials", OSMaterials); |
281 | } | 276 | } |
282 | catch (Exception e) | 277 | catch (Exception e) |
283 | { | 278 | { |
@@ -285,7 +280,6 @@ namespace OpenSim.Region.OptionalModules.MaterialsDemoModule | |||
285 | } | 280 | } |
286 | } | 281 | } |
287 | 282 | ||
288 | |||
289 | public string RenderMaterialsPostCap(string request, string path, | 283 | public string RenderMaterialsPostCap(string request, string path, |
290 | string param, IOSHttpRequest httpRequest, | 284 | string param, IOSHttpRequest httpRequest, |
291 | IOSHttpResponse httpResponse) | 285 | IOSHttpResponse httpResponse) |