173 lines
4.5 KiB
C#
173 lines
4.5 KiB
C#
using System;
|
|
using System.IO;
|
|
using System.Text;
|
|
using ICSharpCode.SharpZipLib.Core;
|
|
|
|
namespace ICSharpCode.SharpZipLib.Zip
|
|
{
|
|
// Token: 0x0200007F RID: 127
|
|
public class ZipNameTransform : INameTransform
|
|
{
|
|
// Token: 0x060004E3 RID: 1251 RVA: 0x00017ED8 File Offset: 0x00016ED8
|
|
public ZipNameTransform()
|
|
{
|
|
}
|
|
|
|
// Token: 0x060004E4 RID: 1252 RVA: 0x00017EE0 File Offset: 0x00016EE0
|
|
public ZipNameTransform(string trimPrefix)
|
|
{
|
|
this.TrimPrefix = trimPrefix;
|
|
}
|
|
|
|
// Token: 0x060004E5 RID: 1253 RVA: 0x00017EF0 File Offset: 0x00016EF0
|
|
static ZipNameTransform()
|
|
{
|
|
char[] invalidPathChars = Path.GetInvalidPathChars();
|
|
int num = invalidPathChars.Length + 2;
|
|
ZipNameTransform.InvalidEntryCharsRelaxed = new char[num];
|
|
Array.Copy(invalidPathChars, 0, ZipNameTransform.InvalidEntryCharsRelaxed, 0, invalidPathChars.Length);
|
|
ZipNameTransform.InvalidEntryCharsRelaxed[num - 1] = '*';
|
|
ZipNameTransform.InvalidEntryCharsRelaxed[num - 2] = '?';
|
|
num = invalidPathChars.Length + 4;
|
|
ZipNameTransform.InvalidEntryChars = new char[num];
|
|
Array.Copy(invalidPathChars, 0, ZipNameTransform.InvalidEntryChars, 0, invalidPathChars.Length);
|
|
ZipNameTransform.InvalidEntryChars[num - 1] = ':';
|
|
ZipNameTransform.InvalidEntryChars[num - 2] = '\\';
|
|
ZipNameTransform.InvalidEntryChars[num - 3] = '*';
|
|
ZipNameTransform.InvalidEntryChars[num - 4] = '?';
|
|
}
|
|
|
|
// Token: 0x060004E6 RID: 1254 RVA: 0x00017F87 File Offset: 0x00016F87
|
|
public string TransformDirectory(string name)
|
|
{
|
|
name = this.TransformFile(name);
|
|
if (name.Length > 0)
|
|
{
|
|
if (!name.EndsWith("/"))
|
|
{
|
|
name += "/";
|
|
}
|
|
return name;
|
|
}
|
|
throw new ZipException("Cannot have an empty directory name");
|
|
}
|
|
|
|
// Token: 0x060004E7 RID: 1255 RVA: 0x00017FC4 File Offset: 0x00016FC4
|
|
public string TransformFile(string name)
|
|
{
|
|
if (name != null)
|
|
{
|
|
string text = name.ToLower();
|
|
if (this.trimPrefix_ != null && text.IndexOf(this.trimPrefix_) == 0)
|
|
{
|
|
name = name.Substring(this.trimPrefix_.Length);
|
|
}
|
|
name = name.Replace("\\", "/");
|
|
name = WindowsPathUtils.DropPathRoot(name);
|
|
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);
|
|
}
|
|
for (int i = name.IndexOf("//"); i >= 0; i = name.IndexOf("//"))
|
|
{
|
|
name = name.Remove(i, 1);
|
|
}
|
|
name = ZipNameTransform.MakeValidName(name, '_');
|
|
}
|
|
else
|
|
{
|
|
name = string.Empty;
|
|
}
|
|
return name;
|
|
}
|
|
|
|
// Token: 0x17000120 RID: 288
|
|
// (get) Token: 0x060004E8 RID: 1256 RVA: 0x000180AB File Offset: 0x000170AB
|
|
// (set) Token: 0x060004E9 RID: 1257 RVA: 0x000180B3 File Offset: 0x000170B3
|
|
public string TrimPrefix
|
|
{
|
|
get
|
|
{
|
|
return this.trimPrefix_;
|
|
}
|
|
set
|
|
{
|
|
this.trimPrefix_ = value;
|
|
if (this.trimPrefix_ != null)
|
|
{
|
|
this.trimPrefix_ = this.trimPrefix_.ToLower();
|
|
}
|
|
}
|
|
}
|
|
|
|
// Token: 0x060004EA RID: 1258 RVA: 0x000180D8 File Offset: 0x000170D8
|
|
private static string MakeValidName(string name, char replacement)
|
|
{
|
|
int i = name.IndexOfAny(ZipNameTransform.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(ZipNameTransform.InvalidEntryChars, i + 1);
|
|
}
|
|
}
|
|
name = stringBuilder.ToString();
|
|
}
|
|
if (name.Length > 65535)
|
|
{
|
|
throw new PathTooLongException();
|
|
}
|
|
return name;
|
|
}
|
|
|
|
// Token: 0x060004EB RID: 1259 RVA: 0x00018144 File Offset: 0x00017144
|
|
public static bool IsValidName(string name, bool relaxed)
|
|
{
|
|
bool flag = name != null;
|
|
if (flag)
|
|
{
|
|
if (relaxed)
|
|
{
|
|
flag = name.IndexOfAny(ZipNameTransform.InvalidEntryCharsRelaxed) < 0;
|
|
}
|
|
else
|
|
{
|
|
flag = name.IndexOfAny(ZipNameTransform.InvalidEntryChars) < 0 && name.IndexOf('/') != 0;
|
|
}
|
|
}
|
|
return flag;
|
|
}
|
|
|
|
// Token: 0x060004EC RID: 1260 RVA: 0x00018194 File Offset: 0x00017194
|
|
public static bool IsValidName(string name)
|
|
{
|
|
return name != null && name.IndexOfAny(ZipNameTransform.InvalidEntryChars) < 0 && name.IndexOf('/') != 0;
|
|
}
|
|
|
|
// Token: 0x0400031D RID: 797
|
|
private string trimPrefix_;
|
|
|
|
// Token: 0x0400031E RID: 798
|
|
private static readonly char[] InvalidEntryChars;
|
|
|
|
// Token: 0x0400031F RID: 799
|
|
private static readonly char[] InvalidEntryCharsRelaxed;
|
|
}
|
|
}
|