mirror of
https://github.com/opensim/opensim.git
synced 2026-08-06 17:32:42 +08:00
* Add direct stream loading and saving methods to the archive module.
* The async stream method does not yet signal completion to interested calling code
This commit is contained in:
@@ -52,7 +52,7 @@ namespace OpenSim.Region.Environment.Modules.World.Archiver
|
||||
private static System.Text.ASCIIEncoding m_asciiEncoding = new System.Text.ASCIIEncoding();
|
||||
|
||||
private Scene m_scene;
|
||||
private string m_loadPath;
|
||||
private Stream m_loadStream;
|
||||
|
||||
/// <summary>
|
||||
/// Used to cache lookups for valid uuids.
|
||||
@@ -62,12 +62,19 @@ namespace OpenSim.Region.Environment.Modules.World.Archiver
|
||||
public ArchiveReadRequest(Scene scene, string loadPath)
|
||||
{
|
||||
m_scene = scene;
|
||||
m_loadPath = loadPath;
|
||||
|
||||
DearchiveRegion();
|
||||
m_loadStream = new GZipStream(GetStream(loadPath), CompressionMode.Decompress);
|
||||
}
|
||||
|
||||
public ArchiveReadRequest(Scene scene, Stream loadStream)
|
||||
{
|
||||
m_scene = scene;
|
||||
m_loadStream = loadStream;
|
||||
}
|
||||
|
||||
private void DearchiveRegion()
|
||||
/// <summary>
|
||||
/// Dearchive the region embodied in this request.
|
||||
/// </summary>
|
||||
public void DearchiveRegion()
|
||||
{
|
||||
// The same code can handle dearchiving 0.1 and 0.2 OpenSim Archive versions
|
||||
DearchiveRegion0DotStar();
|
||||
@@ -75,9 +82,7 @@ namespace OpenSim.Region.Environment.Modules.World.Archiver
|
||||
|
||||
private void DearchiveRegion0DotStar()
|
||||
{
|
||||
TarArchiveReader archive
|
||||
= new TarArchiveReader(
|
||||
new GZipStream(GetStream(m_loadPath), CompressionMode.Decompress));
|
||||
TarArchiveReader archive = new TarArchiveReader(m_loadStream);
|
||||
|
||||
//AssetsDearchiver dearchiver = new AssetsDearchiver(m_scene.AssetCache);
|
||||
|
||||
@@ -368,7 +373,6 @@ namespace OpenSim.Region.Environment.Modules.World.Archiver
|
||||
/// <summary>
|
||||
/// Resolve path to a working FileStream
|
||||
/// </summary>
|
||||
|
||||
private Stream GetStream(string path)
|
||||
{
|
||||
try
|
||||
@@ -392,7 +396,6 @@ namespace OpenSim.Region.Environment.Modules.World.Archiver
|
||||
// OK, now we know we have an HTTP URI to work with
|
||||
|
||||
return URIFetch(uri);
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -28,7 +28,6 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.IO.Compression;
|
||||
using System.Reflection;
|
||||
using System.Xml;
|
||||
using OpenMetaverse;
|
||||
@@ -57,20 +56,20 @@ namespace OpenSim.Region.Environment.Modules.World.Archiver
|
||||
protected IRegionSerialiserModule m_serialiser;
|
||||
protected List<SceneObjectGroup> m_sceneObjects;
|
||||
protected RegionInfo m_regionInfo;
|
||||
protected string m_savePath;
|
||||
protected Stream m_saveStream;
|
||||
|
||||
public ArchiveWriteRequestExecution(
|
||||
List<SceneObjectGroup> sceneObjects,
|
||||
ITerrainModule terrainModule,
|
||||
IRegionSerialiserModule serialiser,
|
||||
RegionInfo regionInfo,
|
||||
string savePath)
|
||||
Stream saveStream)
|
||||
{
|
||||
m_sceneObjects = sceneObjects;
|
||||
m_terrainModule = terrainModule;
|
||||
m_serialiser = serialiser;
|
||||
m_regionInfo = regionInfo;
|
||||
m_savePath = savePath;
|
||||
m_saveStream = saveStream;
|
||||
}
|
||||
|
||||
protected internal void ReceivedAllAssets(IDictionary<UUID, AssetBase> assetsFound, ICollection<UUID> assetsNotFoundUuids)
|
||||
@@ -124,9 +123,10 @@ namespace OpenSim.Region.Environment.Modules.World.Archiver
|
||||
AssetsArchiver assetsArchiver = new AssetsArchiver(assetsFound);
|
||||
assetsArchiver.Archive(archive);
|
||||
|
||||
archive.WriteTar(new GZipStream(new FileStream(m_savePath, FileMode.Create), CompressionMode.Compress));
|
||||
archive.WriteTar(m_saveStream);
|
||||
|
||||
m_log.InfoFormat("[ARCHIVER]: Wrote out OpenSimulator archive {0}", m_savePath);
|
||||
// m_log.InfoFormat("[ARCHIVER]: Wrote out OpenSimulator archive for {0}", m_regionInfo.RegionName);
|
||||
m_log.InfoFormat("[ARCHIVER]: Wrote out OpenSimulator archive for {0}", m_saveStream);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
@@ -33,8 +33,9 @@ using OpenSim.Region.Environment.Modules.World.Terrain;
|
||||
using OpenSim.Region.Environment.Scenes;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.IO.Compression;
|
||||
using System.Reflection;
|
||||
//using System.Text;
|
||||
using System.Text.RegularExpressions;
|
||||
using System.Threading;
|
||||
using OpenMetaverse;
|
||||
@@ -51,7 +52,7 @@ namespace OpenSim.Region.Environment.Modules.World.Archiver
|
||||
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
||||
|
||||
protected Scene m_scene;
|
||||
protected string m_savePath;
|
||||
protected Stream m_saveStream;
|
||||
|
||||
/// <summary>
|
||||
/// Used as a temporary store of an asset which represents an object. This can be a null if no appropriate
|
||||
@@ -70,8 +71,19 @@ namespace OpenSim.Region.Environment.Modules.World.Archiver
|
||||
public ArchiveWriteRequestPreparation(Scene scene, string savePath)
|
||||
{
|
||||
m_scene = scene;
|
||||
m_savePath = savePath;
|
||||
m_saveStream = new GZipStream(new FileStream(savePath, FileMode.Create), CompressionMode.Compress);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Constructor.
|
||||
/// </summary>
|
||||
/// <param name="scene"></param>
|
||||
/// <param name="saveStream">The stream to which to save data.</param>
|
||||
public ArchiveWriteRequestPreparation(Scene scene, Stream saveStream)
|
||||
{
|
||||
m_scene = scene;
|
||||
m_saveStream = saveStream;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// The callback made when we request the asset for an object from the asset service.
|
||||
@@ -257,8 +269,12 @@ namespace OpenSim.Region.Environment.Modules.World.Archiver
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Archive the region requested.
|
||||
/// </summary>
|
||||
/// <exception cref="System.IO.IOException">if there was an io problem with creating the file</exception>
|
||||
public void ArchiveRegion()
|
||||
{
|
||||
{
|
||||
Dictionary<UUID, int> assetUuids = new Dictionary<UUID, int>();
|
||||
|
||||
List<EntityBase> entities = m_scene.GetEntities();
|
||||
@@ -309,7 +325,7 @@ namespace OpenSim.Region.Environment.Modules.World.Archiver
|
||||
m_scene.RequestModuleInterface<ITerrainModule>(),
|
||||
m_scene.RequestModuleInterface<IRegionSerialiserModule>(),
|
||||
m_scene.RegionInfo,
|
||||
m_savePath);
|
||||
m_saveStream);
|
||||
|
||||
new AssetsRequest(assetUuids.Keys, m_scene.AssetCache, awre.ReceivedAllAssets).Execute();
|
||||
}
|
||||
|
||||
@@ -25,15 +25,16 @@
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
using OpenSim.Framework.Communications.Cache;
|
||||
using OpenSim.Region.Environment.Interfaces;
|
||||
using OpenSim.Region.Environment.Modules.World.Serialiser;
|
||||
using OpenSim.Region.Environment.Scenes;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Reflection;
|
||||
using OpenMetaverse;
|
||||
using log4net;
|
||||
using Nini.Config;
|
||||
using OpenSim.Framework.Communications.Cache;
|
||||
using OpenSim.Region.Environment.Interfaces;
|
||||
using OpenSim.Region.Environment.Modules.World.Serialiser;
|
||||
using OpenSim.Region.Environment.Scenes;
|
||||
|
||||
namespace OpenSim.Region.Environment.Modules.World.Archiver
|
||||
{
|
||||
@@ -44,14 +45,9 @@ namespace OpenSim.Region.Environment.Modules.World.Archiver
|
||||
{
|
||||
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
||||
|
||||
/// <summary>
|
||||
/// Scene to which this module belongs
|
||||
/// </summary>
|
||||
/// <param name="scene"></param>
|
||||
/// <param name="source"></param>
|
||||
private Scene m_scene;
|
||||
|
||||
public string Name { get { return "ArchiverModule"; } }
|
||||
public string Name { get { return "Archiver Module"; } }
|
||||
|
||||
public bool IsSharedModule { get { return false; } }
|
||||
|
||||
@@ -75,12 +71,22 @@ namespace OpenSim.Region.Environment.Modules.World.Archiver
|
||||
|
||||
new ArchiveWriteRequestPreparation(m_scene, savePath).ArchiveRegion();
|
||||
}
|
||||
|
||||
public void ArchiveRegion(Stream saveStream)
|
||||
{
|
||||
new ArchiveWriteRequestPreparation(m_scene, saveStream).ArchiveRegion();
|
||||
}
|
||||
|
||||
public void DearchiveRegion(string loadPath)
|
||||
{
|
||||
m_log.InfoFormat("[SCENE]: Loading archive to region {0} from {1}", m_scene.RegionInfo.RegionName, loadPath);
|
||||
|
||||
new ArchiveReadRequest(m_scene, loadPath);
|
||||
new ArchiveReadRequest(m_scene, loadPath).DearchiveRegion();
|
||||
}
|
||||
|
||||
public void DearchiveRegion(Stream loadStream)
|
||||
{
|
||||
new ArchiveReadRequest(m_scene, loadStream).DearchiveRegion();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -26,18 +26,22 @@
|
||||
*/
|
||||
|
||||
using NUnit.Framework;
|
||||
using OpenSim.Region.Environment.Modules.World.Archiver;
|
||||
|
||||
namespace OpenSim.Region.Environment.Modules.World.Archiver
|
||||
namespace OpenSim.Region.Environment.Modules.World.Archiver.Tests
|
||||
{
|
||||
[TestFixture]
|
||||
public class ArchiverTests
|
||||
{
|
||||
/// <summary>
|
||||
/// Test loading a V0.2 OpenSim Region Archive. Does not yet do what it says on the tin
|
||||
/// Test saving a V0.2 OpenSim Region Archive. Does not yet do what it says on the tin
|
||||
/// </summary>
|
||||
[Test]
|
||||
public void TestLoadOarV0p2()
|
||||
{
|
||||
public void TestSaveOarV0p2()
|
||||
{
|
||||
// Create an archive containing only a terrain
|
||||
//TarArchiveWriter taw = new TarArchiveWriter();
|
||||
|
||||
//System.Console.WriteLine("wibble");
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user