diff --git a/OpenSim/Region/Application/OpenSimMainConsole.cs b/OpenSim/Region/Application/OpenSimMainConsole.cs index e4590f27e7..7b1b4770bb 100644 --- a/OpenSim/Region/Application/OpenSimMainConsole.cs +++ b/OpenSim/Region/Application/OpenSimMainConsole.cs @@ -360,6 +360,19 @@ namespace OpenSim } break; + case "load-oar": + m_log.Error("[CONSOLE]: Don't use me - I haven't yet been sufficiently implemented!"); + + if (cmdparams.Length > 0) + { + m_sceneManager.LoadArchiveToCurrentScene(cmdparams[0]); + } + else + { + m_sceneManager.LoadArchiveToCurrentScene(DEFAULT_OAR_BACKUP_FILENAME); + } + break; + case "save-oar": m_log.Error("[CONSOLE]: Don't use me - I haven't yet been sufficiently implemented!"); diff --git a/OpenSim/Region/Environment/Modules/World/Archiver/ArchiveReadRequest.cs b/OpenSim/Region/Environment/Modules/World/Archiver/ArchiveReadRequest.cs new file mode 100644 index 0000000000..0a3c4c5cc0 --- /dev/null +++ b/OpenSim/Region/Environment/Modules/World/Archiver/ArchiveReadRequest.cs @@ -0,0 +1,66 @@ +/* + * Copyright (c) Contributors, http://opensimulator.org/ + * See CONTRIBUTORS.TXT for a full list of copyright holders. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the OpenSim Project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +using OpenSim.Region.Environment.Scenes; +using System.Reflection; +using log4net; + +namespace OpenSim.Region.Environment.Modules.World.Archiver +{ + /// + /// Handles an individual archive read request + /// + public class ArchiveReadRequest + { + private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + + private Scene m_scene; + private string m_loadPath; + + public ArchiveReadRequest(Scene scene, string loadPath) + { + m_scene = scene; + m_loadPath = loadPath; + + DearchiveRegion(); + } + + protected void DearchiveRegion() + { + TarArchiveReader archive = new TarArchiveReader(m_loadPath); + + // Just test for now by reading first file + string filePath = "ERROR"; + + byte[] data = archive.Read(out filePath); + + m_log.DebugFormat("Successfully read {0} ({1} bytes) from archive {2}", filePath, data.Length, m_loadPath); + + archive.Close(); + } + } +} diff --git a/OpenSim/Region/Environment/Modules/World/Archiver/ArchiveRequest.cs b/OpenSim/Region/Environment/Modules/World/Archiver/ArchiveWriteRequest.cs similarity index 96% rename from OpenSim/Region/Environment/Modules/World/Archiver/ArchiveRequest.cs rename to OpenSim/Region/Environment/Modules/World/Archiver/ArchiveWriteRequest.cs index 364b31feb4..b952200e94 100644 --- a/OpenSim/Region/Environment/Modules/World/Archiver/ArchiveRequest.cs +++ b/OpenSim/Region/Environment/Modules/World/Archiver/ArchiveWriteRequest.cs @@ -44,9 +44,9 @@ namespace OpenSim.Region.Environment public delegate void AssetsRequestCallback(IDictionary assets); /// - /// Handles an individual archive request + /// Handles an individual archive write request /// - public class ArchiveRequest + public class ArchiveWriteRequest { private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); @@ -55,7 +55,7 @@ namespace OpenSim.Region.Environment private string m_serializedEntities; - public ArchiveRequest(Scene scene, string savePath) + public ArchiveWriteRequest(Scene scene, string savePath) { m_scene = scene; m_savePath = savePath; @@ -65,8 +65,6 @@ namespace OpenSim.Region.Environment protected void ArchiveRegion() { - m_log.Warn("[ARCHIVER]: Archive region not yet implemented"); - Dictionary textureUuids = new Dictionary(); List entities = m_scene.GetEntities(); @@ -103,7 +101,7 @@ namespace OpenSim.Region.Environment // XXX: Shouldn't hijack the asset async callback thread like this - this is only temporary - TarArchive archive = new TarArchive(); + TarArchiveWriter archive = new TarArchiveWriter(); archive.AddFile("prims.xml", m_serializedEntities); diff --git a/OpenSim/Region/Environment/Modules/World/Archiver/ArchiverModule.cs b/OpenSim/Region/Environment/Modules/World/Archiver/ArchiverModule.cs index cff9235b5e..0e3123e087 100644 --- a/OpenSim/Region/Environment/Modules/World/Archiver/ArchiverModule.cs +++ b/OpenSim/Region/Environment/Modules/World/Archiver/ArchiverModule.cs @@ -72,12 +72,12 @@ namespace OpenSim.Region.Environment.Modules.World.Archiver public void ArchiveRegion(string savePath) { - new ArchiveRequest(m_scene, savePath); + new ArchiveWriteRequest(m_scene, savePath); } public void DearchiveRegion(string loadPath) { - m_log.Warn("[ARCHIVER]: Dearchive region not yet implemented"); + new ArchiveReadRequest(m_scene, loadPath); } } -} \ No newline at end of file +} diff --git a/OpenSim/Region/Environment/Modules/World/Archiver/TarArchiveReader.cs b/OpenSim/Region/Environment/Modules/World/Archiver/TarArchiveReader.cs new file mode 100644 index 0000000000..e785c6c3be --- /dev/null +++ b/OpenSim/Region/Environment/Modules/World/Archiver/TarArchiveReader.cs @@ -0,0 +1,108 @@ +/* + * Copyright (c) Contributors, http://opensimulator.org/ + * See CONTRIBUTORS.TXT for a full list of copyright holders. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the OpenSim Project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +using System; +using System.IO; +//using System.Reflection; +//using log4net; + +namespace OpenSim.Region.Environment.Modules.World.Archiver +{ + /// + /// Temporary code to do the bare minimum required to read a tar archive for our purposes + /// + public class TarArchiveReader + { +// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + + protected static System.Text.ASCIIEncoding m_asciiEncoding = new System.Text.ASCIIEncoding(); + + /// + /// Binary reader for the underlying stream + /// + protected BinaryReader m_br; + + public TarArchiveReader(string archivePath) + { + m_br = new BinaryReader(new FileStream(archivePath, FileMode.Open)); + } + + public byte[] Read(out string filePath) + { + TarHeader header = ReadHeader(); + filePath = header.FilePath; + return m_br.ReadBytes(header.FileSize); + } + + /// + /// Read the next 512 byte chunk of data as a tar header. + /// + /// A tar header struct + protected TarHeader ReadHeader() + { + TarHeader tarHeader = new TarHeader(); + + byte[] header = m_br.ReadBytes(512); + + tarHeader.FilePath = m_asciiEncoding.GetString(header, 0, 100); + tarHeader.FileSize = ConvertOctalBytesToDecimal(header, 124, 11); + + return tarHeader; + } + + public void Close() + { + m_br.Close(); + } + + /// + /// Convert octal bytes to a decimal representation + /// + /// + /// + public static int ConvertOctalBytesToDecimal(byte[] bytes, int startIndex, int count) + { + string oString = m_asciiEncoding.GetString(bytes, startIndex, count); + + int d = 0; + + foreach (char c in oString) + { + d <<= 3; + d |= c - '0'; + } + + return d; + } + } + + public struct TarHeader + { + public string FilePath; + public int FileSize; + } +} diff --git a/OpenSim/Region/Environment/Modules/World/Archiver/TarArchive.cs b/OpenSim/Region/Environment/Modules/World/Archiver/TarArchiveWriter.cs similarity index 99% rename from OpenSim/Region/Environment/Modules/World/Archiver/TarArchive.cs rename to OpenSim/Region/Environment/Modules/World/Archiver/TarArchiveWriter.cs index c7492fe680..e951755814 100644 --- a/OpenSim/Region/Environment/Modules/World/Archiver/TarArchive.cs +++ b/OpenSim/Region/Environment/Modules/World/Archiver/TarArchiveWriter.cs @@ -25,7 +25,6 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ - using System; using System.Collections.Generic; using System.IO; @@ -38,7 +37,7 @@ namespace OpenSim.Region.Environment /// /// Temporary code to produce a tar archive in tar v7 format /// - public class TarArchive + public class TarArchiveWriter { private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); diff --git a/OpenSim/Region/Environment/Scenes/SceneManager.cs b/OpenSim/Region/Environment/Scenes/SceneManager.cs index 66174bfa05..63146bd6d3 100644 --- a/OpenSim/Region/Environment/Scenes/SceneManager.cs +++ b/OpenSim/Region/Environment/Scenes/SceneManager.cs @@ -192,7 +192,7 @@ namespace OpenSim.Region.Environment.Scenes public void LoadCurrentSceneFromXml2(string filename) { CurrentOrFirstScene.LoadPrimsFromXml2(filename); - } + } /// /// Save the current scene to an OpenSimulator archive. This archive will eventually include the prim's assets @@ -209,9 +209,9 @@ namespace OpenSim.Region.Environment.Scenes /// their assets to the asset service. /// /// - public void LoadCurrentSceneFromArchive(string filename) + public void LoadArchiveToCurrentScene(string filename) { - CurrentOrFirstScene.SavePrimsToArchive(filename); + CurrentOrFirstScene.LoadPrimsFromArchive(filename); } [Obsolete("TODO: Remove this warning by 0.7")]