aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--OpenSim/Region/Environment/Modules/World/Archiver/ArchiveWriteRequestExecution.cs73
-rw-r--r--OpenSim/Region/Environment/Modules/World/Archiver/ArchiveWriteRequestPreparation.cs (renamed from OpenSim/Region/Environment/Modules/World/Archiver/ArchiveWriteRequest.cs)46
-rw-r--r--OpenSim/Region/Environment/Modules/World/Archiver/ArchiverModule.cs2
-rw-r--r--OpenSim/Region/Environment/Modules/World/Archiver/AssetsRequest.cs15
4 files changed, 96 insertions, 40 deletions
diff --git a/OpenSim/Region/Environment/Modules/World/Archiver/ArchiveWriteRequestExecution.cs b/OpenSim/Region/Environment/Modules/World/Archiver/ArchiveWriteRequestExecution.cs
new file mode 100644
index 0000000..4164cea
--- /dev/null
+++ b/OpenSim/Region/Environment/Modules/World/Archiver/ArchiveWriteRequestExecution.cs
@@ -0,0 +1,73 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSim Project nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28using System.Collections.Generic;
29using System.Reflection;
30using libsecondlife;
31using log4net;
32using OpenSim.Framework;
33
34namespace OpenSim.Region.Environment.Modules.World.Archiver
35{
36 /// <summary>
37 /// Method called when all the necessary assets for an archive request have been received.
38 /// </summary>
39 public delegate void AssetsRequestCallback(IDictionary<LLUUID, AssetBase> assets);
40
41 /// <summary>
42 /// Execute the write of an archive once we have received all the necessary data
43 /// </summary>
44 public class ArchiveWriteRequestExecution
45 {
46 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
47
48 protected string m_savePath;
49 protected string m_serializedEntities;
50
51 public ArchiveWriteRequestExecution(string serializedEntities, string savePath)
52 {
53 m_serializedEntities = serializedEntities;
54 m_savePath = savePath;
55 }
56
57 protected internal void ReceivedAllAssets(IDictionary<LLUUID, AssetBase> assets)
58 {
59 m_log.DebugFormat("[ARCHIVER]: Received all {0} assets required", assets.Count);
60
61 TarArchiveWriter archive = new TarArchiveWriter();
62
63 archive.AddFile(ArchiveConstants.PRIMS_PATH, m_serializedEntities);
64
65 AssetsArchiver assetsArchiver = new AssetsArchiver(assets);
66 assetsArchiver.Archive(archive);
67
68 archive.WriteTar(m_savePath);
69
70 m_log.InfoFormat("[ARCHIVER]: Wrote out OpenSimulator archive {0}", m_savePath);
71 }
72 }
73}
diff --git a/OpenSim/Region/Environment/Modules/World/Archiver/ArchiveWriteRequest.cs b/OpenSim/Region/Environment/Modules/World/Archiver/ArchiveWriteRequestPreparation.cs
index 1d7042c..a93e58d 100644
--- a/OpenSim/Region/Environment/Modules/World/Archiver/ArchiveWriteRequest.cs
+++ b/OpenSim/Region/Environment/Modules/World/Archiver/ArchiveWriteRequestPreparation.cs
@@ -40,31 +40,22 @@ using Nini.Config;
40namespace OpenSim.Region.Environment.Modules.World.Archiver 40namespace OpenSim.Region.Environment.Modules.World.Archiver
41{ 41{
42 /// <summary> 42 /// <summary>
43 /// Method called when all the necessary assets for an archive request have been received. 43 /// Prepare to write out an archive.
44 /// </summary> 44 /// </summary>
45 public delegate void AssetsRequestCallback(IDictionary<LLUUID, AssetBase> assets); 45 public class ArchiveWriteRequestPreparation
46
47 /// <summary>
48 /// Handles an individual archive write request
49 /// </summary>
50 public class ArchiveWriteRequest
51 { 46 {
52 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 47 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
53 48
54 private Scene m_scene; 49 protected Scene m_scene;
55 private string m_savePath; 50 protected string m_savePath;
56
57 private string m_serializedEntities;
58 51
59 public ArchiveWriteRequest(Scene scene, string savePath) 52 public ArchiveWriteRequestPreparation(Scene scene, string savePath)
60 { 53 {
61 m_scene = scene; 54 m_scene = scene;
62 m_savePath = savePath; 55 m_savePath = savePath;
63
64 ArchiveRegion();
65 } 56 }
66 57
67 protected void ArchiveRegion() 58 public void ArchiveRegion()
68 { 59 {
69 Dictionary<LLUUID, int> assetUuids = new Dictionary<LLUUID, int>(); 60 Dictionary<LLUUID, int> assetUuids = new Dictionary<LLUUID, int>();
70 61
@@ -108,36 +99,19 @@ namespace OpenSim.Region.Environment.Modules.World.Archiver
108 } 99 }
109 } 100 }
110 101
111 m_serializedEntities = SerializeObjects(entities); 102 string serializedEntities = SerializeObjects(entities);
112 103
113 if (m_serializedEntities != null && m_serializedEntities.Length > 0) 104 if (serializedEntities != null && serializedEntities.Length > 0)
114 { 105 {
115 m_log.DebugFormat("[ARCHIVER]: Successfully got serialization for {0} entities", entities.Count); 106 m_log.DebugFormat("[ARCHIVER]: Successfully got serialization for {0} entities", entities.Count);
116 m_log.DebugFormat("[ARCHIVER]: Requiring save of {0} textures", assetUuids.Count); 107 m_log.DebugFormat("[ARCHIVER]: Requiring save of {0} textures", assetUuids.Count);
117 108
118 // Asynchronously request all the assets required to perform this archive operation 109 // Asynchronously request all the assets required to perform this archive operation
119 new AssetsRequest(ReceivedAllAssets, m_scene.AssetCache, assetUuids.Keys); 110 ArchiveWriteRequestExecution awre = new ArchiveWriteRequestExecution(serializedEntities, m_savePath);
111 new AssetsRequest(assetUuids.Keys, m_scene.AssetCache, awre.ReceivedAllAssets).Execute();
120 } 112 }
121 } 113 }
122 114
123 protected internal void ReceivedAllAssets(IDictionary<LLUUID, AssetBase> assets)
124 {
125 m_log.DebugFormat("[ARCHIVER]: Received all {0} textures required", assets.Count);
126
127 // XXX: Shouldn't hijack the asset async callback thread like this - this is only temporary
128
129 TarArchiveWriter archive = new TarArchiveWriter();
130
131 archive.AddFile(ArchiveConstants.PRIMS_PATH, m_serializedEntities);
132
133 AssetsArchiver assetsArchiver = new AssetsArchiver(assets);
134 assetsArchiver.Archive(archive);
135
136 archive.WriteTar(m_savePath);
137
138 m_log.InfoFormat("[ARCHIVER]: Wrote out OpenSimulator archive {0}", m_savePath);
139 }
140
141 /// <summary> 115 /// <summary>
142 /// Get an xml representation of the given scene objects. 116 /// Get an xml representation of the given scene objects.
143 /// </summary> 117 /// </summary>
diff --git a/OpenSim/Region/Environment/Modules/World/Archiver/ArchiverModule.cs b/OpenSim/Region/Environment/Modules/World/Archiver/ArchiverModule.cs
index 0e3123e..ae3d333 100644
--- a/OpenSim/Region/Environment/Modules/World/Archiver/ArchiverModule.cs
+++ b/OpenSim/Region/Environment/Modules/World/Archiver/ArchiverModule.cs
@@ -72,7 +72,7 @@ namespace OpenSim.Region.Environment.Modules.World.Archiver
72 72
73 public void ArchiveRegion(string savePath) 73 public void ArchiveRegion(string savePath)
74 { 74 {
75 new ArchiveWriteRequest(m_scene, savePath); 75 new ArchiveWriteRequestPreparation(m_scene, savePath).ArchiveRegion();
76 } 76 }
77 77
78 public void DearchiveRegion(string loadPath) 78 public void DearchiveRegion(string loadPath)
diff --git a/OpenSim/Region/Environment/Modules/World/Archiver/AssetsRequest.cs b/OpenSim/Region/Environment/Modules/World/Archiver/AssetsRequest.cs
index 2021b70..f41be49 100644
--- a/OpenSim/Region/Environment/Modules/World/Archiver/AssetsRequest.cs
+++ b/OpenSim/Region/Environment/Modules/World/Archiver/AssetsRequest.cs
@@ -41,6 +41,11 @@ namespace OpenSim.Region.Environment.Modules.World.Archiver
41 class AssetsRequest 41 class AssetsRequest
42 { 42 {
43 /// <summary> 43 /// <summary>
44 /// uuids to request
45 /// </summary>
46 protected ICollection<LLUUID> m_uuids;
47
48 /// <summary>
44 /// Callback used when all the assets requested have been received. 49 /// Callback used when all the assets requested have been received.
45 /// </summary> 50 /// </summary>
46 protected AssetsRequestCallback m_assetsRequestCallback; 51 protected AssetsRequestCallback m_assetsRequestCallback;
@@ -60,17 +65,21 @@ namespace OpenSim.Region.Environment.Modules.World.Archiver
60 /// </summary> 65 /// </summary>
61 protected AssetCache m_assetCache; 66 protected AssetCache m_assetCache;
62 67
63 protected internal AssetsRequest(AssetsRequestCallback assetsRequestCallback, AssetCache assetCache, ICollection<LLUUID> uuids) 68 protected internal AssetsRequest(ICollection<LLUUID> uuids, AssetCache assetCache, AssetsRequestCallback assetsRequestCallback)
64 { 69 {
70 m_uuids = uuids;
65 m_assetsRequestCallback = assetsRequestCallback; 71 m_assetsRequestCallback = assetsRequestCallback;
66 m_assetCache = assetCache; 72 m_assetCache = assetCache;
67 m_repliesRequired = uuids.Count; 73 m_repliesRequired = uuids.Count;
68 74 }
75
76 protected internal void Execute()
77 {
69 // We can stop here if there are no assets to fetch 78 // We can stop here if there are no assets to fetch
70 if (m_repliesRequired == 0) 79 if (m_repliesRequired == 0)
71 m_assetsRequestCallback(m_assets); 80 m_assetsRequestCallback(m_assets);
72 81
73 foreach (LLUUID uuid in uuids) 82 foreach (LLUUID uuid in m_uuids)
74 { 83 {
75 m_assetCache.GetAsset(uuid, AssetRequestCallback, true); 84 m_assetCache.GetAsset(uuid, AssetRequestCallback, true);
76 } 85 }