diff options
-rw-r--r-- | OpenSim/Framework/PrimitiveBaseShape.cs | 15 | ||||
-rw-r--r-- | OpenSim/Region/CoreModules/World/Media/Moap/MoapModule.cs | 76 |
2 files changed, 55 insertions, 36 deletions
diff --git a/OpenSim/Framework/PrimitiveBaseShape.cs b/OpenSim/Framework/PrimitiveBaseShape.cs index 9b52fe6..70a61cc 100644 --- a/OpenSim/Framework/PrimitiveBaseShape.cs +++ b/OpenSim/Framework/PrimitiveBaseShape.cs | |||
@@ -180,6 +180,7 @@ namespace OpenSim.Framework | |||
180 | /// Entries to store media textures on each face | 180 | /// Entries to store media textures on each face |
181 | /// </summary> | 181 | /// </summary> |
182 | /// Do not change this value directly - always do it through an IMoapModule. | 182 | /// Do not change this value directly - always do it through an IMoapModule. |
183 | /// Lock before manipulating. | ||
183 | public MediaList Media { get; set; } | 184 | public MediaList Media { get; set; } |
184 | 185 | ||
185 | public PrimitiveBaseShape() | 186 | public PrimitiveBaseShape() |
@@ -1219,6 +1220,11 @@ namespace OpenSim.Framework | |||
1219 | return prim; | 1220 | return prim; |
1220 | } | 1221 | } |
1221 | 1222 | ||
1223 | /// <summary> | ||
1224 | /// Encapsulates a list of media entries. | ||
1225 | /// </summary> | ||
1226 | /// This class is necessary because we want to replace auto-serialization of MediaEntry with something more | ||
1227 | /// OSD like and less vulnerable to change. | ||
1222 | public class MediaList : List<MediaEntry>, IXmlSerializable | 1228 | public class MediaList : List<MediaEntry>, IXmlSerializable |
1223 | { | 1229 | { |
1224 | public const string MEDIA_TEXTURE_TYPE = "sl"; | 1230 | public const string MEDIA_TEXTURE_TYPE = "sl"; |
@@ -1240,10 +1246,9 @@ namespace OpenSim.Framework | |||
1240 | { | 1246 | { |
1241 | using (XmlTextWriter xtw = new XmlTextWriter(sw)) | 1247 | using (XmlTextWriter xtw = new XmlTextWriter(sw)) |
1242 | { | 1248 | { |
1243 | xtw.WriteStartElement("osmedia"); | 1249 | xtw.WriteStartElement("OSMedia"); |
1244 | xtw.WriteAttributeString("type", MEDIA_TEXTURE_TYPE); | 1250 | xtw.WriteAttributeString("type", MEDIA_TEXTURE_TYPE); |
1245 | xtw.WriteAttributeString("major_version", "0"); | 1251 | xtw.WriteAttributeString("version", "0.1"); |
1246 | xtw.WriteAttributeString("minor_version", "1"); | ||
1247 | 1252 | ||
1248 | OSDArray meArray = new OSDArray(); | 1253 | OSDArray meArray = new OSDArray(); |
1249 | foreach (MediaEntry me in this) | 1254 | foreach (MediaEntry me in this) |
@@ -1252,7 +1257,7 @@ namespace OpenSim.Framework | |||
1252 | meArray.Add(osd); | 1257 | meArray.Add(osd); |
1253 | } | 1258 | } |
1254 | 1259 | ||
1255 | xtw.WriteStartElement("osdata"); | 1260 | xtw.WriteStartElement("OSData"); |
1256 | xtw.WriteRaw(OSDParser.SerializeLLSDXmlString(meArray)); | 1261 | xtw.WriteRaw(OSDParser.SerializeLLSDXmlString(meArray)); |
1257 | xtw.WriteEndElement(); | 1262 | xtw.WriteEndElement(); |
1258 | 1263 | ||
@@ -1291,7 +1296,7 @@ namespace OpenSim.Framework | |||
1291 | if (type != MEDIA_TEXTURE_TYPE) | 1296 | if (type != MEDIA_TEXTURE_TYPE) |
1292 | return; | 1297 | return; |
1293 | 1298 | ||
1294 | xtr.ReadStartElement("osmedia"); | 1299 | xtr.ReadStartElement("OSMedia"); |
1295 | 1300 | ||
1296 | OSDArray osdMeArray = (OSDArray)OSDParser.DeserializeLLSDXml(xtr.ReadInnerXml()); | 1301 | OSDArray osdMeArray = (OSDArray)OSDParser.DeserializeLLSDXml(xtr.ReadInnerXml()); |
1297 | foreach (OSD osdMe in osdMeArray) | 1302 | foreach (OSD osdMe in osdMeArray) |
diff --git a/OpenSim/Region/CoreModules/World/Media/Moap/MoapModule.cs b/OpenSim/Region/CoreModules/World/Media/Moap/MoapModule.cs index d7ce184..8549b36 100644 --- a/OpenSim/Region/CoreModules/World/Media/Moap/MoapModule.cs +++ b/OpenSim/Region/CoreModules/World/Media/Moap/MoapModule.cs | |||
@@ -185,13 +185,15 @@ namespace OpenSim.Region.CoreModules.Media.Moap | |||
185 | if (original.Shape.Media != null) | 185 | if (original.Shape.Media != null) |
186 | { | 186 | { |
187 | PrimitiveBaseShape.MediaList dupeMedia = new PrimitiveBaseShape.MediaList(); | 187 | PrimitiveBaseShape.MediaList dupeMedia = new PrimitiveBaseShape.MediaList(); |
188 | 188 | lock (original.Shape.Media) | |
189 | foreach (MediaEntry me in original.Shape.Media) | ||
190 | { | 189 | { |
191 | if (me != null) | 190 | foreach (MediaEntry me in original.Shape.Media) |
192 | dupeMedia.Add(MediaEntry.FromOSD(me.GetOSD())); | 191 | { |
193 | else | 192 | if (me != null) |
194 | dupeMedia.Add(null); | 193 | dupeMedia.Add(MediaEntry.FromOSD(me.GetOSD())); |
194 | else | ||
195 | dupeMedia.Add(null); | ||
196 | } | ||
195 | } | 197 | } |
196 | 198 | ||
197 | copy.Shape.Media = dupeMedia; | 199 | copy.Shape.Media = dupeMedia; |
@@ -211,8 +213,9 @@ namespace OpenSim.Region.CoreModules.Media.Moap | |||
211 | me = null; | 213 | me = null; |
212 | } | 214 | } |
213 | else | 215 | else |
214 | { | 216 | { |
215 | me = media[face]; | 217 | lock (media) |
218 | me = media[face]; | ||
216 | 219 | ||
217 | // TODO: Really need a proper copy constructor down in libopenmetaverse | 220 | // TODO: Really need a proper copy constructor down in libopenmetaverse |
218 | if (me != null) | 221 | if (me != null) |
@@ -230,11 +233,13 @@ namespace OpenSim.Region.CoreModules.Media.Moap | |||
230 | 233 | ||
231 | if (null == part.Shape.Media) | 234 | if (null == part.Shape.Media) |
232 | part.Shape.Media = new PrimitiveBaseShape.MediaList(new MediaEntry[part.GetNumberOfSides()]); | 235 | part.Shape.Media = new PrimitiveBaseShape.MediaList(new MediaEntry[part.GetNumberOfSides()]); |
233 | 236 | ||
234 | part.Shape.Media[face] = me; | 237 | lock (part.Shape.Media) |
238 | part.Shape.Media[face] = me; | ||
239 | |||
235 | UpdateMediaUrl(part, UUID.Zero); | 240 | UpdateMediaUrl(part, UUID.Zero); |
236 | part.ScheduleFullUpdate(); | 241 | part.ScheduleFullUpdate(); |
237 | part.TriggerScriptChangedEvent(Changed.MEDIA); | 242 | part.TriggerScriptChangedEvent(Changed.MEDIA); |
238 | } | 243 | } |
239 | 244 | ||
240 | public void ClearMediaEntry(SceneObjectPart part, int face) | 245 | public void ClearMediaEntry(SceneObjectPart part, int face) |
@@ -296,7 +301,10 @@ namespace OpenSim.Region.CoreModules.Media.Moap | |||
296 | ObjectMediaResponse resp = new ObjectMediaResponse(); | 301 | ObjectMediaResponse resp = new ObjectMediaResponse(); |
297 | 302 | ||
298 | resp.PrimID = primId; | 303 | resp.PrimID = primId; |
299 | resp.FaceMedia = part.Shape.Media.ToArray(); | 304 | |
305 | lock (part.Shape.Media) | ||
306 | resp.FaceMedia = part.Shape.Media.ToArray(); | ||
307 | |||
300 | resp.Version = part.MediaUrl; | 308 | resp.Version = part.MediaUrl; |
301 | 309 | ||
302 | string rawResp = OSDParser.SerializeLLSDXmlString(resp.Serialize()); | 310 | string rawResp = OSDParser.SerializeLLSDXmlString(resp.Serialize()); |
@@ -382,24 +390,27 @@ namespace OpenSim.Region.CoreModules.Media.Moap | |||
382 | // directly. | 390 | // directly. |
383 | Primitive.TextureEntry te = part.Shape.Textures; | 391 | Primitive.TextureEntry te = part.Shape.Textures; |
384 | 392 | ||
385 | for (int i = 0; i < media.Count; i++) | 393 | lock (media) |
386 | { | 394 | { |
387 | if (m_scene.Permissions.CanControlPrimMedia(agentId, part.UUID, i)) | 395 | for (int i = 0; i < media.Count; i++) |
388 | { | 396 | { |
389 | media[i] = omu.FaceMedia[i]; | 397 | if (m_scene.Permissions.CanControlPrimMedia(agentId, part.UUID, i)) |
390 | 398 | { | |
391 | // When a face is cleared this is done by setting the MediaFlags in the TextureEntry via a normal | 399 | media[i] = omu.FaceMedia[i]; |
392 | // texture update, so we don't need to worry about clearing MediaFlags here. | 400 | |
393 | if (null == media[i]) | 401 | // When a face is cleared this is done by setting the MediaFlags in the TextureEntry via a normal |
394 | continue; | 402 | // texture update, so we don't need to worry about clearing MediaFlags here. |
395 | 403 | if (null == media[i]) | |
396 | Primitive.TextureEntryFace face = te.CreateFace((uint)i); | 404 | continue; |
397 | face.MediaFlags = true; | 405 | |
398 | 406 | Primitive.TextureEntryFace face = te.CreateFace((uint)i); | |
399 | // m_log.DebugFormat( | 407 | face.MediaFlags = true; |
400 | // "[MOAP]: Media flags for face {0} is {1}", | 408 | |
401 | // i, face.MediaFlags); | 409 | // m_log.DebugFormat( |
402 | // m_log.DebugFormat("[MOAP]: Set media entry for face {0} on {1}", i, part.Name); | 410 | // "[MOAP]: Media flags for face {0} is {1}", |
411 | // i, face.MediaFlags); | ||
412 | // m_log.DebugFormat("[MOAP]: Set media entry for face {0} on {1}", i, part.Name); | ||
413 | } | ||
403 | } | 414 | } |
404 | } | 415 | } |
405 | 416 | ||
@@ -465,7 +476,10 @@ namespace OpenSim.Region.CoreModules.Media.Moap | |||
465 | if (null == part.Shape.Media) | 476 | if (null == part.Shape.Media) |
466 | return string.Empty; | 477 | return string.Empty; |
467 | 478 | ||
468 | MediaEntry me = part.Shape.Media[omn.Face]; | 479 | MediaEntry me = null; |
480 | |||
481 | lock (part.Shape.Media) | ||
482 | me = part.Shape.Media[omn.Face]; | ||
469 | 483 | ||
470 | // Do the same if media has not been set up for a specific face | 484 | // Do the same if media has not been set up for a specific face |
471 | if (null == me) | 485 | if (null == me) |