diff options
Diffstat (limited to '')
-rw-r--r-- | OpenSim/Region/CoreModules/World/Archiver/ArchiveWriteRequest.cs | 84 |
1 files changed, 49 insertions, 35 deletions
diff --git a/OpenSim/Region/CoreModules/World/Archiver/ArchiveWriteRequest.cs b/OpenSim/Region/CoreModules/World/Archiver/ArchiveWriteRequest.cs index 7bdd65c..cb2c7f1 100644 --- a/OpenSim/Region/CoreModules/World/Archiver/ArchiveWriteRequest.cs +++ b/OpenSim/Region/CoreModules/World/Archiver/ArchiveWriteRequest.cs | |||
@@ -36,6 +36,7 @@ using System.Xml; | |||
36 | using log4net; | 36 | using log4net; |
37 | using OpenMetaverse; | 37 | using OpenMetaverse; |
38 | using OpenSim.Framework; | 38 | using OpenSim.Framework; |
39 | using OpenSim.Framework.Monitoring; | ||
39 | using OpenSim.Framework.Serialization; | 40 | using OpenSim.Framework.Serialization; |
40 | using OpenSim.Region.CoreModules.World.Terrain; | 41 | using OpenSim.Region.CoreModules.World.Terrain; |
41 | using OpenSim.Region.Framework.Interfaces; | 42 | using OpenSim.Region.Framework.Interfaces; |
@@ -43,7 +44,9 @@ using OpenSim.Region.Framework.Scenes; | |||
43 | using Ionic.Zlib; | 44 | using Ionic.Zlib; |
44 | using GZipStream = Ionic.Zlib.GZipStream; | 45 | using GZipStream = Ionic.Zlib.GZipStream; |
45 | using CompressionMode = Ionic.Zlib.CompressionMode; | 46 | using CompressionMode = Ionic.Zlib.CompressionMode; |
47 | using CompressionLevel = Ionic.Zlib.CompressionLevel; | ||
46 | using OpenSim.Framework.Serialization.External; | 48 | using OpenSim.Framework.Serialization.External; |
49 | using PermissionMask = OpenSim.Framework.PermissionMask; | ||
47 | 50 | ||
48 | namespace OpenSim.Region.CoreModules.World.Archiver | 51 | namespace OpenSim.Region.CoreModules.World.Archiver |
49 | { | 52 | { |
@@ -78,7 +81,7 @@ namespace OpenSim.Region.CoreModules.World.Archiver | |||
78 | /// Determines which objects will be included in the archive, according to their permissions. | 81 | /// Determines which objects will be included in the archive, according to their permissions. |
79 | /// Default is null, meaning no permission checks. | 82 | /// Default is null, meaning no permission checks. |
80 | /// </summary> | 83 | /// </summary> |
81 | public string CheckPermissions { get; set; } | 84 | public string FilterContent { get; set; } |
82 | 85 | ||
83 | protected Scene m_rootScene; | 86 | protected Scene m_rootScene; |
84 | protected Stream m_saveStream; | 87 | protected Stream m_saveStream; |
@@ -129,7 +132,7 @@ namespace OpenSim.Region.CoreModules.World.Archiver | |||
129 | 132 | ||
130 | MultiRegionFormat = false; | 133 | MultiRegionFormat = false; |
131 | SaveAssets = true; | 134 | SaveAssets = true; |
132 | CheckPermissions = null; | 135 | FilterContent = null; |
133 | } | 136 | } |
134 | 137 | ||
135 | /// <summary> | 138 | /// <summary> |
@@ -148,7 +151,7 @@ namespace OpenSim.Region.CoreModules.World.Archiver | |||
148 | 151 | ||
149 | Object temp; | 152 | Object temp; |
150 | if (options.TryGetValue("checkPermissions", out temp)) | 153 | if (options.TryGetValue("checkPermissions", out temp)) |
151 | CheckPermissions = (string)temp; | 154 | FilterContent = (string)temp; |
152 | 155 | ||
153 | 156 | ||
154 | // Find the regions to archive | 157 | // Find the regions to archive |
@@ -177,7 +180,7 @@ namespace OpenSim.Region.CoreModules.World.Archiver | |||
177 | 180 | ||
178 | // Archive the regions | 181 | // Archive the regions |
179 | 182 | ||
180 | Dictionary<UUID, AssetType> assetUuids = new Dictionary<UUID, AssetType>(); | 183 | Dictionary<UUID, sbyte> assetUuids = new Dictionary<UUID, sbyte>(); |
181 | 184 | ||
182 | scenesGroup.ForEachScene(delegate(Scene scene) | 185 | scenesGroup.ForEachScene(delegate(Scene scene) |
183 | { | 186 | { |
@@ -198,7 +201,7 @@ namespace OpenSim.Region.CoreModules.World.Archiver | |||
198 | m_rootScene.AssetService, m_rootScene.UserAccountService, | 201 | m_rootScene.AssetService, m_rootScene.UserAccountService, |
199 | m_rootScene.RegionInfo.ScopeID, options, ReceivedAllAssets); | 202 | m_rootScene.RegionInfo.ScopeID, options, ReceivedAllAssets); |
200 | 203 | ||
201 | Util.FireAndForget(o => ar.Execute()); | 204 | WorkManager.RunInThread(o => ar.Execute(), null, "Archive Assets Request"); |
202 | 205 | ||
203 | // CloseArchive() will be called from ReceivedAllAssets() | 206 | // CloseArchive() will be called from ReceivedAllAssets() |
204 | } | 207 | } |
@@ -215,9 +218,9 @@ namespace OpenSim.Region.CoreModules.World.Archiver | |||
215 | } | 218 | } |
216 | } | 219 | } |
217 | 220 | ||
218 | private void ArchiveOneRegion(Scene scene, string regionDir, Dictionary<UUID, AssetType> assetUuids) | 221 | private void ArchiveOneRegion(Scene scene, string regionDir, Dictionary<UUID, sbyte> assetUuids) |
219 | { | 222 | { |
220 | m_log.InfoFormat("[ARCHIVER]: Writing region {0}", scene.RegionInfo.RegionName); | 223 | m_log.InfoFormat("[ARCHIVER]: Writing region {0}", scene.Name); |
221 | 224 | ||
222 | EntityBase[] entities = scene.GetEntities(); | 225 | EntityBase[] entities = scene.GetEntities(); |
223 | List<SceneObjectGroup> sceneObjects = new List<SceneObjectGroup>(); | 226 | List<SceneObjectGroup> sceneObjects = new List<SceneObjectGroup>(); |
@@ -236,7 +239,7 @@ namespace OpenSim.Region.CoreModules.World.Archiver | |||
236 | 239 | ||
237 | if (!sceneObject.IsDeleted && !sceneObject.IsAttachment) | 240 | if (!sceneObject.IsDeleted && !sceneObject.IsAttachment) |
238 | { | 241 | { |
239 | if (!CanUserArchiveObject(scene.RegionInfo.EstateSettings.EstateOwner, sceneObject, CheckPermissions, permissionsModule)) | 242 | if (!CanUserArchiveObject(scene.RegionInfo.EstateSettings.EstateOwner, sceneObject, FilterContent, permissionsModule)) |
240 | { | 243 | { |
241 | // The user isn't allowed to copy/transfer this object, so it will not be included in the OAR. | 244 | // The user isn't allowed to copy/transfer this object, so it will not be included in the OAR. |
242 | ++numObjectsSkippedPermissions; | 245 | ++numObjectsSkippedPermissions; |
@@ -251,13 +254,13 @@ namespace OpenSim.Region.CoreModules.World.Archiver | |||
251 | 254 | ||
252 | if (SaveAssets) | 255 | if (SaveAssets) |
253 | { | 256 | { |
254 | UuidGatherer assetGatherer = new UuidGatherer(scene.AssetService); | 257 | UuidGatherer assetGatherer = new UuidGatherer(scene.AssetService, assetUuids); |
255 | int prevAssets = assetUuids.Count; | 258 | int prevAssets = assetUuids.Count; |
256 | 259 | ||
257 | foreach (SceneObjectGroup sceneObject in sceneObjects) | 260 | foreach (SceneObjectGroup sceneObject in sceneObjects) |
258 | { | 261 | assetGatherer.AddForInspection(sceneObject); |
259 | assetGatherer.GatherAssetUuids(sceneObject, assetUuids); | 262 | |
260 | } | 263 | assetGatherer.GatherAll(); |
261 | 264 | ||
262 | m_log.DebugFormat( | 265 | m_log.DebugFormat( |
263 | "[ARCHIVER]: {0} scene objects to serialize requiring save of {1} assets", | 266 | "[ARCHIVER]: {0} scene objects to serialize requiring save of {1} assets", |
@@ -275,16 +278,16 @@ namespace OpenSim.Region.CoreModules.World.Archiver | |||
275 | RegionSettings regionSettings = scene.RegionInfo.RegionSettings; | 278 | RegionSettings regionSettings = scene.RegionInfo.RegionSettings; |
276 | 279 | ||
277 | if (regionSettings.TerrainTexture1 != RegionSettings.DEFAULT_TERRAIN_TEXTURE_1) | 280 | if (regionSettings.TerrainTexture1 != RegionSettings.DEFAULT_TERRAIN_TEXTURE_1) |
278 | assetUuids[regionSettings.TerrainTexture1] = AssetType.Texture; | 281 | assetUuids[regionSettings.TerrainTexture1] = (sbyte)AssetType.Texture; |
279 | 282 | ||
280 | if (regionSettings.TerrainTexture2 != RegionSettings.DEFAULT_TERRAIN_TEXTURE_2) | 283 | if (regionSettings.TerrainTexture2 != RegionSettings.DEFAULT_TERRAIN_TEXTURE_2) |
281 | assetUuids[regionSettings.TerrainTexture2] = AssetType.Texture; | 284 | assetUuids[regionSettings.TerrainTexture2] = (sbyte)AssetType.Texture; |
282 | 285 | ||
283 | if (regionSettings.TerrainTexture3 != RegionSettings.DEFAULT_TERRAIN_TEXTURE_3) | 286 | if (regionSettings.TerrainTexture3 != RegionSettings.DEFAULT_TERRAIN_TEXTURE_3) |
284 | assetUuids[regionSettings.TerrainTexture3] = AssetType.Texture; | 287 | assetUuids[regionSettings.TerrainTexture3] = (sbyte)AssetType.Texture; |
285 | 288 | ||
286 | if (regionSettings.TerrainTexture4 != RegionSettings.DEFAULT_TERRAIN_TEXTURE_4) | 289 | if (regionSettings.TerrainTexture4 != RegionSettings.DEFAULT_TERRAIN_TEXTURE_4) |
287 | assetUuids[regionSettings.TerrainTexture4] = AssetType.Texture; | 290 | assetUuids[regionSettings.TerrainTexture4] = (sbyte)AssetType.Texture; |
288 | 291 | ||
289 | Save(scene, sceneObjects, regionDir); | 292 | Save(scene, sceneObjects, regionDir); |
290 | } | 293 | } |
@@ -294,12 +297,12 @@ namespace OpenSim.Region.CoreModules.World.Archiver | |||
294 | /// </summary> | 297 | /// </summary> |
295 | /// <param name="user">The user</param> | 298 | /// <param name="user">The user</param> |
296 | /// <param name="objGroup">The object group</param> | 299 | /// <param name="objGroup">The object group</param> |
297 | /// <param name="checkPermissions">Which permissions to check: "C" = Copy, "T" = Transfer</param> | 300 | /// <param name="filterContent">Which permissions to check: "C" = Copy, "T" = Transfer</param> |
298 | /// <param name="permissionsModule">The scene's permissions module</param> | 301 | /// <param name="permissionsModule">The scene's permissions module</param> |
299 | /// <returns>Whether the user is allowed to export the object to an OAR</returns> | 302 | /// <returns>Whether the user is allowed to export the object to an OAR</returns> |
300 | private bool CanUserArchiveObject(UUID user, SceneObjectGroup objGroup, string checkPermissions, IPermissionsModule permissionsModule) | 303 | private bool CanUserArchiveObject(UUID user, SceneObjectGroup objGroup, string filterContent, IPermissionsModule permissionsModule) |
301 | { | 304 | { |
302 | if (checkPermissions == null) | 305 | if (filterContent == null) |
303 | return true; | 306 | return true; |
304 | 307 | ||
305 | if (permissionsModule == null) | 308 | if (permissionsModule == null) |
@@ -341,9 +344,9 @@ namespace OpenSim.Region.CoreModules.World.Archiver | |||
341 | canTransfer |= (obj.EveryoneMask & (uint)PermissionMask.Copy) != 0; | 344 | canTransfer |= (obj.EveryoneMask & (uint)PermissionMask.Copy) != 0; |
342 | 345 | ||
343 | bool partPermitted = true; | 346 | bool partPermitted = true; |
344 | if (checkPermissions.Contains("C") && !canCopy) | 347 | if (filterContent.Contains("C") && !canCopy) |
345 | partPermitted = false; | 348 | partPermitted = false; |
346 | if (checkPermissions.Contains("T") && !canTransfer) | 349 | if (filterContent.Contains("T") && !canTransfer) |
347 | partPermitted = false; | 350 | partPermitted = false; |
348 | 351 | ||
349 | // If the user is the Creator of the object then it can always be included in the OAR | 352 | // If the user is the Creator of the object then it can always be included in the OAR |
@@ -532,7 +535,7 @@ namespace OpenSim.Region.CoreModules.World.Archiver | |||
532 | if (isMegaregion) | 535 | if (isMegaregion) |
533 | size = rcMod.GetSizeOfMegaregion(scene.RegionInfo.RegionID); | 536 | size = rcMod.GetSizeOfMegaregion(scene.RegionInfo.RegionID); |
534 | else | 537 | else |
535 | size = new Vector2((float)Constants.RegionSize, (float)Constants.RegionSize); | 538 | size = new Vector2((float)scene.RegionInfo.RegionSizeX, (float)scene.RegionInfo.RegionSizeY); |
536 | 539 | ||
537 | xtw.WriteElementString("is_megaregion", isMegaregion.ToString()); | 540 | xtw.WriteElementString("is_megaregion", isMegaregion.ToString()); |
538 | xtw.WriteElementString("size_in_meters", string.Format("{0},{1}", size.X, size.Y)); | 541 | xtw.WriteElementString("size_in_meters", string.Format("{0},{1}", size.X, size.Y)); |
@@ -568,10 +571,11 @@ namespace OpenSim.Region.CoreModules.World.Archiver | |||
568 | string terrainPath = String.Format("{0}{1}{2}.r32", | 571 | string terrainPath = String.Format("{0}{1}{2}.r32", |
569 | regionDir, ArchiveConstants.TERRAINS_PATH, scene.RegionInfo.RegionName); | 572 | regionDir, ArchiveConstants.TERRAINS_PATH, scene.RegionInfo.RegionName); |
570 | 573 | ||
571 | MemoryStream ms = new MemoryStream(); | 574 | using (MemoryStream ms = new MemoryStream()) |
572 | scene.RequestModuleInterface<ITerrainModule>().SaveToStream(terrainPath, ms); | 575 | { |
573 | m_archiveWriter.WriteFile(terrainPath, ms.ToArray()); | 576 | scene.RequestModuleInterface<ITerrainModule>().SaveToStream(terrainPath, ms); |
574 | ms.Close(); | 577 | m_archiveWriter.WriteFile(terrainPath, ms.ToArray()); |
578 | } | ||
575 | 579 | ||
576 | m_log.InfoFormat("[ARCHIVER]: Adding scene objects to archive."); | 580 | m_log.InfoFormat("[ARCHIVER]: Adding scene objects to archive."); |
577 | 581 | ||
@@ -587,19 +591,29 @@ namespace OpenSim.Region.CoreModules.World.Archiver | |||
587 | } | 591 | } |
588 | } | 592 | } |
589 | 593 | ||
590 | protected void ReceivedAllAssets( | 594 | protected void ReceivedAllAssets(ICollection<UUID> assetsFoundUuids, ICollection<UUID> assetsNotFoundUuids, bool timedOut) |
591 | ICollection<UUID> assetsFoundUuids, ICollection<UUID> assetsNotFoundUuids) | ||
592 | { | 595 | { |
593 | foreach (UUID uuid in assetsNotFoundUuids) | 596 | string errorMessage; |
597 | |||
598 | if (timedOut) | ||
594 | { | 599 | { |
595 | m_log.DebugFormat("[ARCHIVER]: Could not find asset {0}", uuid); | 600 | errorMessage = "Loading assets timed out"; |
596 | } | 601 | } |
602 | else | ||
603 | { | ||
604 | foreach (UUID uuid in assetsNotFoundUuids) | ||
605 | { | ||
606 | m_log.DebugFormat("[ARCHIVER]: Could not find asset {0}", uuid); | ||
607 | } | ||
597 | 608 | ||
598 | // m_log.InfoFormat( | 609 | // m_log.InfoFormat( |
599 | // "[ARCHIVER]: Received {0} of {1} assets requested", | 610 | // "[ARCHIVER]: Received {0} of {1} assets requested", |
600 | // assetsFoundUuids.Count, assetsFoundUuids.Count + assetsNotFoundUuids.Count); | 611 | // assetsFoundUuids.Count, assetsFoundUuids.Count + assetsNotFoundUuids.Count); |
601 | 612 | ||
602 | CloseArchive(String.Empty); | 613 | errorMessage = String.Empty; |
614 | } | ||
615 | |||
616 | CloseArchive(errorMessage); | ||
603 | } | 617 | } |
604 | 618 | ||
605 | /// <summary> | 619 | /// <summary> |
@@ -626,4 +640,4 @@ namespace OpenSim.Region.CoreModules.World.Archiver | |||
626 | m_rootScene.EventManager.TriggerOarFileSaved(m_requestId, errorMessage); | 640 | m_rootScene.EventManager.TriggerOarFileSaved(m_requestId, errorMessage); |
627 | } | 641 | } |
628 | } | 642 | } |
629 | } \ No newline at end of file | 643 | } |