Files
2026-06-04 11:42:34 +02:00

690 lines
16 KiB
C#

using System;
using System.IO;
using System.Text;
namespace ICSharpCode.SharpZipLib.Tar
{
// Token: 0x02000034 RID: 52
public class TarArchive : IDisposable
{
// Token: 0x14000001 RID: 1
// (add) Token: 0x0600017C RID: 380 RVA: 0x000099AD File Offset: 0x000089AD
// (remove) Token: 0x0600017D RID: 381 RVA: 0x000099C6 File Offset: 0x000089C6
public event ProgressMessageHandler ProgressMessageEvent;
// Token: 0x0600017E RID: 382 RVA: 0x000099E0 File Offset: 0x000089E0
protected virtual void OnProgressMessageEvent(TarEntry entry, string message)
{
ProgressMessageHandler progressMessageEvent = this.ProgressMessageEvent;
if (progressMessageEvent != null)
{
progressMessageEvent(this, entry, message);
}
}
// Token: 0x0600017F RID: 383 RVA: 0x00009A00 File Offset: 0x00008A00
protected TarArchive()
{
}
// Token: 0x06000180 RID: 384 RVA: 0x00009A1E File Offset: 0x00008A1E
protected TarArchive(TarInputStream stream)
{
if (stream == null)
{
throw new ArgumentNullException("stream");
}
this.tarIn = stream;
}
// Token: 0x06000181 RID: 385 RVA: 0x00009A51 File Offset: 0x00008A51
protected TarArchive(TarOutputStream stream)
{
if (stream == null)
{
throw new ArgumentNullException("stream");
}
this.tarOut = stream;
}
// Token: 0x06000182 RID: 386 RVA: 0x00009A84 File Offset: 0x00008A84
public static TarArchive CreateInputTarArchive(Stream inputStream)
{
if (inputStream == null)
{
throw new ArgumentNullException("inputStream");
}
TarInputStream tarInputStream = inputStream as TarInputStream;
TarArchive tarArchive;
if (tarInputStream != null)
{
tarArchive = new TarArchive(tarInputStream);
}
else
{
tarArchive = TarArchive.CreateInputTarArchive(inputStream, 20);
}
return tarArchive;
}
// Token: 0x06000183 RID: 387 RVA: 0x00009ABC File Offset: 0x00008ABC
public static TarArchive CreateInputTarArchive(Stream inputStream, int blockFactor)
{
if (inputStream == null)
{
throw new ArgumentNullException("inputStream");
}
if (inputStream is TarInputStream)
{
throw new ArgumentException("TarInputStream not valid");
}
return new TarArchive(new TarInputStream(inputStream, blockFactor));
}
// Token: 0x06000184 RID: 388 RVA: 0x00009AEC File Offset: 0x00008AEC
public static TarArchive CreateOutputTarArchive(Stream outputStream)
{
if (outputStream == null)
{
throw new ArgumentNullException("outputStream");
}
TarOutputStream tarOutputStream = outputStream as TarOutputStream;
TarArchive tarArchive;
if (tarOutputStream != null)
{
tarArchive = new TarArchive(tarOutputStream);
}
else
{
tarArchive = TarArchive.CreateOutputTarArchive(outputStream, 20);
}
return tarArchive;
}
// Token: 0x06000185 RID: 389 RVA: 0x00009B24 File Offset: 0x00008B24
public static TarArchive CreateOutputTarArchive(Stream outputStream, int blockFactor)
{
if (outputStream == null)
{
throw new ArgumentNullException("outputStream");
}
if (outputStream is TarOutputStream)
{
throw new ArgumentException("TarOutputStream is not valid");
}
return new TarArchive(new TarOutputStream(outputStream, blockFactor));
}
// Token: 0x06000186 RID: 390 RVA: 0x00009B53 File Offset: 0x00008B53
public void SetKeepOldFiles(bool keepExistingFiles)
{
if (this.isDisposed)
{
throw new ObjectDisposedException("TarArchive");
}
this.keepOldFiles = keepExistingFiles;
}
// Token: 0x17000049 RID: 73
// (get) Token: 0x06000187 RID: 391 RVA: 0x00009B6F File Offset: 0x00008B6F
// (set) Token: 0x06000188 RID: 392 RVA: 0x00009B8A File Offset: 0x00008B8A
public bool AsciiTranslate
{
get
{
if (this.isDisposed)
{
throw new ObjectDisposedException("TarArchive");
}
return this.asciiTranslate;
}
set
{
if (this.isDisposed)
{
throw new ObjectDisposedException("TarArchive");
}
this.asciiTranslate = value;
}
}
// Token: 0x06000189 RID: 393 RVA: 0x00009BA6 File Offset: 0x00008BA6
[Obsolete("Use the AsciiTranslate property")]
public void SetAsciiTranslation(bool translateAsciiFiles)
{
if (this.isDisposed)
{
throw new ObjectDisposedException("TarArchive");
}
this.asciiTranslate = translateAsciiFiles;
}
// Token: 0x1700004A RID: 74
// (get) Token: 0x0600018A RID: 394 RVA: 0x00009BC2 File Offset: 0x00008BC2
// (set) Token: 0x0600018B RID: 395 RVA: 0x00009BDD File Offset: 0x00008BDD
public string PathPrefix
{
get
{
if (this.isDisposed)
{
throw new ObjectDisposedException("TarArchive");
}
return this.pathPrefix;
}
set
{
if (this.isDisposed)
{
throw new ObjectDisposedException("TarArchive");
}
this.pathPrefix = value;
}
}
// Token: 0x1700004B RID: 75
// (get) Token: 0x0600018C RID: 396 RVA: 0x00009BF9 File Offset: 0x00008BF9
// (set) Token: 0x0600018D RID: 397 RVA: 0x00009C14 File Offset: 0x00008C14
public string RootPath
{
get
{
if (this.isDisposed)
{
throw new ObjectDisposedException("TarArchive");
}
return this.rootPath;
}
set
{
if (this.isDisposed)
{
throw new ObjectDisposedException("TarArchive");
}
this.rootPath = value;
}
}
// Token: 0x0600018E RID: 398 RVA: 0x00009C30 File Offset: 0x00008C30
public void SetUserInfo(int userId, string userName, int groupId, string groupName)
{
if (this.isDisposed)
{
throw new ObjectDisposedException("TarArchive");
}
this.userId = userId;
this.userName = userName;
this.groupId = groupId;
this.groupName = groupName;
this.applyUserInfoOverrides = true;
}
// Token: 0x1700004C RID: 76
// (get) Token: 0x0600018F RID: 399 RVA: 0x00009C69 File Offset: 0x00008C69
// (set) Token: 0x06000190 RID: 400 RVA: 0x00009C84 File Offset: 0x00008C84
public bool ApplyUserInfoOverrides
{
get
{
if (this.isDisposed)
{
throw new ObjectDisposedException("TarArchive");
}
return this.applyUserInfoOverrides;
}
set
{
if (this.isDisposed)
{
throw new ObjectDisposedException("TarArchive");
}
this.applyUserInfoOverrides = value;
}
}
// Token: 0x1700004D RID: 77
// (get) Token: 0x06000191 RID: 401 RVA: 0x00009CA0 File Offset: 0x00008CA0
public int UserId
{
get
{
if (this.isDisposed)
{
throw new ObjectDisposedException("TarArchive");
}
return this.userId;
}
}
// Token: 0x1700004E RID: 78
// (get) Token: 0x06000192 RID: 402 RVA: 0x00009CBB File Offset: 0x00008CBB
public string UserName
{
get
{
if (this.isDisposed)
{
throw new ObjectDisposedException("TarArchive");
}
return this.userName;
}
}
// Token: 0x1700004F RID: 79
// (get) Token: 0x06000193 RID: 403 RVA: 0x00009CD6 File Offset: 0x00008CD6
public int GroupId
{
get
{
if (this.isDisposed)
{
throw new ObjectDisposedException("TarArchive");
}
return this.groupId;
}
}
// Token: 0x17000050 RID: 80
// (get) Token: 0x06000194 RID: 404 RVA: 0x00009CF1 File Offset: 0x00008CF1
public string GroupName
{
get
{
if (this.isDisposed)
{
throw new ObjectDisposedException("TarArchive");
}
return this.groupName;
}
}
// Token: 0x17000051 RID: 81
// (get) Token: 0x06000195 RID: 405 RVA: 0x00009D0C File Offset: 0x00008D0C
public int RecordSize
{
get
{
if (this.isDisposed)
{
throw new ObjectDisposedException("TarArchive");
}
if (this.tarIn != null)
{
return this.tarIn.RecordSize;
}
if (this.tarOut != null)
{
return this.tarOut.RecordSize;
}
return 10240;
}
}
// Token: 0x17000052 RID: 82
// (set) Token: 0x06000196 RID: 406 RVA: 0x00009D59 File Offset: 0x00008D59
public bool IsStreamOwner
{
set
{
if (this.tarIn != null)
{
this.tarIn.IsStreamOwner = value;
return;
}
this.tarOut.IsStreamOwner = value;
}
}
// Token: 0x06000197 RID: 407 RVA: 0x00009D7C File Offset: 0x00008D7C
[Obsolete("Use Close instead")]
public void CloseArchive()
{
this.Close();
}
// Token: 0x06000198 RID: 408 RVA: 0x00009D84 File Offset: 0x00008D84
public void ListContents()
{
if (this.isDisposed)
{
throw new ObjectDisposedException("TarArchive");
}
for (;;)
{
TarEntry nextEntry = this.tarIn.GetNextEntry();
if (nextEntry == null)
{
break;
}
this.OnProgressMessageEvent(nextEntry, null);
}
}
// Token: 0x06000199 RID: 409 RVA: 0x00009DC0 File Offset: 0x00008DC0
public void ExtractContents(string destinationDirectory)
{
if (this.isDisposed)
{
throw new ObjectDisposedException("TarArchive");
}
for (;;)
{
TarEntry nextEntry = this.tarIn.GetNextEntry();
if (nextEntry == null)
{
break;
}
this.ExtractEntry(destinationDirectory, nextEntry);
}
}
// Token: 0x0600019A RID: 410 RVA: 0x00009DFC File Offset: 0x00008DFC
private void ExtractEntry(string destDir, TarEntry entry)
{
this.OnProgressMessageEvent(entry, null);
string text = entry.Name;
if (Path.IsPathRooted(text))
{
text = text.Substring(Path.GetPathRoot(text).Length);
}
text = text.Replace('/', Path.DirectorySeparatorChar);
string text2 = Path.Combine(destDir, text);
if (entry.IsDirectory)
{
TarArchive.EnsureDirectoryExists(text2);
return;
}
string directoryName = Path.GetDirectoryName(text2);
TarArchive.EnsureDirectoryExists(directoryName);
bool flag = true;
FileInfo fileInfo = new FileInfo(text2);
if (fileInfo.Exists)
{
if (this.keepOldFiles)
{
this.OnProgressMessageEvent(entry, "Destination file already exists");
flag = false;
}
else if ((fileInfo.Attributes & FileAttributes.ReadOnly) != (FileAttributes)0)
{
this.OnProgressMessageEvent(entry, "Destination file already exists, and is read-only");
flag = false;
}
}
if (flag)
{
bool flag2 = false;
Stream stream = File.Create(text2);
if (this.asciiTranslate)
{
flag2 = !TarArchive.IsBinary(text2);
}
StreamWriter streamWriter = null;
if (flag2)
{
streamWriter = new StreamWriter(stream);
}
byte[] array = new byte[32768];
for (;;)
{
int num = this.tarIn.Read(array, 0, array.Length);
if (num <= 0)
{
break;
}
if (flag2)
{
int num2 = 0;
for (int i = 0; i < num; i++)
{
if (array[i] == 10)
{
string @string = Encoding.ASCII.GetString(array, num2, i - num2);
streamWriter.WriteLine(@string);
num2 = i + 1;
}
}
}
else
{
stream.Write(array, 0, num);
}
}
if (flag2)
{
streamWriter.Close();
return;
}
stream.Close();
}
}
// Token: 0x0600019B RID: 411 RVA: 0x00009F6C File Offset: 0x00008F6C
public void WriteEntry(TarEntry sourceEntry, bool recurse)
{
if (sourceEntry == null)
{
throw new ArgumentNullException("sourceEntry");
}
if (this.isDisposed)
{
throw new ObjectDisposedException("TarArchive");
}
try
{
if (recurse)
{
TarHeader.SetValueDefaults(sourceEntry.UserId, sourceEntry.UserName, sourceEntry.GroupId, sourceEntry.GroupName);
}
this.WriteEntryCore(sourceEntry, recurse);
}
finally
{
if (recurse)
{
TarHeader.RestoreSetValues();
}
}
}
// Token: 0x0600019C RID: 412 RVA: 0x00009FE0 File Offset: 0x00008FE0
private void WriteEntryCore(TarEntry sourceEntry, bool recurse)
{
string text = null;
string text2 = sourceEntry.File;
TarEntry tarEntry = (TarEntry)sourceEntry.Clone();
if (this.applyUserInfoOverrides)
{
tarEntry.GroupId = this.groupId;
tarEntry.GroupName = this.groupName;
tarEntry.UserId = this.userId;
tarEntry.UserName = this.userName;
}
this.OnProgressMessageEvent(tarEntry, null);
if (this.asciiTranslate && !tarEntry.IsDirectory && !TarArchive.IsBinary(text2))
{
text = Path.GetTempFileName();
using (StreamReader streamReader = File.OpenText(text2))
{
using (Stream stream = File.Create(text))
{
for (;;)
{
string text3 = streamReader.ReadLine();
if (text3 == null)
{
break;
}
byte[] bytes = Encoding.ASCII.GetBytes(text3);
stream.Write(bytes, 0, bytes.Length);
stream.WriteByte(10);
}
stream.Flush();
}
}
tarEntry.Size = new FileInfo(text).Length;
text2 = text;
}
string text4 = null;
if (this.rootPath != null && tarEntry.Name.StartsWith(this.rootPath))
{
text4 = tarEntry.Name.Substring(this.rootPath.Length + 1);
}
if (this.pathPrefix != null)
{
text4 = ((text4 == null) ? (this.pathPrefix + "/" + tarEntry.Name) : (this.pathPrefix + "/" + text4));
}
if (text4 != null)
{
tarEntry.Name = text4;
}
this.tarOut.PutNextEntry(tarEntry);
if (tarEntry.IsDirectory)
{
if (recurse)
{
TarEntry[] directoryEntries = tarEntry.GetDirectoryEntries();
for (int i = 0; i < directoryEntries.Length; i++)
{
this.WriteEntryCore(directoryEntries[i], recurse);
}
return;
}
}
else
{
using (Stream stream2 = File.OpenRead(text2))
{
byte[] array = new byte[32768];
for (;;)
{
int num = stream2.Read(array, 0, array.Length);
if (num <= 0)
{
break;
}
this.tarOut.Write(array, 0, num);
}
}
if (text != null && text.Length > 0)
{
File.Delete(text);
}
this.tarOut.CloseEntry();
}
}
// Token: 0x0600019D RID: 413 RVA: 0x0000A228 File Offset: 0x00009228
public void Dispose()
{
this.Dispose(true);
GC.SuppressFinalize(this);
}
// Token: 0x0600019E RID: 414 RVA: 0x0000A238 File Offset: 0x00009238
protected virtual void Dispose(bool disposing)
{
if (!this.isDisposed)
{
this.isDisposed = true;
if (disposing)
{
if (this.tarOut != null)
{
this.tarOut.Flush();
this.tarOut.Close();
}
if (this.tarIn != null)
{
this.tarIn.Close();
}
}
}
}
// Token: 0x0600019F RID: 415 RVA: 0x0000A288 File Offset: 0x00009288
public virtual void Close()
{
this.Dispose(true);
}
// Token: 0x060001A0 RID: 416 RVA: 0x0000A294 File Offset: 0x00009294
~TarArchive()
{
this.Dispose(false);
}
// Token: 0x060001A1 RID: 417 RVA: 0x0000A2C4 File Offset: 0x000092C4
private static void EnsureDirectoryExists(string directoryName)
{
if (!Directory.Exists(directoryName))
{
try
{
Directory.CreateDirectory(directoryName);
}
catch (Exception ex)
{
throw new TarException("Exception creating directory '" + directoryName + "', " + ex.Message, ex);
}
}
}
// Token: 0x060001A2 RID: 418 RVA: 0x0000A310 File Offset: 0x00009310
private static bool IsBinary(string filename)
{
using (FileStream fileStream = File.OpenRead(filename))
{
int num = Math.Min(4096, (int)fileStream.Length);
byte[] array = new byte[num];
int num2 = fileStream.Read(array, 0, num);
for (int i = 0; i < num2; i++)
{
byte b = array[i];
if (b < 8 || (b > 13 && b < 32) || b == 255)
{
return true;
}
}
}
return false;
}
// Token: 0x040000E1 RID: 225
private bool keepOldFiles;
// Token: 0x040000E2 RID: 226
private bool asciiTranslate;
// Token: 0x040000E3 RID: 227
private int userId;
// Token: 0x040000E4 RID: 228
private string userName = string.Empty;
// Token: 0x040000E5 RID: 229
private int groupId;
// Token: 0x040000E6 RID: 230
private string groupName = string.Empty;
// Token: 0x040000E7 RID: 231
private string rootPath;
// Token: 0x040000E8 RID: 232
private string pathPrefix;
// Token: 0x040000E9 RID: 233
private bool applyUserInfoOverrides;
// Token: 0x040000EA RID: 234
private TarInputStream tarIn;
// Token: 0x040000EB RID: 235
private TarOutputStream tarOut;
// Token: 0x040000EC RID: 236
private bool isDisposed;
}
}