207 lines
5.1 KiB
C#
207 lines
5.1 KiB
C#
using System;
|
|
using System.IO;
|
|
using System.Text;
|
|
using ICSharpCode.SharpZipLib.Core;
|
|
|
|
namespace ICSharpCode.SharpZipLib.Zip
|
|
{
|
|
// Token: 0x0200004F RID: 79
|
|
public class WindowsNameTransform : INameTransform
|
|
{
|
|
// Token: 0x06000317 RID: 791 RVA: 0x000111C6 File Offset: 0x000101C6
|
|
public WindowsNameTransform(string baseDirectory)
|
|
{
|
|
if (baseDirectory == null)
|
|
{
|
|
throw new ArgumentNullException("baseDirectory", "Directory name is invalid");
|
|
}
|
|
this.BaseDirectory = baseDirectory;
|
|
}
|
|
|
|
// Token: 0x06000318 RID: 792 RVA: 0x000111F0 File Offset: 0x000101F0
|
|
public WindowsNameTransform()
|
|
{
|
|
}
|
|
|
|
// Token: 0x170000A6 RID: 166
|
|
// (get) Token: 0x06000319 RID: 793 RVA: 0x00011200 File Offset: 0x00010200
|
|
// (set) Token: 0x0600031A RID: 794 RVA: 0x00011208 File Offset: 0x00010208
|
|
public string BaseDirectory
|
|
{
|
|
get
|
|
{
|
|
return this._baseDirectory;
|
|
}
|
|
set
|
|
{
|
|
if (value == null)
|
|
{
|
|
throw new ArgumentNullException("value");
|
|
}
|
|
this._baseDirectory = Path.GetFullPath(value);
|
|
}
|
|
}
|
|
|
|
// Token: 0x170000A7 RID: 167
|
|
// (get) Token: 0x0600031B RID: 795 RVA: 0x00011224 File Offset: 0x00010224
|
|
// (set) Token: 0x0600031C RID: 796 RVA: 0x0001122C File Offset: 0x0001022C
|
|
public bool TrimIncomingPaths
|
|
{
|
|
get
|
|
{
|
|
return this._trimIncomingPaths;
|
|
}
|
|
set
|
|
{
|
|
this._trimIncomingPaths = value;
|
|
}
|
|
}
|
|
|
|
// Token: 0x0600031D RID: 797 RVA: 0x00011238 File Offset: 0x00010238
|
|
public string TransformDirectory(string name)
|
|
{
|
|
name = this.TransformFile(name);
|
|
if (name.Length > 0)
|
|
{
|
|
while (name.EndsWith("\\"))
|
|
{
|
|
name = name.Remove(name.Length - 1, 1);
|
|
}
|
|
return name;
|
|
}
|
|
throw new ZipException("Cannot have an empty directory name");
|
|
}
|
|
|
|
// Token: 0x0600031E RID: 798 RVA: 0x00011288 File Offset: 0x00010288
|
|
public string TransformFile(string name)
|
|
{
|
|
if (name != null)
|
|
{
|
|
name = WindowsNameTransform.MakeValidName(name, this._replacementChar);
|
|
if (this._trimIncomingPaths)
|
|
{
|
|
name = Path.GetFileName(name);
|
|
}
|
|
if (this._baseDirectory != null)
|
|
{
|
|
name = Path.Combine(this._baseDirectory, name);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
name = string.Empty;
|
|
}
|
|
return name;
|
|
}
|
|
|
|
// Token: 0x0600031F RID: 799 RVA: 0x000112D8 File Offset: 0x000102D8
|
|
public static bool IsValidName(string name)
|
|
{
|
|
return name != null && name.Length <= 260 && string.Compare(name, WindowsNameTransform.MakeValidName(name, '_')) == 0;
|
|
}
|
|
|
|
// Token: 0x06000320 RID: 800 RVA: 0x0001130C File Offset: 0x0001030C
|
|
static WindowsNameTransform()
|
|
{
|
|
char[] invalidPathChars = Path.GetInvalidPathChars();
|
|
int num = invalidPathChars.Length + 3;
|
|
WindowsNameTransform.InvalidEntryChars = new char[num];
|
|
Array.Copy(invalidPathChars, 0, WindowsNameTransform.InvalidEntryChars, 0, invalidPathChars.Length);
|
|
WindowsNameTransform.InvalidEntryChars[num - 1] = '*';
|
|
WindowsNameTransform.InvalidEntryChars[num - 2] = '?';
|
|
WindowsNameTransform.InvalidEntryChars[num - 3] = ':';
|
|
}
|
|
|
|
// Token: 0x06000321 RID: 801 RVA: 0x00011364 File Offset: 0x00010364
|
|
public static string MakeValidName(string name, char replacement)
|
|
{
|
|
if (name == null)
|
|
{
|
|
throw new ArgumentNullException("name");
|
|
}
|
|
name = WindowsPathUtils.DropPathRoot(name.Replace("/", "\\"));
|
|
while (name.Length > 0)
|
|
{
|
|
if (name[0] != '\\')
|
|
{
|
|
break;
|
|
}
|
|
name = name.Remove(0, 1);
|
|
}
|
|
while (name.Length > 0 && name[name.Length - 1] == '\\')
|
|
{
|
|
name = name.Remove(name.Length - 1, 1);
|
|
}
|
|
int i;
|
|
for (i = name.IndexOf("\\\\"); i >= 0; i = name.IndexOf("\\\\"))
|
|
{
|
|
name = name.Remove(i, 1);
|
|
}
|
|
i = name.IndexOfAny(WindowsNameTransform.InvalidEntryChars);
|
|
if (i >= 0)
|
|
{
|
|
StringBuilder stringBuilder = new StringBuilder(name);
|
|
while (i >= 0)
|
|
{
|
|
stringBuilder[i] = replacement;
|
|
if (i >= name.Length)
|
|
{
|
|
i = -1;
|
|
}
|
|
else
|
|
{
|
|
i = name.IndexOfAny(WindowsNameTransform.InvalidEntryChars, i + 1);
|
|
}
|
|
}
|
|
name = stringBuilder.ToString();
|
|
}
|
|
if (name.Length > 260)
|
|
{
|
|
throw new PathTooLongException();
|
|
}
|
|
return name;
|
|
}
|
|
|
|
// Token: 0x170000A8 RID: 168
|
|
// (get) Token: 0x06000322 RID: 802 RVA: 0x00011469 File Offset: 0x00010469
|
|
// (set) Token: 0x06000323 RID: 803 RVA: 0x00011474 File Offset: 0x00010474
|
|
public char Replacement
|
|
{
|
|
get
|
|
{
|
|
return this._replacementChar;
|
|
}
|
|
set
|
|
{
|
|
for (int i = 0; i < WindowsNameTransform.InvalidEntryChars.Length; i++)
|
|
{
|
|
if (WindowsNameTransform.InvalidEntryChars[i] == value)
|
|
{
|
|
throw new ArgumentException("invalid path character");
|
|
}
|
|
}
|
|
if (value == '\\' || value == '/')
|
|
{
|
|
throw new ArgumentException("invalid replacement character");
|
|
}
|
|
this._replacementChar = value;
|
|
}
|
|
}
|
|
|
|
// Token: 0x0400021E RID: 542
|
|
private const int MaxPath = 260;
|
|
|
|
// Token: 0x0400021F RID: 543
|
|
private string _baseDirectory;
|
|
|
|
// Token: 0x04000220 RID: 544
|
|
private bool _trimIncomingPaths;
|
|
|
|
// Token: 0x04000221 RID: 545
|
|
private char _replacementChar = '_';
|
|
|
|
// Token: 0x04000222 RID: 546
|
|
private static readonly char[] InvalidEntryChars;
|
|
}
|
|
}
|