aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/CoreModules/World/Archiver/ArchiveWriteRequest.cs
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--OpenSim/Region/CoreModules/World/Archiver/ArchiveWriteRequest.cs84
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;
36using log4net; 36using log4net;
37using OpenMetaverse; 37using OpenMetaverse;
38using OpenSim.Framework; 38using OpenSim.Framework;
39using OpenSim.Framework.Monitoring;
39using OpenSim.Framework.Serialization; 40using OpenSim.Framework.Serialization;
40using OpenSim.Region.CoreModules.World.Terrain; 41using OpenSim.Region.CoreModules.World.Terrain;
41using OpenSim.Region.Framework.Interfaces; 42using OpenSim.Region.Framework.Interfaces;
@@ -43,7 +44,9 @@ using OpenSim.Region.Framework.Scenes;
43using Ionic.Zlib; 44using Ionic.Zlib;
44using GZipStream = Ionic.Zlib.GZipStream; 45using GZipStream = Ionic.Zlib.GZipStream;
45using CompressionMode = Ionic.Zlib.CompressionMode; 46using CompressionMode = Ionic.Zlib.CompressionMode;
47using CompressionLevel = Ionic.Zlib.CompressionLevel;
46using OpenSim.Framework.Serialization.External; 48using OpenSim.Framework.Serialization.External;
49using PermissionMask = OpenSim.Framework.PermissionMask;
47 50
48namespace OpenSim.Region.CoreModules.World.Archiver 51namespace 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}