aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region')
-rw-r--r--OpenSim/Region/Environment/Modules/World/Archiver/ArchiveReadRequest.cs8
-rw-r--r--OpenSim/Region/Environment/Modules/World/Archiver/TarArchiveReader.cs58
2 files changed, 55 insertions, 11 deletions
diff --git a/OpenSim/Region/Environment/Modules/World/Archiver/ArchiveReadRequest.cs b/OpenSim/Region/Environment/Modules/World/Archiver/ArchiveReadRequest.cs
index c3f8d2b..268b9b5 100644
--- a/OpenSim/Region/Environment/Modules/World/Archiver/ArchiveReadRequest.cs
+++ b/OpenSim/Region/Environment/Modules/World/Archiver/ArchiveReadRequest.cs
@@ -56,9 +56,13 @@ namespace OpenSim.Region.Environment.Modules.World.Archiver
56 // Just test for now by reading first file 56 // Just test for now by reading first file
57 string filePath = "ERROR"; 57 string filePath = "ERROR";
58 58
59 byte[] data = archive.Read(out filePath); 59 byte[] data;
60 while ((data = archive.ReadEntry(out filePath)) != null)
61 {
62 m_log.DebugFormat("[ARCHIVER]: Successfully read {0} ({1} bytes) from archive {2}", filePath, data.Length, m_loadPath);
63 }
60 64
61 m_log.DebugFormat("[ARCHIVER]: Successfully read {0} ({1} bytes) from archive {2}", filePath, data.Length, m_loadPath); 65 m_log.DebugFormat("[ARCHIVER]: Reached end of archive");
62 66
63 archive.Close(); 67 archive.Close();
64 } 68 }
diff --git a/OpenSim/Region/Environment/Modules/World/Archiver/TarArchiveReader.cs b/OpenSim/Region/Environment/Modules/World/Archiver/TarArchiveReader.cs
index 80641e3..aacae95 100644
--- a/OpenSim/Region/Environment/Modules/World/Archiver/TarArchiveReader.cs
+++ b/OpenSim/Region/Environment/Modules/World/Archiver/TarArchiveReader.cs
@@ -27,8 +27,8 @@
27 27
28using System; 28using System;
29using System.IO; 29using System.IO;
30//using System.Reflection; 30using System.Reflection;
31//using log4net; 31using log4net;
32 32
33namespace OpenSim.Region.Environment.Modules.World.Archiver 33namespace OpenSim.Region.Environment.Modules.World.Archiver
34{ 34{
@@ -37,9 +37,9 @@ namespace OpenSim.Region.Environment.Modules.World.Archiver
37 /// </summary> 37 /// </summary>
38 public class TarArchiveReader 38 public class TarArchiveReader
39 { 39 {
40// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 40 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
41 41
42 protected static System.Text.ASCIIEncoding m_asciiEncoding = new System.Text.ASCIIEncoding(); 42 protected static System.Text.ASCIIEncoding m_asciiEncoding = new System.Text.ASCIIEncoding();
43 43
44 /// <summary> 44 /// <summary>
45 /// Binary reader for the underlying stream 45 /// Binary reader for the underlying stream
@@ -51,19 +51,59 @@ namespace OpenSim.Region.Environment.Modules.World.Archiver
51 m_br = new BinaryReader(new FileStream(archivePath, FileMode.Open)); 51 m_br = new BinaryReader(new FileStream(archivePath, FileMode.Open));
52 } 52 }
53 53
54 public byte[] Read(out string filePath) 54 /// <summary>
55 /// Are we at the end of the archive?
56 /// </summary>
57 /// <returns></returns>
58 public bool AtEof()
59 {
60 // If we've reached the end of the archive we'll be in null block territory, which means
61 // the next byte will be 0
62 if (m_br.PeekChar() == 0)
63 return true;
64
65 return false;
66 }
67
68 /// <summary>
69 /// Read the next entry in the tar file.
70 /// </summary>
71 /// <param name="filePath"></param>
72 /// <returns>the data for the entry. Returns null if there are no more entries</returns>
73 public byte[] ReadEntry(out string filePath)
55 { 74 {
56 TarHeader header = ReadHeader(); 75 filePath = String.Empty;
76
77 if (AtEof())
78 return null;
79
80 TarHeader header = ReadHeader();
81
57 filePath = header.FilePath; 82 filePath = header.FilePath;
58 return m_br.ReadBytes(header.FileSize); 83 byte[] data = m_br.ReadBytes(header.FileSize);
84
85 m_log.DebugFormat("[TAR ARCHIVE READER]: filePath {0}, fileSize {1}", filePath, header.FileSize);
86
87 // Read the rest of the empty padding in the 512 byte block
88 if (header.FileSize % 512 != 0)
89 {
90 int paddingLeft = 512 - (header.FileSize % 512);
91
92 m_log.DebugFormat("[TAR ARCHIVE READER]: Reading {0} padding bytes", paddingLeft);
93
94 m_br.ReadBytes(paddingLeft);
95 }
96
97 return data;
59 } 98 }
60 99
61 /// <summary> 100 /// <summary>
62 /// Read the next 512 byte chunk of data as a tar header. 101 /// Read the next 512 byte chunk of data as a tar header.
102 /// This method assumes we are not at the end of the archive
63 /// </summary> 103 /// </summary>
64 /// <returns>A tar header struct</returns> 104 /// <returns>A tar header struct.</returns>
65 protected TarHeader ReadHeader() 105 protected TarHeader ReadHeader()
66 { 106 {
67 TarHeader tarHeader = new TarHeader(); 107 TarHeader tarHeader = new TarHeader();
68 108
69 byte[] header = m_br.ReadBytes(512); 109 byte[] header = m_br.ReadBytes(512);